If a plugin hook was defined as a `Function` or an `Array` the `path` property would be set to the default value. Even if this bug had no actual negative impact, it should be fixed so the code would perform as intended.
41 lines
1.4 KiB
JavaScript
41 lines
1.4 KiB
JavaScript
const {isPlainObject, omit, castArray, isUndefined} = require('lodash');
|
|
const AggregateError = require('aggregate-error');
|
|
const getError = require('../get-error');
|
|
const PLUGINS_DEFINITIONS = require('../definitions/plugins');
|
|
const pipeline = require('./pipeline');
|
|
const normalize = require('./normalize');
|
|
|
|
module.exports = (options, pluginsPath, logger) => {
|
|
const errors = [];
|
|
const plugins = Object.keys(PLUGINS_DEFINITIONS).reduce((plugins, pluginType) => {
|
|
const {config, default: def} = PLUGINS_DEFINITIONS[pluginType];
|
|
let pluginConfs;
|
|
|
|
if (isUndefined(options[pluginType])) {
|
|
pluginConfs = def;
|
|
} else {
|
|
// If an object is passed and the path is missing, set the default one for single plugins
|
|
if (isPlainObject(options[pluginType]) && !options[pluginType].path && castArray(def).length === 1) {
|
|
options[pluginType].path = def;
|
|
}
|
|
if (config && !config.validator(options[pluginType])) {
|
|
errors.push(getError('EPLUGINCONF', {pluginType, pluginConf: options[pluginType]}));
|
|
return plugins;
|
|
}
|
|
pluginConfs = options[pluginType];
|
|
}
|
|
|
|
const globalOpts = omit(options, Object.keys(PLUGINS_DEFINITIONS));
|
|
|
|
plugins[pluginType] = pipeline(
|
|
castArray(pluginConfs).map(conf => normalize(pluginType, pluginsPath, globalOpts, conf, logger))
|
|
);
|
|
|
|
return plugins;
|
|
}, {});
|
|
if (errors.length > 0) {
|
|
throw new AggregateError(errors);
|
|
}
|
|
return plugins;
|
|
};
|