Visitar URL original
fix(coverage): v8 to ignore Vite's generated CJS namespace import hel… · vitest-dev/vitest@5901fb4 · GitHub
Skip to content

Commit 5901fb4

Browse files
authored
fix(coverage): v8 to ignore Vite's generated CJS namespace import helper (#11676)
1 parent b9b7359 commit 5901fb4

7 files changed

Lines changed: 52 additions & 1 deletion

File tree

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,19 @@ export class V8CoverageProvider extends BaseCoverageProvider implements Coverage
309309
return true
310310
}
311311

312+
// CJS namespace imports wrapped in interop helper - e.g.
313+
// const React = ((m, n) => n || !m?.__esModule ? { ...m, default: m } : m)(__vite__cjsImport0_react, 1);
314+
if (
315+
type === 'statement' &&
316+
node.type === 'VariableDeclarator' &&
317+
node.init?.type === 'CallExpression' &&
318+
node.init.callee.type === 'ArrowFunctionExpression' &&
319+
node.init.arguments[0]?.type === 'Identifier' &&
320+
node.init.arguments[0].name.startsWith('__vite__cjsImport')
321+
) {
322+
return 'ignore-this-and-nested-nodes'
323+
}
324+
312325
// in-source test with "if (import.meta.vitest)"
313326
if (
314327
(type === 'branch' || type === 'statement') &&
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import * as cjsNamespace from '@vitest/cjs-lib'
2+
3+
export default function getA() {
4+
return cjsNamespace.a
5+
}

‎test/coverage-test/fixtures/src/cjs-dependency.ts‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
// @ts-expect-error -- types not picked up for some reason
21
import cjsDefault from '@vitest/cjs-lib'
32

43
export default function getA() {
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
declare module '@vitest/cjs-lib' {
2+
export const a: string
3+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { test } from "vitest";
2+
import cjsDependency from "../src/cjs-dependency-namespace";
3+
4+
test("cjs dependency namespace import vite transforms", () => {
5+
cjsDependency()
6+
})

‎test/coverage-test/test/cjs-dependency.test.ts‎

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,27 @@ test('excludes Vite transforms done for CJS dependency', async () => {
3131
expect(Object.keys(fileCoverage.b)).toHaveLength(0)
3232
expect(Object.keys(fileCoverage.branchMap)).toHaveLength(0)
3333
})
34+
35+
test('excludes Vite transforms done for namespace import of CJS dependency', async () => {
36+
await runVitest(
37+
{
38+
include: ['fixtures/test/cjs-dependency-namespace.test.ts'],
39+
coverage: {
40+
reporter: 'json',
41+
},
42+
},
43+
undefined,
44+
{
45+
cacheDir: fileURLToPath(new URL('./node_modules/.vite', import.meta.url)),
46+
optimizeDeps: { include: ['@vitest/cjs-lib'] },
47+
},
48+
)
49+
const coverageMap = await readCoverageMap()
50+
const fileCoverage = coverageMap.fileCoverageFor(
51+
'<process-cwd>/fixtures/src/cjs-dependency-namespace.ts',
52+
)
53+
54+
// There should be 0 branches (#11675)
55+
expect(Object.keys(fileCoverage.b)).toHaveLength(0)
56+
expect(Object.keys(fileCoverage.branchMap)).toHaveLength(0)
57+
})

‎test/coverage-test/test/on-failure.test.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ test('report is not generated when tests fail', async () => {
2020
expect(exitCode).toBe(1)
2121
})
2222

23+
// This test will fail when run by agents due to std-env check
2324
test('report is generated when tests fail and { reportOnFailure: true }', async () => {
2425
const stdout = captureStdout()
2526

0 commit comments

Comments
 (0)