UNPKG

3.67 kBJavaScriptView Raw
1import path from 'path';
2import { fileURLToPath, URL } from 'url';
3import { propertyPath } from '@stryker-mutator/util';
4import semver from 'semver';
5import { state } from './cjs/messaging.js';
6const jestEnvironmentGenericFileName = fileURLToPath(new URL('./cjs/jest-environment-generic.js', import.meta.url));
7/**
8 * Jest's defaults.
9 * @see https://jestjs.io/docs/en/configuration
10 */
11function getJestDefaults(jestWrapper) {
12 // New defaults since 27: https://jestjs.io/blog/2021/05/25/jest-27
13 if (semver.satisfies(jestWrapper.getVersion(), '>=27')) {
14 return {
15 testRunner: 'jest-circus/runner',
16 testEnvironment: 'node',
17 };
18 }
19 else {
20 return {
21 // the defaults before v27
22 testRunner: 'jest-jasmine2',
23 testEnvironment: 'jsdom',
24 };
25 }
26}
27export function withCoverageAnalysis(jestConfig, coverageAnalysis, jestWrapper) {
28 // Override with Stryker specific test environment to capture coverage analysis
29 if (coverageAnalysis === 'off') {
30 return jestConfig;
31 }
32 else {
33 const overrides = {};
34 overrideEnvironment(jestConfig, overrides, jestWrapper);
35 if (coverageAnalysis === 'perTest') {
36 setupFramework(jestConfig, overrides, jestWrapper);
37 }
38 return { ...jestConfig, ...overrides };
39 }
40}
41export function withHitLimit(jestConfig, hitLimit, jestWrapper) {
42 // Override with Stryker specific test environment to capture coverage analysis
43 if (typeof hitLimit === 'number') {
44 const overrides = {};
45 overrideEnvironment(jestConfig, overrides, jestWrapper);
46 return { ...jestConfig, ...overrides };
47 }
48 else {
49 return jestConfig;
50 }
51}
52/**
53 * Setup the test framework (aka "runner" in jest terms) for "perTest" coverage analysis.
54 * Will use monkey patching for framework "jest-jasmine2", and will assume the test environment handles events when "jest-circus"
55 */
56function setupFramework(jestConfig, overrides, jestWrapper) {
57 var _a, _b;
58 const testRunner = (_a = jestConfig.testRunner) !== null && _a !== void 0 ? _a : getJestDefaults(jestWrapper).testRunner;
59 if (testRunner === 'jest-jasmine2') {
60 overrides.setupFilesAfterEnv = [
61 path.resolve(path.dirname(fileURLToPath(import.meta.url)), './jasmine2-setup-coverage-analysis.js'),
62 ...((_b = jestConfig.setupFilesAfterEnv) !== null && _b !== void 0 ? _b : []),
63 ];
64 }
65 else if (!testRunner.includes('jest-circus')) {
66 // 'jest-circus/runner' is supported, via handleTestEvent, see https://jestjs.io/docs/en/configuration#testenvironment-string
67 // Use includes here, since "react-scripts" will specify the full path to `jest-circus`, see https://github.com/stryker-mutator/stryker-js/issues/2789
68 throw new Error(`The @stryker-mutator/jest-runner doesn't support ${propertyPath()('coverageAnalysis')} "perTest" with "jestConfig.testRunner": "${jestConfig.testRunner}". Please open an issue if you want support for this: https://github.com/stryker-mutator/stryker-js/issues`);
69 }
70}
71function overrideEnvironment(jestConfig, overrides, jestWrapper) {
72 var _a;
73 const originalJestEnvironment = (_a = jestConfig.testEnvironment) !== null && _a !== void 0 ? _a : getJestDefaults(jestWrapper).testEnvironment;
74 state.jestEnvironment = nameEnvironment(originalJestEnvironment);
75 overrides.testEnvironment = jestEnvironmentGenericFileName;
76}
77function nameEnvironment(shortName) {
78 return ['node', 'jsdom'].includes(shortName) ? `jest-environment-${shortName}` : shortName;
79}
80//# sourceMappingURL=with-coverage-analysis.js.map
\No newline at end of file