11import type { CoverageMap } from 'istanbul-lib-coverage'
22import type { ProxifiedModule } from 'magicast'
33import type { Profiler } from 'node:inspector'
4- import type { EncodedSourceMap , FetchResult } from 'vite-node'
5- import type { AfterSuiteRunMeta } from 'vitest'
6- import type { CoverageProvider , ReportContext , ResolvedCoverageOptions , TestProject , Vitest } from 'vitest/node'
4+ import type { CoverageProvider , ReportContext , ResolvedCoverageOptions , TestProject , Vite , Vitest } from 'vitest/node'
75import { promises as fs } from 'node:fs'
86import { fileURLToPath } from 'node:url'
97// @ts -expect-error -- untyped
108import { mergeProcessCovs } from '@bcoe/v8-coverage'
9+ import { cleanUrl } from '@vitest/utils'
1110import astV8ToIstanbul from 'ast-v8-to-istanbul'
1211import createDebug from 'debug'
1312import libCoverage from 'istanbul-lib-coverage'
@@ -18,7 +17,6 @@ import { parseModule } from 'magicast'
1817import { normalize } from 'pathe'
1918import { provider } from 'std-env'
2019import c from 'tinyrainbow'
21- import { cleanUrl } from 'vite-node/utils'
2220
2321import { BaseCoverageProvider } from 'vitest/coverage'
2422import { parseAstAsync } from 'vitest/node'
@@ -28,7 +26,7 @@ export interface ScriptCoverageWithOffset extends Profiler.ScriptCoverage {
2826 startOffset : number
2927}
3028
31- type TransformResults = Map < string , FetchResult >
29+ type TransformResults = Map < string , Vite . TransformResult >
3230interface RawCoverage { result : ScriptCoverageWithOffset [ ] }
3331
3432const FILE_PROTOCOL = 'file://'
@@ -148,7 +146,7 @@ export class V8CoverageProvider extends BaseCoverageProvider<ResolvedCoverageOpt
148146
149147 private async getCoverageMapForUncoveredFiles ( testedFiles : string [ ] ) : Promise < CoverageMap > {
150148 const transformResults = normalizeTransformResults (
151- this . ctx . vitenode . fetchCache ,
149+ this . ctx . vite . environments . ssr . moduleGraph ,
152150 )
153151 const transform = this . createUncoveredFileTransformer ( this . ctx )
154152
@@ -307,24 +305,24 @@ export class V8CoverageProvider extends BaseCoverageProvider<ResolvedCoverageOpt
307305 )
308306 }
309307
310- private async getSources < TransformResult extends ( FetchResult | Awaited < ReturnType < typeof this . ctx . vitenode . transformRequest > > ) > (
308+ private async getSources (
311309 url : string ,
312310 transformResults : TransformResults ,
313- onTransform : ( filepath : string ) => Promise < TransformResult > ,
311+ onTransform : ( filepath : string ) => Promise < Vite . TransformResult | undefined | null > ,
314312 functions : Profiler . FunctionCoverage [ ] = [ ] ,
315313 ) : Promise < {
316314 code : string
317- map ?: EncodedSourceMap
315+ map ?: Vite . Rollup . SourceMap
318316 } > {
319317 const filePath = normalize ( fileURLToPath ( url ) )
320318
321- let transformResult : FetchResult | TransformResult | undefined = transformResults . get ( filePath )
319+ let transformResult : Vite . TransformResult | undefined | null = transformResults . get ( filePath )
322320
323321 if ( ! transformResult ) {
324322 transformResult = await onTransform ( removeStartsWith ( url , FILE_PROTOCOL ) ) . catch ( ( ) => undefined )
325323 }
326324
327- const map = transformResult ?. map as EncodedSourceMap | undefined
325+ const map = transformResult ?. map as Vite . Rollup . SourceMap | undefined
328326 const code = transformResult ?. code
329327
330328 if ( ! code ) {
@@ -357,31 +355,37 @@ export class V8CoverageProvider extends BaseCoverageProvider<ResolvedCoverageOpt
357355 private async convertCoverage (
358356 coverage : RawCoverage ,
359357 project : TestProject = this . ctx . getRootProject ( ) ,
360- transformMode ?: AfterSuiteRunMeta [ 'transformMode' ] ,
358+ environment : string ,
361359 ) : Promise < CoverageMap > {
362- let fetchCache = project . vitenode . fetchCache
360+ if ( environment === '__browser__' && ! project . browser ) {
361+ throw new Error ( `Cannot access browser module graph because it was torn down.` )
362+ }
363+
364+ const moduleGraph = environment === '__browser__'
365+ ? project . browser ! . vite . environments . client . moduleGraph
366+ : project . vite . environments [ environment ] ?. moduleGraph
363367
364- if ( transformMode ) {
365- fetchCache = transformMode === 'browser' ? new Map ( ) : project . vitenode . fetchCaches [ transformMode ]
368+ if ( ! moduleGraph ) {
369+ throw new Error ( `Module graph for environment ${ environment } was not defined.` )
366370 }
367371
368- const transformResults = normalizeTransformResults ( fetchCache )
372+ const transformResults = normalizeTransformResults ( moduleGraph )
369373
370374 async function onTransform ( filepath : string ) {
371- if ( transformMode === 'browser ' && project . browser ) {
375+ if ( environment === '__browser__ ' && project . browser ) {
372376 const result = await project . browser . vite . transformRequest ( removeStartsWith ( filepath , project . config . root ) )
373377
374378 if ( result ) {
375379 return { ...result , code : `${ result . code } // <inline-source-map>` }
376380 }
377381 }
378- return project . vitenode . transformRequest ( filepath )
382+ return project . vite . environments [ environment ] . transformRequest ( filepath )
379383 }
380384
381385 const scriptCoverages = [ ]
382386
383387 for ( const result of coverage . result ) {
384- if ( transformMode === 'browser ' ) {
388+ if ( environment === '__browser__ ' ) {
385389 if ( result . url . startsWith ( '/@fs' ) ) {
386390 result . url = `${ FILE_PROTOCOL } ${ removeStartsWith ( result . url , '/@fs' ) } `
387391 }
@@ -466,15 +470,15 @@ function findLongestFunctionLength(functions: Profiler.FunctionCoverage[]) {
466470}
467471
468472function normalizeTransformResults (
469- fetchCache : Map < string , { result : FetchResult } > ,
473+ moduleGraph : Vite . EnvironmentModuleGraph ,
470474) {
471475 const normalized : TransformResults = new Map ( )
472476
473- for ( const [ key , value ] of fetchCache . entries ( ) ) {
477+ for ( const [ key , value ] of moduleGraph . idToModuleMap ) {
474478 const cleanEntry = cleanUrl ( key )
475479
476- if ( ! normalized . has ( cleanEntry ) ) {
477- normalized . set ( cleanEntry , value . result )
480+ if ( value . transformResult && ! normalized . has ( cleanEntry ) ) {
481+ normalized . set ( cleanEntry , value . transformResult )
478482 }
479483 }
480484
0 commit comments