71 lines
1.8 KiB
JavaScript
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;
|
|
}
|
|
}
|
|
});
|
|
}
|
|
};
|