stryker
Version:
The extendable JavaScript mutation testing framework
329 lines • 15.9 kB
JavaScript
"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