@@ -14,6 +14,7 @@ import remapping from '@ampproject/remapping'
1414import { normalize , resolve } from 'pathe'
1515import c from 'picocolors'
1616import { provider } from 'std-env'
17+ import { stripLiteral } from 'strip-literal'
1718import createDebug from 'debug'
1819import { cleanUrl } from 'vite-node/utils'
1920import type { EncodedSourceMap , FetchResult } from 'vite-node'
@@ -260,7 +261,13 @@ export class V8CoverageProvider extends BaseCoverageProvider implements Coverage
260261 }
261262
262263 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 )
264271
265272 const coverage = {
266273 url : filename . href ,
@@ -269,7 +276,7 @@ export class V8CoverageProvider extends BaseCoverageProvider implements Coverage
269276 functions : [ {
270277 ranges : [ {
271278 startOffset : 0 ,
272- endOffset : source . length ,
279+ endOffset : originalSource . length ,
273280 count : 0 ,
274281 } ] ,
275282 isBlockCoverage : true ,
@@ -281,15 +288,18 @@ export class V8CoverageProvider extends BaseCoverageProvider implements Coverage
281288 return { result : [ coverage ] }
282289 } ) )
283290
284- merged = mergeProcessCovs ( [ merged , ...coverages ] )
291+ merged = mergeProcessCovs ( [
292+ merged ,
293+ ...coverages . filter ( ( cov ) : cov is NonNullable < typeof cov > => cov != null ) ,
294+ ] )
285295 }
286296
287297 return merged
288298 }
289299
290300 private async getSources ( url : string , transformResults : TransformResults , functions : Profiler . FunctionCoverage [ ] = [ ] ) : Promise < {
291301 source : string
292- originalSource ? : string
302+ originalSource : string
293303 sourceMap ?: { sourcemap : EncodedSourceMap }
294304 } > {
295305 const filePath = normalize ( fileURLToPath ( url ) )
@@ -306,8 +316,12 @@ export class V8CoverageProvider extends BaseCoverageProvider implements Coverage
306316 } )
307317
308318 // 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+ }
311325
312326 return {
313327 originalSource : sourcesContent ,
0 commit comments