UNPKG

5.82 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const plugin_1 = require("@stryker-mutator/api/plugin");
4const di_1 = require("./di");
5const InputFileResolver_1 = require("./input/InputFileResolver");
6const LogConfigurator_1 = require("./logging/LogConfigurator");
7const MutantTestMatcher_1 = require("./mutants/MutantTestMatcher");
8const MutatorFacade_1 = require("./mutants/MutatorFacade");
9const InitialTestExecutor_1 = require("./process/InitialTestExecutor");
10const MutationTestExecutor_1 = require("./process/MutationTestExecutor");
11const MutationTestReportCalculator_1 = require("./reporters/MutationTestReportCalculator");
12const SandboxPool_1 = require("./SandboxPool");
13const transpiler_1 = require("./transpiler");
14const MutantTranspileScheduler_1 = require("./transpiler/MutantTranspileScheduler");
15const TranspilerFacade_1 = require("./transpiler/TranspilerFacade");
16class Stryker {
17 /**
18 * The Stryker mutation tester.
19 * @constructor
20 * @param {Object} [cliOptions] - Optional options.
21 */
22 constructor(cliOptions) {
23 LogConfigurator_1.default.configureMainProcess(cliOptions.logLevel, cliOptions.fileLogLevel, cliOptions.allowConsoleColors);
24 this.injector = di_1.buildMainInjector(cliOptions);
25 this.log = this.injector.resolve(plugin_1.commonTokens.getLogger)(Stryker.name);
26 // Log level may have changed
27 LogConfigurator_1.default.configureMainProcess(this.options.logLevel, this.options.fileLogLevel, this.options.allowConsoleColors);
28 }
29 get reporter() {
30 return this.injector.resolve(di_1.coreTokens.reporter);
31 }
32 get options() {
33 return this.injector.resolve(plugin_1.commonTokens.options);
34 }
35 get timer() {
36 return this.injector.resolve(di_1.coreTokens.timer);
37 }
38 get temporaryDirectory() {
39 return this.injector.resolve(di_1.coreTokens.temporaryDirectory);
40 }
41 async runMutationTest() {
42 const loggingContext = await LogConfigurator_1.default.configureLoggingServer(this.options.logLevel, this.options.fileLogLevel, this.options.allowConsoleColors);
43 this.timer.reset();
44 const inputFiles = await this.injector.injectClass(InputFileResolver_1.default).resolve();
45 if (inputFiles.files.length) {
46 this.temporaryDirectory.initialize();
47 const inputFileInjector = this.injector.provideValue(di_1.coreTokens.loggingContext, loggingContext).provideValue(di_1.coreTokens.inputFiles, inputFiles);
48 const initialTestRunProcess = inputFileInjector
49 .provideValue(plugin_1.commonTokens.produceSourceMaps, this.options.coverageAnalysis !== 'off')
50 .provideFactory(di_1.coreTokens.pluginCreatorTranspiler, di_1.PluginCreator.createFactory(plugin_1.PluginKind.Transpiler))
51 .provideClass(di_1.coreTokens.transpiler, TranspilerFacade_1.TranspilerFacade)
52 .injectClass(InitialTestExecutor_1.default);
53 const initialRunResult = await initialTestRunProcess.run();
54 const mutator = inputFileInjector.injectClass(MutatorFacade_1.MutatorFacade);
55 const transpilerProvider = inputFileInjector
56 .provideValue(di_1.coreTokens.initialRunResult, initialRunResult)
57 .provideValue(plugin_1.commonTokens.produceSourceMaps, false)
58 .provideFactory(di_1.coreTokens.transpiler, transpiler_1.transpilerFactory);
59 const transpiler = transpilerProvider.resolve(di_1.coreTokens.transpiler);
60 const transpiledFiles = await transpiler.transpile(inputFiles.files);
61 const mutationTestProcessInjector = transpilerProvider
62 .provideValue(di_1.coreTokens.transpiledFiles, transpiledFiles)
63 .provideClass(di_1.coreTokens.mutantTranspileScheduler, MutantTranspileScheduler_1.MutantTranspileScheduler)
64 .provideClass(di_1.coreTokens.sandboxPool, SandboxPool_1.SandboxPool);
65 const testableMutants = await mutationTestProcessInjector
66 .injectClass(MutantTestMatcher_1.MutantTestMatcher)
67 .matchWithMutants(mutator.mutate(inputFiles.filesToMutate));
68 try {
69 if (initialRunResult.runResult.tests.length && testableMutants.length) {
70 const mutationTestExecutor = mutationTestProcessInjector.injectClass(MutationTestExecutor_1.MutationTestExecutor);
71 const mutantResults = await mutationTestExecutor.run(testableMutants);
72 await this.reportResult(mutantResults, inputFileInjector);
73 this.logDone();
74 return mutantResults;
75 }
76 else {
77 this.logTraceLogLevelHint();
78 }
79 }
80 finally {
81 // `injector.dispose` calls `dispose` on all created instances
82 // Namely the `SandboxPool`, `MutantTranspileScheduler` and `ChildProcessProxy` instances
83 await mutationTestProcessInjector.dispose();
84 await LogConfigurator_1.default.shutdown();
85 }
86 }
87 return Promise.resolve([]);
88 }
89 logDone() {
90 this.log.info('Done in %s.', this.timer.humanReadableElapsed());
91 }
92 logTraceLogLevelHint() {
93 if (!this.log.isTraceEnabled()) {
94 this.log.info('Trouble figuring out what went wrong? Try `npx stryker run --fileLogLevel trace --logLevel debug` to get some more info.');
95 }
96 }
97 async reportResult(mutantResults, inputFileInjector) {
98 inputFileInjector.injectClass(MutationTestReportCalculator_1.MutationTestReportCalculator).report(mutantResults);
99 await this.reporter.wrapUp();
100 }
101}
102exports.default = Stryker;
103//# sourceMappingURL=Stryker.js.map
\No newline at end of file