-
Notifications
You must be signed in to change notification settings - Fork 241
/
StrykerConfigWriter.ts
91 lines (80 loc) · 3.26 KB
/
StrykerConfigWriter.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import * as _ from 'lodash';
import { fsAsPromised } from '@stryker-mutator/util';
import { StrykerOptions } from 'stryker-api/core';
import PromptOption from './PromptOption';
import { format } from 'prettier';
import PresetConfiguration from './presets/PresetConfiguration';
import { tokens, commonTokens } from 'stryker-api/plugin';
import { initializerTokens } from '.';
import { Logger } from 'stryker-api/logging';
const STRYKER_CONFIG_FILE = 'stryker.conf.js';
export default class StrykerConfigWriter {
public static inject = tokens(commonTokens.logger, initializerTokens.out);
constructor(
private readonly log: Logger,
private readonly out: typeof console.log) {
}
public guardForExistingConfig() {
if (fsAsPromised.existsSync(STRYKER_CONFIG_FILE)) {
const msg =
'Stryker config file "stryker.conf.js" already exists in the current directory. Please remove it and try again.';
this.log.error(msg);
throw new Error(msg);
}
}
/**
* Create stryker.conf.js based on the chosen framework and test runner
* @function
*/
public write(
selectedTestRunner: null | PromptOption,
selectedTestFramework: null | PromptOption,
selectedMutator: null | PromptOption,
selectedTranspilers: null | PromptOption[],
selectedReporters: PromptOption[],
selectedPackageManager: PromptOption,
additionalPiecesOfConfig: Partial<StrykerOptions>[]): Promise<void> {
const configObject: Partial<StrykerOptions> = {
mutator: selectedMutator ? selectedMutator.name : '',
packageManager: selectedPackageManager.name,
reporters: selectedReporters.map(rep => rep.name),
testRunner: selectedTestRunner ? selectedTestRunner.name : '',
transpilers: selectedTranspilers ? selectedTranspilers.map(t => t.name) : []
};
this.configureTestFramework(configObject, selectedTestFramework);
_.assign(configObject, ...additionalPiecesOfConfig);
return this.writeStrykerConfig(configObject);
}
/**
* Create stryker.conf.js based on the chosen preset
* @function
*/
public async writePreset(presetConfig: PresetConfiguration) {
return this.writeStrykerConfigRaw(presetConfig.config, `// This config was generated using a preset.
// Please see the handbook for more information: ${presetConfig.handbookUrl}`);
}
private configureTestFramework(configObject: Partial<StrykerOptions>, selectedTestFramework: null | PromptOption) {
if (selectedTestFramework) {
configObject.testFramework = selectedTestFramework.name;
configObject.coverageAnalysis = 'perTest';
} else {
configObject.coverageAnalysis = 'all';
}
}
private writeStrykerConfigRaw(rawConfig: string, rawHeader = '') {
this.out('Writing stryker.conf.js...');
const formattedConf = format(`${rawHeader}
module.exports = function(config){
config.set(
${rawConfig}
);
}`, { parser: 'babel' as unknown as 'babylon' });
return fsAsPromised.writeFile(STRYKER_CONFIG_FILE, formattedConf);
}
private writeStrykerConfig(configObject: Partial<StrykerOptions>) {
return this.writeStrykerConfigRaw(this.wrapInModule(configObject));
}
private wrapInModule(configObject: Partial<StrykerOptions>): string {
return JSON.stringify(configObject, null, 2);
}
}