Added basic support for plugins.

Plugins can now be included, they can modify the requests before they
are made and modify the result. They are very simple to write and work
with. I also wrote and example plugin over at seich/beau-jwt.
This commit is contained in:
Sergio Díaz 2017-04-05 22:55:09 -06:00
parent ab19146966
commit 3c2691b164
5 changed files with 93 additions and 10 deletions

11
examples/plugins.yml Normal file
View File

@ -0,0 +1,11 @@
host: http://localhost:10080
plugins:
- beau-jwt:
data:
userId: 12
name: Sergio
secret: 'asdfasdf+asdfasdf/asdfasdfasdfasdf=='
GET /test:
alias: test

View File

@ -14,6 +14,7 @@
"commander": "^2.9.0",
"eyes": "^0.1.8",
"js-yaml": "^3.7.0",
"requireg": "^0.1.6",
"unirest": "^0.5.1"
},
"repository": "git@github.com:Seich/Beau.git",

View File

@ -5,8 +5,8 @@ const RequestCache = require('./requestCache');
class Request {
constructor(req, list) {
let config = {};
this.originalRequest = req;
Object.keys(req).forEach(k => config[k.toUpperCase()] = req[k]);
@ -53,16 +53,29 @@ class Request {
return set;
}
exec() {
exec(modifiers = []) {
let dependencies = Array.from(this.DEPENDENCIES);
return this.list.fetchDependencies(dependencies).then(cache => {
let endpoint = cache.parse(this.ENDPOINT);
let request = unirest(this.VERB, endpoint);
let settings = {
endpoint: cache.parse(this.ENDPOINT),
method: this.VERB,
headers: cache.parse(this.HEADERS),
query: cache.parse(this.PARAMS),
payload: cache.parse(this.PAYLOAD)
};
request.headers(cache.parse(this.HEADERS));
request.query(cache.parse(this.PARAMS));
request.send(cache.parse(this.PAYLOAD));
modifiers.forEach(mod => {
if (typeof mod.preRequest !== 'undefined') {
mod.preRequest(settings, this.originalRequest);
}
});
let request = unirest(settings.method, settings.endpoint);
request.headers(settings.headers);
request.query(settings.query);
request.send(settings.payload);
return new Promise((resolve, reject) => {
request.end(res => {
@ -75,7 +88,7 @@ class Request {
request: {
headers: res.request.headers,
body: res.request.body,
endpoint: endpoint
endpoint: settings.endpoint
},
response: {
status: res.status,

View File

@ -1,10 +1,13 @@
const Request = require('./request');
const RequestCache = require('./requestCache');
const httpVerbs = require('./shared').httpVerbs;
const requireg = require('requireg');
class RequestList {
constructor(doc = {}, config = {}) {
this.config = config;
this.modifiers = this.loadPlugins();
this.list = this.loadRequests(doc);
this.cache = new RequestCache();
}
@ -17,7 +20,16 @@ class RequestList {
}
return request
.exec()
.exec(this.modifiers)
.then(res => {
this.modifiers.forEach(mod => {
if (typeof mod.postResponse !== 'undefined') {
mod.postResponse(res);
}
});
return res;
})
.catch(reason => {
return Promise
.reject(`Request: ${request.VERB} ${request.ENDPOINT} FAILED. \n${reason}`);
@ -46,6 +58,20 @@ class RequestList {
return new Request(doc[key], this);
});
}
loadPlugins() {
return this.config.PLUGINS.map(plugin => {
let name = plugin;
let settings = null;
if (typeof plugin === 'object') {
name = Object.keys(plugin)[0];
settings = plugin[name];
}
return new (requireg(name))(settings)
});
}
}
module.exports = RequestList;

View File

@ -512,6 +512,10 @@ decamelize@^1.0.0, decamelize@^1.1.1:
version "1.2.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
deep-extend@~0.2.5:
version "0.2.11"
resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.2.11.tgz#7a16ba69729132340506170494bc83f7076fe08f"
deep-is@~0.1.3:
version "0.1.3"
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
@ -900,6 +904,10 @@ inherits@2, inherits@~2.0.1:
version "2.0.3"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
ini@~1.3.0:
version "1.3.4"
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e"
invariant@^2.2.0:
version "2.2.2"
resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360"
@ -1580,7 +1588,7 @@ minimatch@2.x:
dependencies:
brace-expansion "^1.0.0"
minimist@0.0.8, minimist@~0.0.1:
minimist@0.0.8, minimist@~0.0.1, minimist@~0.0.7:
version "0.0.8"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
@ -1815,6 +1823,15 @@ randomatic@^1.1.3:
is-number "^2.0.2"
kind-of "^3.0.2"
rc@~1.0.0:
version "1.0.3"
resolved "https://registry.yarnpkg.com/rc/-/rc-1.0.3.tgz#51bf28d21f13a9324528a9633460161ad9a39f77"
dependencies:
deep-extend "~0.2.5"
ini "~1.3.0"
minimist "~0.0.7"
strip-json-comments "0.1.x"
read-pkg-up@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
@ -1906,10 +1923,21 @@ require-main-filename@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
requireg@^0.1.6:
version "0.1.6"
resolved "https://registry.yarnpkg.com/requireg/-/requireg-0.1.6.tgz#205052aec2eaa2d8eb128abacf833b6a380a99b6"
dependencies:
rc "~1.0.0"
resolve "~0.6.1"
resolve@1.1.7, resolve@1.1.x, resolve@^1.1.6:
version "1.1.7"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
resolve@~0.6.1:
version "0.6.3"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-0.6.3.tgz#dd957982e7e736debdf53b58a4dd91754575dd46"
right-align@^0.1.1:
version "0.1.3"
resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
@ -2046,6 +2074,10 @@ strip-bom@^2.0.0:
dependencies:
is-utf8 "^0.2.0"
strip-json-comments@0.1.x:
version "0.1.3"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-0.1.3.tgz#164c64e370a8a3cc00c9e01b539e569823f0ee54"
supports-color@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"