Skip to content

Commit 21942db

Browse files
authored
fix(coverage): c8 to ignore vite's generated helpers (#3241)
1 parent be0844c commit 21942db

File tree

10 files changed

+947
-469
lines changed

10 files changed

+947
-469
lines changed

packages/coverage-c8/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,9 @@
4545
"vitest": ">=0.30.0 <1"
4646
},
4747
"dependencies": {
48+
"@ampproject/remapping": "^2.2.0",
4849
"c8": "^7.13.0",
50+
"magic-string": "^0.30.0",
4951
"picocolors": "^1.0.0",
5052
"std-env": "^3.3.2"
5153
},

packages/coverage-c8/src/provider.ts

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import { existsSync, promises as fs } from 'node:fs'
22
import _url from 'node:url'
33
import type { Profiler } from 'node:inspector'
4+
import MagicString from 'magic-string'
5+
import remapping from '@ampproject/remapping'
46
import { extname, resolve } from 'pathe'
57
import c from 'picocolors'
68
import { provider } from 'std-env'
@@ -18,6 +20,9 @@ import { checkCoverages } from 'c8/lib/commands/check-coverage.js'
1820

1921
type Options = ResolvedCoverageOptions<'c8'>
2022

23+
// Note that this needs to match the line ending as well
24+
const VITE_EXPORTS_LINE_PATTERN = /Object\.defineProperty\(__vite_ssr_exports__.*\n/g
25+
2126
export class C8CoverageProvider extends BaseCoverageProvider implements CoverageProvider {
2227
name = 'c8'
2328

@@ -169,7 +174,7 @@ export class C8CoverageProvider extends BaseCoverageProvider implements Coverage
169174

170175
return {
171176
sourceMap: {
172-
sourcemap: data.map,
177+
sourcemap: removeViteHelpersFromSourceMaps(data.source, data.map),
173178
},
174179
source: Array(offset).fill('.').join('') + data.source,
175180
}
@@ -193,3 +198,27 @@ export class C8CoverageProvider extends BaseCoverageProvider implements Coverage
193198
}
194199
}
195200
}
201+
202+
/**
203+
* Remove generated code from the source maps:
204+
* - Vite's export helpers: e.g. `Object.defineProperty(__vite_ssr_exports__, "sum", { enumerable: true, configurable: true, get(){ return sum }});`
205+
*/
206+
function removeViteHelpersFromSourceMaps(source: string | undefined, map: EncodedSourceMap) {
207+
if (!source || !source.match(VITE_EXPORTS_LINE_PATTERN))
208+
return map
209+
210+
const sourceWithoutHelpers = new MagicString(source)
211+
sourceWithoutHelpers.replaceAll(VITE_EXPORTS_LINE_PATTERN, '\n')
212+
213+
const mapWithoutHelpers = sourceWithoutHelpers.generateMap({
214+
hires: true,
215+
})
216+
217+
// A merged source map where the first one excludes helpers
218+
const combinedMap = remapping(
219+
[{ ...mapWithoutHelpers, version: 3 }, map],
220+
() => null,
221+
)
222+
223+
return combinedMap
224+
}

pnpm-lock.yaml

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)