@sentry/react 8.3.0 → 8.5.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.
@@ -1,5 +1,6 @@
1
1
  Object.defineProperty(exports, '__esModule', { value: true });
2
2
 
3
+ const jsxRuntime = require('react/jsx-runtime');
3
4
  const browser = require('@sentry/browser');
4
5
  const utils = require('@sentry/utils');
5
6
  const hoistNonReactStatics = require('hoist-non-react-statics');
@@ -23,8 +24,6 @@ function _interopNamespace(e) {
23
24
  const hoistNonReactStatics__default = /*#__PURE__*/_interopDefault(hoistNonReactStatics);
24
25
  const React__namespace = /*#__PURE__*/_interopNamespace(React);
25
26
 
26
- const _jsxFileName = "/home/runner/work/sentry-javascript/sentry-javascript/packages/react/src/errorboundary.tsx";
27
-
28
27
  function isAtLeastReact17(version) {
29
28
  const major = version.match(/^([^.]+)/);
30
29
  return major !== null && parseInt(major[0]) >= 17;
@@ -199,9 +198,9 @@ function withErrorBoundary(
199
198
  const componentDisplayName = WrappedComponent.displayName || WrappedComponent.name || UNKNOWN_COMPONENT;
200
199
 
201
200
  const Wrapped = (props) => (
202
- React__namespace.createElement(ErrorBoundary, { ...errorBoundaryOptions, __self: this, __source: {fileName: _jsxFileName, lineNumber: 239}}
203
- , React__namespace.createElement(WrappedComponent, { ...props, __self: this, __source: {fileName: _jsxFileName, lineNumber: 240}} )
204
- )
201
+ jsxRuntime.jsx(ErrorBoundary, { ...errorBoundaryOptions, children:
202
+ jsxRuntime.jsx(WrappedComponent, { ...props,} )
203
+ })
205
204
  );
206
205
 
207
206
  // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
@@ -1 +1 @@
1
- {"version":3,"file":"errorboundary.js","sources":["../../src/errorboundary.tsx"],"sourcesContent":["import type { ReportDialogOptions } from '@sentry/browser';\nimport { captureException, getClient, showReportDialog, withScope } from '@sentry/browser';\nimport type { Scope } from '@sentry/types';\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: unknown;\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: unknown, 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: unknown, componentStack: string | null, eventId: string | null) => void) | undefined;\n /** Called on componentWillUnmount() */\n onUnmount?: ((error: unknown, 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: unknown, componentStack: string | undefined) => void) | undefined;\n};\n\ntype ErrorBoundaryState =\n | {\n componentStack: null;\n error: null;\n eventId: null;\n }\n | {\n componentStack: React.ErrorInfo['componentStack'];\n error: unknown;\n eventId: string;\n };\n\nconst INITIAL_STATE = {\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.\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 && props.showDialog) {\n this._openFallbackReportDialog = false;\n client.on('afterSendEvent', event => {\n if (!event.type && this._lastEventId && event.event_id === this._lastEventId) {\n showReportDialog({ ...props.dialogOptions, eventId: this._lastEventId });\n }\n });\n }\n }\n\n public componentDidCatch(error: unknown, { 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 // If users provide a fallback component we can assume they are handling the error.\n // Therefore, we set the mechanism depending on the presence of the fallback prop.\n mechanism: { handled: !!this.props.fallback },\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 = React.createElement(fallback, {\n error: state.error,\n componentStack: state.componentStack as string,\n resetError: this.resetErrorBoundary,\n eventId: state.eventId as string,\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 } from '@sentry/browser';\nimport { captureException, getClient, showReportDialog, withScope } from '@sentry/browser';\nimport type { Scope } from '@sentry/types';\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: unknown;\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: unknown, 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: unknown, componentStack: string | null, eventId: string | null) => void) | undefined;\n /** Called on componentWillUnmount() */\n onUnmount?: ((error: unknown, 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: unknown, componentStack: string | undefined) => void) | undefined;\n};\n\ntype ErrorBoundaryState =\n | {\n componentStack: null;\n error: null;\n eventId: null;\n }\n | {\n componentStack: React.ErrorInfo['componentStack'];\n error: unknown;\n eventId: string;\n };\n\nconst INITIAL_STATE = {\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.\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 && props.showDialog) {\n this._openFallbackReportDialog = false;\n client.on('afterSendEvent', event => {\n if (!event.type && this._lastEventId && event.event_id === this._lastEventId) {\n showReportDialog({ ...props.dialogOptions, eventId: this._lastEventId });\n }\n });\n }\n }\n\n public componentDidCatch(error: unknown, { 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 // If users provide a fallback component we can assume they are handling the error.\n // Therefore, we set the mechanism depending on the presence of the fallback prop.\n mechanism: { handled: !!this.props.fallback },\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 = React.createElement(fallback, {\n error: state.error,\n componentStack: state.componentStack as string,\n resetError: this.resetErrorBoundary,\n eventId: state.eventId as string,\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","_jsx","hoistNonReactStatics"],"mappings":"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"}
package/cjs/profiler.js CHANGED
@@ -1,5 +1,6 @@
1
1
  Object.defineProperty(exports, '__esModule', { value: true });
2
2
 
3
+ const jsxRuntime = require('react/jsx-runtime');
3
4
  const browser = require('@sentry/browser');
4
5
  const core = require('@sentry/core');
5
6
  const utils = require('@sentry/utils');
@@ -24,7 +25,6 @@ function _interopNamespace(e) {
24
25
  const hoistNonReactStatics__default = /*#__PURE__*/_interopDefault(hoistNonReactStatics);
25
26
  const React__namespace = /*#__PURE__*/_interopNamespace(React);
26
27
 
27
- const _jsxFileName = "/home/runner/work/sentry-javascript/sentry-javascript/packages/react/src/profiler.tsx";
28
28
  const UNKNOWN_COMPONENT = 'unknown';
29
29
 
30
30
  /**
@@ -161,9 +161,9 @@ function withProfiler(
161
161
  (options && options.name) || WrappedComponent.displayName || WrappedComponent.name || UNKNOWN_COMPONENT;
162
162
 
163
163
  const Wrapped = (props) => (
164
- React__namespace.createElement(Profiler, { ...options, name: componentDisplayName, updateProps: props, __self: this, __source: {fileName: _jsxFileName, lineNumber: 163}}
165
- , React__namespace.createElement(WrappedComponent, { ...props, __self: this, __source: {fileName: _jsxFileName, lineNumber: 164}} )
166
- )
164
+ jsxRuntime.jsx(Profiler, { ...options, name: componentDisplayName, updateProps: props, children:
165
+ jsxRuntime.jsx(WrappedComponent, { ...props,} )
166
+ })
167
167
  );
168
168
 
169
169
  Wrapped.displayName = `profiler(${componentDisplayName})`;
@@ -1 +1 @@
1
- {"version":3,"file":"profiler.js","sources":["../../src/profiler.tsx"],"sourcesContent":["import { startInactiveSpan } from '@sentry/browser';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, spanToJSON, withActiveSpan } from '@sentry/core';\nimport type { Span } 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 this._mountSpan = startInactiveSpan({\n name: `<${name}>`,\n onlyIfParent: true,\n op: REACT_MOUNT_OP,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.react.profiler',\n '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 = withActiveSpan(this._mountSpan, () => {\n return startInactiveSpan({\n name: `<${this.props.name}>`,\n onlyIfParent: true,\n op: REACT_UPDATE_OP,\n startTime: now,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.react.profiler',\n 'ui.component_name': this.props.name,\n 'ui.react.changed_props': changedProps,\n },\n });\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 endTimestamp = timestampInSeconds();\n const { name, includeRender = true } = this.props;\n\n if (this._mountSpan && includeRender) {\n const startTime = spanToJSON(this._mountSpan).timestamp;\n withActiveSpan(this._mountSpan, () => {\n const renderSpan = startInactiveSpan({\n onlyIfParent: true,\n name: `<${name}>`,\n op: REACT_RENDER_OP,\n startTime,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.react.profiler',\n 'ui.component_name': name,\n },\n });\n if (renderSpan) {\n // Have to cast to Span because the type of _mountSpan is Span | undefined\n // and not getting narrowed properly\n renderSpan.end(endTimestamp);\n }\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 */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\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 return startInactiveSpan({\n name: `<${name}>`,\n onlyIfParent: true,\n op: REACT_MOUNT_OP,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.react.profiler',\n 'ui.component_name': name,\n },\n });\n });\n\n React.useEffect(() => {\n if (mountSpan) {\n mountSpan.end();\n }\n\n return (): void => {\n if (mountSpan && options.hasRenderSpan) {\n const startTime = spanToJSON(mountSpan).timestamp;\n const endTimestamp = timestampInSeconds();\n\n const renderSpan = startInactiveSpan({\n name: `<${name}>`,\n onlyIfParent: true,\n op: REACT_RENDER_OP,\n startTime,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.react.profiler',\n 'ui.component_name': name,\n },\n });\n if (renderSpan) {\n // Have to cast to Span because the type of _mountSpan is Span | undefined\n // and not getting narrowed properly\n renderSpan.end(endTimestamp);\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"],"names":["React","startInactiveSpan","REACT_MOUNT_OP","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","timestampInSeconds","withActiveSpan","REACT_UPDATE_OP","spanToJSON","REACT_RENDER_OP","hoistNonReactStatics"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,MAAA,YAAA,GAAA,uFAAA,CAQA;AACO,MAAM,iBAAkB,GAAE,UAAS;;AAkB1C;AACA;AACA;AACA;AACA,MAAM,QAAS,SAAQA,gBAAK,CAAC,SAAS,CAAgB;AACtD;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAGA;AACA,GAAS,OAAA,YAAA,GAAA,CAAA,IAAA,CAAO,YAAY,GAA2B;AACvD,IAAI,QAAQ,EAAE,KAAK;AACnB,IAAI,aAAa,EAAE,IAAI;AACvB,IAAI,cAAc,EAAE,IAAI;AACxB,IAAG,CAAA;AACH;AACA,GAAS,WAAW,CAAC,KAAK,EAAiB;AAC3C,IAAI,KAAK,CAAC,KAAK,CAAC,CAAA;AAChB,IAAI,MAAM,EAAE,IAAI,EAAE,QAAA,GAAW,KAAA,EAAQ,GAAE,IAAI,CAAC,KAAK,CAAA;AACjD;AACA,IAAI,IAAI,QAAQ,EAAE;AAClB,MAAM,OAAM;AACZ,KAAI;AACJ;AACA,IAAI,IAAI,CAAC,UAAW,GAAEC,yBAAiB,CAAC;AACxC,MAAM,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACvB,MAAM,YAAY,EAAE,IAAI;AACxB,MAAM,EAAE,EAAEC,wBAAc;AACxB,MAAM,UAAU,EAAE;AAClB,QAAQ,CAACC,qCAAgC,GAAG,wBAAwB;AACpE,QAAQ,mBAAmB,EAAE,IAAI;AACjC,OAAO;AACP,KAAK,CAAC,CAAA;AACN,GAAE;AACF;AACA;AACA,GAAS,iBAAiB,GAAS;AACnC,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE;AACzB,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,CAAA;AAC3B,KAAI;AACJ,GAAE;AACF;AACA,GAAS,qBAAqB,CAAC,EAAE,WAAW,EAAE,cAAA,GAAiB,IAAA,EAAM,EAA0B;AAC/F;AACA;AACA;AACA,IAAI,IAAI,cAAe,IAAG,IAAI,CAAC,UAAA,IAAc,WAAA,KAAgB,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;AACrF;AACA;AACA,MAAM,MAAM,YAAa,GAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAA,IAAK,WAAW,CAAC,CAAC,CAAE,KAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;AAC7G,MAAM,IAAI,YAAY,CAAC,MAAO,GAAE,CAAC,EAAE;AACnC,QAAQ,MAAM,GAAA,GAAMC,wBAAkB,EAAE,CAAA;AACxC,QAAQ,IAAI,CAAC,WAAY,GAAEC,mBAAc,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM;AACjE,UAAU,OAAOJ,yBAAiB,CAAC;AACnC,YAAY,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AACxC,YAAY,YAAY,EAAE,IAAI;AAC9B,YAAY,EAAE,EAAEK,yBAAe;AAC/B,YAAY,SAAS,EAAE,GAAG;AAC1B,YAAY,UAAU,EAAE;AACxB,cAAc,CAACH,qCAAgC,GAAG,wBAAwB;AAC1E,cAAc,mBAAmB,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;AAClD,cAAc,wBAAwB,EAAE,YAAY;AACpD,aAAa;AACb,WAAW,CAAC,CAAA;AACZ,SAAS,CAAC,CAAA;AACV,OAAM;AACN,KAAI;AACJ;AACA,IAAI,OAAO,IAAI,CAAA;AACf,GAAE;AACF;AACA,GAAS,kBAAkB,GAAS;AACpC,IAAI,IAAI,IAAI,CAAC,WAAW,EAAE;AAC1B,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAA;AAC5B,MAAM,IAAI,CAAC,WAAY,GAAE,SAAS,CAAA;AAClC,KAAI;AACJ,GAAE;AACF;AACA;AACA;AACA,GAAS,oBAAoB,GAAS;AACtC,IAAI,MAAM,YAAA,GAAeC,wBAAkB,EAAE,CAAA;AAC7C,IAAI,MAAM,EAAE,IAAI,EAAE,aAAA,GAAgB,IAAA,EAAO,GAAE,IAAI,CAAC,KAAK,CAAA;AACrD;AACA,IAAI,IAAI,IAAI,CAAC,UAAW,IAAG,aAAa,EAAE;AAC1C,MAAM,MAAM,SAAU,GAAEG,eAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,SAAS,CAAA;AAC7D,MAAMF,mBAAc,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM;AAC5C,QAAQ,MAAM,UAAA,GAAaJ,yBAAiB,CAAC;AAC7C,UAAU,YAAY,EAAE,IAAI;AAC5B,UAAU,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAC3B,UAAU,EAAE,EAAEO,yBAAe;AAC7B,UAAU,SAAS;AACnB,UAAU,UAAU,EAAE;AACtB,YAAY,CAACL,qCAAgC,GAAG,wBAAwB;AACxE,YAAY,mBAAmB,EAAE,IAAI;AACrC,WAAW;AACX,SAAS,CAAC,CAAA;AACV,QAAQ,IAAI,UAAU,EAAE;AACxB;AACA;AACA,UAAU,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;AACtC,SAAQ;AACR,OAAO,CAAC,CAAA;AACR,KAAI;AACJ,GAAE;AACF;AACA,GAAS,MAAM,GAAoB;AACnC,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAA;AAC9B,GAAE;AACF,CAAA,CAAA,QAAA,CAAA,YAAA,EAAA,CAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,YAAY;AACrB,EAAE,gBAAgB;AAClB;AACA,EAAE,OAAO;AACT,EAAe;AACf,EAAE,MAAM,oBAAqB;AAC7B,IAAI,CAAC,OAAQ,IAAG,OAAO,CAAC,IAAI,KAAK,gBAAgB,CAAC,eAAe,gBAAgB,CAAC,IAAA,IAAQ,iBAAiB,CAAA;AAC3G;AACA,EAAE,MAAM,OAAO,GAAgB,CAAC,KAAK;AACrC,IAAIH,gBAAC,CAAA,aAAA,CAAA,QAAA,EAAA,EAAS,GAAI,OAAO,EAAE,IAAI,EAAC,oBAAqB,EAAE,WAAW,EAAC,KAAM,EAAC,MAAA,EAAA,IAAA,EAAA,QAAA,EAAA,CAAA,QAAA,EAAA,YAAA,EAAA,UAAA,EAAA,GAAA,CAAA,CAAA;AAC1E,QAAMA,gBAAC,CAAA,aAAA,CAAA,gBAAA,EAAA,EAAiB,GAAI,KAAK,sEAAI;AACrC,KAAI;AACJ,GAAG,CAAA;AACH;AACA,EAAE,OAAO,CAAC,WAAA,GAAc,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC,CAAC,CAAA;AAC3D;AACA;AACA;AACA,EAAES,6BAAoB,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAA;AACjD,EAAE,OAAO,OAAO,CAAA;AAChB,CAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,WAAW;AACpB,EAAE,IAAI;AACN,EAAE,OAAO,GAAoD;AAC7D,IAAI,QAAQ,EAAE,KAAK;AACnB,IAAI,aAAa,EAAE,IAAI;AACvB,GAAG;AACH,EAAQ;AACR,EAAE,MAAM,CAAC,SAAS,CAAE,GAAET,gBAAK,CAAC,QAAQ,CAAC,MAAM;AAC3C,IAAI,IAAI,OAAA,IAAW,OAAO,CAAC,QAAQ,EAAE;AACrC,MAAM,OAAO,SAAS,CAAA;AACtB,KAAI;AACJ;AACA,IAAI,OAAOC,yBAAiB,CAAC;AAC7B,MAAM,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACvB,MAAM,YAAY,EAAE,IAAI;AACxB,MAAM,EAAE,EAAEC,wBAAc;AACxB,MAAM,UAAU,EAAE;AAClB,QAAQ,CAACC,qCAAgC,GAAG,wBAAwB;AACpE,QAAQ,mBAAmB,EAAE,IAAI;AACjC,OAAO;AACP,KAAK,CAAC,CAAA;AACN,GAAG,CAAC,CAAA;AACJ;AACA,EAAEH,gBAAK,CAAC,SAAS,CAAC,MAAM;AACxB,IAAI,IAAI,SAAS,EAAE;AACnB,MAAM,SAAS,CAAC,GAAG,EAAE,CAAA;AACrB,KAAI;AACJ;AACA,IAAI,OAAO,MAAY;AACvB,MAAM,IAAI,SAAA,IAAa,OAAO,CAAC,aAAa,EAAE;AAC9C,QAAQ,MAAM,YAAYO,eAAU,CAAC,SAAS,CAAC,CAAC,SAAS,CAAA;AACzD,QAAQ,MAAM,YAAA,GAAeH,wBAAkB,EAAE,CAAA;AACjD;AACA,QAAQ,MAAM,UAAA,GAAaH,yBAAiB,CAAC;AAC7C,UAAU,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAC3B,UAAU,YAAY,EAAE,IAAI;AAC5B,UAAU,EAAE,EAAEO,yBAAe;AAC7B,UAAU,SAAS;AACnB,UAAU,UAAU,EAAE;AACtB,YAAY,CAACL,qCAAgC,GAAG,wBAAwB;AACxE,YAAY,mBAAmB,EAAE,IAAI;AACrC,WAAW;AACX,SAAS,CAAC,CAAA;AACV,QAAQ,IAAI,UAAU,EAAE;AACxB;AACA;AACA,UAAU,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;AACtC,SAAQ;AACR,OAAM;AACN,KAAK,CAAA;AACL;AACA;AACA,GAAG,EAAE,EAAE,CAAC,CAAA;AACR;;;;;;;"}
1
+ {"version":3,"file":"profiler.js","sources":["../../src/profiler.tsx"],"sourcesContent":["import { startInactiveSpan } from '@sentry/browser';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, spanToJSON, withActiveSpan } from '@sentry/core';\nimport type { Span } 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 this._mountSpan = startInactiveSpan({\n name: `<${name}>`,\n onlyIfParent: true,\n op: REACT_MOUNT_OP,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.react.profiler',\n '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 = withActiveSpan(this._mountSpan, () => {\n return startInactiveSpan({\n name: `<${this.props.name}>`,\n onlyIfParent: true,\n op: REACT_UPDATE_OP,\n startTime: now,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.react.profiler',\n 'ui.component_name': this.props.name,\n 'ui.react.changed_props': changedProps,\n },\n });\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 endTimestamp = timestampInSeconds();\n const { name, includeRender = true } = this.props;\n\n if (this._mountSpan && includeRender) {\n const startTime = spanToJSON(this._mountSpan).timestamp;\n withActiveSpan(this._mountSpan, () => {\n const renderSpan = startInactiveSpan({\n onlyIfParent: true,\n name: `<${name}>`,\n op: REACT_RENDER_OP,\n startTime,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.react.profiler',\n 'ui.component_name': name,\n },\n });\n if (renderSpan) {\n // Have to cast to Span because the type of _mountSpan is Span | undefined\n // and not getting narrowed properly\n renderSpan.end(endTimestamp);\n }\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 */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\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 return startInactiveSpan({\n name: `<${name}>`,\n onlyIfParent: true,\n op: REACT_MOUNT_OP,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.react.profiler',\n 'ui.component_name': name,\n },\n });\n });\n\n React.useEffect(() => {\n if (mountSpan) {\n mountSpan.end();\n }\n\n return (): void => {\n if (mountSpan && options.hasRenderSpan) {\n const startTime = spanToJSON(mountSpan).timestamp;\n const endTimestamp = timestampInSeconds();\n\n const renderSpan = startInactiveSpan({\n name: `<${name}>`,\n onlyIfParent: true,\n op: REACT_RENDER_OP,\n startTime,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.react.profiler',\n 'ui.component_name': name,\n },\n });\n if (renderSpan) {\n // Have to cast to Span because the type of _mountSpan is Span | undefined\n // and not getting narrowed properly\n renderSpan.end(endTimestamp);\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"],"names":["React","startInactiveSpan","REACT_MOUNT_OP","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","timestampInSeconds","withActiveSpan","REACT_UPDATE_OP","spanToJSON","REACT_RENDER_OP","_jsx","hoistNonReactStatics"],"mappings":"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"}
@@ -1,28 +1,15 @@
1
1
  Object.defineProperty(exports, '__esModule', { value: true });
2
2
 
3
+ const jsxRuntime = require('react/jsx-runtime');
3
4
  const browser = require('@sentry/browser');
4
5
  const core = require('@sentry/core');
5
6
  const hoistNonReactStatics = require('hoist-non-react-statics');
6
- const React = require('react');
7
+ require('react');
7
8
 
8
9
  const _interopDefault = e => e && e.__esModule ? e.default : e;
9
10
 
10
- function _interopNamespace(e) {
11
- if (e && e.__esModule) return e;
12
- const n = Object.create(null);
13
- if (e) {
14
- for (const k in e) {
15
- n[k] = e[k];
16
- }
17
- }
18
- n.default = e;
19
- return n;
20
- }
21
-
22
11
  const hoistNonReactStatics__default = /*#__PURE__*/_interopDefault(hoistNonReactStatics);
23
- const React__namespace = /*#__PURE__*/_interopNamespace(React);
24
12
 
25
- const _jsxFileName = "/home/runner/work/sentry-javascript/sentry-javascript/packages/react/src/reactrouter.tsx";
26
13
  // We need to disable eslint no-explict-any because any is required for the
27
14
  // react-router typings.
28
15
 
@@ -222,7 +209,7 @@ function withSentryRouting(Route) {
222
209
  // @ts-expect-error Setting more specific React Component typing for `R` generic above
223
210
  // will break advanced type inference done by react router params:
224
211
  // https://github.com/DefinitelyTyped/DefinitelyTyped/blob/13dc4235c069e25fe7ee16e11f529d909f9f3ff8/types/react-router/index.d.ts#L154-L164
225
- return React__namespace.createElement(Route, { ...props, __self: this, __source: {fileName: _jsxFileName, lineNumber: 243}} );
212
+ return jsxRuntime.jsx(Route, { ...props,} );
226
213
  };
227
214
 
228
215
  WrappedRoute.displayName = `sentryRoute(${componentDisplayName})`;
@@ -1 +1 @@
1
- {"version":3,"file":"reactrouter.js","sources":["../../src/reactrouter.tsx"],"sourcesContent":["import {\n WINDOW,\n browserTracingIntegration,\n startBrowserTracingNavigationSpan,\n startBrowserTracingPageLoadSpan,\n} from '@sentry/browser';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n getActiveSpan,\n getCurrentScope,\n getRootSpan,\n spanToJSON,\n} from '@sentry/core';\nimport type { Client, Integration, Span, TransactionSource } from '@sentry/types';\nimport hoistNonReactStatics from 'hoist-non-react-statics';\nimport * as React from 'react';\n\nimport type { Action, Location } 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\nexport type MatchPath = (pathname: string, props: string | string[] | any, parent?: Match | null) => Match | null; // eslint-disable-line @typescript-eslint/no-explicit-any\n\ninterface ReactRouterOptions {\n history: RouterHistory;\n routes?: RouteConfig[];\n matchPath?: MatchPath;\n}\n\n/**\n * A browser tracing integration that uses React Router v4 to instrument navigations.\n * Expects `history` (and optionally `routes` and `matchPath`) to be passed as options.\n */\nexport function reactRouterV4BrowserTracingIntegration(\n options: Parameters<typeof browserTracingIntegration>[0] & ReactRouterOptions,\n): Integration {\n const integration = browserTracingIntegration({\n ...options,\n instrumentPageLoad: false,\n instrumentNavigation: false,\n });\n\n const { history, routes, matchPath, instrumentPageLoad = true, instrumentNavigation = true } = options;\n\n return {\n ...integration,\n afterAllSetup(client) {\n integration.afterAllSetup(client);\n\n instrumentReactRouter(\n client,\n instrumentPageLoad,\n instrumentNavigation,\n history,\n 'reactrouter_v4',\n routes,\n matchPath,\n );\n },\n };\n}\n\n/**\n * A browser tracing integration that uses React Router v5 to instrument navigations.\n * Expects `history` (and optionally `routes` and `matchPath`) to be passed as options.\n */\nexport function reactRouterV5BrowserTracingIntegration(\n options: Parameters<typeof browserTracingIntegration>[0] & ReactRouterOptions,\n): Integration {\n const integration = browserTracingIntegration({\n ...options,\n instrumentPageLoad: false,\n instrumentNavigation: false,\n });\n\n const { history, routes, matchPath, instrumentPageLoad = true, instrumentNavigation = true } = options;\n\n return {\n ...integration,\n afterAllSetup(client) {\n integration.afterAllSetup(client);\n\n instrumentReactRouter(\n client,\n instrumentPageLoad,\n instrumentNavigation,\n history,\n 'reactrouter_v5',\n routes,\n matchPath,\n );\n },\n };\n}\n\nfunction instrumentReactRouter(\n client: Client,\n instrumentPageLoad: boolean,\n instrumentNavigation: boolean,\n history: RouterHistory,\n instrumentationName: string,\n allRoutes: RouteConfig[] = [],\n matchPath?: MatchPath,\n): void {\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 if (instrumentPageLoad) {\n const initPathName = getInitPathName();\n if (initPathName) {\n const [name, source] = normalizeTransactionName(initPathName);\n startBrowserTracingPageLoadSpan(client, {\n name,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'pageload',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: `auto.pageload.react.${instrumentationName}`,\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: source,\n },\n });\n }\n }\n\n if (instrumentNavigation && history.listen) {\n history.listen((location, action) => {\n if (action && (action === 'PUSH' || action === 'POP')) {\n const [name, source] = normalizeTransactionName(location.pathname);\n startBrowserTracingNavigationSpan(client, {\n name,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'navigation',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: `auto.navigation.react.${instrumentationName}`,\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: source,\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 (props && props.computedMatch && props.computedMatch.isExact) {\n const route = props.computedMatch.path;\n const activeRootSpan = getActiveRootSpan();\n\n getCurrentScope().setTransactionName(route);\n\n if (activeRootSpan) {\n activeRootSpan.updateName(route);\n activeRootSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, 'route');\n }\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\nfunction getActiveRootSpan(): Span | undefined {\n const span = getActiveSpan();\n const rootSpan = span && getRootSpan(span);\n\n if (!rootSpan) {\n return undefined;\n }\n\n const op = spanToJSON(rootSpan).op;\n\n // Only use this root span if it is a pageload or navigation span\n return op === 'navigation' || op === 'pageload' ? rootSpan : undefined;\n}\n"],"names":["browserTracingIntegration","WINDOW","startBrowserTracingPageLoadSpan","SEMANTIC_ATTRIBUTE_SENTRY_OP","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","SEMANTIC_ATTRIBUTE_SENTRY_SOURCE","startBrowserTracingNavigationSpan","getCurrentScope","React","hoistNonReactStatics","getActiveSpan","getRootSpan","spanToJSON"],"mappings":"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"}
1
+ {"version":3,"file":"reactrouter.js","sources":["../../src/reactrouter.tsx"],"sourcesContent":["import {\n WINDOW,\n browserTracingIntegration,\n startBrowserTracingNavigationSpan,\n startBrowserTracingPageLoadSpan,\n} from '@sentry/browser';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n getActiveSpan,\n getCurrentScope,\n getRootSpan,\n spanToJSON,\n} from '@sentry/core';\nimport type { Client, Integration, Span, TransactionSource } from '@sentry/types';\nimport hoistNonReactStatics from 'hoist-non-react-statics';\nimport * as React from 'react';\n\nimport type { Action, Location } 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\nexport type MatchPath = (pathname: string, props: string | string[] | any, parent?: Match | null) => Match | null; // eslint-disable-line @typescript-eslint/no-explicit-any\n\ninterface ReactRouterOptions {\n history: RouterHistory;\n routes?: RouteConfig[];\n matchPath?: MatchPath;\n}\n\n/**\n * A browser tracing integration that uses React Router v4 to instrument navigations.\n * Expects `history` (and optionally `routes` and `matchPath`) to be passed as options.\n */\nexport function reactRouterV4BrowserTracingIntegration(\n options: Parameters<typeof browserTracingIntegration>[0] & ReactRouterOptions,\n): Integration {\n const integration = browserTracingIntegration({\n ...options,\n instrumentPageLoad: false,\n instrumentNavigation: false,\n });\n\n const { history, routes, matchPath, instrumentPageLoad = true, instrumentNavigation = true } = options;\n\n return {\n ...integration,\n afterAllSetup(client) {\n integration.afterAllSetup(client);\n\n instrumentReactRouter(\n client,\n instrumentPageLoad,\n instrumentNavigation,\n history,\n 'reactrouter_v4',\n routes,\n matchPath,\n );\n },\n };\n}\n\n/**\n * A browser tracing integration that uses React Router v5 to instrument navigations.\n * Expects `history` (and optionally `routes` and `matchPath`) to be passed as options.\n */\nexport function reactRouterV5BrowserTracingIntegration(\n options: Parameters<typeof browserTracingIntegration>[0] & ReactRouterOptions,\n): Integration {\n const integration = browserTracingIntegration({\n ...options,\n instrumentPageLoad: false,\n instrumentNavigation: false,\n });\n\n const { history, routes, matchPath, instrumentPageLoad = true, instrumentNavigation = true } = options;\n\n return {\n ...integration,\n afterAllSetup(client) {\n integration.afterAllSetup(client);\n\n instrumentReactRouter(\n client,\n instrumentPageLoad,\n instrumentNavigation,\n history,\n 'reactrouter_v5',\n routes,\n matchPath,\n );\n },\n };\n}\n\nfunction instrumentReactRouter(\n client: Client,\n instrumentPageLoad: boolean,\n instrumentNavigation: boolean,\n history: RouterHistory,\n instrumentationName: string,\n allRoutes: RouteConfig[] = [],\n matchPath?: MatchPath,\n): void {\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 if (instrumentPageLoad) {\n const initPathName = getInitPathName();\n if (initPathName) {\n const [name, source] = normalizeTransactionName(initPathName);\n startBrowserTracingPageLoadSpan(client, {\n name,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'pageload',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: `auto.pageload.react.${instrumentationName}`,\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: source,\n },\n });\n }\n }\n\n if (instrumentNavigation && history.listen) {\n history.listen((location, action) => {\n if (action && (action === 'PUSH' || action === 'POP')) {\n const [name, source] = normalizeTransactionName(location.pathname);\n startBrowserTracingNavigationSpan(client, {\n name,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'navigation',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: `auto.navigation.react.${instrumentationName}`,\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: source,\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 (props && props.computedMatch && props.computedMatch.isExact) {\n const route = props.computedMatch.path;\n const activeRootSpan = getActiveRootSpan();\n\n getCurrentScope().setTransactionName(route);\n\n if (activeRootSpan) {\n activeRootSpan.updateName(route);\n activeRootSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, 'route');\n }\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\nfunction getActiveRootSpan(): Span | undefined {\n const span = getActiveSpan();\n const rootSpan = span && getRootSpan(span);\n\n if (!rootSpan) {\n return undefined;\n }\n\n const op = spanToJSON(rootSpan).op;\n\n // Only use this root span if it is a pageload or navigation span\n return op === 'navigation' || op === 'pageload' ? rootSpan : undefined;\n}\n"],"names":["browserTracingIntegration","WINDOW","startBrowserTracingPageLoadSpan","SEMANTIC_ATTRIBUTE_SENTRY_OP","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","SEMANTIC_ATTRIBUTE_SENTRY_SOURCE","startBrowserTracingNavigationSpan","getCurrentScope","_jsx","hoistNonReactStatics","getActiveSpan","getRootSpan","spanToJSON"],"mappings":"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"}
@@ -1,30 +1,16 @@
1
1
  Object.defineProperty(exports, '__esModule', { value: true });
2
2
 
3
+ const jsxRuntime = require('react/jsx-runtime');
3
4
  const browser = require('@sentry/browser');
4
5
  const core = require('@sentry/core');
5
6
  const utils = require('@sentry/utils');
6
7
  const hoistNonReactStatics = require('hoist-non-react-statics');
7
- const React = require('react');
8
+ require('react');
8
9
  const debugBuild = require('./debug-build.js');
9
10
 
10
11
  const _interopDefault = e => e && e.__esModule ? e.default : e;
11
12
 
12
- function _interopNamespace(e) {
13
- if (e && e.__esModule) return e;
14
- const n = Object.create(null);
15
- if (e) {
16
- for (const k in e) {
17
- n[k] = e[k];
18
- }
19
- }
20
- n.default = e;
21
- return n;
22
- }
23
-
24
13
  const hoistNonReactStatics__default = /*#__PURE__*/_interopDefault(hoistNonReactStatics);
25
- const React__namespace = /*#__PURE__*/_interopNamespace(React);
26
-
27
- const _jsxFileName = "/home/runner/work/sentry-javascript/sentry-javascript/packages/react/src/reactrouterv6.tsx";// Inspired from Donnie McNeal's solution:
28
14
 
29
15
  let _useEffect;
30
16
  let _useLocation;
@@ -252,7 +238,7 @@ function withSentryReactRouterV6Routing(Routes) {
252
238
 
253
239
  // @ts-expect-error Setting more specific React Component typing for `R` generic above
254
240
  // will break advanced type inference done by react router params
255
- return React__namespace.createElement(Routes, { ...props, __self: this, __source: {fileName: _jsxFileName, lineNumber: 278}} );
241
+ return jsxRuntime.jsx(Routes, { ...props,} );
256
242
  };
257
243
 
258
244
  hoistNonReactStatics__default(SentryRoutes, Routes);
@@ -307,7 +293,7 @@ function wrapUseRoutes(origUseRoutes) {
307
293
 
308
294
  // eslint-disable-next-line react/display-name
309
295
  return (routes, locationArg) => {
310
- return React__namespace.createElement(SentryRoutes, { routes: routes, locationArg: locationArg, __self: this, __source: {fileName: _jsxFileName, lineNumber: 335}} );
296
+ return jsxRuntime.jsx(SentryRoutes, { routes: routes, locationArg: locationArg,} );
311
297
  };
312
298
  }
313
299
 
@@ -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 {\n WINDOW,\n browserTracingIntegration,\n startBrowserTracingNavigationSpan,\n startBrowserTracingPageLoadSpan,\n} from '@sentry/browser';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n getActiveSpan,\n getClient,\n getCurrentScope,\n getRootSpan,\n spanToJSON,\n} from '@sentry/core';\nimport type { Client, Integration, Span, 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 _useEffect: UseEffect;\nlet _useLocation: UseLocation;\nlet _useNavigationType: UseNavigationType;\nlet _createRoutesFromChildren: CreateRoutesFromChildren;\nlet _matchRoutes: MatchRoutes;\nlet _stripBasename: boolean = false;\n\nconst CLIENTS_WITH_INSTRUMENT_NAVIGATION: Client[] = [];\n\ninterface ReactRouterOptions {\n useEffect: UseEffect;\n useLocation: UseLocation;\n useNavigationType: UseNavigationType;\n createRoutesFromChildren: CreateRoutesFromChildren;\n matchRoutes: MatchRoutes;\n stripBasename?: boolean;\n}\n\n/**\n * A browser tracing integration that uses React Router v6 to instrument navigations.\n * Expects `useEffect`, `useLocation`, `useNavigationType`, `createRoutesFromChildren` and `matchRoutes` to be passed as options.\n */\nexport function reactRouterV6BrowserTracingIntegration(\n options: Parameters<typeof browserTracingIntegration>[0] & ReactRouterOptions,\n): Integration {\n const integration = browserTracingIntegration({\n ...options,\n instrumentPageLoad: false,\n instrumentNavigation: false,\n });\n\n const {\n useEffect,\n useLocation,\n useNavigationType,\n createRoutesFromChildren,\n matchRoutes,\n stripBasename,\n instrumentPageLoad = true,\n instrumentNavigation = true,\n } = options;\n\n return {\n ...integration,\n setup() {\n _useEffect = useEffect;\n _useLocation = useLocation;\n _useNavigationType = useNavigationType;\n _matchRoutes = matchRoutes;\n _createRoutesFromChildren = createRoutesFromChildren;\n _stripBasename = stripBasename || false;\n },\n afterAllSetup(client) {\n integration.afterAllSetup(client);\n\n const initPathName = WINDOW && WINDOW.location && WINDOW.location.pathname;\n if (instrumentPageLoad && initPathName) {\n startBrowserTracingPageLoadSpan(client, {\n name: initPathName,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'url',\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'pageload',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.pageload.react.reactrouter_v6',\n },\n });\n }\n\n if (instrumentNavigation) {\n CLIENTS_WITH_INSTRUMENT_NAVIGATION.push(client);\n }\n },\n };\n}\n\n/**\n * Strip the basename from a pathname if exists.\n *\n * Vendored and modified from `react-router`\n * https://github.com/remix-run/react-router/blob/462bb712156a3f739d6139a0f14810b76b002df6/packages/router/utils.ts#L1038\n */\nfunction stripBasenameFromPathname(pathname: string, basename: string): string {\n if (!basename || basename === '/') {\n return pathname;\n }\n\n if (!pathname.toLowerCase().startsWith(basename.toLowerCase())) {\n return pathname;\n }\n\n // We want to leave trailing slash behavior in the user's control, so if they\n // specify a basename with a trailing slash, we should support it\n const startIndex = basename.endsWith('/') ? basename.length - 1 : basename.length;\n const nextChar = pathname.charAt(startIndex);\n if (nextChar && nextChar !== '/') {\n // pathname does not start with basename/\n return pathname;\n }\n\n return pathname.slice(startIndex) || '/';\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 [_stripBasename ? stripBasenameFromPathname(location.pathname, basename) : 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 [_stripBasename ? stripBasenameFromPathname(branch.pathname, basename) : 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 [(_stripBasename ? '' : basename) + newPath, 'route'];\n }\n return [(_stripBasename ? '' : basename) + pathBuilder, 'route'];\n }\n }\n }\n }\n }\n\n return [_stripBasename ? stripBasenameFromPathname(location.pathname, basename) : location.pathname, 'url'];\n}\n\nfunction updatePageloadTransaction(\n activeRootSpan: Span | undefined,\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 (branches) {\n const [name, source] = getNormalizedName(routes, location, branches, basename);\n\n getCurrentScope().setTransactionName(name);\n\n if (activeRootSpan) {\n activeRootSpan.updateName(name);\n activeRootSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, source);\n }\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 const client = getClient();\n if (!client || !CLIENTS_WITH_INSTRUMENT_NAVIGATION.includes(client)) {\n return;\n }\n\n if ((navigationType === 'PUSH' || navigationType === 'POP') && branches) {\n const [name, source] = getNormalizedName(routes, location, branches, basename);\n\n startBrowserTracingNavigationSpan(client, {\n name,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: source,\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'navigation',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.navigation.react.reactrouter_v6',\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 (!_useEffect || !_useLocation || !_useNavigationType || !_createRoutesFromChildren || !_matchRoutes) {\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}.`);\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(getActiveRootSpan(), 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) {\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(getActiveRootSpan(), 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 if (!_useEffect || !_useLocation || !_useNavigationType || !_matchRoutes) {\n DEBUG_BUILD &&\n logger.warn(\n 'reactRouterV6Instrumentation was unable to wrap the `createRouter` function because of one or more missing parameters.',\n );\n\n return createRouterFunction;\n }\n\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 const activeRootSpan = getActiveRootSpan();\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' && activeRootSpan) {\n updatePageloadTransaction(activeRootSpan, router.state.location, routes, undefined, basename);\n }\n\n router.subscribe((state: RouterState) => {\n const location = state.location;\n if (state.historyAction === 'PUSH' || state.historyAction === 'POP') {\n handleNavigation(location, routes, state.historyAction, undefined, basename);\n }\n });\n\n return router;\n };\n}\n\nfunction getActiveRootSpan(): Span | undefined {\n const span = getActiveSpan();\n const rootSpan = span ? getRootSpan(span) : undefined;\n\n if (!rootSpan) {\n return undefined;\n }\n\n const op = spanToJSON(rootSpan).op;\n\n // Only use this root span if it is a pageload or navigation span\n return op === 'navigation' || op === 'pageload' ? rootSpan : undefined;\n}\n"],"names":["browserTracingIntegration","WINDOW","startBrowserTracingPageLoadSpan","SEMANTIC_ATTRIBUTE_SENTRY_SOURCE","SEMANTIC_ATTRIBUTE_SENTRY_OP","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","getNumberOfUrlSegments","getCurrentScope","getClient","startBrowserTracingNavigationSpan","DEBUG_BUILD","logger","React","hoistNonReactStatics","getActiveSpan","getRootSpan","spanToJSON"],"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 {\n WINDOW,\n browserTracingIntegration,\n startBrowserTracingNavigationSpan,\n startBrowserTracingPageLoadSpan,\n} from '@sentry/browser';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n getActiveSpan,\n getClient,\n getCurrentScope,\n getRootSpan,\n spanToJSON,\n} from '@sentry/core';\nimport type { Client, Integration, Span, 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 _useEffect: UseEffect;\nlet _useLocation: UseLocation;\nlet _useNavigationType: UseNavigationType;\nlet _createRoutesFromChildren: CreateRoutesFromChildren;\nlet _matchRoutes: MatchRoutes;\nlet _stripBasename: boolean = false;\n\nconst CLIENTS_WITH_INSTRUMENT_NAVIGATION: Client[] = [];\n\ninterface ReactRouterOptions {\n useEffect: UseEffect;\n useLocation: UseLocation;\n useNavigationType: UseNavigationType;\n createRoutesFromChildren: CreateRoutesFromChildren;\n matchRoutes: MatchRoutes;\n stripBasename?: boolean;\n}\n\n/**\n * A browser tracing integration that uses React Router v6 to instrument navigations.\n * Expects `useEffect`, `useLocation`, `useNavigationType`, `createRoutesFromChildren` and `matchRoutes` to be passed as options.\n */\nexport function reactRouterV6BrowserTracingIntegration(\n options: Parameters<typeof browserTracingIntegration>[0] & ReactRouterOptions,\n): Integration {\n const integration = browserTracingIntegration({\n ...options,\n instrumentPageLoad: false,\n instrumentNavigation: false,\n });\n\n const {\n useEffect,\n useLocation,\n useNavigationType,\n createRoutesFromChildren,\n matchRoutes,\n stripBasename,\n instrumentPageLoad = true,\n instrumentNavigation = true,\n } = options;\n\n return {\n ...integration,\n setup() {\n _useEffect = useEffect;\n _useLocation = useLocation;\n _useNavigationType = useNavigationType;\n _matchRoutes = matchRoutes;\n _createRoutesFromChildren = createRoutesFromChildren;\n _stripBasename = stripBasename || false;\n },\n afterAllSetup(client) {\n integration.afterAllSetup(client);\n\n const initPathName = WINDOW && WINDOW.location && WINDOW.location.pathname;\n if (instrumentPageLoad && initPathName) {\n startBrowserTracingPageLoadSpan(client, {\n name: initPathName,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'url',\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'pageload',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.pageload.react.reactrouter_v6',\n },\n });\n }\n\n if (instrumentNavigation) {\n CLIENTS_WITH_INSTRUMENT_NAVIGATION.push(client);\n }\n },\n };\n}\n\n/**\n * Strip the basename from a pathname if exists.\n *\n * Vendored and modified from `react-router`\n * https://github.com/remix-run/react-router/blob/462bb712156a3f739d6139a0f14810b76b002df6/packages/router/utils.ts#L1038\n */\nfunction stripBasenameFromPathname(pathname: string, basename: string): string {\n if (!basename || basename === '/') {\n return pathname;\n }\n\n if (!pathname.toLowerCase().startsWith(basename.toLowerCase())) {\n return pathname;\n }\n\n // We want to leave trailing slash behavior in the user's control, so if they\n // specify a basename with a trailing slash, we should support it\n const startIndex = basename.endsWith('/') ? basename.length - 1 : basename.length;\n const nextChar = pathname.charAt(startIndex);\n if (nextChar && nextChar !== '/') {\n // pathname does not start with basename/\n return pathname;\n }\n\n return pathname.slice(startIndex) || '/';\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 [_stripBasename ? stripBasenameFromPathname(location.pathname, basename) : 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 [_stripBasename ? stripBasenameFromPathname(branch.pathname, basename) : 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 [(_stripBasename ? '' : basename) + newPath, 'route'];\n }\n return [(_stripBasename ? '' : basename) + pathBuilder, 'route'];\n }\n }\n }\n }\n }\n\n return [_stripBasename ? stripBasenameFromPathname(location.pathname, basename) : location.pathname, 'url'];\n}\n\nfunction updatePageloadTransaction(\n activeRootSpan: Span | undefined,\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 (branches) {\n const [name, source] = getNormalizedName(routes, location, branches, basename);\n\n getCurrentScope().setTransactionName(name);\n\n if (activeRootSpan) {\n activeRootSpan.updateName(name);\n activeRootSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, source);\n }\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 const client = getClient();\n if (!client || !CLIENTS_WITH_INSTRUMENT_NAVIGATION.includes(client)) {\n return;\n }\n\n if ((navigationType === 'PUSH' || navigationType === 'POP') && branches) {\n const [name, source] = getNormalizedName(routes, location, branches, basename);\n\n startBrowserTracingNavigationSpan(client, {\n name,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: source,\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'navigation',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.navigation.react.reactrouter_v6',\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 (!_useEffect || !_useLocation || !_useNavigationType || !_createRoutesFromChildren || !_matchRoutes) {\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}.`);\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(getActiveRootSpan(), 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) {\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(getActiveRootSpan(), 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 if (!_useEffect || !_useLocation || !_useNavigationType || !_matchRoutes) {\n DEBUG_BUILD &&\n logger.warn(\n 'reactRouterV6Instrumentation was unable to wrap the `createRouter` function because of one or more missing parameters.',\n );\n\n return createRouterFunction;\n }\n\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 const activeRootSpan = getActiveRootSpan();\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' && activeRootSpan) {\n updatePageloadTransaction(activeRootSpan, router.state.location, routes, undefined, basename);\n }\n\n router.subscribe((state: RouterState) => {\n const location = state.location;\n if (state.historyAction === 'PUSH' || state.historyAction === 'POP') {\n handleNavigation(location, routes, state.historyAction, undefined, basename);\n }\n });\n\n return router;\n };\n}\n\nfunction getActiveRootSpan(): Span | undefined {\n const span = getActiveSpan();\n const rootSpan = span ? getRootSpan(span) : undefined;\n\n if (!rootSpan) {\n return undefined;\n }\n\n const op = spanToJSON(rootSpan).op;\n\n // Only use this root span if it is a pageload or navigation span\n return op === 'navigation' || op === 'pageload' ? rootSpan : undefined;\n}\n"],"names":["browserTracingIntegration","WINDOW","startBrowserTracingPageLoadSpan","SEMANTIC_ATTRIBUTE_SENTRY_SOURCE","SEMANTIC_ATTRIBUTE_SENTRY_OP","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","getNumberOfUrlSegments","getCurrentScope","getClient","startBrowserTracingNavigationSpan","DEBUG_BUILD","logger","_jsx","hoistNonReactStatics","getActiveSpan","getRootSpan","spanToJSON"],"mappings":"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"}
@@ -1,11 +1,10 @@
1
+ import { jsx } from 'react/jsx-runtime';
1
2
  import { getClient, showReportDialog, withScope, captureException } from '@sentry/browser';
2
3
  import { isError, logger } from '@sentry/utils';
3
4
  import hoistNonReactStatics from 'hoist-non-react-statics';
4
5
  import * as React from 'react';
5
6
  import { DEBUG_BUILD } from './debug-build.js';
6
7
 
7
- const _jsxFileName = "/home/runner/work/sentry-javascript/sentry-javascript/packages/react/src/errorboundary.tsx";
8
-
9
8
  function isAtLeastReact17(version) {
10
9
  const major = version.match(/^([^.]+)/);
11
10
  return major !== null && parseInt(major[0]) >= 17;
@@ -180,9 +179,9 @@ function withErrorBoundary(
180
179
  const componentDisplayName = WrappedComponent.displayName || WrappedComponent.name || UNKNOWN_COMPONENT;
181
180
 
182
181
  const Wrapped = (props) => (
183
- React.createElement(ErrorBoundary, { ...errorBoundaryOptions, __self: this, __source: {fileName: _jsxFileName, lineNumber: 239}}
184
- , React.createElement(WrappedComponent, { ...props, __self: this, __source: {fileName: _jsxFileName, lineNumber: 240}} )
185
- )
182
+ jsx(ErrorBoundary, { ...errorBoundaryOptions, children:
183
+ jsx(WrappedComponent, { ...props,} )
184
+ })
186
185
  );
187
186
 
188
187
  // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
@@ -1 +1 @@
1
- {"version":3,"file":"errorboundary.js","sources":["../../src/errorboundary.tsx"],"sourcesContent":["import type { ReportDialogOptions } from '@sentry/browser';\nimport { captureException, getClient, showReportDialog, withScope } from '@sentry/browser';\nimport type { Scope } from '@sentry/types';\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: unknown;\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: unknown, 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: unknown, componentStack: string | null, eventId: string | null) => void) | undefined;\n /** Called on componentWillUnmount() */\n onUnmount?: ((error: unknown, 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: unknown, componentStack: string | undefined) => void) | undefined;\n};\n\ntype ErrorBoundaryState =\n | {\n componentStack: null;\n error: null;\n eventId: null;\n }\n | {\n componentStack: React.ErrorInfo['componentStack'];\n error: unknown;\n eventId: string;\n };\n\nconst INITIAL_STATE = {\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.\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 && props.showDialog) {\n this._openFallbackReportDialog = false;\n client.on('afterSendEvent', event => {\n if (!event.type && this._lastEventId && event.event_id === this._lastEventId) {\n showReportDialog({ ...props.dialogOptions, eventId: this._lastEventId });\n }\n });\n }\n }\n\n public componentDidCatch(error: unknown, { 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 // If users provide a fallback component we can assume they are handling the error.\n // Therefore, we set the mechanism depending on the presence of the fallback prop.\n mechanism: { handled: !!this.props.fallback },\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 = React.createElement(fallback, {\n error: state.error,\n componentStack: state.componentStack as string,\n resetError: this.resetErrorBoundary,\n eventId: state.eventId as string,\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":";;;;;;AAAA,MAAA,YAAA,GAAA,4FAAA,CAAA;AAQA;AACO,SAAS,gBAAgB,CAAC,OAAO,EAAmB;AAC3D,EAAE,MAAM,QAAQ,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;AACzC,EAAE,OAAO,KAAA,KAAU,IAAA,IAAQ,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA,IAAK,EAAE,CAAA;AACnD,CAAA;AACA;AACO,MAAM,iBAAkB,GAAE,UAAS;;AAmD1C,MAAM,gBAAgB;AACtB,EAAE,cAAc,EAAE,IAAI;AACtB,EAAE,KAAK,EAAE,IAAI;AACb,EAAE,OAAO,EAAE,IAAI;AACf,CAAC,CAAA;AACD;AACA,SAAS,QAAQ,CAAC,KAAK,EAA6B,KAAK,EAAe;AACxE,EAAE,MAAM,UAAW,GAAE,IAAI,OAAO,EAAkB,CAAA;AAClD;AACA,EAAE,SAAS,OAAO,CAAC,KAAK,EAA6B,KAAK,EAAe;AACzE;AACA;AACA,IAAI,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;AAC/B,MAAM,OAAM;AACZ,KAAI;AACJ,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACrB,MAAM,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;AACjC,MAAM,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;AACxC,KAAI;AACJ,IAAI,KAAK,CAAC,KAAM,GAAE,KAAK,CAAA;AACvB,GAAE;AACF;AACA,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;AACvB,CAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,aAAc,SAAQ,KAAK,CAAC,SAAS,CAAyC;;AAOpF,GAAS,WAAW,CAAC,KAAK,EAAsB;AAChD,IAAI,KAAK,CAAC,KAAK,CAAC,CAAA,aAAA,CAAA,SAAA,CAAA,MAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAChB;AACA,IAAI,IAAI,CAAC,KAAM,GAAE,aAAa,CAAA;AAC9B,IAAI,IAAI,CAAC,yBAA0B,GAAE,IAAI,CAAA;AACzC;AACA,IAAI,MAAM,MAAA,GAAS,SAAS,EAAE,CAAA;AAC9B,IAAI,IAAI,MAAA,IAAU,KAAK,CAAC,UAAU,EAAE;AACpC,MAAM,IAAI,CAAC,yBAA0B,GAAE,KAAK,CAAA;AAC5C,MAAM,MAAM,CAAC,EAAE,CAAC,gBAAgB,EAAE,SAAS;AAC3C,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAA,IAAQ,IAAI,CAAC,YAAa,IAAG,KAAK,CAAC,QAAA,KAAa,IAAI,CAAC,YAAY,EAAE;AACtF,UAAU,gBAAgB,CAAC,EAAE,GAAG,KAAK,CAAC,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,YAAA,EAAc,CAAC,CAAA;AAClF,SAAQ;AACR,OAAO,CAAC,CAAA;AACR,KAAI;AACJ,GAAE;AACF;AACA,GAAS,iBAAiB,CAAC,KAAK,EAAW,EAAE,cAAA,EAAgB,EAAyB;AACtF,IAAI,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,EAAE,aAAc,EAAA,GAAI,IAAI,CAAC,KAAK,CAAA;AAC5E,IAAI,SAAS,CAAC,KAAA,IAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,IAAI,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAA,IAAK,OAAO,CAAC,KAAK,CAAC,EAAE;AAC7D,QAAQ,MAAM,qBAAqB,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;AAC3D,QAAQ,kBAAkB,CAAC,IAAA,GAAO,CAAC,oBAAoB,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA,CAAA;AACA,QAAA,kBAAA,CAAA,KAAA,GAAA,cAAA,CAAA;AACA;AACA;AACA,QAAA,QAAA,CAAA,KAAA,EAAA,kBAAA,CAAA,CAAA;AACA,OAAA;AACA;AACA,MAAA,IAAA,aAAA,EAAA;AACA,QAAA,aAAA,CAAA,KAAA,EAAA,KAAA,EAAA,cAAA,CAAA,CAAA;AACA,OAAA;AACA;AACA,MAAA,MAAA,OAAA,GAAA,gBAAA,CAAA,KAAA,EAAA;AACA,QAAA,cAAA,EAAA;AACA,UAAA,QAAA,EAAA,EAAA,KAAA,EAAA,EAAA,cAAA,EAAA,EAAA;AACA,SAAA;AACA;AACA;AACA,QAAA,SAAA,EAAA,EAAA,OAAA,EAAA,CAAA,CAAA,IAAA,CAAA,KAAA,CAAA,QAAA,EAAA;AACA,OAAA,CAAA,CAAA;AACA;AACA,MAAA,IAAA,OAAA,EAAA;AACA,QAAA,OAAA,CAAA,KAAA,EAAA,cAAA,EAAA,OAAA,CAAA,CAAA;AACA,OAAA;AACA,MAAA,IAAA,UAAA,EAAA;AACA,QAAA,IAAA,CAAA,YAAA,GAAA,OAAA,CAAA;AACA,QAAA,IAAA,IAAA,CAAA,yBAAA,EAAA;AACA,UAAA,gBAAA,CAAA,EAAA,GAAA,aAAA,EAAA,OAAA,EAAA,CAAA,CAAA;AACA,SAAA;AACA,OAAA;AACA;AACA;AACA;AACA,MAAA,IAAA,CAAA,QAAA,CAAA,EAAA,KAAA,EAAA,cAAA,EAAA,OAAA,EAAA,CAAA,CAAA;AACA,KAAA,CAAA,CAAA;AACA,GAAA;AACA;AACA,GAAA,iBAAA,GAAA;AACA,IAAA,MAAA,EAAA,OAAA,EAAA,GAAA,IAAA,CAAA,KAAA,CAAA;AACA,IAAA,IAAA,OAAA,EAAA;AACA,MAAA,OAAA,EAAA,CAAA;AACA,KAAA;AACA,GAAA;AACA;AACA,GAAA,oBAAA,GAAA;AACA,IAAA,MAAA,EAAA,KAAA,EAAA,cAAA,EAAA,OAAA,EAAA,GAAA,IAAA,CAAA,KAAA,CAAA;AACA,IAAA,MAAA,EAAA,SAAA,EAAA,GAAA,IAAA,CAAA,KAAA,CAAA;AACA,IAAA,IAAA,SAAA,EAAA;AACA,MAAA,SAAA,CAAA,KAAA,EAAA,cAAA,EAAA,OAAA,CAAA,CAAA;AACA,KAAA;AACA,GAAA;AACA;AACA,GAAA,MAAA,GAAA,CAAA,IAAA,CAAA,kBAAA,GAAA,MAAA;AACA,IAAA,MAAA,EAAA,OAAA,EAAA,GAAA,IAAA,CAAA,KAAA,CAAA;AACA,IAAA,MAAA,EAAA,KAAA,EAAA,cAAA,EAAA,OAAA,EAAA,GAAA,IAAA,CAAA,KAAA,CAAA;AACA,IAAA,IAAA,OAAA,EAAA;AACA,MAAA,OAAA,CAAA,KAAA,EAAA,cAAA,EAAA,OAAA,CAAA,CAAA;AACA,KAAA;AACA,IAAA,IAAA,CAAA,QAAA,CAAA,aAAA,CAAA,CAAA;AACA,IAAA,CAAA;AACA;AACA,GAAA,MAAA,GAAA;AACA,IAAA,MAAA,EAAA,QAAA,EAAA,QAAA,EAAA,GAAA,IAAA,CAAA,KAAA,CAAA;AACA,IAAA,MAAA,KAAA,GAAA,IAAA,CAAA,KAAA,CAAA;AACA;AACA,IAAA,IAAA,KAAA,CAAA,KAAA,EAAA;AACA,MAAA,IAAA,OAAA,GAAA,SAAA,CAAA;AACA,MAAA,IAAA,OAAA,QAAA,KAAA,UAAA,EAAA;AACA,QAAA,OAAA,GAAA,KAAA,CAAA,aAAA,CAAA,QAAA,EAAA;AACA,UAAA,KAAA,EAAA,KAAA,CAAA,KAAA;AACA,UAAA,cAAA,EAAA,KAAA,CAAA,cAAA;AACA,UAAA,UAAA,EAAA,IAAA,CAAA,kBAAA;AACA,UAAA,OAAA,EAAA,KAAA,CAAA,OAAA;AACA,SAAA,CAAA,CAAA;AACA,OAAA,MAAA;AACA,QAAA,OAAA,GAAA,QAAA,CAAA;AACA,OAAA;AACA;AACA,MAAA,IAAA,KAAA,CAAA,cAAA,CAAA,OAAA,CAAA,EAAA;AACA,QAAA,OAAA,OAAA,CAAA;AACA,OAAA;AACA;AACA,MAAA,IAAA,QAAA,EAAA;AACA,QAAA,WAAA,IAAA,MAAA,CAAA,IAAA,CAAA,+CAAA,CAAA,CAAA;AACA,OAAA;AACA;AACA;AACA,MAAA,OAAA,IAAA,CAAA;AACA,KAAA;AACA;AACA,IAAA,IAAA,OAAA,QAAA,KAAA,UAAA,EAAA;AACA,MAAA,OAAA,CAAA,QAAA,IAAA,CAAA;AACA,KAAA;AACA,IAAA,OAAA,QAAA,CAAA;AACA,GAAA;AACA,CAAA;AACA;AACA;AACA,SAAA,iBAAA;AACA,EAAA,gBAAA;AACA,EAAA,oBAAA;AACA,EAAA;AACA;AACA,EAAA,MAAA,oBAAA,GAAA,gBAAA,CAAA,WAAA,IAAA,gBAAA,CAAA,IAAA,IAAA,iBAAA,CAAA;AACA;AACA,EAAA,MAAA,OAAA,GAAA,CAAA,KAAA;AACA,IAAA,KAAA,CAAA,aAAA,CAAA,aAAA,EAAA,EAAA,GAAA,oBAAA,EAAA,MAAA,EAAA,IAAA,EAAA,QAAA,EAAA,CAAA,QAAA,EAAA,YAAA,EAAA,UAAA,EAAA,GAAA,CAAA,CAAA;AACA,QAAA,KAAA,CAAA,aAAA,CAAA,gBAAA,EAAA,EAAA,GAAA,KAAA,EAAA,MAAA,EAAA,IAAA,EAAA,QAAA,EAAA,CAAA,QAAA,EAAA,YAAA,EAAA,UAAA,EAAA,GAAA,CAAA,CAAA,EAAA;AACA,KAAA;AACA,GAAA,CAAA;AACA;AACA;AACA,EAAA,OAAA,CAAA,WAAA,GAAA,CAAA,cAAA,EAAA,oBAAA,CAAA,CAAA,CAAA,CAAA;AACA;AACA;AACA;AACA,EAAA,oBAAA,CAAA,OAAA,EAAA,gBAAA,CAAA,CAAA;AACA,EAAA,OAAA,OAAA,CAAA;AACA;;;;"}
1
+ {"version":3,"file":"errorboundary.js","sources":["../../src/errorboundary.tsx"],"sourcesContent":["import type { ReportDialogOptions } from '@sentry/browser';\nimport { captureException, getClient, showReportDialog, withScope } from '@sentry/browser';\nimport type { Scope } from '@sentry/types';\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: unknown;\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: unknown, 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: unknown, componentStack: string | null, eventId: string | null) => void) | undefined;\n /** Called on componentWillUnmount() */\n onUnmount?: ((error: unknown, 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: unknown, componentStack: string | undefined) => void) | undefined;\n};\n\ntype ErrorBoundaryState =\n | {\n componentStack: null;\n error: null;\n eventId: null;\n }\n | {\n componentStack: React.ErrorInfo['componentStack'];\n error: unknown;\n eventId: string;\n };\n\nconst INITIAL_STATE = {\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.\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 && props.showDialog) {\n this._openFallbackReportDialog = false;\n client.on('afterSendEvent', event => {\n if (!event.type && this._lastEventId && event.event_id === this._lastEventId) {\n showReportDialog({ ...props.dialogOptions, eventId: this._lastEventId });\n }\n });\n }\n }\n\n public componentDidCatch(error: unknown, { 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 // If users provide a fallback component we can assume they are handling the error.\n // Therefore, we set the mechanism depending on the presence of the fallback prop.\n mechanism: { handled: !!this.props.fallback },\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 = React.createElement(fallback, {\n error: state.error,\n componentStack: state.componentStack as string,\n resetError: this.resetErrorBoundary,\n eventId: state.eventId as string,\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":["_jsx"],"mappings":";;;;;;;AASO,SAAS,gBAAgB,CAAC,OAAO,EAAmB;AAC3D,EAAE,MAAM,QAAQ,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;AACzC,EAAE,OAAO,KAAA,KAAU,IAAA,IAAQ,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA,IAAK,EAAE,CAAA;AACnD,CAAA;AACA;AACO,MAAM,iBAAkB,GAAE,UAAS;;AAmD1C,MAAM,gBAAgB;AACtB,EAAE,cAAc,EAAE,IAAI;AACtB,EAAE,KAAK,EAAE,IAAI;AACb,EAAE,OAAO,EAAE,IAAI;AACf,CAAC,CAAA;AACD;AACA,SAAS,QAAQ,CAAC,KAAK,EAA6B,KAAK,EAAe;AACxE,EAAE,MAAM,UAAW,GAAE,IAAI,OAAO,EAAkB,CAAA;AAClD;AACA,EAAE,SAAS,OAAO,CAAC,KAAK,EAA6B,KAAK,EAAe;AACzE;AACA;AACA,IAAI,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;AAC/B,MAAM,OAAM;AACZ,KAAI;AACJ,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AACrB,MAAM,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;AACjC,MAAM,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;AACxC,KAAI;AACJ,IAAI,KAAK,CAAC,KAAM,GAAE,KAAK,CAAA;AACvB,GAAE;AACF;AACA,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;AACvB,CAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,aAAc,SAAQ,KAAK,CAAC,SAAS,CAAyC;;AAOpF,GAAS,WAAW,CAAC,KAAK,EAAsB;AAChD,IAAI,KAAK,CAAC,KAAK,CAAC,CAAA,aAAA,CAAA,SAAA,CAAA,MAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAChB;AACA,IAAI,IAAI,CAAC,KAAM,GAAE,aAAa,CAAA;AAC9B,IAAI,IAAI,CAAC,yBAA0B,GAAE,IAAI,CAAA;AACzC;AACA,IAAI,MAAM,MAAA,GAAS,SAAS,EAAE,CAAA;AAC9B,IAAI,IAAI,MAAA,IAAU,KAAK,CAAC,UAAU,EAAE;AACpC,MAAM,IAAI,CAAC,yBAA0B,GAAE,KAAK,CAAA;AAC5C,MAAM,MAAM,CAAC,EAAE,CAAC,gBAAgB,EAAE,SAAS;AAC3C,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAA,IAAQ,IAAI,CAAC,YAAa,IAAG,KAAK,CAAC,QAAA,KAAa,IAAI,CAAC,YAAY,EAAE;AACtF,UAAU,gBAAgB,CAAC,EAAE,GAAG,KAAK,CAAC,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,YAAA,EAAc,CAAC,CAAA;AAClF,SAAQ;AACR,OAAO,CAAC,CAAA;AACR,KAAI;AACJ,GAAE;AACF;AACA,GAAS,iBAAiB,CAAC,KAAK,EAAW,EAAE,cAAA,EAAgB,EAAyB;AACtF,IAAI,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,EAAE,aAAc,EAAA,GAAI,IAAI,CAAC,KAAK,CAAA;AAC5E,IAAI,SAAS,CAAC,KAAA,IAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,IAAI,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAA,IAAK,OAAO,CAAC,KAAK,CAAC,EAAE;AAC7D,QAAQ,MAAM,qBAAqB,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;AAC3D,QAAQ,kBAAkB,CAAC,IAAA,GAAO,CAAC,oBAAoB,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA,CAAA;AACA,QAAA,kBAAA,CAAA,KAAA,GAAA,cAAA,CAAA;AACA;AACA;AACA,QAAA,QAAA,CAAA,KAAA,EAAA,kBAAA,CAAA,CAAA;AACA,OAAA;AACA;AACA,MAAA,IAAA,aAAA,EAAA;AACA,QAAA,aAAA,CAAA,KAAA,EAAA,KAAA,EAAA,cAAA,CAAA,CAAA;AACA,OAAA;AACA;AACA,MAAA,MAAA,OAAA,GAAA,gBAAA,CAAA,KAAA,EAAA;AACA,QAAA,cAAA,EAAA;AACA,UAAA,QAAA,EAAA,EAAA,KAAA,EAAA,EAAA,cAAA,EAAA,EAAA;AACA,SAAA;AACA;AACA;AACA,QAAA,SAAA,EAAA,EAAA,OAAA,EAAA,CAAA,CAAA,IAAA,CAAA,KAAA,CAAA,QAAA,EAAA;AACA,OAAA,CAAA,CAAA;AACA;AACA,MAAA,IAAA,OAAA,EAAA;AACA,QAAA,OAAA,CAAA,KAAA,EAAA,cAAA,EAAA,OAAA,CAAA,CAAA;AACA,OAAA;AACA,MAAA,IAAA,UAAA,EAAA;AACA,QAAA,IAAA,CAAA,YAAA,GAAA,OAAA,CAAA;AACA,QAAA,IAAA,IAAA,CAAA,yBAAA,EAAA;AACA,UAAA,gBAAA,CAAA,EAAA,GAAA,aAAA,EAAA,OAAA,EAAA,CAAA,CAAA;AACA,SAAA;AACA,OAAA;AACA;AACA;AACA;AACA,MAAA,IAAA,CAAA,QAAA,CAAA,EAAA,KAAA,EAAA,cAAA,EAAA,OAAA,EAAA,CAAA,CAAA;AACA,KAAA,CAAA,CAAA;AACA,GAAA;AACA;AACA,GAAA,iBAAA,GAAA;AACA,IAAA,MAAA,EAAA,OAAA,EAAA,GAAA,IAAA,CAAA,KAAA,CAAA;AACA,IAAA,IAAA,OAAA,EAAA;AACA,MAAA,OAAA,EAAA,CAAA;AACA,KAAA;AACA,GAAA;AACA;AACA,GAAA,oBAAA,GAAA;AACA,IAAA,MAAA,EAAA,KAAA,EAAA,cAAA,EAAA,OAAA,EAAA,GAAA,IAAA,CAAA,KAAA,CAAA;AACA,IAAA,MAAA,EAAA,SAAA,EAAA,GAAA,IAAA,CAAA,KAAA,CAAA;AACA,IAAA,IAAA,SAAA,EAAA;AACA,MAAA,SAAA,CAAA,KAAA,EAAA,cAAA,EAAA,OAAA,CAAA,CAAA;AACA,KAAA;AACA,GAAA;AACA;AACA,GAAA,MAAA,GAAA,CAAA,IAAA,CAAA,kBAAA,GAAA,MAAA;AACA,IAAA,MAAA,EAAA,OAAA,EAAA,GAAA,IAAA,CAAA,KAAA,CAAA;AACA,IAAA,MAAA,EAAA,KAAA,EAAA,cAAA,EAAA,OAAA,EAAA,GAAA,IAAA,CAAA,KAAA,CAAA;AACA,IAAA,IAAA,OAAA,EAAA;AACA,MAAA,OAAA,CAAA,KAAA,EAAA,cAAA,EAAA,OAAA,CAAA,CAAA;AACA,KAAA;AACA,IAAA,IAAA,CAAA,QAAA,CAAA,aAAA,CAAA,CAAA;AACA,IAAA,CAAA;AACA;AACA,GAAA,MAAA,GAAA;AACA,IAAA,MAAA,EAAA,QAAA,EAAA,QAAA,EAAA,GAAA,IAAA,CAAA,KAAA,CAAA;AACA,IAAA,MAAA,KAAA,GAAA,IAAA,CAAA,KAAA,CAAA;AACA;AACA,IAAA,IAAA,KAAA,CAAA,KAAA,EAAA;AACA,MAAA,IAAA,OAAA,GAAA,SAAA,CAAA;AACA,MAAA,IAAA,OAAA,QAAA,KAAA,UAAA,EAAA;AACA,QAAA,OAAA,GAAA,KAAA,CAAA,aAAA,CAAA,QAAA,EAAA;AACA,UAAA,KAAA,EAAA,KAAA,CAAA,KAAA;AACA,UAAA,cAAA,EAAA,KAAA,CAAA,cAAA;AACA,UAAA,UAAA,EAAA,IAAA,CAAA,kBAAA;AACA,UAAA,OAAA,EAAA,KAAA,CAAA,OAAA;AACA,SAAA,CAAA,CAAA;AACA,OAAA,MAAA;AACA,QAAA,OAAA,GAAA,QAAA,CAAA;AACA,OAAA;AACA;AACA,MAAA,IAAA,KAAA,CAAA,cAAA,CAAA,OAAA,CAAA,EAAA;AACA,QAAA,OAAA,OAAA,CAAA;AACA,OAAA;AACA;AACA,MAAA,IAAA,QAAA,EAAA;AACA,QAAA,WAAA,IAAA,MAAA,CAAA,IAAA,CAAA,+CAAA,CAAA,CAAA;AACA,OAAA;AACA;AACA;AACA,MAAA,OAAA,IAAA,CAAA;AACA,KAAA;AACA;AACA,IAAA,IAAA,OAAA,QAAA,KAAA,UAAA,EAAA;AACA,MAAA,OAAA,CAAA,QAAA,IAAA,CAAA;AACA,KAAA;AACA,IAAA,OAAA,QAAA,CAAA;AACA,GAAA;AACA,CAAA;AACA;AACA;AACA,SAAA,iBAAA;AACA,EAAA,gBAAA;AACA,EAAA,oBAAA;AACA,EAAA;AACA;AACA,EAAA,MAAA,oBAAA,GAAA,gBAAA,CAAA,WAAA,IAAA,gBAAA,CAAA,IAAA,IAAA,iBAAA,CAAA;AACA;AACA,EAAA,MAAA,OAAA,GAAA,CAAA,KAAA;AACA,IAAAA,GAAA,CAAA,aAAA,EAAA,EAAA,GAAA,oBAAA,EAAA,QAAA;AACA,MAAAA,GAAA,CAAA,gBAAA,EAAA,EAAA,GAAA,KAAA,EAAA,EAAA;AACA,KAAA,CAAA;AACA,GAAA,CAAA;AACA;AACA;AACA,EAAA,OAAA,CAAA,WAAA,GAAA,CAAA,cAAA,EAAA,oBAAA,CAAA,CAAA,CAAA,CAAA;AACA;AACA;AACA;AACA,EAAA,oBAAA,CAAA,OAAA,EAAA,gBAAA,CAAA,CAAA;AACA,EAAA,OAAA,OAAA,CAAA;AACA;;;;"}
package/esm/profiler.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { jsx } from 'react/jsx-runtime';
1
2
  import { startInactiveSpan } from '@sentry/browser';
2
3
  import { SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, withActiveSpan, spanToJSON } from '@sentry/core';
3
4
  import { timestampInSeconds } from '@sentry/utils';
@@ -5,7 +6,6 @@ import hoistNonReactStatics from 'hoist-non-react-statics';
5
6
  import * as React from 'react';
6
7
  import { REACT_MOUNT_OP, REACT_UPDATE_OP, REACT_RENDER_OP } from './constants.js';
7
8
 
8
- const _jsxFileName = "/home/runner/work/sentry-javascript/sentry-javascript/packages/react/src/profiler.tsx";
9
9
  const UNKNOWN_COMPONENT = 'unknown';
10
10
 
11
11
  /**
@@ -142,9 +142,9 @@ function withProfiler(
142
142
  (options && options.name) || WrappedComponent.displayName || WrappedComponent.name || UNKNOWN_COMPONENT;
143
143
 
144
144
  const Wrapped = (props) => (
145
- React.createElement(Profiler, { ...options, name: componentDisplayName, updateProps: props, __self: this, __source: {fileName: _jsxFileName, lineNumber: 163}}
146
- , React.createElement(WrappedComponent, { ...props, __self: this, __source: {fileName: _jsxFileName, lineNumber: 164}} )
147
- )
145
+ jsx(Profiler, { ...options, name: componentDisplayName, updateProps: props, children:
146
+ jsx(WrappedComponent, { ...props,} )
147
+ })
148
148
  );
149
149
 
150
150
  Wrapped.displayName = `profiler(${componentDisplayName})`;
@@ -1 +1 @@
1
- {"version":3,"file":"profiler.js","sources":["../../src/profiler.tsx"],"sourcesContent":["import { startInactiveSpan } from '@sentry/browser';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, spanToJSON, withActiveSpan } from '@sentry/core';\nimport type { Span } 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 this._mountSpan = startInactiveSpan({\n name: `<${name}>`,\n onlyIfParent: true,\n op: REACT_MOUNT_OP,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.react.profiler',\n '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 = withActiveSpan(this._mountSpan, () => {\n return startInactiveSpan({\n name: `<${this.props.name}>`,\n onlyIfParent: true,\n op: REACT_UPDATE_OP,\n startTime: now,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.react.profiler',\n 'ui.component_name': this.props.name,\n 'ui.react.changed_props': changedProps,\n },\n });\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 endTimestamp = timestampInSeconds();\n const { name, includeRender = true } = this.props;\n\n if (this._mountSpan && includeRender) {\n const startTime = spanToJSON(this._mountSpan).timestamp;\n withActiveSpan(this._mountSpan, () => {\n const renderSpan = startInactiveSpan({\n onlyIfParent: true,\n name: `<${name}>`,\n op: REACT_RENDER_OP,\n startTime,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.react.profiler',\n 'ui.component_name': name,\n },\n });\n if (renderSpan) {\n // Have to cast to Span because the type of _mountSpan is Span | undefined\n // and not getting narrowed properly\n renderSpan.end(endTimestamp);\n }\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 */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\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 return startInactiveSpan({\n name: `<${name}>`,\n onlyIfParent: true,\n op: REACT_MOUNT_OP,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.react.profiler',\n 'ui.component_name': name,\n },\n });\n });\n\n React.useEffect(() => {\n if (mountSpan) {\n mountSpan.end();\n }\n\n return (): void => {\n if (mountSpan && options.hasRenderSpan) {\n const startTime = spanToJSON(mountSpan).timestamp;\n const endTimestamp = timestampInSeconds();\n\n const renderSpan = startInactiveSpan({\n name: `<${name}>`,\n onlyIfParent: true,\n op: REACT_RENDER_OP,\n startTime,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.react.profiler',\n 'ui.component_name': name,\n },\n });\n if (renderSpan) {\n // Have to cast to Span because the type of _mountSpan is Span | undefined\n // and not getting narrowed properly\n renderSpan.end(endTimestamp);\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"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"profiler.js","sources":["../../src/profiler.tsx"],"sourcesContent":["import { startInactiveSpan } from '@sentry/browser';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, spanToJSON, withActiveSpan } from '@sentry/core';\nimport type { Span } 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 this._mountSpan = startInactiveSpan({\n name: `<${name}>`,\n onlyIfParent: true,\n op: REACT_MOUNT_OP,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.react.profiler',\n '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 = withActiveSpan(this._mountSpan, () => {\n return startInactiveSpan({\n name: `<${this.props.name}>`,\n onlyIfParent: true,\n op: REACT_UPDATE_OP,\n startTime: now,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.react.profiler',\n 'ui.component_name': this.props.name,\n 'ui.react.changed_props': changedProps,\n },\n });\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 endTimestamp = timestampInSeconds();\n const { name, includeRender = true } = this.props;\n\n if (this._mountSpan && includeRender) {\n const startTime = spanToJSON(this._mountSpan).timestamp;\n withActiveSpan(this._mountSpan, () => {\n const renderSpan = startInactiveSpan({\n onlyIfParent: true,\n name: `<${name}>`,\n op: REACT_RENDER_OP,\n startTime,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.react.profiler',\n 'ui.component_name': name,\n },\n });\n if (renderSpan) {\n // Have to cast to Span because the type of _mountSpan is Span | undefined\n // and not getting narrowed properly\n renderSpan.end(endTimestamp);\n }\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 */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\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 return startInactiveSpan({\n name: `<${name}>`,\n onlyIfParent: true,\n op: REACT_MOUNT_OP,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.react.profiler',\n 'ui.component_name': name,\n },\n });\n });\n\n React.useEffect(() => {\n if (mountSpan) {\n mountSpan.end();\n }\n\n return (): void => {\n if (mountSpan && options.hasRenderSpan) {\n const startTime = spanToJSON(mountSpan).timestamp;\n const endTimestamp = timestampInSeconds();\n\n const renderSpan = startInactiveSpan({\n name: `<${name}>`,\n onlyIfParent: true,\n op: REACT_RENDER_OP,\n startTime,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.react.profiler',\n 'ui.component_name': name,\n },\n });\n if (renderSpan) {\n // Have to cast to Span because the type of _mountSpan is Span | undefined\n // and not getting narrowed properly\n renderSpan.end(endTimestamp);\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"],"names":["_jsx"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
+ import { jsx } from 'react/jsx-runtime';
1
2
  import { browserTracingIntegration, startBrowserTracingPageLoadSpan, startBrowserTracingNavigationSpan, WINDOW } from '@sentry/browser';
2
3
  import { SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, getCurrentScope, getActiveSpan, getRootSpan, spanToJSON } from '@sentry/core';
3
4
  import hoistNonReactStatics from 'hoist-non-react-statics';
4
- import * as React from 'react';
5
+ import 'react';
5
6
 
6
- const _jsxFileName = "/home/runner/work/sentry-javascript/sentry-javascript/packages/react/src/reactrouter.tsx";
7
7
  // We need to disable eslint no-explict-any because any is required for the
8
8
  // react-router typings.
9
9
 
@@ -203,7 +203,7 @@ function withSentryRouting(Route) {
203
203
  // @ts-expect-error Setting more specific React Component typing for `R` generic above
204
204
  // will break advanced type inference done by react router params:
205
205
  // https://github.com/DefinitelyTyped/DefinitelyTyped/blob/13dc4235c069e25fe7ee16e11f529d909f9f3ff8/types/react-router/index.d.ts#L154-L164
206
- return React.createElement(Route, { ...props, __self: this, __source: {fileName: _jsxFileName, lineNumber: 243}} );
206
+ return jsx(Route, { ...props,} );
207
207
  };
208
208
 
209
209
  WrappedRoute.displayName = `sentryRoute(${componentDisplayName})`;
@@ -1 +1 @@
1
- {"version":3,"file":"reactrouter.js","sources":["../../src/reactrouter.tsx"],"sourcesContent":["import {\n WINDOW,\n browserTracingIntegration,\n startBrowserTracingNavigationSpan,\n startBrowserTracingPageLoadSpan,\n} from '@sentry/browser';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n getActiveSpan,\n getCurrentScope,\n getRootSpan,\n spanToJSON,\n} from '@sentry/core';\nimport type { Client, Integration, Span, TransactionSource } from '@sentry/types';\nimport hoistNonReactStatics from 'hoist-non-react-statics';\nimport * as React from 'react';\n\nimport type { Action, Location } 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\nexport type MatchPath = (pathname: string, props: string | string[] | any, parent?: Match | null) => Match | null; // eslint-disable-line @typescript-eslint/no-explicit-any\n\ninterface ReactRouterOptions {\n history: RouterHistory;\n routes?: RouteConfig[];\n matchPath?: MatchPath;\n}\n\n/**\n * A browser tracing integration that uses React Router v4 to instrument navigations.\n * Expects `history` (and optionally `routes` and `matchPath`) to be passed as options.\n */\nexport function reactRouterV4BrowserTracingIntegration(\n options: Parameters<typeof browserTracingIntegration>[0] & ReactRouterOptions,\n): Integration {\n const integration = browserTracingIntegration({\n ...options,\n instrumentPageLoad: false,\n instrumentNavigation: false,\n });\n\n const { history, routes, matchPath, instrumentPageLoad = true, instrumentNavigation = true } = options;\n\n return {\n ...integration,\n afterAllSetup(client) {\n integration.afterAllSetup(client);\n\n instrumentReactRouter(\n client,\n instrumentPageLoad,\n instrumentNavigation,\n history,\n 'reactrouter_v4',\n routes,\n matchPath,\n );\n },\n };\n}\n\n/**\n * A browser tracing integration that uses React Router v5 to instrument navigations.\n * Expects `history` (and optionally `routes` and `matchPath`) to be passed as options.\n */\nexport function reactRouterV5BrowserTracingIntegration(\n options: Parameters<typeof browserTracingIntegration>[0] & ReactRouterOptions,\n): Integration {\n const integration = browserTracingIntegration({\n ...options,\n instrumentPageLoad: false,\n instrumentNavigation: false,\n });\n\n const { history, routes, matchPath, instrumentPageLoad = true, instrumentNavigation = true } = options;\n\n return {\n ...integration,\n afterAllSetup(client) {\n integration.afterAllSetup(client);\n\n instrumentReactRouter(\n client,\n instrumentPageLoad,\n instrumentNavigation,\n history,\n 'reactrouter_v5',\n routes,\n matchPath,\n );\n },\n };\n}\n\nfunction instrumentReactRouter(\n client: Client,\n instrumentPageLoad: boolean,\n instrumentNavigation: boolean,\n history: RouterHistory,\n instrumentationName: string,\n allRoutes: RouteConfig[] = [],\n matchPath?: MatchPath,\n): void {\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 if (instrumentPageLoad) {\n const initPathName = getInitPathName();\n if (initPathName) {\n const [name, source] = normalizeTransactionName(initPathName);\n startBrowserTracingPageLoadSpan(client, {\n name,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'pageload',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: `auto.pageload.react.${instrumentationName}`,\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: source,\n },\n });\n }\n }\n\n if (instrumentNavigation && history.listen) {\n history.listen((location, action) => {\n if (action && (action === 'PUSH' || action === 'POP')) {\n const [name, source] = normalizeTransactionName(location.pathname);\n startBrowserTracingNavigationSpan(client, {\n name,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'navigation',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: `auto.navigation.react.${instrumentationName}`,\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: source,\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 (props && props.computedMatch && props.computedMatch.isExact) {\n const route = props.computedMatch.path;\n const activeRootSpan = getActiveRootSpan();\n\n getCurrentScope().setTransactionName(route);\n\n if (activeRootSpan) {\n activeRootSpan.updateName(route);\n activeRootSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, 'route');\n }\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\nfunction getActiveRootSpan(): Span | undefined {\n const span = getActiveSpan();\n const rootSpan = span && getRootSpan(span);\n\n if (!rootSpan) {\n return undefined;\n }\n\n const op = spanToJSON(rootSpan).op;\n\n // Only use this root span if it is a pageload or navigation span\n return op === 'navigation' || op === 'pageload' ? rootSpan : undefined;\n}\n"],"names":[],"mappings":";;;;;AAAA,MAAO,YAAA,GAAA,0FAAA;AAqBP;AACA;;AAwBA;AACA;AACA;AACA;AACO,SAAS,sCAAsC;AACtD,EAAE,OAAO;AACT,EAAe;AACf,EAAE,MAAM,WAAA,GAAc,yBAAyB,CAAC;AAChD,IAAI,GAAG,OAAO;AACd,IAAI,kBAAkB,EAAE,KAAK;AAC7B,IAAI,oBAAoB,EAAE,KAAK;AAC/B,GAAG,CAAC,CAAA;AACJ;AACA,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,kBAAmB,GAAE,IAAI,EAAE,oBAAA,GAAuB,IAAK,EAAA,GAAI,OAAO,CAAA;AACxG;AACA,EAAE,OAAO;AACT,IAAI,GAAG,WAAW;AAClB,IAAI,aAAa,CAAC,MAAM,EAAE;AAC1B,MAAM,WAAW,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;AACvC;AACA,MAAM,qBAAqB;AAC3B,QAAQ,MAAM;AACd,QAAQ,kBAAkB;AAC1B,QAAQ,oBAAoB;AAC5B,QAAQ,OAAO;AACf,QAAQ,gBAAgB;AACxB,QAAQ,MAAM;AACd,QAAQ,SAAS;AACjB,OAAO,CAAA;AACP,KAAK;AACL,GAAG,CAAA;AACH,CAAA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,sCAAsC;AACtD,EAAE,OAAO;AACT,EAAe;AACf,EAAE,MAAM,WAAA,GAAc,yBAAyB,CAAC;AAChD,IAAI,GAAG,OAAO;AACd,IAAI,kBAAkB,EAAE,KAAK;AAC7B,IAAI,oBAAoB,EAAE,KAAK;AAC/B,GAAG,CAAC,CAAA;AACJ;AACA,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,kBAAmB,GAAE,IAAI,EAAE,oBAAA,GAAuB,IAAK,EAAA,GAAI,OAAO,CAAA;AACxG;AACA,EAAE,OAAO;AACT,IAAI,GAAG,WAAW;AAClB,IAAI,aAAa,CAAC,MAAM,EAAE;AAC1B,MAAM,WAAW,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;AACvC;AACA,MAAM,qBAAqB;AAC3B,QAAQ,MAAM;AACd,QAAQ,kBAAkB;AAC1B,QAAQ,oBAAoB;AAC5B,QAAQ,OAAO;AACf,QAAQ,gBAAgB;AACxB,QAAQ,MAAM;AACd,QAAQ,SAAS;AACjB,OAAO,CAAA;AACP,KAAK;AACL,GAAG,CAAA;AACH,CAAA;AACA;AACA,SAAS,qBAAqB;AAC9B,EAAE,MAAM;AACR,EAAE,kBAAkB;AACpB,EAAE,oBAAoB;AACtB,EAAE,OAAO;AACT,EAAE,mBAAmB;AACrB,EAAE,SAAS,GAAkB,EAAE;AAC/B,EAAE,SAAS;AACX,EAAQ;AACR,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,IAAI,MAAA,IAAU,MAAM,CAAC,QAAQ,EAAE;AACnC,MAAM,OAAO,MAAM,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,IAAI,kBAAkB,EAAE;AAC1B,IAAI,MAAM,YAAA,GAAe,eAAe,EAAE,CAAA;AAC1C,IAAI,IAAI,YAAY,EAAE;AACtB,MAAM,MAAM,CAAC,IAAI,EAAE,MAAM,IAAI,wBAAwB,CAAC,YAAY,CAAC,CAAA;AACnE,MAAM,+BAA+B,CAAC,MAAM,EAAE;AAC9C,QAAQ,IAAI;AACZ,QAAQ,UAAU,EAAE;AACpB,UAAU,CAAC,4BAA4B,GAAG,UAAU;AACpD,UAAU,CAAC,gCAAgC,GAAG,CAAC,oBAAoB,EAAE,mBAAmB,CAAC,CAAA;AACA,UAAA,CAAA,gCAAA,GAAA,MAAA;AACA,SAAA;AACA,OAAA,CAAA,CAAA;AACA,KAAA;AACA,GAAA;AACA;AACA,EAAA,IAAA,oBAAA,IAAA,OAAA,CAAA,MAAA,EAAA;AACA,IAAA,OAAA,CAAA,MAAA,CAAA,CAAA,QAAA,EAAA,MAAA,KAAA;AACA,MAAA,IAAA,MAAA,KAAA,MAAA,KAAA,MAAA,IAAA,MAAA,KAAA,KAAA,CAAA,EAAA;AACA,QAAA,MAAA,CAAA,IAAA,EAAA,MAAA,CAAA,GAAA,wBAAA,CAAA,QAAA,CAAA,QAAA,CAAA,CAAA;AACA,QAAA,iCAAA,CAAA,MAAA,EAAA;AACA,UAAA,IAAA;AACA,UAAA,UAAA,EAAA;AACA,YAAA,CAAA,4BAAA,GAAA,YAAA;AACA,YAAA,CAAA,gCAAA,GAAA,CAAA,sBAAA,EAAA,mBAAA,CAAA,CAAA;AACA,YAAA,CAAA,gCAAA,GAAA,MAAA;AACA,WAAA;AACA,SAAA,CAAA,CAAA;AACA,OAAA;AACA,KAAA,CAAA,CAAA;AACA,GAAA;AACA,CAAA;AACA;AACA;AACA;AACA;AACA;AACA,SAAA,WAAA;AACA,EAAA,MAAA;AACA,EAAA,QAAA;AACA,EAAA,SAAA;AACA,EAAA,MAAA,GAAA,EAAA;AACA,EAAA;AACA,EAAA,MAAA,CAAA,IAAA,CAAA,KAAA,IAAA;AACA,IAAA,MAAA,KAAA,GAAA,KAAA,CAAA,IAAA;AACA,QAAA,SAAA,CAAA,QAAA,EAAA,KAAA,CAAA;AACA,QAAA,MAAA,CAAA,MAAA;AACA,UAAA,MAAA,CAAA,MAAA,CAAA,MAAA,GAAA,CAAA,CAAA,CAAA,KAAA;AACA,UAAA,gBAAA,CAAA,QAAA,CAAA,CAAA;AACA;AACA,IAAA,IAAA,KAAA,EAAA;AACA,MAAA,MAAA,CAAA,IAAA,CAAA,EAAA,KAAA,EAAA,KAAA,EAAA,CAAA,CAAA;AACA;AACA,MAAA,IAAA,KAAA,CAAA,MAAA,EAAA;AACA,QAAA,WAAA,CAAA,KAAA,CAAA,MAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,CAAA,CAAA;AACA,OAAA;AACA,KAAA;AACA;AACA,IAAA,OAAA,CAAA,CAAA,KAAA,CAAA;AACA,GAAA,CAAA,CAAA;AACA;AACA,EAAA,OAAA,MAAA,CAAA;AACA,CAAA;AACA;AACA,SAAA,gBAAA,CAAA,QAAA,EAAA;AACA,EAAA,OAAA,EAAA,IAAA,EAAA,GAAA,EAAA,GAAA,EAAA,GAAA,EAAA,MAAA,EAAA,EAAA,EAAA,OAAA,EAAA,QAAA,KAAA,GAAA,EAAA,CAAA;AACA,CAAA;AACA;AACA;AACA,SAAA,iBAAA,CAAA,KAAA,EAAA;AACA,EAAA,MAAA,oBAAA,GAAA,CAAA,KAAA,GAAA,WAAA,IAAA,CAAA,KAAA,GAAA,IAAA,CAAA;AACA;AACA,EAAA,MAAA,YAAA,GAAA,CAAA,KAAA,KAAA;AACA,IAAA,IAAA,KAAA,IAAA,KAAA,CAAA,aAAA,IAAA,KAAA,CAAA,aAAA,CAAA,OAAA,EAAA;AACA,MAAA,MAAA,KAAA,GAAA,KAAA,CAAA,aAAA,CAAA,IAAA,CAAA;AACA,MAAA,MAAA,cAAA,GAAA,iBAAA,EAAA,CAAA;AACA;AACA,MAAA,eAAA,EAAA,CAAA,kBAAA,CAAA,KAAA,CAAA,CAAA;AACA;AACA,MAAA,IAAA,cAAA,EAAA;AACA,QAAA,cAAA,CAAA,UAAA,CAAA,KAAA,CAAA,CAAA;AACA,QAAA,cAAA,CAAA,YAAA,CAAA,gCAAA,EAAA,OAAA,CAAA,CAAA;AACA,OAAA;AACA,KAAA;AACA;AACA;AACA;AACA;AACA,IAAA,OAAA,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,GAAA,KAAA,EAAA,MAAA,EAAA,IAAA,EAAA,QAAA,EAAA,CAAA,QAAA,EAAA,YAAA,EAAA,UAAA,EAAA,GAAA,CAAA,CAAA,EAAA,CAAA;AACA,GAAA,CAAA;AACA;AACA,EAAA,YAAA,CAAA,WAAA,GAAA,CAAA,YAAA,EAAA,oBAAA,CAAA,CAAA,CAAA,CAAA;AACA,EAAA,oBAAA,CAAA,YAAA,EAAA,KAAA,CAAA,CAAA;AACA;AACA;AACA;AACA,EAAA,OAAA,YAAA,CAAA;AACA,CAAA;AACA;AACA;AACA,SAAA,iBAAA,GAAA;AACA,EAAA,MAAA,IAAA,GAAA,aAAA,EAAA,CAAA;AACA,EAAA,MAAA,QAAA,GAAA,IAAA,IAAA,WAAA,CAAA,IAAA,CAAA,CAAA;AACA;AACA,EAAA,IAAA,CAAA,QAAA,EAAA;AACA,IAAA,OAAA,SAAA,CAAA;AACA,GAAA;AACA;AACA,EAAA,MAAA,EAAA,GAAA,UAAA,CAAA,QAAA,CAAA,CAAA,EAAA,CAAA;AACA;AACA;AACA,EAAA,OAAA,EAAA,KAAA,YAAA,IAAA,EAAA,KAAA,UAAA,GAAA,QAAA,GAAA,SAAA,CAAA;AACA;;;;"}
1
+ {"version":3,"file":"reactrouter.js","sources":["../../src/reactrouter.tsx"],"sourcesContent":["import {\n WINDOW,\n browserTracingIntegration,\n startBrowserTracingNavigationSpan,\n startBrowserTracingPageLoadSpan,\n} from '@sentry/browser';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n getActiveSpan,\n getCurrentScope,\n getRootSpan,\n spanToJSON,\n} from '@sentry/core';\nimport type { Client, Integration, Span, TransactionSource } from '@sentry/types';\nimport hoistNonReactStatics from 'hoist-non-react-statics';\nimport * as React from 'react';\n\nimport type { Action, Location } 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\nexport type MatchPath = (pathname: string, props: string | string[] | any, parent?: Match | null) => Match | null; // eslint-disable-line @typescript-eslint/no-explicit-any\n\ninterface ReactRouterOptions {\n history: RouterHistory;\n routes?: RouteConfig[];\n matchPath?: MatchPath;\n}\n\n/**\n * A browser tracing integration that uses React Router v4 to instrument navigations.\n * Expects `history` (and optionally `routes` and `matchPath`) to be passed as options.\n */\nexport function reactRouterV4BrowserTracingIntegration(\n options: Parameters<typeof browserTracingIntegration>[0] & ReactRouterOptions,\n): Integration {\n const integration = browserTracingIntegration({\n ...options,\n instrumentPageLoad: false,\n instrumentNavigation: false,\n });\n\n const { history, routes, matchPath, instrumentPageLoad = true, instrumentNavigation = true } = options;\n\n return {\n ...integration,\n afterAllSetup(client) {\n integration.afterAllSetup(client);\n\n instrumentReactRouter(\n client,\n instrumentPageLoad,\n instrumentNavigation,\n history,\n 'reactrouter_v4',\n routes,\n matchPath,\n );\n },\n };\n}\n\n/**\n * A browser tracing integration that uses React Router v5 to instrument navigations.\n * Expects `history` (and optionally `routes` and `matchPath`) to be passed as options.\n */\nexport function reactRouterV5BrowserTracingIntegration(\n options: Parameters<typeof browserTracingIntegration>[0] & ReactRouterOptions,\n): Integration {\n const integration = browserTracingIntegration({\n ...options,\n instrumentPageLoad: false,\n instrumentNavigation: false,\n });\n\n const { history, routes, matchPath, instrumentPageLoad = true, instrumentNavigation = true } = options;\n\n return {\n ...integration,\n afterAllSetup(client) {\n integration.afterAllSetup(client);\n\n instrumentReactRouter(\n client,\n instrumentPageLoad,\n instrumentNavigation,\n history,\n 'reactrouter_v5',\n routes,\n matchPath,\n );\n },\n };\n}\n\nfunction instrumentReactRouter(\n client: Client,\n instrumentPageLoad: boolean,\n instrumentNavigation: boolean,\n history: RouterHistory,\n instrumentationName: string,\n allRoutes: RouteConfig[] = [],\n matchPath?: MatchPath,\n): void {\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 if (instrumentPageLoad) {\n const initPathName = getInitPathName();\n if (initPathName) {\n const [name, source] = normalizeTransactionName(initPathName);\n startBrowserTracingPageLoadSpan(client, {\n name,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'pageload',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: `auto.pageload.react.${instrumentationName}`,\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: source,\n },\n });\n }\n }\n\n if (instrumentNavigation && history.listen) {\n history.listen((location, action) => {\n if (action && (action === 'PUSH' || action === 'POP')) {\n const [name, source] = normalizeTransactionName(location.pathname);\n startBrowserTracingNavigationSpan(client, {\n name,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'navigation',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: `auto.navigation.react.${instrumentationName}`,\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: source,\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 (props && props.computedMatch && props.computedMatch.isExact) {\n const route = props.computedMatch.path;\n const activeRootSpan = getActiveRootSpan();\n\n getCurrentScope().setTransactionName(route);\n\n if (activeRootSpan) {\n activeRootSpan.updateName(route);\n activeRootSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, 'route');\n }\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\nfunction getActiveRootSpan(): Span | undefined {\n const span = getActiveSpan();\n const rootSpan = span && getRootSpan(span);\n\n if (!rootSpan) {\n return undefined;\n }\n\n const op = spanToJSON(rootSpan).op;\n\n // Only use this root span if it is a pageload or navigation span\n return op === 'navigation' || op === 'pageload' ? rootSpan : undefined;\n}\n"],"names":["_jsx"],"mappings":";;;;;;AAqBA;AACA;;AAwBA;AACA;AACA;AACA;AACO,SAAS,sCAAsC;AACtD,EAAE,OAAO;AACT,EAAe;AACf,EAAE,MAAM,WAAA,GAAc,yBAAyB,CAAC;AAChD,IAAI,GAAG,OAAO;AACd,IAAI,kBAAkB,EAAE,KAAK;AAC7B,IAAI,oBAAoB,EAAE,KAAK;AAC/B,GAAG,CAAC,CAAA;AACJ;AACA,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,kBAAmB,GAAE,IAAI,EAAE,oBAAA,GAAuB,IAAK,EAAA,GAAI,OAAO,CAAA;AACxG;AACA,EAAE,OAAO;AACT,IAAI,GAAG,WAAW;AAClB,IAAI,aAAa,CAAC,MAAM,EAAE;AAC1B,MAAM,WAAW,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;AACvC;AACA,MAAM,qBAAqB;AAC3B,QAAQ,MAAM;AACd,QAAQ,kBAAkB;AAC1B,QAAQ,oBAAoB;AAC5B,QAAQ,OAAO;AACf,QAAQ,gBAAgB;AACxB,QAAQ,MAAM;AACd,QAAQ,SAAS;AACjB,OAAO,CAAA;AACP,KAAK;AACL,GAAG,CAAA;AACH,CAAA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,sCAAsC;AACtD,EAAE,OAAO;AACT,EAAe;AACf,EAAE,MAAM,WAAA,GAAc,yBAAyB,CAAC;AAChD,IAAI,GAAG,OAAO;AACd,IAAI,kBAAkB,EAAE,KAAK;AAC7B,IAAI,oBAAoB,EAAE,KAAK;AAC/B,GAAG,CAAC,CAAA;AACJ;AACA,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,kBAAmB,GAAE,IAAI,EAAE,oBAAA,GAAuB,IAAK,EAAA,GAAI,OAAO,CAAA;AACxG;AACA,EAAE,OAAO;AACT,IAAI,GAAG,WAAW;AAClB,IAAI,aAAa,CAAC,MAAM,EAAE;AAC1B,MAAM,WAAW,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;AACvC;AACA,MAAM,qBAAqB;AAC3B,QAAQ,MAAM;AACd,QAAQ,kBAAkB;AAC1B,QAAQ,oBAAoB;AAC5B,QAAQ,OAAO;AACf,QAAQ,gBAAgB;AACxB,QAAQ,MAAM;AACd,QAAQ,SAAS;AACjB,OAAO,CAAA;AACP,KAAK;AACL,GAAG,CAAA;AACH,CAAA;AACA;AACA,SAAS,qBAAqB;AAC9B,EAAE,MAAM;AACR,EAAE,kBAAkB;AACpB,EAAE,oBAAoB;AACtB,EAAE,OAAO;AACT,EAAE,mBAAmB;AACrB,EAAE,SAAS,GAAkB,EAAE;AAC/B,EAAE,SAAS;AACX,EAAQ;AACR,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,IAAI,MAAA,IAAU,MAAM,CAAC,QAAQ,EAAE;AACnC,MAAM,OAAO,MAAM,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,IAAI,kBAAkB,EAAE;AAC1B,IAAI,MAAM,YAAA,GAAe,eAAe,EAAE,CAAA;AAC1C,IAAI,IAAI,YAAY,EAAE;AACtB,MAAM,MAAM,CAAC,IAAI,EAAE,MAAM,IAAI,wBAAwB,CAAC,YAAY,CAAC,CAAA;AACnE,MAAM,+BAA+B,CAAC,MAAM,EAAE;AAC9C,QAAQ,IAAI;AACZ,QAAQ,UAAU,EAAE;AACpB,UAAU,CAAC,4BAA4B,GAAG,UAAU;AACpD,UAAU,CAAC,gCAAgC,GAAG,CAAC,oBAAoB,EAAE,mBAAmB,CAAC,CAAA;AACA,UAAA,CAAA,gCAAA,GAAA,MAAA;AACA,SAAA;AACA,OAAA,CAAA,CAAA;AACA,KAAA;AACA,GAAA;AACA;AACA,EAAA,IAAA,oBAAA,IAAA,OAAA,CAAA,MAAA,EAAA;AACA,IAAA,OAAA,CAAA,MAAA,CAAA,CAAA,QAAA,EAAA,MAAA,KAAA;AACA,MAAA,IAAA,MAAA,KAAA,MAAA,KAAA,MAAA,IAAA,MAAA,KAAA,KAAA,CAAA,EAAA;AACA,QAAA,MAAA,CAAA,IAAA,EAAA,MAAA,CAAA,GAAA,wBAAA,CAAA,QAAA,CAAA,QAAA,CAAA,CAAA;AACA,QAAA,iCAAA,CAAA,MAAA,EAAA;AACA,UAAA,IAAA;AACA,UAAA,UAAA,EAAA;AACA,YAAA,CAAA,4BAAA,GAAA,YAAA;AACA,YAAA,CAAA,gCAAA,GAAA,CAAA,sBAAA,EAAA,mBAAA,CAAA,CAAA;AACA,YAAA,CAAA,gCAAA,GAAA,MAAA;AACA,WAAA;AACA,SAAA,CAAA,CAAA;AACA,OAAA;AACA,KAAA,CAAA,CAAA;AACA,GAAA;AACA,CAAA;AACA;AACA;AACA;AACA;AACA;AACA,SAAA,WAAA;AACA,EAAA,MAAA;AACA,EAAA,QAAA;AACA,EAAA,SAAA;AACA,EAAA,MAAA,GAAA,EAAA;AACA,EAAA;AACA,EAAA,MAAA,CAAA,IAAA,CAAA,KAAA,IAAA;AACA,IAAA,MAAA,KAAA,GAAA,KAAA,CAAA,IAAA;AACA,QAAA,SAAA,CAAA,QAAA,EAAA,KAAA,CAAA;AACA,QAAA,MAAA,CAAA,MAAA;AACA,UAAA,MAAA,CAAA,MAAA,CAAA,MAAA,GAAA,CAAA,CAAA,CAAA,KAAA;AACA,UAAA,gBAAA,CAAA,QAAA,CAAA,CAAA;AACA;AACA,IAAA,IAAA,KAAA,EAAA;AACA,MAAA,MAAA,CAAA,IAAA,CAAA,EAAA,KAAA,EAAA,KAAA,EAAA,CAAA,CAAA;AACA;AACA,MAAA,IAAA,KAAA,CAAA,MAAA,EAAA;AACA,QAAA,WAAA,CAAA,KAAA,CAAA,MAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,CAAA,CAAA;AACA,OAAA;AACA,KAAA;AACA;AACA,IAAA,OAAA,CAAA,CAAA,KAAA,CAAA;AACA,GAAA,CAAA,CAAA;AACA;AACA,EAAA,OAAA,MAAA,CAAA;AACA,CAAA;AACA;AACA,SAAA,gBAAA,CAAA,QAAA,EAAA;AACA,EAAA,OAAA,EAAA,IAAA,EAAA,GAAA,EAAA,GAAA,EAAA,GAAA,EAAA,MAAA,EAAA,EAAA,EAAA,OAAA,EAAA,QAAA,KAAA,GAAA,EAAA,CAAA;AACA,CAAA;AACA;AACA;AACA,SAAA,iBAAA,CAAA,KAAA,EAAA;AACA,EAAA,MAAA,oBAAA,GAAA,CAAA,KAAA,GAAA,WAAA,IAAA,CAAA,KAAA,GAAA,IAAA,CAAA;AACA;AACA,EAAA,MAAA,YAAA,GAAA,CAAA,KAAA,KAAA;AACA,IAAA,IAAA,KAAA,IAAA,KAAA,CAAA,aAAA,IAAA,KAAA,CAAA,aAAA,CAAA,OAAA,EAAA;AACA,MAAA,MAAA,KAAA,GAAA,KAAA,CAAA,aAAA,CAAA,IAAA,CAAA;AACA,MAAA,MAAA,cAAA,GAAA,iBAAA,EAAA,CAAA;AACA;AACA,MAAA,eAAA,EAAA,CAAA,kBAAA,CAAA,KAAA,CAAA,CAAA;AACA;AACA,MAAA,IAAA,cAAA,EAAA;AACA,QAAA,cAAA,CAAA,UAAA,CAAA,KAAA,CAAA,CAAA;AACA,QAAA,cAAA,CAAA,YAAA,CAAA,gCAAA,EAAA,OAAA,CAAA,CAAA;AACA,OAAA;AACA,KAAA;AACA;AACA;AACA;AACA;AACA,IAAA,OAAAA,GAAA,CAAA,KAAA,EAAA,EAAA,GAAA,KAAA,EAAA,EAAA,CAAA;AACA,GAAA,CAAA;AACA;AACA,EAAA,YAAA,CAAA,WAAA,GAAA,CAAA,YAAA,EAAA,oBAAA,CAAA,CAAA,CAAA,CAAA;AACA,EAAA,oBAAA,CAAA,YAAA,EAAA,KAAA,CAAA,CAAA;AACA;AACA;AACA;AACA,EAAA,OAAA,YAAA,CAAA;AACA,CAAA;AACA;AACA;AACA,SAAA,iBAAA,GAAA;AACA,EAAA,MAAA,IAAA,GAAA,aAAA,EAAA,CAAA;AACA,EAAA,MAAA,QAAA,GAAA,IAAA,IAAA,WAAA,CAAA,IAAA,CAAA,CAAA;AACA;AACA,EAAA,IAAA,CAAA,QAAA,EAAA;AACA,IAAA,OAAA,SAAA,CAAA;AACA,GAAA;AACA;AACA,EAAA,MAAA,EAAA,GAAA,UAAA,CAAA,QAAA,CAAA,CAAA,EAAA,CAAA;AACA;AACA;AACA,EAAA,OAAA,EAAA,KAAA,YAAA,IAAA,EAAA,KAAA,UAAA,GAAA,QAAA,GAAA,SAAA,CAAA;AACA;;;;"}
@@ -1,12 +1,11 @@
1
+ import { jsx } from 'react/jsx-runtime';
1
2
  import { browserTracingIntegration, WINDOW, startBrowserTracingPageLoadSpan, startBrowserTracingNavigationSpan } from '@sentry/browser';
2
3
  import { SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, getActiveSpan, getRootSpan, spanToJSON, getCurrentScope, getClient } from '@sentry/core';
3
4
  import { logger, getNumberOfUrlSegments } from '@sentry/utils';
4
5
  import hoistNonReactStatics from 'hoist-non-react-statics';
5
- import * as React from 'react';
6
+ import 'react';
6
7
  import { DEBUG_BUILD } from './debug-build.js';
7
8
 
8
- const _jsxFileName = "/home/runner/work/sentry-javascript/sentry-javascript/packages/react/src/reactrouterv6.tsx";// Inspired from Donnie McNeal's solution:
9
-
10
9
  let _useEffect;
11
10
  let _useLocation;
12
11
  let _useNavigationType;
@@ -233,7 +232,7 @@ function withSentryReactRouterV6Routing(Routes) {
233
232
 
234
233
  // @ts-expect-error Setting more specific React Component typing for `R` generic above
235
234
  // will break advanced type inference done by react router params
236
- return React.createElement(Routes, { ...props, __self: this, __source: {fileName: _jsxFileName, lineNumber: 278}} );
235
+ return jsx(Routes, { ...props,} );
237
236
  };
238
237
 
239
238
  hoistNonReactStatics(SentryRoutes, Routes);
@@ -288,7 +287,7 @@ function wrapUseRoutes(origUseRoutes) {
288
287
 
289
288
  // eslint-disable-next-line react/display-name
290
289
  return (routes, locationArg) => {
291
- return React.createElement(SentryRoutes, { routes: routes, locationArg: locationArg, __self: this, __source: {fileName: _jsxFileName, lineNumber: 335}} );
290
+ return jsx(SentryRoutes, { routes: routes, locationArg: locationArg,} );
292
291
  };
293
292
  }
294
293
 
@@ -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 {\n WINDOW,\n browserTracingIntegration,\n startBrowserTracingNavigationSpan,\n startBrowserTracingPageLoadSpan,\n} from '@sentry/browser';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n getActiveSpan,\n getClient,\n getCurrentScope,\n getRootSpan,\n spanToJSON,\n} from '@sentry/core';\nimport type { Client, Integration, Span, 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 _useEffect: UseEffect;\nlet _useLocation: UseLocation;\nlet _useNavigationType: UseNavigationType;\nlet _createRoutesFromChildren: CreateRoutesFromChildren;\nlet _matchRoutes: MatchRoutes;\nlet _stripBasename: boolean = false;\n\nconst CLIENTS_WITH_INSTRUMENT_NAVIGATION: Client[] = [];\n\ninterface ReactRouterOptions {\n useEffect: UseEffect;\n useLocation: UseLocation;\n useNavigationType: UseNavigationType;\n createRoutesFromChildren: CreateRoutesFromChildren;\n matchRoutes: MatchRoutes;\n stripBasename?: boolean;\n}\n\n/**\n * A browser tracing integration that uses React Router v6 to instrument navigations.\n * Expects `useEffect`, `useLocation`, `useNavigationType`, `createRoutesFromChildren` and `matchRoutes` to be passed as options.\n */\nexport function reactRouterV6BrowserTracingIntegration(\n options: Parameters<typeof browserTracingIntegration>[0] & ReactRouterOptions,\n): Integration {\n const integration = browserTracingIntegration({\n ...options,\n instrumentPageLoad: false,\n instrumentNavigation: false,\n });\n\n const {\n useEffect,\n useLocation,\n useNavigationType,\n createRoutesFromChildren,\n matchRoutes,\n stripBasename,\n instrumentPageLoad = true,\n instrumentNavigation = true,\n } = options;\n\n return {\n ...integration,\n setup() {\n _useEffect = useEffect;\n _useLocation = useLocation;\n _useNavigationType = useNavigationType;\n _matchRoutes = matchRoutes;\n _createRoutesFromChildren = createRoutesFromChildren;\n _stripBasename = stripBasename || false;\n },\n afterAllSetup(client) {\n integration.afterAllSetup(client);\n\n const initPathName = WINDOW && WINDOW.location && WINDOW.location.pathname;\n if (instrumentPageLoad && initPathName) {\n startBrowserTracingPageLoadSpan(client, {\n name: initPathName,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'url',\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'pageload',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.pageload.react.reactrouter_v6',\n },\n });\n }\n\n if (instrumentNavigation) {\n CLIENTS_WITH_INSTRUMENT_NAVIGATION.push(client);\n }\n },\n };\n}\n\n/**\n * Strip the basename from a pathname if exists.\n *\n * Vendored and modified from `react-router`\n * https://github.com/remix-run/react-router/blob/462bb712156a3f739d6139a0f14810b76b002df6/packages/router/utils.ts#L1038\n */\nfunction stripBasenameFromPathname(pathname: string, basename: string): string {\n if (!basename || basename === '/') {\n return pathname;\n }\n\n if (!pathname.toLowerCase().startsWith(basename.toLowerCase())) {\n return pathname;\n }\n\n // We want to leave trailing slash behavior in the user's control, so if they\n // specify a basename with a trailing slash, we should support it\n const startIndex = basename.endsWith('/') ? basename.length - 1 : basename.length;\n const nextChar = pathname.charAt(startIndex);\n if (nextChar && nextChar !== '/') {\n // pathname does not start with basename/\n return pathname;\n }\n\n return pathname.slice(startIndex) || '/';\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 [_stripBasename ? stripBasenameFromPathname(location.pathname, basename) : 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 [_stripBasename ? stripBasenameFromPathname(branch.pathname, basename) : 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 [(_stripBasename ? '' : basename) + newPath, 'route'];\n }\n return [(_stripBasename ? '' : basename) + pathBuilder, 'route'];\n }\n }\n }\n }\n }\n\n return [_stripBasename ? stripBasenameFromPathname(location.pathname, basename) : location.pathname, 'url'];\n}\n\nfunction updatePageloadTransaction(\n activeRootSpan: Span | undefined,\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 (branches) {\n const [name, source] = getNormalizedName(routes, location, branches, basename);\n\n getCurrentScope().setTransactionName(name);\n\n if (activeRootSpan) {\n activeRootSpan.updateName(name);\n activeRootSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, source);\n }\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 const client = getClient();\n if (!client || !CLIENTS_WITH_INSTRUMENT_NAVIGATION.includes(client)) {\n return;\n }\n\n if ((navigationType === 'PUSH' || navigationType === 'POP') && branches) {\n const [name, source] = getNormalizedName(routes, location, branches, basename);\n\n startBrowserTracingNavigationSpan(client, {\n name,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: source,\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'navigation',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.navigation.react.reactrouter_v6',\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 (!_useEffect || !_useLocation || !_useNavigationType || !_createRoutesFromChildren || !_matchRoutes) {\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}.`);\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(getActiveRootSpan(), 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) {\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(getActiveRootSpan(), 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 if (!_useEffect || !_useLocation || !_useNavigationType || !_matchRoutes) {\n DEBUG_BUILD &&\n logger.warn(\n 'reactRouterV6Instrumentation was unable to wrap the `createRouter` function because of one or more missing parameters.',\n );\n\n return createRouterFunction;\n }\n\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 const activeRootSpan = getActiveRootSpan();\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' && activeRootSpan) {\n updatePageloadTransaction(activeRootSpan, router.state.location, routes, undefined, basename);\n }\n\n router.subscribe((state: RouterState) => {\n const location = state.location;\n if (state.historyAction === 'PUSH' || state.historyAction === 'POP') {\n handleNavigation(location, routes, state.historyAction, undefined, basename);\n }\n });\n\n return router;\n };\n}\n\nfunction getActiveRootSpan(): Span | undefined {\n const span = getActiveSpan();\n const rootSpan = span ? getRootSpan(span) : undefined;\n\n if (!rootSpan) {\n return undefined;\n }\n\n const op = spanToJSON(rootSpan).op;\n\n // Only use this root span if it is a pageload or navigation span\n return op === 'navigation' || op === 'pageload' ? rootSpan : undefined;\n}\n"],"names":[],"mappings":";;;;;;;AAAA,MAAA,YAAA,GAAA,4FAAA,CAAA;;AA0CA,IAAI,UAAU,CAAA;AACd,IAAI,YAAY,CAAA;AAChB,IAAI,kBAAkB,CAAA;AACtB,IAAI,yBAAyB,CAAA;AAC7B,IAAI,YAAY,CAAA;AAChB,IAAI,cAAc,GAAY,KAAK,CAAA;AACnC;AACA,MAAM,kCAAkC,GAAa,EAAE,CAAA;;AAWvD;AACA;AACA;AACA;AACO,SAAS,sCAAsC;AACtD,EAAE,OAAO;AACT,EAAe;AACf,EAAE,MAAM,WAAA,GAAc,yBAAyB,CAAC;AAChD,IAAI,GAAG,OAAO;AACd,IAAI,kBAAkB,EAAE,KAAK;AAC7B,IAAI,oBAAoB,EAAE,KAAK;AAC/B,GAAG,CAAC,CAAA;AACJ;AACA,EAAE,MAAM;AACR,IAAI,SAAS;AACb,IAAI,WAAW;AACf,IAAI,iBAAiB;AACrB,IAAI,wBAAwB;AAC5B,IAAI,WAAW;AACf,IAAI,aAAa;AACjB,IAAI,kBAAA,GAAqB,IAAI;AAC7B,IAAI,oBAAA,GAAuB,IAAI;AAC/B,GAAE,GAAI,OAAO,CAAA;AACb;AACA,EAAE,OAAO;AACT,IAAI,GAAG,WAAW;AAClB,IAAI,KAAK,GAAG;AACZ,MAAM,UAAA,GAAa,SAAS,CAAA;AAC5B,MAAM,YAAA,GAAe,WAAW,CAAA;AAChC,MAAM,kBAAA,GAAqB,iBAAiB,CAAA;AAC5C,MAAM,YAAA,GAAe,WAAW,CAAA;AAChC,MAAM,yBAAA,GAA4B,wBAAwB,CAAA;AAC1D,MAAM,cAAe,GAAE,aAAc,IAAG,KAAK,CAAA;AAC7C,KAAK;AACL,IAAI,aAAa,CAAC,MAAM,EAAE;AAC1B,MAAM,WAAW,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;AACvC;AACA,MAAM,MAAM,YAAA,GAAe,MAAA,IAAU,MAAM,CAAC,QAAA,IAAY,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAA;AAChF,MAAM,IAAI,kBAAmB,IAAG,YAAY,EAAE;AAC9C,QAAQ,+BAA+B,CAAC,MAAM,EAAE;AAChD,UAAU,IAAI,EAAE,YAAY;AAC5B,UAAU,UAAU,EAAE;AACtB,YAAY,CAAC,gCAAgC,GAAG,KAAK;AACrD,YAAY,CAAC,4BAA4B,GAAG,UAAU;AACtD,YAAY,CAAC,gCAAgC,GAAG,oCAAoC;AACpF,WAAW;AACX,SAAS,CAAC,CAAA;AACV,OAAM;AACN;AACA,MAAM,IAAI,oBAAoB,EAAE;AAChC,QAAQ,kCAAkC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;AACvD,OAAM;AACN,KAAK;AACL,GAAG,CAAA;AACH,CAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,yBAAyB,CAAC,QAAQ,EAAU,QAAQ,EAAkB;AAC/E,EAAE,IAAI,CAAC,QAAA,IAAY,QAAS,KAAI,GAAG,EAAE;AACrC,IAAI,OAAO,QAAQ,CAAA;AACnB,GAAE;AACF;AACA,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,EAAE;AAClE,IAAI,OAAO,QAAQ,CAAA;AACnB,GAAE;AACF;AACA;AACA;AACA,EAAE,MAAM,UAAW,GAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAA,GAAI,QAAQ,CAAC,MAAO,GAAE,IAAI,QAAQ,CAAC,MAAM,CAAA;AACnF,EAAE,MAAM,WAAW,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;AAC9C,EAAE,IAAI,QAAA,IAAY,QAAS,KAAI,GAAG,EAAE;AACpC;AACA,IAAI,OAAO,QAAQ,CAAA;AACnB,GAAE;AACF;AACA,EAAE,OAAO,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAA,IAAK,GAAG,CAAA;AAC1C,CAAA;AACA;AACA,SAAS,iBAAiB;AAC1B,EAAE,MAAM;AACR,EAAE,QAAQ;AACV,EAAE,QAAQ;AACV,EAAE,QAAQ,GAAW,EAAE;AACvB,EAA+B;AAC/B,EAAE,IAAI,CAAC,MAAO,IAAG,MAAM,CAAC,MAAA,KAAW,CAAC,EAAE;AACtC,IAAI,OAAO,CAAC,cAAA,GAAiB,yBAAyB,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,IAAI,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;AAC/G,GAAE;AACF;AACA,EAAE,IAAI,WAAY,GAAE,EAAE,CAAA;AACtB,EAAE,IAAI,QAAQ,EAAE;AAChB;AACA,IAAI,KAAK,IAAI,CAAA,GAAI,CAAC,EAAE,CAAE,GAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC9C,MAAM,MAAM,MAAO,GAAE,QAAQ,CAAC,CAAC,CAAC,CAAA;AAChC,MAAM,MAAM,KAAA,GAAQ,MAAM,CAAC,KAAK,CAAA;AAChC,MAAM,IAAI,KAAK,EAAE;AACjB;AACA,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;AACzB,UAAU,OAAO,CAAC,cAAA,GAAiB,yBAAyB,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,IAAI,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;AACnH,SAAQ;AACR;AACA,QAAQ,MAAM,IAAA,GAAO,KAAK,CAAC,IAAI,CAAA;AAC/B,QAAQ,IAAI,IAAI,EAAE;AAClB,UAAU,MAAM,OAAA,GAAU,IAAI,CAAC,CAAC,CAAE,KAAI,GAAI,IAAG,WAAW,CAAC,WAAW,CAAC,MAAO,GAAE,CAAC,CAAA,KAAM,GAAA,GAAM,IAAA,GAAO,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA,CAAA;AACA,UAAA,WAAA,IAAA,OAAA,CAAA;AACA;AACA,UAAA,IAAA,QAAA,GAAA,MAAA,CAAA,QAAA,KAAA,QAAA,CAAA,QAAA,EAAA;AACA,YAAA;AACA;AACA;AACA;AACA,cAAA,sBAAA,CAAA,WAAA,CAAA,KAAA,sBAAA,CAAA,MAAA,CAAA,QAAA,CAAA;AACA;AACA,cAAA,WAAA,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA,KAAA,IAAA;AACA,cAAA;AACA,cAAA,OAAA,CAAA,CAAA,cAAA,GAAA,EAAA,GAAA,QAAA,IAAA,OAAA,EAAA,OAAA,CAAA,CAAA;AACA,aAAA;AACA,YAAA,OAAA,CAAA,CAAA,cAAA,GAAA,EAAA,GAAA,QAAA,IAAA,WAAA,EAAA,OAAA,CAAA,CAAA;AACA,WAAA;AACA,SAAA;AACA,OAAA;AACA,KAAA;AACA,GAAA;AACA;AACA,EAAA,OAAA,CAAA,cAAA,GAAA,yBAAA,CAAA,QAAA,CAAA,QAAA,EAAA,QAAA,CAAA,GAAA,QAAA,CAAA,QAAA,EAAA,KAAA,CAAA,CAAA;AACA,CAAA;AACA;AACA,SAAA,yBAAA;AACA,EAAA,cAAA;AACA,EAAA,QAAA;AACA,EAAA,MAAA;AACA,EAAA,OAAA;AACA,EAAA,QAAA;AACA,EAAA;AACA,EAAA,MAAA,QAAA,GAAA,KAAA,CAAA,OAAA,CAAA,OAAA,CAAA;AACA,MAAA,OAAA;AACA,OAAA,YAAA,CAAA,MAAA,EAAA,QAAA,EAAA,QAAA,CAAA,EAAA,CAAA;AACA;AACA,EAAA,IAAA,QAAA,EAAA;AACA,IAAA,MAAA,CAAA,IAAA,EAAA,MAAA,CAAA,GAAA,iBAAA,CAAA,MAAA,EAAA,QAAA,EAAA,QAAA,EAAA,QAAA,CAAA,CAAA;AACA;AACA,IAAA,eAAA,EAAA,CAAA,kBAAA,CAAA,IAAA,CAAA,CAAA;AACA;AACA,IAAA,IAAA,cAAA,EAAA;AACA,MAAA,cAAA,CAAA,UAAA,CAAA,IAAA,CAAA,CAAA;AACA,MAAA,cAAA,CAAA,YAAA,CAAA,gCAAA,EAAA,MAAA,CAAA,CAAA;AACA,KAAA;AACA,GAAA;AACA,CAAA;AACA;AACA,SAAA,gBAAA;AACA,EAAA,QAAA;AACA,EAAA,MAAA;AACA,EAAA,cAAA;AACA,EAAA,OAAA;AACA,EAAA,QAAA;AACA,EAAA;AACA,EAAA,MAAA,QAAA,GAAA,KAAA,CAAA,OAAA,CAAA,OAAA,CAAA,GAAA,OAAA,GAAA,YAAA,CAAA,MAAA,EAAA,QAAA,EAAA,QAAA,CAAA,CAAA;AACA;AACA,EAAA,MAAA,MAAA,GAAA,SAAA,EAAA,CAAA;AACA,EAAA,IAAA,CAAA,MAAA,IAAA,CAAA,kCAAA,CAAA,QAAA,CAAA,MAAA,CAAA,EAAA;AACA,IAAA,OAAA;AACA,GAAA;AACA;AACA,EAAA,IAAA,CAAA,cAAA,KAAA,MAAA,IAAA,cAAA,KAAA,KAAA,KAAA,QAAA,EAAA;AACA,IAAA,MAAA,CAAA,IAAA,EAAA,MAAA,CAAA,GAAA,iBAAA,CAAA,MAAA,EAAA,QAAA,EAAA,QAAA,EAAA,QAAA,CAAA,CAAA;AACA;AACA,IAAA,iCAAA,CAAA,MAAA,EAAA;AACA,MAAA,IAAA;AACA,MAAA,UAAA,EAAA;AACA,QAAA,CAAA,gCAAA,GAAA,MAAA;AACA,QAAA,CAAA,4BAAA,GAAA,YAAA;AACA,QAAA,CAAA,gCAAA,GAAA,sCAAA;AACA,OAAA;AACA,KAAA,CAAA,CAAA;AACA,GAAA;AACA,CAAA;AACA;AACA;AACA,SAAA,8BAAA,CAAA,MAAA,EAAA;AACA,EAAA,IAAA,CAAA,UAAA,IAAA,CAAA,YAAA,IAAA,CAAA,kBAAA,IAAA,CAAA,yBAAA,IAAA,CAAA,YAAA,EAAA;AACA,IAAA,WAAA;AACA,MAAA,MAAA,CAAA,IAAA,CAAA,CAAA;AACA,iBAAA,EAAA,UAAA,CAAA,eAAA,EAAA,YAAA,CAAA,qBAAA,EAAA,kBAAA,CAAA;AACA,gCAAA,EAAA,yBAAA,CAAA,eAAA,EAAA,YAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA;AACA,IAAA,OAAA,MAAA,CAAA;AACA,GAAA;AACA;AACA,EAAA,IAAA,iBAAA,GAAA,IAAA,CAAA;AACA;AACA,EAAA,MAAA,YAAA,GAAA,CAAA,KAAA,KAAA;AACA,IAAA,MAAA,QAAA,GAAA,YAAA,EAAA,CAAA;AACA,IAAA,MAAA,cAAA,GAAA,kBAAA,EAAA,CAAA;AACA;AACA,IAAA,UAAA;AACA,MAAA,MAAA;AACA,QAAA,MAAA,MAAA,GAAA,yBAAA,CAAA,KAAA,CAAA,QAAA,CAAA,EAAA;AACA;AACA,QAAA,IAAA,iBAAA,EAAA;AACA,UAAA,yBAAA,CAAA,iBAAA,EAAA,EAAA,QAAA,EAAA,MAAA,CAAA,CAAA;AACA,UAAA,iBAAA,GAAA,KAAA,CAAA;AACA,SAAA,MAAA;AACA,UAAA,gBAAA,CAAA,QAAA,EAAA,MAAA,EAAA,cAAA,CAAA,CAAA;AACA,SAAA;AACA,OAAA;AACA;AACA;AACA,MAAA,CAAA,QAAA,EAAA,cAAA,CAAA;AACA,KAAA,CAAA;AACA;AACA;AACA;AACA,IAAA,OAAA,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA,EAAA,GAAA,KAAA,EAAA,MAAA,EAAA,IAAA,EAAA,QAAA,EAAA,CAAA,QAAA,EAAA,YAAA,EAAA,UAAA,EAAA,GAAA,CAAA,CAAA,EAAA,CAAA;AACA,GAAA,CAAA;AACA;AACA,EAAA,oBAAA,CAAA,YAAA,EAAA,MAAA,CAAA,CAAA;AACA;AACA;AACA;AACA,EAAA,OAAA,YAAA,CAAA;AACA,CAAA;AACA;AACA,SAAA,aAAA,CAAA,aAAA,EAAA;AACA,EAAA,IAAA,CAAA,UAAA,IAAA,CAAA,YAAA,IAAA,CAAA,kBAAA,IAAA,CAAA,YAAA,EAAA;AACA,IAAA,WAAA;AACA,MAAA,MAAA,CAAA,IAAA;AACA,QAAA,wGAAA;AACA,OAAA,CAAA;AACA;AACA,IAAA,OAAA,aAAA,CAAA;AACA,GAAA;AACA;AACA,EAAA,IAAA,iBAAA,GAAA,IAAA,CAAA;AACA;AACA,EAAA,MAAA,YAAA;;AAIA,GAAA,CAAA,KAAA,KAAA;AACA,IAAA,MAAA,EAAA,MAAA,EAAA,WAAA,EAAA,GAAA,KAAA,CAAA;AACA;AACA,IAAA,MAAA,MAAA,GAAA,aAAA,CAAA,MAAA,EAAA,WAAA,CAAA,CAAA;AACA;AACA,IAAA,MAAA,QAAA,GAAA,YAAA,EAAA,CAAA;AACA,IAAA,MAAA,cAAA,GAAA,kBAAA,EAAA,CAAA;AACA;AACA;AACA,IAAA,MAAA,mBAAA;AACA,MAAA,OAAA,WAAA,KAAA,QAAA,KAAA,WAAA,IAAA,WAAA,CAAA,QAAA,CAAA;AACA,WAAA,WAAA;AACA,UAAA,QAAA,CAAA;AACA;AACA,IAAA,UAAA,CAAA,MAAA;AACA,MAAA,MAAA,kBAAA;AACA,QAAA,OAAA,mBAAA,KAAA,QAAA,GAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,GAAA,mBAAA,CAAA;AACA;AACA,MAAA,IAAA,iBAAA,EAAA;AACA,QAAA,yBAAA,CAAA,iBAAA,EAAA,EAAA,kBAAA,EAAA,MAAA,CAAA,CAAA;AACA,QAAA,iBAAA,GAAA,KAAA,CAAA;AACA,OAAA,MAAA;AACA,QAAA,gBAAA,CAAA,kBAAA,EAAA,MAAA,EAAA,cAAA,CAAA,CAAA;AACA,OAAA;AACA,KAAA,EAAA,CAAA,cAAA,EAAA,mBAAA,CAAA,CAAA,CAAA;AACA;AACA,IAAA,OAAA,MAAA,CAAA;AACA,GAAA,CAAA;AACA;AACA;AACA,EAAA,OAAA,CAAA,MAAA,EAAA,WAAA,KAAA;AACA,IAAA,OAAA,KAAA,CAAA,aAAA,CAAA,YAAA,EAAA,EAAA,MAAA,EAAA,MAAA,EAAA,WAAA,EAAA,WAAA,EAAA,MAAA,EAAA,IAAA,EAAA,QAAA,EAAA,CAAA,QAAA,EAAA,YAAA,EAAA,UAAA,EAAA,GAAA,CAAA,CAAA,EAAA,CAAA;AACA,GAAA,CAAA;AACA,CAAA;AACA;AACA,SAAA,uBAAA;;AAGA,CAAA,oBAAA,EAAA;AACA,EAAA,IAAA,CAAA,UAAA,IAAA,CAAA,YAAA,IAAA,CAAA,kBAAA,IAAA,CAAA,YAAA,EAAA;AACA,IAAA,WAAA;AACA,MAAA,MAAA,CAAA,IAAA;AACA,QAAA,wHAAA;AACA,OAAA,CAAA;AACA;AACA,IAAA,OAAA,oBAAA,CAAA;AACA,GAAA;AACA;AACA;AACA;AACA;AACA,EAAA,OAAA,UAAA,MAAA,EAAA,IAAA,EAAA;AACA,IAAA,MAAA,MAAA,GAAA,oBAAA,CAAA,MAAA,EAAA,IAAA,CAAA,CAAA;AACA,IAAA,MAAA,QAAA,GAAA,IAAA,IAAA,IAAA,CAAA,QAAA,CAAA;AACA;AACA,IAAA,MAAA,cAAA,GAAA,iBAAA,EAAA,CAAA;AACA;AACA;AACA;AACA;AACA,IAAA,IAAA,MAAA,CAAA,KAAA,CAAA,aAAA,KAAA,KAAA,IAAA,cAAA,EAAA;AACA,MAAA,yBAAA,CAAA,cAAA,EAAA,MAAA,CAAA,KAAA,CAAA,QAAA,EAAA,MAAA,EAAA,SAAA,EAAA,QAAA,CAAA,CAAA;AACA,KAAA;AACA;AACA,IAAA,MAAA,CAAA,SAAA,CAAA,CAAA,KAAA,KAAA;AACA,MAAA,MAAA,QAAA,GAAA,KAAA,CAAA,QAAA,CAAA;AACA,MAAA,IAAA,KAAA,CAAA,aAAA,KAAA,MAAA,IAAA,KAAA,CAAA,aAAA,KAAA,KAAA,EAAA;AACA,QAAA,gBAAA,CAAA,QAAA,EAAA,MAAA,EAAA,KAAA,CAAA,aAAA,EAAA,SAAA,EAAA,QAAA,CAAA,CAAA;AACA,OAAA;AACA,KAAA,CAAA,CAAA;AACA;AACA,IAAA,OAAA,MAAA,CAAA;AACA,GAAA,CAAA;AACA,CAAA;AACA;AACA,SAAA,iBAAA,GAAA;AACA,EAAA,MAAA,IAAA,GAAA,aAAA,EAAA,CAAA;AACA,EAAA,MAAA,QAAA,GAAA,IAAA,GAAA,WAAA,CAAA,IAAA,CAAA,GAAA,SAAA,CAAA;AACA;AACA,EAAA,IAAA,CAAA,QAAA,EAAA;AACA,IAAA,OAAA,SAAA,CAAA;AACA,GAAA;AACA;AACA,EAAA,MAAA,EAAA,GAAA,UAAA,CAAA,QAAA,CAAA,CAAA,EAAA,CAAA;AACA;AACA;AACA,EAAA,OAAA,EAAA,KAAA,YAAA,IAAA,EAAA,KAAA,UAAA,GAAA,QAAA,GAAA,SAAA,CAAA;AACA;;;;"}
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 {\n WINDOW,\n browserTracingIntegration,\n startBrowserTracingNavigationSpan,\n startBrowserTracingPageLoadSpan,\n} from '@sentry/browser';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n getActiveSpan,\n getClient,\n getCurrentScope,\n getRootSpan,\n spanToJSON,\n} from '@sentry/core';\nimport type { Client, Integration, Span, 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 _useEffect: UseEffect;\nlet _useLocation: UseLocation;\nlet _useNavigationType: UseNavigationType;\nlet _createRoutesFromChildren: CreateRoutesFromChildren;\nlet _matchRoutes: MatchRoutes;\nlet _stripBasename: boolean = false;\n\nconst CLIENTS_WITH_INSTRUMENT_NAVIGATION: Client[] = [];\n\ninterface ReactRouterOptions {\n useEffect: UseEffect;\n useLocation: UseLocation;\n useNavigationType: UseNavigationType;\n createRoutesFromChildren: CreateRoutesFromChildren;\n matchRoutes: MatchRoutes;\n stripBasename?: boolean;\n}\n\n/**\n * A browser tracing integration that uses React Router v6 to instrument navigations.\n * Expects `useEffect`, `useLocation`, `useNavigationType`, `createRoutesFromChildren` and `matchRoutes` to be passed as options.\n */\nexport function reactRouterV6BrowserTracingIntegration(\n options: Parameters<typeof browserTracingIntegration>[0] & ReactRouterOptions,\n): Integration {\n const integration = browserTracingIntegration({\n ...options,\n instrumentPageLoad: false,\n instrumentNavigation: false,\n });\n\n const {\n useEffect,\n useLocation,\n useNavigationType,\n createRoutesFromChildren,\n matchRoutes,\n stripBasename,\n instrumentPageLoad = true,\n instrumentNavigation = true,\n } = options;\n\n return {\n ...integration,\n setup() {\n _useEffect = useEffect;\n _useLocation = useLocation;\n _useNavigationType = useNavigationType;\n _matchRoutes = matchRoutes;\n _createRoutesFromChildren = createRoutesFromChildren;\n _stripBasename = stripBasename || false;\n },\n afterAllSetup(client) {\n integration.afterAllSetup(client);\n\n const initPathName = WINDOW && WINDOW.location && WINDOW.location.pathname;\n if (instrumentPageLoad && initPathName) {\n startBrowserTracingPageLoadSpan(client, {\n name: initPathName,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'url',\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'pageload',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.pageload.react.reactrouter_v6',\n },\n });\n }\n\n if (instrumentNavigation) {\n CLIENTS_WITH_INSTRUMENT_NAVIGATION.push(client);\n }\n },\n };\n}\n\n/**\n * Strip the basename from a pathname if exists.\n *\n * Vendored and modified from `react-router`\n * https://github.com/remix-run/react-router/blob/462bb712156a3f739d6139a0f14810b76b002df6/packages/router/utils.ts#L1038\n */\nfunction stripBasenameFromPathname(pathname: string, basename: string): string {\n if (!basename || basename === '/') {\n return pathname;\n }\n\n if (!pathname.toLowerCase().startsWith(basename.toLowerCase())) {\n return pathname;\n }\n\n // We want to leave trailing slash behavior in the user's control, so if they\n // specify a basename with a trailing slash, we should support it\n const startIndex = basename.endsWith('/') ? basename.length - 1 : basename.length;\n const nextChar = pathname.charAt(startIndex);\n if (nextChar && nextChar !== '/') {\n // pathname does not start with basename/\n return pathname;\n }\n\n return pathname.slice(startIndex) || '/';\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 [_stripBasename ? stripBasenameFromPathname(location.pathname, basename) : 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 [_stripBasename ? stripBasenameFromPathname(branch.pathname, basename) : 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 [(_stripBasename ? '' : basename) + newPath, 'route'];\n }\n return [(_stripBasename ? '' : basename) + pathBuilder, 'route'];\n }\n }\n }\n }\n }\n\n return [_stripBasename ? stripBasenameFromPathname(location.pathname, basename) : location.pathname, 'url'];\n}\n\nfunction updatePageloadTransaction(\n activeRootSpan: Span | undefined,\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 (branches) {\n const [name, source] = getNormalizedName(routes, location, branches, basename);\n\n getCurrentScope().setTransactionName(name);\n\n if (activeRootSpan) {\n activeRootSpan.updateName(name);\n activeRootSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, source);\n }\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 const client = getClient();\n if (!client || !CLIENTS_WITH_INSTRUMENT_NAVIGATION.includes(client)) {\n return;\n }\n\n if ((navigationType === 'PUSH' || navigationType === 'POP') && branches) {\n const [name, source] = getNormalizedName(routes, location, branches, basename);\n\n startBrowserTracingNavigationSpan(client, {\n name,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: source,\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'navigation',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.navigation.react.reactrouter_v6',\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 (!_useEffect || !_useLocation || !_useNavigationType || !_createRoutesFromChildren || !_matchRoutes) {\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}.`);\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(getActiveRootSpan(), 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) {\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(getActiveRootSpan(), 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 if (!_useEffect || !_useLocation || !_useNavigationType || !_matchRoutes) {\n DEBUG_BUILD &&\n logger.warn(\n 'reactRouterV6Instrumentation was unable to wrap the `createRouter` function because of one or more missing parameters.',\n );\n\n return createRouterFunction;\n }\n\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 const activeRootSpan = getActiveRootSpan();\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' && activeRootSpan) {\n updatePageloadTransaction(activeRootSpan, router.state.location, routes, undefined, basename);\n }\n\n router.subscribe((state: RouterState) => {\n const location = state.location;\n if (state.historyAction === 'PUSH' || state.historyAction === 'POP') {\n handleNavigation(location, routes, state.historyAction, undefined, basename);\n }\n });\n\n return router;\n };\n}\n\nfunction getActiveRootSpan(): Span | undefined {\n const span = getActiveSpan();\n const rootSpan = span ? getRootSpan(span) : undefined;\n\n if (!rootSpan) {\n return undefined;\n }\n\n const op = spanToJSON(rootSpan).op;\n\n // Only use this root span if it is a pageload or navigation span\n return op === 'navigation' || op === 'pageload' ? rootSpan : undefined;\n}\n"],"names":["_jsx"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sentry/react",
3
- "version": "8.3.0",
3
+ "version": "8.5.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",
@@ -42,14 +42,14 @@
42
42
  "access": "public"
43
43
  },
44
44
  "dependencies": {
45
- "@sentry/browser": "8.3.0",
46
- "@sentry/core": "8.3.0",
47
- "@sentry/types": "8.3.0",
48
- "@sentry/utils": "8.3.0",
45
+ "@sentry/browser": "8.5.0",
46
+ "@sentry/core": "8.5.0",
47
+ "@sentry/types": "8.5.0",
48
+ "@sentry/utils": "8.5.0",
49
49
  "hoist-non-react-statics": "^3.3.2"
50
50
  },
51
51
  "peerDependencies": {
52
- "react": "16.x || 17.x || 18.x"
52
+ "react": "^16.14.0 || 17.x || 18.x || 19.x"
53
53
  },
54
54
  "devDependencies": {
55
55
  "@testing-library/react": "^13.0.0",