Skip to content

Commit 77bc7b0

Browse files
committed
Linkify internal stack frames too
1 parent fefae77 commit 77bc7b0

File tree

2 files changed

+86
-38
lines changed

2 files changed

+86
-38
lines changed

packages/react-error-overlay/src/components/code.js

+4-9
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,7 @@ function createCode(
2020
columnNum: number | null,
2121
contextSize: number,
2222
main: boolean,
23-
clickToOpenFileName: ?string,
24-
clickToOpenLineNumber: ?number
23+
onSourceClick: ?Function
2524
) {
2625
const sourceCode = [];
2726
let whiteSpace = Infinity;
@@ -86,15 +85,11 @@ function createCode(
8685
applyStyles(pre, preStyle);
8786
pre.appendChild(code);
8887

89-
if (clickToOpenFileName) {
88+
if (typeof onSourceClick === 'function') {
89+
let handler = onSourceClick;
9090
pre.style.cursor = 'pointer';
9191
pre.addEventListener('click', function() {
92-
fetch(
93-
'/__open-stack-frame-in-editor?fileName=' +
94-
window.encodeURIComponent(clickToOpenFileName) +
95-
'&lineNumber=' +
96-
window.encodeURIComponent(clickToOpenLineNumber || 1)
97-
).then(() => {}, () => {});
92+
handler();
9893
});
9994
}
10095

packages/react-error-overlay/src/components/frame.js

+82-29
Original file line numberDiff line numberDiff line change
@@ -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,6 +118,14 @@ 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

@@ -130,6 +144,43 @@ function isBultinErrorName(errorName: ?string) {
130144
}
131145
}
132146

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 = /^[/|\\].*?[/|\\]((src|node_modules)[/|\\].*)/.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+
133184
function createFrame(
134185
document: Document,
135186
frameSetting: FrameSetting,
@@ -165,29 +216,15 @@ function createFrame(
165216
functionName = '(anonymous function)';
166217
}
167218

168-
let prettyURL;
169-
if (!compiled && sourceFileName && typeof sourceLineNumber === 'number') {
170-
// Remove everything up to the first /src/ or /node_modules/
171-
const trimMatch = /^[/|\\].*?[/|\\]((src|node_modules)[/|\\].*)/.exec(
172-
sourceFileName
173-
);
174-
if (trimMatch && trimMatch[1]) {
175-
prettyURL = trimMatch[1];
176-
} else {
177-
prettyURL = sourceFileName;
178-
}
179-
prettyURL += ':' + sourceLineNumber;
180-
if (typeof sourceColumnNumber === 'number') {
181-
prettyURL += ':' + sourceColumnNumber;
182-
}
183-
} else if (fileName && typeof lineNumber === 'number') {
184-
prettyURL = fileName + ':' + lineNumber;
185-
if (typeof columnNumber === 'number') {
186-
prettyURL += ':' + columnNumber;
187-
}
188-
} else {
189-
prettyURL = 'unknown';
190-
}
219+
const prettyURL = getPrettyURL(
220+
sourceFileName,
221+
sourceLineNumber,
222+
sourceColumnNumber,
223+
fileName,
224+
lineNumber,
225+
columnNumber,
226+
compiled
227+
);
191228

192229
let needsHidden = false;
193230
const isInternalUrl = isInternalFile(sourceFileName, fileName);
@@ -228,7 +265,25 @@ function createFrame(
228265
omits.value = 0;
229266
}
230267

231-
const elem = frameDiv(document, functionName, prettyURL, shouldCollapse);
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+
);
232287
if (needsHidden) {
233288
applyStyles(elem, hiddenStyle);
234289
elem.setAttribute('name', 'bundle-' + omitBundle);
@@ -247,8 +302,7 @@ function createFrame(
247302
columnNumber,
248303
contextSize,
249304
critical,
250-
frame._originalFileName,
251-
frame._originalLineNumber
305+
onSourceClick
252306
)
253307
);
254308
hasSource = true;
@@ -266,8 +320,7 @@ function createFrame(
266320
sourceColumnNumber,
267321
contextSize,
268322
critical,
269-
frame._originalFileName,
270-
frame._originalLineNumber
323+
onSourceClick
271324
)
272325
);
273326
hasSource = true;

0 commit comments

Comments
 (0)