@sentry/react 7.66.0-alpha.0 → 7.66.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/cjs/profiler.js CHANGED
@@ -61,6 +61,7 @@ class Profiler extends React__namespace.Component {
61
61
  this._mountSpan = activeTransaction.startChild({
62
62
  description: `<${name}>`,
63
63
  op: constants.REACT_MOUNT_OP,
64
+ origin: 'auto.ui.react.profiler',
64
65
  });
65
66
  }
66
67
  }
@@ -88,6 +89,7 @@ class Profiler extends React__namespace.Component {
88
89
  },
89
90
  description: `<${this.props.name}>`,
90
91
  op: constants.REACT_UPDATE_OP,
92
+ origin: 'auto.ui.react.profiler',
91
93
  startTimestamp: now,
92
94
  });
93
95
  }
@@ -115,6 +117,7 @@ class Profiler extends React__namespace.Component {
115
117
  description: `<${name}>`,
116
118
  endTimestamp: utils.timestampInSeconds(),
117
119
  op: constants.REACT_RENDER_OP,
120
+ origin: 'auto.ui.react.profiler',
118
121
  startTimestamp: this._mountSpan.endTimestamp,
119
122
  });
120
123
  }
@@ -142,8 +145,8 @@ function withProfiler(
142
145
  (options && options.name) || WrappedComponent.displayName || WrappedComponent.name || UNKNOWN_COMPONENT;
143
146
 
144
147
  const Wrapped = (props) => (
145
- React__namespace.createElement(Profiler, { ...options, name: componentDisplayName, updateProps: props, __self: this, __source: {fileName: _jsxFileName, lineNumber: 146}}
146
- , React__namespace.createElement(WrappedComponent, { ...props, __self: this, __source: {fileName: _jsxFileName, lineNumber: 147}} )
148
+ React__namespace.createElement(Profiler, { ...options, name: componentDisplayName, updateProps: props, __self: this, __source: {fileName: _jsxFileName, lineNumber: 149}}
149
+ , React__namespace.createElement(WrappedComponent, { ...props, __self: this, __source: {fileName: _jsxFileName, lineNumber: 150}} )
147
150
  )
148
151
  );
149
152
 
@@ -179,6 +182,7 @@ function useProfiler(
179
182
  return activeTransaction.startChild({
180
183
  description: `<${name}>`,
181
184
  op: constants.REACT_MOUNT_OP,
185
+ origin: 'auto.ui.react.profiler',
182
186
  });
183
187
  }
184
188
 
@@ -196,6 +200,7 @@ function useProfiler(
196
200
  description: `<${name}>`,
197
201
  endTimestamp: utils.timestampInSeconds(),
198
202
  op: constants.REACT_RENDER_OP,
203
+ origin: 'auto.ui.react.profiler',
199
204
  startTimestamp: mountSpan.endTimestamp,
200
205
  });
201
206
  }
@@ -1 +1 @@
1
- {"version":3,"file":"profiler.js","sources":["../../src/profiler.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { Hub } from '@sentry/browser';\nimport { getCurrentHub } from '@sentry/browser';\nimport type { Span, Transaction } from '@sentry/types';\nimport { timestampInSeconds } from '@sentry/utils';\nimport hoistNonReactStatics from 'hoist-non-react-statics';\nimport * as React from 'react';\n\nimport { REACT_MOUNT_OP, REACT_RENDER_OP, REACT_UPDATE_OP } from './constants';\n\nexport const UNKNOWN_COMPONENT = 'unknown';\n\nexport type ProfilerProps = {\n // The name of the component being profiled.\n name: string;\n // If the Profiler is disabled. False by default. This is useful if you want to disable profilers\n // in certain environments.\n disabled?: boolean;\n // If time component is on page should be displayed as spans. True by default.\n includeRender?: boolean;\n // If component updates should be displayed as spans. True by default.\n includeUpdates?: boolean;\n // Component that is being profiled.\n children?: React.ReactNode;\n // props given to component being profiled.\n updateProps: { [key: string]: unknown };\n};\n\n/**\n * The Profiler component leverages Sentry's Tracing integration to generate\n * spans based on component lifecycles.\n */\nclass Profiler extends React.Component<ProfilerProps> {\n /**\n * The span of the mount activity\n * Made protected for the React Native SDK to access\n */\n protected _mountSpan: Span | undefined;\n /**\n * The span that represents the duration of time between shouldComponentUpdate and componentDidUpdate\n */\n protected _updateSpan: Span | undefined;\n\n // eslint-disable-next-line @typescript-eslint/member-ordering\n public static defaultProps: Partial<ProfilerProps> = {\n disabled: false,\n includeRender: true,\n includeUpdates: true,\n };\n\n public constructor(props: ProfilerProps) {\n super(props);\n const { name, disabled = false } = this.props;\n\n if (disabled) {\n return;\n }\n\n const activeTransaction = getActiveTransaction();\n if (activeTransaction) {\n this._mountSpan = activeTransaction.startChild({\n description: `<${name}>`,\n op: REACT_MOUNT_OP,\n });\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.finish();\n }\n }\n\n public shouldComponentUpdate({ updateProps, includeUpdates = true }: ProfilerProps): boolean {\n // Only generate an update span if includeUpdates is true, if there is a valid mountSpan,\n // and if the updateProps have changed. It is ok to not do a deep equality check here as it is expensive.\n // We are just trying to give baseline clues for further investigation.\n if (includeUpdates && this._mountSpan && updateProps !== this.props.updateProps) {\n // See what props haved changed between the previous props, and the current props. This is\n // set as data on the span. We just store the prop keys as the values could be potenially very large.\n const changedProps = Object.keys(updateProps).filter(k => updateProps[k] !== this.props.updateProps[k]);\n if (changedProps.length > 0) {\n const now = timestampInSeconds();\n this._updateSpan = this._mountSpan.startChild({\n data: {\n changedProps,\n },\n description: `<${this.props.name}>`,\n op: REACT_UPDATE_OP,\n startTimestamp: now,\n });\n }\n }\n\n return true;\n }\n\n public componentDidUpdate(): void {\n if (this._updateSpan) {\n this._updateSpan.finish();\n this._updateSpan = undefined;\n }\n }\n\n // If a component is unmounted, we can say it is no longer on the screen.\n // This means we can finish the span representing the component render.\n public componentWillUnmount(): void {\n const { name, includeRender = true } = this.props;\n\n if (this._mountSpan && includeRender) {\n // If we were able to obtain the spanId of the mount activity, we should set the\n // next activity as a child to the component mount activity.\n this._mountSpan.startChild({\n description: `<${name}>`,\n endTimestamp: timestampInSeconds(),\n op: REACT_RENDER_OP,\n startTimestamp: this._mountSpan.endTimestamp,\n });\n }\n }\n\n public render(): React.ReactNode {\n return this.props.children;\n }\n}\n\n/**\n * withProfiler is a higher order component that wraps a\n * component in a {@link Profiler} component. It is recommended that\n * the higher order component be used over the regular {@link Profiler} component.\n *\n * @param WrappedComponent component that is wrapped by Profiler\n * @param options the {@link ProfilerProps} you can pass into the Profiler\n */\nfunction withProfiler<P extends Record<string, any>>(\n WrappedComponent: React.ComponentType<P>,\n // We do not want to have `updateProps` given in options, it is instead filled through the HOC.\n options?: Pick<Partial<ProfilerProps>, Exclude<keyof ProfilerProps, 'updateProps' | 'children'>>,\n): React.FC<P> {\n const componentDisplayName =\n (options && options.name) || WrappedComponent.displayName || WrappedComponent.name || UNKNOWN_COMPONENT;\n\n const Wrapped: React.FC<P> = (props: P) => (\n <Profiler {...options} name={componentDisplayName} updateProps={props}>\n <WrappedComponent {...props} />\n </Profiler>\n );\n\n Wrapped.displayName = `profiler(${componentDisplayName})`;\n\n // Copy over static methods from Wrapped component to Profiler HOC\n // See: https://reactjs.org/docs/higher-order-components.html#static-methods-must-be-copied-over\n hoistNonReactStatics(Wrapped, WrappedComponent);\n return Wrapped;\n}\n\n/**\n *\n * `useProfiler` is a React hook that profiles a React component.\n *\n * Requires React 16.8 or above.\n * @param name displayName of component being profiled\n */\nfunction useProfiler(\n name: string,\n options: { disabled?: boolean; hasRenderSpan?: boolean } = {\n disabled: false,\n hasRenderSpan: true,\n },\n): void {\n const [mountSpan] = React.useState(() => {\n if (options && options.disabled) {\n return undefined;\n }\n\n const activeTransaction = getActiveTransaction();\n if (activeTransaction) {\n return activeTransaction.startChild({\n description: `<${name}>`,\n op: REACT_MOUNT_OP,\n });\n }\n\n return undefined;\n });\n\n React.useEffect(() => {\n if (mountSpan) {\n mountSpan.finish();\n }\n\n return (): void => {\n if (mountSpan && options.hasRenderSpan) {\n mountSpan.startChild({\n description: `<${name}>`,\n endTimestamp: timestampInSeconds(),\n op: REACT_RENDER_OP,\n startTimestamp: mountSpan.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\n/** Grabs active transaction off scope */\nexport function getActiveTransaction<T extends Transaction>(hub: Hub = getCurrentHub()): T | undefined {\n if (hub) {\n const scope = hub.getScope();\n if (scope) {\n return scope.getTransaction() as T | undefined;\n }\n }\n\n return undefined;\n}\n"],"names":["React","REACT_MOUNT_OP","timestampInSeconds","REACT_UPDATE_OP","REACT_RENDER_OP","hoistNonReactStatics","getCurrentHub"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,MAAA,YAAA,GAAA,uFAAA,CAAA;AAUA;AACA,MAAA,iBAAA,GAAA,UAAA;;AAkBA;AACA;AACA;AACA;AACA,MAAA,QAAA,SAAAA,gBAAA,CAAA,SAAA,CAAA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAGA;AACA,GAAA,OAAA,YAAA,GAAA,CAAA,IAAA,CAAA,YAAA,GAAA;AACA,IAAA,QAAA,EAAA,KAAA;AACA,IAAA,aAAA,EAAA,IAAA;AACA,IAAA,cAAA,EAAA,IAAA;AACA,IAAA,CAAA;AACA;AACA,GAAA,WAAA,CAAA,KAAA,EAAA;AACA,IAAA,KAAA,CAAA,KAAA,CAAA,CAAA;AACA,IAAA,MAAA,EAAA,IAAA,EAAA,QAAA,GAAA,KAAA,EAAA,GAAA,IAAA,CAAA,KAAA,CAAA;AACA;AACA,IAAA,IAAA,QAAA,EAAA;AACA,MAAA,OAAA;AACA,KAAA;AACA;AACA,IAAA,MAAA,iBAAA,GAAA,oBAAA,EAAA,CAAA;AACA,IAAA,IAAA,iBAAA,EAAA;AACA,MAAA,IAAA,CAAA,UAAA,GAAA,iBAAA,CAAA,UAAA,CAAA;AACA,QAAA,WAAA,EAAA,CAAA,CAAA,EAAA,IAAA,CAAA,CAAA,CAAA;AACA,QAAA,EAAA,EAAAC,wBAAA;AACA,OAAA,CAAA,CAAA;AACA,KAAA;AACA,GAAA;AACA;AACA;AACA,GAAA,iBAAA,GAAA;AACA,IAAA,IAAA,IAAA,CAAA,UAAA,EAAA;AACA,MAAA,IAAA,CAAA,UAAA,CAAA,MAAA,EAAA,CAAA;AACA,KAAA;AACA,GAAA;AACA;AACA,GAAA,qBAAA,CAAA,EAAA,WAAA,EAAA,cAAA,GAAA,IAAA,EAAA,EAAA;AACA;AACA;AACA;AACA,IAAA,IAAA,cAAA,IAAA,IAAA,CAAA,UAAA,IAAA,WAAA,KAAA,IAAA,CAAA,KAAA,CAAA,WAAA,EAAA;AACA;AACA;AACA,MAAA,MAAA,YAAA,GAAA,MAAA,CAAA,IAAA,CAAA,WAAA,CAAA,CAAA,MAAA,CAAA,CAAA,IAAA,WAAA,CAAA,CAAA,CAAA,KAAA,IAAA,CAAA,KAAA,CAAA,WAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,MAAA,IAAA,YAAA,CAAA,MAAA,GAAA,CAAA,EAAA;AACA,QAAA,MAAA,GAAA,GAAAC,wBAAA,EAAA,CAAA;AACA,QAAA,IAAA,CAAA,WAAA,GAAA,IAAA,CAAA,UAAA,CAAA,UAAA,CAAA;AACA,UAAA,IAAA,EAAA;AACA,YAAA,YAAA;AACA,WAAA;AACA,UAAA,WAAA,EAAA,CAAA,CAAA,EAAA,IAAA,CAAA,KAAA,CAAA,IAAA,CAAA,CAAA,CAAA;AACA,UAAA,EAAA,EAAAC,yBAAA;AACA,UAAA,cAAA,EAAA,GAAA;AACA,SAAA,CAAA,CAAA;AACA,OAAA;AACA,KAAA;AACA;AACA,IAAA,OAAA,IAAA,CAAA;AACA,GAAA;AACA;AACA,GAAA,kBAAA,GAAA;AACA,IAAA,IAAA,IAAA,CAAA,WAAA,EAAA;AACA,MAAA,IAAA,CAAA,WAAA,CAAA,MAAA,EAAA,CAAA;AACA,MAAA,IAAA,CAAA,WAAA,GAAA,SAAA,CAAA;AACA,KAAA;AACA,GAAA;AACA;AACA;AACA;AACA,GAAA,oBAAA,GAAA;AACA,IAAA,MAAA,EAAA,IAAA,EAAA,aAAA,GAAA,IAAA,EAAA,GAAA,IAAA,CAAA,KAAA,CAAA;AACA;AACA,IAAA,IAAA,IAAA,CAAA,UAAA,IAAA,aAAA,EAAA;AACA;AACA;AACA,MAAA,IAAA,CAAA,UAAA,CAAA,UAAA,CAAA;AACA,QAAA,WAAA,EAAA,CAAA,CAAA,EAAA,IAAA,CAAA,CAAA,CAAA;AACA,QAAA,YAAA,EAAAD,wBAAA,EAAA;AACA,QAAA,EAAA,EAAAE,yBAAA;AACA,QAAA,cAAA,EAAA,IAAA,CAAA,UAAA,CAAA,YAAA;AACA,OAAA,CAAA,CAAA;AACA,KAAA;AACA,GAAA;AACA;AACA,GAAA,MAAA,GAAA;AACA,IAAA,OAAA,IAAA,CAAA,KAAA,CAAA,QAAA,CAAA;AACA,GAAA;AACA,CAAA,CAAA,QAAA,CAAA,YAAA,EAAA,CAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAA,YAAA;AACA,EAAA,gBAAA;AACA;AACA,EAAA,OAAA;AACA,EAAA;AACA,EAAA,MAAA,oBAAA;AACA,IAAA,CAAA,OAAA,IAAA,OAAA,CAAA,IAAA,KAAA,gBAAA,CAAA,WAAA,IAAA,gBAAA,CAAA,IAAA,IAAA,iBAAA,CAAA;AACA;AACA,EAAA,MAAA,OAAA,GAAA,CAAA,KAAA;AACA,IAAAJ,gBAAA,CAAA,aAAA,CAAA,QAAA,EAAA,EAAA,GAAA,OAAA,EAAA,IAAA,EAAA,oBAAA,EAAA,WAAA,EAAA,KAAA,EAAA,MAAA,EAAA,IAAA,EAAA,QAAA,EAAA,CAAA,QAAA,EAAA,YAAA,EAAA,UAAA,EAAA,GAAA,CAAA,CAAA;AACA,QAAAA,gBAAA,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,EAAA,OAAA,CAAA,WAAA,GAAA,CAAA,SAAA,EAAA,oBAAA,CAAA,CAAA,CAAA,CAAA;AACA;AACA;AACA;AACA,EAAAK,6BAAA,CAAA,OAAA,EAAA,gBAAA,CAAA,CAAA;AACA,EAAA,OAAA,OAAA,CAAA;AACA,CAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAA,WAAA;AACA,EAAA,IAAA;AACA,EAAA,OAAA,GAAA;AACA,IAAA,QAAA,EAAA,KAAA;AACA,IAAA,aAAA,EAAA,IAAA;AACA,GAAA;AACA,EAAA;AACA,EAAA,MAAA,CAAA,SAAA,CAAA,GAAAL,gBAAA,CAAA,QAAA,CAAA,MAAA;AACA,IAAA,IAAA,OAAA,IAAA,OAAA,CAAA,QAAA,EAAA;AACA,MAAA,OAAA,SAAA,CAAA;AACA,KAAA;AACA;AACA,IAAA,MAAA,iBAAA,GAAA,oBAAA,EAAA,CAAA;AACA,IAAA,IAAA,iBAAA,EAAA;AACA,MAAA,OAAA,iBAAA,CAAA,UAAA,CAAA;AACA,QAAA,WAAA,EAAA,CAAA,CAAA,EAAA,IAAA,CAAA,CAAA,CAAA;AACA,QAAA,EAAA,EAAAC,wBAAA;AACA,OAAA,CAAA,CAAA;AACA,KAAA;AACA;AACA,IAAA,OAAA,SAAA,CAAA;AACA,GAAA,CAAA,CAAA;AACA;AACA,EAAAD,gBAAA,CAAA,SAAA,CAAA,MAAA;AACA,IAAA,IAAA,SAAA,EAAA;AACA,MAAA,SAAA,CAAA,MAAA,EAAA,CAAA;AACA,KAAA;AACA;AACA,IAAA,OAAA,MAAA;AACA,MAAA,IAAA,SAAA,IAAA,OAAA,CAAA,aAAA,EAAA;AACA,QAAA,SAAA,CAAA,UAAA,CAAA;AACA,UAAA,WAAA,EAAA,CAAA,CAAA,EAAA,IAAA,CAAA,CAAA,CAAA;AACA,UAAA,YAAA,EAAAE,wBAAA,EAAA;AACA,UAAA,EAAA,EAAAE,yBAAA;AACA,UAAA,cAAA,EAAA,SAAA,CAAA,YAAA;AACA,SAAA,CAAA,CAAA;AACA,OAAA;AACA,KAAA,CAAA;AACA;AACA;AACA,GAAA,EAAA,EAAA,CAAA,CAAA;AACA,CAAA;AAGA;AACA;AACA,SAAA,oBAAA,CAAA,GAAA,GAAAE,qBAAA,EAAA,EAAA;AACA,EAAA,IAAA,GAAA,EAAA;AACA,IAAA,MAAA,KAAA,GAAA,GAAA,CAAA,QAAA,EAAA,CAAA;AACA,IAAA,IAAA,KAAA,EAAA;AACA,MAAA,OAAA,KAAA,CAAA,cAAA,EAAA,EAAA;AACA,KAAA;AACA,GAAA;AACA;AACA,EAAA,OAAA,SAAA,CAAA;AACA;;;;;;;;"}
1
+ {"version":3,"file":"profiler.js","sources":["../../src/profiler.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { Hub } from '@sentry/browser';\nimport { getCurrentHub } from '@sentry/browser';\nimport type { Span, Transaction } from '@sentry/types';\nimport { timestampInSeconds } from '@sentry/utils';\nimport hoistNonReactStatics from 'hoist-non-react-statics';\nimport * as React from 'react';\n\nimport { REACT_MOUNT_OP, REACT_RENDER_OP, REACT_UPDATE_OP } from './constants';\n\nexport const UNKNOWN_COMPONENT = 'unknown';\n\nexport type ProfilerProps = {\n // The name of the component being profiled.\n name: string;\n // If the Profiler is disabled. False by default. This is useful if you want to disable profilers\n // in certain environments.\n disabled?: boolean;\n // If time component is on page should be displayed as spans. True by default.\n includeRender?: boolean;\n // If component updates should be displayed as spans. True by default.\n includeUpdates?: boolean;\n // Component that is being profiled.\n children?: React.ReactNode;\n // props given to component being profiled.\n updateProps: { [key: string]: unknown };\n};\n\n/**\n * The Profiler component leverages Sentry's Tracing integration to generate\n * spans based on component lifecycles.\n */\nclass Profiler extends React.Component<ProfilerProps> {\n /**\n * The span of the mount activity\n * Made protected for the React Native SDK to access\n */\n protected _mountSpan: Span | undefined;\n /**\n * The span that represents the duration of time between shouldComponentUpdate and componentDidUpdate\n */\n protected _updateSpan: Span | undefined;\n\n // eslint-disable-next-line @typescript-eslint/member-ordering\n public static defaultProps: Partial<ProfilerProps> = {\n disabled: false,\n includeRender: true,\n includeUpdates: true,\n };\n\n public constructor(props: ProfilerProps) {\n super(props);\n const { name, disabled = false } = this.props;\n\n if (disabled) {\n return;\n }\n\n const activeTransaction = getActiveTransaction();\n if (activeTransaction) {\n this._mountSpan = activeTransaction.startChild({\n description: `<${name}>`,\n op: REACT_MOUNT_OP,\n origin: 'auto.ui.react.profiler',\n });\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.finish();\n }\n }\n\n public shouldComponentUpdate({ updateProps, includeUpdates = true }: ProfilerProps): boolean {\n // Only generate an update span if includeUpdates is true, if there is a valid mountSpan,\n // and if the updateProps have changed. It is ok to not do a deep equality check here as it is expensive.\n // We are just trying to give baseline clues for further investigation.\n if (includeUpdates && this._mountSpan && updateProps !== this.props.updateProps) {\n // See what props haved changed between the previous props, and the current props. This is\n // set as data on the span. We just store the prop keys as the values could be potenially very large.\n const changedProps = Object.keys(updateProps).filter(k => updateProps[k] !== this.props.updateProps[k]);\n if (changedProps.length > 0) {\n const now = timestampInSeconds();\n this._updateSpan = this._mountSpan.startChild({\n data: {\n changedProps,\n },\n description: `<${this.props.name}>`,\n op: REACT_UPDATE_OP,\n origin: 'auto.ui.react.profiler',\n startTimestamp: now,\n });\n }\n }\n\n return true;\n }\n\n public componentDidUpdate(): void {\n if (this._updateSpan) {\n this._updateSpan.finish();\n this._updateSpan = undefined;\n }\n }\n\n // If a component is unmounted, we can say it is no longer on the screen.\n // This means we can finish the span representing the component render.\n public componentWillUnmount(): void {\n const { name, includeRender = true } = this.props;\n\n if (this._mountSpan && includeRender) {\n // If we were able to obtain the spanId of the mount activity, we should set the\n // next activity as a child to the component mount activity.\n this._mountSpan.startChild({\n description: `<${name}>`,\n endTimestamp: timestampInSeconds(),\n op: REACT_RENDER_OP,\n origin: 'auto.ui.react.profiler',\n startTimestamp: this._mountSpan.endTimestamp,\n });\n }\n }\n\n public render(): React.ReactNode {\n return this.props.children;\n }\n}\n\n/**\n * withProfiler is a higher order component that wraps a\n * component in a {@link Profiler} component. It is recommended that\n * the higher order component be used over the regular {@link Profiler} component.\n *\n * @param WrappedComponent component that is wrapped by Profiler\n * @param options the {@link ProfilerProps} you can pass into the Profiler\n */\nfunction withProfiler<P extends Record<string, any>>(\n WrappedComponent: React.ComponentType<P>,\n // We do not want to have `updateProps` given in options, it is instead filled through the HOC.\n options?: Pick<Partial<ProfilerProps>, Exclude<keyof ProfilerProps, 'updateProps' | 'children'>>,\n): React.FC<P> {\n const componentDisplayName =\n (options && options.name) || WrappedComponent.displayName || WrappedComponent.name || UNKNOWN_COMPONENT;\n\n const Wrapped: React.FC<P> = (props: P) => (\n <Profiler {...options} name={componentDisplayName} updateProps={props}>\n <WrappedComponent {...props} />\n </Profiler>\n );\n\n Wrapped.displayName = `profiler(${componentDisplayName})`;\n\n // Copy over static methods from Wrapped component to Profiler HOC\n // See: https://reactjs.org/docs/higher-order-components.html#static-methods-must-be-copied-over\n hoistNonReactStatics(Wrapped, WrappedComponent);\n return Wrapped;\n}\n\n/**\n *\n * `useProfiler` is a React hook that profiles a React component.\n *\n * Requires React 16.8 or above.\n * @param name displayName of component being profiled\n */\nfunction useProfiler(\n name: string,\n options: { disabled?: boolean; hasRenderSpan?: boolean } = {\n disabled: false,\n hasRenderSpan: true,\n },\n): void {\n const [mountSpan] = React.useState(() => {\n if (options && options.disabled) {\n return undefined;\n }\n\n const activeTransaction = getActiveTransaction();\n if (activeTransaction) {\n return activeTransaction.startChild({\n description: `<${name}>`,\n op: REACT_MOUNT_OP,\n origin: 'auto.ui.react.profiler',\n });\n }\n\n return undefined;\n });\n\n React.useEffect(() => {\n if (mountSpan) {\n mountSpan.finish();\n }\n\n return (): void => {\n if (mountSpan && options.hasRenderSpan) {\n mountSpan.startChild({\n description: `<${name}>`,\n endTimestamp: timestampInSeconds(),\n op: REACT_RENDER_OP,\n origin: 'auto.ui.react.profiler',\n startTimestamp: mountSpan.endTimestamp,\n });\n }\n };\n // We only want this to run once.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n}\n\nexport { withProfiler, Profiler, useProfiler };\n\n/** Grabs active transaction off scope */\nexport function getActiveTransaction<T extends Transaction>(hub: Hub = getCurrentHub()): T | undefined {\n if (hub) {\n const scope = hub.getScope();\n if (scope) {\n return scope.getTransaction() as T | undefined;\n }\n }\n\n return undefined;\n}\n"],"names":["React","REACT_MOUNT_OP","timestampInSeconds","REACT_UPDATE_OP","REACT_RENDER_OP","hoistNonReactStatics","getCurrentHub"],"mappings":"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"}
@@ -96,6 +96,7 @@ function createReactRouterInstrumentation(
96
96
  activeTransaction = customStartTransaction({
97
97
  name,
98
98
  op: 'pageload',
99
+ origin: 'auto.pageload.react.reactrouter',
99
100
  tags,
100
101
  metadata: {
101
102
  source,
@@ -114,6 +115,7 @@ function createReactRouterInstrumentation(
114
115
  activeTransaction = customStartTransaction({
115
116
  name,
116
117
  op: 'navigation',
118
+ origin: 'auto.navigation.react.reactrouter',
117
119
  tags,
118
120
  metadata: {
119
121
  source,
@@ -172,7 +174,7 @@ function withSentryRouting(Route) {
172
174
  // @ts-ignore Setting more specific React Component typing for `R` generic above
173
175
  // will break advanced type inference done by react router params:
174
176
  // https://github.com/DefinitelyTyped/DefinitelyTyped/blob/13dc4235c069e25fe7ee16e11f529d909f9f3ff8/types/react-router/index.d.ts#L154-L164
175
- return React__namespace.createElement(Route, { ...props, __self: this, __source: {fileName: _jsxFileName, lineNumber: 172}} );
177
+ return React__namespace.createElement(Route, { ...props, __self: this, __source: {fileName: _jsxFileName, lineNumber: 174}} );
176
178
  };
177
179
 
178
180
  WrappedRoute.displayName = `sentryRoute(${componentDisplayName})`;
@@ -1 +1 @@
1
- {"version":3,"file":"reactrouter.js","sources":["../../src/reactrouter.tsx"],"sourcesContent":["import { WINDOW } from '@sentry/browser';\nimport type { Transaction, TransactionSource } from '@sentry/types';\nimport hoistNonReactStatics from 'hoist-non-react-statics';\nimport * as React from 'react';\n\nimport type { Action, Location, ReactRouterInstrumentation } from './types';\n\n// We need to disable eslint no-explict-any because any is required for the\n// react-router typings.\ntype Match = { path: string; url: string; params: Record<string, any>; isExact: boolean }; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nexport type RouterHistory = {\n location?: Location;\n listen?(cb: (location: Location, action: Action) => void): void;\n} & Record<string, any>; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nexport type RouteConfig = {\n [propName: string]: unknown;\n path?: string | string[];\n exact?: boolean;\n component?: JSX.Element;\n routes?: RouteConfig[];\n};\n\ntype MatchPath = (pathname: string, props: string | string[] | any, parent?: Match | null) => Match | null; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nlet activeTransaction: Transaction | undefined;\n\nexport function reactRouterV4Instrumentation(\n history: RouterHistory,\n routes?: RouteConfig[],\n matchPath?: MatchPath,\n): ReactRouterInstrumentation {\n return createReactRouterInstrumentation(history, 'react-router-v4', routes, matchPath);\n}\n\nexport function reactRouterV5Instrumentation(\n history: RouterHistory,\n routes?: RouteConfig[],\n matchPath?: MatchPath,\n): ReactRouterInstrumentation {\n return createReactRouterInstrumentation(history, 'react-router-v5', routes, matchPath);\n}\n\nfunction createReactRouterInstrumentation(\n history: RouterHistory,\n name: string,\n allRoutes: RouteConfig[] = [],\n matchPath?: MatchPath,\n): ReactRouterInstrumentation {\n function getInitPathName(): string | undefined {\n if (history && history.location) {\n return history.location.pathname;\n }\n\n if (WINDOW && WINDOW.location) {\n return WINDOW.location.pathname;\n }\n\n return undefined;\n }\n\n /**\n * Normalizes a transaction name. Returns the new name as well as the\n * source of the transaction.\n *\n * @param pathname The initial pathname we normalize\n */\n function normalizeTransactionName(pathname: string): [string, TransactionSource] {\n if (allRoutes.length === 0 || !matchPath) {\n return [pathname, 'url'];\n }\n\n const branches = matchRoutes(allRoutes, pathname, matchPath);\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let x = 0; x < branches.length; x++) {\n if (branches[x].match.isExact) {\n return [branches[x].match.path, 'route'];\n }\n }\n\n return [pathname, 'url'];\n }\n\n const tags = {\n 'routing.instrumentation': name,\n };\n\n return (customStartTransaction, startTransactionOnPageLoad = true, startTransactionOnLocationChange = true): void => {\n const initPathName = getInitPathName();\n if (startTransactionOnPageLoad && initPathName) {\n const [name, source] = normalizeTransactionName(initPathName);\n activeTransaction = customStartTransaction({\n name,\n op: 'pageload',\n tags,\n metadata: {\n source,\n },\n });\n }\n\n if (startTransactionOnLocationChange && history.listen) {\n history.listen((location, action) => {\n if (action && (action === 'PUSH' || action === 'POP')) {\n if (activeTransaction) {\n activeTransaction.finish();\n }\n\n const [name, source] = normalizeTransactionName(location.pathname);\n activeTransaction = customStartTransaction({\n name,\n op: 'navigation',\n tags,\n metadata: {\n source,\n },\n });\n }\n });\n }\n };\n}\n\n/**\n * Matches a set of routes to a pathname\n * Based on implementation from\n */\nfunction matchRoutes(\n routes: RouteConfig[],\n pathname: string,\n matchPath: MatchPath,\n branch: Array<{ route: RouteConfig; match: Match }> = [],\n): Array<{ route: RouteConfig; match: Match }> {\n routes.some(route => {\n const match = route.path\n ? matchPath(pathname, route)\n : branch.length\n ? branch[branch.length - 1].match // use parent match\n : computeRootMatch(pathname); // use default \"root\" match\n\n if (match) {\n branch.push({ route, match });\n\n if (route.routes) {\n matchRoutes(route.routes, pathname, matchPath, branch);\n }\n }\n\n return !!match;\n });\n\n return branch;\n}\n\nfunction computeRootMatch(pathname: string): Match {\n return { path: '/', url: '/', params: {}, isExact: pathname === '/' };\n}\n\n/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access */\nexport function withSentryRouting<P extends Record<string, any>, R extends React.ComponentType<P>>(Route: R): R {\n const componentDisplayName = (Route as any).displayName || (Route as any).name;\n\n const WrappedRoute: React.FC<P> = (props: P) => {\n if (activeTransaction && props && props.computedMatch && props.computedMatch.isExact) {\n activeTransaction.setName(props.computedMatch.path, 'route');\n }\n\n // @ts-ignore 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-ignore Setting more specific React Component typing for `R` generic above\n // will break advanced type inference done by react router params:\n // https://github.com/DefinitelyTyped/DefinitelyTyped/blob/13dc4235c069e25fe7ee16e11f529d909f9f3ff8/types/react-router/index.d.ts#L154-L164\n return WrappedRoute;\n}\n/* eslint-enable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access */\n"],"names":["WINDOW","React","hoistNonReactStatics"],"mappings":"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"}
1
+ {"version":3,"file":"reactrouter.js","sources":["../../src/reactrouter.tsx"],"sourcesContent":["import { WINDOW } from '@sentry/browser';\nimport type { Transaction, TransactionSource } from '@sentry/types';\nimport hoistNonReactStatics from 'hoist-non-react-statics';\nimport * as React from 'react';\n\nimport type { Action, Location, ReactRouterInstrumentation } from './types';\n\n// We need to disable eslint no-explict-any because any is required for the\n// react-router typings.\ntype Match = { path: string; url: string; params: Record<string, any>; isExact: boolean }; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nexport type RouterHistory = {\n location?: Location;\n listen?(cb: (location: Location, action: Action) => void): void;\n} & Record<string, any>; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nexport type RouteConfig = {\n [propName: string]: unknown;\n path?: string | string[];\n exact?: boolean;\n component?: JSX.Element;\n routes?: RouteConfig[];\n};\n\ntype MatchPath = (pathname: string, props: string | string[] | any, parent?: Match | null) => Match | null; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nlet activeTransaction: Transaction | undefined;\n\nexport function reactRouterV4Instrumentation(\n history: RouterHistory,\n routes?: RouteConfig[],\n matchPath?: MatchPath,\n): ReactRouterInstrumentation {\n return createReactRouterInstrumentation(history, 'react-router-v4', routes, matchPath);\n}\n\nexport function reactRouterV5Instrumentation(\n history: RouterHistory,\n routes?: RouteConfig[],\n matchPath?: MatchPath,\n): ReactRouterInstrumentation {\n return createReactRouterInstrumentation(history, 'react-router-v5', routes, matchPath);\n}\n\nfunction createReactRouterInstrumentation(\n history: RouterHistory,\n name: string,\n allRoutes: RouteConfig[] = [],\n matchPath?: MatchPath,\n): ReactRouterInstrumentation {\n function getInitPathName(): string | undefined {\n if (history && history.location) {\n return history.location.pathname;\n }\n\n if (WINDOW && WINDOW.location) {\n return WINDOW.location.pathname;\n }\n\n return undefined;\n }\n\n /**\n * Normalizes a transaction name. Returns the new name as well as the\n * source of the transaction.\n *\n * @param pathname The initial pathname we normalize\n */\n function normalizeTransactionName(pathname: string): [string, TransactionSource] {\n if (allRoutes.length === 0 || !matchPath) {\n return [pathname, 'url'];\n }\n\n const branches = matchRoutes(allRoutes, pathname, matchPath);\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let x = 0; x < branches.length; x++) {\n if (branches[x].match.isExact) {\n return [branches[x].match.path, 'route'];\n }\n }\n\n return [pathname, 'url'];\n }\n\n const tags = {\n 'routing.instrumentation': name,\n };\n\n return (customStartTransaction, startTransactionOnPageLoad = true, startTransactionOnLocationChange = true): void => {\n const initPathName = getInitPathName();\n if (startTransactionOnPageLoad && initPathName) {\n const [name, source] = normalizeTransactionName(initPathName);\n activeTransaction = customStartTransaction({\n name,\n op: 'pageload',\n origin: 'auto.pageload.react.reactrouter',\n tags,\n metadata: {\n source,\n },\n });\n }\n\n if (startTransactionOnLocationChange && history.listen) {\n history.listen((location, action) => {\n if (action && (action === 'PUSH' || action === 'POP')) {\n if (activeTransaction) {\n activeTransaction.finish();\n }\n\n const [name, source] = normalizeTransactionName(location.pathname);\n activeTransaction = customStartTransaction({\n name,\n op: 'navigation',\n origin: 'auto.navigation.react.reactrouter',\n tags,\n metadata: {\n source,\n },\n });\n }\n });\n }\n };\n}\n\n/**\n * Matches a set of routes to a pathname\n * Based on implementation from\n */\nfunction matchRoutes(\n routes: RouteConfig[],\n pathname: string,\n matchPath: MatchPath,\n branch: Array<{ route: RouteConfig; match: Match }> = [],\n): Array<{ route: RouteConfig; match: Match }> {\n routes.some(route => {\n const match = route.path\n ? matchPath(pathname, route)\n : branch.length\n ? branch[branch.length - 1].match // use parent match\n : computeRootMatch(pathname); // use default \"root\" match\n\n if (match) {\n branch.push({ route, match });\n\n if (route.routes) {\n matchRoutes(route.routes, pathname, matchPath, branch);\n }\n }\n\n return !!match;\n });\n\n return branch;\n}\n\nfunction computeRootMatch(pathname: string): Match {\n return { path: '/', url: '/', params: {}, isExact: pathname === '/' };\n}\n\n/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access */\nexport function withSentryRouting<P extends Record<string, any>, R extends React.ComponentType<P>>(Route: R): R {\n const componentDisplayName = (Route as any).displayName || (Route as any).name;\n\n const WrappedRoute: React.FC<P> = (props: P) => {\n if (activeTransaction && props && props.computedMatch && props.computedMatch.isExact) {\n activeTransaction.setName(props.computedMatch.path, 'route');\n }\n\n // @ts-ignore 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-ignore Setting more specific React Component typing for `R` generic above\n // will break advanced type inference done by react router params:\n // https://github.com/DefinitelyTyped/DefinitelyTyped/blob/13dc4235c069e25fe7ee16e11f529d909f9f3ff8/types/react-router/index.d.ts#L154-L164\n return WrappedRoute;\n}\n/* eslint-enable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access */\n"],"names":["WINDOW","React","hoistNonReactStatics"],"mappings":"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"}
@@ -37,6 +37,7 @@ function reactRouterV3Instrumentation(
37
37
  activeTransaction = startTransaction({
38
38
  name: prevName,
39
39
  op: 'pageload',
40
+ origin: 'auto.pageload.react.reactrouterv3',
40
41
  tags: {
41
42
  'routing.instrumentation': 'react-router-v3',
42
43
  },
@@ -65,6 +66,7 @@ function reactRouterV3Instrumentation(
65
66
  activeTransaction = startTransaction({
66
67
  name: prevName,
67
68
  op: 'navigation',
69
+ origin: 'auto.navigation.react.reactrouterv3',
68
70
  tags,
69
71
  metadata: {
70
72
  source,
@@ -1 +1 @@
1
- {"version":3,"file":"reactrouterv3.js","sources":["../../src/reactrouterv3.ts"],"sourcesContent":["import { WINDOW } from '@sentry/browser';\nimport type { Primitive, Transaction, TransactionContext, TransactionSource } from '@sentry/types';\n\nimport type { Location, ReactRouterInstrumentation } from './types';\n\n// Many of the types below had to be mocked out to prevent typescript issues\n// these types are required for correct functionality.\n\ntype HistoryV3 = {\n location?: Location;\n listen?(cb: (location: Location) => void): void;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n} & Record<string, any>;\n\nexport type Route = { path?: string; childRoutes?: Route[] };\n\nexport type Match = (\n props: { location: Location; routes: Route[] },\n cb: (error?: Error, _redirectLocation?: Location, renderProps?: { routes?: Route[] }) => void,\n) => void;\n\ntype ReactRouterV3TransactionSource = Extract<TransactionSource, 'url' | 'route'>;\n\n/**\n * Creates routing instrumentation for React Router v3\n * Works for React Router >= 3.2.0 and < 4.0.0\n *\n * @param history object from the `history` library\n * @param routes a list of all routes, should be\n * @param match `Router.match` utility\n */\nexport function reactRouterV3Instrumentation(\n history: HistoryV3,\n routes: Route[],\n match: Match,\n): ReactRouterInstrumentation {\n return (\n startTransaction: (context: TransactionContext) => Transaction | undefined,\n startTransactionOnPageLoad: boolean = true,\n startTransactionOnLocationChange: boolean = true,\n ) => {\n let activeTransaction: Transaction | undefined;\n let prevName: string | undefined;\n\n // Have to use window.location because history.location might not be defined.\n if (startTransactionOnPageLoad && WINDOW && WINDOW.location) {\n normalizeTransactionName(\n routes,\n WINDOW.location as unknown as Location,\n match,\n (localName: string, source: ReactRouterV3TransactionSource = 'url') => {\n prevName = localName;\n activeTransaction = startTransaction({\n name: prevName,\n op: 'pageload',\n tags: {\n 'routing.instrumentation': 'react-router-v3',\n },\n metadata: {\n source,\n },\n });\n },\n );\n }\n\n if (startTransactionOnLocationChange && history.listen) {\n history.listen(location => {\n if (location.action === 'PUSH' || location.action === 'POP') {\n if (activeTransaction) {\n activeTransaction.finish();\n }\n const tags: Record<string, Primitive> = {\n 'routing.instrumentation': 'react-router-v3',\n };\n if (prevName) {\n tags.from = prevName;\n }\n normalizeTransactionName(routes, location, match, (localName: string, source: TransactionSource = 'url') => {\n prevName = localName;\n activeTransaction = startTransaction({\n name: prevName,\n op: 'navigation',\n tags,\n metadata: {\n source,\n },\n });\n });\n }\n });\n }\n };\n}\n\n/**\n * Normalize transaction names using `Router.match`\n */\nfunction normalizeTransactionName(\n appRoutes: Route[],\n location: Location,\n match: Match,\n callback: (pathname: string, source?: ReactRouterV3TransactionSource) => void,\n): void {\n let name = location.pathname;\n match(\n {\n location,\n routes: appRoutes,\n },\n (error, _redirectLocation, renderProps) => {\n if (error || !renderProps) {\n return callback(name);\n }\n\n const routePath = getRouteStringFromRoutes(renderProps.routes || []);\n if (routePath.length === 0 || routePath === '/*') {\n return callback(name);\n }\n\n name = routePath;\n return callback(name, 'route');\n },\n );\n}\n\n/**\n * Generate route name from array of routes\n */\nfunction getRouteStringFromRoutes(routes: Route[]): string {\n if (!Array.isArray(routes) || routes.length === 0) {\n return '';\n }\n\n const routesWithPaths: Route[] = routes.filter((route: Route) => !!route.path);\n\n let index = -1;\n for (let x = routesWithPaths.length - 1; x >= 0; x--) {\n const route = routesWithPaths[x];\n if (route.path && route.path.startsWith('/')) {\n index = x;\n break;\n }\n }\n\n return routesWithPaths\n .slice(index)\n .filter(({ path }) => !!path)\n .map(({ path }) => path)\n .join('');\n}\n"],"names":["WINDOW"],"mappings":"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"}
1
+ {"version":3,"file":"reactrouterv3.js","sources":["../../src/reactrouterv3.ts"],"sourcesContent":["import { WINDOW } from '@sentry/browser';\nimport type { Primitive, Transaction, TransactionContext, TransactionSource } from '@sentry/types';\n\nimport type { Location, ReactRouterInstrumentation } from './types';\n\n// Many of the types below had to be mocked out to prevent typescript issues\n// these types are required for correct functionality.\n\ntype HistoryV3 = {\n location?: Location;\n listen?(cb: (location: Location) => void): void;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n} & Record<string, any>;\n\nexport type Route = { path?: string; childRoutes?: Route[] };\n\nexport type Match = (\n props: { location: Location; routes: Route[] },\n cb: (error?: Error, _redirectLocation?: Location, renderProps?: { routes?: Route[] }) => void,\n) => void;\n\ntype ReactRouterV3TransactionSource = Extract<TransactionSource, 'url' | 'route'>;\n\n/**\n * Creates routing instrumentation for React Router v3\n * Works for React Router >= 3.2.0 and < 4.0.0\n *\n * @param history object from the `history` library\n * @param routes a list of all routes, should be\n * @param match `Router.match` utility\n */\nexport function reactRouterV3Instrumentation(\n history: HistoryV3,\n routes: Route[],\n match: Match,\n): ReactRouterInstrumentation {\n return (\n startTransaction: (context: TransactionContext) => Transaction | undefined,\n startTransactionOnPageLoad: boolean = true,\n startTransactionOnLocationChange: boolean = true,\n ) => {\n let activeTransaction: Transaction | undefined;\n let prevName: string | undefined;\n\n // Have to use window.location because history.location might not be defined.\n if (startTransactionOnPageLoad && WINDOW && WINDOW.location) {\n normalizeTransactionName(\n routes,\n WINDOW.location as unknown as Location,\n match,\n (localName: string, source: ReactRouterV3TransactionSource = 'url') => {\n prevName = localName;\n activeTransaction = startTransaction({\n name: prevName,\n op: 'pageload',\n origin: 'auto.pageload.react.reactrouterv3',\n tags: {\n 'routing.instrumentation': 'react-router-v3',\n },\n metadata: {\n source,\n },\n });\n },\n );\n }\n\n if (startTransactionOnLocationChange && history.listen) {\n history.listen(location => {\n if (location.action === 'PUSH' || location.action === 'POP') {\n if (activeTransaction) {\n activeTransaction.finish();\n }\n const tags: Record<string, Primitive> = {\n 'routing.instrumentation': 'react-router-v3',\n };\n if (prevName) {\n tags.from = prevName;\n }\n normalizeTransactionName(routes, location, match, (localName: string, source: TransactionSource = 'url') => {\n prevName = localName;\n activeTransaction = startTransaction({\n name: prevName,\n op: 'navigation',\n origin: 'auto.navigation.react.reactrouterv3',\n tags,\n metadata: {\n source,\n },\n });\n });\n }\n });\n }\n };\n}\n\n/**\n * Normalize transaction names using `Router.match`\n */\nfunction normalizeTransactionName(\n appRoutes: Route[],\n location: Location,\n match: Match,\n callback: (pathname: string, source?: ReactRouterV3TransactionSource) => void,\n): void {\n let name = location.pathname;\n match(\n {\n location,\n routes: appRoutes,\n },\n (error, _redirectLocation, renderProps) => {\n if (error || !renderProps) {\n return callback(name);\n }\n\n const routePath = getRouteStringFromRoutes(renderProps.routes || []);\n if (routePath.length === 0 || routePath === '/*') {\n return callback(name);\n }\n\n name = routePath;\n return callback(name, 'route');\n },\n );\n}\n\n/**\n * Generate route name from array of routes\n */\nfunction getRouteStringFromRoutes(routes: Route[]): string {\n if (!Array.isArray(routes) || routes.length === 0) {\n return '';\n }\n\n const routesWithPaths: Route[] = routes.filter((route: Route) => !!route.path);\n\n let index = -1;\n for (let x = routesWithPaths.length - 1; x >= 0; x--) {\n const route = routesWithPaths[x];\n if (route.path && route.path.startsWith('/')) {\n index = x;\n break;\n }\n }\n\n return routesWithPaths\n .slice(index)\n .filter(({ path }) => !!path)\n .map(({ path }) => path)\n .join('');\n}\n"],"names":["WINDOW"],"mappings":";;;;AAKA;AACA;;AAiBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAA,4BAAA;AACA,EAAA,OAAA;AACA,EAAA,MAAA;AACA,EAAA,KAAA;AACA,EAAA;AACA,EAAA,OAAA;AACA,IAAA,gBAAA;AACA,IAAA,0BAAA,GAAA,IAAA;AACA,IAAA,gCAAA,GAAA,IAAA;AACA,OAAA;AACA,IAAA,IAAA,iBAAA,CAAA;AACA,IAAA,IAAA,QAAA,CAAA;AACA;AACA;AACA,IAAA,IAAA,0BAAA,IAAAA,cAAA,IAAAA,cAAA,CAAA,QAAA,EAAA;AACA,MAAA,wBAAA;AACA,QAAA,MAAA;AACA,QAAAA,cAAA,CAAA,QAAA;AACA,QAAA,KAAA;AACA,QAAA,CAAA,SAAA,EAAA,MAAA,GAAA,KAAA,KAAA;AACA,UAAA,QAAA,GAAA,SAAA,CAAA;AACA,UAAA,iBAAA,GAAA,gBAAA,CAAA;AACA,YAAA,IAAA,EAAA,QAAA;AACA,YAAA,EAAA,EAAA,UAAA;AACA,YAAA,MAAA,EAAA,mCAAA;AACA,YAAA,IAAA,EAAA;AACA,cAAA,yBAAA,EAAA,iBAAA;AACA,aAAA;AACA,YAAA,QAAA,EAAA;AACA,cAAA,MAAA;AACA,aAAA;AACA,WAAA,CAAA,CAAA;AACA,SAAA;AACA,OAAA,CAAA;AACA,KAAA;AACA;AACA,IAAA,IAAA,gCAAA,IAAA,OAAA,CAAA,MAAA,EAAA;AACA,MAAA,OAAA,CAAA,MAAA,CAAA,QAAA,IAAA;AACA,QAAA,IAAA,QAAA,CAAA,MAAA,KAAA,MAAA,IAAA,QAAA,CAAA,MAAA,KAAA,KAAA,EAAA;AACA,UAAA,IAAA,iBAAA,EAAA;AACA,YAAA,iBAAA,CAAA,MAAA,EAAA,CAAA;AACA,WAAA;AACA,UAAA,MAAA,IAAA,GAAA;AACA,YAAA,yBAAA,EAAA,iBAAA;AACA,WAAA,CAAA;AACA,UAAA,IAAA,QAAA,EAAA;AACA,YAAA,IAAA,CAAA,IAAA,GAAA,QAAA,CAAA;AACA,WAAA;AACA,UAAA,wBAAA,CAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,SAAA,EAAA,MAAA,GAAA,KAAA,KAAA;AACA,YAAA,QAAA,GAAA,SAAA,CAAA;AACA,YAAA,iBAAA,GAAA,gBAAA,CAAA;AACA,cAAA,IAAA,EAAA,QAAA;AACA,cAAA,EAAA,EAAA,YAAA;AACA,cAAA,MAAA,EAAA,qCAAA;AACA,cAAA,IAAA;AACA,cAAA,QAAA,EAAA;AACA,gBAAA,MAAA;AACA,eAAA;AACA,aAAA,CAAA,CAAA;AACA,WAAA,CAAA,CAAA;AACA,SAAA;AACA,OAAA,CAAA,CAAA;AACA,KAAA;AACA,GAAA,CAAA;AACA,CAAA;AACA;AACA;AACA;AACA;AACA,SAAA,wBAAA;AACA,EAAA,SAAA;AACA,EAAA,QAAA;AACA,EAAA,KAAA;AACA,EAAA,QAAA;AACA,EAAA;AACA,EAAA,IAAA,IAAA,GAAA,QAAA,CAAA,QAAA,CAAA;AACA,EAAA,KAAA;AACA,IAAA;AACA,MAAA,QAAA;AACA,MAAA,MAAA,EAAA,SAAA;AACA,KAAA;AACA,IAAA,CAAA,KAAA,EAAA,iBAAA,EAAA,WAAA,KAAA;AACA,MAAA,IAAA,KAAA,IAAA,CAAA,WAAA,EAAA;AACA,QAAA,OAAA,QAAA,CAAA,IAAA,CAAA,CAAA;AACA,OAAA;AACA;AACA,MAAA,MAAA,SAAA,GAAA,wBAAA,CAAA,WAAA,CAAA,MAAA,IAAA,EAAA,CAAA,CAAA;AACA,MAAA,IAAA,SAAA,CAAA,MAAA,KAAA,CAAA,IAAA,SAAA,KAAA,IAAA,EAAA;AACA,QAAA,OAAA,QAAA,CAAA,IAAA,CAAA,CAAA;AACA,OAAA;AACA;AACA,MAAA,IAAA,GAAA,SAAA,CAAA;AACA,MAAA,OAAA,QAAA,CAAA,IAAA,EAAA,OAAA,CAAA,CAAA;AACA,KAAA;AACA,GAAA,CAAA;AACA,CAAA;AACA;AACA;AACA;AACA;AACA,SAAA,wBAAA,CAAA,MAAA,EAAA;AACA,EAAA,IAAA,CAAA,KAAA,CAAA,OAAA,CAAA,MAAA,CAAA,IAAA,MAAA,CAAA,MAAA,KAAA,CAAA,EAAA;AACA,IAAA,OAAA,EAAA,CAAA;AACA,GAAA;AACA;AACA,EAAA,MAAA,eAAA,GAAA,MAAA,CAAA,MAAA,CAAA,CAAA,KAAA,KAAA,CAAA,CAAA,KAAA,CAAA,IAAA,CAAA,CAAA;AACA;AACA,EAAA,IAAA,KAAA,GAAA,CAAA,CAAA,CAAA;AACA,EAAA,KAAA,IAAA,CAAA,GAAA,eAAA,CAAA,MAAA,GAAA,CAAA,EAAA,CAAA,IAAA,CAAA,EAAA,CAAA,EAAA,EAAA;AACA,IAAA,MAAA,KAAA,GAAA,eAAA,CAAA,CAAA,CAAA,CAAA;AACA,IAAA,IAAA,KAAA,CAAA,IAAA,IAAA,KAAA,CAAA,IAAA,CAAA,UAAA,CAAA,GAAA,CAAA,EAAA;AACA,MAAA,KAAA,GAAA,CAAA,CAAA;AACA,MAAA,MAAA;AACA,KAAA;AACA,GAAA;AACA;AACA,EAAA,OAAA,eAAA;AACA,KAAA,KAAA,CAAA,KAAA,CAAA;AACA,KAAA,MAAA,CAAA,CAAA,EAAA,IAAA,EAAA,KAAA,CAAA,CAAA,IAAA,CAAA;AACA,KAAA,GAAA,CAAA,CAAA,EAAA,IAAA,EAAA,KAAA,IAAA,CAAA;AACA,KAAA,IAAA,CAAA,EAAA,CAAA,CAAA;AACA;;;;"}
@@ -55,6 +55,7 @@ function reactRouterV6Instrumentation(
55
55
  activeTransaction = customStartTransaction({
56
56
  name: initPathName,
57
57
  op: 'pageload',
58
+ origin: 'auto.pageload.react.reactrouterv6',
58
59
  tags: SENTRY_TAGS,
59
60
  metadata: {
60
61
  source: 'url',
@@ -152,6 +153,7 @@ function handleNavigation(
152
153
  activeTransaction = _customStartTransaction({
153
154
  name,
154
155
  op: 'navigation',
156
+ origin: 'auto.navigation.react.reactrouterv6',
155
157
  tags: SENTRY_TAGS,
156
158
  metadata: {
157
159
  source,
@@ -202,7 +204,7 @@ function withSentryReactRouterV6Routing(Routes) {
202
204
 
203
205
  // @ts-ignore Setting more specific React Component typing for `R` generic above
204
206
  // will break advanced type inference done by react router params
205
- return React__namespace.createElement(Routes, { ...props, __self: this, __source: {fileName: _jsxFileName, lineNumber: 205}} );
207
+ return React__namespace.createElement(Routes, { ...props, __self: this, __source: {fileName: _jsxFileName, lineNumber: 207}} );
206
208
  };
207
209
 
208
210
  hoistNonReactStatics__default(SentryRoutes, Routes);
@@ -253,7 +255,7 @@ function wrapUseRoutes(origUseRoutes) {
253
255
  return Routes;
254
256
  };
255
257
 
256
- return React__namespace.createElement(SentryRoutes, {__self: this, __source: {fileName: _jsxFileName, lineNumber: 256}} );
258
+ return React__namespace.createElement(SentryRoutes, {__self: this, __source: {fileName: _jsxFileName, lineNumber: 258}} );
257
259
  };
258
260
  }
259
261
 
@@ -1 +1 @@
1
- {"version":3,"file":"reactrouterv6.js","sources":["../../src/reactrouterv6.tsx"],"sourcesContent":["// Inspired from Donnie McNeal's solution:\n// https://gist.github.com/wontondon/e8c4bdf2888875e4c755712e99279536\n\nimport { WINDOW } from '@sentry/browser';\nimport type { Transaction, TransactionContext, TransactionSource } from '@sentry/types';\nimport { getNumberOfUrlSegments, logger } from '@sentry/utils';\nimport hoistNonReactStatics from 'hoist-non-react-statics';\nimport * as React from 'react';\n\nimport type {\n Action,\n AgnosticDataRouteMatch,\n CreateRouterFunction,\n CreateRoutesFromChildren,\n Location,\n MatchRoutes,\n RouteMatch,\n RouteObject,\n Router,\n RouterState,\n UseEffect,\n UseLocation,\n UseNavigationType,\n UseRoutes,\n} from './types';\n\nlet activeTransaction: Transaction | undefined;\n\nlet _useEffect: UseEffect;\nlet _useLocation: UseLocation;\nlet _useNavigationType: UseNavigationType;\nlet _createRoutesFromChildren: CreateRoutesFromChildren;\nlet _matchRoutes: MatchRoutes;\nlet _customStartTransaction: (context: TransactionContext) => Transaction | undefined;\nlet _startTransactionOnLocationChange: boolean;\n\nconst SENTRY_TAGS = {\n 'routing.instrumentation': 'react-router-v6',\n};\n\nexport function reactRouterV6Instrumentation(\n useEffect: UseEffect,\n useLocation: UseLocation,\n useNavigationType: UseNavigationType,\n createRoutesFromChildren: CreateRoutesFromChildren,\n matchRoutes: MatchRoutes,\n) {\n return (\n customStartTransaction: (context: TransactionContext) => Transaction | undefined,\n startTransactionOnPageLoad = true,\n startTransactionOnLocationChange = true,\n ): void => {\n const initPathName = WINDOW && WINDOW.location && WINDOW.location.pathname;\n if (startTransactionOnPageLoad && initPathName) {\n activeTransaction = customStartTransaction({\n name: initPathName,\n op: 'pageload',\n tags: SENTRY_TAGS,\n metadata: {\n source: 'url',\n },\n });\n }\n\n _useEffect = useEffect;\n _useLocation = useLocation;\n _useNavigationType = useNavigationType;\n _matchRoutes = matchRoutes;\n _createRoutesFromChildren = createRoutesFromChildren;\n\n _customStartTransaction = customStartTransaction;\n _startTransactionOnLocationChange = startTransactionOnLocationChange;\n };\n}\n\nfunction getNormalizedName(\n routes: RouteObject[],\n location: Location,\n branches: RouteMatch[],\n): [string, TransactionSource] {\n if (!routes || routes.length === 0) {\n return [location.pathname, 'url'];\n }\n\n let pathBuilder = '';\n if (branches) {\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let x = 0; x < branches.length; x++) {\n const branch = branches[x];\n const route = branch.route;\n if (route) {\n // Early return if index route\n if (route.index) {\n return [branch.pathname, 'route'];\n }\n\n const path = route.path;\n if (path) {\n const newPath = path[0] === '/' || pathBuilder[pathBuilder.length - 1] === '/' ? path : `/${path}`;\n pathBuilder += newPath;\n if (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 [newPath, 'route'];\n }\n return [pathBuilder, 'route'];\n }\n }\n }\n }\n }\n\n return [location.pathname, 'url'];\n}\n\nfunction updatePageloadTransaction(\n location: Location,\n routes: RouteObject[],\n matches?: AgnosticDataRouteMatch,\n basename?: string,\n): void {\n const branches = Array.isArray(matches)\n ? matches\n : (_matchRoutes(routes, location, basename) as unknown as RouteMatch[]);\n\n if (activeTransaction && branches) {\n activeTransaction.setName(...getNormalizedName(routes, location, branches));\n }\n}\n\nfunction handleNavigation(\n location: Location,\n routes: RouteObject[],\n navigationType: Action,\n matches?: AgnosticDataRouteMatch,\n basename?: string,\n): void {\n const branches = Array.isArray(matches) ? matches : _matchRoutes(routes, location, basename);\n\n if (_startTransactionOnLocationChange && (navigationType === 'PUSH' || navigationType === 'POP') && branches) {\n if (activeTransaction) {\n activeTransaction.finish();\n }\n\n const [name, source] = getNormalizedName(routes, location, branches);\n activeTransaction = _customStartTransaction({\n name,\n op: 'navigation',\n tags: SENTRY_TAGS,\n metadata: {\n source,\n },\n });\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function withSentryReactRouterV6Routing<P extends Record<string, any>, R extends React.FC<P>>(Routes: R): R {\n if (\n !_useEffect ||\n !_useLocation ||\n !_useNavigationType ||\n !_createRoutesFromChildren ||\n !_matchRoutes ||\n !_customStartTransaction\n ) {\n __DEBUG_BUILD__ &&\n logger.warn(`reactRouterV6Instrumentation was unable to wrap Routes because of one or more missing parameters.\n useEffect: ${_useEffect}. useLocation: ${_useLocation}. useNavigationType: ${_useNavigationType}.\n createRoutesFromChildren: ${_createRoutesFromChildren}. matchRoutes: ${_matchRoutes}. customStartTransaction: ${_customStartTransaction}.`);\n\n return Routes;\n }\n\n let isMountRenderPass: boolean = true;\n\n const SentryRoutes: React.FC<P> = (props: P) => {\n const location = _useLocation();\n const navigationType = _useNavigationType();\n\n _useEffect(\n () => {\n const routes = _createRoutesFromChildren(props.children) as RouteObject[];\n\n if (isMountRenderPass) {\n updatePageloadTransaction(location, routes);\n isMountRenderPass = false;\n } else {\n handleNavigation(location, routes, navigationType);\n }\n },\n // `props.children` is purpusely not included in the dependency array, because we do not want to re-run this effect\n // when the children change. We only want to start transactions when the location or navigation type change.\n [location, navigationType],\n );\n\n // @ts-ignore 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-ignore Setting more specific React Component typing for `R` generic above\n // will break advanced type inference done by react router params\n return SentryRoutes;\n}\n\nexport function wrapUseRoutes(origUseRoutes: UseRoutes): UseRoutes {\n if (!_useEffect || !_useLocation || !_useNavigationType || !_matchRoutes || !_customStartTransaction) {\n __DEBUG_BUILD__ &&\n logger.warn(\n 'reactRouterV6Instrumentation was unable to wrap `useRoutes` because of one or more missing parameters.',\n );\n\n return origUseRoutes;\n }\n\n let isMountRenderPass: boolean = true;\n\n // eslint-disable-next-line react/display-name\n return (routes: RouteObject[], locationArg?: Partial<Location> | string): React.ReactElement | null => {\n const SentryRoutes: React.FC<unknown> = () => {\n const Routes = origUseRoutes(routes, locationArg);\n\n const location = _useLocation();\n const navigationType = _useNavigationType();\n\n // A value with stable identity to either pick `locationArg` if available or `location` if not\n const stableLocationParam =\n typeof locationArg === 'string' || (locationArg && locationArg.pathname)\n ? (locationArg as { pathname: string })\n : location;\n\n _useEffect(() => {\n const normalizedLocation =\n typeof stableLocationParam === 'string' ? { pathname: stableLocationParam } : stableLocationParam;\n\n if (isMountRenderPass) {\n updatePageloadTransaction(normalizedLocation, routes);\n isMountRenderPass = false;\n } else {\n handleNavigation(normalizedLocation, routes, navigationType);\n }\n }, [navigationType, stableLocationParam]);\n\n return Routes;\n };\n\n return <SentryRoutes />;\n };\n}\n\nexport function wrapCreateBrowserRouter<\n TState extends RouterState = RouterState,\n TRouter extends Router<TState> = Router<TState>,\n>(createRouterFunction: CreateRouterFunction<TState, TRouter>): CreateRouterFunction<TState, TRouter> {\n // `opts` for createBrowserHistory and createMemoryHistory are different, but also not relevant for us at the moment.\n // `basename` is the only option that is relevant for us, and it is the same for all.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return function (routes: RouteObject[], opts?: Record<string, any> & { basename?: string }): TRouter {\n const router = createRouterFunction(routes, opts);\n const basename = opts && opts.basename;\n\n // The initial load ends when `createBrowserRouter` is called.\n // This is the earliest convenient time to update the transaction name.\n // Callbacks to `router.subscribe` are not called for the initial load.\n if (router.state.historyAction === 'POP' && activeTransaction) {\n updatePageloadTransaction(router.state.location, routes, undefined, basename);\n }\n\n router.subscribe((state: RouterState) => {\n const location = state.location;\n\n if (\n _startTransactionOnLocationChange &&\n (state.historyAction === 'PUSH' || state.historyAction === 'POP') &&\n activeTransaction\n ) {\n handleNavigation(location, routes, state.historyAction, undefined, basename);\n }\n });\n\n return router;\n };\n}\n"],"names":["WINDOW","getNumberOfUrlSegments","logger","React","hoistNonReactStatics"],"mappings":"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"}
1
+ {"version":3,"file":"reactrouterv6.js","sources":["../../src/reactrouterv6.tsx"],"sourcesContent":["// Inspired from Donnie McNeal's solution:\n// https://gist.github.com/wontondon/e8c4bdf2888875e4c755712e99279536\n\nimport { WINDOW } from '@sentry/browser';\nimport type { Transaction, TransactionContext, TransactionSource } from '@sentry/types';\nimport { getNumberOfUrlSegments, logger } from '@sentry/utils';\nimport hoistNonReactStatics from 'hoist-non-react-statics';\nimport * as React from 'react';\n\nimport type {\n Action,\n AgnosticDataRouteMatch,\n CreateRouterFunction,\n CreateRoutesFromChildren,\n Location,\n MatchRoutes,\n RouteMatch,\n RouteObject,\n Router,\n RouterState,\n UseEffect,\n UseLocation,\n UseNavigationType,\n UseRoutes,\n} from './types';\n\nlet activeTransaction: Transaction | undefined;\n\nlet _useEffect: UseEffect;\nlet _useLocation: UseLocation;\nlet _useNavigationType: UseNavigationType;\nlet _createRoutesFromChildren: CreateRoutesFromChildren;\nlet _matchRoutes: MatchRoutes;\nlet _customStartTransaction: (context: TransactionContext) => Transaction | undefined;\nlet _startTransactionOnLocationChange: boolean;\n\nconst SENTRY_TAGS = {\n 'routing.instrumentation': 'react-router-v6',\n};\n\nexport function reactRouterV6Instrumentation(\n useEffect: UseEffect,\n useLocation: UseLocation,\n useNavigationType: UseNavigationType,\n createRoutesFromChildren: CreateRoutesFromChildren,\n matchRoutes: MatchRoutes,\n) {\n return (\n customStartTransaction: (context: TransactionContext) => Transaction | undefined,\n startTransactionOnPageLoad = true,\n startTransactionOnLocationChange = true,\n ): void => {\n const initPathName = WINDOW && WINDOW.location && WINDOW.location.pathname;\n if (startTransactionOnPageLoad && initPathName) {\n activeTransaction = customStartTransaction({\n name: initPathName,\n op: 'pageload',\n origin: 'auto.pageload.react.reactrouterv6',\n tags: SENTRY_TAGS,\n metadata: {\n source: 'url',\n },\n });\n }\n\n _useEffect = useEffect;\n _useLocation = useLocation;\n _useNavigationType = useNavigationType;\n _matchRoutes = matchRoutes;\n _createRoutesFromChildren = createRoutesFromChildren;\n\n _customStartTransaction = customStartTransaction;\n _startTransactionOnLocationChange = startTransactionOnLocationChange;\n };\n}\n\nfunction getNormalizedName(\n routes: RouteObject[],\n location: Location,\n branches: RouteMatch[],\n): [string, TransactionSource] {\n if (!routes || routes.length === 0) {\n return [location.pathname, 'url'];\n }\n\n let pathBuilder = '';\n if (branches) {\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let x = 0; x < branches.length; x++) {\n const branch = branches[x];\n const route = branch.route;\n if (route) {\n // Early return if index route\n if (route.index) {\n return [branch.pathname, 'route'];\n }\n\n const path = route.path;\n if (path) {\n const newPath = path[0] === '/' || pathBuilder[pathBuilder.length - 1] === '/' ? path : `/${path}`;\n pathBuilder += newPath;\n if (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 [newPath, 'route'];\n }\n return [pathBuilder, 'route'];\n }\n }\n }\n }\n }\n\n return [location.pathname, 'url'];\n}\n\nfunction updatePageloadTransaction(\n location: Location,\n routes: RouteObject[],\n matches?: AgnosticDataRouteMatch,\n basename?: string,\n): void {\n const branches = Array.isArray(matches)\n ? matches\n : (_matchRoutes(routes, location, basename) as unknown as RouteMatch[]);\n\n if (activeTransaction && branches) {\n activeTransaction.setName(...getNormalizedName(routes, location, branches));\n }\n}\n\nfunction handleNavigation(\n location: Location,\n routes: RouteObject[],\n navigationType: Action,\n matches?: AgnosticDataRouteMatch,\n basename?: string,\n): void {\n const branches = Array.isArray(matches) ? matches : _matchRoutes(routes, location, basename);\n\n if (_startTransactionOnLocationChange && (navigationType === 'PUSH' || navigationType === 'POP') && branches) {\n if (activeTransaction) {\n activeTransaction.finish();\n }\n\n const [name, source] = getNormalizedName(routes, location, branches);\n activeTransaction = _customStartTransaction({\n name,\n op: 'navigation',\n origin: 'auto.navigation.react.reactrouterv6',\n tags: SENTRY_TAGS,\n metadata: {\n source,\n },\n });\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function withSentryReactRouterV6Routing<P extends Record<string, any>, R extends React.FC<P>>(Routes: R): R {\n if (\n !_useEffect ||\n !_useLocation ||\n !_useNavigationType ||\n !_createRoutesFromChildren ||\n !_matchRoutes ||\n !_customStartTransaction\n ) {\n __DEBUG_BUILD__ &&\n logger.warn(`reactRouterV6Instrumentation was unable to wrap Routes because of one or more missing parameters.\n useEffect: ${_useEffect}. useLocation: ${_useLocation}. useNavigationType: ${_useNavigationType}.\n createRoutesFromChildren: ${_createRoutesFromChildren}. matchRoutes: ${_matchRoutes}. customStartTransaction: ${_customStartTransaction}.`);\n\n return Routes;\n }\n\n let isMountRenderPass: boolean = true;\n\n const SentryRoutes: React.FC<P> = (props: P) => {\n const location = _useLocation();\n const navigationType = _useNavigationType();\n\n _useEffect(\n () => {\n const routes = _createRoutesFromChildren(props.children) as RouteObject[];\n\n if (isMountRenderPass) {\n updatePageloadTransaction(location, routes);\n isMountRenderPass = false;\n } else {\n handleNavigation(location, routes, navigationType);\n }\n },\n // `props.children` is purpusely not included in the dependency array, because we do not want to re-run this effect\n // when the children change. We only want to start transactions when the location or navigation type change.\n [location, navigationType],\n );\n\n // @ts-ignore 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-ignore Setting more specific React Component typing for `R` generic above\n // will break advanced type inference done by react router params\n return SentryRoutes;\n}\n\nexport function wrapUseRoutes(origUseRoutes: UseRoutes): UseRoutes {\n if (!_useEffect || !_useLocation || !_useNavigationType || !_matchRoutes || !_customStartTransaction) {\n __DEBUG_BUILD__ &&\n logger.warn(\n 'reactRouterV6Instrumentation was unable to wrap `useRoutes` because of one or more missing parameters.',\n );\n\n return origUseRoutes;\n }\n\n let isMountRenderPass: boolean = true;\n\n // eslint-disable-next-line react/display-name\n return (routes: RouteObject[], locationArg?: Partial<Location> | string): React.ReactElement | null => {\n const SentryRoutes: React.FC<unknown> = () => {\n const Routes = origUseRoutes(routes, locationArg);\n\n const location = _useLocation();\n const navigationType = _useNavigationType();\n\n // A value with stable identity to either pick `locationArg` if available or `location` if not\n const stableLocationParam =\n typeof locationArg === 'string' || (locationArg && locationArg.pathname)\n ? (locationArg as { pathname: string })\n : location;\n\n _useEffect(() => {\n const normalizedLocation =\n typeof stableLocationParam === 'string' ? { pathname: stableLocationParam } : stableLocationParam;\n\n if (isMountRenderPass) {\n updatePageloadTransaction(normalizedLocation, routes);\n isMountRenderPass = false;\n } else {\n handleNavigation(normalizedLocation, routes, navigationType);\n }\n }, [navigationType, stableLocationParam]);\n\n return Routes;\n };\n\n return <SentryRoutes />;\n };\n}\n\nexport function wrapCreateBrowserRouter<\n TState extends RouterState = RouterState,\n TRouter extends Router<TState> = Router<TState>,\n>(createRouterFunction: CreateRouterFunction<TState, TRouter>): CreateRouterFunction<TState, TRouter> {\n // `opts` for createBrowserHistory and createMemoryHistory are different, but also not relevant for us at the moment.\n // `basename` is the only option that is relevant for us, and it is the same for all.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return function (routes: RouteObject[], opts?: Record<string, any> & { basename?: string }): TRouter {\n const router = createRouterFunction(routes, opts);\n const basename = opts && opts.basename;\n\n // The initial load ends when `createBrowserRouter` is called.\n // This is the earliest convenient time to update the transaction name.\n // Callbacks to `router.subscribe` are not called for the initial load.\n if (router.state.historyAction === 'POP' && activeTransaction) {\n updatePageloadTransaction(router.state.location, routes, undefined, basename);\n }\n\n router.subscribe((state: RouterState) => {\n const location = state.location;\n\n if (\n _startTransactionOnLocationChange &&\n (state.historyAction === 'PUSH' || state.historyAction === 'POP') &&\n activeTransaction\n ) {\n handleNavigation(location, routes, state.historyAction, undefined, basename);\n }\n });\n\n return router;\n };\n}\n"],"names":["WINDOW","getNumberOfUrlSegments","logger","React","hoistNonReactStatics"],"mappings":"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"}
package/esm/profiler.js CHANGED
@@ -42,6 +42,7 @@ class Profiler extends React.Component {
42
42
  this._mountSpan = activeTransaction.startChild({
43
43
  description: `<${name}>`,
44
44
  op: REACT_MOUNT_OP,
45
+ origin: 'auto.ui.react.profiler',
45
46
  });
46
47
  }
47
48
  }
@@ -69,6 +70,7 @@ class Profiler extends React.Component {
69
70
  },
70
71
  description: `<${this.props.name}>`,
71
72
  op: REACT_UPDATE_OP,
73
+ origin: 'auto.ui.react.profiler',
72
74
  startTimestamp: now,
73
75
  });
74
76
  }
@@ -96,6 +98,7 @@ class Profiler extends React.Component {
96
98
  description: `<${name}>`,
97
99
  endTimestamp: timestampInSeconds(),
98
100
  op: REACT_RENDER_OP,
101
+ origin: 'auto.ui.react.profiler',
99
102
  startTimestamp: this._mountSpan.endTimestamp,
100
103
  });
101
104
  }
@@ -123,8 +126,8 @@ function withProfiler(
123
126
  (options && options.name) || WrappedComponent.displayName || WrappedComponent.name || UNKNOWN_COMPONENT;
124
127
 
125
128
  const Wrapped = (props) => (
126
- React.createElement(Profiler, { ...options, name: componentDisplayName, updateProps: props, __self: this, __source: {fileName: _jsxFileName, lineNumber: 146}}
127
- , React.createElement(WrappedComponent, { ...props, __self: this, __source: {fileName: _jsxFileName, lineNumber: 147}} )
129
+ React.createElement(Profiler, { ...options, name: componentDisplayName, updateProps: props, __self: this, __source: {fileName: _jsxFileName, lineNumber: 149}}
130
+ , React.createElement(WrappedComponent, { ...props, __self: this, __source: {fileName: _jsxFileName, lineNumber: 150}} )
128
131
  )
129
132
  );
130
133
 
@@ -160,6 +163,7 @@ function useProfiler(
160
163
  return activeTransaction.startChild({
161
164
  description: `<${name}>`,
162
165
  op: REACT_MOUNT_OP,
166
+ origin: 'auto.ui.react.profiler',
163
167
  });
164
168
  }
165
169
 
@@ -177,6 +181,7 @@ function useProfiler(
177
181
  description: `<${name}>`,
178
182
  endTimestamp: timestampInSeconds(),
179
183
  op: REACT_RENDER_OP,
184
+ origin: 'auto.ui.react.profiler',
180
185
  startTimestamp: mountSpan.endTimestamp,
181
186
  });
182
187
  }
@@ -1 +1 @@
1
- {"version":3,"file":"profiler.js","sources":["../../src/profiler.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { Hub } from '@sentry/browser';\nimport { getCurrentHub } from '@sentry/browser';\nimport type { Span, Transaction } from '@sentry/types';\nimport { timestampInSeconds } from '@sentry/utils';\nimport hoistNonReactStatics from 'hoist-non-react-statics';\nimport * as React from 'react';\n\nimport { REACT_MOUNT_OP, REACT_RENDER_OP, REACT_UPDATE_OP } from './constants';\n\nexport const UNKNOWN_COMPONENT = 'unknown';\n\nexport type ProfilerProps = {\n // The name of the component being profiled.\n name: string;\n // If the Profiler is disabled. False by default. This is useful if you want to disable profilers\n // in certain environments.\n disabled?: boolean;\n // If time component is on page should be displayed as spans. True by default.\n includeRender?: boolean;\n // If component updates should be displayed as spans. True by default.\n includeUpdates?: boolean;\n // Component that is being profiled.\n children?: React.ReactNode;\n // props given to component being profiled.\n updateProps: { [key: string]: unknown };\n};\n\n/**\n * The Profiler component leverages Sentry's Tracing integration to generate\n * spans based on component lifecycles.\n */\nclass Profiler extends React.Component<ProfilerProps> {\n /**\n * The span of the mount activity\n * Made protected for the React Native SDK to access\n */\n protected _mountSpan: Span | undefined;\n /**\n * The span that represents the duration of time between shouldComponentUpdate and componentDidUpdate\n */\n protected _updateSpan: Span | undefined;\n\n // eslint-disable-next-line @typescript-eslint/member-ordering\n public static defaultProps: Partial<ProfilerProps> = {\n disabled: false,\n includeRender: true,\n includeUpdates: true,\n };\n\n public constructor(props: ProfilerProps) {\n super(props);\n const { name, disabled = false } = this.props;\n\n if (disabled) {\n return;\n }\n\n const activeTransaction = getActiveTransaction();\n if (activeTransaction) {\n this._mountSpan = activeTransaction.startChild({\n description: `<${name}>`,\n op: REACT_MOUNT_OP,\n });\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.finish();\n }\n }\n\n public shouldComponentUpdate({ updateProps, includeUpdates = true }: ProfilerProps): boolean {\n // Only generate an update span if includeUpdates is true, if there is a valid mountSpan,\n // and if the updateProps have changed. It is ok to not do a deep equality check here as it is expensive.\n // We are just trying to give baseline clues for further investigation.\n if (includeUpdates && this._mountSpan && updateProps !== this.props.updateProps) {\n // See what props haved changed between the previous props, and the current props. This is\n // set as data on the span. We just store the prop keys as the values could be potenially very large.\n const changedProps = Object.keys(updateProps).filter(k => updateProps[k] !== this.props.updateProps[k]);\n if (changedProps.length > 0) {\n const now = timestampInSeconds();\n this._updateSpan = this._mountSpan.startChild({\n data: {\n changedProps,\n },\n description: `<${this.props.name}>`,\n op: REACT_UPDATE_OP,\n startTimestamp: now,\n });\n }\n }\n\n return true;\n }\n\n public componentDidUpdate(): void {\n if (this._updateSpan) {\n this._updateSpan.finish();\n this._updateSpan = undefined;\n }\n }\n\n // If a component is unmounted, we can say it is no longer on the screen.\n // This means we can finish the span representing the component render.\n public componentWillUnmount(): void {\n const { name, includeRender = true } = this.props;\n\n if (this._mountSpan && includeRender) {\n // If we were able to obtain the spanId of the mount activity, we should set the\n // next activity as a child to the component mount activity.\n this._mountSpan.startChild({\n description: `<${name}>`,\n endTimestamp: timestampInSeconds(),\n op: REACT_RENDER_OP,\n startTimestamp: this._mountSpan.endTimestamp,\n });\n }\n }\n\n public render(): React.ReactNode {\n return this.props.children;\n }\n}\n\n/**\n * withProfiler is a higher order component that wraps a\n * component in a {@link Profiler} component. It is recommended that\n * the higher order component be used over the regular {@link Profiler} component.\n *\n * @param WrappedComponent component that is wrapped by Profiler\n * @param options the {@link ProfilerProps} you can pass into the Profiler\n */\nfunction withProfiler<P extends Record<string, any>>(\n WrappedComponent: React.ComponentType<P>,\n // We do not want to have `updateProps` given in options, it is instead filled through the HOC.\n options?: Pick<Partial<ProfilerProps>, Exclude<keyof ProfilerProps, 'updateProps' | 'children'>>,\n): React.FC<P> {\n const componentDisplayName =\n (options && options.name) || WrappedComponent.displayName || WrappedComponent.name || UNKNOWN_COMPONENT;\n\n const Wrapped: React.FC<P> = (props: P) => (\n <Profiler {...options} name={componentDisplayName} updateProps={props}>\n <WrappedComponent {...props} />\n </Profiler>\n );\n\n Wrapped.displayName = `profiler(${componentDisplayName})`;\n\n // Copy over static methods from Wrapped component to Profiler HOC\n // See: https://reactjs.org/docs/higher-order-components.html#static-methods-must-be-copied-over\n hoistNonReactStatics(Wrapped, WrappedComponent);\n return Wrapped;\n}\n\n/**\n *\n * `useProfiler` is a React hook that profiles a React component.\n *\n * Requires React 16.8 or above.\n * @param name displayName of component being profiled\n */\nfunction useProfiler(\n name: string,\n options: { disabled?: boolean; hasRenderSpan?: boolean } = {\n disabled: false,\n hasRenderSpan: true,\n },\n): void {\n const [mountSpan] = React.useState(() => {\n if (options && options.disabled) {\n return undefined;\n }\n\n const activeTransaction = getActiveTransaction();\n if (activeTransaction) {\n return activeTransaction.startChild({\n description: `<${name}>`,\n op: REACT_MOUNT_OP,\n });\n }\n\n return undefined;\n });\n\n React.useEffect(() => {\n if (mountSpan) {\n mountSpan.finish();\n }\n\n return (): void => {\n if (mountSpan && options.hasRenderSpan) {\n mountSpan.startChild({\n description: `<${name}>`,\n endTimestamp: timestampInSeconds(),\n op: REACT_RENDER_OP,\n startTimestamp: mountSpan.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\n/** Grabs active transaction off scope */\nexport function getActiveTransaction<T extends Transaction>(hub: Hub = getCurrentHub()): T | undefined {\n if (hub) {\n const scope = hub.getScope();\n if (scope) {\n return scope.getTransaction() as T | undefined;\n }\n }\n\n return undefined;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"profiler.js","sources":["../../src/profiler.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { Hub } from '@sentry/browser';\nimport { getCurrentHub } from '@sentry/browser';\nimport type { Span, Transaction } from '@sentry/types';\nimport { timestampInSeconds } from '@sentry/utils';\nimport hoistNonReactStatics from 'hoist-non-react-statics';\nimport * as React from 'react';\n\nimport { REACT_MOUNT_OP, REACT_RENDER_OP, REACT_UPDATE_OP } from './constants';\n\nexport const UNKNOWN_COMPONENT = 'unknown';\n\nexport type ProfilerProps = {\n // The name of the component being profiled.\n name: string;\n // If the Profiler is disabled. False by default. This is useful if you want to disable profilers\n // in certain environments.\n disabled?: boolean;\n // If time component is on page should be displayed as spans. True by default.\n includeRender?: boolean;\n // If component updates should be displayed as spans. True by default.\n includeUpdates?: boolean;\n // Component that is being profiled.\n children?: React.ReactNode;\n // props given to component being profiled.\n updateProps: { [key: string]: unknown };\n};\n\n/**\n * The Profiler component leverages Sentry's Tracing integration to generate\n * spans based on component lifecycles.\n */\nclass Profiler extends React.Component<ProfilerProps> {\n /**\n * The span of the mount activity\n * Made protected for the React Native SDK to access\n */\n protected _mountSpan: Span | undefined;\n /**\n * The span that represents the duration of time between shouldComponentUpdate and componentDidUpdate\n */\n protected _updateSpan: Span | undefined;\n\n // eslint-disable-next-line @typescript-eslint/member-ordering\n public static defaultProps: Partial<ProfilerProps> = {\n disabled: false,\n includeRender: true,\n includeUpdates: true,\n };\n\n public constructor(props: ProfilerProps) {\n super(props);\n const { name, disabled = false } = this.props;\n\n if (disabled) {\n return;\n }\n\n const activeTransaction = getActiveTransaction();\n if (activeTransaction) {\n this._mountSpan = activeTransaction.startChild({\n description: `<${name}>`,\n op: REACT_MOUNT_OP,\n origin: 'auto.ui.react.profiler',\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.finish();\n }\n }\n\n public shouldComponentUpdate({ updateProps, includeUpdates = true }: ProfilerProps): boolean {\n // Only generate an update span if includeUpdates is true, if there is a valid mountSpan,\n // and if the updateProps have changed. It is ok to not do a deep equality check here as it is expensive.\n // We are just trying to give baseline clues for further investigation.\n if (includeUpdates && this._mountSpan && updateProps !== this.props.updateProps) {\n // See what props haved changed between the previous props, and the current props. This is\n // set as data on the span. We just store the prop keys as the values could be potenially very large.\n const changedProps = Object.keys(updateProps).filter(k => updateProps[k] !== this.props.updateProps[k]);\n if (changedProps.length > 0) {\n const now = timestampInSeconds();\n this._updateSpan = this._mountSpan.startChild({\n data: {\n changedProps,\n },\n description: `<${this.props.name}>`,\n op: REACT_UPDATE_OP,\n origin: 'auto.ui.react.profiler',\n startTimestamp: now,\n });\n }\n }\n\n return true;\n }\n\n public componentDidUpdate(): void {\n if (this._updateSpan) {\n this._updateSpan.finish();\n this._updateSpan = undefined;\n }\n }\n\n // If a component is unmounted, we can say it is no longer on the screen.\n // This means we can finish the span representing the component render.\n public componentWillUnmount(): void {\n const { name, includeRender = true } = this.props;\n\n if (this._mountSpan && includeRender) {\n // If we were able to obtain the spanId of the mount activity, we should set the\n // next activity as a child to the component mount activity.\n this._mountSpan.startChild({\n description: `<${name}>`,\n endTimestamp: timestampInSeconds(),\n op: REACT_RENDER_OP,\n origin: 'auto.ui.react.profiler',\n startTimestamp: this._mountSpan.endTimestamp,\n });\n }\n }\n\n public render(): React.ReactNode {\n return this.props.children;\n }\n}\n\n/**\n * withProfiler is a higher order component that wraps a\n * component in a {@link Profiler} component. It is recommended that\n * the higher order component be used over the regular {@link Profiler} component.\n *\n * @param WrappedComponent component that is wrapped by Profiler\n * @param options the {@link ProfilerProps} you can pass into the Profiler\n */\nfunction withProfiler<P extends Record<string, any>>(\n WrappedComponent: React.ComponentType<P>,\n // We do not want to have `updateProps` given in options, it is instead filled through the HOC.\n options?: Pick<Partial<ProfilerProps>, Exclude<keyof ProfilerProps, 'updateProps' | 'children'>>,\n): React.FC<P> {\n const componentDisplayName =\n (options && options.name) || WrappedComponent.displayName || WrappedComponent.name || UNKNOWN_COMPONENT;\n\n const Wrapped: React.FC<P> = (props: P) => (\n <Profiler {...options} name={componentDisplayName} updateProps={props}>\n <WrappedComponent {...props} />\n </Profiler>\n );\n\n Wrapped.displayName = `profiler(${componentDisplayName})`;\n\n // Copy over static methods from Wrapped component to Profiler HOC\n // See: https://reactjs.org/docs/higher-order-components.html#static-methods-must-be-copied-over\n hoistNonReactStatics(Wrapped, WrappedComponent);\n return Wrapped;\n}\n\n/**\n *\n * `useProfiler` is a React hook that profiles a React component.\n *\n * Requires React 16.8 or above.\n * @param name displayName of component being profiled\n */\nfunction useProfiler(\n name: string,\n options: { disabled?: boolean; hasRenderSpan?: boolean } = {\n disabled: false,\n hasRenderSpan: true,\n },\n): void {\n const [mountSpan] = React.useState(() => {\n if (options && options.disabled) {\n return undefined;\n }\n\n const activeTransaction = getActiveTransaction();\n if (activeTransaction) {\n return activeTransaction.startChild({\n description: `<${name}>`,\n op: REACT_MOUNT_OP,\n origin: 'auto.ui.react.profiler',\n });\n }\n\n return undefined;\n });\n\n React.useEffect(() => {\n if (mountSpan) {\n mountSpan.finish();\n }\n\n return (): void => {\n if (mountSpan && options.hasRenderSpan) {\n mountSpan.startChild({\n description: `<${name}>`,\n endTimestamp: timestampInSeconds(),\n op: REACT_RENDER_OP,\n origin: 'auto.ui.react.profiler',\n startTimestamp: mountSpan.endTimestamp,\n });\n }\n };\n // We only want this to run once.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n}\n\nexport { withProfiler, Profiler, useProfiler };\n\n/** Grabs active transaction off scope */\nexport function getActiveTransaction<T extends Transaction>(hub: Hub = getCurrentHub()): T | undefined {\n if (hub) {\n const scope = hub.getScope();\n if (scope) {\n return scope.getTransaction() as T | undefined;\n }\n }\n\n return undefined;\n}\n"],"names":[],"mappings":"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"}
@@ -77,6 +77,7 @@ function createReactRouterInstrumentation(
77
77
  activeTransaction = customStartTransaction({
78
78
  name,
79
79
  op: 'pageload',
80
+ origin: 'auto.pageload.react.reactrouter',
80
81
  tags,
81
82
  metadata: {
82
83
  source,
@@ -95,6 +96,7 @@ function createReactRouterInstrumentation(
95
96
  activeTransaction = customStartTransaction({
96
97
  name,
97
98
  op: 'navigation',
99
+ origin: 'auto.navigation.react.reactrouter',
98
100
  tags,
99
101
  metadata: {
100
102
  source,
@@ -153,7 +155,7 @@ function withSentryRouting(Route) {
153
155
  // @ts-ignore Setting more specific React Component typing for `R` generic above
154
156
  // will break advanced type inference done by react router params:
155
157
  // https://github.com/DefinitelyTyped/DefinitelyTyped/blob/13dc4235c069e25fe7ee16e11f529d909f9f3ff8/types/react-router/index.d.ts#L154-L164
156
- return React.createElement(Route, { ...props, __self: this, __source: {fileName: _jsxFileName, lineNumber: 172}} );
158
+ return React.createElement(Route, { ...props, __self: this, __source: {fileName: _jsxFileName, lineNumber: 174}} );
157
159
  };
158
160
 
159
161
  WrappedRoute.displayName = `sentryRoute(${componentDisplayName})`;
@@ -1 +1 @@
1
- {"version":3,"file":"reactrouter.js","sources":["../../src/reactrouter.tsx"],"sourcesContent":["import { WINDOW } from '@sentry/browser';\nimport type { Transaction, TransactionSource } from '@sentry/types';\nimport hoistNonReactStatics from 'hoist-non-react-statics';\nimport * as React from 'react';\n\nimport type { Action, Location, ReactRouterInstrumentation } from './types';\n\n// We need to disable eslint no-explict-any because any is required for the\n// react-router typings.\ntype Match = { path: string; url: string; params: Record<string, any>; isExact: boolean }; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nexport type RouterHistory = {\n location?: Location;\n listen?(cb: (location: Location, action: Action) => void): void;\n} & Record<string, any>; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nexport type RouteConfig = {\n [propName: string]: unknown;\n path?: string | string[];\n exact?: boolean;\n component?: JSX.Element;\n routes?: RouteConfig[];\n};\n\ntype MatchPath = (pathname: string, props: string | string[] | any, parent?: Match | null) => Match | null; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nlet activeTransaction: Transaction | undefined;\n\nexport function reactRouterV4Instrumentation(\n history: RouterHistory,\n routes?: RouteConfig[],\n matchPath?: MatchPath,\n): ReactRouterInstrumentation {\n return createReactRouterInstrumentation(history, 'react-router-v4', routes, matchPath);\n}\n\nexport function reactRouterV5Instrumentation(\n history: RouterHistory,\n routes?: RouteConfig[],\n matchPath?: MatchPath,\n): ReactRouterInstrumentation {\n return createReactRouterInstrumentation(history, 'react-router-v5', routes, matchPath);\n}\n\nfunction createReactRouterInstrumentation(\n history: RouterHistory,\n name: string,\n allRoutes: RouteConfig[] = [],\n matchPath?: MatchPath,\n): ReactRouterInstrumentation {\n function getInitPathName(): string | undefined {\n if (history && history.location) {\n return history.location.pathname;\n }\n\n if (WINDOW && WINDOW.location) {\n return WINDOW.location.pathname;\n }\n\n return undefined;\n }\n\n /**\n * Normalizes a transaction name. Returns the new name as well as the\n * source of the transaction.\n *\n * @param pathname The initial pathname we normalize\n */\n function normalizeTransactionName(pathname: string): [string, TransactionSource] {\n if (allRoutes.length === 0 || !matchPath) {\n return [pathname, 'url'];\n }\n\n const branches = matchRoutes(allRoutes, pathname, matchPath);\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let x = 0; x < branches.length; x++) {\n if (branches[x].match.isExact) {\n return [branches[x].match.path, 'route'];\n }\n }\n\n return [pathname, 'url'];\n }\n\n const tags = {\n 'routing.instrumentation': name,\n };\n\n return (customStartTransaction, startTransactionOnPageLoad = true, startTransactionOnLocationChange = true): void => {\n const initPathName = getInitPathName();\n if (startTransactionOnPageLoad && initPathName) {\n const [name, source] = normalizeTransactionName(initPathName);\n activeTransaction = customStartTransaction({\n name,\n op: 'pageload',\n tags,\n metadata: {\n source,\n },\n });\n }\n\n if (startTransactionOnLocationChange && history.listen) {\n history.listen((location, action) => {\n if (action && (action === 'PUSH' || action === 'POP')) {\n if (activeTransaction) {\n activeTransaction.finish();\n }\n\n const [name, source] = normalizeTransactionName(location.pathname);\n activeTransaction = customStartTransaction({\n name,\n op: 'navigation',\n tags,\n metadata: {\n source,\n },\n });\n }\n });\n }\n };\n}\n\n/**\n * Matches a set of routes to a pathname\n * Based on implementation from\n */\nfunction matchRoutes(\n routes: RouteConfig[],\n pathname: string,\n matchPath: MatchPath,\n branch: Array<{ route: RouteConfig; match: Match }> = [],\n): Array<{ route: RouteConfig; match: Match }> {\n routes.some(route => {\n const match = route.path\n ? matchPath(pathname, route)\n : branch.length\n ? branch[branch.length - 1].match // use parent match\n : computeRootMatch(pathname); // use default \"root\" match\n\n if (match) {\n branch.push({ route, match });\n\n if (route.routes) {\n matchRoutes(route.routes, pathname, matchPath, branch);\n }\n }\n\n return !!match;\n });\n\n return branch;\n}\n\nfunction computeRootMatch(pathname: string): Match {\n return { path: '/', url: '/', params: {}, isExact: pathname === '/' };\n}\n\n/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access */\nexport function withSentryRouting<P extends Record<string, any>, R extends React.ComponentType<P>>(Route: R): R {\n const componentDisplayName = (Route as any).displayName || (Route as any).name;\n\n const WrappedRoute: React.FC<P> = (props: P) => {\n if (activeTransaction && props && props.computedMatch && props.computedMatch.isExact) {\n activeTransaction.setName(props.computedMatch.path, 'route');\n }\n\n // @ts-ignore 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-ignore Setting more specific React Component typing for `R` generic above\n // will break advanced type inference done by react router params:\n // https://github.com/DefinitelyTyped/DefinitelyTyped/blob/13dc4235c069e25fe7ee16e11f529d909f9f3ff8/types/react-router/index.d.ts#L154-L164\n return WrappedRoute;\n}\n/* eslint-enable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access */\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reactrouter.js","sources":["../../src/reactrouter.tsx"],"sourcesContent":["import { WINDOW } from '@sentry/browser';\nimport type { Transaction, TransactionSource } from '@sentry/types';\nimport hoistNonReactStatics from 'hoist-non-react-statics';\nimport * as React from 'react';\n\nimport type { Action, Location, ReactRouterInstrumentation } from './types';\n\n// We need to disable eslint no-explict-any because any is required for the\n// react-router typings.\ntype Match = { path: string; url: string; params: Record<string, any>; isExact: boolean }; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nexport type RouterHistory = {\n location?: Location;\n listen?(cb: (location: Location, action: Action) => void): void;\n} & Record<string, any>; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nexport type RouteConfig = {\n [propName: string]: unknown;\n path?: string | string[];\n exact?: boolean;\n component?: JSX.Element;\n routes?: RouteConfig[];\n};\n\ntype MatchPath = (pathname: string, props: string | string[] | any, parent?: Match | null) => Match | null; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nlet activeTransaction: Transaction | undefined;\n\nexport function reactRouterV4Instrumentation(\n history: RouterHistory,\n routes?: RouteConfig[],\n matchPath?: MatchPath,\n): ReactRouterInstrumentation {\n return createReactRouterInstrumentation(history, 'react-router-v4', routes, matchPath);\n}\n\nexport function reactRouterV5Instrumentation(\n history: RouterHistory,\n routes?: RouteConfig[],\n matchPath?: MatchPath,\n): ReactRouterInstrumentation {\n return createReactRouterInstrumentation(history, 'react-router-v5', routes, matchPath);\n}\n\nfunction createReactRouterInstrumentation(\n history: RouterHistory,\n name: string,\n allRoutes: RouteConfig[] = [],\n matchPath?: MatchPath,\n): ReactRouterInstrumentation {\n function getInitPathName(): string | undefined {\n if (history && history.location) {\n return history.location.pathname;\n }\n\n if (WINDOW && WINDOW.location) {\n return WINDOW.location.pathname;\n }\n\n return undefined;\n }\n\n /**\n * Normalizes a transaction name. Returns the new name as well as the\n * source of the transaction.\n *\n * @param pathname The initial pathname we normalize\n */\n function normalizeTransactionName(pathname: string): [string, TransactionSource] {\n if (allRoutes.length === 0 || !matchPath) {\n return [pathname, 'url'];\n }\n\n const branches = matchRoutes(allRoutes, pathname, matchPath);\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let x = 0; x < branches.length; x++) {\n if (branches[x].match.isExact) {\n return [branches[x].match.path, 'route'];\n }\n }\n\n return [pathname, 'url'];\n }\n\n const tags = {\n 'routing.instrumentation': name,\n };\n\n return (customStartTransaction, startTransactionOnPageLoad = true, startTransactionOnLocationChange = true): void => {\n const initPathName = getInitPathName();\n if (startTransactionOnPageLoad && initPathName) {\n const [name, source] = normalizeTransactionName(initPathName);\n activeTransaction = customStartTransaction({\n name,\n op: 'pageload',\n origin: 'auto.pageload.react.reactrouter',\n tags,\n metadata: {\n source,\n },\n });\n }\n\n if (startTransactionOnLocationChange && history.listen) {\n history.listen((location, action) => {\n if (action && (action === 'PUSH' || action === 'POP')) {\n if (activeTransaction) {\n activeTransaction.finish();\n }\n\n const [name, source] = normalizeTransactionName(location.pathname);\n activeTransaction = customStartTransaction({\n name,\n op: 'navigation',\n origin: 'auto.navigation.react.reactrouter',\n tags,\n metadata: {\n source,\n },\n });\n }\n });\n }\n };\n}\n\n/**\n * Matches a set of routes to a pathname\n * Based on implementation from\n */\nfunction matchRoutes(\n routes: RouteConfig[],\n pathname: string,\n matchPath: MatchPath,\n branch: Array<{ route: RouteConfig; match: Match }> = [],\n): Array<{ route: RouteConfig; match: Match }> {\n routes.some(route => {\n const match = route.path\n ? matchPath(pathname, route)\n : branch.length\n ? branch[branch.length - 1].match // use parent match\n : computeRootMatch(pathname); // use default \"root\" match\n\n if (match) {\n branch.push({ route, match });\n\n if (route.routes) {\n matchRoutes(route.routes, pathname, matchPath, branch);\n }\n }\n\n return !!match;\n });\n\n return branch;\n}\n\nfunction computeRootMatch(pathname: string): Match {\n return { path: '/', url: '/', params: {}, isExact: pathname === '/' };\n}\n\n/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access */\nexport function withSentryRouting<P extends Record<string, any>, R extends React.ComponentType<P>>(Route: R): R {\n const componentDisplayName = (Route as any).displayName || (Route as any).name;\n\n const WrappedRoute: React.FC<P> = (props: P) => {\n if (activeTransaction && props && props.computedMatch && props.computedMatch.isExact) {\n activeTransaction.setName(props.computedMatch.path, 'route');\n }\n\n // @ts-ignore 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-ignore Setting more specific React Component typing for `R` generic above\n // will break advanced type inference done by react router params:\n // https://github.com/DefinitelyTyped/DefinitelyTyped/blob/13dc4235c069e25fe7ee16e11f529d909f9f3ff8/types/react-router/index.d.ts#L154-L164\n return WrappedRoute;\n}\n/* eslint-enable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access */\n"],"names":[],"mappings":"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"}
@@ -35,6 +35,7 @@ function reactRouterV3Instrumentation(
35
35
  activeTransaction = startTransaction({
36
36
  name: prevName,
37
37
  op: 'pageload',
38
+ origin: 'auto.pageload.react.reactrouterv3',
38
39
  tags: {
39
40
  'routing.instrumentation': 'react-router-v3',
40
41
  },
@@ -63,6 +64,7 @@ function reactRouterV3Instrumentation(
63
64
  activeTransaction = startTransaction({
64
65
  name: prevName,
65
66
  op: 'navigation',
67
+ origin: 'auto.navigation.react.reactrouterv3',
66
68
  tags,
67
69
  metadata: {
68
70
  source,
@@ -1 +1 @@
1
- {"version":3,"file":"reactrouterv3.js","sources":["../../src/reactrouterv3.ts"],"sourcesContent":["import { WINDOW } from '@sentry/browser';\nimport type { Primitive, Transaction, TransactionContext, TransactionSource } from '@sentry/types';\n\nimport type { Location, ReactRouterInstrumentation } from './types';\n\n// Many of the types below had to be mocked out to prevent typescript issues\n// these types are required for correct functionality.\n\ntype HistoryV3 = {\n location?: Location;\n listen?(cb: (location: Location) => void): void;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n} & Record<string, any>;\n\nexport type Route = { path?: string; childRoutes?: Route[] };\n\nexport type Match = (\n props: { location: Location; routes: Route[] },\n cb: (error?: Error, _redirectLocation?: Location, renderProps?: { routes?: Route[] }) => void,\n) => void;\n\ntype ReactRouterV3TransactionSource = Extract<TransactionSource, 'url' | 'route'>;\n\n/**\n * Creates routing instrumentation for React Router v3\n * Works for React Router >= 3.2.0 and < 4.0.0\n *\n * @param history object from the `history` library\n * @param routes a list of all routes, should be\n * @param match `Router.match` utility\n */\nexport function reactRouterV3Instrumentation(\n history: HistoryV3,\n routes: Route[],\n match: Match,\n): ReactRouterInstrumentation {\n return (\n startTransaction: (context: TransactionContext) => Transaction | undefined,\n startTransactionOnPageLoad: boolean = true,\n startTransactionOnLocationChange: boolean = true,\n ) => {\n let activeTransaction: Transaction | undefined;\n let prevName: string | undefined;\n\n // Have to use window.location because history.location might not be defined.\n if (startTransactionOnPageLoad && WINDOW && WINDOW.location) {\n normalizeTransactionName(\n routes,\n WINDOW.location as unknown as Location,\n match,\n (localName: string, source: ReactRouterV3TransactionSource = 'url') => {\n prevName = localName;\n activeTransaction = startTransaction({\n name: prevName,\n op: 'pageload',\n tags: {\n 'routing.instrumentation': 'react-router-v3',\n },\n metadata: {\n source,\n },\n });\n },\n );\n }\n\n if (startTransactionOnLocationChange && history.listen) {\n history.listen(location => {\n if (location.action === 'PUSH' || location.action === 'POP') {\n if (activeTransaction) {\n activeTransaction.finish();\n }\n const tags: Record<string, Primitive> = {\n 'routing.instrumentation': 'react-router-v3',\n };\n if (prevName) {\n tags.from = prevName;\n }\n normalizeTransactionName(routes, location, match, (localName: string, source: TransactionSource = 'url') => {\n prevName = localName;\n activeTransaction = startTransaction({\n name: prevName,\n op: 'navigation',\n tags,\n metadata: {\n source,\n },\n });\n });\n }\n });\n }\n };\n}\n\n/**\n * Normalize transaction names using `Router.match`\n */\nfunction normalizeTransactionName(\n appRoutes: Route[],\n location: Location,\n match: Match,\n callback: (pathname: string, source?: ReactRouterV3TransactionSource) => void,\n): void {\n let name = location.pathname;\n match(\n {\n location,\n routes: appRoutes,\n },\n (error, _redirectLocation, renderProps) => {\n if (error || !renderProps) {\n return callback(name);\n }\n\n const routePath = getRouteStringFromRoutes(renderProps.routes || []);\n if (routePath.length === 0 || routePath === '/*') {\n return callback(name);\n }\n\n name = routePath;\n return callback(name, 'route');\n },\n );\n}\n\n/**\n * Generate route name from array of routes\n */\nfunction getRouteStringFromRoutes(routes: Route[]): string {\n if (!Array.isArray(routes) || routes.length === 0) {\n return '';\n }\n\n const routesWithPaths: Route[] = routes.filter((route: Route) => !!route.path);\n\n let index = -1;\n for (let x = routesWithPaths.length - 1; x >= 0; x--) {\n const route = routesWithPaths[x];\n if (route.path && route.path.startsWith('/')) {\n index = x;\n break;\n }\n }\n\n return routesWithPaths\n .slice(index)\n .filter(({ path }) => !!path)\n .map(({ path }) => path)\n .join('');\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reactrouterv3.js","sources":["../../src/reactrouterv3.ts"],"sourcesContent":["import { WINDOW } from '@sentry/browser';\nimport type { Primitive, Transaction, TransactionContext, TransactionSource } from '@sentry/types';\n\nimport type { Location, ReactRouterInstrumentation } from './types';\n\n// Many of the types below had to be mocked out to prevent typescript issues\n// these types are required for correct functionality.\n\ntype HistoryV3 = {\n location?: Location;\n listen?(cb: (location: Location) => void): void;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n} & Record<string, any>;\n\nexport type Route = { path?: string; childRoutes?: Route[] };\n\nexport type Match = (\n props: { location: Location; routes: Route[] },\n cb: (error?: Error, _redirectLocation?: Location, renderProps?: { routes?: Route[] }) => void,\n) => void;\n\ntype ReactRouterV3TransactionSource = Extract<TransactionSource, 'url' | 'route'>;\n\n/**\n * Creates routing instrumentation for React Router v3\n * Works for React Router >= 3.2.0 and < 4.0.0\n *\n * @param history object from the `history` library\n * @param routes a list of all routes, should be\n * @param match `Router.match` utility\n */\nexport function reactRouterV3Instrumentation(\n history: HistoryV3,\n routes: Route[],\n match: Match,\n): ReactRouterInstrumentation {\n return (\n startTransaction: (context: TransactionContext) => Transaction | undefined,\n startTransactionOnPageLoad: boolean = true,\n startTransactionOnLocationChange: boolean = true,\n ) => {\n let activeTransaction: Transaction | undefined;\n let prevName: string | undefined;\n\n // Have to use window.location because history.location might not be defined.\n if (startTransactionOnPageLoad && WINDOW && WINDOW.location) {\n normalizeTransactionName(\n routes,\n WINDOW.location as unknown as Location,\n match,\n (localName: string, source: ReactRouterV3TransactionSource = 'url') => {\n prevName = localName;\n activeTransaction = startTransaction({\n name: prevName,\n op: 'pageload',\n origin: 'auto.pageload.react.reactrouterv3',\n tags: {\n 'routing.instrumentation': 'react-router-v3',\n },\n metadata: {\n source,\n },\n });\n },\n );\n }\n\n if (startTransactionOnLocationChange && history.listen) {\n history.listen(location => {\n if (location.action === 'PUSH' || location.action === 'POP') {\n if (activeTransaction) {\n activeTransaction.finish();\n }\n const tags: Record<string, Primitive> = {\n 'routing.instrumentation': 'react-router-v3',\n };\n if (prevName) {\n tags.from = prevName;\n }\n normalizeTransactionName(routes, location, match, (localName: string, source: TransactionSource = 'url') => {\n prevName = localName;\n activeTransaction = startTransaction({\n name: prevName,\n op: 'navigation',\n origin: 'auto.navigation.react.reactrouterv3',\n tags,\n metadata: {\n source,\n },\n });\n });\n }\n });\n }\n };\n}\n\n/**\n * Normalize transaction names using `Router.match`\n */\nfunction normalizeTransactionName(\n appRoutes: Route[],\n location: Location,\n match: Match,\n callback: (pathname: string, source?: ReactRouterV3TransactionSource) => void,\n): void {\n let name = location.pathname;\n match(\n {\n location,\n routes: appRoutes,\n },\n (error, _redirectLocation, renderProps) => {\n if (error || !renderProps) {\n return callback(name);\n }\n\n const routePath = getRouteStringFromRoutes(renderProps.routes || []);\n if (routePath.length === 0 || routePath === '/*') {\n return callback(name);\n }\n\n name = routePath;\n return callback(name, 'route');\n },\n );\n}\n\n/**\n * Generate route name from array of routes\n */\nfunction getRouteStringFromRoutes(routes: Route[]): string {\n if (!Array.isArray(routes) || routes.length === 0) {\n return '';\n }\n\n const routesWithPaths: Route[] = routes.filter((route: Route) => !!route.path);\n\n let index = -1;\n for (let x = routesWithPaths.length - 1; x >= 0; x--) {\n const route = routesWithPaths[x];\n if (route.path && route.path.startsWith('/')) {\n index = x;\n break;\n }\n }\n\n return routesWithPaths\n .slice(index)\n .filter(({ path }) => !!path)\n .map(({ path }) => path)\n .join('');\n}\n"],"names":[],"mappings":"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"}
@@ -36,6 +36,7 @@ function reactRouterV6Instrumentation(
36
36
  activeTransaction = customStartTransaction({
37
37
  name: initPathName,
38
38
  op: 'pageload',
39
+ origin: 'auto.pageload.react.reactrouterv6',
39
40
  tags: SENTRY_TAGS,
40
41
  metadata: {
41
42
  source: 'url',
@@ -133,6 +134,7 @@ function handleNavigation(
133
134
  activeTransaction = _customStartTransaction({
134
135
  name,
135
136
  op: 'navigation',
137
+ origin: 'auto.navigation.react.reactrouterv6',
136
138
  tags: SENTRY_TAGS,
137
139
  metadata: {
138
140
  source,
@@ -183,7 +185,7 @@ function withSentryReactRouterV6Routing(Routes) {
183
185
 
184
186
  // @ts-ignore Setting more specific React Component typing for `R` generic above
185
187
  // will break advanced type inference done by react router params
186
- return React.createElement(Routes, { ...props, __self: this, __source: {fileName: _jsxFileName, lineNumber: 205}} );
188
+ return React.createElement(Routes, { ...props, __self: this, __source: {fileName: _jsxFileName, lineNumber: 207}} );
187
189
  };
188
190
 
189
191
  hoistNonReactStatics(SentryRoutes, Routes);
@@ -234,7 +236,7 @@ function wrapUseRoutes(origUseRoutes) {
234
236
  return Routes;
235
237
  };
236
238
 
237
- return React.createElement(SentryRoutes, {__self: this, __source: {fileName: _jsxFileName, lineNumber: 256}} );
239
+ return React.createElement(SentryRoutes, {__self: this, __source: {fileName: _jsxFileName, lineNumber: 258}} );
238
240
  };
239
241
  }
240
242
 
@@ -1 +1 @@
1
- {"version":3,"file":"reactrouterv6.js","sources":["../../src/reactrouterv6.tsx"],"sourcesContent":["// Inspired from Donnie McNeal's solution:\n// https://gist.github.com/wontondon/e8c4bdf2888875e4c755712e99279536\n\nimport { WINDOW } from '@sentry/browser';\nimport type { Transaction, TransactionContext, TransactionSource } from '@sentry/types';\nimport { getNumberOfUrlSegments, logger } from '@sentry/utils';\nimport hoistNonReactStatics from 'hoist-non-react-statics';\nimport * as React from 'react';\n\nimport type {\n Action,\n AgnosticDataRouteMatch,\n CreateRouterFunction,\n CreateRoutesFromChildren,\n Location,\n MatchRoutes,\n RouteMatch,\n RouteObject,\n Router,\n RouterState,\n UseEffect,\n UseLocation,\n UseNavigationType,\n UseRoutes,\n} from './types';\n\nlet activeTransaction: Transaction | undefined;\n\nlet _useEffect: UseEffect;\nlet _useLocation: UseLocation;\nlet _useNavigationType: UseNavigationType;\nlet _createRoutesFromChildren: CreateRoutesFromChildren;\nlet _matchRoutes: MatchRoutes;\nlet _customStartTransaction: (context: TransactionContext) => Transaction | undefined;\nlet _startTransactionOnLocationChange: boolean;\n\nconst SENTRY_TAGS = {\n 'routing.instrumentation': 'react-router-v6',\n};\n\nexport function reactRouterV6Instrumentation(\n useEffect: UseEffect,\n useLocation: UseLocation,\n useNavigationType: UseNavigationType,\n createRoutesFromChildren: CreateRoutesFromChildren,\n matchRoutes: MatchRoutes,\n) {\n return (\n customStartTransaction: (context: TransactionContext) => Transaction | undefined,\n startTransactionOnPageLoad = true,\n startTransactionOnLocationChange = true,\n ): void => {\n const initPathName = WINDOW && WINDOW.location && WINDOW.location.pathname;\n if (startTransactionOnPageLoad && initPathName) {\n activeTransaction = customStartTransaction({\n name: initPathName,\n op: 'pageload',\n tags: SENTRY_TAGS,\n metadata: {\n source: 'url',\n },\n });\n }\n\n _useEffect = useEffect;\n _useLocation = useLocation;\n _useNavigationType = useNavigationType;\n _matchRoutes = matchRoutes;\n _createRoutesFromChildren = createRoutesFromChildren;\n\n _customStartTransaction = customStartTransaction;\n _startTransactionOnLocationChange = startTransactionOnLocationChange;\n };\n}\n\nfunction getNormalizedName(\n routes: RouteObject[],\n location: Location,\n branches: RouteMatch[],\n): [string, TransactionSource] {\n if (!routes || routes.length === 0) {\n return [location.pathname, 'url'];\n }\n\n let pathBuilder = '';\n if (branches) {\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let x = 0; x < branches.length; x++) {\n const branch = branches[x];\n const route = branch.route;\n if (route) {\n // Early return if index route\n if (route.index) {\n return [branch.pathname, 'route'];\n }\n\n const path = route.path;\n if (path) {\n const newPath = path[0] === '/' || pathBuilder[pathBuilder.length - 1] === '/' ? path : `/${path}`;\n pathBuilder += newPath;\n if (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 [newPath, 'route'];\n }\n return [pathBuilder, 'route'];\n }\n }\n }\n }\n }\n\n return [location.pathname, 'url'];\n}\n\nfunction updatePageloadTransaction(\n location: Location,\n routes: RouteObject[],\n matches?: AgnosticDataRouteMatch,\n basename?: string,\n): void {\n const branches = Array.isArray(matches)\n ? matches\n : (_matchRoutes(routes, location, basename) as unknown as RouteMatch[]);\n\n if (activeTransaction && branches) {\n activeTransaction.setName(...getNormalizedName(routes, location, branches));\n }\n}\n\nfunction handleNavigation(\n location: Location,\n routes: RouteObject[],\n navigationType: Action,\n matches?: AgnosticDataRouteMatch,\n basename?: string,\n): void {\n const branches = Array.isArray(matches) ? matches : _matchRoutes(routes, location, basename);\n\n if (_startTransactionOnLocationChange && (navigationType === 'PUSH' || navigationType === 'POP') && branches) {\n if (activeTransaction) {\n activeTransaction.finish();\n }\n\n const [name, source] = getNormalizedName(routes, location, branches);\n activeTransaction = _customStartTransaction({\n name,\n op: 'navigation',\n tags: SENTRY_TAGS,\n metadata: {\n source,\n },\n });\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function withSentryReactRouterV6Routing<P extends Record<string, any>, R extends React.FC<P>>(Routes: R): R {\n if (\n !_useEffect ||\n !_useLocation ||\n !_useNavigationType ||\n !_createRoutesFromChildren ||\n !_matchRoutes ||\n !_customStartTransaction\n ) {\n __DEBUG_BUILD__ &&\n logger.warn(`reactRouterV6Instrumentation was unable to wrap Routes because of one or more missing parameters.\n useEffect: ${_useEffect}. useLocation: ${_useLocation}. useNavigationType: ${_useNavigationType}.\n createRoutesFromChildren: ${_createRoutesFromChildren}. matchRoutes: ${_matchRoutes}. customStartTransaction: ${_customStartTransaction}.`);\n\n return Routes;\n }\n\n let isMountRenderPass: boolean = true;\n\n const SentryRoutes: React.FC<P> = (props: P) => {\n const location = _useLocation();\n const navigationType = _useNavigationType();\n\n _useEffect(\n () => {\n const routes = _createRoutesFromChildren(props.children) as RouteObject[];\n\n if (isMountRenderPass) {\n updatePageloadTransaction(location, routes);\n isMountRenderPass = false;\n } else {\n handleNavigation(location, routes, navigationType);\n }\n },\n // `props.children` is purpusely not included in the dependency array, because we do not want to re-run this effect\n // when the children change. We only want to start transactions when the location or navigation type change.\n [location, navigationType],\n );\n\n // @ts-ignore 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-ignore Setting more specific React Component typing for `R` generic above\n // will break advanced type inference done by react router params\n return SentryRoutes;\n}\n\nexport function wrapUseRoutes(origUseRoutes: UseRoutes): UseRoutes {\n if (!_useEffect || !_useLocation || !_useNavigationType || !_matchRoutes || !_customStartTransaction) {\n __DEBUG_BUILD__ &&\n logger.warn(\n 'reactRouterV6Instrumentation was unable to wrap `useRoutes` because of one or more missing parameters.',\n );\n\n return origUseRoutes;\n }\n\n let isMountRenderPass: boolean = true;\n\n // eslint-disable-next-line react/display-name\n return (routes: RouteObject[], locationArg?: Partial<Location> | string): React.ReactElement | null => {\n const SentryRoutes: React.FC<unknown> = () => {\n const Routes = origUseRoutes(routes, locationArg);\n\n const location = _useLocation();\n const navigationType = _useNavigationType();\n\n // A value with stable identity to either pick `locationArg` if available or `location` if not\n const stableLocationParam =\n typeof locationArg === 'string' || (locationArg && locationArg.pathname)\n ? (locationArg as { pathname: string })\n : location;\n\n _useEffect(() => {\n const normalizedLocation =\n typeof stableLocationParam === 'string' ? { pathname: stableLocationParam } : stableLocationParam;\n\n if (isMountRenderPass) {\n updatePageloadTransaction(normalizedLocation, routes);\n isMountRenderPass = false;\n } else {\n handleNavigation(normalizedLocation, routes, navigationType);\n }\n }, [navigationType, stableLocationParam]);\n\n return Routes;\n };\n\n return <SentryRoutes />;\n };\n}\n\nexport function wrapCreateBrowserRouter<\n TState extends RouterState = RouterState,\n TRouter extends Router<TState> = Router<TState>,\n>(createRouterFunction: CreateRouterFunction<TState, TRouter>): CreateRouterFunction<TState, TRouter> {\n // `opts` for createBrowserHistory and createMemoryHistory are different, but also not relevant for us at the moment.\n // `basename` is the only option that is relevant for us, and it is the same for all.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return function (routes: RouteObject[], opts?: Record<string, any> & { basename?: string }): TRouter {\n const router = createRouterFunction(routes, opts);\n const basename = opts && opts.basename;\n\n // The initial load ends when `createBrowserRouter` is called.\n // This is the earliest convenient time to update the transaction name.\n // Callbacks to `router.subscribe` are not called for the initial load.\n if (router.state.historyAction === 'POP' && activeTransaction) {\n updatePageloadTransaction(router.state.location, routes, undefined, basename);\n }\n\n router.subscribe((state: RouterState) => {\n const location = state.location;\n\n if (\n _startTransactionOnLocationChange &&\n (state.historyAction === 'PUSH' || state.historyAction === 'POP') &&\n activeTransaction\n ) {\n handleNavigation(location, routes, state.historyAction, undefined, basename);\n }\n });\n\n return router;\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reactrouterv6.js","sources":["../../src/reactrouterv6.tsx"],"sourcesContent":["// Inspired from Donnie McNeal's solution:\n// https://gist.github.com/wontondon/e8c4bdf2888875e4c755712e99279536\n\nimport { WINDOW } from '@sentry/browser';\nimport type { Transaction, TransactionContext, TransactionSource } from '@sentry/types';\nimport { getNumberOfUrlSegments, logger } from '@sentry/utils';\nimport hoistNonReactStatics from 'hoist-non-react-statics';\nimport * as React from 'react';\n\nimport type {\n Action,\n AgnosticDataRouteMatch,\n CreateRouterFunction,\n CreateRoutesFromChildren,\n Location,\n MatchRoutes,\n RouteMatch,\n RouteObject,\n Router,\n RouterState,\n UseEffect,\n UseLocation,\n UseNavigationType,\n UseRoutes,\n} from './types';\n\nlet activeTransaction: Transaction | undefined;\n\nlet _useEffect: UseEffect;\nlet _useLocation: UseLocation;\nlet _useNavigationType: UseNavigationType;\nlet _createRoutesFromChildren: CreateRoutesFromChildren;\nlet _matchRoutes: MatchRoutes;\nlet _customStartTransaction: (context: TransactionContext) => Transaction | undefined;\nlet _startTransactionOnLocationChange: boolean;\n\nconst SENTRY_TAGS = {\n 'routing.instrumentation': 'react-router-v6',\n};\n\nexport function reactRouterV6Instrumentation(\n useEffect: UseEffect,\n useLocation: UseLocation,\n useNavigationType: UseNavigationType,\n createRoutesFromChildren: CreateRoutesFromChildren,\n matchRoutes: MatchRoutes,\n) {\n return (\n customStartTransaction: (context: TransactionContext) => Transaction | undefined,\n startTransactionOnPageLoad = true,\n startTransactionOnLocationChange = true,\n ): void => {\n const initPathName = WINDOW && WINDOW.location && WINDOW.location.pathname;\n if (startTransactionOnPageLoad && initPathName) {\n activeTransaction = customStartTransaction({\n name: initPathName,\n op: 'pageload',\n origin: 'auto.pageload.react.reactrouterv6',\n tags: SENTRY_TAGS,\n metadata: {\n source: 'url',\n },\n });\n }\n\n _useEffect = useEffect;\n _useLocation = useLocation;\n _useNavigationType = useNavigationType;\n _matchRoutes = matchRoutes;\n _createRoutesFromChildren = createRoutesFromChildren;\n\n _customStartTransaction = customStartTransaction;\n _startTransactionOnLocationChange = startTransactionOnLocationChange;\n };\n}\n\nfunction getNormalizedName(\n routes: RouteObject[],\n location: Location,\n branches: RouteMatch[],\n): [string, TransactionSource] {\n if (!routes || routes.length === 0) {\n return [location.pathname, 'url'];\n }\n\n let pathBuilder = '';\n if (branches) {\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let x = 0; x < branches.length; x++) {\n const branch = branches[x];\n const route = branch.route;\n if (route) {\n // Early return if index route\n if (route.index) {\n return [branch.pathname, 'route'];\n }\n\n const path = route.path;\n if (path) {\n const newPath = path[0] === '/' || pathBuilder[pathBuilder.length - 1] === '/' ? path : `/${path}`;\n pathBuilder += newPath;\n if (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 [newPath, 'route'];\n }\n return [pathBuilder, 'route'];\n }\n }\n }\n }\n }\n\n return [location.pathname, 'url'];\n}\n\nfunction updatePageloadTransaction(\n location: Location,\n routes: RouteObject[],\n matches?: AgnosticDataRouteMatch,\n basename?: string,\n): void {\n const branches = Array.isArray(matches)\n ? matches\n : (_matchRoutes(routes, location, basename) as unknown as RouteMatch[]);\n\n if (activeTransaction && branches) {\n activeTransaction.setName(...getNormalizedName(routes, location, branches));\n }\n}\n\nfunction handleNavigation(\n location: Location,\n routes: RouteObject[],\n navigationType: Action,\n matches?: AgnosticDataRouteMatch,\n basename?: string,\n): void {\n const branches = Array.isArray(matches) ? matches : _matchRoutes(routes, location, basename);\n\n if (_startTransactionOnLocationChange && (navigationType === 'PUSH' || navigationType === 'POP') && branches) {\n if (activeTransaction) {\n activeTransaction.finish();\n }\n\n const [name, source] = getNormalizedName(routes, location, branches);\n activeTransaction = _customStartTransaction({\n name,\n op: 'navigation',\n origin: 'auto.navigation.react.reactrouterv6',\n tags: SENTRY_TAGS,\n metadata: {\n source,\n },\n });\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function withSentryReactRouterV6Routing<P extends Record<string, any>, R extends React.FC<P>>(Routes: R): R {\n if (\n !_useEffect ||\n !_useLocation ||\n !_useNavigationType ||\n !_createRoutesFromChildren ||\n !_matchRoutes ||\n !_customStartTransaction\n ) {\n __DEBUG_BUILD__ &&\n logger.warn(`reactRouterV6Instrumentation was unable to wrap Routes because of one or more missing parameters.\n useEffect: ${_useEffect}. useLocation: ${_useLocation}. useNavigationType: ${_useNavigationType}.\n createRoutesFromChildren: ${_createRoutesFromChildren}. matchRoutes: ${_matchRoutes}. customStartTransaction: ${_customStartTransaction}.`);\n\n return Routes;\n }\n\n let isMountRenderPass: boolean = true;\n\n const SentryRoutes: React.FC<P> = (props: P) => {\n const location = _useLocation();\n const navigationType = _useNavigationType();\n\n _useEffect(\n () => {\n const routes = _createRoutesFromChildren(props.children) as RouteObject[];\n\n if (isMountRenderPass) {\n updatePageloadTransaction(location, routes);\n isMountRenderPass = false;\n } else {\n handleNavigation(location, routes, navigationType);\n }\n },\n // `props.children` is purpusely not included in the dependency array, because we do not want to re-run this effect\n // when the children change. We only want to start transactions when the location or navigation type change.\n [location, navigationType],\n );\n\n // @ts-ignore 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-ignore Setting more specific React Component typing for `R` generic above\n // will break advanced type inference done by react router params\n return SentryRoutes;\n}\n\nexport function wrapUseRoutes(origUseRoutes: UseRoutes): UseRoutes {\n if (!_useEffect || !_useLocation || !_useNavigationType || !_matchRoutes || !_customStartTransaction) {\n __DEBUG_BUILD__ &&\n logger.warn(\n 'reactRouterV6Instrumentation was unable to wrap `useRoutes` because of one or more missing parameters.',\n );\n\n return origUseRoutes;\n }\n\n let isMountRenderPass: boolean = true;\n\n // eslint-disable-next-line react/display-name\n return (routes: RouteObject[], locationArg?: Partial<Location> | string): React.ReactElement | null => {\n const SentryRoutes: React.FC<unknown> = () => {\n const Routes = origUseRoutes(routes, locationArg);\n\n const location = _useLocation();\n const navigationType = _useNavigationType();\n\n // A value with stable identity to either pick `locationArg` if available or `location` if not\n const stableLocationParam =\n typeof locationArg === 'string' || (locationArg && locationArg.pathname)\n ? (locationArg as { pathname: string })\n : location;\n\n _useEffect(() => {\n const normalizedLocation =\n typeof stableLocationParam === 'string' ? { pathname: stableLocationParam } : stableLocationParam;\n\n if (isMountRenderPass) {\n updatePageloadTransaction(normalizedLocation, routes);\n isMountRenderPass = false;\n } else {\n handleNavigation(normalizedLocation, routes, navigationType);\n }\n }, [navigationType, stableLocationParam]);\n\n return Routes;\n };\n\n return <SentryRoutes />;\n };\n}\n\nexport function wrapCreateBrowserRouter<\n TState extends RouterState = RouterState,\n TRouter extends Router<TState> = Router<TState>,\n>(createRouterFunction: CreateRouterFunction<TState, TRouter>): CreateRouterFunction<TState, TRouter> {\n // `opts` for createBrowserHistory and createMemoryHistory are different, but also not relevant for us at the moment.\n // `basename` is the only option that is relevant for us, and it is the same for all.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return function (routes: RouteObject[], opts?: Record<string, any> & { basename?: string }): TRouter {\n const router = createRouterFunction(routes, opts);\n const basename = opts && opts.basename;\n\n // The initial load ends when `createBrowserRouter` is called.\n // This is the earliest convenient time to update the transaction name.\n // Callbacks to `router.subscribe` are not called for the initial load.\n if (router.state.historyAction === 'POP' && activeTransaction) {\n updatePageloadTransaction(router.state.location, routes, undefined, basename);\n }\n\n router.subscribe((state: RouterState) => {\n const location = state.location;\n\n if (\n _startTransactionOnLocationChange &&\n (state.historyAction === 'PUSH' || state.historyAction === 'POP') &&\n activeTransaction\n ) {\n handleNavigation(location, routes, state.historyAction, undefined, basename);\n }\n });\n\n return router;\n };\n}\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sentry/react",
3
- "version": "7.66.0-alpha.0",
3
+ "version": "7.66.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",
@@ -23,9 +23,9 @@
23
23
  "access": "public"
24
24
  },
25
25
  "dependencies": {
26
- "@sentry/browser": "7.66.0-alpha.0",
27
- "@sentry/types": "7.66.0-alpha.0",
28
- "@sentry/utils": "7.66.0-alpha.0",
26
+ "@sentry/browser": "7.66.0",
27
+ "@sentry/types": "7.66.0",
28
+ "@sentry/utils": "7.66.0",
29
29
  "hoist-non-react-statics": "^3.3.2",
30
30
  "tslib": "^2.4.1 || ^1.9.3"
31
31
  },
@@ -1 +1 @@
1
- {"version":3,"file":"profiler.d.ts","sourceRoot":"","sources":["../../src/profiler.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAE3C,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAGvD,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,eAAO,MAAM,iBAAiB,YAAY,CAAC;AAE3C,MAAM,MAAM,aAAa,GAAG;IAE1B,IAAI,EAAE,MAAM,CAAC;IAGb,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAE3B,WAAW,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;CACzC,CAAC;AAEF;;;GAGG;AACH,cAAM,QAAS,SAAQ,KAAK,CAAC,SAAS,CAAC,aAAa,CAAC;IACnD;;;OAGG;IACH,SAAS,CAAC,UAAU,EAAE,IAAI,GAAG,SAAS,CAAC;IACvC;;OAEG;IACH,SAAS,CAAC,WAAW,EAAE,IAAI,GAAG,SAAS,CAAC;IAGxC,OAAc,YAAY,EAAE,OAAO,CAAC,aAAa,CAAC,CAIhD;gBAEiB,KAAK,EAAE,aAAa;IAkBhC,iBAAiB,IAAI,IAAI;IAMzB,qBAAqB,CAAC,EAAE,WAAW,EAAE,cAAqB,EAAE,EAAE,aAAa,GAAG,OAAO;IAwBrF,kBAAkB,IAAI,IAAI;IAS1B,oBAAoB,IAAI,IAAI;IAe5B,MAAM,IAAI,KAAK,CAAC,SAAS;CAGjC;AAED;;;;;;;GAOG;AACH,iBAAS,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACjD,gBAAgB,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EAExC,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC,MAAM,aAAa,EAAE,aAAa,GAAG,UAAU,CAAC,CAAC,GAC/F,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAgBb;AAED;;;;;;GAMG;AACH,iBAAS,WAAW,CAClB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CAGrD,GACA,IAAI,CAmCN;AAED,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;AAE/C,yCAAyC;AACzC,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,WAAW,EAAE,GAAG,GAAE,GAAqB,GAAG,CAAC,GAAG,SAAS,CASrG"}
1
+ {"version":3,"file":"profiler.d.ts","sourceRoot":"","sources":["../../src/profiler.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAE3C,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAGvD,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,eAAO,MAAM,iBAAiB,YAAY,CAAC;AAE3C,MAAM,MAAM,aAAa,GAAG;IAE1B,IAAI,EAAE,MAAM,CAAC;IAGb,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAE3B,WAAW,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;CACzC,CAAC;AAEF;;;GAGG;AACH,cAAM,QAAS,SAAQ,KAAK,CAAC,SAAS,CAAC,aAAa,CAAC;IACnD;;;OAGG;IACH,SAAS,CAAC,UAAU,EAAE,IAAI,GAAG,SAAS,CAAC;IACvC;;OAEG;IACH,SAAS,CAAC,WAAW,EAAE,IAAI,GAAG,SAAS,CAAC;IAGxC,OAAc,YAAY,EAAE,OAAO,CAAC,aAAa,CAAC,CAIhD;gBAEiB,KAAK,EAAE,aAAa;IAmBhC,iBAAiB,IAAI,IAAI;IAMzB,qBAAqB,CAAC,EAAE,WAAW,EAAE,cAAqB,EAAE,EAAE,aAAa,GAAG,OAAO;IAyBrF,kBAAkB,IAAI,IAAI;IAS1B,oBAAoB,IAAI,IAAI;IAgB5B,MAAM,IAAI,KAAK,CAAC,SAAS;CAGjC;AAED;;;;;;;GAOG;AACH,iBAAS,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACjD,gBAAgB,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EAExC,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC,MAAM,aAAa,EAAE,aAAa,GAAG,UAAU,CAAC,CAAC,GAC/F,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAgBb;AAED;;;;;;GAMG;AACH,iBAAS,WAAW,CAClB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CAGrD,GACA,IAAI,CAqCN;AAED,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;AAE/C,yCAAyC;AACzC,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,WAAW,EAAE,GAAG,GAAE,GAAqB,GAAG,CAAC,GAAG,SAAS,CASrG"}
@@ -1 +1 @@
1
- {"version":3,"file":"reactrouter.d.ts","sourceRoot":"","sources":["../../src/reactrouter.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAC;AAI5E,KAAK,KAAK,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AAE1F,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;CACjE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAExB,MAAM,MAAM,WAAW,GAAG;IACxB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;CACxB,CAAC;AAEF,KAAK,SAAS,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,IAAI,CAAC;AAI3G,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,aAAa,EACtB,MAAM,CAAC,EAAE,WAAW,EAAE,EACtB,SAAS,CAAC,EAAE,SAAS,GACpB,0BAA0B,CAE5B;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,aAAa,EACtB,MAAM,CAAC,EAAE,WAAW,EAAE,EACtB,SAAS,CAAC,EAAE,SAAS,GACpB,0BAA0B,CAE5B;AAsHD,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,SAAS,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAoB9G"}
1
+ {"version":3,"file":"reactrouter.d.ts","sourceRoot":"","sources":["../../src/reactrouter.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAC;AAI5E,KAAK,KAAK,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AAE1F,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;CACjE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAExB,MAAM,MAAM,WAAW,GAAG;IACxB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;CACxB,CAAC;AAEF,KAAK,SAAS,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,IAAI,CAAC;AAI3G,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,aAAa,EACtB,MAAM,CAAC,EAAE,WAAW,EAAE,EACtB,SAAS,CAAC,EAAE,SAAS,GACpB,0BAA0B,CAE5B;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,aAAa,EACtB,MAAM,CAAC,EAAE,WAAW,EAAE,EACtB,SAAS,CAAC,EAAE,SAAS,GACpB,0BAA0B,CAE5B;AAwHD,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,SAAS,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAoB9G"}
@@ -1 +1 @@
1
- {"version":3,"file":"reactrouterv3.d.ts","sourceRoot":"","sources":["../../src/reactrouterv3.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAC;AAKpE,KAAK,SAAS,GAAG;IACf,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,GAAG,IAAI,CAAC;CAEjD,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAExB,MAAM,MAAM,KAAK,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,KAAK,EAAE,CAAA;CAAE,CAAC;AAE7D,MAAM,MAAM,KAAK,GAAG,CAClB,KAAK,EAAE;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,KAAK,EAAE,CAAA;CAAE,EAC9C,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,iBAAiB,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,KAAK,EAAE,CAAA;CAAE,KAAK,IAAI,KAC1F,IAAI,CAAC;AAIV;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,SAAS,EAClB,MAAM,EAAE,KAAK,EAAE,EACf,KAAK,EAAE,KAAK,GACX,0BAA0B,CA0D5B"}
1
+ {"version":3,"file":"reactrouterv3.d.ts","sourceRoot":"","sources":["../../src/reactrouterv3.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAC;AAKpE,KAAK,SAAS,GAAG;IACf,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,GAAG,IAAI,CAAC;CAEjD,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAExB,MAAM,MAAM,KAAK,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,KAAK,EAAE,CAAA;CAAE,CAAC;AAE7D,MAAM,MAAM,KAAK,GAAG,CAClB,KAAK,EAAE;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,KAAK,EAAE,CAAA;CAAE,EAC9C,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,iBAAiB,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,KAAK,EAAE,CAAA;CAAE,KAAK,IAAI,KAC1F,IAAI,CAAC;AAIV;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,SAAS,EAClB,MAAM,EAAE,KAAK,EAAE,EACf,KAAK,EAAE,KAAK,GACX,0BAA0B,CA4D5B"}
@@ -1 +1 @@
1
- {"version":3,"file":"reactrouterv6.d.ts","sourceRoot":"","sources":["../../src/reactrouterv6.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAqB,MAAM,eAAe,CAAC;AAGxF,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAGV,oBAAoB,EACpB,wBAAwB,EAExB,WAAW,EAGX,MAAM,EACN,WAAW,EACX,SAAS,EACT,WAAW,EACX,iBAAiB,EACjB,SAAS,EACV,MAAM,SAAS,CAAC;AAgBjB,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,WAAW,EACxB,iBAAiB,EAAE,iBAAiB,EACpC,wBAAwB,EAAE,wBAAwB,EAClD,WAAW,EAAE,WAAW,sCAGY,kBAAkB,KAAK,WAAW,GAAG,SAAS,uFAG/E,IAAI,CAsBR;AA0FD,wBAAgB,8BAA8B,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,SAAS,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAiDjH;AAED,wBAAgB,aAAa,CAAC,aAAa,EAAE,SAAS,GAAG,SAAS,CA2CjE;AAED,wBAAgB,uBAAuB,CACrC,MAAM,SAAS,WAAW,GAAG,WAAW,EACxC,OAAO,SAAS,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,EAC/C,oBAAoB,EAAE,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,CA6BpG"}
1
+ {"version":3,"file":"reactrouterv6.d.ts","sourceRoot":"","sources":["../../src/reactrouterv6.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAqB,MAAM,eAAe,CAAC;AAGxF,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAGV,oBAAoB,EACpB,wBAAwB,EAExB,WAAW,EAGX,MAAM,EACN,WAAW,EACX,SAAS,EACT,WAAW,EACX,iBAAiB,EACjB,SAAS,EACV,MAAM,SAAS,CAAC;AAgBjB,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,WAAW,EACxB,iBAAiB,EAAE,iBAAiB,EACpC,wBAAwB,EAAE,wBAAwB,EAClD,WAAW,EAAE,WAAW,sCAGY,kBAAkB,KAAK,WAAW,GAAG,SAAS,uFAG/E,IAAI,CAuBR;AA2FD,wBAAgB,8BAA8B,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,SAAS,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAiDjH;AAED,wBAAgB,aAAa,CAAC,aAAa,EAAE,SAAS,GAAG,SAAS,CA2CjE;AAED,wBAAgB,uBAAuB,CACrC,MAAM,SAAS,WAAW,GAAG,WAAW,EACxC,OAAO,SAAS,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,EAC/C,oBAAoB,EAAE,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,CA6BpG"}