From 6deaffbdb0b2e7c72a7f4053a299f28db174383b Mon Sep 17 00:00:00 2001 From: Luca Date: Mon, 4 Sep 2017 19:43:39 +0800 Subject: [PATCH 1/6] Updated react-error-overlay to latest Flow (0.54.0) --- packages/react-error-overlay/package.json | 2 +- .../__tests__/__snapshots__/unmapper.js.snap | 21 ++++++++++++------- .../src/components/Collapsible.js | 11 +++++++++- .../src/components/ErrorOverlay.js | 14 +++++++++++-- .../src/containers/CompileErrorContainer.js | 6 +++++- .../src/containers/RuntimeError.js | 1 + .../src/containers/RuntimeErrorContainer.js | 13 +++++++++++- .../src/containers/StackFrame.js | 19 ++++++++++++++--- .../src/containers/StackFrameCodeBlock.js | 8 +++++-- .../src/containers/StackTrace.js | 10 ++++++++- packages/react-error-overlay/src/index.js | 6 +++--- .../src/listenToRuntimeErrors.js | 7 ++----- .../src/utils/getSourceMap.js | 2 +- 13 files changed, 92 insertions(+), 28 deletions(-) diff --git a/packages/react-error-overlay/package.json b/packages/react-error-overlay/package.json index b3b9365aeb3..78e822a3ee5 100644 --- a/packages/react-error-overlay/package.json +++ b/packages/react-error-overlay/package.json @@ -51,7 +51,7 @@ "eslint-plugin-import": "2.7.0", "eslint-plugin-jsx-a11y": "5.1.1", "eslint-plugin-react": "7.1.0", - "flow-bin": "0.52.0", + "flow-bin": "^0.54.0", "jest": "20.0.4", "jest-fetch-mock": "1.2.1" }, diff --git a/packages/react-error-overlay/src/__tests__/__snapshots__/unmapper.js.snap b/packages/react-error-overlay/src/__tests__/__snapshots__/unmapper.js.snap index 18da4f2e7d8..102c95e0003 100644 --- a/packages/react-error-overlay/src/__tests__/__snapshots__/unmapper.js.snap +++ b/packages/react-error-overlay/src/__tests__/__snapshots__/unmapper.js.snap @@ -46,37 +46,44 @@ Array [ ], "_scriptCode": Array [ ScriptLine { - "content": " },", + "content": " }, +", "highlight": false, "lineNumber": 41463, }, ScriptLine { - "content": " [1, 2].map(function (v) {", + "content": " [1, 2].map(function (v) { +", "highlight": false, "lineNumber": 41464, }, ScriptLine { - "content": " return _react2.default.createElement(", + "content": " return _react2.default.createElement( +", "highlight": false, "lineNumber": 41465, }, ScriptLine { - "content": " 'div',", + "content": " 'div', +", "highlight": true, "lineNumber": 41466, }, ScriptLine { - "content": " {", + "content": " { +", "highlight": false, "lineNumber": 41467, }, ScriptLine { - "content": " __source: {", + "content": " __source: { +", "highlight": false, "lineNumber": 41468, }, ScriptLine { - "content": " fileName: _jsxFileName,", + "content": " fileName: _jsxFileName, +", "highlight": false, "lineNumber": 41469, }, diff --git a/packages/react-error-overlay/src/components/Collapsible.js b/packages/react-error-overlay/src/components/Collapsible.js index 92f1de4295c..c59919f5352 100644 --- a/packages/react-error-overlay/src/components/Collapsible.js +++ b/packages/react-error-overlay/src/components/Collapsible.js @@ -9,6 +9,7 @@ /* @flow */ import React, { Component } from 'react'; +import type { Element } from 'react'; import { black } from '../styles'; const _collapsibleStyle = { @@ -35,7 +36,15 @@ const collapsibleExpandedStyle = { marginBottom: '0.6em', }; -class Collapsible extends Component { +type Props = {| + children: Element[] +|}; + +type State = {| + collapsed: boolean +|}; + +class Collapsible extends Component { state = { collapsed: true, }; diff --git a/packages/react-error-overlay/src/components/ErrorOverlay.js b/packages/react-error-overlay/src/components/ErrorOverlay.js index 446105dad2e..148476a3055 100644 --- a/packages/react-error-overlay/src/components/ErrorOverlay.js +++ b/packages/react-error-overlay/src/components/ErrorOverlay.js @@ -9,6 +9,7 @@ /* @flow */ import React, { Component } from 'react'; +import type { Node } from 'react'; import { black } from '../styles'; const overlayStyle = { @@ -31,10 +32,19 @@ const overlayStyle = { color: black, }; -class ErrorOverlay extends Component { +type Props = {| + children: Node, + shortcutHandler?: (eventKey: string) => void +|}; + +type State = {| + collapsed: boolean +|}; + +class ErrorOverlay extends Component { iframeWindow: window = null; - getIframeWindow = (element: HTMLDivElement) => { + getIframeWindow = (element: ?HTMLDivElement) => { if (element) { const document = element.ownerDocument; this.iframeWindow = document.defaultView; diff --git a/packages/react-error-overlay/src/containers/CompileErrorContainer.js b/packages/react-error-overlay/src/containers/CompileErrorContainer.js index a3e89fe591d..2995ce61366 100644 --- a/packages/react-error-overlay/src/containers/CompileErrorContainer.js +++ b/packages/react-error-overlay/src/containers/CompileErrorContainer.js @@ -15,7 +15,11 @@ import Header from '../components/Header'; import CodeBlock from '../components/CodeBlock'; import generateAnsiHTML from '../utils/generateAnsiHTML'; -class CompileErrorContainer extends PureComponent { +type Props = {| + error: string +|}; + +class CompileErrorContainer extends PureComponent { render() { const { error } = this.props; return ( diff --git a/packages/react-error-overlay/src/containers/RuntimeError.js b/packages/react-error-overlay/src/containers/RuntimeError.js index c64824137d2..fe99f40a70a 100644 --- a/packages/react-error-overlay/src/containers/RuntimeError.js +++ b/packages/react-error-overlay/src/containers/RuntimeError.js @@ -65,4 +65,5 @@ function RuntimeError({ errorRecord, launchEditorEndpoint }: Props) { ); } +export type { ErrorRecord }; export default RuntimeError; diff --git a/packages/react-error-overlay/src/containers/RuntimeErrorContainer.js b/packages/react-error-overlay/src/containers/RuntimeErrorContainer.js index 9c41aa38109..e1a3a033b59 100644 --- a/packages/react-error-overlay/src/containers/RuntimeErrorContainer.js +++ b/packages/react-error-overlay/src/containers/RuntimeErrorContainer.js @@ -14,8 +14,19 @@ import CloseButton from '../components/CloseButton'; import NavigationBar from '../components/NavigationBar'; import RuntimeError from './RuntimeError'; import Footer from '../components/Footer'; +import type { ErrorRecord } from './RuntimeError'; -class RuntimeErrorContainer extends PureComponent { +type Props = {| + errorRecords: ErrorRecord[], + close: () => void, + launchEditorEndpoint: ?string +|}; + +type State = {| + currentIndex: number +|}; + +class RuntimeErrorContainer extends PureComponent { state = { currentIndex: 0, }; diff --git a/packages/react-error-overlay/src/containers/StackFrame.js b/packages/react-error-overlay/src/containers/StackFrame.js index c95ce003f49..6acb0c327ed 100644 --- a/packages/react-error-overlay/src/containers/StackFrame.js +++ b/packages/react-error-overlay/src/containers/StackFrame.js @@ -12,6 +12,7 @@ import React, { Component } from 'react'; import CodeBlock from './StackFrameCodeBlock'; import { getPrettyURL } from '../utils/getPrettyURL'; import { darkGray } from '../styles'; +import type { StackFrame as StackFrameType } from '../utils/stack-frame'; const linkStyle = { fontSize: '0.9em', @@ -43,7 +44,19 @@ const toggleStyle = { lineHeight: '1.5', }; -class StackFrame extends Component { +type Props = {| + frame: StackFrameType, + launchEditorEndpoint: ?string, + contextSize: number, + critical: boolean, + showCode: boolean +|}; + +type State = {| + compiled: boolean +|}; + +class StackFrame extends Component { state = { compiled: false, }; @@ -74,7 +87,7 @@ class StackFrame extends Component { } openInEditor = () => { - if (!this.canOpenInEditor()) { + if (!this.props.launchEditorEndpoint) { return; } const { @@ -90,7 +103,7 @@ class StackFrame extends Component { ).then(() => {}, () => {}); }; - onKeyDown = (e: SyntheticKeyboardEvent) => { + onKeyDown = (e: SyntheticKeyboardEvent<>) => { if (e.key === 'Enter') { this.openInEditor(); } diff --git a/packages/react-error-overlay/src/containers/StackFrameCodeBlock.js b/packages/react-error-overlay/src/containers/StackFrameCodeBlock.js index 2ed685cff49..58a2c0d537c 100644 --- a/packages/react-error-overlay/src/containers/StackFrameCodeBlock.js +++ b/packages/react-error-overlay/src/containers/StackFrameCodeBlock.js @@ -21,12 +21,16 @@ import codeFrame from 'babel-code-frame'; type StackFrameCodeBlockPropsType = {| lines: ScriptLine[], lineNum: number, - columnNum: number, + columnNum: ?number, contextSize: number, main: boolean, |}; -function StackFrameCodeBlock(props: StackFrameCodeBlockPropsType) { +// Exact type workaround for spread operator. +// See: https://github.com/facebook/flow/issues/2405 +type Exact = $Shape; + +function StackFrameCodeBlock(props: Exact) { const { lines, lineNum, columnNum, contextSize, main } = props; const sourceCode = []; let whiteSpace = Infinity; diff --git a/packages/react-error-overlay/src/containers/StackTrace.js b/packages/react-error-overlay/src/containers/StackTrace.js index 4cb20bce128..fb086703dd8 100644 --- a/packages/react-error-overlay/src/containers/StackTrace.js +++ b/packages/react-error-overlay/src/containers/StackTrace.js @@ -13,6 +13,7 @@ import StackFrame from './StackFrame'; import Collapsible from '../components/Collapsible'; import { isInternalFile } from '../utils/isInternalFile'; import { isBultinErrorName } from '../utils/isBultinErrorName'; +import type { StackFrame as StackFrameType } from '../utils/stack-frame'; const traceStyle = { fontSize: '1em', @@ -21,7 +22,14 @@ const traceStyle = { overflow: 'auto', }; -class StackTrace extends Component { +type Props = {| + stackFrames: StackFrameType[], + errorName: string, + contextSize: number, + launchEditorEndpoint: ?string, +|}; + +class StackTrace extends Component { renderFrames() { const { stackFrames, diff --git a/packages/react-error-overlay/src/index.js b/packages/react-error-overlay/src/index.js index 168baa7ef64..b33f51e3275 100644 --- a/packages/react-error-overlay/src/index.js +++ b/packages/react-error-overlay/src/index.js @@ -9,6 +9,7 @@ /* @flow */ import React from 'react'; +import type { Element } from 'react'; import ReactDOM from 'react-dom'; import CompileErrorContainer from './containers/CompileErrorContainer'; import RuntimeErrorContainer from './containers/RuntimeErrorContainer'; @@ -21,13 +22,12 @@ import type { ErrorRecord } from './listenToRuntimeErrors'; type RuntimeReportingOptions = {| onError: () => void, launchEditorEndpoint: string, - filename?: string, |}; let iframe: null | HTMLIFrameElement = null; let isLoadingIframe: boolean = false; -let renderedElement: null | React.Element = null; +let renderedElement: null | Element = null; let currentBuildError: null | string = null; let currentRuntimeErrorRecords: Array = []; let currentRuntimeErrorOptions: null | RuntimeReportingOptions = null; @@ -56,7 +56,7 @@ export function startReportingRuntimeErrors(options: RuntimeReportingOptions) { } finally { handleRuntimeError(errorRecord); } - }, options.filename); + }); } function handleRuntimeError(errorRecord) { diff --git a/packages/react-error-overlay/src/listenToRuntimeErrors.js b/packages/react-error-overlay/src/listenToRuntimeErrors.js index 341200afa8b..45c43fa5d40 100644 --- a/packages/react-error-overlay/src/listenToRuntimeErrors.js +++ b/packages/react-error-overlay/src/listenToRuntimeErrors.js @@ -39,10 +39,7 @@ export type ErrorRecord = {| stackFrames: StackFrame[], |}; -export function listenToRuntimeErrors( - crash: ErrorRecord => void, - filename: string = '/static/js/bundle.js' -) { +export function listenToRuntimeErrors(crash: ErrorRecord => void) { function crashWithFrames(error: Error, unhandledRejection = false) { getStackFrames(error, unhandledRejection, CONTEXT_SIZE) .then(stackFrames => { @@ -71,7 +68,7 @@ export function listenToRuntimeErrors( { message: data.message, stack: data.stack, - __unmap_source: filename, + __unmap_source: '/static/js/bundle.js', }, false ); diff --git a/packages/react-error-overlay/src/utils/getSourceMap.js b/packages/react-error-overlay/src/utils/getSourceMap.js index 1d8405519bd..a632f3cb3c8 100644 --- a/packages/react-error-overlay/src/utils/getSourceMap.js +++ b/packages/react-error-overlay/src/utils/getSourceMap.js @@ -77,7 +77,7 @@ class SourceMap { } } -function extractSourceMapUrl(fileUri: string, fileContents: string) { +function extractSourceMapUrl(fileUri: string, fileContents: string) : Promise { const regex = /\/\/[#@] ?sourceMappingURL=([^\s'"]+)\s*$/gm; let match = null; for (;;) { From ef9e90f9c7fe65023d6f2dca863c9bfdd717909e Mon Sep 17 00:00:00 2001 From: luca Date: Wed, 6 Sep 2017 21:59:08 +0800 Subject: [PATCH 2/6] Revert "Updated react-error-overlay to latest Flow (0.54.0)" This reverts commit 6deaffbdb0b2e7c72a7f4053a299f28db174383b. --- packages/react-error-overlay/package.json | 2 +- .../__tests__/__snapshots__/unmapper.js.snap | 21 +++++++------------ .../src/components/Collapsible.js | 11 +--------- .../src/components/ErrorOverlay.js | 14 ++----------- .../src/containers/CompileErrorContainer.js | 6 +----- .../src/containers/RuntimeError.js | 1 - .../src/containers/RuntimeErrorContainer.js | 13 +----------- .../src/containers/StackFrame.js | 19 +++-------------- .../src/containers/StackFrameCodeBlock.js | 8 ++----- .../src/containers/StackTrace.js | 10 +-------- packages/react-error-overlay/src/index.js | 6 +++--- .../src/listenToRuntimeErrors.js | 7 +++++-- .../src/utils/getSourceMap.js | 2 +- 13 files changed, 28 insertions(+), 92 deletions(-) diff --git a/packages/react-error-overlay/package.json b/packages/react-error-overlay/package.json index 78e822a3ee5..b3b9365aeb3 100644 --- a/packages/react-error-overlay/package.json +++ b/packages/react-error-overlay/package.json @@ -51,7 +51,7 @@ "eslint-plugin-import": "2.7.0", "eslint-plugin-jsx-a11y": "5.1.1", "eslint-plugin-react": "7.1.0", - "flow-bin": "^0.54.0", + "flow-bin": "0.52.0", "jest": "20.0.4", "jest-fetch-mock": "1.2.1" }, diff --git a/packages/react-error-overlay/src/__tests__/__snapshots__/unmapper.js.snap b/packages/react-error-overlay/src/__tests__/__snapshots__/unmapper.js.snap index 102c95e0003..18da4f2e7d8 100644 --- a/packages/react-error-overlay/src/__tests__/__snapshots__/unmapper.js.snap +++ b/packages/react-error-overlay/src/__tests__/__snapshots__/unmapper.js.snap @@ -46,44 +46,37 @@ Array [ ], "_scriptCode": Array [ ScriptLine { - "content": " }, -", + "content": " },", "highlight": false, "lineNumber": 41463, }, ScriptLine { - "content": " [1, 2].map(function (v) { -", + "content": " [1, 2].map(function (v) {", "highlight": false, "lineNumber": 41464, }, ScriptLine { - "content": " return _react2.default.createElement( -", + "content": " return _react2.default.createElement(", "highlight": false, "lineNumber": 41465, }, ScriptLine { - "content": " 'div', -", + "content": " 'div',", "highlight": true, "lineNumber": 41466, }, ScriptLine { - "content": " { -", + "content": " {", "highlight": false, "lineNumber": 41467, }, ScriptLine { - "content": " __source: { -", + "content": " __source: {", "highlight": false, "lineNumber": 41468, }, ScriptLine { - "content": " fileName: _jsxFileName, -", + "content": " fileName: _jsxFileName,", "highlight": false, "lineNumber": 41469, }, diff --git a/packages/react-error-overlay/src/components/Collapsible.js b/packages/react-error-overlay/src/components/Collapsible.js index c59919f5352..92f1de4295c 100644 --- a/packages/react-error-overlay/src/components/Collapsible.js +++ b/packages/react-error-overlay/src/components/Collapsible.js @@ -9,7 +9,6 @@ /* @flow */ import React, { Component } from 'react'; -import type { Element } from 'react'; import { black } from '../styles'; const _collapsibleStyle = { @@ -36,15 +35,7 @@ const collapsibleExpandedStyle = { marginBottom: '0.6em', }; -type Props = {| - children: Element[] -|}; - -type State = {| - collapsed: boolean -|}; - -class Collapsible extends Component { +class Collapsible extends Component { state = { collapsed: true, }; diff --git a/packages/react-error-overlay/src/components/ErrorOverlay.js b/packages/react-error-overlay/src/components/ErrorOverlay.js index 148476a3055..446105dad2e 100644 --- a/packages/react-error-overlay/src/components/ErrorOverlay.js +++ b/packages/react-error-overlay/src/components/ErrorOverlay.js @@ -9,7 +9,6 @@ /* @flow */ import React, { Component } from 'react'; -import type { Node } from 'react'; import { black } from '../styles'; const overlayStyle = { @@ -32,19 +31,10 @@ const overlayStyle = { color: black, }; -type Props = {| - children: Node, - shortcutHandler?: (eventKey: string) => void -|}; - -type State = {| - collapsed: boolean -|}; - -class ErrorOverlay extends Component { +class ErrorOverlay extends Component { iframeWindow: window = null; - getIframeWindow = (element: ?HTMLDivElement) => { + getIframeWindow = (element: HTMLDivElement) => { if (element) { const document = element.ownerDocument; this.iframeWindow = document.defaultView; diff --git a/packages/react-error-overlay/src/containers/CompileErrorContainer.js b/packages/react-error-overlay/src/containers/CompileErrorContainer.js index 2995ce61366..a3e89fe591d 100644 --- a/packages/react-error-overlay/src/containers/CompileErrorContainer.js +++ b/packages/react-error-overlay/src/containers/CompileErrorContainer.js @@ -15,11 +15,7 @@ import Header from '../components/Header'; import CodeBlock from '../components/CodeBlock'; import generateAnsiHTML from '../utils/generateAnsiHTML'; -type Props = {| - error: string -|}; - -class CompileErrorContainer extends PureComponent { +class CompileErrorContainer extends PureComponent { render() { const { error } = this.props; return ( diff --git a/packages/react-error-overlay/src/containers/RuntimeError.js b/packages/react-error-overlay/src/containers/RuntimeError.js index fe99f40a70a..c64824137d2 100644 --- a/packages/react-error-overlay/src/containers/RuntimeError.js +++ b/packages/react-error-overlay/src/containers/RuntimeError.js @@ -65,5 +65,4 @@ function RuntimeError({ errorRecord, launchEditorEndpoint }: Props) { ); } -export type { ErrorRecord }; export default RuntimeError; diff --git a/packages/react-error-overlay/src/containers/RuntimeErrorContainer.js b/packages/react-error-overlay/src/containers/RuntimeErrorContainer.js index e1a3a033b59..9c41aa38109 100644 --- a/packages/react-error-overlay/src/containers/RuntimeErrorContainer.js +++ b/packages/react-error-overlay/src/containers/RuntimeErrorContainer.js @@ -14,19 +14,8 @@ import CloseButton from '../components/CloseButton'; import NavigationBar from '../components/NavigationBar'; import RuntimeError from './RuntimeError'; import Footer from '../components/Footer'; -import type { ErrorRecord } from './RuntimeError'; -type Props = {| - errorRecords: ErrorRecord[], - close: () => void, - launchEditorEndpoint: ?string -|}; - -type State = {| - currentIndex: number -|}; - -class RuntimeErrorContainer extends PureComponent { +class RuntimeErrorContainer extends PureComponent { state = { currentIndex: 0, }; diff --git a/packages/react-error-overlay/src/containers/StackFrame.js b/packages/react-error-overlay/src/containers/StackFrame.js index 6acb0c327ed..c95ce003f49 100644 --- a/packages/react-error-overlay/src/containers/StackFrame.js +++ b/packages/react-error-overlay/src/containers/StackFrame.js @@ -12,7 +12,6 @@ import React, { Component } from 'react'; import CodeBlock from './StackFrameCodeBlock'; import { getPrettyURL } from '../utils/getPrettyURL'; import { darkGray } from '../styles'; -import type { StackFrame as StackFrameType } from '../utils/stack-frame'; const linkStyle = { fontSize: '0.9em', @@ -44,19 +43,7 @@ const toggleStyle = { lineHeight: '1.5', }; -type Props = {| - frame: StackFrameType, - launchEditorEndpoint: ?string, - contextSize: number, - critical: boolean, - showCode: boolean -|}; - -type State = {| - compiled: boolean -|}; - -class StackFrame extends Component { +class StackFrame extends Component { state = { compiled: false, }; @@ -87,7 +74,7 @@ class StackFrame extends Component { } openInEditor = () => { - if (!this.props.launchEditorEndpoint) { + if (!this.canOpenInEditor()) { return; } const { @@ -103,7 +90,7 @@ class StackFrame extends Component { ).then(() => {}, () => {}); }; - onKeyDown = (e: SyntheticKeyboardEvent<>) => { + onKeyDown = (e: SyntheticKeyboardEvent) => { if (e.key === 'Enter') { this.openInEditor(); } diff --git a/packages/react-error-overlay/src/containers/StackFrameCodeBlock.js b/packages/react-error-overlay/src/containers/StackFrameCodeBlock.js index 58a2c0d537c..2ed685cff49 100644 --- a/packages/react-error-overlay/src/containers/StackFrameCodeBlock.js +++ b/packages/react-error-overlay/src/containers/StackFrameCodeBlock.js @@ -21,16 +21,12 @@ import codeFrame from 'babel-code-frame'; type StackFrameCodeBlockPropsType = {| lines: ScriptLine[], lineNum: number, - columnNum: ?number, + columnNum: number, contextSize: number, main: boolean, |}; -// Exact type workaround for spread operator. -// See: https://github.com/facebook/flow/issues/2405 -type Exact = $Shape; - -function StackFrameCodeBlock(props: Exact) { +function StackFrameCodeBlock(props: StackFrameCodeBlockPropsType) { const { lines, lineNum, columnNum, contextSize, main } = props; const sourceCode = []; let whiteSpace = Infinity; diff --git a/packages/react-error-overlay/src/containers/StackTrace.js b/packages/react-error-overlay/src/containers/StackTrace.js index fb086703dd8..4cb20bce128 100644 --- a/packages/react-error-overlay/src/containers/StackTrace.js +++ b/packages/react-error-overlay/src/containers/StackTrace.js @@ -13,7 +13,6 @@ import StackFrame from './StackFrame'; import Collapsible from '../components/Collapsible'; import { isInternalFile } from '../utils/isInternalFile'; import { isBultinErrorName } from '../utils/isBultinErrorName'; -import type { StackFrame as StackFrameType } from '../utils/stack-frame'; const traceStyle = { fontSize: '1em', @@ -22,14 +21,7 @@ const traceStyle = { overflow: 'auto', }; -type Props = {| - stackFrames: StackFrameType[], - errorName: string, - contextSize: number, - launchEditorEndpoint: ?string, -|}; - -class StackTrace extends Component { +class StackTrace extends Component { renderFrames() { const { stackFrames, diff --git a/packages/react-error-overlay/src/index.js b/packages/react-error-overlay/src/index.js index b33f51e3275..168baa7ef64 100644 --- a/packages/react-error-overlay/src/index.js +++ b/packages/react-error-overlay/src/index.js @@ -9,7 +9,6 @@ /* @flow */ import React from 'react'; -import type { Element } from 'react'; import ReactDOM from 'react-dom'; import CompileErrorContainer from './containers/CompileErrorContainer'; import RuntimeErrorContainer from './containers/RuntimeErrorContainer'; @@ -22,12 +21,13 @@ import type { ErrorRecord } from './listenToRuntimeErrors'; type RuntimeReportingOptions = {| onError: () => void, launchEditorEndpoint: string, + filename?: string, |}; let iframe: null | HTMLIFrameElement = null; let isLoadingIframe: boolean = false; -let renderedElement: null | Element = null; +let renderedElement: null | React.Element = null; let currentBuildError: null | string = null; let currentRuntimeErrorRecords: Array = []; let currentRuntimeErrorOptions: null | RuntimeReportingOptions = null; @@ -56,7 +56,7 @@ export function startReportingRuntimeErrors(options: RuntimeReportingOptions) { } finally { handleRuntimeError(errorRecord); } - }); + }, options.filename); } function handleRuntimeError(errorRecord) { diff --git a/packages/react-error-overlay/src/listenToRuntimeErrors.js b/packages/react-error-overlay/src/listenToRuntimeErrors.js index 45c43fa5d40..341200afa8b 100644 --- a/packages/react-error-overlay/src/listenToRuntimeErrors.js +++ b/packages/react-error-overlay/src/listenToRuntimeErrors.js @@ -39,7 +39,10 @@ export type ErrorRecord = {| stackFrames: StackFrame[], |}; -export function listenToRuntimeErrors(crash: ErrorRecord => void) { +export function listenToRuntimeErrors( + crash: ErrorRecord => void, + filename: string = '/static/js/bundle.js' +) { function crashWithFrames(error: Error, unhandledRejection = false) { getStackFrames(error, unhandledRejection, CONTEXT_SIZE) .then(stackFrames => { @@ -68,7 +71,7 @@ export function listenToRuntimeErrors(crash: ErrorRecord => void) { { message: data.message, stack: data.stack, - __unmap_source: '/static/js/bundle.js', + __unmap_source: filename, }, false ); diff --git a/packages/react-error-overlay/src/utils/getSourceMap.js b/packages/react-error-overlay/src/utils/getSourceMap.js index a632f3cb3c8..1d8405519bd 100644 --- a/packages/react-error-overlay/src/utils/getSourceMap.js +++ b/packages/react-error-overlay/src/utils/getSourceMap.js @@ -77,7 +77,7 @@ class SourceMap { } } -function extractSourceMapUrl(fileUri: string, fileContents: string) : Promise { +function extractSourceMapUrl(fileUri: string, fileContents: string) { const regex = /\/\/[#@] ?sourceMappingURL=([^\s'"]+)\s*$/gm; let match = null; for (;;) { From 15129c966f2c1622d03f8f14a78d99b5f4cac303 Mon Sep 17 00:00:00 2001 From: luca Date: Wed, 6 Sep 2017 22:13:53 +0800 Subject: [PATCH 3/6] Fixed unit tests. --- packages/react-error-overlay/package.json | 2 +- .../src/components/Collapsible.js | 11 +++++++- .../src/components/ErrorOverlay.js | 14 ++++++++-- .../src/containers/CompileErrorContainer.js | 6 +++- .../src/containers/RuntimeError.js | 1 + .../src/containers/RuntimeErrorContainer.js | 18 ++++++++++-- .../src/containers/StackFrame.js | 28 +++++++++++++------ .../src/containers/StackFrameCodeBlock.js | 8 ++++-- .../src/containers/StackTrace.js | 16 +++++++---- packages/react-error-overlay/src/index.js | 3 +- .../src/utils/getSourceMap.js | 5 +++- 11 files changed, 86 insertions(+), 26 deletions(-) diff --git a/packages/react-error-overlay/package.json b/packages/react-error-overlay/package.json index b3b9365aeb3..78e822a3ee5 100644 --- a/packages/react-error-overlay/package.json +++ b/packages/react-error-overlay/package.json @@ -51,7 +51,7 @@ "eslint-plugin-import": "2.7.0", "eslint-plugin-jsx-a11y": "5.1.1", "eslint-plugin-react": "7.1.0", - "flow-bin": "0.52.0", + "flow-bin": "^0.54.0", "jest": "20.0.4", "jest-fetch-mock": "1.2.1" }, diff --git a/packages/react-error-overlay/src/components/Collapsible.js b/packages/react-error-overlay/src/components/Collapsible.js index 92f1de4295c..0544dcdd59b 100644 --- a/packages/react-error-overlay/src/components/Collapsible.js +++ b/packages/react-error-overlay/src/components/Collapsible.js @@ -9,6 +9,7 @@ /* @flow */ import React, { Component } from 'react'; +import type { Element } from 'react'; import { black } from '../styles'; const _collapsibleStyle = { @@ -35,7 +36,15 @@ const collapsibleExpandedStyle = { marginBottom: '0.6em', }; -class Collapsible extends Component { +type Props = {| + children: Element[], +|}; + +type State = {| + collapsed: boolean, +|}; + +class Collapsible extends Component { state = { collapsed: true, }; diff --git a/packages/react-error-overlay/src/components/ErrorOverlay.js b/packages/react-error-overlay/src/components/ErrorOverlay.js index 446105dad2e..14dd0321f53 100644 --- a/packages/react-error-overlay/src/components/ErrorOverlay.js +++ b/packages/react-error-overlay/src/components/ErrorOverlay.js @@ -9,6 +9,7 @@ /* @flow */ import React, { Component } from 'react'; +import type { Node } from 'react'; import { black } from '../styles'; const overlayStyle = { @@ -31,10 +32,19 @@ const overlayStyle = { color: black, }; -class ErrorOverlay extends Component { +type Props = {| + children: Node, + shortcutHandler?: (eventKey: string) => void, +|}; + +type State = {| + collapsed: boolean, +|}; + +class ErrorOverlay extends Component { iframeWindow: window = null; - getIframeWindow = (element: HTMLDivElement) => { + getIframeWindow = (element: ?HTMLDivElement) => { if (element) { const document = element.ownerDocument; this.iframeWindow = document.defaultView; diff --git a/packages/react-error-overlay/src/containers/CompileErrorContainer.js b/packages/react-error-overlay/src/containers/CompileErrorContainer.js index a3e89fe591d..9eb8c029b32 100644 --- a/packages/react-error-overlay/src/containers/CompileErrorContainer.js +++ b/packages/react-error-overlay/src/containers/CompileErrorContainer.js @@ -15,7 +15,11 @@ import Header from '../components/Header'; import CodeBlock from '../components/CodeBlock'; import generateAnsiHTML from '../utils/generateAnsiHTML'; -class CompileErrorContainer extends PureComponent { +type Props = {| + error: string, +|}; + +class CompileErrorContainer extends PureComponent { render() { const { error } = this.props; return ( diff --git a/packages/react-error-overlay/src/containers/RuntimeError.js b/packages/react-error-overlay/src/containers/RuntimeError.js index c64824137d2..fe99f40a70a 100644 --- a/packages/react-error-overlay/src/containers/RuntimeError.js +++ b/packages/react-error-overlay/src/containers/RuntimeError.js @@ -65,4 +65,5 @@ function RuntimeError({ errorRecord, launchEditorEndpoint }: Props) { ); } +export type { ErrorRecord }; export default RuntimeError; diff --git a/packages/react-error-overlay/src/containers/RuntimeErrorContainer.js b/packages/react-error-overlay/src/containers/RuntimeErrorContainer.js index 9c41aa38109..5ab4d920a04 100644 --- a/packages/react-error-overlay/src/containers/RuntimeErrorContainer.js +++ b/packages/react-error-overlay/src/containers/RuntimeErrorContainer.js @@ -14,8 +14,19 @@ import CloseButton from '../components/CloseButton'; import NavigationBar from '../components/NavigationBar'; import RuntimeError from './RuntimeError'; import Footer from '../components/Footer'; +import type { ErrorRecord } from './RuntimeError'; -class RuntimeErrorContainer extends PureComponent { +type Props = {| + errorRecords: ErrorRecord[], + close: () => void, + launchEditorEndpoint: ?string, +|}; + +type State = {| + currentIndex: number, +|}; + +class RuntimeErrorContainer extends PureComponent { state = { currentIndex: 0, }; @@ -54,13 +65,14 @@ class RuntimeErrorContainer extends PureComponent { return ( - {totalErrors > 1 && + {totalErrors > 1 && ( } + /> + )} { state = { compiled: false, }; @@ -74,7 +87,7 @@ class StackFrame extends Component { } openInEditor = () => { - if (!this.canOpenInEditor()) { + if (!this.props.launchEditorEndpoint) { return; } const { @@ -90,7 +103,7 @@ class StackFrame extends Component { ).then(() => {}, () => {}); }; - onKeyDown = (e: SyntheticKeyboardEvent) => { + onKeyDown = (e: SyntheticKeyboardEvent<>) => { if (e.key === 'Enter') { this.openInEditor(); } @@ -155,9 +168,7 @@ class StackFrame extends Component { const canOpenInEditor = this.canOpenInEditor(); return ( ); } diff --git a/packages/react-error-overlay/src/containers/StackFrameCodeBlock.js b/packages/react-error-overlay/src/containers/StackFrameCodeBlock.js index 2ed685cff49..58a2c0d537c 100644 --- a/packages/react-error-overlay/src/containers/StackFrameCodeBlock.js +++ b/packages/react-error-overlay/src/containers/StackFrameCodeBlock.js @@ -21,12 +21,16 @@ import codeFrame from 'babel-code-frame'; type StackFrameCodeBlockPropsType = {| lines: ScriptLine[], lineNum: number, - columnNum: number, + columnNum: ?number, contextSize: number, main: boolean, |}; -function StackFrameCodeBlock(props: StackFrameCodeBlockPropsType) { +// Exact type workaround for spread operator. +// See: https://github.com/facebook/flow/issues/2405 +type Exact = $Shape; + +function StackFrameCodeBlock(props: Exact) { const { lines, lineNum, columnNum, contextSize, main } = props; const sourceCode = []; let whiteSpace = Infinity; diff --git a/packages/react-error-overlay/src/containers/StackTrace.js b/packages/react-error-overlay/src/containers/StackTrace.js index 4cb20bce128..1abeb452479 100644 --- a/packages/react-error-overlay/src/containers/StackTrace.js +++ b/packages/react-error-overlay/src/containers/StackTrace.js @@ -13,6 +13,7 @@ import StackFrame from './StackFrame'; import Collapsible from '../components/Collapsible'; import { isInternalFile } from '../utils/isInternalFile'; import { isBultinErrorName } from '../utils/isBultinErrorName'; +import type { StackFrame as StackFrameType } from '../utils/stack-frame'; const traceStyle = { fontSize: '1em', @@ -21,7 +22,14 @@ const traceStyle = { overflow: 'auto', }; -class StackTrace extends Component { +type Props = {| + stackFrames: StackFrameType[], + errorName: string, + contextSize: number, + launchEditorEndpoint: ?string, +|}; + +class StackTrace extends Component { renderFrames() { const { stackFrames, @@ -84,11 +92,7 @@ class StackTrace extends Component { } render() { - return ( -
- {this.renderFrames()} -
- ); + return
{this.renderFrames()}
; } } diff --git a/packages/react-error-overlay/src/index.js b/packages/react-error-overlay/src/index.js index 168baa7ef64..d44976713a6 100644 --- a/packages/react-error-overlay/src/index.js +++ b/packages/react-error-overlay/src/index.js @@ -9,6 +9,7 @@ /* @flow */ import React from 'react'; +import type { Element } from 'react'; import ReactDOM from 'react-dom'; import CompileErrorContainer from './containers/CompileErrorContainer'; import RuntimeErrorContainer from './containers/RuntimeErrorContainer'; @@ -27,7 +28,7 @@ type RuntimeReportingOptions = {| let iframe: null | HTMLIFrameElement = null; let isLoadingIframe: boolean = false; -let renderedElement: null | React.Element = null; +let renderedElement: null | Element = null; let currentBuildError: null | string = null; let currentRuntimeErrorRecords: Array = []; let currentRuntimeErrorOptions: null | RuntimeReportingOptions = null; diff --git a/packages/react-error-overlay/src/utils/getSourceMap.js b/packages/react-error-overlay/src/utils/getSourceMap.js index 1d8405519bd..5c9e3aa9eb7 100644 --- a/packages/react-error-overlay/src/utils/getSourceMap.js +++ b/packages/react-error-overlay/src/utils/getSourceMap.js @@ -77,7 +77,10 @@ class SourceMap { } } -function extractSourceMapUrl(fileUri: string, fileContents: string) { +function extractSourceMapUrl( + fileUri: string, + fileContents: string +): Promise { const regex = /\/\/[#@] ?sourceMappingURL=([^\s'"]+)\s*$/gm; let match = null; for (;;) { From a784af78de2c20ebb9a8eb0e490b795ef928a12c Mon Sep 17 00:00:00 2001 From: luca Date: Thu, 7 Sep 2017 21:48:15 +0800 Subject: [PATCH 4/6] Updated code as per code review. --- packages/react-error-overlay/src/components/Collapsible.js | 5 +++-- packages/react-error-overlay/src/components/ErrorOverlay.js | 5 +++-- packages/react-error-overlay/src/containers/RuntimeError.js | 4 ++-- .../src/containers/RuntimeErrorContainer.js | 1 + packages/react-error-overlay/src/containers/StackFrame.js | 1 + packages/react-error-overlay/src/containers/StackTrace.js | 1 + 6 files changed, 11 insertions(+), 6 deletions(-) diff --git a/packages/react-error-overlay/src/components/Collapsible.js b/packages/react-error-overlay/src/components/Collapsible.js index 0544dcdd59b..0954288130a 100644 --- a/packages/react-error-overlay/src/components/Collapsible.js +++ b/packages/react-error-overlay/src/components/Collapsible.js @@ -9,9 +9,10 @@ /* @flow */ import React, { Component } from 'react'; -import type { Element } from 'react'; import { black } from '../styles'; +import type { Element as ReactElement } from 'react'; + const _collapsibleStyle = { color: black, cursor: 'pointer', @@ -37,7 +38,7 @@ const collapsibleExpandedStyle = { }; type Props = {| - children: Element[], + children: ReactElement[], |}; type State = {| diff --git a/packages/react-error-overlay/src/components/ErrorOverlay.js b/packages/react-error-overlay/src/components/ErrorOverlay.js index 14dd0321f53..2f706f2424b 100644 --- a/packages/react-error-overlay/src/components/ErrorOverlay.js +++ b/packages/react-error-overlay/src/components/ErrorOverlay.js @@ -9,9 +9,10 @@ /* @flow */ import React, { Component } from 'react'; -import type { Node } from 'react'; import { black } from '../styles'; +import type { Node as ReactNode } from 'react'; + const overlayStyle = { position: 'relative', display: 'inline-flex', @@ -33,7 +34,7 @@ const overlayStyle = { }; type Props = {| - children: Node, + children: ReactNode, shortcutHandler?: (eventKey: string) => void, |}; diff --git a/packages/react-error-overlay/src/containers/RuntimeError.js b/packages/react-error-overlay/src/containers/RuntimeError.js index fe99f40a70a..b21360d5e30 100644 --- a/packages/react-error-overlay/src/containers/RuntimeError.js +++ b/packages/react-error-overlay/src/containers/RuntimeError.js @@ -11,6 +11,7 @@ import React from 'react'; import Header from '../components/Header'; import StackTrace from './StackTrace'; + import type { StackFrame } from '../utils/stack-frame'; const wrapperStyle = { @@ -18,7 +19,7 @@ const wrapperStyle = { flexDirection: 'column', }; -type ErrorRecord = {| +export type ErrorRecord = {| error: Error, unhandledRejection: boolean, contextSize: number, @@ -65,5 +66,4 @@ function RuntimeError({ errorRecord, launchEditorEndpoint }: Props) { ); } -export type { ErrorRecord }; export default RuntimeError; diff --git a/packages/react-error-overlay/src/containers/RuntimeErrorContainer.js b/packages/react-error-overlay/src/containers/RuntimeErrorContainer.js index 5ab4d920a04..dafd2af27ad 100644 --- a/packages/react-error-overlay/src/containers/RuntimeErrorContainer.js +++ b/packages/react-error-overlay/src/containers/RuntimeErrorContainer.js @@ -14,6 +14,7 @@ import CloseButton from '../components/CloseButton'; import NavigationBar from '../components/NavigationBar'; import RuntimeError from './RuntimeError'; import Footer from '../components/Footer'; + import type { ErrorRecord } from './RuntimeError'; type Props = {| diff --git a/packages/react-error-overlay/src/containers/StackFrame.js b/packages/react-error-overlay/src/containers/StackFrame.js index 7b52cf7bdc8..470d3654f50 100644 --- a/packages/react-error-overlay/src/containers/StackFrame.js +++ b/packages/react-error-overlay/src/containers/StackFrame.js @@ -12,6 +12,7 @@ import React, { Component } from 'react'; import CodeBlock from './StackFrameCodeBlock'; import { getPrettyURL } from '../utils/getPrettyURL'; import { darkGray } from '../styles'; + import type { StackFrame as StackFrameType } from '../utils/stack-frame'; const linkStyle = { diff --git a/packages/react-error-overlay/src/containers/StackTrace.js b/packages/react-error-overlay/src/containers/StackTrace.js index 1abeb452479..8d4a487dc7b 100644 --- a/packages/react-error-overlay/src/containers/StackTrace.js +++ b/packages/react-error-overlay/src/containers/StackTrace.js @@ -13,6 +13,7 @@ import StackFrame from './StackFrame'; import Collapsible from '../components/Collapsible'; import { isInternalFile } from '../utils/isInternalFile'; import { isBultinErrorName } from '../utils/isBultinErrorName'; + import type { StackFrame as StackFrameType } from '../utils/stack-frame'; const traceStyle = { From a910670287a09a95642b82b7ebbcba5de883a998 Mon Sep 17 00:00:00 2001 From: luca Date: Mon, 11 Sep 2017 19:51:15 +0800 Subject: [PATCH 5/6] Fixed code as per code review. --- .../src/containers/StackFrame.js | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/packages/react-error-overlay/src/containers/StackFrame.js b/packages/react-error-overlay/src/containers/StackFrame.js index 470d3654f50..8dd51bed64b 100644 --- a/packages/react-error-overlay/src/containers/StackFrame.js +++ b/packages/react-error-overlay/src/containers/StackFrame.js @@ -68,36 +68,38 @@ class StackFrame extends Component { })); }; - canOpenInEditor() { + getEndpointUrl() { if (!this.props.launchEditorEndpoint) { - return; + return null; } const { _originalFileName: sourceFileName } = this.props.frame; // Unknown file if (!sourceFileName) { - return false; + return null; } // e.g. "/path-to-my-app/webpack/bootstrap eaddeb46b67d75e4dfc1" const isInternalWebpackBootstrapCode = sourceFileName.trim().indexOf(' ') !== -1; if (isInternalWebpackBootstrapCode) { - return false; + return null; } // Code is in a real file - return true; + return this.props.launchEditorEndpoint; } openInEditor = () => { - if (!this.props.launchEditorEndpoint) { + const endpointUrl = this.getEndpointUrl(); + if (endpointUrl == null) { return; } + const { _originalFileName: sourceFileName, _originalLineNumber: sourceLineNumber, } = this.props.frame; // Keep this in sync with react-error-overlay/middleware.js fetch( - `${this.props.launchEditorEndpoint}?fileName=` + + `${endpointUrl}?fileName=` + window.encodeURIComponent(sourceFileName) + '&lineNumber=' + window.encodeURIComponent(sourceLineNumber || 1) @@ -166,7 +168,7 @@ class StackFrame extends Component { } } - const canOpenInEditor = this.canOpenInEditor(); + const canOpenInEditor = this.getEndpointUrl() != null; return (
{functionName}
From fc7c742ccf8831601a775d7e76cd3b720b87340b Mon Sep 17 00:00:00 2001 From: luca Date: Mon, 11 Sep 2017 21:14:26 +0800 Subject: [PATCH 6/6] Updated the code as per review. --- packages/react-error-overlay/src/containers/StackFrame.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/react-error-overlay/src/containers/StackFrame.js b/packages/react-error-overlay/src/containers/StackFrame.js index 8dd51bed64b..9916623564a 100644 --- a/packages/react-error-overlay/src/containers/StackFrame.js +++ b/packages/react-error-overlay/src/containers/StackFrame.js @@ -68,7 +68,7 @@ class StackFrame extends Component { })); }; - getEndpointUrl() { + getEndpointUrl(): string | null { if (!this.props.launchEditorEndpoint) { return null; } @@ -84,12 +84,12 @@ class StackFrame extends Component { return null; } // Code is in a real file - return this.props.launchEditorEndpoint; + return this.props.launchEditorEndpoint || null; } openInEditor = () => { const endpointUrl = this.getEndpointUrl(); - if (endpointUrl == null) { + if (endpointUrl === null) { return; } @@ -168,7 +168,7 @@ class StackFrame extends Component { } } - const canOpenInEditor = this.getEndpointUrl() != null; + const canOpenInEditor = this.getEndpointUrl() !== null; return (
{functionName}