in packages/jest-reporters/src/CoverageReporter.ts [422:504]
private async _getCoverageResult(): Promise<{
map: istanbulCoverage.CoverageMap;
reportContext: istanbulReport.Context;
}> {
if (this._globalConfig.coverageProvider === 'v8') {
const mergedCoverages = mergeProcessCovs(
this._v8CoverageResults.map(cov => ({result: cov.map(r => r.result)})),
);
const fileTransforms = new Map<string, RuntimeTransformResult>();
this._v8CoverageResults.forEach(res =>
res.forEach(r => {
if (r.codeTransformResult && !fileTransforms.has(r.result.url)) {
fileTransforms.set(r.result.url, r.codeTransformResult);
}
}),
);
const transformedCoverage = await Promise.all(
mergedCoverages.result.map(async res => {
const fileTransform = fileTransforms.get(res.url);
let sourcemapContent: FixedRawSourceMap | undefined = undefined;
if (
fileTransform?.sourceMapPath &&
fs.existsSync(fileTransform.sourceMapPath)
) {
sourcemapContent = JSON.parse(
fs.readFileSync(fileTransform.sourceMapPath, 'utf8'),
);
}
const converter = v8toIstanbul(
res.url,
fileTransform?.wrapperLength ?? 0,
fileTransform && sourcemapContent
? {
originalSource: fileTransform.originalCode,
source: fileTransform.code,
sourceMap: {
sourcemap: {file: res.url, ...sourcemapContent},
},
}
: {source: fs.readFileSync(res.url, 'utf8')},
);
await converter.load();
converter.applyCoverage(res.functions);
const istanbulData = converter.toIstanbul();
converter.destroy();
return istanbulData;
}),
);
const map = istanbulCoverage.createCoverageMap({});
transformedCoverage.forEach(res => map.merge(res));
const reportContext = istanbulReport.createContext({
coverageMap: map,
dir: this._globalConfig.coverageDirectory,
watermarks: getWatermarks(this._globalConfig),
});
return {map, reportContext};
}
const map = await this._sourceMapStore.transformCoverage(this._coverageMap);
const reportContext = istanbulReport.createContext({
coverageMap: map,
dir: this._globalConfig.coverageDirectory,
sourceFinder: this._sourceMapStore.sourceFinder,
watermarks: getWatermarks(this._globalConfig),
});
return {map, reportContext};
}