1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const plugin_1 = require("@stryker-mutator/api/plugin");
|
4 | const di_1 = require("./di");
|
5 | const InputFileResolver_1 = require("./input/InputFileResolver");
|
6 | const LogConfigurator_1 = require("./logging/LogConfigurator");
|
7 | const MutantTestMatcher_1 = require("./mutants/MutantTestMatcher");
|
8 | const MutatorFacade_1 = require("./mutants/MutatorFacade");
|
9 | const InitialTestExecutor_1 = require("./process/InitialTestExecutor");
|
10 | const MutationTestExecutor_1 = require("./process/MutationTestExecutor");
|
11 | const MutationTestReportCalculator_1 = require("./reporters/MutationTestReportCalculator");
|
12 | const SandboxPool_1 = require("./SandboxPool");
|
13 | const transpiler_1 = require("./transpiler");
|
14 | const MutantTranspileScheduler_1 = require("./transpiler/MutantTranspileScheduler");
|
15 | const TranspilerFacade_1 = require("./transpiler/TranspilerFacade");
|
16 | class Stryker {
|
17 | |
18 |
|
19 |
|
20 |
|
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 |
|
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 |
|
82 |
|
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 | }
|
102 | exports.default = Stryker;
|
103 |
|
\ | No newline at end of file |