From 00ed100b26adc519fd90e09ebffd83c8d7dc4343 Mon Sep 17 00:00:00 2001 From: Tharaka Wijebandara Date: Fri, 6 Oct 2017 05:51:17 +0530 Subject: [PATCH] Add click-to-open support for build errors (#3100) * Implement click-to-open for babel syntax errors in build error overlay * Add click-to-open support for lint errors and refactor parser * Reactor code to reuse open-in-editor functionality in both build and runtime error overlays * Fix some eslint warnings * Add a comment about keeping middleware and dev client in sync * Remove es6 features from webpack dev client * Make open-in-editor functionality to work with new iframe script * Rename `openInEditor` to `editorHandler` - Remove indirection of openInEditorListener - Check editorHandler for null before styling error clickable * Fix flow errors --- .../react-dev-utils/webpackHotDevClient.js | 11 +++- .../src/containers/CompileErrorContainer.js | 20 ++++++- .../src/containers/RuntimeError.js | 7 ++- .../src/containers/RuntimeErrorContainer.js | 5 +- .../src/containers/StackFrame.js | 48 +++++++--------- .../src/containers/StackTrace.js | 12 ++-- .../react-error-overlay/src/iframeScript.js | 11 +++- packages/react-error-overlay/src/index.js | 21 ++++++- .../src/utils/parseCompileError.js | 57 +++++++++++++++++++ 9 files changed, 142 insertions(+), 50 deletions(-) create mode 100644 packages/react-error-overlay/src/utils/parseCompileError.js diff --git a/packages/react-dev-utils/webpackHotDevClient.js b/packages/react-dev-utils/webpackHotDevClient.js index 611fc6ba042..e375c3fab8d 100644 --- a/packages/react-dev-utils/webpackHotDevClient.js +++ b/packages/react-dev-utils/webpackHotDevClient.js @@ -23,6 +23,16 @@ var launchEditorEndpoint = require('./launchEditorEndpoint'); var formatWebpackMessages = require('./formatWebpackMessages'); var ErrorOverlay = require('react-error-overlay'); +ErrorOverlay.setEditorHandler(function editorHandler(errorLocation) { + // Keep this sync with errorOverlayMiddleware.js + fetch( + `${launchEditorEndpoint}?fileName=` + + window.encodeURIComponent(errorLocation.fileName) + + '&lineNumber=' + + window.encodeURIComponent(errorLocation.lineNumber || 1) + ); +}); + // We need to keep track of if there has been a runtime error. // Essentially, we cannot guarantee application state was not corrupted by the // runtime error. To prevent confusing behavior, we forcibly reload the entire @@ -31,7 +41,6 @@ var ErrorOverlay = require('react-error-overlay'); // See https://github.com/facebookincubator/create-react-app/issues/3096 var hadRuntimeError = false; ErrorOverlay.startReportingRuntimeErrors({ - launchEditorEndpoint: launchEditorEndpoint, onError: function() { hadRuntimeError = true; }, diff --git a/packages/react-error-overlay/src/containers/CompileErrorContainer.js b/packages/react-error-overlay/src/containers/CompileErrorContainer.js index 5d491a9d47f..9d1e399fd10 100644 --- a/packages/react-error-overlay/src/containers/CompileErrorContainer.js +++ b/packages/react-error-overlay/src/containers/CompileErrorContainer.js @@ -12,18 +12,34 @@ import Footer from '../components/Footer'; import Header from '../components/Header'; import CodeBlock from '../components/CodeBlock'; import generateAnsiHTML from '../utils/generateAnsiHTML'; +import parseCompileError from '../utils/parseCompileError'; +import type { ErrorLocation } from '../utils/parseCompileError'; + +const codeAnchorStyle = { + cursor: 'pointer', +}; type Props = {| error: string, + editorHandler: (errorLoc: ErrorLocation) => void, |}; class CompileErrorContainer extends PureComponent { render() { - const { error } = this.props; + const { error, editorHandler } = this.props; + const errLoc: ?ErrorLocation = parseCompileError(error); + const canOpenInEditor = errLoc !== null && editorHandler !== null; return (
- + editorHandler(errLoc) : null + } + style={canOpenInEditor ? codeAnchorStyle : null} + > + +