diff --git a/packages/coverage-v8/src/provider.ts b/packages/coverage-v8/src/provider.ts index 402d3a15c..920b0ae91 100644 --- a/packages/coverage-v8/src/provider.ts +++ b/packages/coverage-v8/src/provider.ts @@ -449,7 +449,17 @@ export class V8CoverageProvider extends BaseCoverageProvider implements Coverage } } - if (this.isIncluded(fileURLToPath(result.url))) { + let filePath + + // Skip results that cannot be converted to file paths, for example virtual files that don't prefix to project root + try { + filePath = fileURLToPath(result.url) + } + catch { + continue + } + + if (this.isIncluded(filePath)) { scriptCoverages.push({ ...result, url: decodeURIComponent(result.url) }) } } diff --git a/test/coverage-test/fixtures/configs/vitest.config.virtual-files.ts b/test/coverage-test/fixtures/configs/vitest.config.virtual-files.ts index 27e553564..7ae885324 100644 --- a/test/coverage-test/fixtures/configs/vitest.config.virtual-files.ts +++ b/test/coverage-test/fixtures/configs/vitest.config.virtual-files.ts @@ -26,6 +26,10 @@ function VirtualFilesPlugin(): Plugin { return 'src/\0vitest-custom-virtual-file-2.ts' } + if (id === 'virtual:vitest-custom-virtual-file-3') { + return '/@fs/virtual:vitest-custom-virtual-file-3' + } + if (id.includes('vitest-custom-virtual:math')) { return resolve(import.meta.dirname, "../src/vitest-custom-virtual:math") } @@ -46,6 +50,13 @@ function VirtualFilesPlugin(): Plugin { ` } + if(id === '/@fs/virtual:vitest-custom-virtual-file-3' || id === "/virtual:vitest-custom-virtual-file-3") { + return ` + const virtualFile = "This file should be excluded from coverage report #3" + export default virtualFile; + ` + } + if(id.includes("vitest-custom-virtual:math")) { const filename = resolve(import.meta.dirname, "../src/math.ts"); const sources = readFileSync(filename, "utf8") diff --git a/test/coverage-test/fixtures/src/virtual-files.ts b/test/coverage-test/fixtures/src/virtual-files.ts index 32d4e3324..ce1a51b85 100644 --- a/test/coverage-test/fixtures/src/virtual-files.ts +++ b/test/coverage-test/fixtures/src/virtual-files.ts @@ -4,9 +4,12 @@ import virtualFile1 from 'virtual:vitest-custom-virtual-file-1' // @ts-expect-error -- untyped virtual file provided by custom plugin import virtualFile2 from '\0vitest-custom-virtual-file-2' +// @ts-expect-error -- untyped virtual file provided by custom plugin +import virtualFile3 from 'virtual:vitest-custom-virtual-file-3' + // @ts-expect-error -- untyped virtual file provided by custom plugin import * as virtualMath from 'vitest-custom-virtual:math' export function getVirtualFileImports() { - return { virtualFile1, virtualFile2, virtualMath } + return { virtualFile1, virtualFile2, virtualFile3, virtualMath } } diff --git a/test/coverage-test/fixtures/test/virtual-files-fixture.test.ts b/test/coverage-test/fixtures/test/virtual-files-fixture.test.ts index cfe932eef..72358b263 100644 --- a/test/coverage-test/fixtures/test/virtual-files-fixture.test.ts +++ b/test/coverage-test/fixtures/test/virtual-files-fixture.test.ts @@ -2,10 +2,11 @@ import { expect, test } from 'vitest' import { getVirtualFileImports} from '../src/virtual-files' test("verify virtual files work", () => { - const {virtualFile1, virtualFile2, virtualMath} = getVirtualFileImports() + const {virtualFile1, virtualFile2, virtualFile3, virtualMath} = getVirtualFileImports() expect(virtualFile1).toBe('This file should be excluded from coverage report #1') expect(virtualFile2).toBe('This file should be excluded from coverage report #2') + expect(virtualFile3).toBe('This file should be excluded from coverage report #3') expect(virtualMath).toHaveProperty('sum') expect(virtualMath.sum(50, 65)).toBe(115) diff --git a/test/coverage-test/test/virtual-files.test.ts b/test/coverage-test/test/virtual-files.test.ts index 4e229d0bf..2035e2674 100644 --- a/test/coverage-test/test/virtual-files.test.ts +++ b/test/coverage-test/test/virtual-files.test.ts @@ -6,6 +6,7 @@ test('virtual files should be excluded', async () => { include: ['fixtures/test/virtual-files-fixture.test.ts'], coverage: { reporter: 'json' }, config: 'fixtures/configs/vitest.config.virtual-files.ts', + injectCjsGlobals: false, }) expect(stdout).toContain('virtual-files-fixture.test.ts') diff --git a/test/coverage-test/vitest.config.ts b/test/coverage-test/vitest.config.ts index 15af893e7..8cf2d36af 100644 --- a/test/coverage-test/vitest.config.ts +++ b/test/coverage-test/vitest.config.ts @@ -97,6 +97,7 @@ export default defineConfig({ '**/test/source-maps.test.ts', '**/test/mock-autospy.test.ts', '**/test/mock-importActual.test.ts', + '**/virtual-files.test.ts', ], exclude: [FIXTURES], }, @@ -131,6 +132,7 @@ export default defineConfig({ '**/test/source-maps.test.ts', '**/test/mock-autospy.test.ts', '**/test/mock-importActual.test.ts', + '**/virtual-files.test.ts', ], exclude: [FIXTURES], },