@sentry/react 7.91.0 → 7.93.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/cjs/errorboundary.js +3 -2
- package/cjs/errorboundary.js.map +1 -1
- package/cjs/profiler.js +8 -2
- package/cjs/profiler.js.map +1 -1
- package/cjs/reactrouter.js +4 -2
- package/cjs/reactrouter.js.map +1 -1
- package/cjs/reactrouterv6.js +6 -3
- package/cjs/reactrouterv6.js.map +1 -1
- package/esm/errorboundary.js +3 -2
- package/esm/errorboundary.js.map +1 -1
- package/esm/profiler.js +8 -2
- package/esm/profiler.js.map +1 -1
- package/esm/reactrouter.js +4 -2
- package/esm/reactrouter.js.map +1 -1
- package/esm/reactrouterv6.js +6 -3
- package/esm/reactrouterv6.js.map +1 -1
- package/package.json +11 -4
- package/types/errorboundary.d.ts +1 -1
- package/types/errorboundary.d.ts.map +1 -1
- package/types/profiler.d.ts.map +1 -1
- package/types/reactrouter.d.ts.map +1 -1
- package/types/reactrouterv6.d.ts.map +1 -1
- package/types-ts3.8/errorboundary.d.ts +1 -1
package/cjs/errorboundary.js
CHANGED
|
@@ -75,6 +75,7 @@ class ErrorBoundary extends React__namespace.Component {
|
|
|
75
75
|
this._openFallbackReportDialog = false;
|
|
76
76
|
client.on('afterSendEvent', event => {
|
|
77
77
|
if (!event.type && event.event_id === this._lastEventId) {
|
|
78
|
+
// eslint-disable-next-line deprecation/deprecation
|
|
78
79
|
browser.showReportDialog({ ...props.dialogOptions, eventId: this._lastEventId });
|
|
79
80
|
}
|
|
80
81
|
});
|
|
@@ -197,8 +198,8 @@ function withErrorBoundary(
|
|
|
197
198
|
const componentDisplayName = WrappedComponent.displayName || WrappedComponent.name || UNKNOWN_COMPONENT;
|
|
198
199
|
|
|
199
200
|
const Wrapped = (props) => (
|
|
200
|
-
React__namespace.createElement(ErrorBoundary, { ...errorBoundaryOptions, __self: this, __source: {fileName: _jsxFileName, lineNumber:
|
|
201
|
-
, React__namespace.createElement(WrappedComponent, { ...props, __self: this, __source: {fileName: _jsxFileName, lineNumber:
|
|
201
|
+
React__namespace.createElement(ErrorBoundary, { ...errorBoundaryOptions, __self: this, __source: {fileName: _jsxFileName, lineNumber: 238}}
|
|
202
|
+
, React__namespace.createElement(WrappedComponent, { ...props, __self: this, __source: {fileName: _jsxFileName, lineNumber: 239}} )
|
|
202
203
|
)
|
|
203
204
|
);
|
|
204
205
|
|
package/cjs/errorboundary.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errorboundary.js","sources":["../../src/errorboundary.tsx"],"sourcesContent":["import type { ReportDialogOptions, Scope } from '@sentry/browser';\nimport { captureException, getClient, showReportDialog, withScope } from '@sentry/browser';\nimport { isError, logger } from '@sentry/utils';\nimport hoistNonReactStatics from 'hoist-non-react-statics';\nimport * as React from 'react';\n\nimport { DEBUG_BUILD } from './debug-build';\n\nexport function isAtLeastReact17(version: string): boolean {\n const major = version.match(/^([^.]+)/);\n return major !== null && parseInt(major[0]) >= 17;\n}\n\nexport const UNKNOWN_COMPONENT = 'unknown';\n\nexport type FallbackRender = (errorData: {\n error: Error;\n componentStack: string;\n eventId: string;\n resetError(): void;\n}) => React.ReactElement;\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 /** Called when the error boundary encounters an error */\n onError?: ((error: Error, componentStack: string, eventId: string) => void) | undefined;\n /** Called on componentDidMount() */\n onMount?: (() => void) | undefined;\n /** Called if resetError() is called from the fallback render props function */\n onReset?: ((error: Error | null, componentStack: string | null, eventId: string | null) => void) | undefined;\n /** Called on componentWillUnmount() */\n onUnmount?: ((error: Error | null, componentStack: string | null, eventId: string | null) => void) | 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: Error | null, componentStack: string | null) => 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: Error;\n eventId: string;\n };\n\nconst INITIAL_STATE = {\n componentStack: null,\n error: null,\n eventId: null,\n};\n\nfunction setCause(error: Error & { cause?: Error }, cause: Error): void {\n const seenErrors = new WeakMap<Error, boolean>();\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.set(error, true);\n return recurse(error.cause, cause);\n }\n error.cause = cause;\n }\n\n recurse(error, cause);\n}\n\n/**\n * A ErrorBoundary component that logs errors to Sentry. Requires React >= 16.\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\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 && client.on && props.showDialog) {\n this._openFallbackReportDialog = false;\n client.on('afterSendEvent', event => {\n if (!event.type && event.event_id === this._lastEventId) {\n showReportDialog({ ...props.dialogOptions, eventId: this._lastEventId });\n }\n });\n }\n }\n\n public componentDidCatch(error: Error & { cause?: Error }, { componentStack }: React.ErrorInfo): void {\n const { beforeCapture, onError, showDialog, dialogOptions } = this.props;\n withScope(scope => {\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(React.version) && isError(error)) {\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 if (beforeCapture) {\n beforeCapture(scope, error, componentStack);\n }\n\n const eventId = captureException(error, {\n captureContext: {\n contexts: { react: { componentStack } },\n },\n mechanism: { handled: false },\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 onUnmount(error, componentStack, eventId);\n }\n }\n\n public resetErrorBoundary: () => void = () => {\n const { onReset } = this.props;\n const { error, componentStack, eventId } = this.state;\n if (onReset) {\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 if (state.error) {\n let element: React.ReactElement | undefined = undefined;\n if (typeof fallback === 'function') {\n element = fallback({\n error: state.error,\n componentStack: state.componentStack,\n resetError: this.resetErrorBoundary,\n eventId: state.eventId,\n });\n } else {\n element = fallback;\n }\n\n if (React.isValidElement(element)) {\n return element;\n }\n\n if (fallback) {\n DEBUG_BUILD && logger.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 if (typeof children === 'function') {\n return (children as () => React.ReactNode)();\n }\n return children;\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 // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const componentDisplayName = WrappedComponent.displayName || WrappedComponent.name || UNKNOWN_COMPONENT;\n\n const Wrapped: React.FC<P> = (props: P) => (\n <ErrorBoundary {...errorBoundaryOptions}>\n <WrappedComponent {...props} />\n </ErrorBoundary>\n );\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\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":["React","getClient","showReportDialog","withScope","isError","captureException","DEBUG_BUILD","logger","hoistNonReactStatics"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"errorboundary.js","sources":["../../src/errorboundary.tsx"],"sourcesContent":["import type { ReportDialogOptions, Scope } from '@sentry/browser';\nimport { captureException, getClient, showReportDialog, withScope } from '@sentry/browser';\nimport { isError, logger } from '@sentry/utils';\nimport hoistNonReactStatics from 'hoist-non-react-statics';\nimport * as React from 'react';\n\nimport { DEBUG_BUILD } from './debug-build';\n\nexport function isAtLeastReact17(version: string): boolean {\n const major = version.match(/^([^.]+)/);\n return major !== null && parseInt(major[0]) >= 17;\n}\n\nexport const UNKNOWN_COMPONENT = 'unknown';\n\nexport type FallbackRender = (errorData: {\n error: Error;\n componentStack: string;\n eventId: string;\n resetError(): void;\n}) => React.ReactElement;\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 // eslint-disable-next-line deprecation/deprecation\n dialogOptions?: Omit<ReportDialogOptions, 'eventId'> | 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 /** Called when the error boundary encounters an error */\n onError?: ((error: Error, componentStack: string, eventId: string) => void) | undefined;\n /** Called on componentDidMount() */\n onMount?: (() => void) | undefined;\n /** Called if resetError() is called from the fallback render props function */\n onReset?: ((error: Error | null, componentStack: string | null, eventId: string | null) => void) | undefined;\n /** Called on componentWillUnmount() */\n onUnmount?: ((error: Error | null, componentStack: string | null, eventId: string | null) => void) | 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: Error | null, componentStack: string | null) => 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: Error;\n eventId: string;\n };\n\nconst INITIAL_STATE = {\n componentStack: null,\n error: null,\n eventId: null,\n};\n\nfunction setCause(error: Error & { cause?: Error }, cause: Error): void {\n const seenErrors = new WeakMap<Error, boolean>();\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.set(error, true);\n return recurse(error.cause, cause);\n }\n error.cause = cause;\n }\n\n recurse(error, cause);\n}\n\n/**\n * A ErrorBoundary component that logs errors to Sentry. Requires React >= 16.\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\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 && client.on && props.showDialog) {\n this._openFallbackReportDialog = false;\n client.on('afterSendEvent', event => {\n if (!event.type && event.event_id === this._lastEventId) {\n // eslint-disable-next-line deprecation/deprecation\n showReportDialog({ ...props.dialogOptions, eventId: this._lastEventId });\n }\n });\n }\n }\n\n public componentDidCatch(error: Error & { cause?: Error }, { componentStack }: React.ErrorInfo): void {\n const { beforeCapture, onError, showDialog, dialogOptions } = this.props;\n withScope(scope => {\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(React.version) && isError(error)) {\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 if (beforeCapture) {\n beforeCapture(scope, error, componentStack);\n }\n\n const eventId = captureException(error, {\n captureContext: {\n contexts: { react: { componentStack } },\n },\n mechanism: { handled: false },\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 onUnmount(error, componentStack, eventId);\n }\n }\n\n public resetErrorBoundary: () => void = () => {\n const { onReset } = this.props;\n const { error, componentStack, eventId } = this.state;\n if (onReset) {\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 if (state.error) {\n let element: React.ReactElement | undefined = undefined;\n if (typeof fallback === 'function') {\n element = fallback({\n error: state.error,\n componentStack: state.componentStack,\n resetError: this.resetErrorBoundary,\n eventId: state.eventId,\n });\n } else {\n element = fallback;\n }\n\n if (React.isValidElement(element)) {\n return element;\n }\n\n if (fallback) {\n DEBUG_BUILD && logger.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 if (typeof children === 'function') {\n return (children as () => React.ReactNode)();\n }\n return children;\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 // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const componentDisplayName = WrappedComponent.displayName || WrappedComponent.name || UNKNOWN_COMPONENT;\n\n const Wrapped: React.FC<P> = (props: P) => (\n <ErrorBoundary {...errorBoundaryOptions}>\n <WrappedComponent {...props} />\n </ErrorBoundary>\n );\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\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":["React","getClient","showReportDialog","withScope","isError","captureException","DEBUG_BUILD","logger","hoistNonReactStatics"],"mappings":"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"}
|
package/cjs/profiler.js
CHANGED
|
@@ -58,6 +58,7 @@ class Profiler extends React__namespace.Component {
|
|
|
58
58
|
|
|
59
59
|
const activeTransaction = getActiveTransaction();
|
|
60
60
|
if (activeTransaction) {
|
|
61
|
+
// eslint-disable-next-line deprecation/deprecation
|
|
61
62
|
this._mountSpan = activeTransaction.startChild({
|
|
62
63
|
description: `<${name}>`,
|
|
63
64
|
op: constants.REACT_MOUNT_OP,
|
|
@@ -84,6 +85,7 @@ class Profiler extends React__namespace.Component {
|
|
|
84
85
|
const changedProps = Object.keys(updateProps).filter(k => updateProps[k] !== this.props.updateProps[k]);
|
|
85
86
|
if (changedProps.length > 0) {
|
|
86
87
|
const now = utils.timestampInSeconds();
|
|
88
|
+
// eslint-disable-next-line deprecation/deprecation
|
|
87
89
|
this._updateSpan = this._mountSpan.startChild({
|
|
88
90
|
data: {
|
|
89
91
|
changedProps,
|
|
@@ -115,6 +117,7 @@ class Profiler extends React__namespace.Component {
|
|
|
115
117
|
if (this._mountSpan && includeRender) {
|
|
116
118
|
// If we were able to obtain the spanId of the mount activity, we should set the
|
|
117
119
|
// next activity as a child to the component mount activity.
|
|
120
|
+
// eslint-disable-next-line deprecation/deprecation
|
|
118
121
|
this._mountSpan.startChild({
|
|
119
122
|
description: `<${name}>`,
|
|
120
123
|
endTimestamp: utils.timestampInSeconds(),
|
|
@@ -148,8 +151,8 @@ function withProfiler(
|
|
|
148
151
|
(options && options.name) || WrappedComponent.displayName || WrappedComponent.name || UNKNOWN_COMPONENT;
|
|
149
152
|
|
|
150
153
|
const Wrapped = (props) => (
|
|
151
|
-
React__namespace.createElement(Profiler, { ...options, name: componentDisplayName, updateProps: props, __self: this, __source: {fileName: _jsxFileName, lineNumber:
|
|
152
|
-
, React__namespace.createElement(WrappedComponent, { ...props, __self: this, __source: {fileName: _jsxFileName, lineNumber:
|
|
154
|
+
React__namespace.createElement(Profiler, { ...options, name: componentDisplayName, updateProps: props, __self: this, __source: {fileName: _jsxFileName, lineNumber: 155}}
|
|
155
|
+
, React__namespace.createElement(WrappedComponent, { ...props, __self: this, __source: {fileName: _jsxFileName, lineNumber: 156}} )
|
|
153
156
|
)
|
|
154
157
|
);
|
|
155
158
|
|
|
@@ -182,6 +185,7 @@ function useProfiler(
|
|
|
182
185
|
|
|
183
186
|
const activeTransaction = getActiveTransaction();
|
|
184
187
|
if (activeTransaction) {
|
|
188
|
+
// eslint-disable-next-line deprecation/deprecation
|
|
185
189
|
return activeTransaction.startChild({
|
|
186
190
|
description: `<${name}>`,
|
|
187
191
|
op: constants.REACT_MOUNT_OP,
|
|
@@ -200,6 +204,7 @@ function useProfiler(
|
|
|
200
204
|
|
|
201
205
|
return () => {
|
|
202
206
|
if (mountSpan && options.hasRenderSpan) {
|
|
207
|
+
// eslint-disable-next-line deprecation/deprecation
|
|
203
208
|
mountSpan.startChild({
|
|
204
209
|
description: `<${name}>`,
|
|
205
210
|
endTimestamp: utils.timestampInSeconds(),
|
|
@@ -219,6 +224,7 @@ function useProfiler(
|
|
|
219
224
|
function getActiveTransaction(hub = browser.getCurrentHub()) {
|
|
220
225
|
if (hub) {
|
|
221
226
|
const scope = hub.getScope();
|
|
227
|
+
// eslint-disable-next-line deprecation/deprecation
|
|
222
228
|
return scope.getTransaction() ;
|
|
223
229
|
}
|
|
224
230
|
|
package/cjs/profiler.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profiler.js","sources":["../../src/profiler.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { Hub } from '@sentry/browser';\nimport { getCurrentHub } from '@sentry/browser';\nimport type { Span, Transaction } from '@sentry/types';\nimport { timestampInSeconds } from '@sentry/utils';\nimport hoistNonReactStatics from 'hoist-non-react-statics';\nimport * as React from 'react';\n\nimport { REACT_MOUNT_OP, REACT_RENDER_OP, REACT_UPDATE_OP } from './constants';\n\nexport const UNKNOWN_COMPONENT = 'unknown';\n\nexport type ProfilerProps = {\n // The name of the component being profiled.\n name: string;\n // If the Profiler is disabled. False by default. This is useful if you want to disable profilers\n // in certain environments.\n disabled?: boolean;\n // If time component is on page should be displayed as spans. True by default.\n includeRender?: boolean;\n // If component updates should be displayed as spans. True by default.\n includeUpdates?: boolean;\n // Component that is being profiled.\n children?: React.ReactNode;\n // props given to component being profiled.\n updateProps: { [key: string]: unknown };\n};\n\n/**\n * The Profiler component leverages Sentry's Tracing integration to generate\n * spans based on component lifecycles.\n */\nclass Profiler extends React.Component<ProfilerProps> {\n /**\n * The span of the mount activity\n * Made protected for the React Native SDK to access\n */\n protected _mountSpan: Span | undefined;\n /**\n * The span that represents the duration of time between shouldComponentUpdate and componentDidUpdate\n */\n protected _updateSpan: Span | undefined;\n\n // eslint-disable-next-line @typescript-eslint/member-ordering\n public static defaultProps: Partial<ProfilerProps> = {\n disabled: false,\n includeRender: true,\n includeUpdates: true,\n };\n\n public constructor(props: ProfilerProps) {\n super(props);\n const { name, disabled = false } = this.props;\n\n if (disabled) {\n return;\n }\n\n const activeTransaction = getActiveTransaction();\n if (activeTransaction) {\n this._mountSpan = activeTransaction.startChild({\n description: `<${name}>`,\n op: REACT_MOUNT_OP,\n origin: 'auto.ui.react.profiler',\n data: { 'ui.component_name': name },\n });\n }\n }\n\n // If a component mounted, we can finish the mount activity.\n public componentDidMount(): void {\n if (this._mountSpan) {\n this._mountSpan.end();\n }\n }\n\n public shouldComponentUpdate({ updateProps, includeUpdates = true }: ProfilerProps): boolean {\n // Only generate an update span if includeUpdates is true, if there is a valid mountSpan,\n // and if the updateProps have changed. It is ok to not do a deep equality check here as it is expensive.\n // We are just trying to give baseline clues for further investigation.\n if (includeUpdates && this._mountSpan && updateProps !== this.props.updateProps) {\n // See what props haved changed between the previous props, and the current props. This is\n // set as data on the span. We just store the prop keys as the values could be potenially very large.\n const changedProps = Object.keys(updateProps).filter(k => updateProps[k] !== this.props.updateProps[k]);\n if (changedProps.length > 0) {\n const now = timestampInSeconds();\n this._updateSpan = this._mountSpan.startChild({\n data: {\n changedProps,\n 'ui.component_name': this.props.name,\n },\n description: `<${this.props.name}>`,\n op: REACT_UPDATE_OP,\n origin: 'auto.ui.react.profiler',\n startTimestamp: now,\n });\n }\n }\n\n return true;\n }\n\n public componentDidUpdate(): void {\n if (this._updateSpan) {\n this._updateSpan.end();\n this._updateSpan = undefined;\n }\n }\n\n // If a component is unmounted, we can say it is no longer on the screen.\n // This means we can finish the span representing the component render.\n public componentWillUnmount(): void {\n const { name, includeRender = true } = this.props;\n\n if (this._mountSpan && includeRender) {\n // If we were able to obtain the spanId of the mount activity, we should set the\n // next activity as a child to the component mount activity.\n this._mountSpan.startChild({\n description: `<${name}>`,\n endTimestamp: timestampInSeconds(),\n op: REACT_RENDER_OP,\n origin: 'auto.ui.react.profiler',\n startTimestamp: this._mountSpan.endTimestamp,\n data: { 'ui.component_name': name },\n });\n }\n }\n\n public render(): React.ReactNode {\n return this.props.children;\n }\n}\n\n/**\n * withProfiler is a higher order component that wraps a\n * component in a {@link Profiler} component. It is recommended that\n * the higher order component be used over the regular {@link Profiler} component.\n *\n * @param WrappedComponent component that is wrapped by Profiler\n * @param options the {@link ProfilerProps} you can pass into the Profiler\n */\nfunction withProfiler<P extends Record<string, any>>(\n WrappedComponent: React.ComponentType<P>,\n // We do not want to have `updateProps` given in options, it is instead filled through the HOC.\n options?: Pick<Partial<ProfilerProps>, Exclude<keyof ProfilerProps, 'updateProps' | 'children'>>,\n): React.FC<P> {\n const componentDisplayName =\n (options && options.name) || WrappedComponent.displayName || WrappedComponent.name || UNKNOWN_COMPONENT;\n\n const Wrapped: React.FC<P> = (props: P) => (\n <Profiler {...options} name={componentDisplayName} updateProps={props}>\n <WrappedComponent {...props} />\n </Profiler>\n );\n\n Wrapped.displayName = `profiler(${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\n/**\n *\n * `useProfiler` is a React hook that profiles a React component.\n *\n * Requires React 16.8 or above.\n * @param name displayName of component being profiled\n */\nfunction useProfiler(\n name: string,\n options: { disabled?: boolean; hasRenderSpan?: boolean } = {\n disabled: false,\n hasRenderSpan: true,\n },\n): void {\n const [mountSpan] = React.useState(() => {\n if (options && options.disabled) {\n return undefined;\n }\n\n const activeTransaction = getActiveTransaction();\n if (activeTransaction) {\n return activeTransaction.startChild({\n description: `<${name}>`,\n op: REACT_MOUNT_OP,\n origin: 'auto.ui.react.profiler',\n data: { 'ui.component_name': name },\n });\n }\n\n return undefined;\n });\n\n React.useEffect(() => {\n if (mountSpan) {\n mountSpan.end();\n }\n\n return (): void => {\n if (mountSpan && options.hasRenderSpan) {\n mountSpan.startChild({\n description: `<${name}>`,\n endTimestamp: timestampInSeconds(),\n op: REACT_RENDER_OP,\n origin: 'auto.ui.react.profiler',\n startTimestamp: mountSpan.endTimestamp,\n data: { 'ui.component_name': name },\n });\n }\n };\n // We only want this to run once.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n}\n\nexport { withProfiler, Profiler, useProfiler };\n\n/** Grabs active transaction off scope */\nexport function getActiveTransaction<T extends Transaction>(hub: Hub = getCurrentHub()): T | undefined {\n if (hub) {\n const scope = hub.getScope();\n return scope.getTransaction() as T | undefined;\n }\n\n return undefined;\n}\n"],"names":["React","REACT_MOUNT_OP","timestampInSeconds","REACT_UPDATE_OP","REACT_RENDER_OP","hoistNonReactStatics","getCurrentHub"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"profiler.js","sources":["../../src/profiler.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { Hub } from '@sentry/browser';\nimport { getCurrentHub } from '@sentry/browser';\nimport type { Span, Transaction } from '@sentry/types';\nimport { timestampInSeconds } from '@sentry/utils';\nimport hoistNonReactStatics from 'hoist-non-react-statics';\nimport * as React from 'react';\n\nimport { REACT_MOUNT_OP, REACT_RENDER_OP, REACT_UPDATE_OP } from './constants';\n\nexport const UNKNOWN_COMPONENT = 'unknown';\n\nexport type ProfilerProps = {\n // The name of the component being profiled.\n name: string;\n // If the Profiler is disabled. False by default. This is useful if you want to disable profilers\n // in certain environments.\n disabled?: boolean;\n // If time component is on page should be displayed as spans. True by default.\n includeRender?: boolean;\n // If component updates should be displayed as spans. True by default.\n includeUpdates?: boolean;\n // Component that is being profiled.\n children?: React.ReactNode;\n // props given to component being profiled.\n updateProps: { [key: string]: unknown };\n};\n\n/**\n * The Profiler component leverages Sentry's Tracing integration to generate\n * spans based on component lifecycles.\n */\nclass Profiler extends React.Component<ProfilerProps> {\n /**\n * The span of the mount activity\n * Made protected for the React Native SDK to access\n */\n protected _mountSpan: Span | undefined;\n /**\n * The span that represents the duration of time between shouldComponentUpdate and componentDidUpdate\n */\n protected _updateSpan: Span | undefined;\n\n // eslint-disable-next-line @typescript-eslint/member-ordering\n public static defaultProps: Partial<ProfilerProps> = {\n disabled: false,\n includeRender: true,\n includeUpdates: true,\n };\n\n public constructor(props: ProfilerProps) {\n super(props);\n const { name, disabled = false } = this.props;\n\n if (disabled) {\n return;\n }\n\n const activeTransaction = getActiveTransaction();\n if (activeTransaction) {\n // eslint-disable-next-line deprecation/deprecation\n this._mountSpan = activeTransaction.startChild({\n description: `<${name}>`,\n op: REACT_MOUNT_OP,\n origin: 'auto.ui.react.profiler',\n data: { 'ui.component_name': name },\n });\n }\n }\n\n // If a component mounted, we can finish the mount activity.\n public componentDidMount(): void {\n if (this._mountSpan) {\n this._mountSpan.end();\n }\n }\n\n public shouldComponentUpdate({ updateProps, includeUpdates = true }: ProfilerProps): boolean {\n // Only generate an update span if includeUpdates is true, if there is a valid mountSpan,\n // and if the updateProps have changed. It is ok to not do a deep equality check here as it is expensive.\n // We are just trying to give baseline clues for further investigation.\n if (includeUpdates && this._mountSpan && updateProps !== this.props.updateProps) {\n // See what props haved changed between the previous props, and the current props. This is\n // set as data on the span. We just store the prop keys as the values could be potenially very large.\n const changedProps = Object.keys(updateProps).filter(k => updateProps[k] !== this.props.updateProps[k]);\n if (changedProps.length > 0) {\n const now = timestampInSeconds();\n // eslint-disable-next-line deprecation/deprecation\n this._updateSpan = this._mountSpan.startChild({\n data: {\n changedProps,\n 'ui.component_name': this.props.name,\n },\n description: `<${this.props.name}>`,\n op: REACT_UPDATE_OP,\n origin: 'auto.ui.react.profiler',\n startTimestamp: now,\n });\n }\n }\n\n return true;\n }\n\n public componentDidUpdate(): void {\n if (this._updateSpan) {\n this._updateSpan.end();\n this._updateSpan = undefined;\n }\n }\n\n // If a component is unmounted, we can say it is no longer on the screen.\n // This means we can finish the span representing the component render.\n public componentWillUnmount(): void {\n const { name, includeRender = true } = this.props;\n\n if (this._mountSpan && includeRender) {\n // If we were able to obtain the spanId of the mount activity, we should set the\n // next activity as a child to the component mount activity.\n // eslint-disable-next-line deprecation/deprecation\n this._mountSpan.startChild({\n description: `<${name}>`,\n endTimestamp: timestampInSeconds(),\n op: REACT_RENDER_OP,\n origin: 'auto.ui.react.profiler',\n startTimestamp: this._mountSpan.endTimestamp,\n data: { 'ui.component_name': name },\n });\n }\n }\n\n public render(): React.ReactNode {\n return this.props.children;\n }\n}\n\n/**\n * withProfiler is a higher order component that wraps a\n * component in a {@link Profiler} component. It is recommended that\n * the higher order component be used over the regular {@link Profiler} component.\n *\n * @param WrappedComponent component that is wrapped by Profiler\n * @param options the {@link ProfilerProps} you can pass into the Profiler\n */\nfunction withProfiler<P extends Record<string, any>>(\n WrappedComponent: React.ComponentType<P>,\n // We do not want to have `updateProps` given in options, it is instead filled through the HOC.\n options?: Pick<Partial<ProfilerProps>, Exclude<keyof ProfilerProps, 'updateProps' | 'children'>>,\n): React.FC<P> {\n const componentDisplayName =\n (options && options.name) || WrappedComponent.displayName || WrappedComponent.name || UNKNOWN_COMPONENT;\n\n const Wrapped: React.FC<P> = (props: P) => (\n <Profiler {...options} name={componentDisplayName} updateProps={props}>\n <WrappedComponent {...props} />\n </Profiler>\n );\n\n Wrapped.displayName = `profiler(${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\n/**\n *\n * `useProfiler` is a React hook that profiles a React component.\n *\n * Requires React 16.8 or above.\n * @param name displayName of component being profiled\n */\nfunction useProfiler(\n name: string,\n options: { disabled?: boolean; hasRenderSpan?: boolean } = {\n disabled: false,\n hasRenderSpan: true,\n },\n): void {\n const [mountSpan] = React.useState(() => {\n if (options && options.disabled) {\n return undefined;\n }\n\n const activeTransaction = getActiveTransaction();\n if (activeTransaction) {\n // eslint-disable-next-line deprecation/deprecation\n return activeTransaction.startChild({\n description: `<${name}>`,\n op: REACT_MOUNT_OP,\n origin: 'auto.ui.react.profiler',\n data: { 'ui.component_name': name },\n });\n }\n\n return undefined;\n });\n\n React.useEffect(() => {\n if (mountSpan) {\n mountSpan.end();\n }\n\n return (): void => {\n if (mountSpan && options.hasRenderSpan) {\n // eslint-disable-next-line deprecation/deprecation\n mountSpan.startChild({\n description: `<${name}>`,\n endTimestamp: timestampInSeconds(),\n op: REACT_RENDER_OP,\n origin: 'auto.ui.react.profiler',\n startTimestamp: mountSpan.endTimestamp,\n data: { 'ui.component_name': name },\n });\n }\n };\n // We only want this to run once.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n}\n\nexport { withProfiler, Profiler, useProfiler };\n\n/** Grabs active transaction off scope */\nexport function getActiveTransaction<T extends Transaction>(hub: Hub = getCurrentHub()): T | undefined {\n if (hub) {\n const scope = hub.getScope();\n // eslint-disable-next-line deprecation/deprecation\n return scope.getTransaction() as T | undefined;\n }\n\n return undefined;\n}\n"],"names":["React","REACT_MOUNT_OP","timestampInSeconds","REACT_UPDATE_OP","REACT_RENDER_OP","hoistNonReactStatics","getCurrentHub"],"mappings":"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"}
|
package/cjs/reactrouter.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
2
2
|
|
|
3
3
|
const browser = require('@sentry/browser');
|
|
4
|
+
const core = require('@sentry/core');
|
|
4
5
|
const hoistNonReactStatics = require('hoist-non-react-statics');
|
|
5
6
|
const React = require('react');
|
|
6
7
|
|
|
@@ -168,13 +169,14 @@ function withSentryRouting(Route) {
|
|
|
168
169
|
|
|
169
170
|
const WrappedRoute = (props) => {
|
|
170
171
|
if (activeTransaction && props && props.computedMatch && props.computedMatch.isExact) {
|
|
171
|
-
activeTransaction.
|
|
172
|
+
activeTransaction.updateName(props.computedMatch.path);
|
|
173
|
+
activeTransaction.setAttribute(core.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, 'route');
|
|
172
174
|
}
|
|
173
175
|
|
|
174
176
|
// @ts-expect-error Setting more specific React Component typing for `R` generic above
|
|
175
177
|
// will break advanced type inference done by react router params:
|
|
176
178
|
// https://github.com/DefinitelyTyped/DefinitelyTyped/blob/13dc4235c069e25fe7ee16e11f529d909f9f3ff8/types/react-router/index.d.ts#L154-L164
|
|
177
|
-
return React__namespace.createElement(Route, { ...props, __self: this, __source: {fileName: _jsxFileName, lineNumber:
|
|
179
|
+
return React__namespace.createElement(Route, { ...props, __self: this, __source: {fileName: _jsxFileName, lineNumber: 176}} );
|
|
178
180
|
};
|
|
179
181
|
|
|
180
182
|
WrappedRoute.displayName = `sentryRoute(${componentDisplayName})`;
|
package/cjs/reactrouter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactrouter.js","sources":["../../src/reactrouter.tsx"],"sourcesContent":["import { WINDOW } from '@sentry/browser';\nimport type { Transaction, TransactionSource } from '@sentry/types';\nimport hoistNonReactStatics from 'hoist-non-react-statics';\nimport * as React from 'react';\n\nimport type { Action, Location, ReactRouterInstrumentation } from './types';\n\n// We need to disable eslint no-explict-any because any is required for the\n// react-router typings.\ntype Match = { path: string; url: string; params: Record<string, any>; isExact: boolean }; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nexport type RouterHistory = {\n location?: Location;\n listen?(cb: (location: Location, action: Action) => void): void;\n} & Record<string, any>; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nexport type RouteConfig = {\n [propName: string]: unknown;\n path?: string | string[];\n exact?: boolean;\n component?: JSX.Element;\n routes?: RouteConfig[];\n};\n\ntype MatchPath = (pathname: string, props: string | string[] | any, parent?: Match | null) => Match | null; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nlet activeTransaction: Transaction | undefined;\n\nexport function reactRouterV4Instrumentation(\n history: RouterHistory,\n routes?: RouteConfig[],\n matchPath?: MatchPath,\n): ReactRouterInstrumentation {\n return createReactRouterInstrumentation(history, 'react-router-v4', routes, matchPath);\n}\n\nexport function reactRouterV5Instrumentation(\n history: RouterHistory,\n routes?: RouteConfig[],\n matchPath?: MatchPath,\n): ReactRouterInstrumentation {\n return createReactRouterInstrumentation(history, 'react-router-v5', routes, matchPath);\n}\n\nfunction createReactRouterInstrumentation(\n history: RouterHistory,\n name: string,\n allRoutes: RouteConfig[] = [],\n matchPath?: MatchPath,\n): ReactRouterInstrumentation {\n function getInitPathName(): string | undefined {\n if (history && history.location) {\n return history.location.pathname;\n }\n\n if (WINDOW && WINDOW.location) {\n return WINDOW.location.pathname;\n }\n\n return undefined;\n }\n\n /**\n * Normalizes a transaction name. Returns the new name as well as the\n * source of the transaction.\n *\n * @param pathname The initial pathname we normalize\n */\n function normalizeTransactionName(pathname: string): [string, TransactionSource] {\n if (allRoutes.length === 0 || !matchPath) {\n return [pathname, 'url'];\n }\n\n const branches = matchRoutes(allRoutes, pathname, matchPath);\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let x = 0; x < branches.length; x++) {\n if (branches[x].match.isExact) {\n return [branches[x].match.path, 'route'];\n }\n }\n\n return [pathname, 'url'];\n }\n\n const tags = {\n 'routing.instrumentation': name,\n };\n\n return (customStartTransaction, startTransactionOnPageLoad = true, startTransactionOnLocationChange = true): void => {\n const initPathName = getInitPathName();\n if (startTransactionOnPageLoad && initPathName) {\n const [name, source] = normalizeTransactionName(initPathName);\n activeTransaction = customStartTransaction({\n name,\n op: 'pageload',\n origin: 'auto.pageload.react.reactrouter',\n tags,\n metadata: {\n source,\n },\n });\n }\n\n if (startTransactionOnLocationChange && history.listen) {\n history.listen((location, action) => {\n if (action && (action === 'PUSH' || action === 'POP')) {\n if (activeTransaction) {\n activeTransaction.end();\n }\n\n const [name, source] = normalizeTransactionName(location.pathname);\n activeTransaction = customStartTransaction({\n name,\n op: 'navigation',\n origin: 'auto.navigation.react.reactrouter',\n tags,\n metadata: {\n source,\n },\n });\n }\n });\n }\n };\n}\n\n/**\n * Matches a set of routes to a pathname\n * Based on implementation from\n */\nfunction matchRoutes(\n routes: RouteConfig[],\n pathname: string,\n matchPath: MatchPath,\n branch: Array<{ route: RouteConfig; match: Match }> = [],\n): Array<{ route: RouteConfig; match: Match }> {\n routes.some(route => {\n const match = route.path\n ? matchPath(pathname, route)\n : branch.length\n ? branch[branch.length - 1].match // use parent match\n : computeRootMatch(pathname); // use default \"root\" match\n\n if (match) {\n branch.push({ route, match });\n\n if (route.routes) {\n matchRoutes(route.routes, pathname, matchPath, branch);\n }\n }\n\n return !!match;\n });\n\n return branch;\n}\n\nfunction computeRootMatch(pathname: string): Match {\n return { path: '/', url: '/', params: {}, isExact: pathname === '/' };\n}\n\n/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access */\nexport function withSentryRouting<P extends Record<string, any>, R extends React.ComponentType<P>>(Route: R): R {\n const componentDisplayName = (Route as any).displayName || (Route as any).name;\n\n const WrappedRoute: React.FC<P> = (props: P) => {\n if (activeTransaction && props && props.computedMatch && props.computedMatch.isExact) {\n activeTransaction.setName(props.computedMatch.path, 'route');\n }\n\n // @ts-expect-error Setting more specific React Component typing for `R` generic above\n // will break advanced type inference done by react router params:\n // https://github.com/DefinitelyTyped/DefinitelyTyped/blob/13dc4235c069e25fe7ee16e11f529d909f9f3ff8/types/react-router/index.d.ts#L154-L164\n return <Route {...props} />;\n };\n\n WrappedRoute.displayName = `sentryRoute(${componentDisplayName})`;\n hoistNonReactStatics(WrappedRoute, Route);\n // @ts-expect-error Setting more specific React Component typing for `R` generic above\n // will break advanced type inference done by react router params:\n // https://github.com/DefinitelyTyped/DefinitelyTyped/blob/13dc4235c069e25fe7ee16e11f529d909f9f3ff8/types/react-router/index.d.ts#L154-L164\n return WrappedRoute;\n}\n/* eslint-enable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access */\n"],"names":["WINDOW","React","hoistNonReactStatics"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"reactrouter.js","sources":["../../src/reactrouter.tsx"],"sourcesContent":["import { WINDOW } from '@sentry/browser';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from '@sentry/core';\nimport type { Transaction, TransactionSource } from '@sentry/types';\nimport hoistNonReactStatics from 'hoist-non-react-statics';\nimport * as React from 'react';\n\nimport type { Action, Location, ReactRouterInstrumentation } from './types';\n\n// We need to disable eslint no-explict-any because any is required for the\n// react-router typings.\ntype Match = { path: string; url: string; params: Record<string, any>; isExact: boolean }; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nexport type RouterHistory = {\n location?: Location;\n listen?(cb: (location: Location, action: Action) => void): void;\n} & Record<string, any>; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nexport type RouteConfig = {\n [propName: string]: unknown;\n path?: string | string[];\n exact?: boolean;\n component?: JSX.Element;\n routes?: RouteConfig[];\n};\n\ntype MatchPath = (pathname: string, props: string | string[] | any, parent?: Match | null) => Match | null; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nlet activeTransaction: Transaction | undefined;\n\nexport function reactRouterV4Instrumentation(\n history: RouterHistory,\n routes?: RouteConfig[],\n matchPath?: MatchPath,\n): ReactRouterInstrumentation {\n return createReactRouterInstrumentation(history, 'react-router-v4', routes, matchPath);\n}\n\nexport function reactRouterV5Instrumentation(\n history: RouterHistory,\n routes?: RouteConfig[],\n matchPath?: MatchPath,\n): ReactRouterInstrumentation {\n return createReactRouterInstrumentation(history, 'react-router-v5', routes, matchPath);\n}\n\nfunction createReactRouterInstrumentation(\n history: RouterHistory,\n name: string,\n allRoutes: RouteConfig[] = [],\n matchPath?: MatchPath,\n): ReactRouterInstrumentation {\n function getInitPathName(): string | undefined {\n if (history && history.location) {\n return history.location.pathname;\n }\n\n if (WINDOW && WINDOW.location) {\n return WINDOW.location.pathname;\n }\n\n return undefined;\n }\n\n /**\n * Normalizes a transaction name. Returns the new name as well as the\n * source of the transaction.\n *\n * @param pathname The initial pathname we normalize\n */\n function normalizeTransactionName(pathname: string): [string, TransactionSource] {\n if (allRoutes.length === 0 || !matchPath) {\n return [pathname, 'url'];\n }\n\n const branches = matchRoutes(allRoutes, pathname, matchPath);\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let x = 0; x < branches.length; x++) {\n if (branches[x].match.isExact) {\n return [branches[x].match.path, 'route'];\n }\n }\n\n return [pathname, 'url'];\n }\n\n const tags = {\n 'routing.instrumentation': name,\n };\n\n return (customStartTransaction, startTransactionOnPageLoad = true, startTransactionOnLocationChange = true): void => {\n const initPathName = getInitPathName();\n if (startTransactionOnPageLoad && initPathName) {\n const [name, source] = normalizeTransactionName(initPathName);\n activeTransaction = customStartTransaction({\n name,\n op: 'pageload',\n origin: 'auto.pageload.react.reactrouter',\n tags,\n metadata: {\n source,\n },\n });\n }\n\n if (startTransactionOnLocationChange && history.listen) {\n history.listen((location, action) => {\n if (action && (action === 'PUSH' || action === 'POP')) {\n if (activeTransaction) {\n activeTransaction.end();\n }\n\n const [name, source] = normalizeTransactionName(location.pathname);\n activeTransaction = customStartTransaction({\n name,\n op: 'navigation',\n origin: 'auto.navigation.react.reactrouter',\n tags,\n metadata: {\n source,\n },\n });\n }\n });\n }\n };\n}\n\n/**\n * Matches a set of routes to a pathname\n * Based on implementation from\n */\nfunction matchRoutes(\n routes: RouteConfig[],\n pathname: string,\n matchPath: MatchPath,\n branch: Array<{ route: RouteConfig; match: Match }> = [],\n): Array<{ route: RouteConfig; match: Match }> {\n routes.some(route => {\n const match = route.path\n ? matchPath(pathname, route)\n : branch.length\n ? branch[branch.length - 1].match // use parent match\n : computeRootMatch(pathname); // use default \"root\" match\n\n if (match) {\n branch.push({ route, match });\n\n if (route.routes) {\n matchRoutes(route.routes, pathname, matchPath, branch);\n }\n }\n\n return !!match;\n });\n\n return branch;\n}\n\nfunction computeRootMatch(pathname: string): Match {\n return { path: '/', url: '/', params: {}, isExact: pathname === '/' };\n}\n\n/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access */\nexport function withSentryRouting<P extends Record<string, any>, R extends React.ComponentType<P>>(Route: R): R {\n const componentDisplayName = (Route as any).displayName || (Route as any).name;\n\n const WrappedRoute: React.FC<P> = (props: P) => {\n if (activeTransaction && props && props.computedMatch && props.computedMatch.isExact) {\n activeTransaction.updateName(props.computedMatch.path);\n activeTransaction.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, 'route');\n }\n\n // @ts-expect-error Setting more specific React Component typing for `R` generic above\n // will break advanced type inference done by react router params:\n // https://github.com/DefinitelyTyped/DefinitelyTyped/blob/13dc4235c069e25fe7ee16e11f529d909f9f3ff8/types/react-router/index.d.ts#L154-L164\n return <Route {...props} />;\n };\n\n WrappedRoute.displayName = `sentryRoute(${componentDisplayName})`;\n hoistNonReactStatics(WrappedRoute, Route);\n // @ts-expect-error Setting more specific React Component typing for `R` generic above\n // will break advanced type inference done by react router params:\n // https://github.com/DefinitelyTyped/DefinitelyTyped/blob/13dc4235c069e25fe7ee16e11f529d909f9f3ff8/types/react-router/index.d.ts#L154-L164\n return WrappedRoute;\n}\n/* eslint-enable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access */\n"],"names":["WINDOW","SEMANTIC_ATTRIBUTE_SENTRY_SOURCE","React","hoistNonReactStatics"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA,MAAA,YAAA,GAAA,0FAAA;AAQA;AACA;;AAgBA;AACA;AACA,IAAI,iBAAiB,CAAA;AACrB;AACO,SAAS,4BAA4B;AAC5C,EAAE,OAAO;AACT,EAAE,MAAM;AACR,EAAE,SAAS;AACX,EAA8B;AAC9B,EAAE,OAAO,gCAAgC,CAAC,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,SAAS,CAAC,CAAA;AACxF,CAAA;AACA;AACO,SAAS,4BAA4B;AAC5C,EAAE,OAAO;AACT,EAAE,MAAM;AACR,EAAE,SAAS;AACX,EAA8B;AAC9B,EAAE,OAAO,gCAAgC,CAAC,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,SAAS,CAAC,CAAA;AACxF,CAAA;AACA;AACA,SAAS,gCAAgC;AACzC,EAAE,OAAO;AACT,EAAE,IAAI;AACN,EAAE,SAAS,GAAkB,EAAE;AAC/B,EAAE,SAAS;AACX,EAA8B;AAC9B,EAAE,SAAS,eAAe,GAAuB;AACjD,IAAI,IAAI,OAAA,IAAW,OAAO,CAAC,QAAQ,EAAE;AACrC,MAAM,OAAO,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAA;AACtC,KAAI;AACJ;AACA,IAAI,IAAIA,cAAA,IAAUA,cAAM,CAAC,QAAQ,EAAE;AACnC,MAAM,OAAOA,cAAM,CAAC,QAAQ,CAAC,QAAQ,CAAA;AACrC,KAAI;AACJ;AACA,IAAI,OAAO,SAAS,CAAA;AACpB,GAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,SAAS,wBAAwB,CAAC,QAAQ,EAAuC;AACnF,IAAI,IAAI,SAAS,CAAC,MAAA,KAAW,CAAE,IAAG,CAAC,SAAS,EAAE;AAC9C,MAAM,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;AAC9B,KAAI;AACJ;AACA,IAAI,MAAM,QAAS,GAAE,WAAW,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAA;AAChE;AACA,IAAI,KAAK,IAAI,CAAA,GAAI,CAAC,EAAE,CAAE,GAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC9C,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE;AACrC,QAAQ,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;AAChD,OAAM;AACN,KAAI;AACJ;AACA,IAAI,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;AAC5B,GAAE;AACF;AACA,EAAE,MAAM,OAAO;AACf,IAAI,yBAAyB,EAAE,IAAI;AACnC,GAAG,CAAA;AACH;AACA,EAAE,OAAO,CAAC,sBAAsB,EAAE,0BAAA,GAA6B,IAAI,EAAE,gCAAA,GAAmC,IAAI,KAAW;AACvH,IAAI,MAAM,YAAA,GAAe,eAAe,EAAE,CAAA;AAC1C,IAAI,IAAI,0BAA2B,IAAG,YAAY,EAAE;AACpD,MAAM,MAAM,CAAC,IAAI,EAAE,MAAM,IAAI,wBAAwB,CAAC,YAAY,CAAC,CAAA;AACnE,MAAM,iBAAA,GAAoB,sBAAsB,CAAC;AACjD,QAAQ,IAAI;AACZ,QAAQ,EAAE,EAAE,UAAU;AACtB,QAAQ,MAAM,EAAE,iCAAiC;AACjD,QAAQ,IAAI;AACZ,QAAQ,QAAQ,EAAE;AAClB,UAAU,MAAM;AAChB,SAAS;AACT,OAAO,CAAC,CAAA;AACR,KAAI;AACJ;AACA,IAAI,IAAI,gCAAA,IAAoC,OAAO,CAAC,MAAM,EAAE;AAC5D,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK;AAC3C,QAAQ,IAAI,MAAO,KAAI,MAAA,KAAW,MAAA,IAAU,MAAA,KAAW,KAAK,CAAC,EAAE;AAC/D,UAAU,IAAI,iBAAiB,EAAE;AACjC,YAAY,iBAAiB,CAAC,GAAG,EAAE,CAAA;AACnC,WAAU;AACV;AACA,UAAU,MAAM,CAAC,IAAI,EAAE,MAAM,CAAA,GAAI,wBAAwB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;AAC5E,UAAU,iBAAA,GAAoB,sBAAsB,CAAC;AACrD,YAAY,IAAI;AAChB,YAAY,EAAE,EAAE,YAAY;AAC5B,YAAY,MAAM,EAAE,mCAAmC;AACvD,YAAY,IAAI;AAChB,YAAY,QAAQ,EAAE;AACtB,cAAc,MAAM;AACpB,aAAa;AACb,WAAW,CAAC,CAAA;AACZ,SAAQ;AACR,OAAO,CAAC,CAAA;AACR,KAAI;AACJ,GAAG,CAAA;AACH,CAAA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,WAAW;AACpB,EAAE,MAAM;AACR,EAAE,QAAQ;AACV,EAAE,SAAS;AACX,EAAE,MAAM,GAAgD,EAAE;AAC1D,EAA+C;AAC/C,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS;AACvB,IAAI,MAAM,KAAA,GAAQ,KAAK,CAAC,IAAA;AACxB,QAAQ,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAA;AACjC,QAAQ,MAAM,CAAC,MAAA;AACf,UAAU,MAAM,CAAC,MAAM,CAAC,MAAO,GAAE,CAAC,CAAC,CAAC,KAAA;AACpC,UAAU,gBAAgB,CAAC,QAAQ,CAAC,CAAA;AACpC;AACA,IAAI,IAAI,KAAK,EAAE;AACf,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAM,EAAC,CAAC,CAAA;AACnC;AACA,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE;AACxB,QAAQ,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,CAAA;AAC9D,OAAM;AACN,KAAI;AACJ;AACA,IAAI,OAAO,CAAC,CAAC,KAAK,CAAA;AAClB,GAAG,CAAC,CAAA;AACJ;AACA,EAAE,OAAO,MAAM,CAAA;AACf,CAAA;AACA;AACA,SAAS,gBAAgB,CAAC,QAAQ,EAAiB;AACnD,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,QAAS,KAAI,KAAK,CAAA;AACvE,CAAA;AACA;AACA;AACO,SAAS,iBAAiB,CAAkE,KAAK,EAAQ;AAChH,EAAE,MAAM,oBAAA,GAAuB,CAAC,KAAM,GAAQ,WAAA,IAAe,CAAC,KAAM,GAAQ,IAAI,CAAA;AAChF;AACA,EAAE,MAAM,YAAY,GAAgB,CAAC,KAAK,KAAQ;AAClD,IAAI,IAAI,iBAAkB,IAAG,SAAS,KAAK,CAAC,aAAA,IAAiB,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE;AAC1F,MAAM,iBAAiB,CAAC,UAAU,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;AAC5D,MAAM,iBAAiB,CAAC,YAAY,CAACC,qCAAgC,EAAE,OAAO,CAAC,CAAA;AAC/E,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAI,OAAOC,gBAAC,CAAA,aAAA,CAAA,KAAA,EAAA,EAAM,GAAI,KAAK,sEAAI,CAAA;AAC/B,GAAG,CAAA;AACH;AACA,EAAE,YAAY,CAAC,WAAA,GAAc,CAAC,YAAY,EAAE,oBAAoB,CAAC,CAAC,CAAC,CAAA;AACnE,EAAEC,6BAAoB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAA;AAC3C;AACA;AACA;AACA,EAAE,OAAO,YAAY,CAAA;AACrB,CAAA;AACA;;;;;;"}
|
package/cjs/reactrouterv6.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
2
2
|
|
|
3
3
|
const browser = require('@sentry/browser');
|
|
4
|
+
const core = require('@sentry/core');
|
|
4
5
|
const utils = require('@sentry/utils');
|
|
5
6
|
const hoistNonReactStatics = require('hoist-non-react-statics');
|
|
6
7
|
const React = require('react');
|
|
@@ -134,7 +135,9 @@ function updatePageloadTransaction(
|
|
|
134
135
|
: (_matchRoutes(routes, location, basename) );
|
|
135
136
|
|
|
136
137
|
if (activeTransaction && branches) {
|
|
137
|
-
|
|
138
|
+
const [name, source] = getNormalizedName(routes, location, branches, basename);
|
|
139
|
+
activeTransaction.updateName(name);
|
|
140
|
+
activeTransaction.setAttribute(core.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, source);
|
|
138
141
|
}
|
|
139
142
|
}
|
|
140
143
|
|
|
@@ -207,7 +210,7 @@ function withSentryReactRouterV6Routing(Routes) {
|
|
|
207
210
|
|
|
208
211
|
// @ts-expect-error Setting more specific React Component typing for `R` generic above
|
|
209
212
|
// will break advanced type inference done by react router params
|
|
210
|
-
return React__namespace.createElement(Routes, { ...props, __self: this, __source: {fileName: _jsxFileName, lineNumber:
|
|
213
|
+
return React__namespace.createElement(Routes, { ...props, __self: this, __source: {fileName: _jsxFileName, lineNumber: 213}} );
|
|
211
214
|
};
|
|
212
215
|
|
|
213
216
|
hoistNonReactStatics__default(SentryRoutes, Routes);
|
|
@@ -262,7 +265,7 @@ function wrapUseRoutes(origUseRoutes) {
|
|
|
262
265
|
|
|
263
266
|
// eslint-disable-next-line react/display-name
|
|
264
267
|
return (routes, locationArg) => {
|
|
265
|
-
return React__namespace.createElement(SentryRoutes, { routes: routes, locationArg: locationArg, __self: this, __source: {fileName: _jsxFileName, lineNumber:
|
|
268
|
+
return React__namespace.createElement(SentryRoutes, { routes: routes, locationArg: locationArg, __self: this, __source: {fileName: _jsxFileName, lineNumber: 270}} );
|
|
266
269
|
};
|
|
267
270
|
}
|
|
268
271
|
|
package/cjs/reactrouterv6.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactrouterv6.js","sources":["../../src/reactrouterv6.tsx"],"sourcesContent":["// Inspired from Donnie McNeal's solution:\n// https://gist.github.com/wontondon/e8c4bdf2888875e4c755712e99279536\n\nimport { WINDOW } from '@sentry/browser';\nimport type { Transaction, TransactionContext, TransactionSource } from '@sentry/types';\nimport { getNumberOfUrlSegments, logger } from '@sentry/utils';\nimport hoistNonReactStatics from 'hoist-non-react-statics';\nimport * as React from 'react';\n\nimport { DEBUG_BUILD } from './debug-build';\nimport type {\n Action,\n AgnosticDataRouteMatch,\n CreateRouterFunction,\n CreateRoutesFromChildren,\n Location,\n MatchRoutes,\n RouteMatch,\n RouteObject,\n Router,\n RouterState,\n UseEffect,\n UseLocation,\n UseNavigationType,\n UseRoutes,\n} from './types';\n\nlet activeTransaction: Transaction | undefined;\n\nlet _useEffect: UseEffect;\nlet _useLocation: UseLocation;\nlet _useNavigationType: UseNavigationType;\nlet _createRoutesFromChildren: CreateRoutesFromChildren;\nlet _matchRoutes: MatchRoutes;\nlet _customStartTransaction: (context: TransactionContext) => Transaction | undefined;\nlet _startTransactionOnLocationChange: boolean;\n\nconst SENTRY_TAGS = {\n 'routing.instrumentation': 'react-router-v6',\n};\n\nexport function reactRouterV6Instrumentation(\n useEffect: UseEffect,\n useLocation: UseLocation,\n useNavigationType: UseNavigationType,\n createRoutesFromChildren: CreateRoutesFromChildren,\n matchRoutes: MatchRoutes,\n) {\n return (\n customStartTransaction: (context: TransactionContext) => Transaction | undefined,\n startTransactionOnPageLoad = true,\n startTransactionOnLocationChange = true,\n ): void => {\n const initPathName = WINDOW && WINDOW.location && WINDOW.location.pathname;\n if (startTransactionOnPageLoad && initPathName) {\n activeTransaction = customStartTransaction({\n name: initPathName,\n op: 'pageload',\n origin: 'auto.pageload.react.reactrouterv6',\n tags: SENTRY_TAGS,\n metadata: {\n source: 'url',\n },\n });\n }\n\n _useEffect = useEffect;\n _useLocation = useLocation;\n _useNavigationType = useNavigationType;\n _matchRoutes = matchRoutes;\n _createRoutesFromChildren = createRoutesFromChildren;\n\n _customStartTransaction = customStartTransaction;\n _startTransactionOnLocationChange = startTransactionOnLocationChange;\n };\n}\n\nfunction getNormalizedName(\n routes: RouteObject[],\n location: Location,\n branches: RouteMatch[],\n basename: string = '',\n): [string, TransactionSource] {\n if (!routes || routes.length === 0) {\n return [location.pathname, 'url'];\n }\n\n let pathBuilder = '';\n if (branches) {\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let x = 0; x < branches.length; x++) {\n const branch = branches[x];\n const route = branch.route;\n if (route) {\n // Early return if index route\n if (route.index) {\n return [branch.pathname, 'route'];\n }\n\n const path = route.path;\n if (path) {\n const newPath = path[0] === '/' || pathBuilder[pathBuilder.length - 1] === '/' ? path : `/${path}`;\n pathBuilder += newPath;\n\n if (basename + branch.pathname === location.pathname) {\n if (\n // If the route defined on the element is something like\n // <Route path=\"/stores/:storeId/products/:productId\" element={<div>Product</div>} />\n // We should check against the branch.pathname for the number of / seperators\n getNumberOfUrlSegments(pathBuilder) !== getNumberOfUrlSegments(branch.pathname) &&\n // We should not count wildcard operators in the url segments calculation\n pathBuilder.slice(-2) !== '/*'\n ) {\n return [basename + newPath, 'route'];\n }\n return [basename + pathBuilder, 'route'];\n }\n }\n }\n }\n }\n\n return [location.pathname, 'url'];\n}\n\nfunction updatePageloadTransaction(\n location: Location,\n routes: RouteObject[],\n matches?: AgnosticDataRouteMatch,\n basename?: string,\n): void {\n const branches = Array.isArray(matches)\n ? matches\n : (_matchRoutes(routes, location, basename) as unknown as RouteMatch[]);\n\n if (activeTransaction && branches) {\n activeTransaction.setName(...getNormalizedName(routes, location, branches, basename));\n }\n}\n\nfunction handleNavigation(\n location: Location,\n routes: RouteObject[],\n navigationType: Action,\n matches?: AgnosticDataRouteMatch,\n basename?: string,\n): void {\n const branches = Array.isArray(matches) ? matches : _matchRoutes(routes, location, basename);\n\n if (_startTransactionOnLocationChange && (navigationType === 'PUSH' || navigationType === 'POP') && branches) {\n if (activeTransaction) {\n activeTransaction.end();\n }\n\n const [name, source] = getNormalizedName(routes, location, branches, basename);\n activeTransaction = _customStartTransaction({\n name,\n op: 'navigation',\n origin: 'auto.navigation.react.reactrouterv6',\n tags: SENTRY_TAGS,\n metadata: {\n source,\n },\n });\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function withSentryReactRouterV6Routing<P extends Record<string, any>, R extends React.FC<P>>(Routes: R): R {\n if (\n !_useEffect ||\n !_useLocation ||\n !_useNavigationType ||\n !_createRoutesFromChildren ||\n !_matchRoutes ||\n !_customStartTransaction\n ) {\n DEBUG_BUILD &&\n logger.warn(`reactRouterV6Instrumentation was unable to wrap Routes because of one or more missing parameters.\n useEffect: ${_useEffect}. useLocation: ${_useLocation}. useNavigationType: ${_useNavigationType}.\n createRoutesFromChildren: ${_createRoutesFromChildren}. matchRoutes: ${_matchRoutes}. customStartTransaction: ${_customStartTransaction}.`);\n\n return Routes;\n }\n\n let isMountRenderPass: boolean = true;\n\n const SentryRoutes: React.FC<P> = (props: P) => {\n const location = _useLocation();\n const navigationType = _useNavigationType();\n\n _useEffect(\n () => {\n const routes = _createRoutesFromChildren(props.children) as RouteObject[];\n\n if (isMountRenderPass) {\n updatePageloadTransaction(location, routes);\n isMountRenderPass = false;\n } else {\n handleNavigation(location, routes, navigationType);\n }\n },\n // `props.children` is purpusely not included in the dependency array, because we do not want to re-run this effect\n // when the children change. We only want to start transactions when the location or navigation type change.\n [location, navigationType],\n );\n\n // @ts-expect-error Setting more specific React Component typing for `R` generic above\n // will break advanced type inference done by react router params\n return <Routes {...props} />;\n };\n\n hoistNonReactStatics(SentryRoutes, Routes);\n\n // @ts-expect-error Setting more specific React Component typing for `R` generic above\n // will break advanced type inference done by react router params\n return SentryRoutes;\n}\n\nexport function wrapUseRoutes(origUseRoutes: UseRoutes): UseRoutes {\n if (!_useEffect || !_useLocation || !_useNavigationType || !_matchRoutes || !_customStartTransaction) {\n DEBUG_BUILD &&\n logger.warn(\n 'reactRouterV6Instrumentation was unable to wrap `useRoutes` because of one or more missing parameters.',\n );\n\n return origUseRoutes;\n }\n\n let isMountRenderPass: boolean = true;\n\n const SentryRoutes: React.FC<{\n children?: React.ReactNode;\n routes: RouteObject[];\n locationArg?: Partial<Location> | string;\n }> = (props: { children?: React.ReactNode; routes: RouteObject[]; locationArg?: Partial<Location> | string }) => {\n const { routes, locationArg } = props;\n\n const Routes = origUseRoutes(routes, locationArg);\n\n const location = _useLocation();\n const navigationType = _useNavigationType();\n\n // A value with stable identity to either pick `locationArg` if available or `location` if not\n const stableLocationParam =\n typeof locationArg === 'string' || (locationArg && locationArg.pathname)\n ? (locationArg as { pathname: string })\n : location;\n\n _useEffect(() => {\n const normalizedLocation =\n typeof stableLocationParam === 'string' ? { pathname: stableLocationParam } : stableLocationParam;\n\n if (isMountRenderPass) {\n updatePageloadTransaction(normalizedLocation, routes);\n isMountRenderPass = false;\n } else {\n handleNavigation(normalizedLocation, routes, navigationType);\n }\n }, [navigationType, stableLocationParam]);\n\n return Routes;\n };\n\n // eslint-disable-next-line react/display-name\n return (routes: RouteObject[], locationArg?: Partial<Location> | string): React.ReactElement | null => {\n return <SentryRoutes routes={routes} locationArg={locationArg} />;\n };\n}\n\nexport function wrapCreateBrowserRouter<\n TState extends RouterState = RouterState,\n TRouter extends Router<TState> = Router<TState>,\n>(createRouterFunction: CreateRouterFunction<TState, TRouter>): CreateRouterFunction<TState, TRouter> {\n // `opts` for createBrowserHistory and createMemoryHistory are different, but also not relevant for us at the moment.\n // `basename` is the only option that is relevant for us, and it is the same for all.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return function (routes: RouteObject[], opts?: Record<string, any> & { basename?: string }): TRouter {\n const router = createRouterFunction(routes, opts);\n const basename = opts && opts.basename;\n\n // The initial load ends when `createBrowserRouter` is called.\n // This is the earliest convenient time to update the transaction name.\n // Callbacks to `router.subscribe` are not called for the initial load.\n if (router.state.historyAction === 'POP' && activeTransaction) {\n updatePageloadTransaction(router.state.location, routes, undefined, basename);\n }\n\n router.subscribe((state: RouterState) => {\n const location = state.location;\n\n if (\n _startTransactionOnLocationChange &&\n (state.historyAction === 'PUSH' || state.historyAction === 'POP') &&\n activeTransaction\n ) {\n handleNavigation(location, routes, state.historyAction, undefined, basename);\n }\n });\n\n return router;\n };\n}\n"],"names":["WINDOW","getNumberOfUrlSegments","DEBUG_BUILD","logger","React","hoistNonReactStatics"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"reactrouterv6.js","sources":["../../src/reactrouterv6.tsx"],"sourcesContent":["// Inspired from Donnie McNeal's solution:\n// https://gist.github.com/wontondon/e8c4bdf2888875e4c755712e99279536\n\nimport { WINDOW } from '@sentry/browser';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from '@sentry/core';\nimport type { Transaction, TransactionContext, TransactionSource } from '@sentry/types';\nimport { getNumberOfUrlSegments, logger } from '@sentry/utils';\nimport hoistNonReactStatics from 'hoist-non-react-statics';\nimport * as React from 'react';\n\nimport { DEBUG_BUILD } from './debug-build';\nimport type {\n Action,\n AgnosticDataRouteMatch,\n CreateRouterFunction,\n CreateRoutesFromChildren,\n Location,\n MatchRoutes,\n RouteMatch,\n RouteObject,\n Router,\n RouterState,\n UseEffect,\n UseLocation,\n UseNavigationType,\n UseRoutes,\n} from './types';\n\nlet activeTransaction: Transaction | undefined;\n\nlet _useEffect: UseEffect;\nlet _useLocation: UseLocation;\nlet _useNavigationType: UseNavigationType;\nlet _createRoutesFromChildren: CreateRoutesFromChildren;\nlet _matchRoutes: MatchRoutes;\nlet _customStartTransaction: (context: TransactionContext) => Transaction | undefined;\nlet _startTransactionOnLocationChange: boolean;\n\nconst SENTRY_TAGS = {\n 'routing.instrumentation': 'react-router-v6',\n};\n\nexport function reactRouterV6Instrumentation(\n useEffect: UseEffect,\n useLocation: UseLocation,\n useNavigationType: UseNavigationType,\n createRoutesFromChildren: CreateRoutesFromChildren,\n matchRoutes: MatchRoutes,\n) {\n return (\n customStartTransaction: (context: TransactionContext) => Transaction | undefined,\n startTransactionOnPageLoad = true,\n startTransactionOnLocationChange = true,\n ): void => {\n const initPathName = WINDOW && WINDOW.location && WINDOW.location.pathname;\n if (startTransactionOnPageLoad && initPathName) {\n activeTransaction = customStartTransaction({\n name: initPathName,\n op: 'pageload',\n origin: 'auto.pageload.react.reactrouterv6',\n tags: SENTRY_TAGS,\n metadata: {\n source: 'url',\n },\n });\n }\n\n _useEffect = useEffect;\n _useLocation = useLocation;\n _useNavigationType = useNavigationType;\n _matchRoutes = matchRoutes;\n _createRoutesFromChildren = createRoutesFromChildren;\n\n _customStartTransaction = customStartTransaction;\n _startTransactionOnLocationChange = startTransactionOnLocationChange;\n };\n}\n\nfunction getNormalizedName(\n routes: RouteObject[],\n location: Location,\n branches: RouteMatch[],\n basename: string = '',\n): [string, TransactionSource] {\n if (!routes || routes.length === 0) {\n return [location.pathname, 'url'];\n }\n\n let pathBuilder = '';\n if (branches) {\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let x = 0; x < branches.length; x++) {\n const branch = branches[x];\n const route = branch.route;\n if (route) {\n // Early return if index route\n if (route.index) {\n return [branch.pathname, 'route'];\n }\n\n const path = route.path;\n if (path) {\n const newPath = path[0] === '/' || pathBuilder[pathBuilder.length - 1] === '/' ? path : `/${path}`;\n pathBuilder += newPath;\n\n if (basename + branch.pathname === location.pathname) {\n if (\n // If the route defined on the element is something like\n // <Route path=\"/stores/:storeId/products/:productId\" element={<div>Product</div>} />\n // We should check against the branch.pathname for the number of / seperators\n getNumberOfUrlSegments(pathBuilder) !== getNumberOfUrlSegments(branch.pathname) &&\n // We should not count wildcard operators in the url segments calculation\n pathBuilder.slice(-2) !== '/*'\n ) {\n return [basename + newPath, 'route'];\n }\n return [basename + pathBuilder, 'route'];\n }\n }\n }\n }\n }\n\n return [location.pathname, 'url'];\n}\n\nfunction updatePageloadTransaction(\n location: Location,\n routes: RouteObject[],\n matches?: AgnosticDataRouteMatch,\n basename?: string,\n): void {\n const branches = Array.isArray(matches)\n ? matches\n : (_matchRoutes(routes, location, basename) as unknown as RouteMatch[]);\n\n if (activeTransaction && branches) {\n const [name, source] = getNormalizedName(routes, location, branches, basename);\n activeTransaction.updateName(name);\n activeTransaction.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, source);\n }\n}\n\nfunction handleNavigation(\n location: Location,\n routes: RouteObject[],\n navigationType: Action,\n matches?: AgnosticDataRouteMatch,\n basename?: string,\n): void {\n const branches = Array.isArray(matches) ? matches : _matchRoutes(routes, location, basename);\n\n if (_startTransactionOnLocationChange && (navigationType === 'PUSH' || navigationType === 'POP') && branches) {\n if (activeTransaction) {\n activeTransaction.end();\n }\n\n const [name, source] = getNormalizedName(routes, location, branches, basename);\n activeTransaction = _customStartTransaction({\n name,\n op: 'navigation',\n origin: 'auto.navigation.react.reactrouterv6',\n tags: SENTRY_TAGS,\n metadata: {\n source,\n },\n });\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function withSentryReactRouterV6Routing<P extends Record<string, any>, R extends React.FC<P>>(Routes: R): R {\n if (\n !_useEffect ||\n !_useLocation ||\n !_useNavigationType ||\n !_createRoutesFromChildren ||\n !_matchRoutes ||\n !_customStartTransaction\n ) {\n DEBUG_BUILD &&\n logger.warn(`reactRouterV6Instrumentation was unable to wrap Routes because of one or more missing parameters.\n useEffect: ${_useEffect}. useLocation: ${_useLocation}. useNavigationType: ${_useNavigationType}.\n createRoutesFromChildren: ${_createRoutesFromChildren}. matchRoutes: ${_matchRoutes}. customStartTransaction: ${_customStartTransaction}.`);\n\n return Routes;\n }\n\n let isMountRenderPass: boolean = true;\n\n const SentryRoutes: React.FC<P> = (props: P) => {\n const location = _useLocation();\n const navigationType = _useNavigationType();\n\n _useEffect(\n () => {\n const routes = _createRoutesFromChildren(props.children) as RouteObject[];\n\n if (isMountRenderPass) {\n updatePageloadTransaction(location, routes);\n isMountRenderPass = false;\n } else {\n handleNavigation(location, routes, navigationType);\n }\n },\n // `props.children` is purpusely not included in the dependency array, because we do not want to re-run this effect\n // when the children change. We only want to start transactions when the location or navigation type change.\n [location, navigationType],\n );\n\n // @ts-expect-error Setting more specific React Component typing for `R` generic above\n // will break advanced type inference done by react router params\n return <Routes {...props} />;\n };\n\n hoistNonReactStatics(SentryRoutes, Routes);\n\n // @ts-expect-error Setting more specific React Component typing for `R` generic above\n // will break advanced type inference done by react router params\n return SentryRoutes;\n}\n\nexport function wrapUseRoutes(origUseRoutes: UseRoutes): UseRoutes {\n if (!_useEffect || !_useLocation || !_useNavigationType || !_matchRoutes || !_customStartTransaction) {\n DEBUG_BUILD &&\n logger.warn(\n 'reactRouterV6Instrumentation was unable to wrap `useRoutes` because of one or more missing parameters.',\n );\n\n return origUseRoutes;\n }\n\n let isMountRenderPass: boolean = true;\n\n const SentryRoutes: React.FC<{\n children?: React.ReactNode;\n routes: RouteObject[];\n locationArg?: Partial<Location> | string;\n }> = (props: { children?: React.ReactNode; routes: RouteObject[]; locationArg?: Partial<Location> | string }) => {\n const { routes, locationArg } = props;\n\n const Routes = origUseRoutes(routes, locationArg);\n\n const location = _useLocation();\n const navigationType = _useNavigationType();\n\n // A value with stable identity to either pick `locationArg` if available or `location` if not\n const stableLocationParam =\n typeof locationArg === 'string' || (locationArg && locationArg.pathname)\n ? (locationArg as { pathname: string })\n : location;\n\n _useEffect(() => {\n const normalizedLocation =\n typeof stableLocationParam === 'string' ? { pathname: stableLocationParam } : stableLocationParam;\n\n if (isMountRenderPass) {\n updatePageloadTransaction(normalizedLocation, routes);\n isMountRenderPass = false;\n } else {\n handleNavigation(normalizedLocation, routes, navigationType);\n }\n }, [navigationType, stableLocationParam]);\n\n return Routes;\n };\n\n // eslint-disable-next-line react/display-name\n return (routes: RouteObject[], locationArg?: Partial<Location> | string): React.ReactElement | null => {\n return <SentryRoutes routes={routes} locationArg={locationArg} />;\n };\n}\n\nexport function wrapCreateBrowserRouter<\n TState extends RouterState = RouterState,\n TRouter extends Router<TState> = Router<TState>,\n>(createRouterFunction: CreateRouterFunction<TState, TRouter>): CreateRouterFunction<TState, TRouter> {\n // `opts` for createBrowserHistory and createMemoryHistory are different, but also not relevant for us at the moment.\n // `basename` is the only option that is relevant for us, and it is the same for all.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return function (routes: RouteObject[], opts?: Record<string, any> & { basename?: string }): TRouter {\n const router = createRouterFunction(routes, opts);\n const basename = opts && opts.basename;\n\n // The initial load ends when `createBrowserRouter` is called.\n // This is the earliest convenient time to update the transaction name.\n // Callbacks to `router.subscribe` are not called for the initial load.\n if (router.state.historyAction === 'POP' && activeTransaction) {\n updatePageloadTransaction(router.state.location, routes, undefined, basename);\n }\n\n router.subscribe((state: RouterState) => {\n const location = state.location;\n\n if (\n _startTransactionOnLocationChange &&\n (state.historyAction === 'PUSH' || state.historyAction === 'POP') &&\n activeTransaction\n ) {\n handleNavigation(location, routes, state.historyAction, undefined, basename);\n }\n });\n\n return router;\n };\n}\n"],"names":["WINDOW","getNumberOfUrlSegments","SEMANTIC_ATTRIBUTE_SENTRY_SOURCE","DEBUG_BUILD","logger","React","hoistNonReactStatics"],"mappings":"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"}
|
package/esm/errorboundary.js
CHANGED
|
@@ -56,6 +56,7 @@ class ErrorBoundary extends React.Component {
|
|
|
56
56
|
this._openFallbackReportDialog = false;
|
|
57
57
|
client.on('afterSendEvent', event => {
|
|
58
58
|
if (!event.type && event.event_id === this._lastEventId) {
|
|
59
|
+
// eslint-disable-next-line deprecation/deprecation
|
|
59
60
|
showReportDialog({ ...props.dialogOptions, eventId: this._lastEventId });
|
|
60
61
|
}
|
|
61
62
|
});
|
|
@@ -178,8 +179,8 @@ function withErrorBoundary(
|
|
|
178
179
|
const componentDisplayName = WrappedComponent.displayName || WrappedComponent.name || UNKNOWN_COMPONENT;
|
|
179
180
|
|
|
180
181
|
const Wrapped = (props) => (
|
|
181
|
-
React.createElement(ErrorBoundary, { ...errorBoundaryOptions, __self: this, __source: {fileName: _jsxFileName, lineNumber:
|
|
182
|
-
, React.createElement(WrappedComponent, { ...props, __self: this, __source: {fileName: _jsxFileName, lineNumber:
|
|
182
|
+
React.createElement(ErrorBoundary, { ...errorBoundaryOptions, __self: this, __source: {fileName: _jsxFileName, lineNumber: 238}}
|
|
183
|
+
, React.createElement(WrappedComponent, { ...props, __self: this, __source: {fileName: _jsxFileName, lineNumber: 239}} )
|
|
183
184
|
)
|
|
184
185
|
);
|
|
185
186
|
|
package/esm/errorboundary.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errorboundary.js","sources":["../../src/errorboundary.tsx"],"sourcesContent":["import type { ReportDialogOptions, Scope } from '@sentry/browser';\nimport { captureException, getClient, showReportDialog, withScope } from '@sentry/browser';\nimport { isError, logger } from '@sentry/utils';\nimport hoistNonReactStatics from 'hoist-non-react-statics';\nimport * as React from 'react';\n\nimport { DEBUG_BUILD } from './debug-build';\n\nexport function isAtLeastReact17(version: string): boolean {\n const major = version.match(/^([^.]+)/);\n return major !== null && parseInt(major[0]) >= 17;\n}\n\nexport const UNKNOWN_COMPONENT = 'unknown';\n\nexport type FallbackRender = (errorData: {\n error: Error;\n componentStack: string;\n eventId: string;\n resetError(): void;\n}) => React.ReactElement;\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 /** Called when the error boundary encounters an error */\n onError?: ((error: Error, componentStack: string, eventId: string) => void) | undefined;\n /** Called on componentDidMount() */\n onMount?: (() => void) | undefined;\n /** Called if resetError() is called from the fallback render props function */\n onReset?: ((error: Error | null, componentStack: string | null, eventId: string | null) => void) | undefined;\n /** Called on componentWillUnmount() */\n onUnmount?: ((error: Error | null, componentStack: string | null, eventId: string | null) => void) | 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: Error | null, componentStack: string | null) => 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: Error;\n eventId: string;\n };\n\nconst INITIAL_STATE = {\n componentStack: null,\n error: null,\n eventId: null,\n};\n\nfunction setCause(error: Error & { cause?: Error }, cause: Error): void {\n const seenErrors = new WeakMap<Error, boolean>();\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.set(error, true);\n return recurse(error.cause, cause);\n }\n error.cause = cause;\n }\n\n recurse(error, cause);\n}\n\n/**\n * A ErrorBoundary component that logs errors to Sentry. Requires React >= 16.\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\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 && client.on && props.showDialog) {\n this._openFallbackReportDialog = false;\n client.on('afterSendEvent', event => {\n if (!event.type && event.event_id === this._lastEventId) {\n showReportDialog({ ...props.dialogOptions, eventId: this._lastEventId });\n }\n });\n }\n }\n\n public componentDidCatch(error: Error & { cause?: Error }, { componentStack }: React.ErrorInfo): void {\n const { beforeCapture, onError, showDialog, dialogOptions } = this.props;\n withScope(scope => {\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(React.version) && isError(error)) {\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 if (beforeCapture) {\n beforeCapture(scope, error, componentStack);\n }\n\n const eventId = captureException(error, {\n captureContext: {\n contexts: { react: { componentStack } },\n },\n mechanism: { handled: false },\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 onUnmount(error, componentStack, eventId);\n }\n }\n\n public resetErrorBoundary: () => void = () => {\n const { onReset } = this.props;\n const { error, componentStack, eventId } = this.state;\n if (onReset) {\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 if (state.error) {\n let element: React.ReactElement | undefined = undefined;\n if (typeof fallback === 'function') {\n element = fallback({\n error: state.error,\n componentStack: state.componentStack,\n resetError: this.resetErrorBoundary,\n eventId: state.eventId,\n });\n } else {\n element = fallback;\n }\n\n if (React.isValidElement(element)) {\n return element;\n }\n\n if (fallback) {\n DEBUG_BUILD && logger.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 if (typeof children === 'function') {\n return (children as () => React.ReactNode)();\n }\n return children;\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 // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const componentDisplayName = WrappedComponent.displayName || WrappedComponent.name || UNKNOWN_COMPONENT;\n\n const Wrapped: React.FC<P> = (props: P) => (\n <ErrorBoundary {...errorBoundaryOptions}>\n <WrappedComponent {...props} />\n </ErrorBoundary>\n );\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\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":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"errorboundary.js","sources":["../../src/errorboundary.tsx"],"sourcesContent":["import type { ReportDialogOptions, Scope } from '@sentry/browser';\nimport { captureException, getClient, showReportDialog, withScope } from '@sentry/browser';\nimport { isError, logger } from '@sentry/utils';\nimport hoistNonReactStatics from 'hoist-non-react-statics';\nimport * as React from 'react';\n\nimport { DEBUG_BUILD } from './debug-build';\n\nexport function isAtLeastReact17(version: string): boolean {\n const major = version.match(/^([^.]+)/);\n return major !== null && parseInt(major[0]) >= 17;\n}\n\nexport const UNKNOWN_COMPONENT = 'unknown';\n\nexport type FallbackRender = (errorData: {\n error: Error;\n componentStack: string;\n eventId: string;\n resetError(): void;\n}) => React.ReactElement;\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 // eslint-disable-next-line deprecation/deprecation\n dialogOptions?: Omit<ReportDialogOptions, 'eventId'> | 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 /** Called when the error boundary encounters an error */\n onError?: ((error: Error, componentStack: string, eventId: string) => void) | undefined;\n /** Called on componentDidMount() */\n onMount?: (() => void) | undefined;\n /** Called if resetError() is called from the fallback render props function */\n onReset?: ((error: Error | null, componentStack: string | null, eventId: string | null) => void) | undefined;\n /** Called on componentWillUnmount() */\n onUnmount?: ((error: Error | null, componentStack: string | null, eventId: string | null) => void) | 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: Error | null, componentStack: string | null) => 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: Error;\n eventId: string;\n };\n\nconst INITIAL_STATE = {\n componentStack: null,\n error: null,\n eventId: null,\n};\n\nfunction setCause(error: Error & { cause?: Error }, cause: Error): void {\n const seenErrors = new WeakMap<Error, boolean>();\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.set(error, true);\n return recurse(error.cause, cause);\n }\n error.cause = cause;\n }\n\n recurse(error, cause);\n}\n\n/**\n * A ErrorBoundary component that logs errors to Sentry. Requires React >= 16.\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\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 && client.on && props.showDialog) {\n this._openFallbackReportDialog = false;\n client.on('afterSendEvent', event => {\n if (!event.type && event.event_id === this._lastEventId) {\n // eslint-disable-next-line deprecation/deprecation\n showReportDialog({ ...props.dialogOptions, eventId: this._lastEventId });\n }\n });\n }\n }\n\n public componentDidCatch(error: Error & { cause?: Error }, { componentStack }: React.ErrorInfo): void {\n const { beforeCapture, onError, showDialog, dialogOptions } = this.props;\n withScope(scope => {\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(React.version) && isError(error)) {\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 if (beforeCapture) {\n beforeCapture(scope, error, componentStack);\n }\n\n const eventId = captureException(error, {\n captureContext: {\n contexts: { react: { componentStack } },\n },\n mechanism: { handled: false },\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 onUnmount(error, componentStack, eventId);\n }\n }\n\n public resetErrorBoundary: () => void = () => {\n const { onReset } = this.props;\n const { error, componentStack, eventId } = this.state;\n if (onReset) {\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 if (state.error) {\n let element: React.ReactElement | undefined = undefined;\n if (typeof fallback === 'function') {\n element = fallback({\n error: state.error,\n componentStack: state.componentStack,\n resetError: this.resetErrorBoundary,\n eventId: state.eventId,\n });\n } else {\n element = fallback;\n }\n\n if (React.isValidElement(element)) {\n return element;\n }\n\n if (fallback) {\n DEBUG_BUILD && logger.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 if (typeof children === 'function') {\n return (children as () => React.ReactNode)();\n }\n return children;\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 // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const componentDisplayName = WrappedComponent.displayName || WrappedComponent.name || UNKNOWN_COMPONENT;\n\n const Wrapped: React.FC<P> = (props: P) => (\n <ErrorBoundary {...errorBoundaryOptions}>\n <WrappedComponent {...props} />\n </ErrorBoundary>\n );\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\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":[],"mappings":"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"}
|
package/esm/profiler.js
CHANGED
|
@@ -39,6 +39,7 @@ class Profiler extends React.Component {
|
|
|
39
39
|
|
|
40
40
|
const activeTransaction = getActiveTransaction();
|
|
41
41
|
if (activeTransaction) {
|
|
42
|
+
// eslint-disable-next-line deprecation/deprecation
|
|
42
43
|
this._mountSpan = activeTransaction.startChild({
|
|
43
44
|
description: `<${name}>`,
|
|
44
45
|
op: REACT_MOUNT_OP,
|
|
@@ -65,6 +66,7 @@ class Profiler extends React.Component {
|
|
|
65
66
|
const changedProps = Object.keys(updateProps).filter(k => updateProps[k] !== this.props.updateProps[k]);
|
|
66
67
|
if (changedProps.length > 0) {
|
|
67
68
|
const now = timestampInSeconds();
|
|
69
|
+
// eslint-disable-next-line deprecation/deprecation
|
|
68
70
|
this._updateSpan = this._mountSpan.startChild({
|
|
69
71
|
data: {
|
|
70
72
|
changedProps,
|
|
@@ -96,6 +98,7 @@ class Profiler extends React.Component {
|
|
|
96
98
|
if (this._mountSpan && includeRender) {
|
|
97
99
|
// If we were able to obtain the spanId of the mount activity, we should set the
|
|
98
100
|
// next activity as a child to the component mount activity.
|
|
101
|
+
// eslint-disable-next-line deprecation/deprecation
|
|
99
102
|
this._mountSpan.startChild({
|
|
100
103
|
description: `<${name}>`,
|
|
101
104
|
endTimestamp: timestampInSeconds(),
|
|
@@ -129,8 +132,8 @@ function withProfiler(
|
|
|
129
132
|
(options && options.name) || WrappedComponent.displayName || WrappedComponent.name || UNKNOWN_COMPONENT;
|
|
130
133
|
|
|
131
134
|
const Wrapped = (props) => (
|
|
132
|
-
React.createElement(Profiler, { ...options, name: componentDisplayName, updateProps: props, __self: this, __source: {fileName: _jsxFileName, lineNumber:
|
|
133
|
-
, React.createElement(WrappedComponent, { ...props, __self: this, __source: {fileName: _jsxFileName, lineNumber:
|
|
135
|
+
React.createElement(Profiler, { ...options, name: componentDisplayName, updateProps: props, __self: this, __source: {fileName: _jsxFileName, lineNumber: 155}}
|
|
136
|
+
, React.createElement(WrappedComponent, { ...props, __self: this, __source: {fileName: _jsxFileName, lineNumber: 156}} )
|
|
134
137
|
)
|
|
135
138
|
);
|
|
136
139
|
|
|
@@ -163,6 +166,7 @@ function useProfiler(
|
|
|
163
166
|
|
|
164
167
|
const activeTransaction = getActiveTransaction();
|
|
165
168
|
if (activeTransaction) {
|
|
169
|
+
// eslint-disable-next-line deprecation/deprecation
|
|
166
170
|
return activeTransaction.startChild({
|
|
167
171
|
description: `<${name}>`,
|
|
168
172
|
op: REACT_MOUNT_OP,
|
|
@@ -181,6 +185,7 @@ function useProfiler(
|
|
|
181
185
|
|
|
182
186
|
return () => {
|
|
183
187
|
if (mountSpan && options.hasRenderSpan) {
|
|
188
|
+
// eslint-disable-next-line deprecation/deprecation
|
|
184
189
|
mountSpan.startChild({
|
|
185
190
|
description: `<${name}>`,
|
|
186
191
|
endTimestamp: timestampInSeconds(),
|
|
@@ -200,6 +205,7 @@ function useProfiler(
|
|
|
200
205
|
function getActiveTransaction(hub = getCurrentHub()) {
|
|
201
206
|
if (hub) {
|
|
202
207
|
const scope = hub.getScope();
|
|
208
|
+
// eslint-disable-next-line deprecation/deprecation
|
|
203
209
|
return scope.getTransaction() ;
|
|
204
210
|
}
|
|
205
211
|
|
package/esm/profiler.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profiler.js","sources":["../../src/profiler.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { Hub } from '@sentry/browser';\nimport { getCurrentHub } from '@sentry/browser';\nimport type { Span, Transaction } from '@sentry/types';\nimport { timestampInSeconds } from '@sentry/utils';\nimport hoistNonReactStatics from 'hoist-non-react-statics';\nimport * as React from 'react';\n\nimport { REACT_MOUNT_OP, REACT_RENDER_OP, REACT_UPDATE_OP } from './constants';\n\nexport const UNKNOWN_COMPONENT = 'unknown';\n\nexport type ProfilerProps = {\n // The name of the component being profiled.\n name: string;\n // If the Profiler is disabled. False by default. This is useful if you want to disable profilers\n // in certain environments.\n disabled?: boolean;\n // If time component is on page should be displayed as spans. True by default.\n includeRender?: boolean;\n // If component updates should be displayed as spans. True by default.\n includeUpdates?: boolean;\n // Component that is being profiled.\n children?: React.ReactNode;\n // props given to component being profiled.\n updateProps: { [key: string]: unknown };\n};\n\n/**\n * The Profiler component leverages Sentry's Tracing integration to generate\n * spans based on component lifecycles.\n */\nclass Profiler extends React.Component<ProfilerProps> {\n /**\n * The span of the mount activity\n * Made protected for the React Native SDK to access\n */\n protected _mountSpan: Span | undefined;\n /**\n * The span that represents the duration of time between shouldComponentUpdate and componentDidUpdate\n */\n protected _updateSpan: Span | undefined;\n\n // eslint-disable-next-line @typescript-eslint/member-ordering\n public static defaultProps: Partial<ProfilerProps> = {\n disabled: false,\n includeRender: true,\n includeUpdates: true,\n };\n\n public constructor(props: ProfilerProps) {\n super(props);\n const { name, disabled = false } = this.props;\n\n if (disabled) {\n return;\n }\n\n const activeTransaction = getActiveTransaction();\n if (activeTransaction) {\n this._mountSpan = activeTransaction.startChild({\n description: `<${name}>`,\n op: REACT_MOUNT_OP,\n origin: 'auto.ui.react.profiler',\n data: { 'ui.component_name': name },\n });\n }\n }\n\n // If a component mounted, we can finish the mount activity.\n public componentDidMount(): void {\n if (this._mountSpan) {\n this._mountSpan.end();\n }\n }\n\n public shouldComponentUpdate({ updateProps, includeUpdates = true }: ProfilerProps): boolean {\n // Only generate an update span if includeUpdates is true, if there is a valid mountSpan,\n // and if the updateProps have changed. It is ok to not do a deep equality check here as it is expensive.\n // We are just trying to give baseline clues for further investigation.\n if (includeUpdates && this._mountSpan && updateProps !== this.props.updateProps) {\n // See what props haved changed between the previous props, and the current props. This is\n // set as data on the span. We just store the prop keys as the values could be potenially very large.\n const changedProps = Object.keys(updateProps).filter(k => updateProps[k] !== this.props.updateProps[k]);\n if (changedProps.length > 0) {\n const now = timestampInSeconds();\n this._updateSpan = this._mountSpan.startChild({\n data: {\n changedProps,\n 'ui.component_name': this.props.name,\n },\n description: `<${this.props.name}>`,\n op: REACT_UPDATE_OP,\n origin: 'auto.ui.react.profiler',\n startTimestamp: now,\n });\n }\n }\n\n return true;\n }\n\n public componentDidUpdate(): void {\n if (this._updateSpan) {\n this._updateSpan.end();\n this._updateSpan = undefined;\n }\n }\n\n // If a component is unmounted, we can say it is no longer on the screen.\n // This means we can finish the span representing the component render.\n public componentWillUnmount(): void {\n const { name, includeRender = true } = this.props;\n\n if (this._mountSpan && includeRender) {\n // If we were able to obtain the spanId of the mount activity, we should set the\n // next activity as a child to the component mount activity.\n this._mountSpan.startChild({\n description: `<${name}>`,\n endTimestamp: timestampInSeconds(),\n op: REACT_RENDER_OP,\n origin: 'auto.ui.react.profiler',\n startTimestamp: this._mountSpan.endTimestamp,\n data: { 'ui.component_name': name },\n });\n }\n }\n\n public render(): React.ReactNode {\n return this.props.children;\n }\n}\n\n/**\n * withProfiler is a higher order component that wraps a\n * component in a {@link Profiler} component. It is recommended that\n * the higher order component be used over the regular {@link Profiler} component.\n *\n * @param WrappedComponent component that is wrapped by Profiler\n * @param options the {@link ProfilerProps} you can pass into the Profiler\n */\nfunction withProfiler<P extends Record<string, any>>(\n WrappedComponent: React.ComponentType<P>,\n // We do not want to have `updateProps` given in options, it is instead filled through the HOC.\n options?: Pick<Partial<ProfilerProps>, Exclude<keyof ProfilerProps, 'updateProps' | 'children'>>,\n): React.FC<P> {\n const componentDisplayName =\n (options && options.name) || WrappedComponent.displayName || WrappedComponent.name || UNKNOWN_COMPONENT;\n\n const Wrapped: React.FC<P> = (props: P) => (\n <Profiler {...options} name={componentDisplayName} updateProps={props}>\n <WrappedComponent {...props} />\n </Profiler>\n );\n\n Wrapped.displayName = `profiler(${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\n/**\n *\n * `useProfiler` is a React hook that profiles a React component.\n *\n * Requires React 16.8 or above.\n * @param name displayName of component being profiled\n */\nfunction useProfiler(\n name: string,\n options: { disabled?: boolean; hasRenderSpan?: boolean } = {\n disabled: false,\n hasRenderSpan: true,\n },\n): void {\n const [mountSpan] = React.useState(() => {\n if (options && options.disabled) {\n return undefined;\n }\n\n const activeTransaction = getActiveTransaction();\n if (activeTransaction) {\n return activeTransaction.startChild({\n description: `<${name}>`,\n op: REACT_MOUNT_OP,\n origin: 'auto.ui.react.profiler',\n data: { 'ui.component_name': name },\n });\n }\n\n return undefined;\n });\n\n React.useEffect(() => {\n if (mountSpan) {\n mountSpan.end();\n }\n\n return (): void => {\n if (mountSpan && options.hasRenderSpan) {\n mountSpan.startChild({\n description: `<${name}>`,\n endTimestamp: timestampInSeconds(),\n op: REACT_RENDER_OP,\n origin: 'auto.ui.react.profiler',\n startTimestamp: mountSpan.endTimestamp,\n data: { 'ui.component_name': name },\n });\n }\n };\n // We only want this to run once.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n}\n\nexport { withProfiler, Profiler, useProfiler };\n\n/** Grabs active transaction off scope */\nexport function getActiveTransaction<T extends Transaction>(hub: Hub = getCurrentHub()): T | undefined {\n if (hub) {\n const scope = hub.getScope();\n return scope.getTransaction() as T | undefined;\n }\n\n return undefined;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"profiler.js","sources":["../../src/profiler.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { Hub } from '@sentry/browser';\nimport { getCurrentHub } from '@sentry/browser';\nimport type { Span, Transaction } from '@sentry/types';\nimport { timestampInSeconds } from '@sentry/utils';\nimport hoistNonReactStatics from 'hoist-non-react-statics';\nimport * as React from 'react';\n\nimport { REACT_MOUNT_OP, REACT_RENDER_OP, REACT_UPDATE_OP } from './constants';\n\nexport const UNKNOWN_COMPONENT = 'unknown';\n\nexport type ProfilerProps = {\n // The name of the component being profiled.\n name: string;\n // If the Profiler is disabled. False by default. This is useful if you want to disable profilers\n // in certain environments.\n disabled?: boolean;\n // If time component is on page should be displayed as spans. True by default.\n includeRender?: boolean;\n // If component updates should be displayed as spans. True by default.\n includeUpdates?: boolean;\n // Component that is being profiled.\n children?: React.ReactNode;\n // props given to component being profiled.\n updateProps: { [key: string]: unknown };\n};\n\n/**\n * The Profiler component leverages Sentry's Tracing integration to generate\n * spans based on component lifecycles.\n */\nclass Profiler extends React.Component<ProfilerProps> {\n /**\n * The span of the mount activity\n * Made protected for the React Native SDK to access\n */\n protected _mountSpan: Span | undefined;\n /**\n * The span that represents the duration of time between shouldComponentUpdate and componentDidUpdate\n */\n protected _updateSpan: Span | undefined;\n\n // eslint-disable-next-line @typescript-eslint/member-ordering\n public static defaultProps: Partial<ProfilerProps> = {\n disabled: false,\n includeRender: true,\n includeUpdates: true,\n };\n\n public constructor(props: ProfilerProps) {\n super(props);\n const { name, disabled = false } = this.props;\n\n if (disabled) {\n return;\n }\n\n const activeTransaction = getActiveTransaction();\n if (activeTransaction) {\n // eslint-disable-next-line deprecation/deprecation\n this._mountSpan = activeTransaction.startChild({\n description: `<${name}>`,\n op: REACT_MOUNT_OP,\n origin: 'auto.ui.react.profiler',\n data: { 'ui.component_name': name },\n });\n }\n }\n\n // If a component mounted, we can finish the mount activity.\n public componentDidMount(): void {\n if (this._mountSpan) {\n this._mountSpan.end();\n }\n }\n\n public shouldComponentUpdate({ updateProps, includeUpdates = true }: ProfilerProps): boolean {\n // Only generate an update span if includeUpdates is true, if there is a valid mountSpan,\n // and if the updateProps have changed. It is ok to not do a deep equality check here as it is expensive.\n // We are just trying to give baseline clues for further investigation.\n if (includeUpdates && this._mountSpan && updateProps !== this.props.updateProps) {\n // See what props haved changed between the previous props, and the current props. This is\n // set as data on the span. We just store the prop keys as the values could be potenially very large.\n const changedProps = Object.keys(updateProps).filter(k => updateProps[k] !== this.props.updateProps[k]);\n if (changedProps.length > 0) {\n const now = timestampInSeconds();\n // eslint-disable-next-line deprecation/deprecation\n this._updateSpan = this._mountSpan.startChild({\n data: {\n changedProps,\n 'ui.component_name': this.props.name,\n },\n description: `<${this.props.name}>`,\n op: REACT_UPDATE_OP,\n origin: 'auto.ui.react.profiler',\n startTimestamp: now,\n });\n }\n }\n\n return true;\n }\n\n public componentDidUpdate(): void {\n if (this._updateSpan) {\n this._updateSpan.end();\n this._updateSpan = undefined;\n }\n }\n\n // If a component is unmounted, we can say it is no longer on the screen.\n // This means we can finish the span representing the component render.\n public componentWillUnmount(): void {\n const { name, includeRender = true } = this.props;\n\n if (this._mountSpan && includeRender) {\n // If we were able to obtain the spanId of the mount activity, we should set the\n // next activity as a child to the component mount activity.\n // eslint-disable-next-line deprecation/deprecation\n this._mountSpan.startChild({\n description: `<${name}>`,\n endTimestamp: timestampInSeconds(),\n op: REACT_RENDER_OP,\n origin: 'auto.ui.react.profiler',\n startTimestamp: this._mountSpan.endTimestamp,\n data: { 'ui.component_name': name },\n });\n }\n }\n\n public render(): React.ReactNode {\n return this.props.children;\n }\n}\n\n/**\n * withProfiler is a higher order component that wraps a\n * component in a {@link Profiler} component. It is recommended that\n * the higher order component be used over the regular {@link Profiler} component.\n *\n * @param WrappedComponent component that is wrapped by Profiler\n * @param options the {@link ProfilerProps} you can pass into the Profiler\n */\nfunction withProfiler<P extends Record<string, any>>(\n WrappedComponent: React.ComponentType<P>,\n // We do not want to have `updateProps` given in options, it is instead filled through the HOC.\n options?: Pick<Partial<ProfilerProps>, Exclude<keyof ProfilerProps, 'updateProps' | 'children'>>,\n): React.FC<P> {\n const componentDisplayName =\n (options && options.name) || WrappedComponent.displayName || WrappedComponent.name || UNKNOWN_COMPONENT;\n\n const Wrapped: React.FC<P> = (props: P) => (\n <Profiler {...options} name={componentDisplayName} updateProps={props}>\n <WrappedComponent {...props} />\n </Profiler>\n );\n\n Wrapped.displayName = `profiler(${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\n/**\n *\n * `useProfiler` is a React hook that profiles a React component.\n *\n * Requires React 16.8 or above.\n * @param name displayName of component being profiled\n */\nfunction useProfiler(\n name: string,\n options: { disabled?: boolean; hasRenderSpan?: boolean } = {\n disabled: false,\n hasRenderSpan: true,\n },\n): void {\n const [mountSpan] = React.useState(() => {\n if (options && options.disabled) {\n return undefined;\n }\n\n const activeTransaction = getActiveTransaction();\n if (activeTransaction) {\n // eslint-disable-next-line deprecation/deprecation\n return activeTransaction.startChild({\n description: `<${name}>`,\n op: REACT_MOUNT_OP,\n origin: 'auto.ui.react.profiler',\n data: { 'ui.component_name': name },\n });\n }\n\n return undefined;\n });\n\n React.useEffect(() => {\n if (mountSpan) {\n mountSpan.end();\n }\n\n return (): void => {\n if (mountSpan && options.hasRenderSpan) {\n // eslint-disable-next-line deprecation/deprecation\n mountSpan.startChild({\n description: `<${name}>`,\n endTimestamp: timestampInSeconds(),\n op: REACT_RENDER_OP,\n origin: 'auto.ui.react.profiler',\n startTimestamp: mountSpan.endTimestamp,\n data: { 'ui.component_name': name },\n });\n }\n };\n // We only want this to run once.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n}\n\nexport { withProfiler, Profiler, useProfiler };\n\n/** Grabs active transaction off scope */\nexport function getActiveTransaction<T extends Transaction>(hub: Hub = getCurrentHub()): T | undefined {\n if (hub) {\n const scope = hub.getScope();\n // eslint-disable-next-line deprecation/deprecation\n return scope.getTransaction() as T | undefined;\n }\n\n return undefined;\n}\n"],"names":[],"mappings":"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"}
|
package/esm/reactrouter.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { WINDOW } from '@sentry/browser';
|
|
2
|
+
import { SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from '@sentry/core';
|
|
2
3
|
import hoistNonReactStatics from 'hoist-non-react-statics';
|
|
3
4
|
import * as React from 'react';
|
|
4
5
|
|
|
@@ -149,13 +150,14 @@ function withSentryRouting(Route) {
|
|
|
149
150
|
|
|
150
151
|
const WrappedRoute = (props) => {
|
|
151
152
|
if (activeTransaction && props && props.computedMatch && props.computedMatch.isExact) {
|
|
152
|
-
activeTransaction.
|
|
153
|
+
activeTransaction.updateName(props.computedMatch.path);
|
|
154
|
+
activeTransaction.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, 'route');
|
|
153
155
|
}
|
|
154
156
|
|
|
155
157
|
// @ts-expect-error Setting more specific React Component typing for `R` generic above
|
|
156
158
|
// will break advanced type inference done by react router params:
|
|
157
159
|
// https://github.com/DefinitelyTyped/DefinitelyTyped/blob/13dc4235c069e25fe7ee16e11f529d909f9f3ff8/types/react-router/index.d.ts#L154-L164
|
|
158
|
-
return React.createElement(Route, { ...props, __self: this, __source: {fileName: _jsxFileName, lineNumber:
|
|
160
|
+
return React.createElement(Route, { ...props, __self: this, __source: {fileName: _jsxFileName, lineNumber: 176}} );
|
|
159
161
|
};
|
|
160
162
|
|
|
161
163
|
WrappedRoute.displayName = `sentryRoute(${componentDisplayName})`;
|
package/esm/reactrouter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactrouter.js","sources":["../../src/reactrouter.tsx"],"sourcesContent":["import { WINDOW } from '@sentry/browser';\nimport type { Transaction, TransactionSource } from '@sentry/types';\nimport hoistNonReactStatics from 'hoist-non-react-statics';\nimport * as React from 'react';\n\nimport type { Action, Location, ReactRouterInstrumentation } from './types';\n\n// We need to disable eslint no-explict-any because any is required for the\n// react-router typings.\ntype Match = { path: string; url: string; params: Record<string, any>; isExact: boolean }; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nexport type RouterHistory = {\n location?: Location;\n listen?(cb: (location: Location, action: Action) => void): void;\n} & Record<string, any>; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nexport type RouteConfig = {\n [propName: string]: unknown;\n path?: string | string[];\n exact?: boolean;\n component?: JSX.Element;\n routes?: RouteConfig[];\n};\n\ntype MatchPath = (pathname: string, props: string | string[] | any, parent?: Match | null) => Match | null; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nlet activeTransaction: Transaction | undefined;\n\nexport function reactRouterV4Instrumentation(\n history: RouterHistory,\n routes?: RouteConfig[],\n matchPath?: MatchPath,\n): ReactRouterInstrumentation {\n return createReactRouterInstrumentation(history, 'react-router-v4', routes, matchPath);\n}\n\nexport function reactRouterV5Instrumentation(\n history: RouterHistory,\n routes?: RouteConfig[],\n matchPath?: MatchPath,\n): ReactRouterInstrumentation {\n return createReactRouterInstrumentation(history, 'react-router-v5', routes, matchPath);\n}\n\nfunction createReactRouterInstrumentation(\n history: RouterHistory,\n name: string,\n allRoutes: RouteConfig[] = [],\n matchPath?: MatchPath,\n): ReactRouterInstrumentation {\n function getInitPathName(): string | undefined {\n if (history && history.location) {\n return history.location.pathname;\n }\n\n if (WINDOW && WINDOW.location) {\n return WINDOW.location.pathname;\n }\n\n return undefined;\n }\n\n /**\n * Normalizes a transaction name. Returns the new name as well as the\n * source of the transaction.\n *\n * @param pathname The initial pathname we normalize\n */\n function normalizeTransactionName(pathname: string): [string, TransactionSource] {\n if (allRoutes.length === 0 || !matchPath) {\n return [pathname, 'url'];\n }\n\n const branches = matchRoutes(allRoutes, pathname, matchPath);\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let x = 0; x < branches.length; x++) {\n if (branches[x].match.isExact) {\n return [branches[x].match.path, 'route'];\n }\n }\n\n return [pathname, 'url'];\n }\n\n const tags = {\n 'routing.instrumentation': name,\n };\n\n return (customStartTransaction, startTransactionOnPageLoad = true, startTransactionOnLocationChange = true): void => {\n const initPathName = getInitPathName();\n if (startTransactionOnPageLoad && initPathName) {\n const [name, source] = normalizeTransactionName(initPathName);\n activeTransaction = customStartTransaction({\n name,\n op: 'pageload',\n origin: 'auto.pageload.react.reactrouter',\n tags,\n metadata: {\n source,\n },\n });\n }\n\n if (startTransactionOnLocationChange && history.listen) {\n history.listen((location, action) => {\n if (action && (action === 'PUSH' || action === 'POP')) {\n if (activeTransaction) {\n activeTransaction.end();\n }\n\n const [name, source] = normalizeTransactionName(location.pathname);\n activeTransaction = customStartTransaction({\n name,\n op: 'navigation',\n origin: 'auto.navigation.react.reactrouter',\n tags,\n metadata: {\n source,\n },\n });\n }\n });\n }\n };\n}\n\n/**\n * Matches a set of routes to a pathname\n * Based on implementation from\n */\nfunction matchRoutes(\n routes: RouteConfig[],\n pathname: string,\n matchPath: MatchPath,\n branch: Array<{ route: RouteConfig; match: Match }> = [],\n): Array<{ route: RouteConfig; match: Match }> {\n routes.some(route => {\n const match = route.path\n ? matchPath(pathname, route)\n : branch.length\n ? branch[branch.length - 1].match // use parent match\n : computeRootMatch(pathname); // use default \"root\" match\n\n if (match) {\n branch.push({ route, match });\n\n if (route.routes) {\n matchRoutes(route.routes, pathname, matchPath, branch);\n }\n }\n\n return !!match;\n });\n\n return branch;\n}\n\nfunction computeRootMatch(pathname: string): Match {\n return { path: '/', url: '/', params: {}, isExact: pathname === '/' };\n}\n\n/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access */\nexport function withSentryRouting<P extends Record<string, any>, R extends React.ComponentType<P>>(Route: R): R {\n const componentDisplayName = (Route as any).displayName || (Route as any).name;\n\n const WrappedRoute: React.FC<P> = (props: P) => {\n if (activeTransaction && props && props.computedMatch && props.computedMatch.isExact) {\n activeTransaction.setName(props.computedMatch.path, 'route');\n }\n\n // @ts-expect-error Setting more specific React Component typing for `R` generic above\n // will break advanced type inference done by react router params:\n // https://github.com/DefinitelyTyped/DefinitelyTyped/blob/13dc4235c069e25fe7ee16e11f529d909f9f3ff8/types/react-router/index.d.ts#L154-L164\n return <Route {...props} />;\n };\n\n WrappedRoute.displayName = `sentryRoute(${componentDisplayName})`;\n hoistNonReactStatics(WrappedRoute, Route);\n // @ts-expect-error Setting more specific React Component typing for `R` generic above\n // will break advanced type inference done by react router params:\n // https://github.com/DefinitelyTyped/DefinitelyTyped/blob/13dc4235c069e25fe7ee16e11f529d909f9f3ff8/types/react-router/index.d.ts#L154-L164\n return WrappedRoute;\n}\n/* eslint-enable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access */\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"reactrouter.js","sources":["../../src/reactrouter.tsx"],"sourcesContent":["import { WINDOW } from '@sentry/browser';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from '@sentry/core';\nimport type { Transaction, TransactionSource } from '@sentry/types';\nimport hoistNonReactStatics from 'hoist-non-react-statics';\nimport * as React from 'react';\n\nimport type { Action, Location, ReactRouterInstrumentation } from './types';\n\n// We need to disable eslint no-explict-any because any is required for the\n// react-router typings.\ntype Match = { path: string; url: string; params: Record<string, any>; isExact: boolean }; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nexport type RouterHistory = {\n location?: Location;\n listen?(cb: (location: Location, action: Action) => void): void;\n} & Record<string, any>; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nexport type RouteConfig = {\n [propName: string]: unknown;\n path?: string | string[];\n exact?: boolean;\n component?: JSX.Element;\n routes?: RouteConfig[];\n};\n\ntype MatchPath = (pathname: string, props: string | string[] | any, parent?: Match | null) => Match | null; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nlet activeTransaction: Transaction | undefined;\n\nexport function reactRouterV4Instrumentation(\n history: RouterHistory,\n routes?: RouteConfig[],\n matchPath?: MatchPath,\n): ReactRouterInstrumentation {\n return createReactRouterInstrumentation(history, 'react-router-v4', routes, matchPath);\n}\n\nexport function reactRouterV5Instrumentation(\n history: RouterHistory,\n routes?: RouteConfig[],\n matchPath?: MatchPath,\n): ReactRouterInstrumentation {\n return createReactRouterInstrumentation(history, 'react-router-v5', routes, matchPath);\n}\n\nfunction createReactRouterInstrumentation(\n history: RouterHistory,\n name: string,\n allRoutes: RouteConfig[] = [],\n matchPath?: MatchPath,\n): ReactRouterInstrumentation {\n function getInitPathName(): string | undefined {\n if (history && history.location) {\n return history.location.pathname;\n }\n\n if (WINDOW && WINDOW.location) {\n return WINDOW.location.pathname;\n }\n\n return undefined;\n }\n\n /**\n * Normalizes a transaction name. Returns the new name as well as the\n * source of the transaction.\n *\n * @param pathname The initial pathname we normalize\n */\n function normalizeTransactionName(pathname: string): [string, TransactionSource] {\n if (allRoutes.length === 0 || !matchPath) {\n return [pathname, 'url'];\n }\n\n const branches = matchRoutes(allRoutes, pathname, matchPath);\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let x = 0; x < branches.length; x++) {\n if (branches[x].match.isExact) {\n return [branches[x].match.path, 'route'];\n }\n }\n\n return [pathname, 'url'];\n }\n\n const tags = {\n 'routing.instrumentation': name,\n };\n\n return (customStartTransaction, startTransactionOnPageLoad = true, startTransactionOnLocationChange = true): void => {\n const initPathName = getInitPathName();\n if (startTransactionOnPageLoad && initPathName) {\n const [name, source] = normalizeTransactionName(initPathName);\n activeTransaction = customStartTransaction({\n name,\n op: 'pageload',\n origin: 'auto.pageload.react.reactrouter',\n tags,\n metadata: {\n source,\n },\n });\n }\n\n if (startTransactionOnLocationChange && history.listen) {\n history.listen((location, action) => {\n if (action && (action === 'PUSH' || action === 'POP')) {\n if (activeTransaction) {\n activeTransaction.end();\n }\n\n const [name, source] = normalizeTransactionName(location.pathname);\n activeTransaction = customStartTransaction({\n name,\n op: 'navigation',\n origin: 'auto.navigation.react.reactrouter',\n tags,\n metadata: {\n source,\n },\n });\n }\n });\n }\n };\n}\n\n/**\n * Matches a set of routes to a pathname\n * Based on implementation from\n */\nfunction matchRoutes(\n routes: RouteConfig[],\n pathname: string,\n matchPath: MatchPath,\n branch: Array<{ route: RouteConfig; match: Match }> = [],\n): Array<{ route: RouteConfig; match: Match }> {\n routes.some(route => {\n const match = route.path\n ? matchPath(pathname, route)\n : branch.length\n ? branch[branch.length - 1].match // use parent match\n : computeRootMatch(pathname); // use default \"root\" match\n\n if (match) {\n branch.push({ route, match });\n\n if (route.routes) {\n matchRoutes(route.routes, pathname, matchPath, branch);\n }\n }\n\n return !!match;\n });\n\n return branch;\n}\n\nfunction computeRootMatch(pathname: string): Match {\n return { path: '/', url: '/', params: {}, isExact: pathname === '/' };\n}\n\n/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access */\nexport function withSentryRouting<P extends Record<string, any>, R extends React.ComponentType<P>>(Route: R): R {\n const componentDisplayName = (Route as any).displayName || (Route as any).name;\n\n const WrappedRoute: React.FC<P> = (props: P) => {\n if (activeTransaction && props && props.computedMatch && props.computedMatch.isExact) {\n activeTransaction.updateName(props.computedMatch.path);\n activeTransaction.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, 'route');\n }\n\n // @ts-expect-error Setting more specific React Component typing for `R` generic above\n // will break advanced type inference done by react router params:\n // https://github.com/DefinitelyTyped/DefinitelyTyped/blob/13dc4235c069e25fe7ee16e11f529d909f9f3ff8/types/react-router/index.d.ts#L154-L164\n return <Route {...props} />;\n };\n\n WrappedRoute.displayName = `sentryRoute(${componentDisplayName})`;\n hoistNonReactStatics(WrappedRoute, Route);\n // @ts-expect-error Setting more specific React Component typing for `R` generic above\n // will break advanced type inference done by react router params:\n // https://github.com/DefinitelyTyped/DefinitelyTyped/blob/13dc4235c069e25fe7ee16e11f529d909f9f3ff8/types/react-router/index.d.ts#L154-L164\n return WrappedRoute;\n}\n/* eslint-enable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access */\n"],"names":[],"mappings":"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"}
|
package/esm/reactrouterv6.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { WINDOW } from '@sentry/browser';
|
|
2
|
+
import { SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from '@sentry/core';
|
|
2
3
|
import { logger, getNumberOfUrlSegments } from '@sentry/utils';
|
|
3
4
|
import hoistNonReactStatics from 'hoist-non-react-statics';
|
|
4
5
|
import * as React from 'react';
|
|
@@ -115,7 +116,9 @@ function updatePageloadTransaction(
|
|
|
115
116
|
: (_matchRoutes(routes, location, basename) );
|
|
116
117
|
|
|
117
118
|
if (activeTransaction && branches) {
|
|
118
|
-
|
|
119
|
+
const [name, source] = getNormalizedName(routes, location, branches, basename);
|
|
120
|
+
activeTransaction.updateName(name);
|
|
121
|
+
activeTransaction.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, source);
|
|
119
122
|
}
|
|
120
123
|
}
|
|
121
124
|
|
|
@@ -188,7 +191,7 @@ function withSentryReactRouterV6Routing(Routes) {
|
|
|
188
191
|
|
|
189
192
|
// @ts-expect-error Setting more specific React Component typing for `R` generic above
|
|
190
193
|
// will break advanced type inference done by react router params
|
|
191
|
-
return React.createElement(Routes, { ...props, __self: this, __source: {fileName: _jsxFileName, lineNumber:
|
|
194
|
+
return React.createElement(Routes, { ...props, __self: this, __source: {fileName: _jsxFileName, lineNumber: 213}} );
|
|
192
195
|
};
|
|
193
196
|
|
|
194
197
|
hoistNonReactStatics(SentryRoutes, Routes);
|
|
@@ -243,7 +246,7 @@ function wrapUseRoutes(origUseRoutes) {
|
|
|
243
246
|
|
|
244
247
|
// eslint-disable-next-line react/display-name
|
|
245
248
|
return (routes, locationArg) => {
|
|
246
|
-
return React.createElement(SentryRoutes, { routes: routes, locationArg: locationArg, __self: this, __source: {fileName: _jsxFileName, lineNumber:
|
|
249
|
+
return React.createElement(SentryRoutes, { routes: routes, locationArg: locationArg, __self: this, __source: {fileName: _jsxFileName, lineNumber: 270}} );
|
|
247
250
|
};
|
|
248
251
|
}
|
|
249
252
|
|
package/esm/reactrouterv6.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactrouterv6.js","sources":["../../src/reactrouterv6.tsx"],"sourcesContent":["// Inspired from Donnie McNeal's solution:\n// https://gist.github.com/wontondon/e8c4bdf2888875e4c755712e99279536\n\nimport { WINDOW } from '@sentry/browser';\nimport type { Transaction, TransactionContext, TransactionSource } from '@sentry/types';\nimport { getNumberOfUrlSegments, logger } from '@sentry/utils';\nimport hoistNonReactStatics from 'hoist-non-react-statics';\nimport * as React from 'react';\n\nimport { DEBUG_BUILD } from './debug-build';\nimport type {\n Action,\n AgnosticDataRouteMatch,\n CreateRouterFunction,\n CreateRoutesFromChildren,\n Location,\n MatchRoutes,\n RouteMatch,\n RouteObject,\n Router,\n RouterState,\n UseEffect,\n UseLocation,\n UseNavigationType,\n UseRoutes,\n} from './types';\n\nlet activeTransaction: Transaction | undefined;\n\nlet _useEffect: UseEffect;\nlet _useLocation: UseLocation;\nlet _useNavigationType: UseNavigationType;\nlet _createRoutesFromChildren: CreateRoutesFromChildren;\nlet _matchRoutes: MatchRoutes;\nlet _customStartTransaction: (context: TransactionContext) => Transaction | undefined;\nlet _startTransactionOnLocationChange: boolean;\n\nconst SENTRY_TAGS = {\n 'routing.instrumentation': 'react-router-v6',\n};\n\nexport function reactRouterV6Instrumentation(\n useEffect: UseEffect,\n useLocation: UseLocation,\n useNavigationType: UseNavigationType,\n createRoutesFromChildren: CreateRoutesFromChildren,\n matchRoutes: MatchRoutes,\n) {\n return (\n customStartTransaction: (context: TransactionContext) => Transaction | undefined,\n startTransactionOnPageLoad = true,\n startTransactionOnLocationChange = true,\n ): void => {\n const initPathName = WINDOW && WINDOW.location && WINDOW.location.pathname;\n if (startTransactionOnPageLoad && initPathName) {\n activeTransaction = customStartTransaction({\n name: initPathName,\n op: 'pageload',\n origin: 'auto.pageload.react.reactrouterv6',\n tags: SENTRY_TAGS,\n metadata: {\n source: 'url',\n },\n });\n }\n\n _useEffect = useEffect;\n _useLocation = useLocation;\n _useNavigationType = useNavigationType;\n _matchRoutes = matchRoutes;\n _createRoutesFromChildren = createRoutesFromChildren;\n\n _customStartTransaction = customStartTransaction;\n _startTransactionOnLocationChange = startTransactionOnLocationChange;\n };\n}\n\nfunction getNormalizedName(\n routes: RouteObject[],\n location: Location,\n branches: RouteMatch[],\n basename: string = '',\n): [string, TransactionSource] {\n if (!routes || routes.length === 0) {\n return [location.pathname, 'url'];\n }\n\n let pathBuilder = '';\n if (branches) {\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let x = 0; x < branches.length; x++) {\n const branch = branches[x];\n const route = branch.route;\n if (route) {\n // Early return if index route\n if (route.index) {\n return [branch.pathname, 'route'];\n }\n\n const path = route.path;\n if (path) {\n const newPath = path[0] === '/' || pathBuilder[pathBuilder.length - 1] === '/' ? path : `/${path}`;\n pathBuilder += newPath;\n\n if (basename + branch.pathname === location.pathname) {\n if (\n // If the route defined on the element is something like\n // <Route path=\"/stores/:storeId/products/:productId\" element={<div>Product</div>} />\n // We should check against the branch.pathname for the number of / seperators\n getNumberOfUrlSegments(pathBuilder) !== getNumberOfUrlSegments(branch.pathname) &&\n // We should not count wildcard operators in the url segments calculation\n pathBuilder.slice(-2) !== '/*'\n ) {\n return [basename + newPath, 'route'];\n }\n return [basename + pathBuilder, 'route'];\n }\n }\n }\n }\n }\n\n return [location.pathname, 'url'];\n}\n\nfunction updatePageloadTransaction(\n location: Location,\n routes: RouteObject[],\n matches?: AgnosticDataRouteMatch,\n basename?: string,\n): void {\n const branches = Array.isArray(matches)\n ? matches\n : (_matchRoutes(routes, location, basename) as unknown as RouteMatch[]);\n\n if (activeTransaction && branches) {\n activeTransaction.setName(...getNormalizedName(routes, location, branches, basename));\n }\n}\n\nfunction handleNavigation(\n location: Location,\n routes: RouteObject[],\n navigationType: Action,\n matches?: AgnosticDataRouteMatch,\n basename?: string,\n): void {\n const branches = Array.isArray(matches) ? matches : _matchRoutes(routes, location, basename);\n\n if (_startTransactionOnLocationChange && (navigationType === 'PUSH' || navigationType === 'POP') && branches) {\n if (activeTransaction) {\n activeTransaction.end();\n }\n\n const [name, source] = getNormalizedName(routes, location, branches, basename);\n activeTransaction = _customStartTransaction({\n name,\n op: 'navigation',\n origin: 'auto.navigation.react.reactrouterv6',\n tags: SENTRY_TAGS,\n metadata: {\n source,\n },\n });\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function withSentryReactRouterV6Routing<P extends Record<string, any>, R extends React.FC<P>>(Routes: R): R {\n if (\n !_useEffect ||\n !_useLocation ||\n !_useNavigationType ||\n !_createRoutesFromChildren ||\n !_matchRoutes ||\n !_customStartTransaction\n ) {\n DEBUG_BUILD &&\n logger.warn(`reactRouterV6Instrumentation was unable to wrap Routes because of one or more missing parameters.\n useEffect: ${_useEffect}. useLocation: ${_useLocation}. useNavigationType: ${_useNavigationType}.\n createRoutesFromChildren: ${_createRoutesFromChildren}. matchRoutes: ${_matchRoutes}. customStartTransaction: ${_customStartTransaction}.`);\n\n return Routes;\n }\n\n let isMountRenderPass: boolean = true;\n\n const SentryRoutes: React.FC<P> = (props: P) => {\n const location = _useLocation();\n const navigationType = _useNavigationType();\n\n _useEffect(\n () => {\n const routes = _createRoutesFromChildren(props.children) as RouteObject[];\n\n if (isMountRenderPass) {\n updatePageloadTransaction(location, routes);\n isMountRenderPass = false;\n } else {\n handleNavigation(location, routes, navigationType);\n }\n },\n // `props.children` is purpusely not included in the dependency array, because we do not want to re-run this effect\n // when the children change. We only want to start transactions when the location or navigation type change.\n [location, navigationType],\n );\n\n // @ts-expect-error Setting more specific React Component typing for `R` generic above\n // will break advanced type inference done by react router params\n return <Routes {...props} />;\n };\n\n hoistNonReactStatics(SentryRoutes, Routes);\n\n // @ts-expect-error Setting more specific React Component typing for `R` generic above\n // will break advanced type inference done by react router params\n return SentryRoutes;\n}\n\nexport function wrapUseRoutes(origUseRoutes: UseRoutes): UseRoutes {\n if (!_useEffect || !_useLocation || !_useNavigationType || !_matchRoutes || !_customStartTransaction) {\n DEBUG_BUILD &&\n logger.warn(\n 'reactRouterV6Instrumentation was unable to wrap `useRoutes` because of one or more missing parameters.',\n );\n\n return origUseRoutes;\n }\n\n let isMountRenderPass: boolean = true;\n\n const SentryRoutes: React.FC<{\n children?: React.ReactNode;\n routes: RouteObject[];\n locationArg?: Partial<Location> | string;\n }> = (props: { children?: React.ReactNode; routes: RouteObject[]; locationArg?: Partial<Location> | string }) => {\n const { routes, locationArg } = props;\n\n const Routes = origUseRoutes(routes, locationArg);\n\n const location = _useLocation();\n const navigationType = _useNavigationType();\n\n // A value with stable identity to either pick `locationArg` if available or `location` if not\n const stableLocationParam =\n typeof locationArg === 'string' || (locationArg && locationArg.pathname)\n ? (locationArg as { pathname: string })\n : location;\n\n _useEffect(() => {\n const normalizedLocation =\n typeof stableLocationParam === 'string' ? { pathname: stableLocationParam } : stableLocationParam;\n\n if (isMountRenderPass) {\n updatePageloadTransaction(normalizedLocation, routes);\n isMountRenderPass = false;\n } else {\n handleNavigation(normalizedLocation, routes, navigationType);\n }\n }, [navigationType, stableLocationParam]);\n\n return Routes;\n };\n\n // eslint-disable-next-line react/display-name\n return (routes: RouteObject[], locationArg?: Partial<Location> | string): React.ReactElement | null => {\n return <SentryRoutes routes={routes} locationArg={locationArg} />;\n };\n}\n\nexport function wrapCreateBrowserRouter<\n TState extends RouterState = RouterState,\n TRouter extends Router<TState> = Router<TState>,\n>(createRouterFunction: CreateRouterFunction<TState, TRouter>): CreateRouterFunction<TState, TRouter> {\n // `opts` for createBrowserHistory and createMemoryHistory are different, but also not relevant for us at the moment.\n // `basename` is the only option that is relevant for us, and it is the same for all.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return function (routes: RouteObject[], opts?: Record<string, any> & { basename?: string }): TRouter {\n const router = createRouterFunction(routes, opts);\n const basename = opts && opts.basename;\n\n // The initial load ends when `createBrowserRouter` is called.\n // This is the earliest convenient time to update the transaction name.\n // Callbacks to `router.subscribe` are not called for the initial load.\n if (router.state.historyAction === 'POP' && activeTransaction) {\n updatePageloadTransaction(router.state.location, routes, undefined, basename);\n }\n\n router.subscribe((state: RouterState) => {\n const location = state.location;\n\n if (\n _startTransactionOnLocationChange &&\n (state.historyAction === 'PUSH' || state.historyAction === 'POP') &&\n activeTransaction\n ) {\n handleNavigation(location, routes, state.historyAction, undefined, basename);\n }\n });\n\n return router;\n };\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"reactrouterv6.js","sources":["../../src/reactrouterv6.tsx"],"sourcesContent":["// Inspired from Donnie McNeal's solution:\n// https://gist.github.com/wontondon/e8c4bdf2888875e4c755712e99279536\n\nimport { WINDOW } from '@sentry/browser';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from '@sentry/core';\nimport type { Transaction, TransactionContext, TransactionSource } from '@sentry/types';\nimport { getNumberOfUrlSegments, logger } from '@sentry/utils';\nimport hoistNonReactStatics from 'hoist-non-react-statics';\nimport * as React from 'react';\n\nimport { DEBUG_BUILD } from './debug-build';\nimport type {\n Action,\n AgnosticDataRouteMatch,\n CreateRouterFunction,\n CreateRoutesFromChildren,\n Location,\n MatchRoutes,\n RouteMatch,\n RouteObject,\n Router,\n RouterState,\n UseEffect,\n UseLocation,\n UseNavigationType,\n UseRoutes,\n} from './types';\n\nlet activeTransaction: Transaction | undefined;\n\nlet _useEffect: UseEffect;\nlet _useLocation: UseLocation;\nlet _useNavigationType: UseNavigationType;\nlet _createRoutesFromChildren: CreateRoutesFromChildren;\nlet _matchRoutes: MatchRoutes;\nlet _customStartTransaction: (context: TransactionContext) => Transaction | undefined;\nlet _startTransactionOnLocationChange: boolean;\n\nconst SENTRY_TAGS = {\n 'routing.instrumentation': 'react-router-v6',\n};\n\nexport function reactRouterV6Instrumentation(\n useEffect: UseEffect,\n useLocation: UseLocation,\n useNavigationType: UseNavigationType,\n createRoutesFromChildren: CreateRoutesFromChildren,\n matchRoutes: MatchRoutes,\n) {\n return (\n customStartTransaction: (context: TransactionContext) => Transaction | undefined,\n startTransactionOnPageLoad = true,\n startTransactionOnLocationChange = true,\n ): void => {\n const initPathName = WINDOW && WINDOW.location && WINDOW.location.pathname;\n if (startTransactionOnPageLoad && initPathName) {\n activeTransaction = customStartTransaction({\n name: initPathName,\n op: 'pageload',\n origin: 'auto.pageload.react.reactrouterv6',\n tags: SENTRY_TAGS,\n metadata: {\n source: 'url',\n },\n });\n }\n\n _useEffect = useEffect;\n _useLocation = useLocation;\n _useNavigationType = useNavigationType;\n _matchRoutes = matchRoutes;\n _createRoutesFromChildren = createRoutesFromChildren;\n\n _customStartTransaction = customStartTransaction;\n _startTransactionOnLocationChange = startTransactionOnLocationChange;\n };\n}\n\nfunction getNormalizedName(\n routes: RouteObject[],\n location: Location,\n branches: RouteMatch[],\n basename: string = '',\n): [string, TransactionSource] {\n if (!routes || routes.length === 0) {\n return [location.pathname, 'url'];\n }\n\n let pathBuilder = '';\n if (branches) {\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let x = 0; x < branches.length; x++) {\n const branch = branches[x];\n const route = branch.route;\n if (route) {\n // Early return if index route\n if (route.index) {\n return [branch.pathname, 'route'];\n }\n\n const path = route.path;\n if (path) {\n const newPath = path[0] === '/' || pathBuilder[pathBuilder.length - 1] === '/' ? path : `/${path}`;\n pathBuilder += newPath;\n\n if (basename + branch.pathname === location.pathname) {\n if (\n // If the route defined on the element is something like\n // <Route path=\"/stores/:storeId/products/:productId\" element={<div>Product</div>} />\n // We should check against the branch.pathname for the number of / seperators\n getNumberOfUrlSegments(pathBuilder) !== getNumberOfUrlSegments(branch.pathname) &&\n // We should not count wildcard operators in the url segments calculation\n pathBuilder.slice(-2) !== '/*'\n ) {\n return [basename + newPath, 'route'];\n }\n return [basename + pathBuilder, 'route'];\n }\n }\n }\n }\n }\n\n return [location.pathname, 'url'];\n}\n\nfunction updatePageloadTransaction(\n location: Location,\n routes: RouteObject[],\n matches?: AgnosticDataRouteMatch,\n basename?: string,\n): void {\n const branches = Array.isArray(matches)\n ? matches\n : (_matchRoutes(routes, location, basename) as unknown as RouteMatch[]);\n\n if (activeTransaction && branches) {\n const [name, source] = getNormalizedName(routes, location, branches, basename);\n activeTransaction.updateName(name);\n activeTransaction.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, source);\n }\n}\n\nfunction handleNavigation(\n location: Location,\n routes: RouteObject[],\n navigationType: Action,\n matches?: AgnosticDataRouteMatch,\n basename?: string,\n): void {\n const branches = Array.isArray(matches) ? matches : _matchRoutes(routes, location, basename);\n\n if (_startTransactionOnLocationChange && (navigationType === 'PUSH' || navigationType === 'POP') && branches) {\n if (activeTransaction) {\n activeTransaction.end();\n }\n\n const [name, source] = getNormalizedName(routes, location, branches, basename);\n activeTransaction = _customStartTransaction({\n name,\n op: 'navigation',\n origin: 'auto.navigation.react.reactrouterv6',\n tags: SENTRY_TAGS,\n metadata: {\n source,\n },\n });\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function withSentryReactRouterV6Routing<P extends Record<string, any>, R extends React.FC<P>>(Routes: R): R {\n if (\n !_useEffect ||\n !_useLocation ||\n !_useNavigationType ||\n !_createRoutesFromChildren ||\n !_matchRoutes ||\n !_customStartTransaction\n ) {\n DEBUG_BUILD &&\n logger.warn(`reactRouterV6Instrumentation was unable to wrap Routes because of one or more missing parameters.\n useEffect: ${_useEffect}. useLocation: ${_useLocation}. useNavigationType: ${_useNavigationType}.\n createRoutesFromChildren: ${_createRoutesFromChildren}. matchRoutes: ${_matchRoutes}. customStartTransaction: ${_customStartTransaction}.`);\n\n return Routes;\n }\n\n let isMountRenderPass: boolean = true;\n\n const SentryRoutes: React.FC<P> = (props: P) => {\n const location = _useLocation();\n const navigationType = _useNavigationType();\n\n _useEffect(\n () => {\n const routes = _createRoutesFromChildren(props.children) as RouteObject[];\n\n if (isMountRenderPass) {\n updatePageloadTransaction(location, routes);\n isMountRenderPass = false;\n } else {\n handleNavigation(location, routes, navigationType);\n }\n },\n // `props.children` is purpusely not included in the dependency array, because we do not want to re-run this effect\n // when the children change. We only want to start transactions when the location or navigation type change.\n [location, navigationType],\n );\n\n // @ts-expect-error Setting more specific React Component typing for `R` generic above\n // will break advanced type inference done by react router params\n return <Routes {...props} />;\n };\n\n hoistNonReactStatics(SentryRoutes, Routes);\n\n // @ts-expect-error Setting more specific React Component typing for `R` generic above\n // will break advanced type inference done by react router params\n return SentryRoutes;\n}\n\nexport function wrapUseRoutes(origUseRoutes: UseRoutes): UseRoutes {\n if (!_useEffect || !_useLocation || !_useNavigationType || !_matchRoutes || !_customStartTransaction) {\n DEBUG_BUILD &&\n logger.warn(\n 'reactRouterV6Instrumentation was unable to wrap `useRoutes` because of one or more missing parameters.',\n );\n\n return origUseRoutes;\n }\n\n let isMountRenderPass: boolean = true;\n\n const SentryRoutes: React.FC<{\n children?: React.ReactNode;\n routes: RouteObject[];\n locationArg?: Partial<Location> | string;\n }> = (props: { children?: React.ReactNode; routes: RouteObject[]; locationArg?: Partial<Location> | string }) => {\n const { routes, locationArg } = props;\n\n const Routes = origUseRoutes(routes, locationArg);\n\n const location = _useLocation();\n const navigationType = _useNavigationType();\n\n // A value with stable identity to either pick `locationArg` if available or `location` if not\n const stableLocationParam =\n typeof locationArg === 'string' || (locationArg && locationArg.pathname)\n ? (locationArg as { pathname: string })\n : location;\n\n _useEffect(() => {\n const normalizedLocation =\n typeof stableLocationParam === 'string' ? { pathname: stableLocationParam } : stableLocationParam;\n\n if (isMountRenderPass) {\n updatePageloadTransaction(normalizedLocation, routes);\n isMountRenderPass = false;\n } else {\n handleNavigation(normalizedLocation, routes, navigationType);\n }\n }, [navigationType, stableLocationParam]);\n\n return Routes;\n };\n\n // eslint-disable-next-line react/display-name\n return (routes: RouteObject[], locationArg?: Partial<Location> | string): React.ReactElement | null => {\n return <SentryRoutes routes={routes} locationArg={locationArg} />;\n };\n}\n\nexport function wrapCreateBrowserRouter<\n TState extends RouterState = RouterState,\n TRouter extends Router<TState> = Router<TState>,\n>(createRouterFunction: CreateRouterFunction<TState, TRouter>): CreateRouterFunction<TState, TRouter> {\n // `opts` for createBrowserHistory and createMemoryHistory are different, but also not relevant for us at the moment.\n // `basename` is the only option that is relevant for us, and it is the same for all.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return function (routes: RouteObject[], opts?: Record<string, any> & { basename?: string }): TRouter {\n const router = createRouterFunction(routes, opts);\n const basename = opts && opts.basename;\n\n // The initial load ends when `createBrowserRouter` is called.\n // This is the earliest convenient time to update the transaction name.\n // Callbacks to `router.subscribe` are not called for the initial load.\n if (router.state.historyAction === 'POP' && activeTransaction) {\n updatePageloadTransaction(router.state.location, routes, undefined, basename);\n }\n\n router.subscribe((state: RouterState) => {\n const location = state.location;\n\n if (\n _startTransactionOnLocationChange &&\n (state.historyAction === 'PUSH' || state.historyAction === 'POP') &&\n activeTransaction\n ) {\n handleNavigation(location, routes, state.historyAction, undefined, basename);\n }\n });\n\n return router;\n };\n}\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sentry/react",
|
|
3
|
-
"version": "7.
|
|
3
|
+
"version": "7.93.0",
|
|
4
4
|
"description": "Official Sentry SDK for React.js",
|
|
5
5
|
"repository": "git://github.com/getsentry/sentry-javascript.git",
|
|
6
6
|
"homepage": "https://github.com/getsentry/sentry-javascript/tree/master/packages/react",
|
|
@@ -9,6 +9,12 @@
|
|
|
9
9
|
"engines": {
|
|
10
10
|
"node": ">=8"
|
|
11
11
|
},
|
|
12
|
+
"files": [
|
|
13
|
+
"cjs",
|
|
14
|
+
"esm",
|
|
15
|
+
"types",
|
|
16
|
+
"types-ts3.8"
|
|
17
|
+
],
|
|
12
18
|
"main": "cjs/index.js",
|
|
13
19
|
"module": "esm/index.js",
|
|
14
20
|
"types": "types/index.d.ts",
|
|
@@ -23,9 +29,10 @@
|
|
|
23
29
|
"access": "public"
|
|
24
30
|
},
|
|
25
31
|
"dependencies": {
|
|
26
|
-
"@sentry/browser": "7.
|
|
27
|
-
"@sentry/
|
|
28
|
-
"@sentry/
|
|
32
|
+
"@sentry/browser": "7.93.0",
|
|
33
|
+
"@sentry/core": "7.93.0",
|
|
34
|
+
"@sentry/types": "7.93.0",
|
|
35
|
+
"@sentry/utils": "7.93.0",
|
|
29
36
|
"hoist-non-react-statics": "^3.3.2"
|
|
30
37
|
},
|
|
31
38
|
"peerDependencies": {
|
package/types/errorboundary.d.ts
CHANGED
|
@@ -16,7 +16,7 @@ export type ErrorBoundaryProps = {
|
|
|
16
16
|
* Options to be passed into the Sentry report dialog.
|
|
17
17
|
* No-op if {@link showDialog} is false.
|
|
18
18
|
*/
|
|
19
|
-
dialogOptions?: ReportDialogOptions | undefined;
|
|
19
|
+
dialogOptions?: Omit<ReportDialogOptions, 'eventId'> | undefined;
|
|
20
20
|
/**
|
|
21
21
|
* A fallback component that gets rendered when the error boundary encounters an error.
|
|
22
22
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errorboundary.d.ts","sourceRoot":"","sources":["../../src/errorboundary.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAIlE,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAGzD;AAED,eAAO,MAAM,iBAAiB,YAAY,CAAC;AAE3C,MAAM,MAAM,cAAc,GAAG,CAAC,SAAS,EAAE;IACvC,KAAK,EAAE,KAAK,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,IAAI,IAAI,CAAC;CACpB,KAAK,KAAK,CAAC,YAAY,CAAC;AAEzB,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,CAAC,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC;IACrD,4DAA4D;IAC5D,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC;;;OAGG;
|
|
1
|
+
{"version":3,"file":"errorboundary.d.ts","sourceRoot":"","sources":["../../src/errorboundary.tsx"],"names":[],"mappings":"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"}
|
package/types/profiler.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profiler.d.ts","sourceRoot":"","sources":["../../src/profiler.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAE3C,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAGvD,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,eAAO,MAAM,iBAAiB,YAAY,CAAC;AAE3C,MAAM,MAAM,aAAa,GAAG;IAE1B,IAAI,EAAE,MAAM,CAAC;IAGb,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAE3B,WAAW,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;CACzC,CAAC;AAEF;;;GAGG;AACH,cAAM,QAAS,SAAQ,KAAK,CAAC,SAAS,CAAC,aAAa,CAAC;IACnD;;;OAGG;IACH,SAAS,CAAC,UAAU,EAAE,IAAI,GAAG,SAAS,CAAC;IACvC;;OAEG;IACH,SAAS,CAAC,WAAW,EAAE,IAAI,GAAG,SAAS,CAAC;IAGxC,OAAc,YAAY,EAAE,OAAO,CAAC,aAAa,CAAC,CAIhD;gBAEiB,KAAK,EAAE,aAAa;
|
|
1
|
+
{"version":3,"file":"profiler.d.ts","sourceRoot":"","sources":["../../src/profiler.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAE3C,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAGvD,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,eAAO,MAAM,iBAAiB,YAAY,CAAC;AAE3C,MAAM,MAAM,aAAa,GAAG;IAE1B,IAAI,EAAE,MAAM,CAAC;IAGb,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAE3B,WAAW,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;CACzC,CAAC;AAEF;;;GAGG;AACH,cAAM,QAAS,SAAQ,KAAK,CAAC,SAAS,CAAC,aAAa,CAAC;IACnD;;;OAGG;IACH,SAAS,CAAC,UAAU,EAAE,IAAI,GAAG,SAAS,CAAC;IACvC;;OAEG;IACH,SAAS,CAAC,WAAW,EAAE,IAAI,GAAG,SAAS,CAAC;IAGxC,OAAc,YAAY,EAAE,OAAO,CAAC,aAAa,CAAC,CAIhD;gBAEiB,KAAK,EAAE,aAAa;IAqBhC,iBAAiB,IAAI,IAAI;IAMzB,qBAAqB,CAAC,EAAE,WAAW,EAAE,cAAqB,EAAE,EAAE,aAAa,GAAG,OAAO;IA2BrF,kBAAkB,IAAI,IAAI;IAS1B,oBAAoB,IAAI,IAAI;IAkB5B,MAAM,IAAI,KAAK,CAAC,SAAS;CAGjC;AAED;;;;;;;GAOG;AACH,iBAAS,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACjD,gBAAgB,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EAExC,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC,MAAM,aAAa,EAAE,aAAa,GAAG,UAAU,CAAC,CAAC,GAC/F,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAgBb;AAED;;;;;;GAMG;AACH,iBAAS,WAAW,CAClB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CAGrD,GACA,IAAI,CAyCN;AAED,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;AAE/C,yCAAyC;AACzC,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,WAAW,EAAE,GAAG,GAAE,GAAqB,GAAG,CAAC,GAAG,SAAS,CAQrG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactrouter.d.ts","sourceRoot":"","sources":["../../src/reactrouter.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"reactrouter.d.ts","sourceRoot":"","sources":["../../src/reactrouter.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAC;AAI5E,KAAK,KAAK,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AAE1F,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;CACjE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAExB,MAAM,MAAM,WAAW,GAAG;IACxB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;CACxB,CAAC;AAEF,KAAK,SAAS,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,IAAI,CAAC;AAI3G,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,aAAa,EACtB,MAAM,CAAC,EAAE,WAAW,EAAE,EACtB,SAAS,CAAC,EAAE,SAAS,GACpB,0BAA0B,CAE5B;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,aAAa,EACtB,MAAM,CAAC,EAAE,WAAW,EAAE,EACtB,SAAS,CAAC,EAAE,SAAS,GACpB,0BAA0B,CAE5B;AAwHD,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,SAAS,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAqB9G"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactrouterv6.d.ts","sourceRoot":"","sources":["../../src/reactrouterv6.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"reactrouterv6.d.ts","sourceRoot":"","sources":["../../src/reactrouterv6.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAqB,MAAM,eAAe,CAAC;AAGxF,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,KAAK,EAGV,oBAAoB,EACpB,wBAAwB,EAExB,WAAW,EAGX,MAAM,EACN,WAAW,EACX,SAAS,EACT,WAAW,EACX,iBAAiB,EACjB,SAAS,EACV,MAAM,SAAS,CAAC;AAgBjB,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,WAAW,EACxB,iBAAiB,EAAE,iBAAiB,EACpC,wBAAwB,EAAE,wBAAwB,EAClD,WAAW,EAAE,WAAW,sCAGY,kBAAkB,KAAK,WAAW,GAAG,SAAS,uFAG/E,IAAI,CAuBR;AA+FD,wBAAgB,8BAA8B,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,SAAS,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAiDjH;AAED,wBAAgB,aAAa,CAAC,aAAa,EAAE,SAAS,GAAG,SAAS,CAiDjE;AAED,wBAAgB,uBAAuB,CACrC,MAAM,SAAS,WAAW,GAAG,WAAW,EACxC,OAAO,SAAS,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,EAC/C,oBAAoB,EAAE,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,CA6BpG"}
|
|
@@ -16,7 +16,7 @@ export type ErrorBoundaryProps = {
|
|
|
16
16
|
* Options to be passed into the Sentry report dialog.
|
|
17
17
|
* No-op if {@link showDialog} is false.
|
|
18
18
|
*/
|
|
19
|
-
dialogOptions?: ReportDialogOptions | undefined;
|
|
19
|
+
dialogOptions?: Pick<ReportDialogOptions, Exclude<keyof ReportDialogOptions, 'eventId'>> | undefined;
|
|
20
20
|
/**
|
|
21
21
|
* A fallback component that gets rendered when the error boundary encounters an error.
|
|
22
22
|
*
|