From e923668ecd4807aa55d6ce44e642216ef992ecab Mon Sep 17 00:00:00 2001 From: David Diaz Date: Fri, 4 May 2018 11:59:15 -0600 Subject: [PATCH] Added beau-std as an auto-loaded plugin. This means that beau-std will automatically be loaded if available in the same space as Beau. beau-std is a set of commonly used plugins, these map directly to nodejs features that are commonly needed within Beau. --- src/__mocks__/beau-std.js | 7 +++++++ src/__mocks__/requireg.js | 16 ++++++++++++++-- src/__tests__/plugins.spec.js | 11 ++++++++++- src/plugins.js | 8 +++++++- 4 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 src/__mocks__/beau-std.js diff --git a/src/__mocks__/beau-std.js b/src/__mocks__/beau-std.js new file mode 100644 index 0000000..a12435f --- /dev/null +++ b/src/__mocks__/beau-std.js @@ -0,0 +1,7 @@ +class BeauStd { + constructor(registry, settings) { + registry.defineDynamicValue('createReadStream', () => {}); + } +} + +module.exports = BeauStd; diff --git a/src/__mocks__/requireg.js b/src/__mocks__/requireg.js index c31f69d..3f82876 100644 --- a/src/__mocks__/requireg.js +++ b/src/__mocks__/requireg.js @@ -1,3 +1,15 @@ -module.exports = function(name) { - return require(name); +function requireg(name) { + return require(name); +} + +requireg.std_resolving = false; + +requireg.resolve = function(name) { + if (requireg.std_resolving) { + return ''; + } else { + throw new Error(`Failed to resolve.`); + } }; + +module.exports = requireg; diff --git a/src/__tests__/plugins.spec.js b/src/__tests__/plugins.spec.js index 9e8525f..f70fb3f 100644 --- a/src/__tests__/plugins.spec.js +++ b/src/__tests__/plugins.spec.js @@ -3,14 +3,16 @@ const Config = require('../config'); const Plugins = require('../plugins'); const Request = require('../request'); const RequestCache = require('../requestCache'); +const requireg = require('requireg'); describe(`Beau's plugin system`, () => { let config; let request; let plugins; + let doc; beforeEach(() => { - const doc = yaml.safeLoad(` + doc = yaml.safeLoad(` version: 1 endpoint: 'http://example.com' @@ -32,6 +34,13 @@ describe(`Beau's plugin system`, () => { expect(plugins.registry.dynamicValues.length).toBe(1); }); + it(`should load autoload plugins`, () => { + requireg.std_resolving = true; + config = new Config(doc); + expect(config.PLUGINS.registry.dynamicValues.length).toBe(2); + requireg.std_resolving = false; + }); + it(`should throw if given an invalid configuration`, () => { expect(() => new Plugins([{ test1: true, test2: true }])).toThrow(); }); diff --git a/src/plugins.js b/src/plugins.js index 108a113..3f5887a 100644 --- a/src/plugins.js +++ b/src/plugins.js @@ -5,7 +5,7 @@ const { toKebabCase, dynamicValueRegex, replaceInObject } = require('./shared'); const isPlainObject = require('is-plain-object'); class Plugins { - constructor(plugins = []) { + constructor(plugins = [], autoload = ['std']) { this.registry = { preRequestModifiers: [], postRequestModifiers: [], @@ -15,6 +15,12 @@ class Plugins { this.context = {}; plugins.forEach(plugin => this.loadPlugin(plugin)); + autoload.forEach(plugin => { + try { + requireg.resolve(plugin); + this.loadPlugin(plugin); + } catch (e) {} + }); } loadPlugin(plugin) {