Skip to content

Commit 91dea8c

Browse files
authored
fix(coverage): v8 to warn instead of crash when conversion fails (#6318)
1 parent 1f6cb59 commit 91dea8c

File tree

5 files changed

+63
-1
lines changed

5 files changed

+63
-1
lines changed

packages/coverage-v8/src/provider.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -559,7 +559,13 @@ export class V8CoverageProvider extends BaseCoverageProvider implements Coverage
559559
)
560560
await converter.load()
561561

562-
converter.applyCoverage(functions)
562+
try {
563+
converter.applyCoverage(functions)
564+
}
565+
catch (error) {
566+
this.ctx.logger.error(`Failed to convert coverage for ${url}.\n`, error)
567+
}
568+
563569
coverageMap.merge(converter.toIstanbul())
564570
}),
565571
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
require("./target");
2+
module.exports = "Entry here"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"name": "cjs-package",
3+
"main": "./entry.js",
4+
"type": "commonjs"
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
"use strict";
2+
3+
module.exports = {
4+
debug: 0,
5+
info: 1,
6+
warn: 2,
7+
error: 3,
8+
fatal: 4,
9+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { createRequire } from 'node:module'
2+
import { expect } from 'vitest'
3+
import { coverageTest, normalizeURL, readCoverageMap, runVitest, test } from '../utils'
4+
5+
test('logs warning but doesn\'t crash when coverage conversion fails', async () => {
6+
const { stderr, exitCode } = await runVitest({
7+
include: [normalizeURL(import.meta.url)],
8+
coverage: { reporter: 'json', include: ['fixtures/src/**'], all: false },
9+
}, { throwOnError: false })
10+
11+
// Logged warning should not set erroneous exit code
12+
expect(exitCode).toBe(0)
13+
14+
expect(stderr).toMatch('Failed to convert coverage for file://')
15+
expect(stderr).toMatch('/fixtures/src/cjs-package/target.js.')
16+
expect(stderr).toMatch('TypeError: Cannot read properties of undefined (reading \'endCol\')')
17+
18+
const coverageMap = await readCoverageMap()
19+
20+
expect(coverageMap.files()).toMatchInlineSnapshot(`
21+
[
22+
"<process-cwd>/fixtures/src/cjs-package/entry.js",
23+
"<process-cwd>/fixtures/src/cjs-package/target.js",
24+
]
25+
`)
26+
})
27+
28+
coverageTest('load file both from Vite and outside it', async () => {
29+
const entry = createRequire(import.meta.url)('../fixtures/src/cjs-package' as any)
30+
const target = await import('../fixtures/src/cjs-package/target.js' as any)
31+
32+
expect(entry).toBe('Entry here')
33+
expect(target.default).toStrictEqual({
34+
debug: 0,
35+
error: 3,
36+
fatal: 4,
37+
info: 1,
38+
warn: 2,
39+
})
40+
})

0 commit comments

Comments
 (0)