sitespeed.io/lib/support/pluginLoader.js

71 lines
1.8 KiB
JavaScript

'use strict';
const Promise = require('bluebird'),
path = require('path'),
fs = require('fs');
Promise.promisifyAll(fs);
const defaultPlugins = new Set([
'browsertime',
'coach',
'datacollector',
'domains',
'assets',
'html',
'screenshot',
'metrics',
'text',
'harstorer',
'budget',
'tracestorer'
]);
const pluginsDir = path.join(__dirname, '..', 'plugins');
module.exports = {
parsePluginNames(options) {
// if we don't use the cli, this will work out fine as long
// we configure only what we need
const possibleConfiguredPlugins = options.explicitOptions || options;
const isDefaultOrConfigured = name =>
defaultPlugins.has(name) ||
typeof possibleConfiguredPlugins[name] === 'object';
const addMessageLoggerIfDebug = pluginNames => {
if (options.debug) {
// Need to make sure logger is first, so message logs appear
// before messages are handled by other plugins
pluginNames = ['messagelogger'].concat(pluginNames);
}
return pluginNames;
};
return fs
.readdirAsync(pluginsDir)
.map(name => path.basename(name, '.js'))
.then(builtins => {
let plugins = builtins.filter(isDefaultOrConfigured);
return addMessageLoggerIfDebug(plugins);
});
},
loadPlugins(pluginNames) {
return Promise.resolve(pluginNames).map(name => {
try {
const plugin = require(path.join(pluginsDir, name));
if (!plugin.name) {
plugin.name = () => name;
}
return plugin;
} catch (err) {
try {
return require(path.resolve(process.cwd(), name));
} catch (error) {
console.error("Couldn't load plugin %s: %s", name, err); // eslint-disable-line no-console
// if it fails here, let it fail hard
throw error;
}
}
});
}
};