@@ -14,6 +14,7 @@ import remapping from '@ampproject/remapping'
14
14
import { normalize , resolve } from 'pathe'
15
15
import c from 'picocolors'
16
16
import { provider } from 'std-env'
17
+ import { stripLiteral } from 'strip-literal'
17
18
import createDebug from 'debug'
18
19
import { cleanUrl } from 'vite-node/utils'
19
20
import type { EncodedSourceMap , FetchResult } from 'vite-node'
@@ -260,7 +261,13 @@ export class V8CoverageProvider extends BaseCoverageProvider implements Coverage
260
261
}
261
262
262
263
const coverages = await Promise . all ( chunk . map ( async ( filename ) => {
263
- const { source } = await this . getSources ( filename . href , transformResults )
264
+ const transformResult = await this . ctx . vitenode . transformRequest ( filename . pathname ) . catch ( ( ) => { } )
265
+
266
+ // Ignore empty files, e.g. files that contain only typescript types and no runtime code
267
+ if ( transformResult && stripLiteral ( transformResult . code ) . trim ( ) === '' )
268
+ return null
269
+
270
+ const { originalSource } = await this . getSources ( filename . href , transformResults )
264
271
265
272
const coverage = {
266
273
url : filename . href ,
@@ -269,7 +276,7 @@ export class V8CoverageProvider extends BaseCoverageProvider implements Coverage
269
276
functions : [ {
270
277
ranges : [ {
271
278
startOffset : 0 ,
272
- endOffset : source . length ,
279
+ endOffset : originalSource . length ,
273
280
count : 0 ,
274
281
} ] ,
275
282
isBlockCoverage : true ,
@@ -281,15 +288,18 @@ export class V8CoverageProvider extends BaseCoverageProvider implements Coverage
281
288
return { result : [ coverage ] }
282
289
} ) )
283
290
284
- merged = mergeProcessCovs ( [ merged , ...coverages ] )
291
+ merged = mergeProcessCovs ( [
292
+ merged ,
293
+ ...coverages . filter ( ( cov ) : cov is NonNullable < typeof cov > => cov != null ) ,
294
+ ] )
285
295
}
286
296
287
297
return merged
288
298
}
289
299
290
300
private async getSources ( url : string , transformResults : TransformResults , functions : Profiler . FunctionCoverage [ ] = [ ] ) : Promise < {
291
301
source : string
292
- originalSource ? : string
302
+ originalSource : string
293
303
sourceMap ?: { sourcemap : EncodedSourceMap }
294
304
} > {
295
305
const filePath = normalize ( fileURLToPath ( url ) )
@@ -306,8 +316,12 @@ export class V8CoverageProvider extends BaseCoverageProvider implements Coverage
306
316
} )
307
317
308
318
// These can be uncovered files included by "all: true" or files that are loaded outside vite-node
309
- if ( ! map )
310
- return { source : code || sourcesContent }
319
+ if ( ! map ) {
320
+ return {
321
+ source : code || sourcesContent ,
322
+ originalSource : sourcesContent ,
323
+ }
324
+ }
311
325
312
326
return {
313
327
originalSource : sourcesContent ,
0 commit comments