@sentry/react 10.53.1 → 10.55.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/constants.js +3 -5
- package/build/cjs/constants.js.map +1 -1
- package/build/cjs/debug-build.js +0 -5
- package/build/cjs/debug-build.js.map +1 -1
- package/build/cjs/error.js +12 -72
- package/build/cjs/error.js.map +1 -1
- package/build/cjs/errorboundary.js +22 -77
- package/build/cjs/errorboundary.js.map +1 -1
- package/build/cjs/hoist-non-react-statics.js +16 -84
- package/build/cjs/hoist-non-react-statics.js.map +1 -1
- package/build/cjs/isSyntheticEvent.js +10 -0
- package/build/cjs/isSyntheticEvent.js.map +1 -0
- package/build/cjs/profiler.js +35 -110
- package/build/cjs/profiler.js.map +1 -1
- package/build/cjs/reactrouter-compat-utils/instrumentation.js +219 -690
- package/build/cjs/reactrouter-compat-utils/instrumentation.js.map +1 -1
- package/build/cjs/reactrouter-compat-utils/lazy-routes.js +24 -85
- package/build/cjs/reactrouter-compat-utils/lazy-routes.js.map +1 -1
- package/build/cjs/reactrouter-compat-utils/route-manifest.js +17 -95
- package/build/cjs/reactrouter-compat-utils/route-manifest.js.map +1 -1
- package/build/cjs/reactrouter-compat-utils/utils.js +48 -190
- package/build/cjs/reactrouter-compat-utils/utils.js.map +1 -1
- package/build/cjs/reactrouter.js +33 -113
- package/build/cjs/reactrouter.js.map +1 -1
- package/build/cjs/reactrouterv3.js +27 -59
- package/build/cjs/reactrouterv3.js.map +1 -1
- package/build/cjs/reactrouterv6.js +8 -41
- package/build/cjs/reactrouterv6.js.map +1 -1
- package/build/cjs/reactrouterv7.js +8 -41
- package/build/cjs/reactrouterv7.js.map +1 -1
- package/build/cjs/redux.js +60 -88
- package/build/cjs/redux.js.map +1 -1
- package/build/cjs/sdk.js +13 -8
- package/build/cjs/sdk.js.map +1 -1
- package/build/cjs/tanstackrouter.js +24 -64
- package/build/cjs/tanstackrouter.js.map +1 -1
- package/build/esm/constants.js +3 -5
- package/build/esm/constants.js.map +1 -1
- package/build/esm/debug-build.js +0 -5
- package/build/esm/debug-build.js.map +1 -1
- package/build/esm/error.js +12 -72
- package/build/esm/error.js.map +1 -1
- package/build/esm/errorboundary.js +22 -77
- package/build/esm/errorboundary.js.map +1 -1
- package/build/esm/hoist-non-react-statics.js +16 -84
- package/build/esm/hoist-non-react-statics.js.map +1 -1
- package/build/esm/isSyntheticEvent.js +8 -0
- package/build/esm/isSyntheticEvent.js.map +1 -0
- package/build/esm/package.json +1 -1
- package/build/esm/profiler.js +35 -110
- package/build/esm/profiler.js.map +1 -1
- package/build/esm/reactrouter-compat-utils/instrumentation.js +219 -690
- package/build/esm/reactrouter-compat-utils/instrumentation.js.map +1 -1
- package/build/esm/reactrouter-compat-utils/lazy-routes.js +24 -85
- package/build/esm/reactrouter-compat-utils/lazy-routes.js.map +1 -1
- package/build/esm/reactrouter-compat-utils/route-manifest.js +17 -95
- package/build/esm/reactrouter-compat-utils/route-manifest.js.map +1 -1
- package/build/esm/reactrouter-compat-utils/utils.js +48 -190
- package/build/esm/reactrouter-compat-utils/utils.js.map +1 -1
- package/build/esm/reactrouter.js +33 -113
- package/build/esm/reactrouter.js.map +1 -1
- package/build/esm/reactrouterv3.js +27 -59
- package/build/esm/reactrouterv3.js.map +1 -1
- package/build/esm/reactrouterv6.js +8 -41
- package/build/esm/reactrouterv6.js.map +1 -1
- package/build/esm/reactrouterv7.js +8 -41
- package/build/esm/reactrouterv7.js.map +1 -1
- package/build/esm/redux.js +60 -88
- package/build/esm/redux.js.map +1 -1
- package/build/esm/sdk.js +15 -10
- package/build/esm/sdk.js.map +1 -1
- package/build/esm/tanstackrouter.js +24 -64
- package/build/esm/tanstackrouter.js.map +1 -1
- package/build/types/isSyntheticEvent.d.ts +10 -0
- package/build/types/isSyntheticEvent.d.ts.map +1 -0
- package/build/types/sdk.d.ts.map +1 -1
- package/build/types-ts3.8/isSyntheticEvent.d.ts +10 -0
- package/package.json +3 -3
package/build/cjs/constants.js
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
2
|
|
|
3
|
-
const REACT_RENDER_OP =
|
|
4
|
-
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
const REACT_MOUNT_OP = 'ui.react.mount';
|
|
3
|
+
const REACT_RENDER_OP = "ui.react.render";
|
|
4
|
+
const REACT_UPDATE_OP = "ui.react.update";
|
|
5
|
+
const REACT_MOUNT_OP = "ui.react.mount";
|
|
8
6
|
|
|
9
7
|
exports.REACT_MOUNT_OP = REACT_MOUNT_OP;
|
|
10
8
|
exports.REACT_RENDER_OP = REACT_RENDER_OP;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sources":["../../src/constants.ts"],"sourcesContent":["export const REACT_RENDER_OP = 'ui.react.render';\n\nexport const REACT_UPDATE_OP = 'ui.react.update';\n\nexport const REACT_MOUNT_OP = 'ui.react.mount';\n"],"names":[],"mappings":";;AAAO,MAAM,eAAA,GAAkB
|
|
1
|
+
{"version":3,"file":"constants.js","sources":["../../src/constants.ts"],"sourcesContent":["export const REACT_RENDER_OP = 'ui.react.render';\n\nexport const REACT_UPDATE_OP = 'ui.react.update';\n\nexport const REACT_MOUNT_OP = 'ui.react.mount';\n"],"names":[],"mappings":";;AAAO,MAAM,eAAA,GAAkB;AAExB,MAAM,eAAA,GAAkB;AAExB,MAAM,cAAA,GAAiB;;;;;;"}
|
package/build/cjs/debug-build.js
CHANGED
|
@@ -1,10 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
2
|
|
|
3
|
-
/**
|
|
4
|
-
* This serves as a build time flag that will be true by default, but false in non-debug builds or if users replace `__SENTRY_DEBUG__` in their generated code.
|
|
5
|
-
*
|
|
6
|
-
* ATTENTION: This constant must never cross package boundaries (i.e. be exported) to guarantee that it can be used for tree shaking.
|
|
7
|
-
*/
|
|
8
3
|
const DEBUG_BUILD = (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__);
|
|
9
4
|
|
|
10
5
|
exports.DEBUG_BUILD = DEBUG_BUILD;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debug-build.js","sources":["../../src/debug-build.ts"],"sourcesContent":["declare const __DEBUG_BUILD__: boolean;\n\n/**\n * This serves as a build time flag that will be true by default, but false in non-debug builds or if users replace `__SENTRY_DEBUG__` in their generated code.\n *\n * ATTENTION: This constant must never cross package boundaries (i.e. be exported) to guarantee that it can be used for tree shaking.\n */\nexport const DEBUG_BUILD = __DEBUG_BUILD__;\n"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"debug-build.js","sources":["../../src/debug-build.ts"],"sourcesContent":["declare const __DEBUG_BUILD__: boolean;\n\n/**\n * This serves as a build time flag that will be true by default, but false in non-debug builds or if users replace `__SENTRY_DEBUG__` in their generated code.\n *\n * ATTENTION: This constant must never cross package boundaries (i.e. be exported) to guarantee that it can be used for tree shaking.\n */\nexport const DEBUG_BUILD = __DEBUG_BUILD__;\n"],"names":[],"mappings":";;AAOO,MAAM,WAAA,IAAc,OAAA,gBAAA,KAAA,WAAA,IAAA,gBAAA;;;;"}
|
package/build/cjs/error.js
CHANGED
|
@@ -4,101 +4,41 @@ const browser$1 = require('@sentry/browser');
|
|
|
4
4
|
const browser = require('@sentry/core/browser');
|
|
5
5
|
const React = require('react');
|
|
6
6
|
|
|
7
|
-
/**
|
|
8
|
-
* See if React major version is 17+ by parsing version string.
|
|
9
|
-
*/
|
|
10
7
|
function isAtLeastReact17(reactVersion) {
|
|
11
8
|
const reactMajor = reactVersion.match(/^([^.]+)/);
|
|
12
9
|
return reactMajor !== null && parseInt(reactMajor[0]) >= 17;
|
|
13
10
|
}
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Recurse through `error.cause` chain to set cause on an error.
|
|
17
|
-
*/
|
|
18
11
|
function setCause(error, cause) {
|
|
19
|
-
const seenErrors = new WeakSet();
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
// If we've already seen the error, there is a recursive loop somewhere in the error's
|
|
23
|
-
// cause chain. Let's just bail out then to prevent a stack overflow.
|
|
24
|
-
if (seenErrors.has(error)) {
|
|
12
|
+
const seenErrors = /* @__PURE__ */ new WeakSet();
|
|
13
|
+
function recurse(error2, cause2) {
|
|
14
|
+
if (seenErrors.has(error2)) {
|
|
25
15
|
return;
|
|
26
16
|
}
|
|
27
|
-
if (
|
|
28
|
-
seenErrors.add(
|
|
29
|
-
return recurse(
|
|
17
|
+
if (error2.cause) {
|
|
18
|
+
seenErrors.add(error2);
|
|
19
|
+
return recurse(error2.cause, cause2);
|
|
30
20
|
}
|
|
31
|
-
|
|
21
|
+
error2.cause = cause2;
|
|
32
22
|
}
|
|
33
|
-
|
|
34
23
|
recurse(error, cause);
|
|
35
24
|
}
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Captures an error that was thrown by a React ErrorBoundary or React root.
|
|
39
|
-
*
|
|
40
|
-
* @param error The error to capture.
|
|
41
|
-
* @param errorInfo The errorInfo provided by React.
|
|
42
|
-
* @param hint Optional additional data to attach to the Sentry event.
|
|
43
|
-
* @returns the id of the captured Sentry event.
|
|
44
|
-
*/
|
|
45
|
-
function captureReactException(
|
|
46
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
47
|
-
error,
|
|
48
|
-
{ componentStack },
|
|
49
|
-
hint,
|
|
50
|
-
) {
|
|
51
|
-
// If on React version >= 17, create stack trace from componentStack param and links
|
|
52
|
-
// to to the original error using `error.cause` otherwise relies on error param for stacktrace.
|
|
53
|
-
// Linking errors requires the `LinkedErrors` integration be enabled.
|
|
54
|
-
// See: https://reactjs.org/blog/2020/08/10/react-v17-rc.html#native-component-stacks
|
|
55
|
-
//
|
|
56
|
-
// Although `componentDidCatch` is typed to accept an `Error` object, it can also be invoked
|
|
57
|
-
// with non-error objects. This is why we need to check if the error is an error-like object.
|
|
58
|
-
// See: https://github.com/getsentry/sentry-javascript/issues/6167
|
|
25
|
+
function captureReactException(error, { componentStack }, hint) {
|
|
59
26
|
if (isAtLeastReact17(React.version) && browser.isError(error) && componentStack) {
|
|
60
27
|
const errorBoundaryError = new Error(error.message);
|
|
61
28
|
errorBoundaryError.name = `React ErrorBoundary ${error.name}`;
|
|
62
29
|
errorBoundaryError.stack = componentStack;
|
|
63
|
-
|
|
64
|
-
// Using the `LinkedErrors` integration to link the errors together.
|
|
65
30
|
setCause(error, errorBoundaryError);
|
|
66
31
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
scope.setContext('react', { componentStack });
|
|
32
|
+
return browser$1.withScope((scope) => {
|
|
33
|
+
scope.setContext("react", { componentStack });
|
|
70
34
|
return browser$1.captureException(error, hint);
|
|
71
35
|
});
|
|
72
36
|
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Creates an error handler that can be used with the `onCaughtError`, `onUncaughtError`,
|
|
76
|
-
* and `onRecoverableError` options in `createRoot` and `hydrateRoot` React DOM methods.
|
|
77
|
-
*
|
|
78
|
-
* @param callback An optional callback that will be called after the error is captured.
|
|
79
|
-
* Use this to add custom handling for errors.
|
|
80
|
-
*
|
|
81
|
-
* @example
|
|
82
|
-
*
|
|
83
|
-
* ```JavaScript
|
|
84
|
-
* const root = createRoot(container, {
|
|
85
|
-
* onCaughtError: Sentry.reactErrorHandler(),
|
|
86
|
-
* onUncaughtError: Sentry.reactErrorHandler((error, errorInfo) => {
|
|
87
|
-
* console.warn('Caught error', error, errorInfo.componentStack);
|
|
88
|
-
* });
|
|
89
|
-
* });
|
|
90
|
-
* ```
|
|
91
|
-
*/
|
|
92
|
-
function reactErrorHandler(
|
|
93
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
94
|
-
callback,
|
|
95
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
96
|
-
) {
|
|
97
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
37
|
+
function reactErrorHandler(callback) {
|
|
98
38
|
return (error, errorInfo) => {
|
|
99
39
|
const hasCallback = !!callback;
|
|
100
40
|
const eventId = captureReactException(error, errorInfo, {
|
|
101
|
-
mechanism: { handled: hasCallback, type:
|
|
41
|
+
mechanism: { handled: hasCallback, type: "auto.function.react.error_handler" }
|
|
102
42
|
});
|
|
103
43
|
if (hasCallback) {
|
|
104
44
|
callback(error, errorInfo, eventId);
|
package/build/cjs/error.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error.js","sources":["../../src/error.ts"],"sourcesContent":["import { captureException, withScope } from '@sentry/browser';\nimport { isError } from '@sentry/core/browser';\nimport type { ErrorInfo } from 'react';\nimport { version } from 'react';\n\n/**\n * See if React major version is 17+ by parsing version string.\n */\nexport function isAtLeastReact17(reactVersion: string): boolean {\n const reactMajor = reactVersion.match(/^([^.]+)/);\n return reactMajor !== null && parseInt(reactMajor[0]) >= 17;\n}\n\n/**\n * Recurse through `error.cause` chain to set cause on an error.\n */\nexport function setCause(error: Error & { cause?: Error }, cause: Error): void {\n const seenErrors = new WeakSet();\n\n function recurse(error: Error & { cause?: Error }, cause: Error): void {\n // If we've already seen the error, there is a recursive loop somewhere in the error's\n // cause chain. Let's just bail out then to prevent a stack overflow.\n if (seenErrors.has(error)) {\n return;\n }\n if (error.cause) {\n seenErrors.add(error);\n return recurse(error.cause, cause);\n }\n error.cause = cause;\n }\n\n recurse(error, cause);\n}\n\n/**\n * Captures an error that was thrown by a React ErrorBoundary or React root.\n *\n * @param error The error to capture.\n * @param errorInfo The errorInfo provided by React.\n * @param hint Optional additional data to attach to the Sentry event.\n * @returns the id of the captured Sentry event.\n */\nexport function captureReactException(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n error: any,\n { componentStack }: ErrorInfo,\n hint?: Parameters<typeof captureException>[1],\n): string {\n // If on React version >= 17, create stack trace from componentStack param and links\n // to to the original error using `error.cause` otherwise relies on error param for stacktrace.\n // Linking errors requires the `LinkedErrors` integration be enabled.\n // See: https://reactjs.org/blog/2020/08/10/react-v17-rc.html#native-component-stacks\n //\n // Although `componentDidCatch` is typed to accept an `Error` object, it can also be invoked\n // with non-error objects. This is why we need to check if the error is an error-like object.\n // See: https://github.com/getsentry/sentry-javascript/issues/6167\n if (isAtLeastReact17(version) && isError(error) && componentStack) {\n const errorBoundaryError = new Error(error.message);\n errorBoundaryError.name = `React ErrorBoundary ${error.name}`;\n errorBoundaryError.stack = componentStack;\n\n // Using the `LinkedErrors` integration to link the errors together.\n setCause(error, errorBoundaryError);\n }\n\n return withScope(scope => {\n scope.setContext('react', { componentStack });\n return captureException(error, hint);\n });\n}\n\n/**\n * Creates an error handler that can be used with the `onCaughtError`, `onUncaughtError`,\n * and `onRecoverableError` options in `createRoot` and `hydrateRoot` React DOM methods.\n *\n * @param callback An optional callback that will be called after the error is captured.\n * Use this to add custom handling for errors.\n *\n * @example\n *\n * ```JavaScript\n * const root = createRoot(container, {\n * onCaughtError: Sentry.reactErrorHandler(),\n * onUncaughtError: Sentry.reactErrorHandler((error, errorInfo) => {\n * console.warn('Caught error', error, errorInfo.componentStack);\n * });\n * });\n * ```\n */\nexport function reactErrorHandler(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n callback?: (error: any, errorInfo: ErrorInfo, eventId: string) => void,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): (error: any, errorInfo: ErrorInfo) => void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (error: any, errorInfo: ErrorInfo) => {\n const hasCallback = !!callback;\n const eventId = captureReactException(error, errorInfo, {\n mechanism: { handled: hasCallback, type: 'auto.function.react.error_handler' },\n });\n if (hasCallback) {\n callback(error, errorInfo, eventId);\n }\n };\n}\n"],"names":["version","isError","withScope","captureException"],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"error.js","sources":["../../src/error.ts"],"sourcesContent":["import { captureException, withScope } from '@sentry/browser';\nimport { isError } from '@sentry/core/browser';\nimport type { ErrorInfo } from 'react';\nimport { version } from 'react';\n\n/**\n * See if React major version is 17+ by parsing version string.\n */\nexport function isAtLeastReact17(reactVersion: string): boolean {\n const reactMajor = reactVersion.match(/^([^.]+)/);\n return reactMajor !== null && parseInt(reactMajor[0]) >= 17;\n}\n\n/**\n * Recurse through `error.cause` chain to set cause on an error.\n */\nexport function setCause(error: Error & { cause?: Error }, cause: Error): void {\n const seenErrors = new WeakSet();\n\n function recurse(error: Error & { cause?: Error }, cause: Error): void {\n // If we've already seen the error, there is a recursive loop somewhere in the error's\n // cause chain. Let's just bail out then to prevent a stack overflow.\n if (seenErrors.has(error)) {\n return;\n }\n if (error.cause) {\n seenErrors.add(error);\n return recurse(error.cause, cause);\n }\n error.cause = cause;\n }\n\n recurse(error, cause);\n}\n\n/**\n * Captures an error that was thrown by a React ErrorBoundary or React root.\n *\n * @param error The error to capture.\n * @param errorInfo The errorInfo provided by React.\n * @param hint Optional additional data to attach to the Sentry event.\n * @returns the id of the captured Sentry event.\n */\nexport function captureReactException(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n error: any,\n { componentStack }: ErrorInfo,\n hint?: Parameters<typeof captureException>[1],\n): string {\n // If on React version >= 17, create stack trace from componentStack param and links\n // to to the original error using `error.cause` otherwise relies on error param for stacktrace.\n // Linking errors requires the `LinkedErrors` integration be enabled.\n // See: https://reactjs.org/blog/2020/08/10/react-v17-rc.html#native-component-stacks\n //\n // Although `componentDidCatch` is typed to accept an `Error` object, it can also be invoked\n // with non-error objects. This is why we need to check if the error is an error-like object.\n // See: https://github.com/getsentry/sentry-javascript/issues/6167\n if (isAtLeastReact17(version) && isError(error) && componentStack) {\n const errorBoundaryError = new Error(error.message);\n errorBoundaryError.name = `React ErrorBoundary ${error.name}`;\n errorBoundaryError.stack = componentStack;\n\n // Using the `LinkedErrors` integration to link the errors together.\n setCause(error, errorBoundaryError);\n }\n\n return withScope(scope => {\n scope.setContext('react', { componentStack });\n return captureException(error, hint);\n });\n}\n\n/**\n * Creates an error handler that can be used with the `onCaughtError`, `onUncaughtError`,\n * and `onRecoverableError` options in `createRoot` and `hydrateRoot` React DOM methods.\n *\n * @param callback An optional callback that will be called after the error is captured.\n * Use this to add custom handling for errors.\n *\n * @example\n *\n * ```JavaScript\n * const root = createRoot(container, {\n * onCaughtError: Sentry.reactErrorHandler(),\n * onUncaughtError: Sentry.reactErrorHandler((error, errorInfo) => {\n * console.warn('Caught error', error, errorInfo.componentStack);\n * });\n * });\n * ```\n */\nexport function reactErrorHandler(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n callback?: (error: any, errorInfo: ErrorInfo, eventId: string) => void,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): (error: any, errorInfo: ErrorInfo) => void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (error: any, errorInfo: ErrorInfo) => {\n const hasCallback = !!callback;\n const eventId = captureReactException(error, errorInfo, {\n mechanism: { handled: hasCallback, type: 'auto.function.react.error_handler' },\n });\n if (hasCallback) {\n callback(error, errorInfo, eventId);\n }\n };\n}\n"],"names":["error","cause","version","isError","withScope","captureException"],"mappings":";;;;;;AAQO,SAAS,iBAAiB,YAAA,EAA+B;AAC9D,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,KAAA,CAAM,UAAU,CAAA;AAChD,EAAA,OAAO,eAAe,IAAA,IAAQ,QAAA,CAAS,UAAA,CAAW,CAAC,CAAC,CAAA,IAAK,EAAA;AAC3D;AAKO,SAAS,QAAA,CAAS,OAAkC,KAAA,EAAoB;AAC7E,EAAA,MAAM,UAAA,uBAAiB,OAAA,EAAQ;AAE/B,EAAA,SAAS,OAAA,CAAQA,QAAkCC,MAAAA,EAAoB;AAGrE,IAAA,IAAI,UAAA,CAAW,GAAA,CAAID,MAAK,CAAA,EAAG;AACzB,MAAA;AAAA,IACF;AACA,IAAA,IAAIA,OAAM,KAAA,EAAO;AACf,MAAA,UAAA,CAAW,IAAIA,MAAK,CAAA;AACpB,MAAA,OAAO,OAAA,CAAQA,MAAAA,CAAM,KAAA,EAAOC,MAAK,CAAA;AAAA,IACnC;AACA,IAAAD,OAAM,KAAA,GAAQC,MAAAA;AAAA,EAChB;AAEA,EAAA,OAAA,CAAQ,OAAO,KAAK,CAAA;AACtB;AAUO,SAAS,qBAAA,CAEd,KAAA,EACA,EAAE,cAAA,IACF,IAAA,EACQ;AASR,EAAA,IAAI,iBAAiBC,aAAO,CAAA,IAAKC,eAAA,CAAQ,KAAK,KAAK,cAAA,EAAgB;AACjE,IAAA,MAAM,kBAAA,GAAqB,IAAI,KAAA,CAAM,KAAA,CAAM,OAAO,CAAA;AAClD,IAAA,kBAAA,CAAmB,IAAA,GAAO,CAAA,oBAAA,EAAuB,KAAA,CAAM,IAAI,CAAA,CAAA;AAC3D,IAAA,kBAAA,CAAmB,KAAA,GAAQ,cAAA;AAG3B,IAAA,QAAA,CAAS,OAAO,kBAAkB,CAAA;AAAA,EACpC;AAEA,EAAA,OAAOC,oBAAU,CAAA,KAAA,KAAS;AACxB,IAAA,KAAA,CAAM,UAAA,CAAW,OAAA,EAAS,EAAE,cAAA,EAAgB,CAAA;AAC5C,IAAA,OAAOC,0BAAA,CAAiB,OAAO,IAAI,CAAA;AAAA,EACrC,CAAC,CAAA;AACH;AAoBO,SAAS,kBAEd,QAAA,EAE4C;AAE5C,EAAA,OAAO,CAAC,OAAY,SAAA,KAAyB;AAC3C,IAAA,MAAM,WAAA,GAAc,CAAC,CAAC,QAAA;AACtB,IAAA,MAAM,OAAA,GAAU,qBAAA,CAAsB,KAAA,EAAO,SAAA,EAAW;AAAA,MACtD,SAAA,EAAW,EAAE,OAAA,EAAS,WAAA,EAAa,MAAM,mCAAA;AAAoC,KAC9E,CAAA;AACD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,QAAA,CAAS,KAAA,EAAO,WAAW,OAAO,CAAA;AAAA,IACpC;AAAA,EACF,CAAA;AACF;;;;;;;"}
|
|
@@ -7,52 +7,38 @@ const debugBuild = require('./debug-build.js');
|
|
|
7
7
|
const error = require('./error.js');
|
|
8
8
|
const hoistNonReactStatics = require('./hoist-non-react-statics.js');
|
|
9
9
|
|
|
10
|
-
const UNKNOWN_COMPONENT =
|
|
11
|
-
|
|
10
|
+
const UNKNOWN_COMPONENT = "unknown";
|
|
12
11
|
const INITIAL_STATE = {
|
|
13
12
|
componentStack: null,
|
|
14
13
|
error: null,
|
|
15
|
-
eventId: null
|
|
14
|
+
eventId: null
|
|
16
15
|
};
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* A ErrorBoundary component that logs errors to Sentry.
|
|
20
|
-
* NOTE: If you are a Sentry user, and you are seeing this stack frame, it means the
|
|
21
|
-
* Sentry React SDK ErrorBoundary caught an error invoking your application code. This
|
|
22
|
-
* is expected behavior and NOT indicative of a bug with the Sentry React SDK.
|
|
23
|
-
*/
|
|
24
16
|
class ErrorBoundary extends React.Component {
|
|
25
|
-
|
|
26
|
-
constructor(props) {
|
|
17
|
+
constructor(props) {
|
|
27
18
|
super(props);
|
|
28
|
-
|
|
29
19
|
this.state = INITIAL_STATE;
|
|
30
20
|
this._openFallbackReportDialog = true;
|
|
31
|
-
|
|
32
21
|
const client = browser.getClient();
|
|
33
22
|
if (client && props.showDialog) {
|
|
34
23
|
this._openFallbackReportDialog = false;
|
|
35
|
-
this._cleanupHook = client.on(
|
|
24
|
+
this._cleanupHook = client.on("afterSendEvent", (event) => {
|
|
36
25
|
if (!event.type && this._lastEventId && event.event_id === this._lastEventId) {
|
|
37
26
|
browser.showReportDialog({ ...props.dialogOptions, eventId: this._lastEventId });
|
|
38
27
|
}
|
|
39
28
|
});
|
|
40
29
|
}
|
|
41
30
|
}
|
|
42
|
-
|
|
43
|
-
componentDidCatch(error$1, errorInfo) {
|
|
31
|
+
componentDidCatch(error$1, errorInfo) {
|
|
44
32
|
const { componentStack } = errorInfo;
|
|
45
33
|
const { beforeCapture, onError, showDialog, dialogOptions } = this.props;
|
|
46
|
-
browser.withScope(scope => {
|
|
34
|
+
browser.withScope((scope) => {
|
|
47
35
|
if (beforeCapture) {
|
|
48
36
|
beforeCapture(scope, error$1, componentStack);
|
|
49
37
|
}
|
|
50
|
-
|
|
51
38
|
const handled = this.props.handled != null ? this.props.handled : !!this.props.fallback;
|
|
52
39
|
const eventId = error.captureReactException(error$1, errorInfo, {
|
|
53
|
-
mechanism: { handled, type:
|
|
40
|
+
mechanism: { handled, type: "auto.function.react.error_boundary" }
|
|
54
41
|
});
|
|
55
|
-
|
|
56
42
|
if (onError) {
|
|
57
43
|
onError(error$1, componentStack, eventId);
|
|
58
44
|
}
|
|
@@ -62,104 +48,63 @@ class ErrorBoundary extends React.Component {
|
|
|
62
48
|
browser.showReportDialog({ ...dialogOptions, eventId });
|
|
63
49
|
}
|
|
64
50
|
}
|
|
65
|
-
|
|
66
|
-
// componentDidCatch is used over getDerivedStateFromError
|
|
67
|
-
// so that componentStack is accessible through state.
|
|
68
51
|
this.setState({ error: error$1, componentStack, eventId });
|
|
69
52
|
});
|
|
70
53
|
}
|
|
71
|
-
|
|
72
|
-
componentDidMount() {
|
|
54
|
+
componentDidMount() {
|
|
73
55
|
const { onMount } = this.props;
|
|
74
56
|
if (onMount) {
|
|
75
57
|
onMount();
|
|
76
58
|
}
|
|
77
59
|
}
|
|
78
|
-
|
|
79
|
-
componentWillUnmount() {
|
|
60
|
+
componentWillUnmount() {
|
|
80
61
|
const { error, componentStack, eventId } = this.state;
|
|
81
62
|
const { onUnmount } = this.props;
|
|
82
63
|
if (onUnmount) {
|
|
83
64
|
if (this.state === INITIAL_STATE) {
|
|
84
|
-
// If the error boundary never encountered an error, call onUnmount with null values
|
|
85
65
|
onUnmount(null, null, null);
|
|
86
66
|
} else {
|
|
87
|
-
// `componentStack` and `eventId` are guaranteed to be non-null here because `onUnmount` is only called
|
|
88
|
-
// when the error boundary has already encountered an error.
|
|
89
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
90
67
|
onUnmount(error, componentStack, eventId);
|
|
91
68
|
}
|
|
92
69
|
}
|
|
93
|
-
|
|
94
70
|
if (this._cleanupHook) {
|
|
95
71
|
this._cleanupHook();
|
|
96
|
-
this._cleanupHook =
|
|
72
|
+
this._cleanupHook = void 0;
|
|
97
73
|
}
|
|
98
74
|
}
|
|
99
|
-
|
|
100
|
-
resetErrorBoundary() {
|
|
75
|
+
resetErrorBoundary() {
|
|
101
76
|
const { onReset } = this.props;
|
|
102
77
|
const { error, componentStack, eventId } = this.state;
|
|
103
78
|
if (onReset) {
|
|
104
|
-
// `componentStack` and `eventId` are guaranteed to be non-null here because `onReset` is only called
|
|
105
|
-
// when the error boundary has already encountered an error.
|
|
106
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
107
79
|
onReset(error, componentStack, eventId);
|
|
108
80
|
}
|
|
109
81
|
this.setState(INITIAL_STATE);
|
|
110
82
|
}
|
|
111
|
-
|
|
112
|
-
render() {
|
|
83
|
+
render() {
|
|
113
84
|
const { fallback, children } = this.props;
|
|
114
85
|
const state = this.state;
|
|
115
|
-
|
|
116
|
-
// `componentStack` is only null in the initial state, when no error has been captured.
|
|
117
|
-
// If an error has been captured, `componentStack` will be a string.
|
|
118
|
-
// We cannot check `state.error` because null can be thrown as an error.
|
|
119
86
|
if (state.componentStack === null) {
|
|
120
|
-
return typeof children ===
|
|
87
|
+
return typeof children === "function" ? children() : children;
|
|
121
88
|
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
resetError: () => this.resetErrorBoundary(),
|
|
129
|
-
eventId: state.eventId,
|
|
130
|
-
})
|
|
131
|
-
: fallback;
|
|
132
|
-
|
|
89
|
+
const element = typeof fallback === "function" ? React.createElement(fallback, {
|
|
90
|
+
error: state.error,
|
|
91
|
+
componentStack: state.componentStack,
|
|
92
|
+
resetError: () => this.resetErrorBoundary(),
|
|
93
|
+
eventId: state.eventId
|
|
94
|
+
}) : fallback;
|
|
133
95
|
if (React.isValidElement(element)) {
|
|
134
96
|
return element;
|
|
135
97
|
}
|
|
136
|
-
|
|
137
98
|
if (fallback) {
|
|
138
|
-
debugBuild.DEBUG_BUILD && core.debug.warn(
|
|
99
|
+
debugBuild.DEBUG_BUILD && core.debug.warn("fallback did not produce a valid ReactElement");
|
|
139
100
|
}
|
|
140
|
-
|
|
141
|
-
// Fail gracefully if no fallback provided or is not valid
|
|
142
101
|
return null;
|
|
143
102
|
}
|
|
144
103
|
}
|
|
145
|
-
|
|
146
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
147
|
-
function withErrorBoundary(
|
|
148
|
-
WrappedComponent,
|
|
149
|
-
errorBoundaryOptions,
|
|
150
|
-
) {
|
|
104
|
+
function withErrorBoundary(WrappedComponent, errorBoundaryOptions) {
|
|
151
105
|
const componentDisplayName = WrappedComponent.displayName || WrappedComponent.name || UNKNOWN_COMPONENT;
|
|
152
|
-
|
|
153
|
-
const Wrapped = React.memo((props) => (
|
|
154
|
-
React.createElement(ErrorBoundary, { ...errorBoundaryOptions,}
|
|
155
|
-
, React.createElement(WrappedComponent, { ...props,} )
|
|
156
|
-
)
|
|
157
|
-
)) ;
|
|
158
|
-
|
|
106
|
+
const Wrapped = React.memo((props) => /* @__PURE__ */ React.createElement(ErrorBoundary, { ...errorBoundaryOptions }, /* @__PURE__ */ React.createElement(WrappedComponent, { ...props })));
|
|
159
107
|
Wrapped.displayName = `errorBoundary(${componentDisplayName})`;
|
|
160
|
-
|
|
161
|
-
// Copy over static methods from Wrapped component to Profiler HOC
|
|
162
|
-
// See: https://reactjs.org/docs/higher-order-components.html#static-methods-must-be-copied-over
|
|
163
108
|
hoistNonReactStatics.hoistNonReactStatics(Wrapped, WrappedComponent);
|
|
164
109
|
return Wrapped;
|
|
165
110
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errorboundary.js","sources":["../../src/errorboundary.tsx"],"sourcesContent":["import type { ReportDialogOptions } from '@sentry/browser';\nimport { getClient, showReportDialog, withScope } from '@sentry/browser';\nimport type { Scope } from '@sentry/core';\nimport { debug } from '@sentry/core';\nimport * as React from 'react';\nimport { DEBUG_BUILD } from './debug-build';\nimport { captureReactException } from './error';\nimport { hoistNonReactStatics } from './hoist-non-react-statics';\n\nexport const UNKNOWN_COMPONENT = 'unknown';\n\nexport type FallbackRender = (errorData: {\n error: unknown;\n componentStack: string;\n eventId: string;\n resetError(): void;\n}) => React.ReactElement;\n\ntype OnUnmountType = {\n (error: null, componentStack: null, eventId: null): void;\n (error: unknown, componentStack: string, eventId: string): void;\n};\n\nexport type ErrorBoundaryProps = {\n children?: React.ReactNode | (() => React.ReactNode);\n /** If a Sentry report dialog should be rendered on error */\n showDialog?: boolean | undefined;\n /**\n * Options to be passed into the Sentry report dialog.\n * No-op if {@link showDialog} is false.\n */\n dialogOptions?: ReportDialogOptions | undefined;\n /**\n * A fallback component that gets rendered when the error boundary encounters an error.\n *\n * Can either provide a React Component, or a function that returns React Component as\n * a valid fallback prop. If a function is provided, the function will be called with\n * the error, the component stack, and an function that resets the error boundary on error.\n *\n */\n fallback?: React.ReactElement | FallbackRender | undefined;\n /**\n * If set to `true` or `false`, the error `handled` property will be set to the given value.\n * If unset, the default behaviour is to rely on the presence of the `fallback` prop to determine\n * if the error was handled or not.\n */\n handled?: boolean | undefined;\n /** Called when the error boundary encounters an error */\n onError?: ((error: unknown, componentStack: string, eventId: string) => void) | undefined;\n /** Called on componentDidMount() */\n onMount?: (() => void) | undefined;\n /**\n * Called when the error boundary resets due to a reset call from the\n * fallback render props function.\n */\n onReset?: ((error: unknown, componentStack: string, eventId: string) => void) | undefined;\n /**\n * Called on componentWillUnmount() with the error, componentStack, and eventId.\n *\n * If the error boundary never encountered an error, the error\n * componentStack, and eventId will be null.\n */\n onUnmount?: OnUnmountType | undefined;\n /** Called before the error is captured by Sentry, allows for you to add tags or context using the scope */\n beforeCapture?: ((scope: Scope, error: unknown, componentStack: string) => void) | undefined;\n};\n\ntype ErrorBoundaryState =\n | {\n componentStack: null;\n error: null;\n eventId: null;\n }\n | {\n componentStack: React.ErrorInfo['componentStack'];\n error: unknown;\n eventId: string;\n };\n\nconst INITIAL_STATE: ErrorBoundaryState = {\n componentStack: null,\n error: null,\n eventId: null,\n};\n\n/**\n * A ErrorBoundary component that logs errors to Sentry.\n * NOTE: If you are a Sentry user, and you are seeing this stack frame, it means the\n * Sentry React SDK ErrorBoundary caught an error invoking your application code. This\n * is expected behavior and NOT indicative of a bug with the Sentry React SDK.\n */\nclass ErrorBoundary extends React.Component<ErrorBoundaryProps, ErrorBoundaryState> {\n public state: ErrorBoundaryState;\n\n private readonly _openFallbackReportDialog: boolean;\n\n private _lastEventId?: string;\n private _cleanupHook?: () => void;\n\n public constructor(props: ErrorBoundaryProps) {\n super(props);\n\n this.state = INITIAL_STATE;\n this._openFallbackReportDialog = true;\n\n const client = getClient();\n if (client && props.showDialog) {\n this._openFallbackReportDialog = false;\n this._cleanupHook = client.on('afterSendEvent', event => {\n if (!event.type && this._lastEventId && event.event_id === this._lastEventId) {\n showReportDialog({ ...props.dialogOptions, eventId: this._lastEventId });\n }\n });\n }\n }\n\n public componentDidCatch(error: unknown, errorInfo: React.ErrorInfo): void {\n const { componentStack } = errorInfo;\n const { beforeCapture, onError, showDialog, dialogOptions } = this.props;\n withScope(scope => {\n if (beforeCapture) {\n beforeCapture(scope, error, componentStack);\n }\n\n const handled = this.props.handled != null ? this.props.handled : !!this.props.fallback;\n const eventId = captureReactException(error, errorInfo, {\n mechanism: { handled, type: 'auto.function.react.error_boundary' },\n });\n\n if (onError) {\n onError(error, componentStack, eventId);\n }\n if (showDialog) {\n this._lastEventId = eventId;\n if (this._openFallbackReportDialog) {\n showReportDialog({ ...dialogOptions, eventId });\n }\n }\n\n // componentDidCatch is used over getDerivedStateFromError\n // so that componentStack is accessible through state.\n this.setState({ error, componentStack, eventId });\n });\n }\n\n public componentDidMount(): void {\n const { onMount } = this.props;\n if (onMount) {\n onMount();\n }\n }\n\n public componentWillUnmount(): void {\n const { error, componentStack, eventId } = this.state;\n const { onUnmount } = this.props;\n if (onUnmount) {\n if (this.state === INITIAL_STATE) {\n // If the error boundary never encountered an error, call onUnmount with null values\n onUnmount(null, null, null);\n } else {\n // `componentStack` and `eventId` are guaranteed to be non-null here because `onUnmount` is only called\n // when the error boundary has already encountered an error.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n onUnmount(error, componentStack!, eventId!);\n }\n }\n\n if (this._cleanupHook) {\n this._cleanupHook();\n this._cleanupHook = undefined;\n }\n }\n\n public resetErrorBoundary(): void {\n const { onReset } = this.props;\n const { error, componentStack, eventId } = this.state;\n if (onReset) {\n // `componentStack` and `eventId` are guaranteed to be non-null here because `onReset` is only called\n // when the error boundary has already encountered an error.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n onReset(error, componentStack!, eventId!);\n }\n this.setState(INITIAL_STATE);\n }\n\n public render(): React.ReactNode {\n const { fallback, children } = this.props;\n const state = this.state;\n\n // `componentStack` is only null in the initial state, when no error has been captured.\n // If an error has been captured, `componentStack` will be a string.\n // We cannot check `state.error` because null can be thrown as an error.\n if (state.componentStack === null) {\n return typeof children === 'function' ? children() : children;\n }\n\n const element =\n typeof fallback === 'function'\n ? React.createElement(fallback, {\n error: state.error,\n componentStack: state.componentStack,\n resetError: () => this.resetErrorBoundary(),\n eventId: state.eventId,\n })\n : fallback;\n\n if (React.isValidElement(element)) {\n return element;\n }\n\n if (fallback) {\n DEBUG_BUILD && debug.warn('fallback did not produce a valid ReactElement');\n }\n\n // Fail gracefully if no fallback provided or is not valid\n return null;\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction withErrorBoundary<P extends Record<string, any>>(\n WrappedComponent: React.ComponentType<P>,\n errorBoundaryOptions: ErrorBoundaryProps,\n): React.FC<P> {\n const componentDisplayName = WrappedComponent.displayName || WrappedComponent.name || UNKNOWN_COMPONENT;\n\n const Wrapped = React.memo((props: P) => (\n <ErrorBoundary {...errorBoundaryOptions}>\n <WrappedComponent {...props} />\n </ErrorBoundary>\n )) as unknown as React.FC<P>;\n\n Wrapped.displayName = `errorBoundary(${componentDisplayName})`;\n\n // Copy over static methods from Wrapped component to Profiler HOC\n // See: https://reactjs.org/docs/higher-order-components.html#static-methods-must-be-copied-over\n hoistNonReactStatics(Wrapped, WrappedComponent);\n return Wrapped;\n}\n\nexport { ErrorBoundary, withErrorBoundary };\n"],"names":["getClient","showReportDialog","error","withScope","captureReactException","DEBUG_BUILD","debug","hoistNonReactStatics"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"errorboundary.js","sources":["../../src/errorboundary.tsx"],"sourcesContent":["import type { ReportDialogOptions } from '@sentry/browser';\nimport { getClient, showReportDialog, withScope } from '@sentry/browser';\nimport type { Scope } from '@sentry/core';\nimport { debug } from '@sentry/core';\nimport * as React from 'react';\nimport { DEBUG_BUILD } from './debug-build';\nimport { captureReactException } from './error';\nimport { hoistNonReactStatics } from './hoist-non-react-statics';\n\nexport const UNKNOWN_COMPONENT = 'unknown';\n\nexport type FallbackRender = (errorData: {\n error: unknown;\n componentStack: string;\n eventId: string;\n resetError(): void;\n}) => React.ReactElement;\n\ntype OnUnmountType = {\n (error: null, componentStack: null, eventId: null): void;\n (error: unknown, componentStack: string, eventId: string): void;\n};\n\nexport type ErrorBoundaryProps = {\n children?: React.ReactNode | (() => React.ReactNode);\n /** If a Sentry report dialog should be rendered on error */\n showDialog?: boolean | undefined;\n /**\n * Options to be passed into the Sentry report dialog.\n * No-op if {@link showDialog} is false.\n */\n dialogOptions?: ReportDialogOptions | undefined;\n /**\n * A fallback component that gets rendered when the error boundary encounters an error.\n *\n * Can either provide a React Component, or a function that returns React Component as\n * a valid fallback prop. If a function is provided, the function will be called with\n * the error, the component stack, and an function that resets the error boundary on error.\n *\n */\n fallback?: React.ReactElement | FallbackRender | undefined;\n /**\n * If set to `true` or `false`, the error `handled` property will be set to the given value.\n * If unset, the default behaviour is to rely on the presence of the `fallback` prop to determine\n * if the error was handled or not.\n */\n handled?: boolean | undefined;\n /** Called when the error boundary encounters an error */\n onError?: ((error: unknown, componentStack: string, eventId: string) => void) | undefined;\n /** Called on componentDidMount() */\n onMount?: (() => void) | undefined;\n /**\n * Called when the error boundary resets due to a reset call from the\n * fallback render props function.\n */\n onReset?: ((error: unknown, componentStack: string, eventId: string) => void) | undefined;\n /**\n * Called on componentWillUnmount() with the error, componentStack, and eventId.\n *\n * If the error boundary never encountered an error, the error\n * componentStack, and eventId will be null.\n */\n onUnmount?: OnUnmountType | undefined;\n /** Called before the error is captured by Sentry, allows for you to add tags or context using the scope */\n beforeCapture?: ((scope: Scope, error: unknown, componentStack: string) => void) | undefined;\n};\n\ntype ErrorBoundaryState =\n | {\n componentStack: null;\n error: null;\n eventId: null;\n }\n | {\n componentStack: React.ErrorInfo['componentStack'];\n error: unknown;\n eventId: string;\n };\n\nconst INITIAL_STATE: ErrorBoundaryState = {\n componentStack: null,\n error: null,\n eventId: null,\n};\n\n/**\n * A ErrorBoundary component that logs errors to Sentry.\n * NOTE: If you are a Sentry user, and you are seeing this stack frame, it means the\n * Sentry React SDK ErrorBoundary caught an error invoking your application code. This\n * is expected behavior and NOT indicative of a bug with the Sentry React SDK.\n */\nclass ErrorBoundary extends React.Component<ErrorBoundaryProps, ErrorBoundaryState> {\n public state: ErrorBoundaryState;\n\n private readonly _openFallbackReportDialog: boolean;\n\n private _lastEventId?: string;\n private _cleanupHook?: () => void;\n\n public constructor(props: ErrorBoundaryProps) {\n super(props);\n\n this.state = INITIAL_STATE;\n this._openFallbackReportDialog = true;\n\n const client = getClient();\n if (client && props.showDialog) {\n this._openFallbackReportDialog = false;\n this._cleanupHook = client.on('afterSendEvent', event => {\n if (!event.type && this._lastEventId && event.event_id === this._lastEventId) {\n showReportDialog({ ...props.dialogOptions, eventId: this._lastEventId });\n }\n });\n }\n }\n\n public componentDidCatch(error: unknown, errorInfo: React.ErrorInfo): void {\n const { componentStack } = errorInfo;\n const { beforeCapture, onError, showDialog, dialogOptions } = this.props;\n withScope(scope => {\n if (beforeCapture) {\n beforeCapture(scope, error, componentStack);\n }\n\n const handled = this.props.handled != null ? this.props.handled : !!this.props.fallback;\n const eventId = captureReactException(error, errorInfo, {\n mechanism: { handled, type: 'auto.function.react.error_boundary' },\n });\n\n if (onError) {\n onError(error, componentStack, eventId);\n }\n if (showDialog) {\n this._lastEventId = eventId;\n if (this._openFallbackReportDialog) {\n showReportDialog({ ...dialogOptions, eventId });\n }\n }\n\n // componentDidCatch is used over getDerivedStateFromError\n // so that componentStack is accessible through state.\n this.setState({ error, componentStack, eventId });\n });\n }\n\n public componentDidMount(): void {\n const { onMount } = this.props;\n if (onMount) {\n onMount();\n }\n }\n\n public componentWillUnmount(): void {\n const { error, componentStack, eventId } = this.state;\n const { onUnmount } = this.props;\n if (onUnmount) {\n if (this.state === INITIAL_STATE) {\n // If the error boundary never encountered an error, call onUnmount with null values\n onUnmount(null, null, null);\n } else {\n // `componentStack` and `eventId` are guaranteed to be non-null here because `onUnmount` is only called\n // when the error boundary has already encountered an error.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n onUnmount(error, componentStack!, eventId!);\n }\n }\n\n if (this._cleanupHook) {\n this._cleanupHook();\n this._cleanupHook = undefined;\n }\n }\n\n public resetErrorBoundary(): void {\n const { onReset } = this.props;\n const { error, componentStack, eventId } = this.state;\n if (onReset) {\n // `componentStack` and `eventId` are guaranteed to be non-null here because `onReset` is only called\n // when the error boundary has already encountered an error.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n onReset(error, componentStack!, eventId!);\n }\n this.setState(INITIAL_STATE);\n }\n\n public render(): React.ReactNode {\n const { fallback, children } = this.props;\n const state = this.state;\n\n // `componentStack` is only null in the initial state, when no error has been captured.\n // If an error has been captured, `componentStack` will be a string.\n // We cannot check `state.error` because null can be thrown as an error.\n if (state.componentStack === null) {\n return typeof children === 'function' ? children() : children;\n }\n\n const element =\n typeof fallback === 'function'\n ? React.createElement(fallback, {\n error: state.error,\n componentStack: state.componentStack,\n resetError: () => this.resetErrorBoundary(),\n eventId: state.eventId,\n })\n : fallback;\n\n if (React.isValidElement(element)) {\n return element;\n }\n\n if (fallback) {\n DEBUG_BUILD && debug.warn('fallback did not produce a valid ReactElement');\n }\n\n // Fail gracefully if no fallback provided or is not valid\n return null;\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction withErrorBoundary<P extends Record<string, any>>(\n WrappedComponent: React.ComponentType<P>,\n errorBoundaryOptions: ErrorBoundaryProps,\n): React.FC<P> {\n const componentDisplayName = WrappedComponent.displayName || WrappedComponent.name || UNKNOWN_COMPONENT;\n\n const Wrapped = React.memo((props: P) => (\n <ErrorBoundary {...errorBoundaryOptions}>\n <WrappedComponent {...props} />\n </ErrorBoundary>\n )) as unknown as React.FC<P>;\n\n Wrapped.displayName = `errorBoundary(${componentDisplayName})`;\n\n // Copy over static methods from Wrapped component to Profiler HOC\n // See: https://reactjs.org/docs/higher-order-components.html#static-methods-must-be-copied-over\n hoistNonReactStatics(Wrapped, WrappedComponent);\n return Wrapped;\n}\n\nexport { ErrorBoundary, withErrorBoundary };\n"],"names":["getClient","showReportDialog","error","withScope","captureReactException","DEBUG_BUILD","debug","hoistNonReactStatics"],"mappings":"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"}
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
2
|
|
|
3
|
-
/**
|
|
4
|
-
* React statics that should not be hoisted
|
|
5
|
-
*/
|
|
6
3
|
const REACT_STATICS = {
|
|
7
4
|
childContextTypes: true,
|
|
8
5
|
contextType: true,
|
|
@@ -14,12 +11,8 @@ const REACT_STATICS = {
|
|
|
14
11
|
getDerivedStateFromProps: true,
|
|
15
12
|
mixins: true,
|
|
16
13
|
propTypes: true,
|
|
17
|
-
type: true
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Known JavaScript function statics that should not be hoisted
|
|
22
|
-
*/
|
|
14
|
+
type: true
|
|
15
|
+
};
|
|
23
16
|
const KNOWN_STATICS = {
|
|
24
17
|
name: true,
|
|
25
18
|
length: true,
|
|
@@ -27,131 +20,70 @@ const KNOWN_STATICS = {
|
|
|
27
20
|
caller: true,
|
|
28
21
|
callee: true,
|
|
29
22
|
arguments: true,
|
|
30
|
-
arity: true
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Statics specific to ForwardRef components
|
|
35
|
-
*/
|
|
23
|
+
arity: true
|
|
24
|
+
};
|
|
36
25
|
const FORWARD_REF_STATICS = {
|
|
37
26
|
$$typeof: true,
|
|
38
27
|
render: true,
|
|
39
28
|
defaultProps: true,
|
|
40
29
|
displayName: true,
|
|
41
|
-
propTypes: true
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Statics specific to Memo components
|
|
46
|
-
*/
|
|
30
|
+
propTypes: true
|
|
31
|
+
};
|
|
47
32
|
const MEMO_STATICS = {
|
|
48
33
|
$$typeof: true,
|
|
49
34
|
compare: true,
|
|
50
35
|
defaultProps: true,
|
|
51
36
|
displayName: true,
|
|
52
37
|
propTypes: true,
|
|
53
|
-
type: true
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
* Inlined react-is utilities
|
|
58
|
-
* We only need to detect ForwardRef and Memo types
|
|
59
|
-
*/
|
|
60
|
-
const ForwardRefType = Symbol.for('react.forward_ref');
|
|
61
|
-
const MemoType = Symbol.for('react.memo');
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Check if a component is a Memo component
|
|
65
|
-
*/
|
|
38
|
+
type: true
|
|
39
|
+
};
|
|
40
|
+
const ForwardRefType = /* @__PURE__ */ Symbol.for("react.forward_ref");
|
|
41
|
+
const MemoType = /* @__PURE__ */ Symbol.for("react.memo");
|
|
66
42
|
function isMemo(component) {
|
|
67
|
-
return
|
|
68
|
-
typeof component === 'object' && component !== null && (component ).$$typeof === MemoType
|
|
69
|
-
);
|
|
43
|
+
return typeof component === "object" && component !== null && component.$$typeof === MemoType;
|
|
70
44
|
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Map of React component types to their specific statics
|
|
74
|
-
*/
|
|
75
45
|
const TYPE_STATICS = {};
|
|
76
46
|
TYPE_STATICS[ForwardRefType] = FORWARD_REF_STATICS;
|
|
77
47
|
TYPE_STATICS[MemoType] = MEMO_STATICS;
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Get the appropriate statics object for a given component
|
|
81
|
-
*/
|
|
82
48
|
function getStatics(component) {
|
|
83
|
-
// React v16.11 and below
|
|
84
49
|
if (isMemo(component)) {
|
|
85
50
|
return MEMO_STATICS;
|
|
86
51
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
const componentType = (component ).$$typeof;
|
|
90
|
-
return (componentType && TYPE_STATICS[componentType]) || REACT_STATICS;
|
|
52
|
+
const componentType = component.$$typeof;
|
|
53
|
+
return componentType && TYPE_STATICS[componentType] || REACT_STATICS;
|
|
91
54
|
}
|
|
92
|
-
|
|
93
55
|
const defineProperty = Object.defineProperty.bind(Object);
|
|
94
56
|
const getOwnPropertyNames = Object.getOwnPropertyNames.bind(Object);
|
|
95
57
|
const getOwnPropertySymbols = Object.getOwnPropertySymbols?.bind(Object);
|
|
96
58
|
const getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor.bind(Object);
|
|
97
59
|
const getPrototypeOf = Object.getPrototypeOf.bind(Object);
|
|
98
60
|
const objectPrototype = Object.prototype;
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
* Copies non-react specific statics from a child component to a parent component.
|
|
102
|
-
* Similar to Object.assign, but copies all static properties from source to target,
|
|
103
|
-
* excluding React-specific statics and known JavaScript statics.
|
|
104
|
-
*
|
|
105
|
-
* @param targetComponent - The component to copy statics to
|
|
106
|
-
* @param sourceComponent - The component to copy statics from
|
|
107
|
-
* @param excludelist - An optional object of keys to exclude from hoisting
|
|
108
|
-
* @returns The target component with hoisted statics
|
|
109
|
-
*/
|
|
110
|
-
function hoistNonReactStatics
|
|
111
|
-
|
|
112
|
-
(targetComponent, sourceComponent, excludelist) {
|
|
113
|
-
if (typeof sourceComponent !== 'string') {
|
|
114
|
-
// Don't hoist over string (html) components
|
|
61
|
+
function hoistNonReactStatics(targetComponent, sourceComponent, excludelist) {
|
|
62
|
+
if (typeof sourceComponent !== "string") {
|
|
115
63
|
if (objectPrototype) {
|
|
116
64
|
const inheritedComponent = getPrototypeOf(sourceComponent);
|
|
117
|
-
|
|
118
65
|
if (inheritedComponent && inheritedComponent !== objectPrototype) {
|
|
119
66
|
hoistNonReactStatics(targetComponent, inheritedComponent);
|
|
120
67
|
}
|
|
121
68
|
}
|
|
122
|
-
|
|
123
69
|
let keys = getOwnPropertyNames(sourceComponent);
|
|
124
|
-
|
|
125
70
|
if (getOwnPropertySymbols) {
|
|
126
71
|
keys = keys.concat(getOwnPropertySymbols(sourceComponent));
|
|
127
72
|
}
|
|
128
|
-
|
|
129
73
|
const targetStatics = getStatics(targetComponent);
|
|
130
74
|
const sourceStatics = getStatics(sourceComponent);
|
|
131
|
-
|
|
132
75
|
for (const key of keys) {
|
|
133
|
-
|
|
134
|
-
if (
|
|
135
|
-
!KNOWN_STATICS[key ] &&
|
|
136
|
-
true &&
|
|
137
|
-
!sourceStatics?.[key ] &&
|
|
138
|
-
!targetStatics?.[key ] &&
|
|
139
|
-
!getOwnPropertyDescriptor(targetComponent, key) // Don't overwrite existing properties
|
|
140
|
-
) {
|
|
76
|
+
if (!KNOWN_STATICS[key] && true && !sourceStatics?.[key] && !targetStatics?.[key] && !getOwnPropertyDescriptor(targetComponent, key)) {
|
|
141
77
|
const descriptor = getOwnPropertyDescriptor(sourceComponent, key);
|
|
142
|
-
|
|
143
78
|
if (descriptor) {
|
|
144
79
|
try {
|
|
145
|
-
// Avoid failures from read-only properties
|
|
146
80
|
defineProperty(targetComponent, key, descriptor);
|
|
147
81
|
} catch (_e) {
|
|
148
|
-
// Silently ignore errors
|
|
149
82
|
}
|
|
150
83
|
}
|
|
151
84
|
}
|
|
152
85
|
}
|
|
153
86
|
}
|
|
154
|
-
|
|
155
87
|
return targetComponent;
|
|
156
88
|
}
|
|
157
89
|
|