mirror of
https://github.com/verdaccio/verdaccio.git
synced 2024-11-13 03:35:52 +01:00
76 lines
2.0 KiB
JavaScript
76 lines
2.0 KiB
JavaScript
'use strict';
|
|
|
|
const Path = require('path');
|
|
|
|
/**
|
|
* Requires a module.
|
|
* @param {*} path the module's path
|
|
* @return {Object}
|
|
*/
|
|
function try_load(path) {
|
|
try {
|
|
return require(path);
|
|
} catch(err) {
|
|
if (err.code === 'MODULE_NOT_FOUND') {
|
|
return null;
|
|
}
|
|
throw err;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Load a plugin following the rules
|
|
* - First try to load from the internal directory plugins (which will disappear soon or later).
|
|
* - A seccond attempt from node_modules, in case to have multiple match as for instance verdaccio-ldap
|
|
* and sinopia-ldap. All verdaccio prefix will have preferences.
|
|
* @param {*} config a reference of the configuration settings
|
|
* @param {*} plugin_configs
|
|
* @param {*} params a set of params to initialise the plugin
|
|
* @param {*} sanity_check callback that check the shape that should fulfill the plugin
|
|
* @return {Array} list of plugins
|
|
*/
|
|
function load_plugins(config, plugin_configs, params, sanity_check) {
|
|
let plugins = Object.keys(plugin_configs || {}).map(function(p) {
|
|
let plugin;
|
|
|
|
// try local plugins first
|
|
plugin = try_load(Path.resolve(__dirname + '/plugins', p));
|
|
|
|
// npm package
|
|
if (plugin === null && p.match(/^[^\.\/]/)) {
|
|
plugin = try_load(`verdaccio-${p}`);
|
|
// compatibility for old sinopia plugins
|
|
if (!plugin) {
|
|
plugin = try_load(`sinopia-${p}`);
|
|
}
|
|
}
|
|
|
|
if (plugin === null) {
|
|
plugin = try_load(p);
|
|
}
|
|
|
|
// relative to config path
|
|
if (plugin === null && p.match(/^\.\.?($|\/)/)) {
|
|
plugin = try_load(Path.resolve(Path.dirname(config.self_path), p));
|
|
}
|
|
|
|
if (plugin === null) {
|
|
throw Error('"' + p + '" plugin not found\ntry "npm install verdaccio-' + p + '"');
|
|
}
|
|
|
|
if (typeof(plugin) !== 'function')
|
|
throw Error('"' + p + '" doesn\'t look like a valid plugin');
|
|
|
|
plugin = plugin(plugin_configs[p], params);
|
|
|
|
if (plugin === null || !sanity_check(plugin))
|
|
throw Error('"' + p + '" doesn\'t look like a valid plugin');
|
|
|
|
return plugin;
|
|
});
|
|
|
|
return plugins;
|
|
}
|
|
|
|
exports.load_plugins = load_plugins;
|