From ae1f7622ca04f329a9102809b1fa074d02f45ee2 Mon Sep 17 00:00:00 2001 From: Dan Abramov Date: Sat, 11 Mar 2017 03:26:12 +0000 Subject: [PATCH] Add all injection necessary for error logging --- scripts/rollup/build.js | 2 ++ src/fb/ReactDOMFiberFBEntry.js | 1 + .../shared/fiber/ReactFiberErrorLogger.js | 17 +++++++++++++++++ 3 files changed, 20 insertions(+) diff --git a/scripts/rollup/build.js b/scripts/rollup/build.js index 1f72204d79..d9cf2c66ef 100644 --- a/scripts/rollup/build.js +++ b/scripts/rollup/build.js @@ -157,6 +157,8 @@ function getCommonJsConfig(bundleType) { // At FB, we don't know them statically: 'ReactFeatureFlags', 'ReactDOMFeatureFlags', + // At FB, we fork this module for custom reporting flow: + 'ReactErrorUtils', ], }; } diff --git a/src/fb/ReactDOMFiberFBEntry.js b/src/fb/ReactDOMFiberFBEntry.js index cb75d9e443..73d681f908 100644 --- a/src/fb/ReactDOMFiberFBEntry.js +++ b/src/fb/ReactDOMFiberFBEntry.js @@ -33,6 +33,7 @@ ReactDOMFiber.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = { // These are real internal dependencies that are trickier to remove: EventPluginHub: require('EventPluginHub'), ReactBrowserEventEmitter: require('ReactBrowserEventEmitter'), + ReactFiberErrorLogger: require('ReactFiberErrorLogger'), ReactDOMComponentTree: require('ReactDOMComponentTree'), ReactInstanceMap: require('react-dom/lib/ReactInstanceMap'), // This is used for ajaxify on www: diff --git a/src/renderers/shared/fiber/ReactFiberErrorLogger.js b/src/renderers/shared/fiber/ReactFiberErrorLogger.js index 0a8a055911..8cb09220d9 100644 --- a/src/renderers/shared/fiber/ReactFiberErrorLogger.js +++ b/src/renderers/shared/fiber/ReactFiberErrorLogger.js @@ -12,8 +12,13 @@ 'use strict'; +const emptyFunction = require('emptyFunction'); +const invariant = require('invariant'); + import type { CapturedError } from 'ReactFiberScheduler'; +let showDialog = emptyFunction; + function logCapturedError(capturedError : CapturedError) : void { if (__DEV__) { const { @@ -84,7 +89,19 @@ function logCapturedError(capturedError : CapturedError) : void { `React caught an error thrown by one of your components.\n\n${error.stack}` ); } + + showDialog(capturedError); } +exports.injection = { + injectDialog(fn) { + invariant( + typeof fn === 'function', + 'Injected showDialog() must be a function.' + ); + showDialog = fn; + }, +}; + exports.logCapturedError = logCapturedError;