@@ -17,7 +17,9 @@ import type { TestRunEndReason } from './types/reporter'
1717import assert from 'node:assert'
1818import { createHash } from 'node:crypto'
1919import { copyFile , mkdir } from 'node:fs/promises'
20+ import { isPrimitive } from '@vitest/utils'
2021import { serializeError } from '@vitest/utils/error'
22+ import { parseErrorStacktrace } from '@vitest/utils/source-map'
2123import mime from 'mime/lite'
2224import { basename , dirname , extname , resolve } from 'pathe'
2325
@@ -68,6 +70,7 @@ export class TestRun {
6870 }
6971
7072 async updated ( update : TaskResultPack [ ] , events : TaskEventPack [ ] ) : Promise < void > {
73+ this . syncUpdateStacks ( update )
7174 this . vitest . state . updateTasks ( update )
7275
7376 for ( const [ id , event , data ] of events ) {
@@ -113,6 +116,27 @@ export class TestRun {
113116 return modules . some ( m => ! m . ok ( ) )
114117 }
115118
119+ private syncUpdateStacks ( update : TaskResultPack [ ] ) : void {
120+ update . forEach ( ( [ taskId , result ] ) => {
121+ const task = this . vitest . state . idMap . get ( taskId )
122+ const isBrowser = task && task . file . pool === 'browser'
123+
124+ result ?. errors ?. forEach ( ( error ) => {
125+ if ( isPrimitive ( error ) ) {
126+ return
127+ }
128+
129+ const project = this . vitest . getProjectByName ( task ! . file . projectName || '' )
130+ if ( isBrowser ) {
131+ error . stacks = project . browser ?. parseErrorStacktrace ( error , { frameFilter : project . config . onStackTrace } ) || [ ]
132+ }
133+ else {
134+ error . stacks = parseErrorStacktrace ( error , { frameFilter : project . config . onStackTrace } )
135+ }
136+ } )
137+ } )
138+ }
139+
116140 private async reportEvent ( id : string , event : TaskUpdateEvent , data : TaskEventData | undefined ) {
117141 const task = this . vitest . state . idMap . get ( id )
118142 const entity = task && this . vitest . state . getReportedEntity ( task )
0 commit comments