Skip to content

Commit fefae77

Browse files
committed
Don't collapse unintentional top-level errors
1 parent ac7777d commit fefae77

File tree

4 files changed

+68
-32
lines changed

4 files changed

+68
-32
lines changed

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

Lines changed: 49 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,21 @@ function frameDiv(document: Document, functionName, url, internalUrl) {
115115
return frame;
116116
}
117117

118+
function isBultinErrorName(errorName: ?string) {
119+
switch (errorName) {
120+
case 'EvalError':
121+
case 'InternalError':
122+
case 'RangeError':
123+
case 'ReferenceError':
124+
case 'SyntaxError':
125+
case 'TypeError':
126+
case 'URIError':
127+
return true;
128+
default:
129+
return false;
130+
}
131+
}
132+
118133
function createFrame(
119134
document: Document,
120135
frameSetting: FrameSetting,
@@ -124,7 +139,8 @@ function createFrame(
124139
omits: OmitsObject,
125140
omitBundle: number,
126141
parentContainer: HTMLDivElement,
127-
lastElement: boolean
142+
lastElement: boolean,
143+
errorName: ?string
128144
) {
129145
const { compiled } = frameSetting;
130146
let { functionName, _originalFileName: sourceFileName } = frame;
@@ -149,35 +165,47 @@ function createFrame(
149165
functionName = '(anonymous function)';
150166
}
151167

152-
let url;
153-
if (!compiled && sourceFileName && sourceLineNumber) {
154-
// Remove everything up to the first /src/
155-
const trimMatch = /^[/|\\].*?[/|\\](src[/|\\].*)/.exec(sourceFileName);
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+
);
156174
if (trimMatch && trimMatch[1]) {
157-
sourceFileName = trimMatch[1];
175+
prettyURL = trimMatch[1];
176+
} else {
177+
prettyURL = sourceFileName;
158178
}
159-
160-
url = sourceFileName + ':' + sourceLineNumber;
161-
if (sourceColumnNumber) {
162-
url += ':' + sourceColumnNumber;
179+
prettyURL += ':' + sourceLineNumber;
180+
if (typeof sourceColumnNumber === 'number') {
181+
prettyURL += ':' + sourceColumnNumber;
163182
}
164-
} else if (fileName && lineNumber) {
165-
url = fileName + ':' + lineNumber;
166-
if (columnNumber) {
167-
url += ':' + columnNumber;
183+
} else if (fileName && typeof lineNumber === 'number') {
184+
prettyURL = fileName + ':' + lineNumber;
185+
if (typeof columnNumber === 'number') {
186+
prettyURL += ':' + columnNumber;
168187
}
169188
} else {
170-
url = 'unknown';
189+
prettyURL = 'unknown';
171190
}
172191

173192
let needsHidden = false;
174-
const internalUrl = isInternalFile(url, sourceFileName);
175-
if (internalUrl) {
193+
const isInternalUrl = isInternalFile(sourceFileName, fileName);
194+
const isThrownIntentionally = !isBultinErrorName(errorName);
195+
const shouldCollapse = isInternalUrl &&
196+
(isThrownIntentionally || omits.hasReachedAppCode);
197+
198+
if (!isInternalUrl) {
199+
omits.hasReachedAppCode = true;
200+
}
201+
202+
if (shouldCollapse) {
176203
++omits.value;
177204
needsHidden = true;
178205
}
206+
179207
let collapseElement = null;
180-
if (!internalUrl || lastElement) {
208+
if (!shouldCollapse || lastElement) {
181209
if (omits.value > 0) {
182210
const capV = omits.value;
183211
const omittedFrames = getGroupToggle(document, capV, omitBundle);
@@ -190,7 +218,7 @@ function createFrame(
190218
omittedFrames
191219
);
192220
});
193-
if (lastElement && internalUrl) {
221+
if (lastElement && shouldCollapse) {
194222
collapseElement = omittedFrames;
195223
} else {
196224
parentContainer.appendChild(omittedFrames);
@@ -200,14 +228,14 @@ function createFrame(
200228
omits.value = 0;
201229
}
202230

203-
const elem = frameDiv(document, functionName, url, internalUrl);
231+
const elem = frameDiv(document, functionName, prettyURL, shouldCollapse);
204232
if (needsHidden) {
205233
applyStyles(elem, hiddenStyle);
206234
elem.setAttribute('name', 'bundle-' + omitBundle);
207235
}
208236

209237
let hasSource = false;
210-
if (!internalUrl) {
238+
if (!shouldCollapse) {
211239
if (
212240
compiled && scriptLines && scriptLines.length !== 0 && lineNumber != null
213241
) {

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

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@ import { traceStyle, toggleStyle } from '../styles';
55
import { enableTabClick } from '../utils/dom/enableTabClick';
66
import { createFrame } from './frame';
77

8-
type OmitsObject = { value: number, bundle: number };
8+
type OmitsObject = {
9+
value: number,
10+
bundle: number,
11+
hasReachedAppCode: boolean,
12+
};
913
type FrameSetting = { compiled: boolean };
1014
export type { OmitsObject, FrameSetting };
1115

@@ -68,7 +72,8 @@ function createFrames(
6872
document: Document,
6973
resolvedFrames: StackFrame[],
7074
frameSettings: FrameSetting[],
71-
contextSize: number
75+
contextSize: number,
76+
errorName: ?string
7277
) {
7378
if (resolvedFrames.length !== frameSettings.length) {
7479
throw new Error(
@@ -80,7 +85,7 @@ function createFrames(
8085

8186
let index = 0;
8287
let critical = true;
83-
const omits: OmitsObject = { value: 0, bundle: 1 };
88+
const omits: OmitsObject = { value: 0, bundle: 1, hasReachedAppCode: false };
8489
resolvedFrames.forEach(function(frame) {
8590
const lIndex = index++;
8691
const elem = createFrameWrapper(
@@ -96,7 +101,8 @@ function createFrames(
96101
omits,
97102
omits.bundle,
98103
trace,
99-
index === resolvedFrames.length
104+
index === resolvedFrames.length,
105+
errorName
100106
),
101107
lIndex,
102108
frameSettings,

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ function createOverlay(
7373

7474
// Create trace
7575
container.appendChild(
76-
createFrames(document, frames, frameSettings, contextSize)
76+
createFrames(document, frames, frameSettings, contextSize, name)
7777
);
7878

7979
// Show message
Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
/* @flow */
2-
function isInternalFile(url: string, sourceFileName: string | null | void) {
3-
return url.indexOf('/~/') !== -1 ||
4-
url.indexOf('/node_modules/') !== -1 ||
5-
url.trim().indexOf(' ') !== -1 ||
6-
sourceFileName == null ||
7-
sourceFileName.length === 0;
2+
function isInternalFile(sourceFileName: ?string, fileName: ?string) {
3+
return sourceFileName == null ||
4+
sourceFileName === '' ||
5+
sourceFileName.indexOf('/~/') !== -1 ||
6+
sourceFileName.indexOf('/node_modules/') !== -1 ||
7+
sourceFileName.trim().indexOf(' ') !== -1 ||
8+
fileName == null ||
9+
fileName === '';
810
}
911

1012
export { isInternalFile };

0 commit comments

Comments
 (0)