98 lines
5.3 KiB
JavaScript
98 lines
5.3 KiB
JavaScript
// This file is only used in app router due to the specific error state handling.
|
|
"use strict";
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
0 && (module.exports = {
|
|
onCaughtError: null,
|
|
onUncaughtError: null
|
|
});
|
|
function _export(target, all) {
|
|
for(var name in all)Object.defineProperty(target, name, {
|
|
enumerable: true,
|
|
get: all[name]
|
|
});
|
|
}
|
|
_export(exports, {
|
|
onCaughtError: function() {
|
|
return onCaughtError;
|
|
},
|
|
onUncaughtError: function() {
|
|
return onUncaughtError;
|
|
}
|
|
});
|
|
const _interop_require_default = require("@swc/helpers/_/_interop_require_default");
|
|
const _isnextroutererror = require("../components/is-next-router-error");
|
|
const _bailouttocsr = require("../../shared/lib/lazy-dynamic/bailout-to-csr");
|
|
const _reportglobalerror = require("./report-global-error");
|
|
const _errorboundary = require("../components/error-boundary");
|
|
const _globalerror = /*#__PURE__*/ _interop_require_default._(require("../components/builtin/global-error"));
|
|
const devToolErrorMod = process.env.NODE_ENV !== 'production' ? require('../../next-devtools/userspace/app/errors') : {
|
|
decorateDevError: (error)=>error,
|
|
handleClientError: ()=>{},
|
|
originConsoleError: console.error.bind(console)
|
|
};
|
|
function onCaughtError(thrownValue, errorInfo) {
|
|
const errorBoundaryComponent = errorInfo.errorBoundary?.constructor;
|
|
let isImplicitErrorBoundary;
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
const { AppDevOverlayErrorBoundary } = require('../../next-devtools/userspace/app/app-dev-overlay-error-boundary');
|
|
isImplicitErrorBoundary = errorBoundaryComponent === AppDevOverlayErrorBoundary;
|
|
}
|
|
isImplicitErrorBoundary = isImplicitErrorBoundary || errorBoundaryComponent === _errorboundary.ErrorBoundaryHandler && errorInfo.errorBoundary.props.errorComponent === _globalerror.default;
|
|
// Skip the segment explorer triggered error
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
const { SEGMENT_EXPLORER_SIMULATED_ERROR_MESSAGE } = require('../../next-devtools/userspace/app/segment-explorer-node');
|
|
if (thrownValue instanceof Error && thrownValue.message === SEGMENT_EXPLORER_SIMULATED_ERROR_MESSAGE) {
|
|
return;
|
|
}
|
|
}
|
|
if (isImplicitErrorBoundary) {
|
|
// We don't consider errors caught unless they're caught by an explicit error
|
|
// boundary. The built-in ones are considered implicit.
|
|
// This mimics how the same app would behave without Next.js.
|
|
return onUncaughtError(thrownValue);
|
|
}
|
|
// Skip certain custom errors which are not expected to be reported on client
|
|
if ((0, _bailouttocsr.isBailoutToCSRError)(thrownValue) || (0, _isnextroutererror.isNextRouterError)(thrownValue)) return;
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
const errorBoundaryName = // read react component displayName
|
|
errorBoundaryComponent?.displayName || errorBoundaryComponent?.name || 'Unknown';
|
|
const componentThatErroredFrame = errorInfo?.componentStack?.split('\n')[1];
|
|
// Match chrome or safari stack trace
|
|
const matches = // regex to match the function name in the stack trace
|
|
// example 1: at Page (http://localhost:3000/_next/static/chunks/pages/index.js?ts=1631600000000:2:1)
|
|
// example 2: Page@http://localhost:3000/_next/static/chunks/pages/index.js?ts=1631600000000:2:1
|
|
componentThatErroredFrame?.match(/\s+at (\w+)\s+|(\w+)@/) ?? [];
|
|
const componentThatErroredName = matches[1] || matches[2] || 'Unknown';
|
|
// Create error location with errored component and error boundary, to match the behavior of default React onCaughtError handler.
|
|
const errorBoundaryMessage = `It was handled by the <${errorBoundaryName}> error boundary.`;
|
|
const componentErrorMessage = componentThatErroredName ? `The above error occurred in the <${componentThatErroredName}> component.` : `The above error occurred in one of your components.`;
|
|
const errorLocation = `${componentErrorMessage} ${errorBoundaryMessage}`;
|
|
const error = devToolErrorMod.decorateDevError(thrownValue);
|
|
// Log and report the error with location but without modifying the error stack
|
|
devToolErrorMod.originConsoleError('%o\n\n%s', thrownValue, errorLocation);
|
|
devToolErrorMod.handleClientError(error);
|
|
} else {
|
|
devToolErrorMod.originConsoleError(thrownValue);
|
|
}
|
|
}
|
|
function onUncaughtError(thrownValue) {
|
|
// Skip certain custom errors which are not expected to be reported on client
|
|
if ((0, _bailouttocsr.isBailoutToCSRError)(thrownValue) || (0, _isnextroutererror.isNextRouterError)(thrownValue)) return;
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
const error = devToolErrorMod.decorateDevError(thrownValue);
|
|
// TODO: Add an adendum to the overlay telling people about custom error boundaries.
|
|
(0, _reportglobalerror.reportGlobalError)(error);
|
|
} else {
|
|
(0, _reportglobalerror.reportGlobalError)(thrownValue);
|
|
}
|
|
}
|
|
|
|
if ((typeof exports.default === 'function' || (typeof exports.default === 'object' && exports.default !== null)) && typeof exports.default.__esModule === 'undefined') {
|
|
Object.defineProperty(exports.default, '__esModule', { value: true });
|
|
Object.assign(exports.default, exports);
|
|
module.exports = exports.default;
|
|
}
|
|
|
|
//# sourceMappingURL=error-boundary-callbacks.js.map
|