Skip to content

Commit 2b39275

Browse files
committed
Add red box prototype
1 parent dc6edce commit 2b39275

File tree

3 files changed

+82
-1
lines changed

3 files changed

+82
-1
lines changed

packages/react-dev-utils/failFast.js

+77
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
(function() {
2+
const ErrorStackParser = require('error-stack-parser')
3+
4+
const overlayStyle = {
5+
position: 'fixed',
6+
'box-sizing': 'border-box',
7+
top: '0px', left: '0px',
8+
bottom: '0px', right: '0px',
9+
width: '100vw', height: '100vh',
10+
'background-color': 'rgb(200, 0, 0)',
11+
padding: '2rem',
12+
'z-index': 1337,
13+
'font-family': 'Menlo, Consolas, monospace',
14+
color: 'rgb(232, 232, 232)',
15+
'white-space': 'pre-wrap'
16+
}
17+
18+
const headerStyle = {
19+
'font-size': 'larger',
20+
'font-weight': 'bold'
21+
}
22+
23+
const traceStyle = {
24+
'font-size': '1rem'
25+
}
26+
27+
function applyStyles(element, styles) {
28+
element.setAttribute('style', '')
29+
for (const key in styles) {
30+
if (!styles.hasOwnProperty(key)) continue
31+
element.style[key] = styles[key].toString()
32+
}
33+
}
34+
35+
function render(name, message, frames) {
36+
// Create container
37+
const overlay = document.createElement('div')
38+
applyStyles(overlay, overlayStyle)
39+
40+
// Create header
41+
const header = document.createElement('div')
42+
applyStyles(header, headerStyle)
43+
header.appendChild(document.createTextNode(`${name}: ${message}`))
44+
overlay.appendChild(header)
45+
46+
// Show trace
47+
const trace = document.createElement('div')
48+
applyStyles(trace, traceStyle)
49+
for (const frame of frames) {
50+
const { source } = frame
51+
const elem = document.createElement('div')
52+
elem.appendChild(document.createTextNode(source))
53+
trace.appendChild(elem)
54+
}
55+
overlay.appendChild(trace)
56+
57+
// Mount
58+
document.body.appendChild(overlay)
59+
}
60+
61+
function crash(error) {
62+
let frames = []
63+
try {
64+
frames = ErrorStackParser.parse(error)
65+
} catch (e) {
66+
}
67+
render(error.name, error.message, frames)
68+
}
69+
70+
window.onerror = function(messageOrEvent, source, lineno, colno, error) {
71+
if (error == null || !(error instanceof Error) || messageOrEvent.indexOf('Script error') !== -1) {
72+
crash(new Error('Unknown script error.'))// TODO: more helpful message
73+
} else {
74+
crash(error)
75+
}
76+
}
77+
})()

packages/react-dev-utils/package.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@
1111
"node": ">=4"
1212
},
1313
"files": [
14-
"clearConsole.js",
1514
"checkRequiredFiles.js",
15+
"clearConsole.js",
16+
"failFast.js",
1617
"formatWebpackMessages.js",
1718
"getProcessForPort.js",
1819
"InterpolateHtmlPlugin.js",
@@ -25,6 +26,7 @@
2526
"dependencies": {
2627
"ansi-html": "0.0.5",
2728
"chalk": "1.1.3",
29+
"error-stack-parser": "1.3.6",
2830
"escape-string-regexp": "1.0.5",
2931
"html-entities": "1.2.0",
3032
"opn": "4.0.2",

packages/react-scripts/config/webpack.config.dev.js

+2
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ module.exports = {
5353
require.resolve('react-dev-utils/webpackHotDevClient'),
5454
// We ship a few polyfills by default:
5555
require.resolve('./polyfills'),
56+
// In development, we want to fail fast
57+
require.resolve('react-dev-utils/failFast'),
5658
// Finally, this is your app's code:
5759
paths.appIndexJs
5860
// We include the app code last so that if there is a runtime error during

0 commit comments

Comments
 (0)