@@ -79,7 +79,13 @@ function insertBeforeBundle(
7979 parent . insertBefore ( div , first ) ;
8080}
8181
82- function frameDiv ( document : Document , functionName , url , internalUrl ) {
82+ function frameDiv (
83+ document : Document ,
84+ functionName ,
85+ url ,
86+ internalUrl ,
87+ onSourceClick : ?Function
88+ ) {
8389 const frame = document . createElement ( 'div' ) ;
8490 const frameFunctionName = document . createElement ( 'div' ) ;
8591
@@ -112,9 +118,69 @@ function frameDiv(document: Document, functionName, url, internalUrl) {
112118 frameLink . appendChild ( frameAnchor ) ;
113119 frame . appendChild ( frameLink ) ;
114120
121+ if ( typeof onSourceClick === 'function' ) {
122+ let handler = onSourceClick ;
123+ frameAnchor . style . cursor = 'pointer' ;
124+ frameAnchor . addEventListener ( 'click' , function ( ) {
125+ handler ( ) ;
126+ } ) ;
127+ }
128+
115129 return frame ;
116130}
117131
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+
118184function createFrame (
119185 document : Document ,
120186 frameSetting : FrameSetting ,
@@ -124,7 +190,8 @@ function createFrame(
124190 omits : OmitsObject ,
125191 omitBundle : number ,
126192 parentContainer : HTMLDivElement ,
127- lastElement : boolean
193+ lastElement : boolean ,
194+ errorName : ?string
128195) {
129196 const { compiled } = frameSetting ;
130197 let { functionName, _originalFileName : sourceFileName } = frame ;
@@ -149,35 +216,33 @@ function createFrame(
149216 functionName = '(anonymous function)' ;
150217 }
151218
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+ ) ;
159228
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 ;
171237 }
172238
173- let needsHidden = false ;
174- const internalUrl = isInternalFile ( url , sourceFileName ) ;
175- if ( internalUrl ) {
239+ if ( shouldCollapse ) {
176240 ++ omits . value ;
177241 needsHidden = true ;
178242 }
243+
179244 let collapseElement = null ;
180- if ( ! internalUrl || lastElement ) {
245+ if ( ! shouldCollapse || lastElement ) {
181246 if ( omits . value > 0 ) {
182247 const capV = omits . value ;
183248 const omittedFrames = getGroupToggle ( document , capV , omitBundle ) ;
@@ -190,7 +255,7 @@ function createFrame(
190255 omittedFrames
191256 ) ;
192257 } ) ;
193- if ( lastElement && internalUrl ) {
258+ if ( lastElement && shouldCollapse ) {
194259 collapseElement = omittedFrames ;
195260 } else {
196261 parentContainer . appendChild ( omittedFrames ) ;
@@ -200,14 +265,32 @@ function createFrame(
200265 omits . value = 0 ;
201266 }
202267
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+ ) ;
204287 if ( needsHidden ) {
205288 applyStyles ( elem , hiddenStyle ) ;
206289 elem . setAttribute ( 'name' , 'bundle-' + omitBundle ) ;
207290 }
208291
209292 let hasSource = false ;
210- if ( ! internalUrl ) {
293+ if ( ! shouldCollapse ) {
211294 if (
212295 compiled && scriptLines && scriptLines . length !== 0 && lineNumber != null
213296 ) {
@@ -219,8 +302,7 @@ function createFrame(
219302 columnNumber ,
220303 contextSize ,
221304 critical ,
222- frame . _originalFileName ,
223- frame . _originalLineNumber
305+ onSourceClick
224306 )
225307 ) ;
226308 hasSource = true ;
@@ -238,8 +320,7 @@ function createFrame(
238320 sourceColumnNumber ,
239321 contextSize ,
240322 critical ,
241- frame . _originalFileName ,
242- frame . _originalLineNumber
323+ onSourceClick
243324 )
244325 ) ;
245326 hasSource = true ;
0 commit comments