@@ -25,11 +25,12 @@ import { cleanUrl } from 'vite-node/utils'
25
25
import { BaseCoverageProvider } from 'vitest/coverage'
26
26
import { version } from '../package.json' with { type : 'json' }
27
27
28
- type TransformResults = Map < string , FetchResult >
29
- type RawCoverage = Profiler . TakePreciseCoverageReturnType
28
+ export interface ScriptCoverageWithOffset extends Profiler . ScriptCoverage {
29
+ startOffset : number
30
+ }
30
31
31
- // TODO: vite-node should export this
32
- const WRAPPER_LENGTH = 185
32
+ type TransformResults = Map < string , FetchResult >
33
+ interface RawCoverage { result : ScriptCoverageWithOffset [ ] }
33
34
34
35
// Note that this needs to match the line ending as well
35
36
const VITE_EXPORTS_LINE_PATTERN
@@ -69,6 +70,14 @@ export class V8CoverageProvider extends BaseCoverageProvider<ResolvedCoverageOpt
69
70
await this . readCoverageFiles < RawCoverage > ( {
70
71
onFileRead ( coverage ) {
71
72
merged = mergeProcessCovs ( [ merged , coverage ] )
73
+
74
+ // mergeProcessCovs sometimes loses startOffset, e.g. in vue
75
+ merged . result . forEach ( ( result ) => {
76
+ if ( ! result . startOffset ) {
77
+ const original = coverage . result . find ( r => r . url === result . url )
78
+ result . startOffset = original ?. startOffset || 0
79
+ }
80
+ } )
72
81
} ,
73
82
onFinished : async ( project , transformMode ) => {
74
83
const converted = await this . convertCoverage (
@@ -230,15 +239,12 @@ export class V8CoverageProvider extends BaseCoverageProvider<ResolvedCoverageOpt
230
239
source : string
231
240
originalSource : string
232
241
sourceMap ?: { sourcemap : EncodedSourceMap }
233
- isExecuted : boolean
234
242
} > {
235
243
const filePath = normalize ( fileURLToPath ( url ) )
236
244
237
- let isExecuted = true
238
245
let transformResult : FetchResult | TransformResult | undefined = transformResults . get ( filePath )
239
246
240
247
if ( ! transformResult ) {
241
- isExecuted = false
242
248
transformResult = await onTransform ( removeStartsWith ( url , FILE_PROTOCOL ) ) . catch ( ( ) => undefined )
243
249
}
244
250
@@ -258,7 +264,6 @@ export class V8CoverageProvider extends BaseCoverageProvider<ResolvedCoverageOpt
258
264
// These can be uncovered files included by "all: true" or files that are loaded outside vite-node
259
265
if ( ! map ) {
260
266
return {
261
- isExecuted,
262
267
source : code || sourcesContent [ 0 ] ,
263
268
originalSource : sourcesContent [ 0 ] ,
264
269
}
@@ -273,7 +278,6 @@ export class V8CoverageProvider extends BaseCoverageProvider<ResolvedCoverageOpt
273
278
}
274
279
275
280
return {
276
- isExecuted,
277
281
originalSource : sourcesContent [ 0 ] ,
278
282
source : code || sourcesContent [ 0 ] ,
279
283
sourceMap : {
@@ -338,20 +342,17 @@ export class V8CoverageProvider extends BaseCoverageProvider<ResolvedCoverageOpt
338
342
}
339
343
340
344
await Promise . all (
341
- chunk . map ( async ( { url, functions } ) => {
345
+ chunk . map ( async ( { url, functions, startOffset } ) => {
342
346
const sources = await this . getSources (
343
347
url ,
344
348
transformResults ,
345
349
onTransform ,
346
350
functions ,
347
351
)
348
352
349
- // If file was executed by vite-node we'll need to add its wrapper
350
- const wrapperLength = sources . isExecuted ? WRAPPER_LENGTH : 0
351
-
352
353
const converter = v8ToIstanbul (
353
354
url ,
354
- wrapperLength ,
355
+ startOffset ,
355
356
sources ,
356
357
undefined ,
357
358
this . options . ignoreEmptyLines ,
0 commit comments