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", "commander": "^2.9.0",
"eyes": "^0.1.8", "eyes": "^0.1.8",
"js-yaml": "^3.7.0", "js-yaml": "^3.7.0",
"requireg": "^0.1.6",
"unirest": "^0.5.1" "unirest": "^0.5.1"
}, },
"repository": "git@github.com:Seich/Beau.git", "repository": "git@github.com:Seich/Beau.git",

View File

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

View File

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

View File

@ -512,6 +512,10 @@ decamelize@^1.0.0, decamelize@^1.1.1:
version "1.2.0" version "1.2.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 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: deep-is@~0.1.3:
version "0.1.3" version "0.1.3"
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 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" version "2.0.3"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 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: invariant@^2.2.0:
version "2.2.2" version "2.2.2"
resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360"
@ -1580,7 +1588,7 @@ minimatch@2.x:
dependencies: dependencies:
brace-expansion "^1.0.0" 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" version "0.0.8"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 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" is-number "^2.0.2"
kind-of "^3.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: read-pkg-up@^1.0.1:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" 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" version "1.0.1"
resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" 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: resolve@1.1.7, resolve@1.1.x, resolve@^1.1.6:
version "1.1.7" version "1.1.7"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" 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: right-align@^0.1.1:
version "0.1.3" version "0.1.3"
resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
@ -2046,6 +2074,10 @@ strip-bom@^2.0.0:
dependencies: dependencies:
is-utf8 "^0.2.0" 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: supports-color@^2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"