@@ -16,7 +16,7 @@ export type { SourceMapInput } from '@jridgewell/trace-mapping'
1616export interface StackTraceParserOptions {
1717 ignoreStackEntries ?: ( RegExp | string ) [ ]
1818 getSourceMap ?: ( file : string ) => unknown
19- getFileName ?: ( id : string ) => string
19+ getUrlId ?: ( id : string ) => string
2020 frameFilter ?: ( error : ErrorWithDiff , frame : ParsedStack ) => boolean | void
2121}
2222
@@ -62,7 +62,9 @@ function extractLocation(urlLike: string) {
6262 }
6363 if ( url . startsWith ( 'http:' ) || url . startsWith ( 'https:' ) ) {
6464 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
6668 }
6769 if ( url . startsWith ( '/@fs/' ) ) {
6870 const isWindows = / ^ \/ @ f s \/ [ a - z A - Z ] : \/ / . test ( url )
@@ -198,33 +200,55 @@ export function parseStacktrace(
198200 options : StackTraceParserOptions = { } ,
199201) : ParsedStack [ ] {
200202 const { ignoreStackEntries = stackIgnorePatterns } = options
201- let stacks = ! CHROME_IE_STACK_REGEXP . test ( stack )
203+ const stacks = ! CHROME_IE_STACK_REGEXP . test ( stack )
202204 ? parseFFOrSafariStackTrace ( stack )
203205 : parseV8Stacktrace ( stack )
204- if ( ignoreStackEntries . length ) {
205- stacks = stacks . filter (
206- stack => ! ignoreStackEntries . some ( p => stack . file . match ( p ) ) ,
207- )
208- }
206+
209207 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 )
212210 }
213211
214212 const map = options . getSourceMap ?.( stack . file ) as
215213 | SourceMapInput
216214 | null
217215 | undefined
218216 if ( ! map || typeof map !== 'object' || ! map . version ) {
219- return stack
217+ return shouldFilter ( ignoreStackEntries , stack . file ) ? null : stack
220218 }
219+
221220 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+
223238 if ( line != null && column != null ) {
224- return { ...stack , line, column }
239+ return {
240+ line,
241+ column,
242+ file,
243+ method : name || stack . method ,
244+ }
225245 }
226246 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 ) )
228252}
229253
230254function parseFFOrSafariStackTrace ( stack : string ) : ParsedStack [ ] {
0 commit comments