From 372e86fdef381038a2c4999fc9007dd7292a0628 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ari=20Perkki=C3=B6?= Date: Mon, 8 Dec 2025 16:31:42 +0200 Subject: [PATCH] fix(coverage): istanbul untested files source maps are off (#9208) --- packages/coverage-istanbul/src/provider.ts | 40 ++++++++++--------- test/coverage-test/setup.ts | 4 +- .../test/results-snapshot.test.ts | 30 ++++++++++++++ 3 files changed, 53 insertions(+), 21 deletions(-) diff --git a/packages/coverage-istanbul/src/provider.ts b/packages/coverage-istanbul/src/provider.ts index 5851c5589..4fdef9629 100644 --- a/packages/coverage-istanbul/src/provider.ts +++ b/packages/coverage-istanbul/src/provider.ts @@ -88,28 +88,30 @@ export class IstanbulCoverageProvider extends BaseCoverageProvider { - addMapping(transformMap, { - generated: { line: mapping.generatedLine, column: mapping.generatedColumn }, - original: { line: mapping.generatedLine, column: mapping.generatedColumn }, - content: sourceCode, - name: mapping.name || '', - source: mapping.source || '', + eachMapping(new TraceMap(sourceMap as any), (mapping) => { + addMapping(transformMap, { + generated: { line: mapping.generatedLine, column: mapping.generatedColumn }, + original: { line: mapping.generatedLine, column: mapping.generatedColumn }, + content: sourceCode, + name: mapping.name || '', + source: mapping.source || '', + }) }) - }) - const encodedMap = toEncodedMap(transformMap) - delete encodedMap.file - delete encodedMap.ignoreList - delete encodedMap.sourceRoot + const encodedMap = toEncodedMap(transformMap) + delete encodedMap.file + delete encodedMap.ignoreList + delete encodedMap.sourceRoot - this.instrumenter.instrumentSync( - sourceCode, - id, - encodedMap as any, - ) + this.instrumenter.instrumentSync( + sourceCode, + id, + encodedMap as any, + ) + } const map = this.instrumenter.lastSourceMap() as any this.transformedModuleIds.add(id) @@ -225,7 +227,7 @@ export class IstanbulCoverageProvider extends BaseCoverageProvider val.constructor.name === 'CoverageMap', + test: val => val.constructor?.name === 'CoverageMap', serialize: (val: CoverageMap, config, indentation, depth, refs, printer) => { return printer(formatSummary(val.getCoverageSummary()), config, indentation, depth, refs) }, }) expect.addSnapshotSerializer({ - test: val => val.constructor.name === 'FileCoverage', + test: val => val.constructor?.name === 'FileCoverage', serialize: (val: FileCoverage, config, indentation, depth, refs, printer) => { return printer(formatSummary(val.toSummary()), config, indentation, depth, refs) }, diff --git a/test/coverage-test/test/results-snapshot.test.ts b/test/coverage-test/test/results-snapshot.test.ts index e5f32f3c6..63ea4aeb1 100644 --- a/test/coverage-test/test/results-snapshot.test.ts +++ b/test/coverage-test/test/results-snapshot.test.ts @@ -39,4 +39,34 @@ test('coverage results matches snapshot', async () => { }, } `) + + const lineCoverages = coverageMap.files().reduce((all, file) => ({ + [file]: coverageMap.fileCoverageFor(file).getLineCoverage(), + ...all, + }), {}) + + expect(lineCoverages).toMatchInlineSnapshot(` + { + "/fixtures/src/even.ts": { + "2": 1, + "6": 0, + }, + "/fixtures/src/math.ts": { + "10": 0, + "14": 0, + "2": 1, + "6": 0, + }, + "/fixtures/src/untested-file.ts": { + "14": 0, + "21": 0, + "33": 0, + "35": 0, + "39": 0, + "41": 0, + "46": 0, + "9": 0, + }, + } + `) })