1- import { Event , EventHint , Exception , Severity , StackFrame } from '@sentry/types' ;
1+ import { Event , EventHint , Exception , Severity , StackFrame , StackParser } from '@sentry/types' ;
22import {
33 addExceptionMechanism ,
44 addExceptionTypeValue ,
5- createStackParser ,
65 extractExceptionKeysForMessage ,
76 isDOMError ,
87 isDOMException ,
@@ -14,22 +13,12 @@ import {
1413 resolvedSyncPromise ,
1514} from '@sentry/utils' ;
1615
17- import {
18- chromeStackParser ,
19- geckoStackParser ,
20- opera10StackParser ,
21- opera11StackParser ,
22- winjsStackParser ,
23- } from './stack-parsers' ;
24-
2516/**
2617 * This function creates an exception from an TraceKitStackTrace
27- * @param stacktrace TraceKitStackTrace that will be converted to an exception
28- * @hidden
2918 */
30- export function exceptionFromError ( ex : Error ) : Exception {
19+ export function exceptionFromError ( stackParser : StackParser , ex : Error ) : Exception {
3120 // Get the frames first since Opera can lose the stack if we touch anything else first
32- const frames = parseStackFrames ( ex ) ;
21+ const frames = parseStackFrames ( stackParser , ex ) ;
3322
3423 const exception : Exception = {
3524 type : ex && ex . name ,
@@ -51,6 +40,7 @@ export function exceptionFromError(ex: Error): Exception {
5140 * @hidden
5241 */
5342export function eventFromPlainObject (
43+ stackParser : StackParser ,
5444 exception : Record < string , unknown > ,
5545 syntheticException ?: Error ,
5646 isUnhandledRejection ?: boolean ,
@@ -72,7 +62,7 @@ export function eventFromPlainObject(
7262 } ;
7363
7464 if ( syntheticException ) {
75- const frames = parseStackFrames ( syntheticException ) ;
65+ const frames = parseStackFrames ( stackParser , syntheticException ) ;
7666 if ( frames . length ) {
7767 // event.exception.values[0] has been set above
7868 ( event . exception as { values : Exception [ ] } ) . values [ 0 ] . stacktrace = { frames } ;
@@ -85,16 +75,19 @@ export function eventFromPlainObject(
8575/**
8676 * @hidden
8777 */
88- export function eventFromError ( ex : Error ) : Event {
78+ export function eventFromError ( stackParser : StackParser , ex : Error ) : Event {
8979 return {
9080 exception : {
91- values : [ exceptionFromError ( ex ) ] ,
81+ values : [ exceptionFromError ( stackParser , ex ) ] ,
9282 } ,
9383 } ;
9484}
9585
9686/** Parses stack frames from an error */
97- export function parseStackFrames ( ex : Error & { framesToPop ?: number ; stacktrace ?: string } ) : StackFrame [ ] {
87+ export function parseStackFrames (
88+ stackParser : StackParser ,
89+ ex : Error & { framesToPop ?: number ; stacktrace ?: string } ,
90+ ) : StackFrame [ ] {
9891 // Access and store the stacktrace property before doing ANYTHING
9992 // else to it because Opera is not very good at providing it
10093 // reliably in other circumstances.
@@ -103,13 +96,7 @@ export function parseStackFrames(ex: Error & { framesToPop?: number; stacktrace?
10396 const popSize = getPopSize ( ex ) ;
10497
10598 try {
106- return createStackParser (
107- opera10StackParser ,
108- opera11StackParser ,
109- chromeStackParser ,
110- winjsStackParser ,
111- geckoStackParser ,
112- ) ( stacktrace , popSize ) ;
99+ return stackParser ( stacktrace , popSize ) ;
113100 } catch ( e ) {
114101 // no-empty
115102 }
@@ -155,12 +142,13 @@ function extractMessage(ex: Error & { message: { error?: Error } }): string {
155142 * @hidden
156143 */
157144export function eventFromException (
145+ stackParser : StackParser ,
158146 exception : unknown ,
159147 hint ?: EventHint ,
160148 attachStacktrace ?: boolean ,
161149) : PromiseLike < Event > {
162150 const syntheticException = ( hint && hint . syntheticException ) || undefined ;
163- const event = eventFromUnknownInput ( exception , syntheticException , attachStacktrace ) ;
151+ const event = eventFromUnknownInput ( stackParser , exception , syntheticException , attachStacktrace ) ;
164152 addExceptionMechanism ( event ) ; // defaults to { type: 'generic', handled: true }
165153 event . level = Severity . Error ;
166154 if ( hint && hint . event_id ) {
@@ -174,13 +162,14 @@ export function eventFromException(
174162 * @hidden
175163 */
176164export function eventFromMessage (
165+ stackParser : StackParser ,
177166 message : string ,
178167 level : Severity = Severity . Info ,
179168 hint ?: EventHint ,
180169 attachStacktrace ?: boolean ,
181170) : PromiseLike < Event > {
182171 const syntheticException = ( hint && hint . syntheticException ) || undefined ;
183- const event = eventFromString ( message , syntheticException , attachStacktrace ) ;
172+ const event = eventFromString ( stackParser , message , syntheticException , attachStacktrace ) ;
184173 event . level = level ;
185174 if ( hint && hint . event_id ) {
186175 event . event_id = hint . event_id ;
@@ -192,6 +181,7 @@ export function eventFromMessage(
192181 * @hidden
193182 */
194183export function eventFromUnknownInput (
184+ stackParser : StackParser ,
195185 exception : unknown ,
196186 syntheticException ?: Error ,
197187 attachStacktrace ?: boolean ,
@@ -202,7 +192,7 @@ export function eventFromUnknownInput(
202192 if ( isErrorEvent ( exception as ErrorEvent ) && ( exception as ErrorEvent ) . error ) {
203193 // If it is an ErrorEvent with `error` property, extract it to get actual Error
204194 const errorEvent = exception as ErrorEvent ;
205- return eventFromError ( errorEvent . error as Error ) ;
195+ return eventFromError ( stackParser , errorEvent . error as Error ) ;
206196 }
207197
208198 // If it is a `DOMError` (which is a legacy API, but still supported in some browsers) then we just extract the name
@@ -216,11 +206,11 @@ export function eventFromUnknownInput(
216206 const domException = exception as DOMException ;
217207
218208 if ( 'stack' in ( exception as Error ) ) {
219- event = eventFromError ( exception as Error ) ;
209+ event = eventFromError ( stackParser , exception as Error ) ;
220210 } else {
221211 const name = domException . name || ( isDOMError ( domException ) ? 'DOMError' : 'DOMException' ) ;
222212 const message = domException . message ? `${ name } : ${ domException . message } ` : name ;
223- event = eventFromString ( message , syntheticException , attachStacktrace ) ;
213+ event = eventFromString ( stackParser , message , syntheticException , attachStacktrace ) ;
224214 addExceptionTypeValue ( event , message ) ;
225215 }
226216 if ( 'code' in domException ) {
@@ -231,14 +221,14 @@ export function eventFromUnknownInput(
231221 }
232222 if ( isError ( exception ) ) {
233223 // we have a real Error object, do nothing
234- return eventFromError ( exception ) ;
224+ return eventFromError ( stackParser , exception ) ;
235225 }
236226 if ( isPlainObject ( exception ) || isEvent ( exception ) ) {
237227 // If it's a plain object or an instance of `Event` (the built-in JS kind, not this SDK's `Event` type), serialize
238228 // it manually. This will allow us to group events based on top-level keys which is much better than creating a new
239229 // group on any key/value change.
240230 const objectException = exception as Record < string , unknown > ;
241- event = eventFromPlainObject ( objectException , syntheticException , isUnhandledRejection ) ;
231+ event = eventFromPlainObject ( stackParser , objectException , syntheticException , isUnhandledRejection ) ;
242232 addExceptionMechanism ( event , {
243233 synthetic : true ,
244234 } ) ;
@@ -254,7 +244,7 @@ export function eventFromUnknownInput(
254244 // - a plain Object
255245 //
256246 // So bail out and capture it as a simple message:
257- event = eventFromString ( exception as string , syntheticException , attachStacktrace ) ;
247+ event = eventFromString ( stackParser , exception as string , syntheticException , attachStacktrace ) ;
258248 addExceptionTypeValue ( event , `${ exception } ` , undefined ) ;
259249 addExceptionMechanism ( event , {
260250 synthetic : true ,
@@ -266,13 +256,18 @@ export function eventFromUnknownInput(
266256/**
267257 * @hidden
268258 */
269- export function eventFromString ( input : string , syntheticException ?: Error , attachStacktrace ?: boolean ) : Event {
259+ export function eventFromString (
260+ stackParser : StackParser ,
261+ input : string ,
262+ syntheticException ?: Error ,
263+ attachStacktrace ?: boolean ,
264+ ) : Event {
270265 const event : Event = {
271266 message : input ,
272267 } ;
273268
274269 if ( attachStacktrace && syntheticException ) {
275- const frames = parseStackFrames ( syntheticException ) ;
270+ const frames = parseStackFrames ( stackParser , syntheticException ) ;
276271 if ( frames . length ) {
277272 event . exception = {
278273 values : [ { value : input , stacktrace : { frames } } ] ,
0 commit comments