UNPKG

reactotron-react-js

Version:

A development tool to explore, inspect, and diagnose your React JS/DOM apps.

73 lines (62 loc) 2.13 kB
/** * Provides a global error handler to report errors with sourcemap lookup. */ import StackTrace from "stacktrace-js" // what to say whe we can't resolve source maps const CANNOT_RESOLVE_ERROR = 'Unable to resolve error. Either support CORS by changing webpack\'s devtool to "source-map" or run in offline mode.' // defaults const PLUGIN_DEFAULTS = { offline: false, // true = don't do source maps lookup cross domain } // our plugin entry point export default (options) => (reactotron) => { // setup configuration const config = Object.assign({}, PLUGIN_DEFAULTS, options || {}) // holds the previous window.onerror when needed let swizzledOnError = null let isSwizzled = false // the functionality of our window.onerror. // we could have used window.addEventListener("error", ...) but that doesn't work on all browsers function windowOnError(msg, file, line, col, error) { // resolve the stack trace StackTrace.fromError(error, { offline: config.offline }) // then try to send it up to the server .then((stackFrames) => reactotron.error(msg, stackFrames)) // can't resolve, well, let the user know, but still upload something sane .catch((resolvingError) => reactotron.error({ message: CANNOT_RESOLVE_ERROR, original: { msg, file, line, col, error }, resolvingError, }) ) // call back the previous window.onerror if we have one if (swizzledOnError) { swizzledOnError(msg, file, line, col, error) } } // swizzles window.onerror dropping in our new one function trackGlobalErrors() { if (isSwizzled) return swizzledOnError = window.onerror window.onerror = windowOnError isSwizzled = true } // restore the original function untrackGlobalErrors() { if (!swizzledOnError) return window.onerror = swizzledOnError isSwizzled = false } // auto start this trackGlobalErrors() // the reactotron plugin interface return { // attach these functions to the Reactotron features: { trackGlobalErrors, untrackGlobalErrors, }, } }