stryker
Version:
The extendable JavaScript mutation testing framework
160 lines • 8.2 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
var path = require("path");
var _ = require("lodash");
var typed_inject_1 = require("typed-inject");
var fileUtils_1 = require("../utils/fileUtils");
var util_1 = require("@stryker-mutator/util");
var plugin_1 = require("stryker-api/plugin");
var config_1 = require("stryker-api/config");
var report_1 = require("stryker-api/report");
var test_framework_1 = require("stryker-api/test_framework");
var test_runner_1 = require("stryker-api/test_runner");
var transpile_1 = require("stryker-api/transpile");
var mutant_1 = require("stryker-api/mutant");
var coreTokens = require("./coreTokens");
var IGNORED_PACKAGES = ['stryker-cli', 'stryker-api'];
var PluginLoader = /** @class */ (function () {
function PluginLoader(log, pluginDescriptors) {
this.log = log;
this.pluginDescriptors = pluginDescriptors;
this.pluginsByKind = new Map();
}
PluginLoader.prototype.load = function () {
var _this = this;
this.resolvePluginModules().forEach(function (moduleName) { return _this.requirePlugin(moduleName); });
this.loadDeprecatedPlugins();
};
PluginLoader.prototype.resolve = function (kind, name) {
var plugins = this.pluginsByKind.get(kind);
if (plugins) {
var plugin = plugins.find(function (plugin) { return plugin.name.toLowerCase() === name.toLowerCase(); });
if (plugin) {
return plugin;
}
else {
throw new Error("Cannot load " + kind + " plugin \"" + name + "\". Did you forget to install it? Loaded " + kind + " plugins were: " + plugins.map(function (p) { return p.name; }).join(', '));
}
}
else {
throw new Error("Cannot load " + kind + " plugin \"" + name + "\". In fact, no " + kind + " plugins were loaded. Did you forget to install it?");
}
};
PluginLoader.prototype.resolveAll = function (kind) {
var plugins = this.pluginsByKind.get(kind);
return plugins || [];
};
PluginLoader.prototype.loadDeprecatedPlugins = function () {
this.loadDeprecatedPluginsFor(plugin_1.PluginKind.ConfigEditor, config_1.ConfigEditorFactory.instance(), [], function () { return undefined; });
this.loadDeprecatedPluginsFor(plugin_1.PluginKind.Reporter, report_1.ReporterFactory.instance(), typed_inject_1.tokens('config'), function (_a) {
var config = _a[0];
return config;
});
this.loadDeprecatedPluginsFor(plugin_1.PluginKind.TestFramework, test_framework_1.TestFrameworkFactory.instance(), typed_inject_1.tokens('options'), function (args) { return ({ options: args[0] }); });
this.loadDeprecatedPluginsFor(plugin_1.PluginKind.Transpiler, transpile_1.TranspilerFactory.instance(), typed_inject_1.tokens('config', 'produceSourceMaps'), function (_a) {
var config = _a[0], produceSourceMaps = _a[1];
return ({ config: config, produceSourceMaps: produceSourceMaps });
});
this.loadDeprecatedPluginsFor(plugin_1.PluginKind.Mutator, mutant_1.MutatorFactory.instance(), typed_inject_1.tokens('config'), function (_a) {
var config = _a[0];
return config;
});
this.loadDeprecatedPluginsFor(plugin_1.PluginKind.TestRunner, test_runner_1.TestRunnerFactory.instance(), typed_inject_1.tokens('options', 'sandboxFileNames'), function (_a) {
var strykerOptions = _a[0], fileNames = _a[1];
return ({ strykerOptions: strykerOptions, fileNames: fileNames });
});
};
PluginLoader.prototype.loadDeprecatedPluginsFor = function (kind, factory, injectionTokens, settingsFactory) {
var _this = this;
factory.knownNames().forEach(function (name) {
var ProxyPlugin = /** @class */ (function () {
function ProxyPlugin() {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var realPlugin = factory.create(name, settingsFactory(args));
for (var i in realPlugin) {
var method = realPlugin[i];
if (typeof method === 'function' && method) {
this[i] = method.bind(realPlugin);
}
}
}
ProxyPlugin.inject = injectionTokens;
return ProxyPlugin;
}());
_this.loadPlugin({ kind: kind, name: name, injectableClass: ProxyPlugin });
});
};
PluginLoader.prototype.resolvePluginModules = function () {
var _this = this;
var modules = [];
this.pluginDescriptors.forEach(function (pluginExpression) {
if (_.isString(pluginExpression)) {
if (pluginExpression.indexOf('*') !== -1) {
// Plugin directory is the node_modules folder of the module that installed stryker
// So if current __dirname is './stryker/src/di' so 3 directories above
var pluginDirectory_1 = path.resolve(__dirname, '..', '..', '..');
var regexp_1 = new RegExp('^' + pluginExpression.replace('*', '.*'));
_this.log.debug('Loading %s from %s', pluginExpression, pluginDirectory_1);
var plugins = util_1.fsAsPromised.readdirSync(pluginDirectory_1)
.filter(function (pluginName) { return IGNORED_PACKAGES.indexOf(pluginName) === -1 && regexp_1.test(pluginName); })
.map(function (pluginName) { return pluginDirectory_1 + '/' + pluginName; });
if (plugins.length === 0) {
_this.log.debug('Expression %s not resulted in plugins to load', pluginExpression);
}
plugins
.map(function (plugin) { return path.basename(plugin); })
.map(function (plugin) {
_this.log.debug('Loading plugins %s (matched with expression %s)', plugin, pluginExpression);
return plugin;
})
.forEach(function (p) { return modules.push(p); });
}
else {
modules.push(pluginExpression);
}
}
else {
_this.log.warn('Ignoring plugin %s, as its not a string type', pluginExpression);
}
});
return modules;
};
PluginLoader.prototype.requirePlugin = function (name) {
var _this = this;
this.log.debug("Loading plugins " + name);
try {
var module_1 = fileUtils_1.importModule(name);
if (this.isPluginModule(module_1)) {
module_1.strykerPlugins.forEach(function (plugin) { return _this.loadPlugin(plugin); });
}
}
catch (e) {
if (e.code === 'MODULE_NOT_FOUND' && e.message.indexOf(name) !== -1) {
this.log.warn('Cannot find plugin "%s".\n Did you forget to install it ?\n' +
' npm install %s --save-dev', name, name);
}
else {
this.log.warn('Error during loading "%s" plugin:\n %s', name, e.message);
}
}
};
PluginLoader.prototype.loadPlugin = function (plugin) {
var plugins = this.pluginsByKind.get(plugin.kind);
if (!plugins) {
plugins = [];
this.pluginsByKind.set(plugin.kind, plugins);
}
plugins.push(plugin);
};
PluginLoader.prototype.isPluginModule = function (module) {
var pluginModule = module;
return pluginModule && pluginModule.strykerPlugins && Array.isArray(pluginModule.strykerPlugins);
};
PluginLoader.inject = typed_inject_1.tokens(plugin_1.commonTokens.logger, coreTokens.pluginDescriptors);
return PluginLoader;
}());
exports.PluginLoader = PluginLoader;
//# sourceMappingURL=PluginLoader.js.map
;