2015-04-08 22:54:59 +02:00
|
|
|
var Path = require('path')
|
|
|
|
|
|
|
|
function try_load(path) {
|
|
|
|
try {
|
|
|
|
return require(path)
|
|
|
|
} catch(err) {
|
|
|
|
if (err.code === 'MODULE_NOT_FOUND') {
|
|
|
|
return null
|
|
|
|
}
|
|
|
|
throw err
|
|
|
|
}
|
|
|
|
}
|
2015-02-24 20:28:16 +01:00
|
|
|
|
2015-04-08 22:54:59 +02:00
|
|
|
function load_plugins(config, plugin_configs, params, sanity_check) {
|
2015-02-24 20:28:16 +01:00
|
|
|
var plugins = Object.keys(plugin_configs || {}).map(function(p) {
|
2015-04-08 22:54:59 +02:00
|
|
|
var plugin
|
|
|
|
|
|
|
|
// npm package
|
|
|
|
if (plugin == null && p.match(/^[^\.\/]/)) {
|
|
|
|
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))
|
2015-02-24 20:28:16 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if (plugin == null) {
|
|
|
|
throw Error('"' + p + '" plugin not found\n'
|
|
|
|
+ 'try "npm install sinopia-' + p + '"')
|
|
|
|
}
|
|
|
|
|
|
|
|
if (typeof(plugin) !== 'function')
|
2015-04-08 22:54:59 +02:00
|
|
|
throw Error('"' + p + '" doesn\'t look like a valid plugin')
|
2015-02-24 20:28:16 +01:00
|
|
|
|
|
|
|
plugin = plugin(plugin_configs[p], params)
|
|
|
|
|
2015-04-08 22:54:59 +02:00
|
|
|
if (plugin == null || !sanity_check(plugin))
|
|
|
|
throw Error('"' + p + '" doesn\'t look like a valid plugin')
|
2015-02-24 20:28:16 +01:00
|
|
|
|
|
|
|
return plugin
|
|
|
|
})
|
|
|
|
|
|
|
|
return plugins
|
|
|
|
}
|
|
|
|
|
|
|
|
exports.load_plugins = load_plugins;
|