@sentry/react 8.41.0-beta.1 → 8.42.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/build/cjs/error.js.map +1 -1
- package/build/cjs/errorboundary.js.map +1 -1
- package/build/cjs/index.js +7 -0
- package/build/cjs/index.js.map +1 -1
- package/build/cjs/profiler.js.map +1 -1
- package/build/cjs/reactrouter.js +1 -1
- package/build/cjs/reactrouter.js.map +1 -1
- package/build/cjs/reactrouterv3.js.map +1 -1
- package/build/cjs/reactrouterv6-compat-utils.js +415 -0
- package/build/cjs/reactrouterv6-compat-utils.js.map +1 -0
- package/build/cjs/reactrouterv6.js +31 -373
- package/build/cjs/reactrouterv6.js.map +1 -1
- package/build/cjs/reactrouterv7.js +46 -0
- package/build/cjs/reactrouterv7.js.map +1 -0
- package/build/cjs/redux.js +0 -2
- package/build/cjs/redux.js.map +1 -1
- package/build/cjs/sdk.js.map +1 -1
- package/build/cjs/tanstackrouter.js.map +1 -1
- package/build/esm/error.js.map +1 -1
- package/build/esm/errorboundary.js.map +1 -1
- package/build/esm/index.js +2 -1
- package/build/esm/index.js.map +1 -1
- package/build/esm/package.json +1 -1
- package/build/esm/profiler.js.map +1 -1
- package/build/esm/reactrouter.js +1 -1
- package/build/esm/reactrouter.js.map +1 -1
- package/build/esm/reactrouterv3.js.map +1 -1
- package/build/esm/reactrouterv6-compat-utils.js +392 -0
- package/build/esm/reactrouterv6-compat-utils.js.map +1 -0
- package/build/esm/reactrouterv6.js +30 -357
- package/build/esm/reactrouterv6.js.map +1 -1
- package/build/esm/reactrouterv7.js +41 -0
- package/build/esm/reactrouterv7.js.map +1 -0
- package/build/esm/redux.js +0 -2
- package/build/esm/redux.js.map +1 -1
- package/build/esm/sdk.js.map +1 -1
- package/build/esm/tanstackrouter.js.map +1 -1
- package/build/types/error.d.ts +1 -1
- package/build/types/error.d.ts.map +1 -1
- package/build/types/errorboundary.d.ts +1 -1
- package/build/types/errorboundary.d.ts.map +1 -1
- package/build/types/index.d.ts +2 -1
- package/build/types/index.d.ts.map +1 -1
- package/build/types/profiler.d.ts +1 -1
- package/build/types/profiler.d.ts.map +1 -1
- package/build/types/reactrouter.d.ts +1 -1
- 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-compat-utils.d.ts +26 -0
- package/build/types/reactrouterv6-compat-utils.d.ts.map +1 -0
- package/build/types/reactrouterv6.d.ts +30 -16
- package/build/types/reactrouterv6.d.ts.map +1 -1
- package/build/types/reactrouterv7.d.ts +26 -0
- package/build/types/reactrouterv7.d.ts.map +1 -0
- 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-ts3.8/error.d.ts +1 -1
- package/build/types-ts3.8/errorboundary.d.ts +1 -1
- package/build/types-ts3.8/index.d.ts +2 -1
- package/build/types-ts3.8/profiler.d.ts +1 -1
- package/build/types-ts3.8/reactrouter.d.ts +1 -1
- package/build/types-ts3.8/reactrouterv3.d.ts +1 -1
- package/build/types-ts3.8/reactrouterv6-compat-utils.d.ts +26 -0
- package/build/types-ts3.8/reactrouterv6.d.ts +29 -15
- package/build/types-ts3.8/reactrouterv7.d.ts +26 -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/package.json +3 -4
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
2
|
+
|
|
3
|
+
const browser = require('@sentry/browser');
|
|
4
|
+
const core = require('@sentry/core');
|
|
5
|
+
const React = require('react');
|
|
6
|
+
const hoistNonReactStatics = require('hoist-non-react-statics');
|
|
7
|
+
const debugBuild = require('./debug-build.js');
|
|
8
|
+
|
|
9
|
+
const _interopDefault = e => e && e.__esModule ? e.default : e;
|
|
10
|
+
|
|
11
|
+
function _interopNamespace(e) {
|
|
12
|
+
if (e && e.__esModule) return e;
|
|
13
|
+
const n = Object.create(null);
|
|
14
|
+
if (e) {
|
|
15
|
+
for (const k in e) {
|
|
16
|
+
n[k] = e[k];
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
n.default = e;
|
|
20
|
+
return n;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
24
|
+
const hoistNonReactStatics__default = /*#__PURE__*/_interopDefault(hoistNonReactStatics);
|
|
25
|
+
|
|
26
|
+
/* eslint-disable max-lines */
|
|
27
|
+
// Inspired from Donnie McNeal's solution:
|
|
28
|
+
// https://gist.github.com/wontondon/e8c4bdf2888875e4c755712e99279536
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
let _useEffect;
|
|
32
|
+
let _useLocation;
|
|
33
|
+
let _useNavigationType;
|
|
34
|
+
let _createRoutesFromChildren;
|
|
35
|
+
let _matchRoutes;
|
|
36
|
+
let _stripBasename = false;
|
|
37
|
+
|
|
38
|
+
const CLIENTS_WITH_INSTRUMENT_NAVIGATION = new WeakSet();
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Creates a wrapCreateBrowserRouter function that can be used with all React Router v6 compatible versions.
|
|
42
|
+
*/
|
|
43
|
+
function createV6CompatibleWrapCreateBrowserRouter
|
|
44
|
+
|
|
45
|
+
(
|
|
46
|
+
createRouterFunction,
|
|
47
|
+
version,
|
|
48
|
+
) {
|
|
49
|
+
if (!_useEffect || !_useLocation || !_useNavigationType || !_matchRoutes) {
|
|
50
|
+
debugBuild.DEBUG_BUILD &&
|
|
51
|
+
core.logger.warn(
|
|
52
|
+
`reactRouterV${version}Instrumentation was unable to wrap the \`createRouter\` function because of one or more missing parameters.`,
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
return createRouterFunction;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// `opts` for createBrowserHistory and createMemoryHistory are different, but also not relevant for us at the moment.
|
|
59
|
+
// `basename` is the only option that is relevant for us, and it is the same for all.
|
|
60
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
61
|
+
return function (routes, opts) {
|
|
62
|
+
const router = createRouterFunction(routes, opts);
|
|
63
|
+
const basename = opts && opts.basename;
|
|
64
|
+
|
|
65
|
+
const activeRootSpan = getActiveRootSpan();
|
|
66
|
+
|
|
67
|
+
// The initial load ends when `createBrowserRouter` is called.
|
|
68
|
+
// This is the earliest convenient time to update the transaction name.
|
|
69
|
+
// Callbacks to `router.subscribe` are not called for the initial load.
|
|
70
|
+
if (router.state.historyAction === 'POP' && activeRootSpan) {
|
|
71
|
+
updatePageloadTransaction(activeRootSpan, router.state.location, routes, undefined, basename);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
router.subscribe((state) => {
|
|
75
|
+
const location = state.location;
|
|
76
|
+
if (state.historyAction === 'PUSH' || state.historyAction === 'POP') {
|
|
77
|
+
handleNavigation(location, routes, state.historyAction, version, undefined, basename);
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
return router;
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Creates a browser tracing integration that can be used with all React Router v6 compatible versions.
|
|
87
|
+
*/
|
|
88
|
+
function createReactRouterV6CompatibleTracingIntegration(
|
|
89
|
+
options,
|
|
90
|
+
version,
|
|
91
|
+
) {
|
|
92
|
+
const integration = browser.browserTracingIntegration({
|
|
93
|
+
...options,
|
|
94
|
+
instrumentPageLoad: false,
|
|
95
|
+
instrumentNavigation: false,
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
const {
|
|
99
|
+
useEffect,
|
|
100
|
+
useLocation,
|
|
101
|
+
useNavigationType,
|
|
102
|
+
createRoutesFromChildren,
|
|
103
|
+
matchRoutes,
|
|
104
|
+
stripBasename,
|
|
105
|
+
instrumentPageLoad = true,
|
|
106
|
+
instrumentNavigation = true,
|
|
107
|
+
} = options;
|
|
108
|
+
|
|
109
|
+
return {
|
|
110
|
+
...integration,
|
|
111
|
+
setup() {
|
|
112
|
+
_useEffect = useEffect;
|
|
113
|
+
_useLocation = useLocation;
|
|
114
|
+
_useNavigationType = useNavigationType;
|
|
115
|
+
_matchRoutes = matchRoutes;
|
|
116
|
+
_createRoutesFromChildren = createRoutesFromChildren;
|
|
117
|
+
_stripBasename = stripBasename || false;
|
|
118
|
+
},
|
|
119
|
+
afterAllSetup(client) {
|
|
120
|
+
integration.afterAllSetup(client);
|
|
121
|
+
|
|
122
|
+
const initPathName = browser.WINDOW && browser.WINDOW.location && browser.WINDOW.location.pathname;
|
|
123
|
+
if (instrumentPageLoad && initPathName) {
|
|
124
|
+
browser.startBrowserTracingPageLoadSpan(client, {
|
|
125
|
+
name: initPathName,
|
|
126
|
+
attributes: {
|
|
127
|
+
[core.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'url',
|
|
128
|
+
[core.SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'pageload',
|
|
129
|
+
[core.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: `auto.pageload.react.reactrouter_v${version}`,
|
|
130
|
+
},
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if (instrumentNavigation) {
|
|
135
|
+
CLIENTS_WITH_INSTRUMENT_NAVIGATION.add(client);
|
|
136
|
+
}
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function createV6CompatibleWrapUseRoutes(origUseRoutes, version) {
|
|
142
|
+
if (!_useEffect || !_useLocation || !_useNavigationType || !_matchRoutes) {
|
|
143
|
+
debugBuild.DEBUG_BUILD &&
|
|
144
|
+
core.logger.warn(
|
|
145
|
+
'reactRouterV6Instrumentation was unable to wrap `useRoutes` because of one or more missing parameters.',
|
|
146
|
+
);
|
|
147
|
+
|
|
148
|
+
return origUseRoutes;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
let isMountRenderPass = true;
|
|
152
|
+
|
|
153
|
+
const SentryRoutes
|
|
154
|
+
|
|
155
|
+
= (props) => {
|
|
156
|
+
const { routes, locationArg } = props;
|
|
157
|
+
|
|
158
|
+
const Routes = origUseRoutes(routes, locationArg);
|
|
159
|
+
|
|
160
|
+
const location = _useLocation();
|
|
161
|
+
const navigationType = _useNavigationType();
|
|
162
|
+
|
|
163
|
+
// A value with stable identity to either pick `locationArg` if available or `location` if not
|
|
164
|
+
const stableLocationParam =
|
|
165
|
+
typeof locationArg === 'string' || (locationArg && locationArg.pathname)
|
|
166
|
+
? (locationArg )
|
|
167
|
+
: location;
|
|
168
|
+
|
|
169
|
+
_useEffect(() => {
|
|
170
|
+
const normalizedLocation =
|
|
171
|
+
typeof stableLocationParam === 'string' ? { pathname: stableLocationParam } : stableLocationParam;
|
|
172
|
+
|
|
173
|
+
if (isMountRenderPass) {
|
|
174
|
+
updatePageloadTransaction(getActiveRootSpan(), normalizedLocation, routes);
|
|
175
|
+
isMountRenderPass = false;
|
|
176
|
+
} else {
|
|
177
|
+
handleNavigation(normalizedLocation, routes, navigationType, version);
|
|
178
|
+
}
|
|
179
|
+
}, [navigationType, stableLocationParam]);
|
|
180
|
+
|
|
181
|
+
return Routes;
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
// eslint-disable-next-line react/display-name
|
|
185
|
+
return (routes, locationArg) => {
|
|
186
|
+
return React__namespace.createElement(SentryRoutes, { routes: routes, locationArg: locationArg,} );
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
function handleNavigation(
|
|
191
|
+
location,
|
|
192
|
+
routes,
|
|
193
|
+
navigationType,
|
|
194
|
+
version,
|
|
195
|
+
matches,
|
|
196
|
+
basename,
|
|
197
|
+
) {
|
|
198
|
+
const branches = Array.isArray(matches) ? matches : _matchRoutes(routes, location, basename);
|
|
199
|
+
|
|
200
|
+
const client = core.getClient();
|
|
201
|
+
if (!client || !CLIENTS_WITH_INSTRUMENT_NAVIGATION.has(client)) {
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
if ((navigationType === 'PUSH' || navigationType === 'POP') && branches) {
|
|
206
|
+
const [name, source] = getNormalizedName(routes, location, branches, basename);
|
|
207
|
+
|
|
208
|
+
browser.startBrowserTracingNavigationSpan(client, {
|
|
209
|
+
name,
|
|
210
|
+
attributes: {
|
|
211
|
+
[core.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: source,
|
|
212
|
+
[core.SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'navigation',
|
|
213
|
+
[core.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: `auto.navigation.react.reactrouter_v${version}`,
|
|
214
|
+
},
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Strip the basename from a pathname if exists.
|
|
221
|
+
*
|
|
222
|
+
* Vendored and modified from `react-router`
|
|
223
|
+
* https://github.com/remix-run/react-router/blob/462bb712156a3f739d6139a0f14810b76b002df6/packages/router/utils.ts#L1038
|
|
224
|
+
*/
|
|
225
|
+
function stripBasenameFromPathname(pathname, basename) {
|
|
226
|
+
if (!basename || basename === '/') {
|
|
227
|
+
return pathname;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
if (!pathname.toLowerCase().startsWith(basename.toLowerCase())) {
|
|
231
|
+
return pathname;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// We want to leave trailing slash behavior in the user's control, so if they
|
|
235
|
+
// specify a basename with a trailing slash, we should support it
|
|
236
|
+
const startIndex = basename.endsWith('/') ? basename.length - 1 : basename.length;
|
|
237
|
+
const nextChar = pathname.charAt(startIndex);
|
|
238
|
+
if (nextChar && nextChar !== '/') {
|
|
239
|
+
// pathname does not start with basename/
|
|
240
|
+
return pathname;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
return pathname.slice(startIndex) || '/';
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
function sendIndexPath(pathBuilder, pathname, basename) {
|
|
247
|
+
const reconstructedPath = pathBuilder || _stripBasename ? stripBasenameFromPathname(pathname, basename) : pathname;
|
|
248
|
+
|
|
249
|
+
const formattedPath =
|
|
250
|
+
// If the path ends with a slash, remove it
|
|
251
|
+
reconstructedPath[reconstructedPath.length - 1] === '/'
|
|
252
|
+
? reconstructedPath.slice(0, -1)
|
|
253
|
+
: // If the path ends with a wildcard, remove it
|
|
254
|
+
reconstructedPath.slice(-2) === '/*'
|
|
255
|
+
? reconstructedPath.slice(0, -1)
|
|
256
|
+
: reconstructedPath;
|
|
257
|
+
|
|
258
|
+
return [formattedPath, 'route'];
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
function pathEndsWithWildcard(path, branch) {
|
|
262
|
+
return (path.slice(-2) === '/*' && branch.route.children && branch.route.children.length > 0) || false;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
function pathIsWildcardAndHasChildren(path, branch) {
|
|
266
|
+
return (path === '*' && branch.route.children && branch.route.children.length > 0) || false;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
function getNormalizedName(
|
|
270
|
+
routes,
|
|
271
|
+
location,
|
|
272
|
+
branches,
|
|
273
|
+
basename = '',
|
|
274
|
+
) {
|
|
275
|
+
if (!routes || routes.length === 0) {
|
|
276
|
+
return [_stripBasename ? stripBasenameFromPathname(location.pathname, basename) : location.pathname, 'url'];
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
let pathBuilder = '';
|
|
280
|
+
if (branches) {
|
|
281
|
+
for (const branch of branches) {
|
|
282
|
+
const route = branch.route;
|
|
283
|
+
if (route) {
|
|
284
|
+
// Early return if index route
|
|
285
|
+
if (route.index) {
|
|
286
|
+
return sendIndexPath(pathBuilder, branch.pathname, basename);
|
|
287
|
+
}
|
|
288
|
+
const path = route.path;
|
|
289
|
+
|
|
290
|
+
// If path is not a wildcard and has no child routes, append the path
|
|
291
|
+
if (path && !pathIsWildcardAndHasChildren(path, branch)) {
|
|
292
|
+
const newPath = path[0] === '/' || pathBuilder[pathBuilder.length - 1] === '/' ? path : `/${path}`;
|
|
293
|
+
pathBuilder += newPath;
|
|
294
|
+
|
|
295
|
+
// If the path matches the current location, return the path
|
|
296
|
+
if (basename + branch.pathname === location.pathname) {
|
|
297
|
+
if (
|
|
298
|
+
// If the route defined on the element is something like
|
|
299
|
+
// <Route path="/stores/:storeId/products/:productId" element={<div>Product</div>} />
|
|
300
|
+
// We should check against the branch.pathname for the number of / separators
|
|
301
|
+
// TODO(v9): Put the implementation of `getNumberOfUrlSegments` in this file
|
|
302
|
+
// eslint-disable-next-line deprecation/deprecation
|
|
303
|
+
core.getNumberOfUrlSegments(pathBuilder) !== core.getNumberOfUrlSegments(branch.pathname) &&
|
|
304
|
+
// We should not count wildcard operators in the url segments calculation
|
|
305
|
+
pathBuilder.slice(-2) !== '/*'
|
|
306
|
+
) {
|
|
307
|
+
return [(_stripBasename ? '' : basename) + newPath, 'route'];
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// if the last character of the pathbuilder is a wildcard and there are children, remove the wildcard
|
|
311
|
+
if (pathEndsWithWildcard(pathBuilder, branch)) {
|
|
312
|
+
pathBuilder = pathBuilder.slice(0, -1);
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
return [(_stripBasename ? '' : basename) + pathBuilder, 'route'];
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
return [_stripBasename ? stripBasenameFromPathname(location.pathname, basename) : location.pathname, 'url'];
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
function updatePageloadTransaction(
|
|
326
|
+
activeRootSpan,
|
|
327
|
+
location,
|
|
328
|
+
routes,
|
|
329
|
+
matches,
|
|
330
|
+
basename,
|
|
331
|
+
) {
|
|
332
|
+
const branches = Array.isArray(matches)
|
|
333
|
+
? matches
|
|
334
|
+
: (_matchRoutes(routes, location, basename) );
|
|
335
|
+
|
|
336
|
+
if (branches) {
|
|
337
|
+
const [name, source] = getNormalizedName(routes, location, branches, basename);
|
|
338
|
+
|
|
339
|
+
core.getCurrentScope().setTransactionName(name);
|
|
340
|
+
|
|
341
|
+
if (activeRootSpan) {
|
|
342
|
+
activeRootSpan.updateName(name);
|
|
343
|
+
activeRootSpan.setAttribute(core.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, source);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
349
|
+
function createV6CompatibleWithSentryReactRouterRouting(
|
|
350
|
+
Routes,
|
|
351
|
+
version,
|
|
352
|
+
) {
|
|
353
|
+
if (!_useEffect || !_useLocation || !_useNavigationType || !_createRoutesFromChildren || !_matchRoutes) {
|
|
354
|
+
debugBuild.DEBUG_BUILD &&
|
|
355
|
+
core.logger.warn(`reactRouterV6Instrumentation was unable to wrap Routes because of one or more missing parameters.
|
|
356
|
+
useEffect: ${_useEffect}. useLocation: ${_useLocation}. useNavigationType: ${_useNavigationType}.
|
|
357
|
+
createRoutesFromChildren: ${_createRoutesFromChildren}. matchRoutes: ${_matchRoutes}.`);
|
|
358
|
+
|
|
359
|
+
return Routes;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
let isMountRenderPass = true;
|
|
363
|
+
|
|
364
|
+
const SentryRoutes = (props) => {
|
|
365
|
+
const location = _useLocation();
|
|
366
|
+
const navigationType = _useNavigationType();
|
|
367
|
+
|
|
368
|
+
_useEffect(
|
|
369
|
+
() => {
|
|
370
|
+
const routes = _createRoutesFromChildren(props.children) ;
|
|
371
|
+
|
|
372
|
+
if (isMountRenderPass) {
|
|
373
|
+
updatePageloadTransaction(getActiveRootSpan(), location, routes);
|
|
374
|
+
isMountRenderPass = false;
|
|
375
|
+
} else {
|
|
376
|
+
handleNavigation(location, routes, navigationType, version);
|
|
377
|
+
}
|
|
378
|
+
},
|
|
379
|
+
// `props.children` is purposely not included in the dependency array, because we do not want to re-run this effect
|
|
380
|
+
// when the children change. We only want to start transactions when the location or navigation type change.
|
|
381
|
+
[location, navigationType],
|
|
382
|
+
);
|
|
383
|
+
|
|
384
|
+
// @ts-expect-error Setting more specific React Component typing for `R` generic above
|
|
385
|
+
// will break advanced type inference done by react router params
|
|
386
|
+
return React__namespace.createElement(Routes, { ...props,} );
|
|
387
|
+
};
|
|
388
|
+
|
|
389
|
+
hoistNonReactStatics__default(SentryRoutes, Routes);
|
|
390
|
+
|
|
391
|
+
// @ts-expect-error Setting more specific React Component typing for `R` generic above
|
|
392
|
+
// will break advanced type inference done by react router params
|
|
393
|
+
return SentryRoutes;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
function getActiveRootSpan() {
|
|
397
|
+
const span = core.getActiveSpan();
|
|
398
|
+
const rootSpan = span ? core.getRootSpan(span) : undefined;
|
|
399
|
+
|
|
400
|
+
if (!rootSpan) {
|
|
401
|
+
return undefined;
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
const op = core.spanToJSON(rootSpan).op;
|
|
405
|
+
|
|
406
|
+
// Only use this root span if it is a pageload or navigation span
|
|
407
|
+
return op === 'navigation' || op === 'pageload' ? rootSpan : undefined;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
exports.createReactRouterV6CompatibleTracingIntegration = createReactRouterV6CompatibleTracingIntegration;
|
|
411
|
+
exports.createV6CompatibleWithSentryReactRouterRouting = createV6CompatibleWithSentryReactRouterRouting;
|
|
412
|
+
exports.createV6CompatibleWrapCreateBrowserRouter = createV6CompatibleWrapCreateBrowserRouter;
|
|
413
|
+
exports.createV6CompatibleWrapUseRoutes = createV6CompatibleWrapUseRoutes;
|
|
414
|
+
exports.handleNavigation = handleNavigation;
|
|
415
|
+
//# sourceMappingURL=reactrouterv6-compat-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactrouterv6-compat-utils.js","sources":["../../src/reactrouterv6-compat-utils.tsx"],"sourcesContent":["/* eslint-disable max-lines */\n// Inspired from Donnie McNeal's solution:\n// https://gist.github.com/wontondon/e8c4bdf2888875e4c755712e99279536\n\nimport {\n WINDOW,\n browserTracingIntegration,\n startBrowserTracingNavigationSpan,\n startBrowserTracingPageLoadSpan,\n} from '@sentry/browser';\nimport type { Client, Integration, Span, TransactionSource } from '@sentry/core';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n getActiveSpan,\n getClient,\n getCurrentScope,\n getNumberOfUrlSegments,\n getRootSpan,\n logger,\n spanToJSON,\n} from '@sentry/core';\nimport * as React from 'react';\n\nimport hoistNonReactStatics from 'hoist-non-react-statics';\nimport { DEBUG_BUILD } from './debug-build';\nimport type {\n Action,\n AgnosticDataRouteMatch,\n CreateRouterFunction,\n CreateRoutesFromChildren,\n Location,\n MatchRoutes,\n RouteMatch,\n RouteObject,\n Router,\n RouterState,\n UseEffect,\n UseLocation,\n UseNavigationType,\n UseRoutes,\n} from './types';\n\nlet _useEffect: UseEffect;\nlet _useLocation: UseLocation;\nlet _useNavigationType: UseNavigationType;\nlet _createRoutesFromChildren: CreateRoutesFromChildren;\nlet _matchRoutes: MatchRoutes;\nlet _stripBasename: boolean = false;\n\nconst CLIENTS_WITH_INSTRUMENT_NAVIGATION = new WeakSet<Client>();\n\nexport interface ReactRouterOptions {\n useEffect: UseEffect;\n useLocation: UseLocation;\n useNavigationType: UseNavigationType;\n createRoutesFromChildren: CreateRoutesFromChildren;\n matchRoutes: MatchRoutes;\n stripBasename?: boolean;\n}\n\ntype V6CompatibleVersion = '6' | '7';\n\n/**\n * Creates a wrapCreateBrowserRouter function that can be used with all React Router v6 compatible versions.\n */\nexport function createV6CompatibleWrapCreateBrowserRouter<\n TState extends RouterState = RouterState,\n TRouter extends Router<TState> = Router<TState>,\n>(\n createRouterFunction: CreateRouterFunction<TState, TRouter>,\n version: V6CompatibleVersion,\n): CreateRouterFunction<TState, TRouter> {\n if (!_useEffect || !_useLocation || !_useNavigationType || !_matchRoutes) {\n DEBUG_BUILD &&\n logger.warn(\n `reactRouterV${version}Instrumentation was unable to wrap the \\`createRouter\\` function because of one or more missing parameters.`,\n );\n\n return createRouterFunction;\n }\n\n // `opts` for createBrowserHistory and createMemoryHistory are different, but also not relevant for us at the moment.\n // `basename` is the only option that is relevant for us, and it is the same for all.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return function (routes: RouteObject[], opts?: Record<string, any> & { basename?: string }): TRouter {\n const router = createRouterFunction(routes, opts);\n const basename = opts && opts.basename;\n\n const activeRootSpan = getActiveRootSpan();\n\n // The initial load ends when `createBrowserRouter` is called.\n // This is the earliest convenient time to update the transaction name.\n // Callbacks to `router.subscribe` are not called for the initial load.\n if (router.state.historyAction === 'POP' && activeRootSpan) {\n updatePageloadTransaction(activeRootSpan, router.state.location, routes, undefined, basename);\n }\n\n router.subscribe((state: RouterState) => {\n const location = state.location;\n if (state.historyAction === 'PUSH' || state.historyAction === 'POP') {\n handleNavigation(location, routes, state.historyAction, version, undefined, basename);\n }\n });\n\n return router;\n };\n}\n\n/**\n * Creates a browser tracing integration that can be used with all React Router v6 compatible versions.\n */\nexport function createReactRouterV6CompatibleTracingIntegration(\n options: Parameters<typeof browserTracingIntegration>[0] & ReactRouterOptions,\n version: V6CompatibleVersion,\n): Integration {\n const integration = browserTracingIntegration({\n ...options,\n instrumentPageLoad: false,\n instrumentNavigation: false,\n });\n\n const {\n useEffect,\n useLocation,\n useNavigationType,\n createRoutesFromChildren,\n matchRoutes,\n stripBasename,\n instrumentPageLoad = true,\n instrumentNavigation = true,\n } = options;\n\n return {\n ...integration,\n setup() {\n _useEffect = useEffect;\n _useLocation = useLocation;\n _useNavigationType = useNavigationType;\n _matchRoutes = matchRoutes;\n _createRoutesFromChildren = createRoutesFromChildren;\n _stripBasename = stripBasename || false;\n },\n afterAllSetup(client) {\n integration.afterAllSetup(client);\n\n const initPathName = WINDOW && WINDOW.location && WINDOW.location.pathname;\n if (instrumentPageLoad && initPathName) {\n startBrowserTracingPageLoadSpan(client, {\n name: initPathName,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'url',\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'pageload',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: `auto.pageload.react.reactrouter_v${version}`,\n },\n });\n }\n\n if (instrumentNavigation) {\n CLIENTS_WITH_INSTRUMENT_NAVIGATION.add(client);\n }\n },\n };\n}\n\nexport function createV6CompatibleWrapUseRoutes(origUseRoutes: UseRoutes, version: V6CompatibleVersion): UseRoutes {\n if (!_useEffect || !_useLocation || !_useNavigationType || !_matchRoutes) {\n DEBUG_BUILD &&\n logger.warn(\n 'reactRouterV6Instrumentation was unable to wrap `useRoutes` because of one or more missing parameters.',\n );\n\n return origUseRoutes;\n }\n\n let isMountRenderPass: boolean = true;\n\n const SentryRoutes: React.FC<{\n children?: React.ReactNode;\n routes: RouteObject[];\n locationArg?: Partial<Location> | string;\n }> = (props: { children?: React.ReactNode; routes: RouteObject[]; locationArg?: Partial<Location> | string }) => {\n const { routes, locationArg } = props;\n\n const Routes = origUseRoutes(routes, locationArg);\n\n const location = _useLocation();\n const navigationType = _useNavigationType();\n\n // A value with stable identity to either pick `locationArg` if available or `location` if not\n const stableLocationParam =\n typeof locationArg === 'string' || (locationArg && locationArg.pathname)\n ? (locationArg as { pathname: string })\n : location;\n\n _useEffect(() => {\n const normalizedLocation =\n typeof stableLocationParam === 'string' ? { pathname: stableLocationParam } : stableLocationParam;\n\n if (isMountRenderPass) {\n updatePageloadTransaction(getActiveRootSpan(), normalizedLocation, routes);\n isMountRenderPass = false;\n } else {\n handleNavigation(normalizedLocation, routes, navigationType, version);\n }\n }, [navigationType, stableLocationParam]);\n\n return Routes;\n };\n\n // eslint-disable-next-line react/display-name\n return (routes: RouteObject[], locationArg?: Partial<Location> | string): React.ReactElement | null => {\n return <SentryRoutes routes={routes} locationArg={locationArg} />;\n };\n}\n\nexport function handleNavigation(\n location: Location,\n routes: RouteObject[],\n navigationType: Action,\n version: V6CompatibleVersion,\n matches?: AgnosticDataRouteMatch,\n basename?: string,\n): void {\n const branches = Array.isArray(matches) ? matches : _matchRoutes(routes, location, basename);\n\n const client = getClient();\n if (!client || !CLIENTS_WITH_INSTRUMENT_NAVIGATION.has(client)) {\n return;\n }\n\n if ((navigationType === 'PUSH' || navigationType === 'POP') && branches) {\n const [name, source] = getNormalizedName(routes, location, branches, basename);\n\n startBrowserTracingNavigationSpan(client, {\n name,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: source,\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'navigation',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: `auto.navigation.react.reactrouter_v${version}`,\n },\n });\n }\n}\n\n/**\n * Strip the basename from a pathname if exists.\n *\n * Vendored and modified from `react-router`\n * https://github.com/remix-run/react-router/blob/462bb712156a3f739d6139a0f14810b76b002df6/packages/router/utils.ts#L1038\n */\nfunction stripBasenameFromPathname(pathname: string, basename: string): string {\n if (!basename || basename === '/') {\n return pathname;\n }\n\n if (!pathname.toLowerCase().startsWith(basename.toLowerCase())) {\n return pathname;\n }\n\n // We want to leave trailing slash behavior in the user's control, so if they\n // specify a basename with a trailing slash, we should support it\n const startIndex = basename.endsWith('/') ? basename.length - 1 : basename.length;\n const nextChar = pathname.charAt(startIndex);\n if (nextChar && nextChar !== '/') {\n // pathname does not start with basename/\n return pathname;\n }\n\n return pathname.slice(startIndex) || '/';\n}\n\nfunction sendIndexPath(pathBuilder: string, pathname: string, basename: string): [string, TransactionSource] {\n const reconstructedPath = pathBuilder || _stripBasename ? stripBasenameFromPathname(pathname, basename) : pathname;\n\n const formattedPath =\n // If the path ends with a slash, remove it\n reconstructedPath[reconstructedPath.length - 1] === '/'\n ? reconstructedPath.slice(0, -1)\n : // If the path ends with a wildcard, remove it\n reconstructedPath.slice(-2) === '/*'\n ? reconstructedPath.slice(0, -1)\n : reconstructedPath;\n\n return [formattedPath, 'route'];\n}\n\nfunction pathEndsWithWildcard(path: string, branch: RouteMatch<string>): boolean {\n return (path.slice(-2) === '/*' && branch.route.children && branch.route.children.length > 0) || false;\n}\n\nfunction pathIsWildcardAndHasChildren(path: string, branch: RouteMatch<string>): boolean {\n return (path === '*' && branch.route.children && branch.route.children.length > 0) || false;\n}\n\nfunction getNormalizedName(\n routes: RouteObject[],\n location: Location,\n branches: RouteMatch[],\n basename: string = '',\n): [string, TransactionSource] {\n if (!routes || routes.length === 0) {\n return [_stripBasename ? stripBasenameFromPathname(location.pathname, basename) : location.pathname, 'url'];\n }\n\n let pathBuilder = '';\n if (branches) {\n for (const branch of branches) {\n const route = branch.route;\n if (route) {\n // Early return if index route\n if (route.index) {\n return sendIndexPath(pathBuilder, branch.pathname, basename);\n }\n const path = route.path;\n\n // If path is not a wildcard and has no child routes, append the path\n if (path && !pathIsWildcardAndHasChildren(path, branch)) {\n const newPath = path[0] === '/' || pathBuilder[pathBuilder.length - 1] === '/' ? path : `/${path}`;\n pathBuilder += newPath;\n\n // If the path matches the current location, return the path\n if (basename + branch.pathname === location.pathname) {\n if (\n // If the route defined on the element is something like\n // <Route path=\"/stores/:storeId/products/:productId\" element={<div>Product</div>} />\n // We should check against the branch.pathname for the number of / separators\n // TODO(v9): Put the implementation of `getNumberOfUrlSegments` in this file\n // eslint-disable-next-line deprecation/deprecation\n getNumberOfUrlSegments(pathBuilder) !== getNumberOfUrlSegments(branch.pathname) &&\n // We should not count wildcard operators in the url segments calculation\n pathBuilder.slice(-2) !== '/*'\n ) {\n return [(_stripBasename ? '' : basename) + newPath, 'route'];\n }\n\n // if the last character of the pathbuilder is a wildcard and there are children, remove the wildcard\n if (pathEndsWithWildcard(pathBuilder, branch)) {\n pathBuilder = pathBuilder.slice(0, -1);\n }\n\n return [(_stripBasename ? '' : basename) + pathBuilder, 'route'];\n }\n }\n }\n }\n }\n\n return [_stripBasename ? stripBasenameFromPathname(location.pathname, basename) : location.pathname, 'url'];\n}\n\nfunction updatePageloadTransaction(\n activeRootSpan: Span | undefined,\n location: Location,\n routes: RouteObject[],\n matches?: AgnosticDataRouteMatch,\n basename?: string,\n): void {\n const branches = Array.isArray(matches)\n ? matches\n : (_matchRoutes(routes, location, basename) as unknown as RouteMatch[]);\n\n if (branches) {\n const [name, source] = getNormalizedName(routes, location, branches, basename);\n\n getCurrentScope().setTransactionName(name);\n\n if (activeRootSpan) {\n activeRootSpan.updateName(name);\n activeRootSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, source);\n }\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function createV6CompatibleWithSentryReactRouterRouting<P extends Record<string, any>, R extends React.FC<P>>(\n Routes: R,\n version: V6CompatibleVersion,\n): R {\n if (!_useEffect || !_useLocation || !_useNavigationType || !_createRoutesFromChildren || !_matchRoutes) {\n DEBUG_BUILD &&\n logger.warn(`reactRouterV6Instrumentation was unable to wrap Routes because of one or more missing parameters.\n useEffect: ${_useEffect}. useLocation: ${_useLocation}. useNavigationType: ${_useNavigationType}.\n createRoutesFromChildren: ${_createRoutesFromChildren}. matchRoutes: ${_matchRoutes}.`);\n\n return Routes;\n }\n\n let isMountRenderPass: boolean = true;\n\n const SentryRoutes: React.FC<P> = (props: P) => {\n const location = _useLocation();\n const navigationType = _useNavigationType();\n\n _useEffect(\n () => {\n const routes = _createRoutesFromChildren(props.children) as RouteObject[];\n\n if (isMountRenderPass) {\n updatePageloadTransaction(getActiveRootSpan(), location, routes);\n isMountRenderPass = false;\n } else {\n handleNavigation(location, routes, navigationType, version);\n }\n },\n // `props.children` is purposely not included in the dependency array, because we do not want to re-run this effect\n // when the children change. We only want to start transactions when the location or navigation type change.\n [location, navigationType],\n );\n\n // @ts-expect-error Setting more specific React Component typing for `R` generic above\n // will break advanced type inference done by react router params\n return <Routes {...props} />;\n };\n\n hoistNonReactStatics(SentryRoutes, Routes);\n\n // @ts-expect-error Setting more specific React Component typing for `R` generic above\n // will break advanced type inference done by react router params\n return SentryRoutes;\n}\n\nfunction getActiveRootSpan(): Span | undefined {\n const span = getActiveSpan();\n const rootSpan = span ? getRootSpan(span) : undefined;\n\n if (!rootSpan) {\n return undefined;\n }\n\n const op = spanToJSON(rootSpan).op;\n\n // Only use this root span if it is a pageload or navigation span\n return op === 'navigation' || op === 'pageload' ? rootSpan : undefined;\n}\n"],"names":["DEBUG_BUILD","logger","browserTracingIntegration","WINDOW","startBrowserTracingPageLoadSpan","SEMANTIC_ATTRIBUTE_SENTRY_SOURCE","SEMANTIC_ATTRIBUTE_SENTRY_OP","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","React","getClient","startBrowserTracingNavigationSpan","getNumberOfUrlSegments","getCurrentScope","hoistNonReactStatics","getActiveSpan","getRootSpan","spanToJSON"],"mappings":"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"}
|