@@ -79,7 +79,13 @@ function insertBeforeBundle(
79
79
parent . insertBefore ( div , first ) ;
80
80
}
81
81
82
- function frameDiv ( document : Document , functionName , url , internalUrl ) {
82
+ function frameDiv (
83
+ document : Document ,
84
+ functionName ,
85
+ url ,
86
+ internalUrl ,
87
+ onSourceClick : ?Function
88
+ ) {
83
89
const frame = document . createElement ( 'div' ) ;
84
90
const frameFunctionName = document . createElement ( 'div' ) ;
85
91
@@ -112,9 +118,69 @@ function frameDiv(document: Document, functionName, url, internalUrl) {
112
118
frameLink . appendChild ( frameAnchor ) ;
113
119
frame . appendChild ( frameLink ) ;
114
120
121
+ if ( typeof onSourceClick === 'function' ) {
122
+ let handler = onSourceClick ;
123
+ frameAnchor . style . cursor = 'pointer' ;
124
+ frameAnchor . addEventListener ( 'click' , function ( ) {
125
+ handler ( ) ;
126
+ } ) ;
127
+ }
128
+
115
129
return frame ;
116
130
}
117
131
132
+ function isBultinErrorName ( errorName : ?string ) {
133
+ switch ( errorName ) {
134
+ case 'EvalError' :
135
+ case 'InternalError' :
136
+ case 'RangeError' :
137
+ case 'ReferenceError' :
138
+ case 'SyntaxError' :
139
+ case 'TypeError' :
140
+ case 'URIError' :
141
+ return true ;
142
+ default :
143
+ return false ;
144
+ }
145
+ }
146
+
147
+ function getPrettyURL (
148
+ sourceFileName : ?string ,
149
+ sourceLineNumber : ?number ,
150
+ sourceColumnNumber : ?number ,
151
+ fileName : ?string ,
152
+ lineNumber : ?number ,
153
+ columnNumber : ?number ,
154
+ compiled : boolean
155
+ ) : string {
156
+ let prettyURL ;
157
+ if ( ! compiled && sourceFileName && typeof sourceLineNumber === 'number' ) {
158
+ // Remove everything up to the first /src/ or /node_modules/
159
+ const trimMatch = / ^ [ / | \\ ] .* ?[ / | \\ ] ( ( s r c | n o d e _ m o d u l e s ) [ / | \\ ] .* ) / . exec (
160
+ sourceFileName
161
+ ) ;
162
+ if ( trimMatch && trimMatch [ 1 ] ) {
163
+ prettyURL = trimMatch [ 1 ] ;
164
+ } else {
165
+ prettyURL = sourceFileName ;
166
+ }
167
+ prettyURL += ':' + sourceLineNumber ;
168
+ // Note: we intentionally skip 0's because they're produced by cheap Webpack maps
169
+ if ( sourceColumnNumber ) {
170
+ prettyURL += ':' + sourceColumnNumber ;
171
+ }
172
+ } else if ( fileName && typeof lineNumber === 'number' ) {
173
+ prettyURL = fileName + ':' + lineNumber ;
174
+ // Note: we intentionally skip 0's because they're produced by cheap Webpack maps
175
+ if ( columnNumber ) {
176
+ prettyURL += ':' + columnNumber ;
177
+ }
178
+ } else {
179
+ prettyURL = 'unknown' ;
180
+ }
181
+ return prettyURL ;
182
+ }
183
+
118
184
function createFrame (
119
185
document : Document ,
120
186
frameSetting : FrameSetting ,
@@ -124,7 +190,8 @@ function createFrame(
124
190
omits : OmitsObject ,
125
191
omitBundle : number ,
126
192
parentContainer : HTMLDivElement ,
127
- lastElement : boolean
193
+ lastElement : boolean ,
194
+ errorName : ?string
128
195
) {
129
196
const { compiled } = frameSetting ;
130
197
let { functionName, _originalFileName : sourceFileName } = frame ;
@@ -149,35 +216,33 @@ function createFrame(
149
216
functionName = '(anonymous function)' ;
150
217
}
151
218
152
- let url ;
153
- if ( ! compiled && sourceFileName && sourceLineNumber ) {
154
- // Remove everything up to the first /src/
155
- const trimMatch = / ^ [ / | \\ ] .* ?[ / | \\ ] ( s r c [ / | \\ ] .* ) / . exec ( sourceFileName ) ;
156
- if ( trimMatch && trimMatch [ 1 ] ) {
157
- sourceFileName = trimMatch [ 1 ] ;
158
- }
219
+ const prettyURL = getPrettyURL (
220
+ sourceFileName ,
221
+ sourceLineNumber ,
222
+ sourceColumnNumber ,
223
+ fileName ,
224
+ lineNumber ,
225
+ columnNumber ,
226
+ compiled
227
+ ) ;
159
228
160
- url = sourceFileName + ':' + sourceLineNumber ;
161
- if ( sourceColumnNumber ) {
162
- url += ':' + sourceColumnNumber ;
163
- }
164
- } else if ( fileName && lineNumber ) {
165
- url = fileName + ':' + lineNumber ;
166
- if ( columnNumber ) {
167
- url += ':' + columnNumber ;
168
- }
169
- } else {
170
- url = 'unknown' ;
229
+ let needsHidden = false ;
230
+ const isInternalUrl = isInternalFile ( sourceFileName , fileName ) ;
231
+ const isThrownIntentionally = ! isBultinErrorName ( errorName ) ;
232
+ const shouldCollapse = isInternalUrl &&
233
+ ( isThrownIntentionally || omits . hasReachedAppCode ) ;
234
+
235
+ if ( ! isInternalUrl ) {
236
+ omits . hasReachedAppCode = true ;
171
237
}
172
238
173
- let needsHidden = false ;
174
- const internalUrl = isInternalFile ( url , sourceFileName ) ;
175
- if ( internalUrl ) {
239
+ if ( shouldCollapse ) {
176
240
++ omits . value ;
177
241
needsHidden = true ;
178
242
}
243
+
179
244
let collapseElement = null ;
180
- if ( ! internalUrl || lastElement ) {
245
+ if ( ! shouldCollapse || lastElement ) {
181
246
if ( omits . value > 0 ) {
182
247
const capV = omits . value ;
183
248
const omittedFrames = getGroupToggle ( document , capV , omitBundle ) ;
@@ -190,7 +255,7 @@ function createFrame(
190
255
omittedFrames
191
256
) ;
192
257
} ) ;
193
- if ( lastElement && internalUrl ) {
258
+ if ( lastElement && shouldCollapse ) {
194
259
collapseElement = omittedFrames ;
195
260
} else {
196
261
parentContainer . appendChild ( omittedFrames ) ;
@@ -200,14 +265,32 @@ function createFrame(
200
265
omits . value = 0 ;
201
266
}
202
267
203
- const elem = frameDiv ( document , functionName , url , internalUrl ) ;
268
+ let onSourceClick = null ;
269
+ if ( sourceFileName ) {
270
+ onSourceClick = ( ) => {
271
+ fetch (
272
+ '/__open-stack-frame-in-editor?fileName=' +
273
+ window . encodeURIComponent ( sourceFileName ) +
274
+ '&lineNumber=' +
275
+ window . encodeURIComponent ( sourceLineNumber || 1 )
276
+ ) . then ( ( ) => { } , ( ) => { } ) ;
277
+ } ;
278
+ }
279
+
280
+ const elem = frameDiv (
281
+ document ,
282
+ functionName ,
283
+ prettyURL ,
284
+ shouldCollapse ,
285
+ onSourceClick
286
+ ) ;
204
287
if ( needsHidden ) {
205
288
applyStyles ( elem , hiddenStyle ) ;
206
289
elem . setAttribute ( 'name' , 'bundle-' + omitBundle ) ;
207
290
}
208
291
209
292
let hasSource = false ;
210
- if ( ! internalUrl ) {
293
+ if ( ! shouldCollapse ) {
211
294
if (
212
295
compiled && scriptLines && scriptLines . length !== 0 && lineNumber != null
213
296
) {
@@ -219,8 +302,7 @@ function createFrame(
219
302
columnNumber ,
220
303
contextSize ,
221
304
critical ,
222
- frame . _originalFileName ,
223
- frame . _originalLineNumber
305
+ onSourceClick
224
306
)
225
307
) ;
226
308
hasSource = true ;
@@ -238,8 +320,7 @@ function createFrame(
238
320
sourceColumnNumber ,
239
321
contextSize ,
240
322
critical ,
241
- frame . _originalFileName ,
242
- frame . _originalLineNumber
323
+ onSourceClick
243
324
)
244
325
) ;
245
326
hasSource = true ;
0 commit comments