-
-
Notifications
You must be signed in to change notification settings - Fork 6.5k
/
Copy pathgenerateEmptyCoverage.ts
90 lines (84 loc) · 2.81 KB
/
generateEmptyCoverage.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
/**
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
import type {V8Coverage} from 'collect-v8-coverage';
import * as fs from 'graceful-fs';
import {FileCoverage, createFileCoverage} from 'istanbul-lib-coverage';
import {readInitialCoverage} from 'istanbul-lib-instrument';
import {createScriptTransformer, shouldInstrument} from '@jest/transform';
import type {Config} from '@jest/types';
type SingleV8Coverage = V8Coverage[number];
export type CoverageWorkerResult =
| {
kind: 'BabelCoverage';
coverage: FileCoverage;
}
| {
kind: 'V8Coverage';
result: SingleV8Coverage;
};
export default async function (
source: string,
filename: Config.Path,
globalConfig: Config.GlobalConfig,
config: Config.ProjectConfig,
changedFiles?: Set<Config.Path>,
sourcesRelatedToTestsInChangedFiles?: Set<Config.Path>,
): Promise<CoverageWorkerResult | null> {
const coverageOptions = {
changedFiles,
collectCoverage: globalConfig.collectCoverage,
collectCoverageFrom: globalConfig.collectCoverageFrom,
collectCoverageOnlyFrom: globalConfig.collectCoverageOnlyFrom,
coverageProvider: globalConfig.coverageProvider,
sourcesRelatedToTestsInChangedFiles,
};
let coverageWorkerResult: CoverageWorkerResult | null = null;
if (shouldInstrument(filename, coverageOptions, config)) {
if (coverageOptions.coverageProvider === 'v8') {
const stat = fs.statSync(filename);
return {
kind: 'V8Coverage',
result: {
functions: [
{
functionName: '(empty-report)',
isBlockCoverage: true,
ranges: [
{
count: 0,
endOffset: stat.size,
startOffset: 0,
},
],
},
],
scriptId: '0',
url: filename,
},
};
}
const scriptTransformer = await createScriptTransformer(config);
// Transform file with instrumentation to make sure initial coverage data is well mapped to original code.
const {code} = scriptTransformer.transformSource(filename, source, {
instrument: true,
supportsDynamicImport: true,
supportsExportNamespaceFrom: true,
supportsStaticESM: true,
supportsTopLevelAwait: true,
});
// TODO: consider passing AST
const extracted = readInitialCoverage(code);
// Check extracted initial coverage is not null, this can happen when using /* istanbul ignore file */
if (extracted) {
coverageWorkerResult = {
coverage: createFileCoverage(extracted.coverageData),
kind: 'BabelCoverage',
};
}
}
return coverageWorkerResult;
}