UNPKG

stryker

Version:
160 lines 8.2 kB
"use strict"; 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