11import { existsSync , promises as fs } from 'node:fs'
22import _url from 'node:url'
33import type { Profiler } from 'node:inspector'
4+ import MagicString from 'magic-string'
5+ import remapping from '@ampproject/remapping'
46import { extname , resolve } from 'pathe'
57import c from 'picocolors'
68import { provider } from 'std-env'
@@ -18,6 +20,9 @@ import { checkCoverages } from 'c8/lib/commands/check-coverage.js'
1820
1921type Options = ResolvedCoverageOptions < 'c8' >
2022
23+ // Note that this needs to match the line ending as well
24+ const VITE_EXPORTS_LINE_PATTERN = / O b j e c t \. d e f i n e P r o p e r t y \( _ _ v i t e _ s s r _ e x p o r t s _ _ .* \n / g
25+
2126export 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+ }
0 commit comments