From ef21bcad1ebe05eb0e6dc78e54c7ed77dae407b6 Mon Sep 17 00:00:00 2001 From: AriPerkkio Date: Sun, 3 Mar 2024 20:05:30 +0200 Subject: [PATCH] fix(coverage): v8 to ignore type-only files --- packages/coverage-v8/src/provider.ts | 25 +++++++++++++++++++------ test/coverage-test/src/types.ts | 3 +++ 2 files changed, 22 insertions(+), 6 deletions(-) create mode 100644 test/coverage-test/src/types.ts diff --git a/packages/coverage-v8/src/provider.ts b/packages/coverage-v8/src/provider.ts index 517f446618cb..bd2410305b7f 100644 --- a/packages/coverage-v8/src/provider.ts +++ b/packages/coverage-v8/src/provider.ts @@ -260,7 +260,13 @@ export class V8CoverageProvider extends BaseCoverageProvider implements Coverage } const coverages = await Promise.all(chunk.map(async (filename) => { - const { source } = await this.getSources(filename.href, transformResults) + const transformResult = await this.ctx.vitenode.transformRequest(filename.pathname).catch(() => {}) + + // Ignore empty files, e.g. files that contain only typescript types and no runtime code + if (transformResult?.code.trim().startsWith('//# sourceMappingSource=')) + return null + + const { originalSource } = await this.getSources(filename.href, transformResults) const coverage = { url: filename.href, @@ -269,7 +275,7 @@ export class V8CoverageProvider extends BaseCoverageProvider implements Coverage functions: [{ ranges: [{ startOffset: 0, - endOffset: source.length, + endOffset: originalSource.length, count: 0, }], isBlockCoverage: true, @@ -281,7 +287,10 @@ export class V8CoverageProvider extends BaseCoverageProvider implements Coverage return { result: [coverage] } })) - merged = mergeProcessCovs([merged, ...coverages]) + merged = mergeProcessCovs([ + merged, + ...coverages.filter((cov): cov is NonNullable => cov != null), + ]) } return merged @@ -289,7 +298,7 @@ export class V8CoverageProvider extends BaseCoverageProvider implements Coverage private async getSources(url: string, transformResults: TransformResults, functions: Profiler.FunctionCoverage[] = []): Promise<{ source: string - originalSource?: string + originalSource: string sourceMap?: { sourcemap: EncodedSourceMap } }> { const filePath = normalize(fileURLToPath(url)) @@ -306,8 +315,12 @@ export class V8CoverageProvider extends BaseCoverageProvider implements Coverage }) // These can be uncovered files included by "all: true" or files that are loaded outside vite-node - if (!map) - return { source: code || sourcesContent } + if (!map) { + return { + source: code || sourcesContent, + originalSource: sourcesContent, + } + } return { originalSource: sourcesContent, diff --git a/test/coverage-test/src/types.ts b/test/coverage-test/src/types.ts new file mode 100644 index 000000000000..439f557c49cf --- /dev/null +++ b/test/coverage-test/src/types.ts @@ -0,0 +1,3 @@ +export type First = 'This' | 'file' | 'should' + +export type Second = 'be' | 'excluded' | 'from' | 'report'