@@ -43,7 +43,7 @@ export class FileSystemModuleCache {
4343 private rootCache : string
4444 private metadataFilePath : string
4545
46- private version = '1.0.0-beta.8 '
46+ private version = '1.0.0-beta.9 '
4747 private fsCacheRoots = new WeakMap < ResolvedConfig , string > ( )
4848 private fsEnvironmentHashMap = new WeakMap < DevEnvironment , string > ( )
4949 private fsCacheKeyGenerators = new WeakMap < ResolvedConfig , Set < CacheKeyIdGenerator > > ( )
@@ -152,6 +152,8 @@ export class FileSystemModuleCache {
152152 deps : meta . deps ,
153153 dynamicDeps : meta . dynamicDeps ,
154154 staticMocks : meta . staticMocks ,
155+ hasCoverageData : meta . hasCoverageData ,
156+ coverageData : meta . hasCoverageData ? await readCoverageData ( cachedFilePath ) : undefined ,
155157 }
156158 }
157159
@@ -161,6 +163,7 @@ export class FileSystemModuleCache {
161163 transformResult : TransformResult | null ,
162164 imports : CachedModuleImports = { urls : [ ] , ids : { } } ,
163165 mappings : boolean = false ,
166+ coverageData ?: unknown ,
164167 ) : Promise < void > {
165168 if ( 'code' in fetchResult ) {
166169 const result = {
@@ -172,15 +175,40 @@ export class FileSystemModuleCache {
172175 deps : transformResult ?. deps ,
173176 dynamicDeps : transformResult ?. dynamicDeps ,
174177 staticMocks : transformResult ?. __vitestStaticMocks ,
175- } satisfies Omit < CachedInlineModuleMeta , 'code' >
178+ hasCoverageData : coverageData !== undefined ,
179+ } satisfies Omit < CachedInlineModuleMeta , 'code' | 'coverageData' >
176180 debugFs ?.( `${ c . yellow ( '[write]' ) } ${ fetchResult . id } is cached in ${ cachedFilePath } ` )
177- await atomicWriteFile (
178- cachedFilePath ,
179- `${ fetchResult . code } ${ cacheComment } ${ this . toBase64 ( result ) } ` ,
180- )
181+
182+ await Promise . all ( [
183+ // Coverage data is stored in separate file so that it's not transferred to the workers
184+ result . hasCoverageData &&
185+ atomicWriteFile ( getCoverageDataPath ( cachedFilePath ) , JSON . stringify ( coverageData ) ) ,
186+
187+ atomicWriteFile (
188+ cachedFilePath ,
189+ `${ fetchResult . code } ${ cacheComment } ${ this . toBase64 ( result ) } ` ,
190+ ) ,
191+ ] )
181192 }
182193 }
183194
195+ getCoverageData ( environment : DevEnvironment , id : string ) : unknown {
196+ const coverageProvider = this . vitest . coverageProvider
197+
198+ if ( ! this . vitest . config . coverage . enabled || ! coverageProvider ?. requiresTransform ?.( id ) ) {
199+ return
200+ }
201+
202+ return coverageProvider . getModuleCacheData ?.( environment , id )
203+ }
204+
205+ /**
206+ * Passes the data of the coverage provider back to it when the cached module is used
207+ */
208+ restoreCoverageData ( environment : DevEnvironment , id : string , data : unknown ) : void {
209+ this . vitest . coverageProvider ?. restoreModuleCacheData ?.( environment , id , data )
210+ }
211+
184212 private toBase64 ( obj : unknown ) {
185213 const json = stringify ( obj )
186214 return Buffer . from ( json ) . toString ( 'base64' )
@@ -242,9 +270,13 @@ export class FileSystemModuleCache {
242270 const config = environment . config
243271 // coverage provider is dynamic, so we also clear the whole cache if
244272 // vitest.enableCoverage/vitest.disableCoverage is called
245- const coverageAffectsCache = String (
246- this . vitest . config . coverage . enabled && this . vitest . coverageProvider ?. requiresTransform ?.( id ) ,
247- )
273+ const coverageProvider = this . vitest . coverageProvider
274+
275+ const coverageAffectsCache =
276+ this . vitest . config . coverage . enabled && coverageProvider ?. requiresTransform ?.( id )
277+ ? `${ coverageProvider . name } @${ coverageProvider . version } `
278+ : 'false'
279+
248280 let environmentHash = this . fsEnvironmentHashMap . get ( environment )
249281 if ( ! environmentHash ) {
250282 const cacheConfig = JSON . stringify (
@@ -441,6 +473,8 @@ export interface CachedInlineModuleMeta {
441473 deps ?: string [ ]
442474 dynamicDeps ?: string [ ]
443475 staticMocks ?: StaticMockCall [ ] | null
476+ hasCoverageData ?: boolean
477+ coverageData ?: unknown
444478}
445479
446480export interface CachedModuleImports {
@@ -591,3 +625,13 @@ function tryStatSync(file: string): fs.Stats | undefined {
591625 // Ignore errors
592626 }
593627}
628+
629+ async function readCoverageData ( cachedFilePath : string ) : Promise < unknown > {
630+ try {
631+ return JSON . parse ( await readFile ( getCoverageDataPath ( cachedFilePath ) , 'utf-8' ) )
632+ } catch { }
633+ }
634+
635+ function getCoverageDataPath ( cachedFilePath : string ) : string {
636+ return `${ cachedFilePath } .coverage.json`
637+ }
0 commit comments