Skip to content

Commit c3eb8de

Browse files
authoredMar 4, 2024··
fix(coverage): v8 to ignore type-only files (#5328)
1 parent ab60bf8 commit c3eb8de

File tree

4 files changed

+27
-6
lines changed

4 files changed

+27
-6
lines changed
 

‎packages/coverage-v8/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
"magicast": "^0.3.3",
5656
"picocolors": "^1.0.0",
5757
"std-env": "^3.5.0",
58+
"strip-literal": "^2.0.0",
5859
"test-exclude": "^6.0.0",
5960
"v8-to-istanbul": "^9.2.0"
6061
},

‎packages/coverage-v8/src/provider.ts

+20-6
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import remapping from '@ampproject/remapping'
1414
import { normalize, resolve } from 'pathe'
1515
import c from 'picocolors'
1616
import { provider } from 'std-env'
17+
import { stripLiteral } from 'strip-literal'
1718
import createDebug from 'debug'
1819
import { cleanUrl } from 'vite-node/utils'
1920
import type { EncodedSourceMap, FetchResult } from 'vite-node'
@@ -260,7 +261,13 @@ export class V8CoverageProvider extends BaseCoverageProvider implements Coverage
260261
}
261262

262263
const coverages = await Promise.all(chunk.map(async (filename) => {
263-
const { source } = await this.getSources(filename.href, transformResults)
264+
const transformResult = await this.ctx.vitenode.transformRequest(filename.pathname).catch(() => {})
265+
266+
// Ignore empty files, e.g. files that contain only typescript types and no runtime code
267+
if (transformResult && stripLiteral(transformResult.code).trim() === '')
268+
return null
269+
270+
const { originalSource } = await this.getSources(filename.href, transformResults)
264271

265272
const coverage = {
266273
url: filename.href,
@@ -269,7 +276,7 @@ export class V8CoverageProvider extends BaseCoverageProvider implements Coverage
269276
functions: [{
270277
ranges: [{
271278
startOffset: 0,
272-
endOffset: source.length,
279+
endOffset: originalSource.length,
273280
count: 0,
274281
}],
275282
isBlockCoverage: true,
@@ -281,15 +288,18 @@ export class V8CoverageProvider extends BaseCoverageProvider implements Coverage
281288
return { result: [coverage] }
282289
}))
283290

284-
merged = mergeProcessCovs([merged, ...coverages])
291+
merged = mergeProcessCovs([
292+
merged,
293+
...coverages.filter((cov): cov is NonNullable<typeof cov> => cov != null),
294+
])
285295
}
286296

287297
return merged
288298
}
289299

290300
private async getSources(url: string, transformResults: TransformResults, functions: Profiler.FunctionCoverage[] = []): Promise<{
291301
source: string
292-
originalSource?: string
302+
originalSource: string
293303
sourceMap?: { sourcemap: EncodedSourceMap }
294304
}> {
295305
const filePath = normalize(fileURLToPath(url))
@@ -306,8 +316,12 @@ export class V8CoverageProvider extends BaseCoverageProvider implements Coverage
306316
})
307317

308318
// These can be uncovered files included by "all: true" or files that are loaded outside vite-node
309-
if (!map)
310-
return { source: code || sourcesContent }
319+
if (!map) {
320+
return {
321+
source: code || sourcesContent,
322+
originalSource: sourcesContent,
323+
}
324+
}
311325

312326
return {
313327
originalSource: sourcesContent,

‎pnpm-lock.yaml

+3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎test/coverage-test/src/types.ts

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export type First = 'This' | 'file' | 'should'
2+
3+
export type Second = 'be' | 'excluded' | 'from' | 'report'

0 commit comments

Comments
 (0)
Please sign in to comment.