fix(coverage): istanbul untested files source maps are off (#9208)

This commit is contained in:
Ari Perkkiö 2025-12-08 16:31:42 +02:00 committed by GitHub
parent 5d26b87b08
commit 372e86fdef
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 53 additions and 21 deletions

View File

@ -88,28 +88,30 @@ export class IstanbulCoverageProvider extends BaseCoverageProvider<ResolvedCover
sourceMap as any,
)
const transformMap = new GenMapping(sourceMap)
if (!id.includes('vitest-uncovered-coverage=true')) {
const transformMap = new GenMapping(sourceMap)
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 || '',
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<ResolvedCover
}
// Make sure file is not served from cache so that instrumenter loads up requested file coverage
await transform(`${filename}?cache=${cacheKey}`)
await transform(`${filename}?cache=${cacheKey}&vitest-uncovered-coverage=true`)
const lastCoverage = this.instrumenter.lastFileCoverage()
coverageMap.addFileCoverage(lastCoverage)

View File

@ -3,14 +3,14 @@ import { expect } from 'vitest'
import { formatSummary } from './utils'
expect.addSnapshotSerializer({
test: val => 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)
},

View File

@ -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(`
{
"<process-cwd>/fixtures/src/even.ts": {
"2": 1,
"6": 0,
},
"<process-cwd>/fixtures/src/math.ts": {
"10": 0,
"14": 0,
"2": 1,
"6": 0,
},
"<process-cwd>/fixtures/src/untested-file.ts": {
"14": 0,
"21": 0,
"33": 0,
"35": 0,
"39": 0,
"41": 0,
"46": 0,
"9": 0,
},
}
`)
})