UNPKG

stryker

Version:
329 lines 15.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var child = require("child_process"); var objectUtils_1 = require("../utils/objectUtils"); var CommandTestRunner_1 = require("../test-runner/CommandTestRunner"); var _1 = require("."); var plugin_1 = require("stryker-api/plugin"); var StrykerInitializer = /** @class */ (function () { function StrykerInitializer(log, out, client, strykerPresets, configWriter, inquirer) { this.log = log; this.out = out; this.client = client; this.strykerPresets = strykerPresets; this.configWriter = configWriter; this.inquirer = inquirer; } /** * Runs the initializer will prompt the user for questions about his setup. After that, install plugins and configure Stryker. * @function */ StrykerInitializer.prototype.initialize = function () { return tslib_1.__awaiter(this, void 0, void 0, function () { var selectedPreset; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: this.configWriter.guardForExistingConfig(); this.patchProxies(); return [4 /*yield*/, this.selectPreset()]; case 1: selectedPreset = _a.sent(); if (!selectedPreset) return [3 /*break*/, 3]; return [4 /*yield*/, this.initiatePreset(this.configWriter, selectedPreset)]; case 2: _a.sent(); return [3 /*break*/, 5]; case 3: return [4 /*yield*/, this.initiateCustom(this.configWriter)]; case 4: _a.sent(); _a.label = 5; case 5: this.out('Done configuring stryker. Please review `stryker.conf.js`, you might need to configure transpilers or your test runner correctly.'); this.out('Let\'s kill some mutants with this command: `stryker run`'); return [2 /*return*/]; } }); }); }; /** * The typed rest client works only with the specific HTTP_PROXY and HTTPS_PROXY env settings. * Let's make sure they are available. */ StrykerInitializer.prototype.patchProxies = function () { var copyEnvVariable = function (from, to) { if (process.env[from] && !process.env[to]) { process.env[to] = process.env[from]; } }; copyEnvVariable('http_proxy', 'HTTP_PROXY'); copyEnvVariable('https_proxy', 'HTTPS_PROXY'); }; StrykerInitializer.prototype.selectPreset = function () { return tslib_1.__awaiter(this, void 0, void 0, function () { var presetOptions; return tslib_1.__generator(this, function (_a) { presetOptions = this.strykerPresets; if (presetOptions.length) { this.log.debug("Found presets: " + JSON.stringify(presetOptions)); return [2 /*return*/, this.inquirer.promptPresets(presetOptions)]; } else { this.log.debug('No presets have been configured, reverting to custom configuration'); return [2 /*return*/, undefined]; } return [2 /*return*/]; }); }); }; StrykerInitializer.prototype.initiatePreset = function (configWriter, selectedPreset) { return tslib_1.__awaiter(this, void 0, void 0, function () { var presetConfig, selectedPackageManager; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, selectedPreset.createConfig()]; case 1: presetConfig = _a.sent(); return [4 /*yield*/, configWriter.writePreset(presetConfig)]; case 2: _a.sent(); return [4 /*yield*/, this.selectPackageManager()]; case 3: selectedPackageManager = _a.sent(); this.installNpmDependencies(presetConfig.dependencies, selectedPackageManager); return [2 /*return*/]; } }); }); }; StrykerInitializer.prototype.initiateCustom = function (configWriter) { return tslib_1.__awaiter(this, void 0, void 0, function () { var selectedTestRunner, selectedTestFramework, _a, selectedMutator, selectedTranspilers, selectedReporters, selectedPackageManager, npmDependencies, _b, _c, _d; return tslib_1.__generator(this, function (_e) { switch (_e.label) { case 0: return [4 /*yield*/, this.selectTestRunner()]; case 1: selectedTestRunner = _e.sent(); if (!(selectedTestRunner && !CommandTestRunner_1.default.is(selectedTestRunner.name))) return [3 /*break*/, 3]; return [4 /*yield*/, this.selectTestFramework(selectedTestRunner)]; case 2: _a = _e.sent(); return [3 /*break*/, 4]; case 3: _a = null; _e.label = 4; case 4: selectedTestFramework = _a; return [4 /*yield*/, this.selectMutator()]; case 5: selectedMutator = _e.sent(); return [4 /*yield*/, this.selectTranspilers()]; case 6: selectedTranspilers = _e.sent(); return [4 /*yield*/, this.selectReporters()]; case 7: selectedReporters = _e.sent(); return [4 /*yield*/, this.selectPackageManager()]; case 8: selectedPackageManager = _e.sent(); npmDependencies = this.getSelectedNpmDependencies([selectedTestRunner, selectedTestFramework, selectedMutator] .concat(selectedTranspilers) .concat(selectedReporters)); _c = (_b = configWriter).write; _d = [selectedTestRunner, selectedTestFramework, selectedMutator, selectedTranspilers, selectedReporters, selectedPackageManager]; return [4 /*yield*/, this.fetchAdditionalConfig(npmDependencies)]; case 9: return [4 /*yield*/, _c.apply(_b, _d.concat([_e.sent()]))]; case 10: _e.sent(); this.installNpmDependencies(npmDependencies, selectedPackageManager); return [2 /*return*/]; } }); }); }; StrykerInitializer.prototype.selectTestRunner = function () { return tslib_1.__awaiter(this, void 0, void 0, function () { var testRunnerOptions; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.client.getTestRunnerOptions()]; case 1: testRunnerOptions = _a.sent(); if (testRunnerOptions.length) { this.log.debug("Found test runners: " + JSON.stringify(testRunnerOptions)); return [2 /*return*/, this.inquirer.promptTestRunners(testRunnerOptions)]; } else { this.out('Unable to select a test runner. You will need to configure it manually.'); return [2 /*return*/, null]; } return [2 /*return*/]; } }); }); }; StrykerInitializer.prototype.selectReporters = function () { return tslib_1.__awaiter(this, void 0, void 0, function () { var reporterOptions; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.client.getTestReporterOptions()]; case 1: reporterOptions = _a.sent(); reporterOptions.push({ name: 'clear-text', npm: null }, { name: 'progress', npm: null }, { name: 'dashboard', npm: null }); return [2 /*return*/, this.inquirer.promptReporters(reporterOptions)]; } }); }); }; StrykerInitializer.prototype.selectTestFramework = function (testRunnerOption) { return tslib_1.__awaiter(this, void 0, void 0, function () { var selectedTestFramework, testFrameworkOptions, none; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: selectedTestFramework = null; return [4 /*yield*/, this.client.getTestFrameworkOptions(testRunnerOption.npm)]; case 1: testFrameworkOptions = _a.sent(); if (!testFrameworkOptions.length) return [3 /*break*/, 3]; this.log.debug("Found test frameworks for " + testRunnerOption.name + ": " + JSON.stringify(testFrameworkOptions)); none = { name: 'None/other', npm: null }; testFrameworkOptions.push(none); return [4 /*yield*/, this.inquirer.promptTestFrameworks(testFrameworkOptions)]; case 2: selectedTestFramework = _a.sent(); if (selectedTestFramework === none) { selectedTestFramework = null; this.out('OK, downgrading coverageAnalysis to "all"'); } return [3 /*break*/, 4]; case 3: this.out("No stryker test framework plugin found that is compatible with " + testRunnerOption.name + ", downgrading coverageAnalysis to \"all\""); _a.label = 4; case 4: return [2 /*return*/, selectedTestFramework]; } }); }); }; StrykerInitializer.prototype.selectMutator = function () { return tslib_1.__awaiter(this, void 0, void 0, function () { var mutatorOptions; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.client.getMutatorOptions()]; case 1: mutatorOptions = _a.sent(); if (mutatorOptions.length) { this.log.debug("Found mutators: " + JSON.stringify(mutatorOptions)); return [2 /*return*/, this.inquirer.promptMutator(mutatorOptions)]; } else { this.out('Unable to select a mutator. You will need to configure it manually.'); return [2 /*return*/, null]; } return [2 /*return*/]; } }); }); }; StrykerInitializer.prototype.selectTranspilers = function () { return tslib_1.__awaiter(this, void 0, void 0, function () { var options; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.client.getTranspilerOptions()]; case 1: options = _a.sent(); if (options.length) { this.log.debug("Found transpilers: " + JSON.stringify(options)); return [2 /*return*/, this.inquirer.promptTranspilers(options)]; } else { this.out('Unable to select transpilers. You will need to configure it manually, if you want to use any.'); return [2 /*return*/, null]; } return [2 /*return*/]; } }); }); }; StrykerInitializer.prototype.selectPackageManager = function () { return tslib_1.__awaiter(this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) { return [2 /*return*/, this.inquirer.promptPackageManager([ { name: "npm" /* Npm */, npm: null, }, { name: "yarn" /* Yarn */, npm: null, } ])]; }); }); }; StrykerInitializer.prototype.getSelectedNpmDependencies = function (selectedOptions) { return objectUtils_1.filterEmpty(objectUtils_1.filterEmpty(selectedOptions) .map(function (option) { return option.npm; })); }; /** * Install the npm packages * @function */ StrykerInitializer.prototype.installNpmDependencies = function (dependencies, selectedOption) { if (dependencies.length === 0) { return; } this.out('Installing NPM dependencies...'); var cmd = selectedOption.name === "npm" /* Npm */ ? "npm i --save-dev stryker-api " + dependencies.join(' ') : "yarn add stryker-api " + dependencies.join(' ') + " --dev"; this.out(cmd); try { child.execSync(cmd, { stdio: [0, 1, 2] }); } catch (_) { this.out("An error occurred during installation, please try it yourself: \"" + cmd + "\""); } }; StrykerInitializer.prototype.fetchAdditionalConfig = function (dependencies) { return tslib_1.__awaiter(this, void 0, void 0, function () { var _a; var _this = this; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: _a = objectUtils_1.filterEmpty; return [4 /*yield*/, Promise.all(dependencies.map(function (dep) { return _this.client.getAdditionalConfig(dep); }))]; case 1: return [2 /*return*/, _a.apply(void 0, [_b.sent()])]; } }); }); }; StrykerInitializer.inject = plugin_1.tokens(plugin_1.commonTokens.logger, _1.initializerTokens.out, _1.initializerTokens.npmClient, _1.initializerTokens.strykerPresets, _1.initializerTokens.configWriter, _1.initializerTokens.inquirer); return StrykerInitializer; }()); exports.default = StrykerInitializer; //# sourceMappingURL=StrykerInitializer.js.map