@depup/sentry__react 10.47.0-depup.0 → 10.67.0-depup.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/README.md +9 -3
- package/build/cjs/constants.js +3 -5
- package/build/cjs/constants.js.map +1 -1
- package/build/cjs/debug-build.js +0 -5
- package/build/cjs/debug-build.js.map +1 -1
- package/build/cjs/error.js +14 -77
- package/build/cjs/error.js.map +1 -1
- package/build/cjs/errorboundary.js +22 -77
- package/build/cjs/errorboundary.js.map +1 -1
- package/build/cjs/hoist-non-react-statics.js +16 -84
- package/build/cjs/hoist-non-react-statics.js.map +1 -1
- package/build/cjs/index.js +6 -0
- package/build/cjs/index.js.map +1 -1
- package/build/cjs/isSyntheticEvent.js +10 -0
- package/build/cjs/isSyntheticEvent.js.map +1 -0
- package/build/cjs/profiler.js +35 -110
- package/build/cjs/profiler.js.map +1 -1
- package/build/cjs/reactrouter-compat-utils/instrumentation.js +236 -692
- package/build/cjs/reactrouter-compat-utils/instrumentation.js.map +1 -1
- package/build/cjs/reactrouter-compat-utils/lazy-routes.js +24 -85
- package/build/cjs/reactrouter-compat-utils/lazy-routes.js.map +1 -1
- package/build/cjs/reactrouter-compat-utils/route-manifest.js +18 -96
- package/build/cjs/reactrouter-compat-utils/route-manifest.js.map +1 -1
- package/build/cjs/reactrouter-compat-utils/utils.js +82 -193
- package/build/cjs/reactrouter-compat-utils/utils.js.map +1 -1
- package/build/cjs/reactrouter.compat.js +29 -0
- package/build/cjs/reactrouter.compat.js.map +1 -0
- package/build/cjs/reactrouter.js +34 -111
- package/build/cjs/reactrouter.js.map +1 -1
- package/build/cjs/reactrouterv3.js +31 -60
- package/build/cjs/reactrouterv3.js.map +1 -1
- package/build/cjs/reactrouterv6.js +10 -42
- package/build/cjs/reactrouterv6.js.map +1 -1
- package/build/cjs/reactrouterv7.js +10 -42
- package/build/cjs/reactrouterv7.js.map +1 -1
- package/build/cjs/redux.js +61 -90
- package/build/cjs/redux.js.map +1 -1
- package/build/cjs/sdk.js +15 -10
- package/build/cjs/sdk.js.map +1 -1
- package/build/cjs/tanstackrouter.js +90 -92
- package/build/cjs/tanstackrouter.js.map +1 -1
- package/build/esm/constants.js +3 -5
- package/build/esm/constants.js.map +1 -1
- package/build/esm/debug-build.js +0 -5
- package/build/esm/debug-build.js.map +1 -1
- package/build/esm/error.js +13 -76
- package/build/esm/error.js.map +1 -1
- package/build/esm/errorboundary.js +22 -77
- package/build/esm/errorboundary.js.map +1 -1
- package/build/esm/hoist-non-react-statics.js +16 -84
- package/build/esm/hoist-non-react-statics.js.map +1 -1
- package/build/esm/index.js +1 -0
- package/build/esm/index.js.map +1 -1
- package/build/esm/isSyntheticEvent.js +8 -0
- package/build/esm/isSyntheticEvent.js.map +1 -0
- package/build/esm/package.json +1 -1
- package/build/esm/profiler.js +35 -110
- package/build/esm/profiler.js.map +1 -1
- package/build/esm/reactrouter-compat-utils/instrumentation.js +237 -693
- package/build/esm/reactrouter-compat-utils/instrumentation.js.map +1 -1
- package/build/esm/reactrouter-compat-utils/lazy-routes.js +24 -85
- package/build/esm/reactrouter-compat-utils/lazy-routes.js.map +1 -1
- package/build/esm/reactrouter-compat-utils/route-manifest.js +18 -96
- package/build/esm/reactrouter-compat-utils/route-manifest.js.map +1 -1
- package/build/esm/reactrouter-compat-utils/utils.js +80 -191
- package/build/esm/reactrouter-compat-utils/utils.js.map +1 -1
- package/build/esm/reactrouter.compat.js +23 -0
- package/build/esm/reactrouter.compat.js.map +1 -0
- package/build/esm/reactrouter.js +34 -111
- package/build/esm/reactrouter.js.map +1 -1
- package/build/esm/reactrouterv3.js +29 -58
- package/build/esm/reactrouterv3.js.map +1 -1
- package/build/esm/reactrouterv6.js +10 -42
- package/build/esm/reactrouterv6.js.map +1 -1
- package/build/esm/reactrouterv7.js +10 -42
- package/build/esm/reactrouterv7.js.map +1 -1
- package/build/esm/redux.js +61 -90
- package/build/esm/redux.js.map +1 -1
- package/build/esm/sdk.js +15 -10
- package/build/esm/sdk.js.map +1 -1
- package/build/esm/tanstackrouter.js +91 -93
- package/build/esm/tanstackrouter.js.map +1 -1
- package/build/types/error.d.ts.map +1 -1
- package/build/types/index.d.ts +1 -0
- package/build/types/index.d.ts.map +1 -1
- package/build/types/isSyntheticEvent.d.ts +10 -0
- package/build/types/isSyntheticEvent.d.ts.map +1 -0
- package/build/types/reactrouter-compat-utils/instrumentation.d.ts +1 -1
- package/build/types/reactrouter-compat-utils/instrumentation.d.ts.map +1 -1
- package/build/types/reactrouter-compat-utils/utils.d.ts +1 -1
- package/build/types/reactrouter-compat-utils/utils.d.ts.map +1 -1
- package/build/types/reactrouter.compat.d.ts +42 -0
- package/build/types/reactrouter.compat.d.ts.map +1 -0
- package/build/types/reactrouter.d.ts.map +1 -1
- package/build/types/reactrouterv3.d.ts +1 -1
- package/build/types/reactrouterv3.d.ts.map +1 -1
- package/build/types/reactrouterv6.d.ts +10 -0
- package/build/types/reactrouterv6.d.ts.map +1 -1
- package/build/types/reactrouterv7.d.ts +10 -0
- package/build/types/reactrouterv7.d.ts.map +1 -1
- package/build/types/redux.d.ts +1 -1
- package/build/types/redux.d.ts.map +1 -1
- package/build/types/sdk.d.ts +1 -1
- package/build/types/sdk.d.ts.map +1 -1
- package/build/types/tanstackrouter.d.ts +1 -1
- package/build/types/tanstackrouter.d.ts.map +1 -1
- package/build/types/vendor/tanstackrouter-types.d.ts +2 -1
- package/build/types/vendor/tanstackrouter-types.d.ts.map +1 -1
- package/build/types-ts3.8/index.d.ts +1 -0
- package/build/types-ts3.8/isSyntheticEvent.d.ts +10 -0
- package/build/types-ts3.8/reactrouter-compat-utils/instrumentation.d.ts +1 -1
- package/build/types-ts3.8/reactrouter-compat-utils/utils.d.ts +1 -1
- package/build/types-ts3.8/reactrouter.compat.d.ts +42 -0
- package/build/types-ts3.8/reactrouterv3.d.ts +1 -1
- package/build/types-ts3.8/reactrouterv6.d.ts +10 -0
- package/build/types-ts3.8/reactrouterv7.d.ts +10 -0
- package/build/types-ts3.8/redux.d.ts +1 -1
- package/build/types-ts3.8/sdk.d.ts +1 -1
- package/build/types-ts3.8/tanstackrouter.d.ts +1 -1
- package/build/types-ts3.8/vendor/tanstackrouter-types.d.ts +2 -1
- package/changes.json +8 -3
- package/package.json +18 -8
package/build/cjs/reactrouter.js
CHANGED
|
@@ -4,118 +4,76 @@ const browser = require('@sentry/browser');
|
|
|
4
4
|
const core = require('@sentry/core');
|
|
5
5
|
const React = require('react');
|
|
6
6
|
const hoistNonReactStatics = require('./hoist-non-react-statics.js');
|
|
7
|
+
const attributes = require('@sentry/conventions/attributes');
|
|
7
8
|
|
|
8
|
-
|
|
9
|
-
// react-router typings.
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* A browser tracing integration that uses React Router v4 to instrument navigations.
|
|
13
|
-
* Expects `history` (and optionally `routes` and `matchPath`) to be passed as options.
|
|
14
|
-
*/
|
|
15
|
-
function reactRouterV4BrowserTracingIntegration(
|
|
16
|
-
options,
|
|
17
|
-
) {
|
|
9
|
+
function reactRouterV4BrowserTracingIntegration(options) {
|
|
18
10
|
const integration = browser.browserTracingIntegration({
|
|
19
11
|
...options,
|
|
20
12
|
instrumentPageLoad: false,
|
|
21
|
-
instrumentNavigation: false
|
|
13
|
+
instrumentNavigation: false
|
|
22
14
|
});
|
|
23
|
-
|
|
24
15
|
const { history, routes, matchPath, instrumentPageLoad = true, instrumentNavigation = true } = options;
|
|
25
|
-
|
|
26
16
|
return {
|
|
27
17
|
...integration,
|
|
28
18
|
afterAllSetup(client) {
|
|
29
19
|
integration.afterAllSetup(client);
|
|
30
|
-
|
|
31
20
|
instrumentReactRouter(
|
|
32
21
|
client,
|
|
33
22
|
instrumentPageLoad,
|
|
34
23
|
instrumentNavigation,
|
|
35
24
|
history,
|
|
36
|
-
|
|
25
|
+
"reactrouter_v4",
|
|
37
26
|
routes,
|
|
38
|
-
matchPath
|
|
27
|
+
matchPath
|
|
39
28
|
);
|
|
40
|
-
}
|
|
29
|
+
}
|
|
41
30
|
};
|
|
42
31
|
}
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* A browser tracing integration that uses React Router v5 to instrument navigations.
|
|
46
|
-
* Expects `history` (and optionally `routes` and `matchPath`) to be passed as options.
|
|
47
|
-
*/
|
|
48
|
-
function reactRouterV5BrowserTracingIntegration(
|
|
49
|
-
options,
|
|
50
|
-
) {
|
|
32
|
+
function reactRouterV5BrowserTracingIntegration(options) {
|
|
51
33
|
const integration = browser.browserTracingIntegration({
|
|
52
34
|
...options,
|
|
53
35
|
instrumentPageLoad: false,
|
|
54
|
-
instrumentNavigation: false
|
|
36
|
+
instrumentNavigation: false
|
|
55
37
|
});
|
|
56
|
-
|
|
57
38
|
const { history, routes, matchPath, instrumentPageLoad = true, instrumentNavigation = true } = options;
|
|
58
|
-
|
|
59
39
|
return {
|
|
60
40
|
...integration,
|
|
61
41
|
afterAllSetup(client) {
|
|
62
42
|
integration.afterAllSetup(client);
|
|
63
|
-
|
|
64
43
|
instrumentReactRouter(
|
|
65
44
|
client,
|
|
66
45
|
instrumentPageLoad,
|
|
67
46
|
instrumentNavigation,
|
|
68
47
|
history,
|
|
69
|
-
|
|
48
|
+
"reactrouter_v5",
|
|
70
49
|
routes,
|
|
71
|
-
matchPath
|
|
50
|
+
matchPath
|
|
72
51
|
);
|
|
73
|
-
}
|
|
52
|
+
}
|
|
74
53
|
};
|
|
75
54
|
}
|
|
76
|
-
|
|
77
|
-
function instrumentReactRouter(
|
|
78
|
-
client,
|
|
79
|
-
instrumentPageLoad,
|
|
80
|
-
instrumentNavigation,
|
|
81
|
-
history,
|
|
82
|
-
instrumentationName,
|
|
83
|
-
allRoutes = [],
|
|
84
|
-
matchPath,
|
|
85
|
-
) {
|
|
55
|
+
function instrumentReactRouter(client, instrumentPageLoad, instrumentNavigation, history, instrumentationName, allRoutes = [], matchPath) {
|
|
86
56
|
function getInitPathName() {
|
|
87
57
|
if (history.location) {
|
|
88
58
|
return history.location.pathname;
|
|
89
59
|
}
|
|
90
|
-
|
|
91
60
|
if (browser.WINDOW.location) {
|
|
92
61
|
return browser.WINDOW.location.pathname;
|
|
93
62
|
}
|
|
94
|
-
|
|
95
|
-
return undefined;
|
|
63
|
+
return void 0;
|
|
96
64
|
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Normalizes a transaction name. Returns the new name as well as the
|
|
100
|
-
* source of the transaction.
|
|
101
|
-
*
|
|
102
|
-
* @param pathname The initial pathname we normalize
|
|
103
|
-
*/
|
|
104
65
|
function normalizeTransactionName(pathname) {
|
|
105
66
|
if (allRoutes.length === 0 || !matchPath) {
|
|
106
|
-
return [pathname,
|
|
67
|
+
return [pathname, "url"];
|
|
107
68
|
}
|
|
108
|
-
|
|
109
69
|
const branches = matchRoutes(allRoutes, pathname, matchPath);
|
|
110
70
|
for (const branch of branches) {
|
|
111
71
|
if (branch.match.isExact) {
|
|
112
|
-
return [branch.match.path,
|
|
72
|
+
return [branch.match.path, "route"];
|
|
113
73
|
}
|
|
114
74
|
}
|
|
115
|
-
|
|
116
|
-
return [pathname, 'url'];
|
|
75
|
+
return [pathname, "url"];
|
|
117
76
|
}
|
|
118
|
-
|
|
119
77
|
if (instrumentPageLoad) {
|
|
120
78
|
const initPathName = getInitPathName();
|
|
121
79
|
if (initPathName) {
|
|
@@ -123,111 +81,76 @@ function instrumentReactRouter(
|
|
|
123
81
|
browser.startBrowserTracingPageLoadSpan(client, {
|
|
124
82
|
name,
|
|
125
83
|
attributes: {
|
|
126
|
-
[core.SEMANTIC_ATTRIBUTE_SENTRY_OP]:
|
|
84
|
+
[core.SEMANTIC_ATTRIBUTE_SENTRY_OP]: "pageload",
|
|
127
85
|
[core.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: `auto.pageload.react.${instrumentationName}`,
|
|
128
86
|
[core.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: source,
|
|
129
|
-
|
|
87
|
+
...source === "route" && { [attributes.URL_TEMPLATE]: name }
|
|
88
|
+
}
|
|
130
89
|
});
|
|
131
90
|
}
|
|
132
91
|
}
|
|
133
|
-
|
|
134
92
|
if (instrumentNavigation && history.listen) {
|
|
135
93
|
history.listen((location, action) => {
|
|
136
|
-
if (action && (action ===
|
|
94
|
+
if (action && (action === "PUSH" || action === "POP")) {
|
|
137
95
|
const [name, source] = normalizeTransactionName(location.pathname);
|
|
138
96
|
browser.startBrowserTracingNavigationSpan(client, {
|
|
139
97
|
name,
|
|
140
98
|
attributes: {
|
|
141
|
-
[core.SEMANTIC_ATTRIBUTE_SENTRY_OP]:
|
|
99
|
+
[core.SEMANTIC_ATTRIBUTE_SENTRY_OP]: "navigation",
|
|
142
100
|
[core.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: `auto.navigation.react.${instrumentationName}`,
|
|
143
101
|
[core.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: source,
|
|
144
|
-
|
|
102
|
+
...source === "route" && { [attributes.URL_TEMPLATE]: name }
|
|
103
|
+
}
|
|
145
104
|
});
|
|
146
105
|
}
|
|
147
106
|
});
|
|
148
107
|
}
|
|
149
108
|
}
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
routes,
|
|
157
|
-
pathname,
|
|
158
|
-
matchPath,
|
|
159
|
-
branch = [],
|
|
160
|
-
) {
|
|
161
|
-
routes.some(route => {
|
|
162
|
-
const match = route.path
|
|
163
|
-
? matchPath(pathname, route)
|
|
164
|
-
: branch.length
|
|
165
|
-
? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
166
|
-
branch[branch.length - 1].match // use parent match
|
|
167
|
-
: computeRootMatch(pathname); // use default "root" match
|
|
168
|
-
|
|
109
|
+
function matchRoutes(routes, pathname, matchPath, branch = []) {
|
|
110
|
+
routes.some((route) => {
|
|
111
|
+
const match = route.path ? matchPath(pathname, route) : branch.length ? (
|
|
112
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
113
|
+
branch[branch.length - 1].match
|
|
114
|
+
) : computeRootMatch(pathname);
|
|
169
115
|
if (match) {
|
|
170
116
|
branch.push({ route, match });
|
|
171
|
-
|
|
172
117
|
if (route.routes) {
|
|
173
118
|
matchRoutes(route.routes, pathname, matchPath, branch);
|
|
174
119
|
}
|
|
175
120
|
}
|
|
176
|
-
|
|
177
121
|
return !!match;
|
|
178
122
|
});
|
|
179
|
-
|
|
180
123
|
return branch;
|
|
181
124
|
}
|
|
182
|
-
|
|
183
125
|
function computeRootMatch(pathname) {
|
|
184
|
-
return { path:
|
|
126
|
+
return { path: "/", url: "/", params: {}, isExact: pathname === "/" };
|
|
185
127
|
}
|
|
186
|
-
|
|
187
|
-
/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access */
|
|
188
128
|
function withSentryRouting(Route) {
|
|
189
129
|
const componentDisplayName = Route.displayName || Route.name;
|
|
190
|
-
|
|
191
130
|
const WrappedRoute = (props) => {
|
|
192
131
|
if (props?.computedMatch?.isExact) {
|
|
193
132
|
const route = props.computedMatch.path;
|
|
194
133
|
const activeRootSpan = getActiveRootSpan();
|
|
195
|
-
|
|
196
134
|
core.getCurrentScope().setTransactionName(route);
|
|
197
|
-
|
|
198
135
|
if (activeRootSpan) {
|
|
199
136
|
activeRootSpan.updateName(route);
|
|
200
|
-
activeRootSpan.
|
|
137
|
+
activeRootSpan.setAttributes({ [core.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: "route", [attributes.URL_TEMPLATE]: route });
|
|
201
138
|
}
|
|
202
139
|
}
|
|
203
|
-
|
|
204
|
-
// @ts-expect-error Setting more specific React Component typing for `R` generic above
|
|
205
|
-
// will break advanced type inference done by react router params:
|
|
206
|
-
// https://github.com/DefinitelyTyped/DefinitelyTyped/blob/13dc4235c069e25fe7ee16e11f529d909f9f3ff8/types/react-router/index.d.ts#L154-L164
|
|
207
|
-
return React.createElement(Route, { ...props,} );
|
|
140
|
+
return /* @__PURE__ */ React.createElement(Route, { ...props });
|
|
208
141
|
};
|
|
209
|
-
|
|
210
142
|
WrappedRoute.displayName = `sentryRoute(${componentDisplayName})`;
|
|
211
143
|
hoistNonReactStatics.hoistNonReactStatics(WrappedRoute, Route);
|
|
212
|
-
// @ts-expect-error Setting more specific React Component typing for `R` generic above
|
|
213
|
-
// will break advanced type inference done by react router params:
|
|
214
|
-
// https://github.com/DefinitelyTyped/DefinitelyTyped/blob/13dc4235c069e25fe7ee16e11f529d909f9f3ff8/types/react-router/index.d.ts#L154-L164
|
|
215
144
|
return WrappedRoute;
|
|
216
145
|
}
|
|
217
|
-
/* eslint-enable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access */
|
|
218
|
-
|
|
219
146
|
function getActiveRootSpan() {
|
|
220
147
|
const span = core.getActiveSpan();
|
|
221
148
|
const rootSpan = span && core.getRootSpan(span);
|
|
222
|
-
|
|
223
149
|
if (!rootSpan) {
|
|
224
|
-
return
|
|
150
|
+
return void 0;
|
|
225
151
|
}
|
|
226
|
-
|
|
227
152
|
const op = core.spanToJSON(rootSpan).op;
|
|
228
|
-
|
|
229
|
-
// Only use this root span if it is a pageload or navigation span
|
|
230
|
-
return op === 'navigation' || op === 'pageload' ? rootSpan : undefined;
|
|
153
|
+
return op === "navigation" || op === "pageload" ? rootSpan : void 0;
|
|
231
154
|
}
|
|
232
155
|
|
|
233
156
|
exports.reactRouterV4BrowserTracingIntegration = reactRouterV4BrowserTracingIntegration;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactrouter.js","sources":["../../src/reactrouter.tsx"],"sourcesContent":["import {\n browserTracingIntegration,\n startBrowserTracingNavigationSpan,\n startBrowserTracingPageLoadSpan,\n WINDOW,\n} from '@sentry/browser';\nimport type { Client, Integration, Span, TransactionSource } from '@sentry/core';\nimport {\n getActiveSpan,\n getCurrentScope,\n getRootSpan,\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n spanToJSON,\n} from '@sentry/core';\nimport type { ReactElement } from 'react';\nimport * as React from 'react';\nimport { hoistNonReactStatics } from './hoist-non-react-statics';\nimport type { Action, Location } from './types';\n\n// We need to disable eslint no-explicit-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?: ReactElement;\n routes?: RouteConfig[];\n};\n\nexport type MatchPath = (pathname: string, props: string | string[] | any, parent?: Match | null) => Match | null; // eslint-disable-line @typescript-eslint/no-explicit-any\n\ninterface ReactRouterOptions {\n history: RouterHistory;\n routes?: RouteConfig[];\n matchPath?: MatchPath;\n}\n\n/**\n * A browser tracing integration that uses React Router v4 to instrument navigations.\n * Expects `history` (and optionally `routes` and `matchPath`) to be passed as options.\n */\nexport function reactRouterV4BrowserTracingIntegration(\n options: Parameters<typeof browserTracingIntegration>[0] & ReactRouterOptions,\n): Integration {\n const integration = browserTracingIntegration({\n ...options,\n instrumentPageLoad: false,\n instrumentNavigation: false,\n });\n\n const { history, routes, matchPath, instrumentPageLoad = true, instrumentNavigation = true } = options;\n\n return {\n ...integration,\n afterAllSetup(client) {\n integration.afterAllSetup(client);\n\n instrumentReactRouter(\n client,\n instrumentPageLoad,\n instrumentNavigation,\n history,\n 'reactrouter_v4',\n routes,\n matchPath,\n );\n },\n };\n}\n\n/**\n * A browser tracing integration that uses React Router v5 to instrument navigations.\n * Expects `history` (and optionally `routes` and `matchPath`) to be passed as options.\n */\nexport function reactRouterV5BrowserTracingIntegration(\n options: Parameters<typeof browserTracingIntegration>[0] & ReactRouterOptions,\n): Integration {\n const integration = browserTracingIntegration({\n ...options,\n instrumentPageLoad: false,\n instrumentNavigation: false,\n });\n\n const { history, routes, matchPath, instrumentPageLoad = true, instrumentNavigation = true } = options;\n\n return {\n ...integration,\n afterAllSetup(client) {\n integration.afterAllSetup(client);\n\n instrumentReactRouter(\n client,\n instrumentPageLoad,\n instrumentNavigation,\n history,\n 'reactrouter_v5',\n routes,\n matchPath,\n );\n },\n };\n}\n\nfunction instrumentReactRouter(\n client: Client,\n instrumentPageLoad: boolean,\n instrumentNavigation: boolean,\n history: RouterHistory,\n instrumentationName: string,\n allRoutes: RouteConfig[] = [],\n matchPath?: MatchPath,\n): void {\n function getInitPathName(): string | undefined {\n if (history.location) {\n return history.location.pathname;\n }\n\n if (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 for (const branch of branches) {\n if (branch.match.isExact) {\n return [branch.match.path, 'route'];\n }\n }\n\n return [pathname, 'url'];\n }\n\n if (instrumentPageLoad) {\n const initPathName = getInitPathName();\n if (initPathName) {\n const [name, source] = normalizeTransactionName(initPathName);\n startBrowserTracingPageLoadSpan(client, {\n name,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'pageload',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: `auto.pageload.react.${instrumentationName}`,\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: source,\n },\n });\n }\n }\n\n if (instrumentNavigation && history.listen) {\n history.listen((location, action) => {\n if (action && (action === 'PUSH' || action === 'POP')) {\n const [name, source] = normalizeTransactionName(location.pathname);\n startBrowserTracingNavigationSpan(client, {\n name,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'navigation',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: `auto.navigation.react.${instrumentationName}`,\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: source,\n },\n });\n }\n });\n }\n}\n\n/**\n * Matches a set of routes to a pathname\n * Based on implementation from\n */\nfunction matchRoutes(\n routes: RouteConfig[],\n pathname: string,\n matchPath: MatchPath,\n branch: Array<{ route: RouteConfig; match: Match }> = [],\n): Array<{ route: RouteConfig; match: Match }> {\n routes.some(route => {\n const match = route.path\n ? matchPath(pathname, route)\n : branch.length\n ? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\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.displayName || Route.name;\n\n const WrappedRoute: React.FC<P> = (props: P) => {\n if (props?.computedMatch?.isExact) {\n const route = props.computedMatch.path;\n const activeRootSpan = getActiveRootSpan();\n\n getCurrentScope().setTransactionName(route);\n\n if (activeRootSpan) {\n activeRootSpan.updateName(route);\n activeRootSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, 'route');\n }\n }\n\n // @ts-expect-error Setting more specific React Component typing for `R` generic above\n // will break advanced type inference done by react router params:\n // https://github.com/DefinitelyTyped/DefinitelyTyped/blob/13dc4235c069e25fe7ee16e11f529d909f9f3ff8/types/react-router/index.d.ts#L154-L164\n return <Route {...props} />;\n };\n\n WrappedRoute.displayName = `sentryRoute(${componentDisplayName})`;\n hoistNonReactStatics(WrappedRoute, Route);\n // @ts-expect-error Setting more specific React Component typing for `R` generic above\n // will break advanced type inference done by react router params:\n // https://github.com/DefinitelyTyped/DefinitelyTyped/blob/13dc4235c069e25fe7ee16e11f529d909f9f3ff8/types/react-router/index.d.ts#L154-L164\n return WrappedRoute;\n}\n/* eslint-enable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access */\n\nfunction getActiveRootSpan(): Span | undefined {\n const span = getActiveSpan();\n const rootSpan = span && getRootSpan(span);\n\n if (!rootSpan) {\n return undefined;\n }\n\n const op = spanToJSON(rootSpan).op;\n\n // Only use this root span if it is a pageload or navigation span\n return op === 'navigation' || op === 'pageload' ? rootSpan : undefined;\n}\n"],"names":["browserTracingIntegration","WINDOW","startBrowserTracingPageLoadSpan","SEMANTIC_ATTRIBUTE_SENTRY_OP","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","SEMANTIC_ATTRIBUTE_SENTRY_SOURCE","startBrowserTracingNavigationSpan","getCurrentScope","hoistNonReactStatics","getActiveSpan","getRootSpan","spanToJSON"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"reactrouter.js","sources":["../../src/reactrouter.tsx"],"sourcesContent":["import {\n browserTracingIntegration,\n startBrowserTracingNavigationSpan,\n startBrowserTracingPageLoadSpan,\n WINDOW,\n} from '@sentry/browser';\nimport type { Client, Integration, Span, TransactionSource } from '@sentry/core';\nimport {\n getActiveSpan,\n getCurrentScope,\n getRootSpan,\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n spanToJSON,\n} from '@sentry/core';\nimport type { ReactElement } from 'react';\nimport * as React from 'react';\nimport { hoistNonReactStatics } from './hoist-non-react-statics';\nimport type { Action, Location } from './types';\nimport { URL_TEMPLATE } from '@sentry/conventions/attributes';\n\n// We need to disable eslint no-explicit-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?: ReactElement;\n routes?: RouteConfig[];\n};\n\nexport type MatchPath = (pathname: string, props: string | string[] | any, parent?: Match | null) => Match | null; // eslint-disable-line @typescript-eslint/no-explicit-any\n\ninterface ReactRouterOptions {\n history: RouterHistory;\n routes?: RouteConfig[];\n matchPath?: MatchPath;\n}\n\n/**\n * A browser tracing integration that uses React Router v4 to instrument navigations.\n * Expects `history` (and optionally `routes` and `matchPath`) to be passed as options.\n */\nexport function reactRouterV4BrowserTracingIntegration(\n options: Parameters<typeof browserTracingIntegration>[0] & ReactRouterOptions,\n): Integration {\n const integration = browserTracingIntegration({\n ...options,\n instrumentPageLoad: false,\n instrumentNavigation: false,\n });\n\n const { history, routes, matchPath, instrumentPageLoad = true, instrumentNavigation = true } = options;\n\n return {\n ...integration,\n afterAllSetup(client) {\n integration.afterAllSetup(client);\n\n instrumentReactRouter(\n client,\n instrumentPageLoad,\n instrumentNavigation,\n history,\n 'reactrouter_v4',\n routes,\n matchPath,\n );\n },\n };\n}\n\n/**\n * A browser tracing integration that uses React Router v5 to instrument navigations.\n * Expects `history` (and optionally `routes` and `matchPath`) to be passed as options.\n */\nexport function reactRouterV5BrowserTracingIntegration(\n options: Parameters<typeof browserTracingIntegration>[0] & ReactRouterOptions,\n): Integration {\n const integration = browserTracingIntegration({\n ...options,\n instrumentPageLoad: false,\n instrumentNavigation: false,\n });\n\n const { history, routes, matchPath, instrumentPageLoad = true, instrumentNavigation = true } = options;\n\n return {\n ...integration,\n afterAllSetup(client) {\n integration.afterAllSetup(client);\n\n instrumentReactRouter(\n client,\n instrumentPageLoad,\n instrumentNavigation,\n history,\n 'reactrouter_v5',\n routes,\n matchPath,\n );\n },\n };\n}\n\nfunction instrumentReactRouter(\n client: Client,\n instrumentPageLoad: boolean,\n instrumentNavigation: boolean,\n history: RouterHistory,\n instrumentationName: string,\n allRoutes: RouteConfig[] = [],\n matchPath?: MatchPath,\n): void {\n function getInitPathName(): string | undefined {\n if (history.location) {\n return history.location.pathname;\n }\n\n if (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 for (const branch of branches) {\n if (branch.match.isExact) {\n return [branch.match.path, 'route'];\n }\n }\n\n return [pathname, 'url'];\n }\n\n if (instrumentPageLoad) {\n const initPathName = getInitPathName();\n if (initPathName) {\n const [name, source] = normalizeTransactionName(initPathName);\n startBrowserTracingPageLoadSpan(client, {\n name,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'pageload',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: `auto.pageload.react.${instrumentationName}`,\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: source,\n ...(source === 'route' && { [URL_TEMPLATE]: name }),\n },\n });\n }\n }\n\n if (instrumentNavigation && history.listen) {\n history.listen((location, action) => {\n if (action && (action === 'PUSH' || action === 'POP')) {\n const [name, source] = normalizeTransactionName(location.pathname);\n startBrowserTracingNavigationSpan(client, {\n name,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'navigation',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: `auto.navigation.react.${instrumentationName}`,\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: source,\n ...(source === 'route' && { [URL_TEMPLATE]: name }),\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 ? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\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.displayName || Route.name;\n\n const WrappedRoute: React.FC<P> = (props: P) => {\n if (props?.computedMatch?.isExact) {\n const route = props.computedMatch.path;\n const activeRootSpan = getActiveRootSpan();\n\n getCurrentScope().setTransactionName(route);\n\n if (activeRootSpan) {\n activeRootSpan.updateName(route);\n activeRootSpan.setAttributes({ [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'route', [URL_TEMPLATE]: route });\n }\n }\n\n // @ts-expect-error Setting more specific React Component typing for `R` generic above\n // will break advanced type inference done by react router params:\n // https://github.com/DefinitelyTyped/DefinitelyTyped/blob/13dc4235c069e25fe7ee16e11f529d909f9f3ff8/types/react-router/index.d.ts#L154-L164\n return <Route {...props} />;\n };\n\n WrappedRoute.displayName = `sentryRoute(${componentDisplayName})`;\n hoistNonReactStatics(WrappedRoute, Route);\n // @ts-expect-error Setting more specific React Component typing for `R` generic above\n // will break advanced type inference done by react router params:\n // https://github.com/DefinitelyTyped/DefinitelyTyped/blob/13dc4235c069e25fe7ee16e11f529d909f9f3ff8/types/react-router/index.d.ts#L154-L164\n return WrappedRoute;\n}\n/* eslint-enable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access */\n\nfunction getActiveRootSpan(): Span | undefined {\n const span = getActiveSpan();\n const rootSpan = span && getRootSpan(span);\n\n if (!rootSpan) {\n return undefined;\n }\n\n const op = spanToJSON(rootSpan).op;\n\n // Only use this root span if it is a pageload or navigation span\n return op === 'navigation' || op === 'pageload' ? rootSpan : undefined;\n}\n"],"names":["browserTracingIntegration","WINDOW","startBrowserTracingPageLoadSpan","SEMANTIC_ATTRIBUTE_SENTRY_OP","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","SEMANTIC_ATTRIBUTE_SENTRY_SOURCE","URL_TEMPLATE","startBrowserTracingNavigationSpan","getCurrentScope","hoistNonReactStatics","getActiveSpan","getRootSpan","spanToJSON"],"mappings":"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"}
|
|
@@ -1,129 +1,100 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
2
|
|
|
3
3
|
const browser = require('@sentry/browser');
|
|
4
|
-
const
|
|
4
|
+
const browser$1 = require('@sentry/core/browser');
|
|
5
|
+
const attributes = require('@sentry/conventions/attributes');
|
|
5
6
|
|
|
6
|
-
|
|
7
|
-
// these types are required for correct functionality.
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* A browser tracing integration that uses React Router v3 to instrument navigations.
|
|
11
|
-
* Expects `history` (and optionally `routes` and `matchPath`) to be passed as options.
|
|
12
|
-
*/
|
|
13
|
-
function reactRouterV3BrowserTracingIntegration(
|
|
14
|
-
options,
|
|
15
|
-
) {
|
|
7
|
+
function reactRouterV3BrowserTracingIntegration(options) {
|
|
16
8
|
const integration = browser.browserTracingIntegration({
|
|
17
9
|
...options,
|
|
18
10
|
instrumentPageLoad: false,
|
|
19
|
-
instrumentNavigation: false
|
|
11
|
+
instrumentNavigation: false
|
|
20
12
|
});
|
|
21
|
-
|
|
22
13
|
const { history, routes, match, instrumentPageLoad = true, instrumentNavigation = true } = options;
|
|
23
|
-
|
|
24
14
|
return {
|
|
25
15
|
...integration,
|
|
26
16
|
afterAllSetup(client) {
|
|
27
17
|
integration.afterAllSetup(client);
|
|
28
|
-
|
|
29
18
|
if (instrumentPageLoad && browser.WINDOW.location) {
|
|
30
19
|
normalizeTransactionName(
|
|
31
20
|
routes,
|
|
32
|
-
browser.WINDOW.location
|
|
21
|
+
browser.WINDOW.location,
|
|
33
22
|
match,
|
|
34
|
-
(localName, source =
|
|
23
|
+
(localName, source = "url") => {
|
|
35
24
|
browser.startBrowserTracingPageLoadSpan(client, {
|
|
36
25
|
name: localName,
|
|
37
26
|
attributes: {
|
|
38
|
-
[
|
|
39
|
-
[
|
|
40
|
-
[
|
|
41
|
-
|
|
27
|
+
[browser$1.SEMANTIC_ATTRIBUTE_SENTRY_OP]: "pageload",
|
|
28
|
+
[browser$1.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.pageload.react.reactrouter_v3",
|
|
29
|
+
[browser$1.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: source,
|
|
30
|
+
...source === "route" && { [attributes.URL_TEMPLATE]: localName }
|
|
31
|
+
}
|
|
42
32
|
});
|
|
43
|
-
}
|
|
33
|
+
}
|
|
44
34
|
);
|
|
45
35
|
}
|
|
46
|
-
|
|
47
36
|
if (instrumentNavigation && history.listen) {
|
|
48
|
-
history.listen(location => {
|
|
49
|
-
if (location.action ===
|
|
37
|
+
history.listen((location) => {
|
|
38
|
+
if (location.action === "PUSH" || location.action === "POP") {
|
|
50
39
|
normalizeTransactionName(
|
|
51
40
|
routes,
|
|
52
41
|
location,
|
|
53
42
|
match,
|
|
54
|
-
(localName, source =
|
|
43
|
+
(localName, source = "url") => {
|
|
55
44
|
browser.startBrowserTracingNavigationSpan(client, {
|
|
56
45
|
name: localName,
|
|
57
46
|
attributes: {
|
|
58
|
-
[
|
|
59
|
-
[
|
|
60
|
-
[
|
|
61
|
-
|
|
47
|
+
[browser$1.SEMANTIC_ATTRIBUTE_SENTRY_OP]: "navigation",
|
|
48
|
+
[browser$1.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.navigation.react.reactrouter_v3",
|
|
49
|
+
[browser$1.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: source,
|
|
50
|
+
...source === "route" && { [attributes.URL_TEMPLATE]: localName }
|
|
51
|
+
}
|
|
62
52
|
});
|
|
63
|
-
}
|
|
53
|
+
}
|
|
64
54
|
);
|
|
65
55
|
}
|
|
66
56
|
});
|
|
67
57
|
}
|
|
68
|
-
}
|
|
58
|
+
}
|
|
69
59
|
};
|
|
70
60
|
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Normalize transaction names using `Router.match`
|
|
74
|
-
*/
|
|
75
|
-
function normalizeTransactionName(
|
|
76
|
-
appRoutes,
|
|
77
|
-
location,
|
|
78
|
-
match,
|
|
79
|
-
callback,
|
|
80
|
-
) {
|
|
61
|
+
function normalizeTransactionName(appRoutes, location, match, callback) {
|
|
81
62
|
let name = location.pathname;
|
|
82
63
|
match(
|
|
83
64
|
{
|
|
84
65
|
location,
|
|
85
|
-
routes: appRoutes
|
|
66
|
+
routes: appRoutes
|
|
86
67
|
},
|
|
87
68
|
(error, _redirectLocation, renderProps) => {
|
|
88
69
|
if (error || !renderProps) {
|
|
89
70
|
return callback(name);
|
|
90
71
|
}
|
|
91
|
-
|
|
92
72
|
const routePath = getRouteStringFromRoutes(renderProps.routes || []);
|
|
93
|
-
if (routePath.length === 0 || routePath ===
|
|
73
|
+
if (routePath.length === 0 || routePath === "/*") {
|
|
94
74
|
return callback(name);
|
|
95
75
|
}
|
|
96
|
-
|
|
97
76
|
name = routePath;
|
|
98
|
-
return callback(name,
|
|
99
|
-
}
|
|
77
|
+
return callback(name, "route");
|
|
78
|
+
}
|
|
100
79
|
);
|
|
101
80
|
}
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* Generate route name from array of routes
|
|
105
|
-
*/
|
|
106
81
|
function getRouteStringFromRoutes(routes) {
|
|
107
82
|
if (!Array.isArray(routes) || routes.length === 0) {
|
|
108
|
-
return
|
|
83
|
+
return "";
|
|
109
84
|
}
|
|
110
|
-
|
|
111
85
|
const routesWithPaths = routes.filter((route) => !!route.path);
|
|
112
|
-
|
|
113
86
|
let index = -1;
|
|
114
87
|
for (let x = routesWithPaths.length - 1; x >= 0; x--) {
|
|
115
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
116
88
|
const route = routesWithPaths[x];
|
|
117
|
-
if (route.path?.startsWith(
|
|
89
|
+
if (route.path?.startsWith("/")) {
|
|
118
90
|
index = x;
|
|
119
91
|
break;
|
|
120
92
|
}
|
|
121
93
|
}
|
|
122
|
-
|
|
123
94
|
return routesWithPaths.slice(index).reduce((acc, { path }) => {
|
|
124
|
-
const pathSegment = acc ===
|
|
95
|
+
const pathSegment = acc === "/" || acc === "" ? path : `/${path}`;
|
|
125
96
|
return `${acc}${pathSegment}`;
|
|
126
|
-
},
|
|
97
|
+
}, "");
|
|
127
98
|
}
|
|
128
99
|
|
|
129
100
|
exports.reactRouterV3BrowserTracingIntegration = reactRouterV3BrowserTracingIntegration;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactrouterv3.js","sources":["../../src/reactrouterv3.ts"],"sourcesContent":["import {\n browserTracingIntegration,\n startBrowserTracingNavigationSpan,\n startBrowserTracingPageLoadSpan,\n WINDOW,\n} from '@sentry/browser';\nimport type { Integration, TransactionSource } from '@sentry/core';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n} from '@sentry/core';\nimport type { Location } 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 if (instrumentPageLoad && WINDOW.location) {\n normalizeTransactionName(\n routes,\n WINDOW.location as unknown as Location,\n match,\n (localName: string, source: ReactRouterV3TransactionSource = 'url') => {\n startBrowserTracingPageLoadSpan(client, {\n name: localName,\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 (instrumentNavigation && history.listen) {\n history.listen(location => {\n if (location.action === 'PUSH' || location.action === 'POP') {\n normalizeTransactionName(\n routes,\n location,\n match,\n (localName: string, source: TransactionSource = 'url') => {\n startBrowserTracingNavigationSpan(client, {\n name: localName,\n attributes: {\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 },\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 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const route = routesWithPaths[x]!;\n if (route.path?.startsWith('/')) {\n index = x;\n break;\n }\n }\n\n return routesWithPaths.slice(index).reduce((acc, { path }) => {\n const pathSegment = acc === '/' || acc === '' ? path : `/${path}`;\n return `${acc}${pathSegment}`;\n }, '');\n}\n"],"names":["browserTracingIntegration","WINDOW","startBrowserTracingPageLoadSpan","SEMANTIC_ATTRIBUTE_SENTRY_OP","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","SEMANTIC_ATTRIBUTE_SENTRY_SOURCE","startBrowserTracingNavigationSpan"],"mappings":"
|
|
1
|
+
{"version":3,"file":"reactrouterv3.js","sources":["../../src/reactrouterv3.ts"],"sourcesContent":["import {\n browserTracingIntegration,\n startBrowserTracingNavigationSpan,\n startBrowserTracingPageLoadSpan,\n WINDOW,\n} from '@sentry/browser';\nimport type { Integration, TransactionSource } from '@sentry/core/browser';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n} from '@sentry/core/browser';\nimport type { Location } from './types';\nimport { URL_TEMPLATE } from '@sentry/conventions/attributes';\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 if (instrumentPageLoad && WINDOW.location) {\n normalizeTransactionName(\n routes,\n WINDOW.location as unknown as Location,\n match,\n (localName: string, source: ReactRouterV3TransactionSource = 'url') => {\n startBrowserTracingPageLoadSpan(client, {\n name: localName,\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 ...(source === 'route' && { [URL_TEMPLATE]: localName }),\n },\n });\n },\n );\n }\n\n if (instrumentNavigation && history.listen) {\n history.listen(location => {\n if (location.action === 'PUSH' || location.action === 'POP') {\n normalizeTransactionName(\n routes,\n location,\n match,\n (localName: string, source: TransactionSource = 'url') => {\n startBrowserTracingNavigationSpan(client, {\n name: localName,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'navigation',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.navigation.react.reactrouter_v3',\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: source,\n ...(source === 'route' && { [URL_TEMPLATE]: localName }),\n },\n });\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 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const route = routesWithPaths[x]!;\n if (route.path?.startsWith('/')) {\n index = x;\n break;\n }\n }\n\n return routesWithPaths.slice(index).reduce((acc, { path }) => {\n const pathSegment = acc === '/' || acc === '' ? path : `/${path}`;\n return `${acc}${pathSegment}`;\n }, '');\n}\n"],"names":["browserTracingIntegration","WINDOW","startBrowserTracingPageLoadSpan","SEMANTIC_ATTRIBUTE_SENTRY_OP","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","SEMANTIC_ATTRIBUTE_SENTRY_SOURCE","URL_TEMPLATE","startBrowserTracingNavigationSpan"],"mappings":"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"}
|
|
@@ -1,56 +1,24 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
2
|
|
|
3
3
|
const instrumentation = require('./reactrouter-compat-utils/instrumentation.js');
|
|
4
|
-
require('@sentry/core');
|
|
4
|
+
require('@sentry/core/browser');
|
|
5
5
|
require('@sentry/browser');
|
|
6
|
+
require('@sentry/core');
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
* Expects `useEffect`, `useLocation`, `useNavigationType`, `createRoutesFromChildren` and `matchRoutes` to be passed as options.
|
|
10
|
-
*/
|
|
11
|
-
function reactRouterV6BrowserTracingIntegration(
|
|
12
|
-
options,
|
|
13
|
-
) {
|
|
14
|
-
return instrumentation.createReactRouterV6CompatibleTracingIntegration(options, '6');
|
|
8
|
+
function reactRouterV6BrowserTracingIntegration(options) {
|
|
9
|
+
return instrumentation.createReactRouterV6CompatibleTracingIntegration(options, "6");
|
|
15
10
|
}
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* A wrapper function that adds Sentry routing instrumentation to a React Router v6 useRoutes hook.
|
|
19
|
-
* This is used to automatically capture route changes as transactions when using the useRoutes hook.
|
|
20
|
-
*/
|
|
21
11
|
function wrapUseRoutesV6(origUseRoutes) {
|
|
22
|
-
return instrumentation.createV6CompatibleWrapUseRoutes(origUseRoutes,
|
|
12
|
+
return instrumentation.createV6CompatibleWrapUseRoutes(origUseRoutes, "6");
|
|
23
13
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
* A wrapper function that adds Sentry routing instrumentation to a React Router v6 createBrowserRouter function.
|
|
27
|
-
* This is used to automatically capture route changes as transactions when using the createBrowserRouter API.
|
|
28
|
-
*/
|
|
29
|
-
function wrapCreateBrowserRouterV6
|
|
30
|
-
|
|
31
|
-
(createRouterFunction) {
|
|
32
|
-
return instrumentation.createV6CompatibleWrapCreateBrowserRouter(createRouterFunction, '6');
|
|
14
|
+
function wrapCreateBrowserRouterV6(createRouterFunction) {
|
|
15
|
+
return instrumentation.createV6CompatibleWrapCreateBrowserRouter(createRouterFunction, "6");
|
|
33
16
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
* A wrapper function that adds Sentry routing instrumentation to a React Router v6 createMemoryRouter function.
|
|
37
|
-
* This is used to automatically capture route changes as transactions when using the createMemoryRouter API.
|
|
38
|
-
* The difference between createBrowserRouter and createMemoryRouter is that with createMemoryRouter,
|
|
39
|
-
* optional `initialEntries` are also taken into account.
|
|
40
|
-
*/
|
|
41
|
-
function wrapCreateMemoryRouterV6
|
|
42
|
-
|
|
43
|
-
(createMemoryRouterFunction) {
|
|
44
|
-
return instrumentation.createV6CompatibleWrapCreateMemoryRouter(createMemoryRouterFunction, '6');
|
|
17
|
+
function wrapCreateMemoryRouterV6(createMemoryRouterFunction) {
|
|
18
|
+
return instrumentation.createV6CompatibleWrapCreateMemoryRouter(createMemoryRouterFunction, "6");
|
|
45
19
|
}
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* A higher-order component that adds Sentry routing instrumentation to a React Router v6 Route component.
|
|
49
|
-
* This is used to automatically capture route changes as transactions.
|
|
50
|
-
*/
|
|
51
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
52
20
|
function withSentryReactRouterV6Routing(routes) {
|
|
53
|
-
return instrumentation.createV6CompatibleWithSentryReactRouterRouting(routes,
|
|
21
|
+
return instrumentation.createV6CompatibleWithSentryReactRouterRouting(routes, "6");
|
|
54
22
|
}
|
|
55
23
|
|
|
56
24
|
exports.reactRouterV6BrowserTracingIntegration = reactRouterV6BrowserTracingIntegration;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactrouterv6.js","sources":["../../src/reactrouterv6.tsx"],"sourcesContent":["import type { browserTracingIntegration } from '@sentry/browser';\nimport type { Integration } from '@sentry/core';\nimport type { ReactRouterOptions } from './reactrouter-compat-utils';\nimport {\n createReactRouterV6CompatibleTracingIntegration,\n createV6CompatibleWithSentryReactRouterRouting,\n createV6CompatibleWrapCreateBrowserRouter,\n createV6CompatibleWrapCreateMemoryRouter,\n createV6CompatibleWrapUseRoutes,\n} from './reactrouter-compat-utils';\nimport type { CreateRouterFunction, Router, RouterState, UseRoutes } from './types';\n\n/**\n * A browser tracing integration that uses React Router v6 to instrument navigations.\n * Expects `useEffect`, `useLocation`, `useNavigationType`, `createRoutesFromChildren` and `matchRoutes` to be passed as options.\n */\nexport function reactRouterV6BrowserTracingIntegration(\n options: Parameters<typeof browserTracingIntegration>[0] & ReactRouterOptions,\n): Integration {\n return createReactRouterV6CompatibleTracingIntegration(options, '6');\n}\n\n/**\n * A wrapper function that adds Sentry routing instrumentation to a React Router v6 useRoutes hook.\n * This is used to automatically capture route changes as transactions when using the useRoutes hook.\n */\nexport function wrapUseRoutesV6(origUseRoutes: UseRoutes): UseRoutes {\n return createV6CompatibleWrapUseRoutes(origUseRoutes, '6');\n}\n\n/**\n * A wrapper function that adds Sentry routing instrumentation to a React Router v6 createBrowserRouter function.\n * This is used to automatically capture route changes as transactions when using the createBrowserRouter API.\n */\nexport function wrapCreateBrowserRouterV6<\n TState extends RouterState = RouterState,\n TRouter extends Router<TState> = Router<TState>,\n>(createRouterFunction: CreateRouterFunction<TState, TRouter>): CreateRouterFunction<TState, TRouter> {\n return createV6CompatibleWrapCreateBrowserRouter(createRouterFunction, '6');\n}\n\n/**\n * A wrapper function that adds Sentry routing instrumentation to a React Router v6 createMemoryRouter function.\n * This is used to automatically capture route changes as transactions when using the createMemoryRouter API.\n * The difference between createBrowserRouter and createMemoryRouter is that with createMemoryRouter,\n * optional `initialEntries` are also taken into account.\n */\nexport function wrapCreateMemoryRouterV6<\n TState extends RouterState = RouterState,\n TRouter extends Router<TState> = Router<TState>,\n>(createMemoryRouterFunction: CreateRouterFunction<TState, TRouter>): CreateRouterFunction<TState, TRouter> {\n return createV6CompatibleWrapCreateMemoryRouter(createMemoryRouterFunction, '6');\n}\n\n/**\n * A higher-order component that adds Sentry routing instrumentation to a React Router v6 Route component.\n * This is used to automatically capture route changes as transactions.\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 return createV6CompatibleWithSentryReactRouterRouting<P, R>(routes, '6');\n}\n"],"names":["createReactRouterV6CompatibleTracingIntegration","createV6CompatibleWrapUseRoutes","createV6CompatibleWrapCreateBrowserRouter","createV6CompatibleWrapCreateMemoryRouter","createV6CompatibleWithSentryReactRouterRouting"],"mappings":"
|
|
1
|
+
{"version":3,"file":"reactrouterv6.js","sources":["../../src/reactrouterv6.tsx"],"sourcesContent":["import type { browserTracingIntegration } from '@sentry/browser';\nimport type { Integration } from '@sentry/core';\nimport type { ReactRouterOptions } from './reactrouter-compat-utils';\nimport {\n createReactRouterV6CompatibleTracingIntegration,\n createV6CompatibleWithSentryReactRouterRouting,\n createV6CompatibleWrapCreateBrowserRouter,\n createV6CompatibleWrapCreateMemoryRouter,\n createV6CompatibleWrapUseRoutes,\n} from './reactrouter-compat-utils';\nimport type { CreateRouterFunction, Router, RouterState, UseRoutes } from './types';\n\n/**\n * A browser tracing integration that uses React Router v6 to instrument navigations.\n * Expects `useEffect`, `useLocation`, `useNavigationType`, `createRoutesFromChildren` and `matchRoutes` to be passed as options.\n *\n * @deprecated Use `reactRouterBrowserTracingIntegration` instead.\n */\nexport function reactRouterV6BrowserTracingIntegration(\n options: Parameters<typeof browserTracingIntegration>[0] & ReactRouterOptions,\n): Integration {\n return createReactRouterV6CompatibleTracingIntegration(options, '6');\n}\n\n/**\n * A wrapper function that adds Sentry routing instrumentation to a React Router v6 useRoutes hook.\n * This is used to automatically capture route changes as transactions when using the useRoutes hook.\n *\n * @deprecated Use `wrapUseRoutes` instead.\n */\nexport function wrapUseRoutesV6(origUseRoutes: UseRoutes): UseRoutes {\n return createV6CompatibleWrapUseRoutes(origUseRoutes, '6');\n}\n\n/**\n * A wrapper function that adds Sentry routing instrumentation to a React Router v6 createBrowserRouter function.\n * This is used to automatically capture route changes as transactions when using the createBrowserRouter API.\n *\n * @deprecated Use `wrapCreateBrowserRouter` instead.\n */\nexport function wrapCreateBrowserRouterV6<\n TState extends RouterState = RouterState,\n TRouter extends Router<TState> = Router<TState>,\n>(createRouterFunction: CreateRouterFunction<TState, TRouter>): CreateRouterFunction<TState, TRouter> {\n return createV6CompatibleWrapCreateBrowserRouter(createRouterFunction, '6');\n}\n\n/**\n * A wrapper function that adds Sentry routing instrumentation to a React Router v6 createMemoryRouter function.\n * This is used to automatically capture route changes as transactions when using the createMemoryRouter API.\n * The difference between createBrowserRouter and createMemoryRouter is that with createMemoryRouter,\n * optional `initialEntries` are also taken into account.\n *\n * @deprecated Use `wrapCreateMemoryRouter` instead.\n */\nexport function wrapCreateMemoryRouterV6<\n TState extends RouterState = RouterState,\n TRouter extends Router<TState> = Router<TState>,\n>(createMemoryRouterFunction: CreateRouterFunction<TState, TRouter>): CreateRouterFunction<TState, TRouter> {\n return createV6CompatibleWrapCreateMemoryRouter(createMemoryRouterFunction, '6');\n}\n\n/**\n * A higher-order component that adds Sentry routing instrumentation to a React Router v6 Route component.\n * This is used to automatically capture route changes as transactions.\n *\n * @deprecated Use `wrapReactRouterRouting` instead.\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 return createV6CompatibleWithSentryReactRouterRouting<P, R>(routes, '6');\n}\n"],"names":["createReactRouterV6CompatibleTracingIntegration","createV6CompatibleWrapUseRoutes","createV6CompatibleWrapCreateBrowserRouter","createV6CompatibleWrapCreateMemoryRouter","createV6CompatibleWithSentryReactRouterRouting"],"mappings":";;;;;;;AAkBO,SAAS,uCACd,OAAA,EACa;AACb,EAAA,OAAOA,+DAAA,CAAgD,SAAS,GAAG,CAAA;AACrE;AAQO,SAAS,gBAAgB,aAAA,EAAqC;AACnE,EAAA,OAAOC,+CAAA,CAAgC,eAAe,GAAG,CAAA;AAC3D;AAQO,SAAS,0BAGd,oBAAA,EAAoG;AACpG,EAAA,OAAOC,yDAAA,CAA0C,sBAAsB,GAAG,CAAA;AAC5E;AAUO,SAAS,yBAGd,0BAAA,EAA0G;AAC1G,EAAA,OAAOC,wDAAA,CAAyC,4BAA4B,GAAG,CAAA;AACjF;AASO,SAAS,+BAAqF,MAAA,EAAc;AACjH,EAAA,OAAOC,8DAAA,CAAqD,QAAQ,GAAG,CAAA;AACzE;;;;;;;;"}
|