@@ -16,7 +16,7 @@ export type { SourceMapInput } from '@jridgewell/trace-mapping'
16
16
export interface StackTraceParserOptions {
17
17
ignoreStackEntries ?: ( RegExp | string ) [ ]
18
18
getSourceMap ?: ( file : string ) => unknown
19
- getFileName ?: ( id : string ) => string
19
+ getUrlId ?: ( id : string ) => string
20
20
frameFilter ?: ( error : ErrorWithDiff , frame : ParsedStack ) => boolean | void
21
21
}
22
22
@@ -62,7 +62,9 @@ function extractLocation(urlLike: string) {
62
62
}
63
63
if ( url . startsWith ( 'http:' ) || url . startsWith ( 'https:' ) ) {
64
64
const urlObj = new URL ( url )
65
- url = urlObj . pathname
65
+ urlObj . searchParams . delete ( 'import' )
66
+ urlObj . searchParams . delete ( 'browserv' )
67
+ url = urlObj . pathname + urlObj . hash + urlObj . search
66
68
}
67
69
if ( url . startsWith ( '/@fs/' ) ) {
68
70
const isWindows = / ^ \/ @ f s \/ [ a - z A - Z ] : \/ / . test ( url )
@@ -198,33 +200,55 @@ export function parseStacktrace(
198
200
options : StackTraceParserOptions = { } ,
199
201
) : ParsedStack [ ] {
200
202
const { ignoreStackEntries = stackIgnorePatterns } = options
201
- let stacks = ! CHROME_IE_STACK_REGEXP . test ( stack )
203
+ const stacks = ! CHROME_IE_STACK_REGEXP . test ( stack )
202
204
? parseFFOrSafariStackTrace ( stack )
203
205
: parseV8Stacktrace ( stack )
204
- if ( ignoreStackEntries . length ) {
205
- stacks = stacks . filter (
206
- stack => ! ignoreStackEntries . some ( p => stack . file . match ( p ) ) ,
207
- )
208
- }
206
+
209
207
return stacks . map ( ( stack ) => {
210
- if ( options . getFileName ) {
211
- stack . file = options . getFileName ( stack . file )
208
+ if ( options . getUrlId ) {
209
+ stack . file = options . getUrlId ( stack . file )
212
210
}
213
211
214
212
const map = options . getSourceMap ?.( stack . file ) as
215
213
| SourceMapInput
216
214
| null
217
215
| undefined
218
216
if ( ! map || typeof map !== 'object' || ! map . version ) {
219
- return stack
217
+ return shouldFilter ( ignoreStackEntries , stack . file ) ? null : stack
220
218
}
219
+
221
220
const traceMap = new TraceMap ( map )
222
- const { line, column } = originalPositionFor ( traceMap , stack )
221
+ const { line, column, source, name } = originalPositionFor ( traceMap , stack )
222
+
223
+ let file : string = stack . file
224
+ if ( source ) {
225
+ const fileUrl = stack . file . startsWith ( 'file://' )
226
+ ? stack . file
227
+ : `file://${ stack . file } `
228
+ const sourceRootUrl = map . sourceRoot
229
+ ? new URL ( map . sourceRoot , fileUrl )
230
+ : fileUrl
231
+ file = new URL ( source , sourceRootUrl ) . pathname
232
+ }
233
+
234
+ if ( shouldFilter ( ignoreStackEntries , file ) ) {
235
+ return null
236
+ }
237
+
223
238
if ( line != null && column != null ) {
224
- return { ...stack , line, column }
239
+ return {
240
+ line,
241
+ column,
242
+ file,
243
+ method : name || stack . method ,
244
+ }
225
245
}
226
246
return stack
227
- } )
247
+ } ) . filter ( s => s != null )
248
+ }
249
+
250
+ function shouldFilter ( ignoreStackEntries : ( string | RegExp ) [ ] , file : string ) : boolean {
251
+ return ignoreStackEntries . some ( p => file . match ( p ) )
228
252
}
229
253
230
254
function parseFFOrSafariStackTrace ( stack : string ) : ParsedStack [ ] {
0 commit comments