@sentry/react 7.98.0 → 7.100.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
- import { WINDOW } from '@sentry/browser';
2
- import { SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from '@sentry/core';
1
+ import { browserTracingIntegration, startBrowserTracingPageLoadSpan, startBrowserTracingNavigationSpan, WINDOW } from '@sentry/browser';
2
+ import { SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, getActiveSpan, getRootSpan, spanToJSON } from '@sentry/core';
3
3
  import hoistNonReactStatics from 'hoist-non-react-statics';
4
4
  import * as React from 'react';
5
5
 
@@ -7,29 +7,113 @@ const _jsxFileName = "/home/runner/work/sentry-javascript/sentry-javascript/pack
7
7
  // We need to disable eslint no-explict-any because any is required for the
8
8
  // react-router typings.
9
9
 
10
- // eslint-disable-line @typescript-eslint/no-explicit-any
11
-
12
10
  let activeTransaction;
13
11
 
12
+ /**
13
+ * A browser tracing integration that uses React Router v4 to instrument navigations.
14
+ * Expects `history` (and optionally `routes` and `matchPath`) to be passed as options.
15
+ */
16
+ function reactRouterV4BrowserTracingIntegration(
17
+ options,
18
+ ) {
19
+ const integration = browserTracingIntegration({
20
+ ...options,
21
+ instrumentPageLoad: false,
22
+ instrumentNavigation: false,
23
+ });
24
+
25
+ const { history, routes, matchPath, instrumentPageLoad = true, instrumentNavigation = true } = options;
26
+
27
+ return {
28
+ ...integration,
29
+ afterAllSetup(client) {
30
+ integration.afterAllSetup(client);
31
+
32
+ const startPageloadCallback = (startSpanOptions) => {
33
+ startBrowserTracingPageLoadSpan(client, startSpanOptions);
34
+ return undefined;
35
+ };
36
+
37
+ const startNavigationCallback = (startSpanOptions) => {
38
+ startBrowserTracingNavigationSpan(client, startSpanOptions);
39
+ return undefined;
40
+ };
41
+
42
+ // eslint-disable-next-line deprecation/deprecation
43
+ const instrumentation = reactRouterV4Instrumentation(history, routes, matchPath);
44
+
45
+ // Now instrument page load & navigation with correct settings
46
+ instrumentation(startPageloadCallback, instrumentPageLoad, false);
47
+ instrumentation(startNavigationCallback, false, instrumentNavigation);
48
+ },
49
+ };
50
+ }
51
+
52
+ /**
53
+ * A browser tracing integration that uses React Router v5 to instrument navigations.
54
+ * Expects `history` (and optionally `routes` and `matchPath`) to be passed as options.
55
+ */
56
+ function reactRouterV5BrowserTracingIntegration(
57
+ options,
58
+ ) {
59
+ const integration = browserTracingIntegration({
60
+ ...options,
61
+ instrumentPageLoad: false,
62
+ instrumentNavigation: false,
63
+ });
64
+
65
+ const { history, routes, matchPath } = options;
66
+
67
+ return {
68
+ ...integration,
69
+ afterAllSetup(client) {
70
+ integration.afterAllSetup(client);
71
+
72
+ const startPageloadCallback = (startSpanOptions) => {
73
+ startBrowserTracingPageLoadSpan(client, startSpanOptions);
74
+ return undefined;
75
+ };
76
+
77
+ const startNavigationCallback = (startSpanOptions) => {
78
+ startBrowserTracingNavigationSpan(client, startSpanOptions);
79
+ return undefined;
80
+ };
81
+
82
+ // eslint-disable-next-line deprecation/deprecation
83
+ const instrumentation = reactRouterV5Instrumentation(history, routes, matchPath);
84
+
85
+ // Now instrument page load & navigation with correct settings
86
+ instrumentation(startPageloadCallback, options.instrumentPageLoad, false);
87
+ instrumentation(startNavigationCallback, false, options.instrumentNavigation);
88
+ },
89
+ };
90
+ }
91
+
92
+ /**
93
+ * @deprecated Use `browserTracingReactRouterV4()` instead.
94
+ */
14
95
  function reactRouterV4Instrumentation(
15
96
  history,
16
97
  routes,
17
98
  matchPath,
18
99
  ) {
19
- return createReactRouterInstrumentation(history, 'react-router-v4', routes, matchPath);
100
+ return createReactRouterInstrumentation(history, 'reactrouter_v4', routes, matchPath);
20
101
  }
21
102
 
103
+ /**
104
+ * @deprecated Use `browserTracingReactRouterV5()` instead.
105
+ */
22
106
  function reactRouterV5Instrumentation(
23
107
  history,
24
108
  routes,
25
109
  matchPath,
26
110
  ) {
27
- return createReactRouterInstrumentation(history, 'react-router-v5', routes, matchPath);
111
+ return createReactRouterInstrumentation(history, 'reactrouter_v5', routes, matchPath);
28
112
  }
29
113
 
30
114
  function createReactRouterInstrumentation(
31
115
  history,
32
- name,
116
+ instrumentationName,
33
117
  allRoutes = [],
34
118
  matchPath,
35
119
  ) {
@@ -67,21 +151,17 @@ function createReactRouterInstrumentation(
67
151
  return [pathname, 'url'];
68
152
  }
69
153
 
70
- const tags = {
71
- 'routing.instrumentation': name,
72
- };
73
-
74
154
  return (customStartTransaction, startTransactionOnPageLoad = true, startTransactionOnLocationChange = true) => {
75
155
  const initPathName = getInitPathName();
156
+
76
157
  if (startTransactionOnPageLoad && initPathName) {
77
158
  const [name, source] = normalizeTransactionName(initPathName);
78
159
  activeTransaction = customStartTransaction({
79
160
  name,
80
- op: 'pageload',
81
- origin: 'auto.pageload.react.reactrouter',
82
- tags,
83
- metadata: {
84
- source,
161
+ attributes: {
162
+ [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'pageload',
163
+ [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: `auto.pageload.react.${instrumentationName}`,
164
+ [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: source,
85
165
  },
86
166
  });
87
167
  }
@@ -96,11 +176,10 @@ function createReactRouterInstrumentation(
96
176
  const [name, source] = normalizeTransactionName(location.pathname);
97
177
  activeTransaction = customStartTransaction({
98
178
  name,
99
- op: 'navigation',
100
- origin: 'auto.navigation.react.reactrouter',
101
- tags,
102
- metadata: {
103
- source,
179
+ attributes: {
180
+ [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'navigation',
181
+ [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: `auto.navigation.react.${instrumentationName}`,
182
+ [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: source,
104
183
  },
105
184
  });
106
185
  }
@@ -148,16 +227,18 @@ function computeRootMatch(pathname) {
148
227
  function withSentryRouting(Route) {
149
228
  const componentDisplayName = (Route ).displayName || (Route ).name;
150
229
 
230
+ const activeRootSpan = getActiveRootSpan();
231
+
151
232
  const WrappedRoute = (props) => {
152
- if (activeTransaction && props && props.computedMatch && props.computedMatch.isExact) {
153
- activeTransaction.updateName(props.computedMatch.path);
154
- activeTransaction.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, 'route');
233
+ if (activeRootSpan && props && props.computedMatch && props.computedMatch.isExact) {
234
+ activeRootSpan.updateName(props.computedMatch.path);
235
+ activeRootSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, 'route');
155
236
  }
156
237
 
157
238
  // @ts-expect-error Setting more specific React Component typing for `R` generic above
158
239
  // will break advanced type inference done by react router params:
159
240
  // https://github.com/DefinitelyTyped/DefinitelyTyped/blob/13dc4235c069e25fe7ee16e11f529d909f9f3ff8/types/react-router/index.d.ts#L154-L164
160
- return React.createElement(Route, { ...props, __self: this, __source: {fileName: _jsxFileName, lineNumber: 176}} );
241
+ return React.createElement(Route, { ...props, __self: this, __source: {fileName: _jsxFileName, lineNumber: 277}} );
161
242
  };
162
243
 
163
244
  WrappedRoute.displayName = `sentryRoute(${componentDisplayName})`;
@@ -169,5 +250,24 @@ function withSentryRouting(Route) {
169
250
  }
170
251
  /* eslint-enable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access */
171
252
 
172
- export { reactRouterV4Instrumentation, reactRouterV5Instrumentation, withSentryRouting };
253
+ function getActiveRootSpan() {
254
+ // Legacy behavior for "old" react router instrumentation
255
+ if (activeTransaction) {
256
+ return activeTransaction;
257
+ }
258
+
259
+ const span = getActiveSpan();
260
+ const rootSpan = span ? getRootSpan(span) : undefined;
261
+
262
+ if (!rootSpan) {
263
+ return undefined;
264
+ }
265
+
266
+ const op = spanToJSON(rootSpan).op;
267
+
268
+ // Only use this root span if it is a pageload or navigation span
269
+ return op === 'navigation' || op === 'pageload' ? rootSpan : undefined;
270
+ }
271
+
272
+ export { reactRouterV4BrowserTracingIntegration, reactRouterV4Instrumentation, reactRouterV5BrowserTracingIntegration, reactRouterV5Instrumentation, withSentryRouting };
173
273
  //# sourceMappingURL=reactrouter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reactrouter.js","sources":["../../src/reactrouter.tsx"],"sourcesContent":["import { WINDOW } from '@sentry/browser';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from '@sentry/core';\nimport type { Transaction, TransactionSource } from '@sentry/types';\nimport hoistNonReactStatics from 'hoist-non-react-statics';\nimport * as React from 'react';\n\nimport type { Action, Location, ReactRouterInstrumentation } from './types';\n\n// We need to disable eslint no-explict-any because any is required for the\n// react-router typings.\ntype Match = { path: string; url: string; params: Record<string, any>; isExact: boolean }; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nexport type RouterHistory = {\n location?: Location;\n listen?(cb: (location: Location, action: Action) => void): void;\n} & Record<string, any>; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nexport type RouteConfig = {\n [propName: string]: unknown;\n path?: string | string[];\n exact?: boolean;\n component?: JSX.Element;\n routes?: RouteConfig[];\n};\n\ntype MatchPath = (pathname: string, props: string | string[] | any, parent?: Match | null) => Match | null; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nlet activeTransaction: Transaction | undefined;\n\nexport function reactRouterV4Instrumentation(\n history: RouterHistory,\n routes?: RouteConfig[],\n matchPath?: MatchPath,\n): ReactRouterInstrumentation {\n return createReactRouterInstrumentation(history, 'react-router-v4', routes, matchPath);\n}\n\nexport function reactRouterV5Instrumentation(\n history: RouterHistory,\n routes?: RouteConfig[],\n matchPath?: MatchPath,\n): ReactRouterInstrumentation {\n return createReactRouterInstrumentation(history, 'react-router-v5', routes, matchPath);\n}\n\nfunction createReactRouterInstrumentation(\n history: RouterHistory,\n name: string,\n allRoutes: RouteConfig[] = [],\n matchPath?: MatchPath,\n): ReactRouterInstrumentation {\n function getInitPathName(): string | undefined {\n if (history && history.location) {\n return history.location.pathname;\n }\n\n if (WINDOW && WINDOW.location) {\n return WINDOW.location.pathname;\n }\n\n return undefined;\n }\n\n /**\n * Normalizes a transaction name. Returns the new name as well as the\n * source of the transaction.\n *\n * @param pathname The initial pathname we normalize\n */\n function normalizeTransactionName(pathname: string): [string, TransactionSource] {\n if (allRoutes.length === 0 || !matchPath) {\n return [pathname, 'url'];\n }\n\n const branches = matchRoutes(allRoutes, pathname, matchPath);\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let x = 0; x < branches.length; x++) {\n if (branches[x].match.isExact) {\n return [branches[x].match.path, 'route'];\n }\n }\n\n return [pathname, 'url'];\n }\n\n const tags = {\n 'routing.instrumentation': name,\n };\n\n return (customStartTransaction, startTransactionOnPageLoad = true, startTransactionOnLocationChange = true): void => {\n const initPathName = getInitPathName();\n if (startTransactionOnPageLoad && initPathName) {\n const [name, source] = normalizeTransactionName(initPathName);\n activeTransaction = customStartTransaction({\n name,\n op: 'pageload',\n origin: 'auto.pageload.react.reactrouter',\n tags,\n metadata: {\n source,\n },\n });\n }\n\n if (startTransactionOnLocationChange && history.listen) {\n history.listen((location, action) => {\n if (action && (action === 'PUSH' || action === 'POP')) {\n if (activeTransaction) {\n activeTransaction.end();\n }\n\n const [name, source] = normalizeTransactionName(location.pathname);\n activeTransaction = customStartTransaction({\n name,\n op: 'navigation',\n origin: 'auto.navigation.react.reactrouter',\n tags,\n metadata: {\n source,\n },\n });\n }\n });\n }\n };\n}\n\n/**\n * Matches a set of routes to a pathname\n * Based on implementation from\n */\nfunction matchRoutes(\n routes: RouteConfig[],\n pathname: string,\n matchPath: MatchPath,\n branch: Array<{ route: RouteConfig; match: Match }> = [],\n): Array<{ route: RouteConfig; match: Match }> {\n routes.some(route => {\n const match = route.path\n ? matchPath(pathname, route)\n : branch.length\n ? branch[branch.length - 1].match // use parent match\n : computeRootMatch(pathname); // use default \"root\" match\n\n if (match) {\n branch.push({ route, match });\n\n if (route.routes) {\n matchRoutes(route.routes, pathname, matchPath, branch);\n }\n }\n\n return !!match;\n });\n\n return branch;\n}\n\nfunction computeRootMatch(pathname: string): Match {\n return { path: '/', url: '/', params: {}, isExact: pathname === '/' };\n}\n\n/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access */\nexport function withSentryRouting<P extends Record<string, any>, R extends React.ComponentType<P>>(Route: R): R {\n const componentDisplayName = (Route as any).displayName || (Route as any).name;\n\n const WrappedRoute: React.FC<P> = (props: P) => {\n if (activeTransaction && props && props.computedMatch && props.computedMatch.isExact) {\n activeTransaction.updateName(props.computedMatch.path);\n activeTransaction.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, 'route');\n }\n\n // @ts-expect-error Setting more specific React Component typing for `R` generic above\n // will break advanced type inference done by react router params:\n // https://github.com/DefinitelyTyped/DefinitelyTyped/blob/13dc4235c069e25fe7ee16e11f529d909f9f3ff8/types/react-router/index.d.ts#L154-L164\n return <Route {...props} />;\n };\n\n WrappedRoute.displayName = `sentryRoute(${componentDisplayName})`;\n hoistNonReactStatics(WrappedRoute, Route);\n // @ts-expect-error Setting more specific React Component typing for `R` generic above\n // will break advanced type inference done by react router params:\n // https://github.com/DefinitelyTyped/DefinitelyTyped/blob/13dc4235c069e25fe7ee16e11f529d909f9f3ff8/types/react-router/index.d.ts#L154-L164\n return WrappedRoute;\n}\n/* eslint-enable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access */\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reactrouter.js","sources":["../../src/reactrouter.tsx"],"sourcesContent":["import {\n WINDOW,\n browserTracingIntegration,\n startBrowserTracingNavigationSpan,\n startBrowserTracingPageLoadSpan,\n} from '@sentry/browser';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n getActiveSpan,\n getRootSpan,\n spanToJSON,\n} from '@sentry/core';\nimport type { Integration, Span, StartSpanOptions, 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\nexport type MatchPath = (pathname: string, props: string | string[] | any, parent?: Match | null) => Match | null; // eslint-disable-line @typescript-eslint/no-explicit-any\n\ninterface ReactRouterOptions {\n history: RouterHistory;\n routes?: RouteConfig[];\n matchPath?: MatchPath;\n}\n\nlet activeTransaction: Transaction | undefined;\n\n/**\n * A browser tracing integration that uses React Router v4 to instrument navigations.\n * Expects `history` (and optionally `routes` and `matchPath`) to be passed as options.\n */\nexport function reactRouterV4BrowserTracingIntegration(\n options: Parameters<typeof browserTracingIntegration>[0] & ReactRouterOptions,\n): Integration {\n const integration = browserTracingIntegration({\n ...options,\n instrumentPageLoad: false,\n instrumentNavigation: false,\n });\n\n const { history, routes, matchPath, instrumentPageLoad = true, instrumentNavigation = true } = options;\n\n return {\n ...integration,\n afterAllSetup(client) {\n integration.afterAllSetup(client);\n\n const startPageloadCallback = (startSpanOptions: StartSpanOptions): undefined => {\n startBrowserTracingPageLoadSpan(client, startSpanOptions);\n return undefined;\n };\n\n const startNavigationCallback = (startSpanOptions: StartSpanOptions): undefined => {\n startBrowserTracingNavigationSpan(client, startSpanOptions);\n return undefined;\n };\n\n // eslint-disable-next-line deprecation/deprecation\n const instrumentation = reactRouterV4Instrumentation(history, routes, matchPath);\n\n // Now instrument page load & navigation with correct settings\n instrumentation(startPageloadCallback, instrumentPageLoad, false);\n instrumentation(startNavigationCallback, false, instrumentNavigation);\n },\n };\n}\n\n/**\n * A browser tracing integration that uses React Router v5 to instrument navigations.\n * Expects `history` (and optionally `routes` and `matchPath`) to be passed as options.\n */\nexport function reactRouterV5BrowserTracingIntegration(\n options: Parameters<typeof browserTracingIntegration>[0] & ReactRouterOptions,\n): Integration {\n const integration = browserTracingIntegration({\n ...options,\n instrumentPageLoad: false,\n instrumentNavigation: false,\n });\n\n const { history, routes, matchPath } = options;\n\n return {\n ...integration,\n afterAllSetup(client) {\n integration.afterAllSetup(client);\n\n const startPageloadCallback = (startSpanOptions: StartSpanOptions): undefined => {\n startBrowserTracingPageLoadSpan(client, startSpanOptions);\n return undefined;\n };\n\n const startNavigationCallback = (startSpanOptions: StartSpanOptions): undefined => {\n startBrowserTracingNavigationSpan(client, startSpanOptions);\n return undefined;\n };\n\n // eslint-disable-next-line deprecation/deprecation\n const instrumentation = reactRouterV5Instrumentation(history, routes, matchPath);\n\n // Now instrument page load & navigation with correct settings\n instrumentation(startPageloadCallback, options.instrumentPageLoad, false);\n instrumentation(startNavigationCallback, false, options.instrumentNavigation);\n },\n };\n}\n\n/**\n * @deprecated Use `browserTracingReactRouterV4()` instead.\n */\nexport function reactRouterV4Instrumentation(\n history: RouterHistory,\n routes?: RouteConfig[],\n matchPath?: MatchPath,\n): ReactRouterInstrumentation {\n return createReactRouterInstrumentation(history, 'reactrouter_v4', routes, matchPath);\n}\n\n/**\n * @deprecated Use `browserTracingReactRouterV5()` instead.\n */\nexport function reactRouterV5Instrumentation(\n history: RouterHistory,\n routes?: RouteConfig[],\n matchPath?: MatchPath,\n): ReactRouterInstrumentation {\n return createReactRouterInstrumentation(history, 'reactrouter_v5', routes, matchPath);\n}\n\nfunction createReactRouterInstrumentation(\n history: RouterHistory,\n instrumentationName: 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 return (customStartTransaction, startTransactionOnPageLoad = true, startTransactionOnLocationChange = true): void => {\n const initPathName = getInitPathName();\n\n if (startTransactionOnPageLoad && initPathName) {\n const [name, source] = normalizeTransactionName(initPathName);\n activeTransaction = customStartTransaction({\n name,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'pageload',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: `auto.pageload.react.${instrumentationName}`,\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: source,\n },\n });\n }\n\n if (startTransactionOnLocationChange && history.listen) {\n history.listen((location, action) => {\n if (action && (action === 'PUSH' || action === 'POP')) {\n if (activeTransaction) {\n activeTransaction.end();\n }\n\n const [name, source] = normalizeTransactionName(location.pathname);\n activeTransaction = customStartTransaction({\n name,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'navigation',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: `auto.navigation.react.${instrumentationName}`,\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: source,\n },\n });\n }\n });\n }\n };\n}\n\n/**\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 activeRootSpan = getActiveRootSpan();\n\n const WrappedRoute: React.FC<P> = (props: P) => {\n if (activeRootSpan && props && props.computedMatch && props.computedMatch.isExact) {\n activeRootSpan.updateName(props.computedMatch.path);\n activeRootSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, 'route');\n }\n\n // @ts-expect-error Setting more specific React Component typing for `R` generic above\n // will break advanced type inference done by react router params:\n // https://github.com/DefinitelyTyped/DefinitelyTyped/blob/13dc4235c069e25fe7ee16e11f529d909f9f3ff8/types/react-router/index.d.ts#L154-L164\n return <Route {...props} />;\n };\n\n WrappedRoute.displayName = `sentryRoute(${componentDisplayName})`;\n hoistNonReactStatics(WrappedRoute, Route);\n // @ts-expect-error Setting more specific React Component typing for `R` generic above\n // will break advanced type inference done by react router params:\n // https://github.com/DefinitelyTyped/DefinitelyTyped/blob/13dc4235c069e25fe7ee16e11f529d909f9f3ff8/types/react-router/index.d.ts#L154-L164\n return WrappedRoute;\n}\n/* eslint-enable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access */\n\nfunction getActiveRootSpan(): Span | undefined {\n // Legacy behavior for \"old\" react router instrumentation\n if (activeTransaction) {\n return activeTransaction;\n }\n\n const span = getActiveSpan();\n const rootSpan = span ? getRootSpan(span) : undefined;\n\n if (!rootSpan) {\n return undefined;\n }\n\n const op = spanToJSON(rootSpan).op;\n\n // Only use this root span if it is a pageload or navigation span\n return op === 'navigation' || op === 'pageload' ? rootSpan : undefined;\n}\n"],"names":[],"mappings":"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"}
@@ -1,8 +1,49 @@
1
- import { WINDOW } from '@sentry/browser';
1
+ import { browserTracingIntegration, WINDOW, startBrowserTracingPageLoadSpan, startBrowserTracingNavigationSpan } from '@sentry/browser';
2
+ import { SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from '@sentry/core';
2
3
 
3
4
  // Many of the types below had to be mocked out to prevent typescript issues
4
5
  // these types are required for correct functionality.
5
6
 
7
+ /**
8
+ * A browser tracing integration that uses React Router v3 to instrument navigations.
9
+ * Expects `history` (and optionally `routes` and `matchPath`) to be passed as options.
10
+ */
11
+ function reactRouterV3BrowserTracingIntegration(
12
+ options,
13
+ ) {
14
+ const integration = browserTracingIntegration({
15
+ ...options,
16
+ instrumentPageLoad: false,
17
+ instrumentNavigation: false,
18
+ });
19
+
20
+ const { history, routes, match, instrumentPageLoad = true, instrumentNavigation = true } = options;
21
+
22
+ return {
23
+ ...integration,
24
+ afterAllSetup(client) {
25
+ integration.afterAllSetup(client);
26
+
27
+ const startPageloadCallback = (startSpanOptions) => {
28
+ startBrowserTracingPageLoadSpan(client, startSpanOptions);
29
+ return undefined;
30
+ };
31
+
32
+ const startNavigationCallback = (startSpanOptions) => {
33
+ startBrowserTracingNavigationSpan(client, startSpanOptions);
34
+ return undefined;
35
+ };
36
+
37
+ // eslint-disable-next-line deprecation/deprecation
38
+ const instrumentation = reactRouterV3Instrumentation(history, routes, match);
39
+
40
+ // Now instrument page load & navigation with correct settings
41
+ instrumentation(startPageloadCallback, instrumentPageLoad, false);
42
+ instrumentation(startNavigationCallback, false, instrumentNavigation);
43
+ },
44
+ };
45
+ }
46
+
6
47
  /**
7
48
  * Creates routing instrumentation for React Router v3
8
49
  * Works for React Router >= 3.2.0 and < 4.0.0
@@ -10,6 +51,8 @@ import { WINDOW } from '@sentry/browser';
10
51
  * @param history object from the `history` library
11
52
  * @param routes a list of all routes, should be
12
53
  * @param match `Router.match` utility
54
+ *
55
+ * @deprecated Use `reactRouterV3BrowserTracingIntegration()` instead
13
56
  */
14
57
  function reactRouterV3Instrumentation(
15
58
  history,
@@ -34,13 +77,10 @@ function reactRouterV3Instrumentation(
34
77
  prevName = localName;
35
78
  activeTransaction = startTransaction({
36
79
  name: prevName,
37
- op: 'pageload',
38
- origin: 'auto.pageload.react.reactrouterv3',
39
- tags: {
40
- 'routing.instrumentation': 'react-router-v3',
41
- },
42
- metadata: {
43
- source,
80
+ attributes: {
81
+ [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'pageload',
82
+ [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.pageload.react.reactrouter_v3',
83
+ [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: source,
44
84
  },
45
85
  });
46
86
  },
@@ -53,22 +93,18 @@ function reactRouterV3Instrumentation(
53
93
  if (activeTransaction) {
54
94
  activeTransaction.end();
55
95
  }
56
- const tags = {
57
- 'routing.instrumentation': 'react-router-v3',
58
- };
59
- if (prevName) {
60
- tags.from = prevName;
61
- }
62
96
  normalizeTransactionName(routes, location, match, (localName, source = 'url') => {
63
97
  prevName = localName;
98
+
99
+ const attributes = {
100
+ [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'navigation',
101
+ [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.navigation.react.reactrouter_v3',
102
+ [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: source,
103
+ };
104
+
64
105
  activeTransaction = startTransaction({
65
106
  name: prevName,
66
- op: 'navigation',
67
- origin: 'auto.navigation.react.reactrouterv3',
68
- tags,
69
- metadata: {
70
- source,
71
- },
107
+ attributes,
72
108
  });
73
109
  });
74
110
  }
@@ -134,5 +170,5 @@ function getRouteStringFromRoutes(routes) {
134
170
  .join('');
135
171
  }
136
172
 
137
- export { reactRouterV3Instrumentation };
173
+ export { reactRouterV3BrowserTracingIntegration, reactRouterV3Instrumentation };
138
174
  //# sourceMappingURL=reactrouterv3.js.map
@@ -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 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.end();\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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"}
1
+ {"version":3,"file":"reactrouterv3.js","sources":["../../src/reactrouterv3.ts"],"sourcesContent":["import {\n WINDOW,\n browserTracingIntegration,\n startBrowserTracingNavigationSpan,\n startBrowserTracingPageLoadSpan,\n} from '@sentry/browser';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n} from '@sentry/core';\nimport type {\n Integration,\n SpanAttributes,\n StartSpanOptions,\n Transaction,\n TransactionContext,\n TransactionSource,\n} 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\ninterface ReactRouterOptions {\n history: HistoryV3;\n routes: Route[];\n match: Match;\n}\n\n/**\n * A browser tracing integration that uses React Router v3 to instrument navigations.\n * Expects `history` (and optionally `routes` and `matchPath`) to be passed as options.\n */\nexport function reactRouterV3BrowserTracingIntegration(\n options: Parameters<typeof browserTracingIntegration>[0] & ReactRouterOptions,\n): Integration {\n const integration = browserTracingIntegration({\n ...options,\n instrumentPageLoad: false,\n instrumentNavigation: false,\n });\n\n const { history, routes, match, instrumentPageLoad = true, instrumentNavigation = true } = options;\n\n return {\n ...integration,\n afterAllSetup(client) {\n integration.afterAllSetup(client);\n\n const startPageloadCallback = (startSpanOptions: StartSpanOptions): undefined => {\n startBrowserTracingPageLoadSpan(client, startSpanOptions);\n return undefined;\n };\n\n const startNavigationCallback = (startSpanOptions: StartSpanOptions): undefined => {\n startBrowserTracingNavigationSpan(client, startSpanOptions);\n return undefined;\n };\n\n // eslint-disable-next-line deprecation/deprecation\n const instrumentation = reactRouterV3Instrumentation(history, routes, match);\n\n // Now instrument page load & navigation with correct settings\n instrumentation(startPageloadCallback, instrumentPageLoad, false);\n instrumentation(startNavigationCallback, false, instrumentNavigation);\n },\n };\n}\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 *\n * @deprecated Use `reactRouterV3BrowserTracingIntegration()` instead\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 attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'pageload',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.pageload.react.reactrouter_v3',\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 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.end();\n }\n normalizeTransactionName(routes, location, match, (localName: string, source: TransactionSource = 'url') => {\n prevName = localName;\n\n const attributes: SpanAttributes = {\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'navigation',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.navigation.react.reactrouter_v3',\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: source,\n };\n\n activeTransaction = startTransaction({\n name: prevName,\n attributes,\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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"}