@@ -85,84 +85,47 @@ export class Breadcrumbs implements Integration {
85
85
public setupOnce ( ) : void {
86
86
if ( this . _options . console ) {
87
87
addInstrumentationHandler ( {
88
- callback : ( ...args ) => {
89
- this . _consoleBreadcrumb ( ...args ) ;
90
- } ,
88
+ callback : _consoleBreadcrumb ,
91
89
type : 'console' ,
92
90
} ) ;
93
91
}
94
92
if ( this . _options . dom ) {
95
93
addInstrumentationHandler ( {
96
- callback : ( ...args ) => {
97
- this . _domBreadcrumb ( ...args ) ;
98
- } ,
94
+ callback : _domBreadcrumb ( this . _options . dom ) ,
99
95
type : 'dom' ,
100
96
} ) ;
101
97
}
102
98
if ( this . _options . xhr ) {
103
99
addInstrumentationHandler ( {
104
- callback : ( ...args ) => {
105
- this . _xhrBreadcrumb ( ...args ) ;
106
- } ,
100
+ callback : _xhrBreadcrumb ,
107
101
type : 'xhr' ,
108
102
} ) ;
109
103
}
110
104
if ( this . _options . fetch ) {
111
105
addInstrumentationHandler ( {
112
- callback : ( ...args ) => {
113
- this . _fetchBreadcrumb ( ...args ) ;
114
- } ,
106
+ callback : _fetchBreadcrumb ,
115
107
type : 'fetch' ,
116
108
} ) ;
117
109
}
118
110
if ( this . _options . history ) {
119
111
addInstrumentationHandler ( {
120
- callback : ( ...args ) => {
121
- this . _historyBreadcrumb ( ...args ) ;
122
- } ,
112
+ callback : _historyBreadcrumb ,
123
113
type : 'history' ,
124
114
} ) ;
125
115
}
126
116
}
117
+ }
127
118
128
- /**
129
- * Creates breadcrumbs from console API calls
130
- */
131
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
132
- private _consoleBreadcrumb ( handlerData : { [ key : string ] : any } ) : void {
133
- const breadcrumb = {
134
- category : 'console' ,
135
- data : {
136
- arguments : handlerData . args ,
137
- logger : 'console' ,
138
- } ,
139
- level : Severity . fromString ( handlerData . level ) ,
140
- message : safeJoin ( handlerData . args , ' ' ) ,
141
- } ;
142
-
143
- if ( handlerData . level === 'assert' ) {
144
- if ( handlerData . args [ 0 ] === false ) {
145
- breadcrumb . message = `Assertion failed: ${ safeJoin ( handlerData . args . slice ( 1 ) , ' ' ) || 'console.assert' } ` ;
146
- breadcrumb . data . arguments = handlerData . args . slice ( 1 ) ;
147
- } else {
148
- // Don't capture a breadcrumb for passed assertions
149
- return ;
150
- }
151
- }
152
-
153
- getCurrentHub ( ) . addBreadcrumb ( breadcrumb , {
154
- input : handlerData . args ,
155
- level : handlerData . level ,
156
- } ) ;
157
- }
158
-
159
- /**
160
- * Creates breadcrumbs from DOM API calls
161
- */
119
+ /**
120
+ * A HOC that creaes a function that creates breadcrumbs from DOM API calls.
121
+ * This is a HOC so that we get access to dom options in the closure.
122
+ */
123
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
124
+ function _domBreadcrumb ( dom : BreadcrumbsOptions [ 'dom' ] ) : ( handlerData : { [ key : string ] : any } ) => void {
162
125
// eslint-disable-next-line @typescript-eslint/no-explicit-any
163
- private _domBreadcrumb ( handlerData : { [ key : string ] : any } ) : void {
126
+ function _innerDomBreadcrumb ( handlerData : { [ key : string ] : any } ) : void {
164
127
let target ;
165
- let keyAttrs = typeof this . _options . dom === 'object' ? this . _options . dom . serializeAttribute : undefined ;
128
+ let keyAttrs = typeof dom === 'object' ? dom . serializeAttribute : undefined ;
166
129
167
130
if ( typeof keyAttrs === 'string' ) {
168
131
keyAttrs = [ keyAttrs ] ;
@@ -194,117 +157,150 @@ export class Breadcrumbs implements Integration {
194
157
) ;
195
158
}
196
159
197
- /**
198
- * Creates breadcrumbs from XHR API calls
199
- */
200
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
201
- private _xhrBreadcrumb ( handlerData : { [ key : string ] : any } ) : void {
202
- if ( handlerData . endTimestamp ) {
203
- // We only capture complete, non-sentry requests
204
- if ( handlerData . xhr . __sentry_own_request__ ) {
205
- return ;
206
- }
207
-
208
- const { method, url, status_code, body } = handlerData . xhr . __sentry_xhr__ || { } ;
160
+ return _innerDomBreadcrumb ;
161
+ }
209
162
210
- getCurrentHub ( ) . addBreadcrumb (
211
- {
212
- category : 'xhr' ,
213
- data : {
214
- method,
215
- url,
216
- status_code,
217
- } ,
218
- type : 'http' ,
219
- } ,
220
- {
221
- xhr : handlerData . xhr ,
222
- input : body ,
223
- } ,
224
- ) ;
163
+ /**
164
+ * Creates breadcrumbs from console API calls
165
+ */
166
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
167
+ function _consoleBreadcrumb ( handlerData : { [ key : string ] : any } ) : void {
168
+ const breadcrumb = {
169
+ category : 'console' ,
170
+ data : {
171
+ arguments : handlerData . args ,
172
+ logger : 'console' ,
173
+ } ,
174
+ level : Severity . fromString ( handlerData . level ) ,
175
+ message : safeJoin ( handlerData . args , ' ' ) ,
176
+ } ;
225
177
178
+ if ( handlerData . level === 'assert' ) {
179
+ if ( handlerData . args [ 0 ] === false ) {
180
+ breadcrumb . message = `Assertion failed: ${ safeJoin ( handlerData . args . slice ( 1 ) , ' ' ) || 'console.assert' } ` ;
181
+ breadcrumb . data . arguments = handlerData . args . slice ( 1 ) ;
182
+ } else {
183
+ // Don't capture a breadcrumb for passed assertions
226
184
return ;
227
185
}
228
186
}
229
187
230
- /**
231
- * Creates breadcrumbs from fetch API calls
232
- */
233
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
234
- private _fetchBreadcrumb ( handlerData : { [ key : string ] : any } ) : void {
235
- // We only capture complete fetch requests
236
- if ( ! handlerData . endTimestamp ) {
237
- return ;
238
- }
188
+ getCurrentHub ( ) . addBreadcrumb ( breadcrumb , {
189
+ input : handlerData . args ,
190
+ level : handlerData . level ,
191
+ } ) ;
192
+ }
239
193
240
- if ( handlerData . fetchData . url . match ( / s e n t r y _ k e y / ) && handlerData . fetchData . method === 'POST' ) {
241
- // We will not create breadcrumbs for fetch requests that contain `sentry_key` (internal sentry requests)
194
+ /**
195
+ * Creates breadcrumbs from XHR API calls
196
+ */
197
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
198
+ function _xhrBreadcrumb ( handlerData : { [ key : string ] : any } ) : void {
199
+ if ( handlerData . endTimestamp ) {
200
+ // We only capture complete, non-sentry requests
201
+ if ( handlerData . xhr . __sentry_own_request__ ) {
242
202
return ;
243
203
}
244
204
245
- if ( handlerData . error ) {
246
- getCurrentHub ( ) . addBreadcrumb (
247
- {
248
- category : 'fetch' ,
249
- data : handlerData . fetchData ,
250
- level : Severity . Error ,
251
- type : 'http' ,
252
- } ,
253
- {
254
- data : handlerData . error ,
255
- input : handlerData . args ,
256
- } ,
257
- ) ;
258
- } else {
259
- getCurrentHub ( ) . addBreadcrumb (
260
- {
261
- category : 'fetch' ,
262
- data : {
263
- ...handlerData . fetchData ,
264
- status_code : handlerData . response . status ,
265
- } ,
266
- type : 'http' ,
267
- } ,
268
- {
269
- input : handlerData . args ,
270
- response : handlerData . response ,
205
+ const { method, url, status_code, body } = handlerData . xhr . __sentry_xhr__ || { } ;
206
+
207
+ getCurrentHub ( ) . addBreadcrumb (
208
+ {
209
+ category : 'xhr' ,
210
+ data : {
211
+ method,
212
+ url,
213
+ status_code,
271
214
} ,
272
- ) ;
273
- }
274
- }
215
+ type : 'http' ,
216
+ } ,
217
+ {
218
+ xhr : handlerData . xhr ,
219
+ input : body ,
220
+ } ,
221
+ ) ;
275
222
276
- /**
277
- * Creates breadcrumbs from history API calls
278
- */
279
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
280
- private _historyBreadcrumb ( handlerData : { [ key : string ] : any } ) : void {
281
- const global = getGlobalObject < Window > ( ) ;
282
- let from = handlerData . from ;
283
- let to = handlerData . to ;
284
- const parsedLoc = parseUrl ( global . location . href ) ;
285
- let parsedFrom = parseUrl ( from ) ;
286
- const parsedTo = parseUrl ( to ) ;
223
+ return ;
224
+ }
225
+ }
287
226
288
- // Initial pushState doesn't provide `from` information
289
- if ( ! parsedFrom . path ) {
290
- parsedFrom = parsedLoc ;
291
- }
227
+ /**
228
+ * Creates breadcrumbs from fetch API calls
229
+ */
230
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
231
+ function _fetchBreadcrumb ( handlerData : { [ key : string ] : any } ) : void {
232
+ // We only capture complete fetch requests
233
+ if ( ! handlerData . endTimestamp ) {
234
+ return ;
235
+ }
292
236
293
- // Use only the path component of the URL if the URL matches the current
294
- // document (almost all the time when using pushState)
295
- if ( parsedLoc . protocol === parsedTo . protocol && parsedLoc . host === parsedTo . host ) {
296
- to = parsedTo . relative ;
297
- }
298
- if ( parsedLoc . protocol === parsedFrom . protocol && parsedLoc . host === parsedFrom . host ) {
299
- from = parsedFrom . relative ;
300
- }
237
+ if ( handlerData . fetchData . url . match ( / s e n t r y _ k e y / ) && handlerData . fetchData . method === 'POST' ) {
238
+ // We will not create breadcrumbs for fetch requests that contain `sentry_key` (internal sentry requests)
239
+ return ;
240
+ }
301
241
302
- getCurrentHub ( ) . addBreadcrumb ( {
303
- category : 'navigation' ,
304
- data : {
305
- from,
306
- to,
242
+ if ( handlerData . error ) {
243
+ getCurrentHub ( ) . addBreadcrumb (
244
+ {
245
+ category : 'fetch' ,
246
+ data : handlerData . fetchData ,
247
+ level : Severity . Error ,
248
+ type : 'http' ,
249
+ } ,
250
+ {
251
+ data : handlerData . error ,
252
+ input : handlerData . args ,
307
253
} ,
308
- } ) ;
254
+ ) ;
255
+ } else {
256
+ getCurrentHub ( ) . addBreadcrumb (
257
+ {
258
+ category : 'fetch' ,
259
+ data : {
260
+ ...handlerData . fetchData ,
261
+ status_code : handlerData . response . status ,
262
+ } ,
263
+ type : 'http' ,
264
+ } ,
265
+ {
266
+ input : handlerData . args ,
267
+ response : handlerData . response ,
268
+ } ,
269
+ ) ;
309
270
}
310
271
}
272
+
273
+ /**
274
+ * Creates breadcrumbs from history API calls
275
+ */
276
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
277
+ function _historyBreadcrumb ( handlerData : { [ key : string ] : any } ) : void {
278
+ const global = getGlobalObject < Window > ( ) ;
279
+ let from = handlerData . from ;
280
+ let to = handlerData . to ;
281
+ const parsedLoc = parseUrl ( global . location . href ) ;
282
+ let parsedFrom = parseUrl ( from ) ;
283
+ const parsedTo = parseUrl ( to ) ;
284
+
285
+ // Initial pushState doesn't provide `from` information
286
+ if ( ! parsedFrom . path ) {
287
+ parsedFrom = parsedLoc ;
288
+ }
289
+
290
+ // Use only the path component of the URL if the URL matches the current
291
+ // document (almost all the time when using pushState)
292
+ if ( parsedLoc . protocol === parsedTo . protocol && parsedLoc . host === parsedTo . host ) {
293
+ to = parsedTo . relative ;
294
+ }
295
+ if ( parsedLoc . protocol === parsedFrom . protocol && parsedLoc . host === parsedFrom . host ) {
296
+ from = parsedFrom . relative ;
297
+ }
298
+
299
+ getCurrentHub ( ) . addBreadcrumb ( {
300
+ category : 'navigation' ,
301
+ data : {
302
+ from,
303
+ to,
304
+ } ,
305
+ } ) ;
306
+ }
0 commit comments