@depup/sentry__react 10.75.2-depup.0 → 11.1.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 +3 -9
- package/build/cjs/error.js +4 -10
- package/build/cjs/error.js.map +1 -1
- package/build/cjs/hoist-non-react-statics.js +1 -7
- package/build/cjs/hoist-non-react-statics.js.map +1 -1
- package/build/cjs/profiler.js +45 -19
- package/build/cjs/profiler.js.map +1 -1
- package/build/cjs/react-router.js +21 -0
- package/build/cjs/react-router.js.map +1 -0
- package/build/cjs/reactrouter-compat-utils/instrumentation.js +200 -192
- package/build/cjs/reactrouter-compat-utils/instrumentation.js.map +1 -1
- package/build/cjs/reactrouter-compat-utils/route-manifest.js +4 -4
- package/build/cjs/reactrouter-compat-utils/route-manifest.js.map +1 -1
- package/build/cjs/reactrouter-compat-utils/utils.js +34 -37
- package/build/cjs/reactrouter-compat-utils/utils.js.map +1 -1
- package/build/cjs/reactrouter.compat.js +0 -3
- package/build/cjs/reactrouter.compat.js.map +1 -1
- package/build/cjs/reactrouter.js +14 -8
- package/build/cjs/reactrouter.js.map +1 -1
- package/build/cjs/reactrouterv3.js +12 -9
- package/build/cjs/reactrouterv3.js.map +1 -1
- package/build/cjs/reactrouterv6.js +0 -3
- package/build/cjs/reactrouterv6.js.map +1 -1
- package/build/cjs/reactrouterv7.js +0 -3
- package/build/cjs/reactrouterv7.js.map +1 -1
- package/build/cjs/redux.js +6 -6
- package/build/cjs/redux.js.map +1 -1
- package/build/cjs/sdk.js +7 -7
- package/build/cjs/sdk.js.map +1 -1
- package/build/cjs/tanstackrouter.js +23 -13
- package/build/cjs/tanstackrouter.js.map +1 -1
- package/build/esm/error.js +3 -8
- package/build/esm/error.js.map +1 -1
- package/build/esm/hoist-non-react-statics.js +1 -7
- package/build/esm/hoist-non-react-statics.js.map +1 -1
- package/build/esm/package.json +1 -1
- package/build/esm/profiler.js +47 -21
- package/build/esm/profiler.js.map +1 -1
- package/build/esm/react-router.js +16 -0
- package/build/esm/react-router.js.map +1 -0
- package/build/esm/reactrouter-compat-utils/instrumentation.js +203 -195
- package/build/esm/reactrouter-compat-utils/instrumentation.js.map +1 -1
- package/build/esm/reactrouter-compat-utils/route-manifest.js +1 -1
- package/build/esm/reactrouter-compat-utils/route-manifest.js.map +1 -1
- package/build/esm/reactrouter-compat-utils/utils.js +32 -34
- package/build/esm/reactrouter-compat-utils/utils.js.map +1 -1
- package/build/esm/reactrouter.compat.js +0 -3
- package/build/esm/reactrouter.compat.js.map +1 -1
- package/build/esm/reactrouter.js +16 -10
- package/build/esm/reactrouter.js.map +1 -1
- package/build/esm/reactrouterv3.js +11 -8
- package/build/esm/reactrouterv3.js.map +1 -1
- package/build/esm/reactrouterv6.js +0 -3
- package/build/esm/reactrouterv6.js.map +1 -1
- package/build/esm/reactrouterv7.js +0 -3
- package/build/esm/reactrouterv7.js.map +1 -1
- package/build/esm/redux.js +1 -1
- package/build/esm/redux.js.map +1 -1
- package/build/esm/sdk.js +1 -1
- package/build/esm/sdk.js.map +1 -1
- package/build/esm/tanstackrouter.js +23 -13
- package/build/esm/tanstackrouter.js.map +1 -1
- package/build/types/error.d.ts +0 -4
- package/build/types/error.d.ts.map +1 -1
- package/build/types/errorboundary.d.ts.map +1 -1
- package/build/types/hoist-non-react-statics.d.ts.map +1 -1
- package/build/types/profiler.d.ts +0 -1
- package/build/types/profiler.d.ts.map +1 -1
- package/build/types/react-router.d.ts +26 -0
- package/build/types/react-router.d.ts.map +1 -0
- package/build/types/reactrouter-compat-utils/index.d.ts +1 -1
- package/build/types/reactrouter-compat-utils/index.d.ts.map +1 -1
- package/build/types/reactrouter-compat-utils/instrumentation.d.ts +9 -5
- package/build/types/reactrouter-compat-utils/instrumentation.d.ts.map +1 -1
- package/build/types/reactrouter-compat-utils/utils.d.ts +6 -11
- package/build/types/reactrouter-compat-utils/utils.d.ts.map +1 -1
- package/build/types/reactrouter.d.ts +16 -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/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/types.d.ts +16 -0
- package/build/types/types.d.ts.map +1 -1
- package/changes.json +3 -8
- package/package.json +39 -26
- package/build/cjs/constants.js +0 -10
- package/build/cjs/constants.js.map +0 -1
- package/build/esm/constants.js +0 -6
- package/build/esm/constants.js.map +0 -1
- package/build/types/constants.d.ts +0 -4
- package/build/types/constants.d.ts.map +0 -1
- package/build/types-ts3.8/constants.d.ts +0 -4
- package/build/types-ts3.8/debug-build.d.ts +0 -7
- package/build/types-ts3.8/error.d.ts +0 -41
- package/build/types-ts3.8/errorboundary.d.ts +0 -87
- package/build/types-ts3.8/hoist-non-react-statics.d.ts +0 -21
- package/build/types-ts3.8/index.d.ts +0 -14
- package/build/types-ts3.8/isSyntheticEvent.d.ts +0 -10
- package/build/types-ts3.8/profiler.d.ts +0 -56
- package/build/types-ts3.8/reactrouter-compat-utils/index.d.ts +0 -5
- package/build/types-ts3.8/reactrouter-compat-utils/instrumentation.d.ts +0 -117
- package/build/types-ts3.8/reactrouter-compat-utils/lazy-routes.d.ts +0 -18
- package/build/types-ts3.8/reactrouter-compat-utils/route-manifest.d.ts +0 -13
- package/build/types-ts3.8/reactrouter-compat-utils/utils.d.ts +0 -77
- package/build/types-ts3.8/reactrouter.compat.d.ts +0 -42
- package/build/types-ts3.8/reactrouter.d.ts +0 -41
- package/build/types-ts3.8/reactrouterv3.d.ts +0 -29
- package/build/types-ts3.8/reactrouterv6.d.ts +0 -42
- package/build/types-ts3.8/reactrouterv7.d.ts +0 -42
- package/build/types-ts3.8/redux.d.ts +0 -38
- package/build/types-ts3.8/sdk.d.ts +0 -7
- package/build/types-ts3.8/tanstackrouter.d.ts +0 -13
- package/build/types-ts3.8/types.d.ts +0 -163
- package/build/types-ts3.8/vendor/tanstackrouter-types.d.ts +0 -38
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import { getActiveSpan, getRootSpan, spanToJSON, debug } from '@sentry/core
|
|
1
|
+
import { getActiveSpan, getRootSpan, spanToJSON, debug } from '@sentry/core';
|
|
2
2
|
import { DEBUG_BUILD } from '../debug-build.js';
|
|
3
3
|
import { matchRouteManifest, stripBasenameFromPathname } from './route-manifest.js';
|
|
4
|
+
import { SENTRY_OP } from '@sentry/conventions/attributes';
|
|
4
5
|
|
|
5
|
-
let _matchRoutes;
|
|
6
|
-
let _stripBasename = false;
|
|
7
6
|
const _navigationContextStack = [];
|
|
8
7
|
const MAX_CONTEXT_STACK_SIZE = 10;
|
|
9
8
|
function setNavigationContext(targetPath, span) {
|
|
@@ -25,10 +24,6 @@ function getNavigationContext() {
|
|
|
25
24
|
const length = _navigationContextStack.length;
|
|
26
25
|
return length > 0 ? _navigationContextStack[length - 1] ?? null : null;
|
|
27
26
|
}
|
|
28
|
-
function initializeRouterUtils(matchRoutes, stripBasename = false) {
|
|
29
|
-
_matchRoutes = matchRoutes;
|
|
30
|
-
_stripBasename = stripBasename;
|
|
31
|
-
}
|
|
32
27
|
function pickPath(match) {
|
|
33
28
|
return trimWildcard(match.route.path || "");
|
|
34
29
|
}
|
|
@@ -53,8 +48,8 @@ function pathIsWildcardAndHasChildren(path, branch) {
|
|
|
53
48
|
function routeIsDescendant(route) {
|
|
54
49
|
return !!(!route.children && route.element && route.path?.endsWith("/*"));
|
|
55
50
|
}
|
|
56
|
-
function sendIndexPath(pathBuilder, pathname, basename) {
|
|
57
|
-
const reconstructedPath = pathBuilder && pathBuilder.length > 0 ? pathBuilder :
|
|
51
|
+
function sendIndexPath(pathBuilder, pathname, basename, stripBasename) {
|
|
52
|
+
const reconstructedPath = pathBuilder && pathBuilder.length > 0 ? pathBuilder : stripBasename ? stripBasenameFromPathname(pathname, basename) : pathname;
|
|
58
53
|
let formattedPath = (
|
|
59
54
|
// If the path ends with a wildcard suffix, remove both the slash and the asterisk
|
|
60
55
|
reconstructedPath.slice(-2) === "/*" ? reconstructedPath.slice(0, -2) : reconstructedPath
|
|
@@ -70,8 +65,8 @@ function getNumberOfUrlSegments(url) {
|
|
|
70
65
|
function prefixWithSlash(path) {
|
|
71
66
|
return path[0] === "/" ? path : `/${path}`;
|
|
72
67
|
}
|
|
73
|
-
function rebuildRoutePathFromAllRoutes(allRoutes, location) {
|
|
74
|
-
const matchedRoutes =
|
|
68
|
+
function rebuildRoutePathFromAllRoutes(allRoutes, location, matchRoutes) {
|
|
69
|
+
const matchedRoutes = matchRoutes(allRoutes, location);
|
|
75
70
|
if (!matchedRoutes || matchedRoutes.length === 0) {
|
|
76
71
|
return "";
|
|
77
72
|
}
|
|
@@ -88,7 +83,8 @@ function rebuildRoutePathFromAllRoutes(allRoutes, location) {
|
|
|
88
83
|
allRoutes.filter((route) => route !== match.route),
|
|
89
84
|
{
|
|
90
85
|
pathname: strippedPath
|
|
91
|
-
}
|
|
86
|
+
},
|
|
87
|
+
matchRoutes
|
|
92
88
|
)
|
|
93
89
|
)
|
|
94
90
|
);
|
|
@@ -96,12 +92,12 @@ function rebuildRoutePathFromAllRoutes(allRoutes, location) {
|
|
|
96
92
|
}
|
|
97
93
|
return "";
|
|
98
94
|
}
|
|
99
|
-
function reconstructNameFromDescendantParent(location, allRoutes, currentName) {
|
|
95
|
+
function reconstructNameFromDescendantParent(location, allRoutes, currentName, matchRoutes) {
|
|
100
96
|
const descendantParents = allRoutes.filter(routeIsDescendant);
|
|
101
97
|
if (!descendantParents.length) {
|
|
102
98
|
return void 0;
|
|
103
99
|
}
|
|
104
|
-
const matchedParents =
|
|
100
|
+
const matchedParents = matchRoutes(descendantParents, location);
|
|
105
101
|
const parentMatch = matchedParents?.[matchedParents.length - 1];
|
|
106
102
|
if (!parentMatch || !pickSplat(parentMatch)) {
|
|
107
103
|
return void 0;
|
|
@@ -119,12 +115,13 @@ function reconstructNameFromDescendantParent(location, allRoutes, currentName) {
|
|
|
119
115
|
const remainingPathname = stripBasenameFromPathname(location.pathname, prefixWithSlash(parentMatch.pathnameBase)) || "/";
|
|
120
116
|
const remainingName = rebuildRoutePathFromAllRoutes(
|
|
121
117
|
allRoutes.filter((route) => route !== parentMatch.route),
|
|
122
|
-
{ pathname: remainingPathname }
|
|
118
|
+
{ pathname: remainingPathname },
|
|
119
|
+
matchRoutes
|
|
123
120
|
);
|
|
124
121
|
return remainingName ? prefixWithSlash(`${parentTemplate}${prefixWithSlash(remainingName)}`) : void 0;
|
|
125
122
|
}
|
|
126
|
-
function locationIsInsideDescendantRoute(location, routes) {
|
|
127
|
-
const matchedRoutes =
|
|
123
|
+
function locationIsInsideDescendantRoute(location, routes, matchRoutes) {
|
|
124
|
+
const matchedRoutes = matchRoutes(routes, location);
|
|
128
125
|
if (matchedRoutes) {
|
|
129
126
|
for (const match of matchedRoutes) {
|
|
130
127
|
if (routeIsDescendant(match.route) && pickSplat(match)) {
|
|
@@ -134,15 +131,15 @@ function locationIsInsideDescendantRoute(location, routes) {
|
|
|
134
131
|
}
|
|
135
132
|
return false;
|
|
136
133
|
}
|
|
137
|
-
function getFallbackTransactionName(location, basename) {
|
|
138
|
-
return
|
|
134
|
+
function getFallbackTransactionName(location, basename, stripBasename) {
|
|
135
|
+
return stripBasename ? stripBasenameFromPathname(location.pathname, basename) : location.pathname || "";
|
|
139
136
|
}
|
|
140
|
-
function getNormalizedName(routes, location, branches, basename = "") {
|
|
137
|
+
function getNormalizedName(routes, location, branches, basename = "", stripBasename = false) {
|
|
141
138
|
if (!routes || routes.length === 0) {
|
|
142
|
-
return [
|
|
139
|
+
return [stripBasename ? stripBasenameFromPathname(location.pathname, basename) : location.pathname, "url"];
|
|
143
140
|
}
|
|
144
141
|
if (!branches) {
|
|
145
|
-
return [getFallbackTransactionName(location, basename), "url"];
|
|
142
|
+
return [getFallbackTransactionName(location, basename, stripBasename), "url"];
|
|
146
143
|
}
|
|
147
144
|
let pathBuilder = "";
|
|
148
145
|
for (const branch of branches) {
|
|
@@ -151,7 +148,7 @@ function getNormalizedName(routes, location, branches, basename = "") {
|
|
|
151
148
|
continue;
|
|
152
149
|
}
|
|
153
150
|
if (route.index) {
|
|
154
|
-
return sendIndexPath(pathBuilder, branch.pathname, basename);
|
|
151
|
+
return sendIndexPath(pathBuilder, branch.pathname, basename, stripBasename);
|
|
155
152
|
}
|
|
156
153
|
const path = route.path;
|
|
157
154
|
if (!path || pathIsWildcardAndHasChildren(path, branch)) {
|
|
@@ -163,33 +160,34 @@ function getNormalizedName(routes, location, branches, basename = "") {
|
|
|
163
160
|
continue;
|
|
164
161
|
}
|
|
165
162
|
if (getNumberOfUrlSegments(pathBuilder) !== getNumberOfUrlSegments(branch.pathname) && !pathEndsWithWildcard(pathBuilder)) {
|
|
166
|
-
return [(
|
|
163
|
+
return [(stripBasename ? "" : basename) + newPath, "route"];
|
|
167
164
|
}
|
|
168
165
|
if (pathIsWildcardAndHasChildren(pathBuilder, branch)) {
|
|
169
166
|
pathBuilder = pathBuilder.slice(0, -1);
|
|
170
167
|
}
|
|
171
|
-
return [(
|
|
168
|
+
return [(stripBasename ? "" : basename) + pathBuilder, "route"];
|
|
172
169
|
}
|
|
173
|
-
return [getFallbackTransactionName(location, basename), "url"];
|
|
170
|
+
return [getFallbackTransactionName(location, basename, stripBasename), "url"];
|
|
174
171
|
}
|
|
175
|
-
function resolveRouteNameAndSource(location, routes, allRoutes, branches,
|
|
172
|
+
function resolveRouteNameAndSource(location, routes, allRoutes, branches, config) {
|
|
173
|
+
const { matchRoutes, stripBasename, basename, lazyRouteManifest, enableAsyncRouteHandlers } = config;
|
|
176
174
|
if (enableAsyncRouteHandlers && lazyRouteManifest && lazyRouteManifest.length > 0) {
|
|
177
175
|
const manifestMatch = matchRouteManifest(location.pathname, lazyRouteManifest, basename);
|
|
178
176
|
if (manifestMatch) {
|
|
179
|
-
return [(
|
|
177
|
+
return [(stripBasename ? "" : basename) + manifestMatch, "route"];
|
|
180
178
|
}
|
|
181
179
|
}
|
|
182
180
|
let name;
|
|
183
181
|
let source = "url";
|
|
184
|
-
const isInDescendantRoute = locationIsInsideDescendantRoute(location, allRoutes);
|
|
182
|
+
const isInDescendantRoute = locationIsInsideDescendantRoute(location, allRoutes, matchRoutes);
|
|
185
183
|
if (isInDescendantRoute) {
|
|
186
|
-
name = prefixWithSlash(rebuildRoutePathFromAllRoutes(allRoutes, location));
|
|
184
|
+
name = prefixWithSlash(rebuildRoutePathFromAllRoutes(allRoutes, location, matchRoutes));
|
|
187
185
|
source = "route";
|
|
188
186
|
}
|
|
189
187
|
if (!isInDescendantRoute || !name) {
|
|
190
|
-
[name, source] = getNormalizedName(routes, location, branches, basename);
|
|
188
|
+
[name, source] = getNormalizedName(routes, location, branches, basename, stripBasename);
|
|
191
189
|
}
|
|
192
|
-
const anchoredName = reconstructNameFromDescendantParent(location, allRoutes, name);
|
|
190
|
+
const anchoredName = reconstructNameFromDescendantParent(location, allRoutes, name, matchRoutes);
|
|
193
191
|
if (anchoredName) {
|
|
194
192
|
return [anchoredName, "route"];
|
|
195
193
|
}
|
|
@@ -201,9 +199,9 @@ function getActiveRootSpan() {
|
|
|
201
199
|
if (!rootSpan) {
|
|
202
200
|
return void 0;
|
|
203
201
|
}
|
|
204
|
-
const op = spanToJSON(rootSpan).
|
|
202
|
+
const op = spanToJSON(rootSpan).attributes[SENTRY_OP];
|
|
205
203
|
return op === "navigation" || op === "pageload" ? rootSpan : void 0;
|
|
206
204
|
}
|
|
207
205
|
|
|
208
|
-
export { clearNavigationContext, getActiveRootSpan, getNavigationContext, getNormalizedName, getNumberOfUrlSegments,
|
|
206
|
+
export { clearNavigationContext, getActiveRootSpan, getNavigationContext, getNormalizedName, getNumberOfUrlSegments, locationIsInsideDescendantRoute, pathEndsWithWildcard, pathIsWildcardAndHasChildren, prefixWithSlash, rebuildRoutePathFromAllRoutes, resolveRouteNameAndSource, routeIsDescendant, setNavigationContext, transactionNameHasWildcard };
|
|
209
207
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../../../src/reactrouter-compat-utils/utils.ts"],"sourcesContent":["import type { Span, TransactionSource } from '@sentry/core/browser';\nimport { debug, getActiveSpan, getRootSpan, spanToJSON } from '@sentry/core/browser';\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { Location, MatchRoutes, RouteMatch, RouteObject } from '../types';\nimport { matchRouteManifest, stripBasenameFromPathname } from './route-manifest';\n\n// Global variables that these utilities depend on\nlet _matchRoutes: MatchRoutes;\nlet _stripBasename: boolean = false;\n\n// Navigation context stack for nested/concurrent patchRoutesOnNavigation calls.\n// Required because window.location hasn't updated yet when handlers are invoked.\ninterface NavigationContext {\n token: object;\n targetPath: string | undefined;\n span: Span | undefined;\n}\n\nconst _navigationContextStack: NavigationContext[] = [];\nconst MAX_CONTEXT_STACK_SIZE = 10;\n\n/**\n * Pushes a navigation context and returns a unique token for cleanup.\n * The token uses object identity for uniqueness (no counter needed).\n */\nexport function setNavigationContext(targetPath: string | undefined, span: Span | undefined): object {\n const token = {};\n // Prevent unbounded stack growth - oldest (likely stale) contexts are evicted first\n if (_navigationContextStack.length >= MAX_CONTEXT_STACK_SIZE) {\n DEBUG_BUILD && debug.warn('[React Router] Navigation context stack overflow - removing oldest context');\n _navigationContextStack.shift();\n }\n _navigationContextStack.push({ token, targetPath, span });\n return token;\n}\n\n/**\n * Clears the navigation context if it's on top of the stack (LIFO).\n * If our context is not on top (out-of-order completion), we leave it -\n * it will be cleaned up by overflow protection when the stack fills up.\n */\nexport function clearNavigationContext(token: object): void {\n const top = _navigationContextStack[_navigationContextStack.length - 1];\n if (top?.token === token) {\n _navigationContextStack.pop();\n }\n}\n\n/** Gets the current (most recent) navigation context if inside a patchRoutesOnNavigation call. */\nexport function getNavigationContext(): NavigationContext | null {\n const length = _navigationContextStack.length;\n // The `?? null` converts undefined (from array access) to null to match return type\n return length > 0 ? (_navigationContextStack[length - 1] ?? null) : null;\n}\n\n/**\n * Initialize function to set dependencies that the router utilities need.\n * Must be called before using any of the exported utility functions.\n */\nexport function initializeRouterUtils(matchRoutes: MatchRoutes, stripBasename: boolean = false): void {\n _matchRoutes = matchRoutes;\n _stripBasename = stripBasename;\n}\n\n// Helper functions\nfunction pickPath(match: RouteMatch): string {\n return trimWildcard(match.route.path || '');\n}\n\nfunction pickSplat(match: RouteMatch): string {\n return match.params['*'] || '';\n}\n\nfunction trimWildcard(path: string): string {\n return path[path.length - 1] === '*' ? path.slice(0, -1) : path;\n}\n\nfunction trimSlash(path: string): string {\n return path[path.length - 1] === '/' ? path.slice(0, -1) : path;\n}\n\n/**\n * Checks if a path ends with a wildcard character (*).\n */\nexport function pathEndsWithWildcard(path: string): boolean {\n return path.endsWith('*');\n}\n\n/** Checks if transaction name has wildcard (/* or ends with *). */\nexport function transactionNameHasWildcard(name: string): boolean {\n return name.includes('/*') || name.endsWith('*');\n}\n\n/**\n * Checks if a path is a wildcard and has child routes.\n */\nexport function pathIsWildcardAndHasChildren(path: string, branch: RouteMatch<string>): boolean {\n return (pathEndsWithWildcard(path) && !!branch.route.children?.length) || false;\n}\n\n/** Check if route is in descendant route (<Routes> within <Routes>) */\nexport function routeIsDescendant(route: RouteObject): boolean {\n return !!(!route.children && route.element && route.path?.endsWith('/*'));\n}\n\nfunction sendIndexPath(pathBuilder: string, pathname: string, basename: string): [string, TransactionSource] {\n const reconstructedPath =\n pathBuilder && pathBuilder.length > 0\n ? pathBuilder\n : _stripBasename\n ? stripBasenameFromPathname(pathname, basename)\n : pathname;\n\n let formattedPath =\n // If the path ends with a wildcard suffix, remove both the slash and the asterisk\n reconstructedPath.slice(-2) === '/*' ? reconstructedPath.slice(0, -2) : reconstructedPath;\n\n // If the path ends with a slash, remove it (but keep single '/')\n if (formattedPath.length > 1 && formattedPath[formattedPath.length - 1] === '/') {\n formattedPath = formattedPath.slice(0, -1);\n }\n\n return [formattedPath, 'route'];\n}\n\n/**\n * Returns the number of URL segments in the given URL string.\n * Splits at '/' or '\\/' to handle regex URLs correctly.\n *\n * @param url - The URL string to segment.\n * @returns The number of segments in the URL.\n */\nexport function getNumberOfUrlSegments(url: string): number {\n // split at '/' or at '\\/' to split regex urls correctly\n return url.split(/\\\\?\\//).filter(s => s.length > 0 && s !== ',').length;\n}\n\n// Exported utility functions\n\n/**\n * Ensures a path string starts with a forward slash.\n */\nexport function prefixWithSlash(path: string): string {\n return path[0] === '/' ? path : `/${path}`;\n}\n\n/**\n * Rebuilds the route path from all available routes by matching against the current location.\n */\nexport function rebuildRoutePathFromAllRoutes(allRoutes: RouteObject[], location: Location): string {\n const matchedRoutes = _matchRoutes(allRoutes, location) as RouteMatch[];\n\n if (!matchedRoutes || matchedRoutes.length === 0) {\n return '';\n }\n\n for (const match of matchedRoutes) {\n if (match.route.path && match.route.path !== '*') {\n const path = pickPath(match);\n const strippedPath = stripBasenameFromPathname(location.pathname, prefixWithSlash(match.pathnameBase));\n\n if (location.pathname === strippedPath) {\n return trimSlash(strippedPath);\n }\n\n return trimSlash(\n trimSlash(path || '') +\n prefixWithSlash(\n rebuildRoutePathFromAllRoutes(\n allRoutes.filter(route => route !== match.route),\n {\n pathname: strippedPath,\n },\n ),\n ),\n );\n }\n }\n\n return '';\n}\n\n/**\n * Recovers the parent prefix for descendant `<Routes>` names.\n *\n * `allRoutes` flattens every mounted `<Routes>` into one set, so an orphaned descendant subtree can\n * outscore the `.../*` route that anchors the location and drop its prefix (e.g. `/:id/:sub` instead of `/child/:id`).\n * Matching only the descendant-parent routes recovers the true anchor.\n */\nfunction reconstructNameFromDescendantParent(\n location: Location,\n allRoutes: RouteObject[],\n currentName: string | undefined,\n): string | undefined {\n const descendantParents = allRoutes.filter(routeIsDescendant);\n if (!descendantParents.length) {\n return undefined;\n }\n\n const matchedParents = _matchRoutes(descendantParents, location) as RouteMatch[] | null;\n const parentMatch = matchedParents?.[matchedParents.length - 1];\n if (!parentMatch || !pickSplat(parentMatch)) {\n return undefined;\n }\n\n const parentTemplate = trimSlash(trimWildcard(parentMatch.route.path || ''));\n\n if (!parentTemplate) {\n return undefined;\n }\n\n const expectedPrefix = prefixWithSlash(parentTemplate);\n\n // Child `<Routes>` resolve against the matched parent, but flattened route matching can already retain\n // a dynamic leading parameter. Adding the parent again would duplicate it (e.g. `/:id/:id`)\n const firstElement = parentTemplate.split('/')[0];\n const hasDynamicLead = firstElement?.startsWith(':') && currentName?.split('/').includes(firstElement);\n\n // Rebuild only when matching the descendant subtree discarded its parent route template\n if (currentName === expectedPrefix || currentName?.startsWith(`${expectedPrefix}/`) || hasDynamicLead) {\n return undefined;\n }\n\n const remainingPathname =\n stripBasenameFromPathname(location.pathname, prefixWithSlash(parentMatch.pathnameBase)) || '/';\n const remainingName = rebuildRoutePathFromAllRoutes(\n allRoutes.filter(route => route !== parentMatch.route),\n { pathname: remainingPathname },\n );\n\n return remainingName ? prefixWithSlash(`${parentTemplate}${prefixWithSlash(remainingName)}`) : undefined;\n}\n\n/**\n * Checks if the current location is inside a descendant route (route with splat parameter).\n */\nexport function locationIsInsideDescendantRoute(location: Location, routes: RouteObject[]): boolean {\n const matchedRoutes = _matchRoutes(routes, location) as RouteMatch[];\n\n if (matchedRoutes) {\n for (const match of matchedRoutes) {\n if (routeIsDescendant(match.route) && pickSplat(match)) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n/**\n * Returns a fallback transaction name from location pathname.\n */\nfunction getFallbackTransactionName(location: Location, basename: string): string {\n return _stripBasename ? stripBasenameFromPathname(location.pathname, basename) : location.pathname || '';\n}\n\n/**\n * Gets a normalized route name and transaction source from the current routes and location.\n */\nexport function 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 if (!branches) {\n return [getFallbackTransactionName(location, basename), 'url'];\n }\n\n let pathBuilder = '';\n\n for (const branch of branches) {\n const route = branch.route;\n if (!route) {\n continue;\n }\n\n // Early return for index routes\n if (route.index) {\n return sendIndexPath(pathBuilder, branch.pathname, basename);\n }\n\n const path = route.path;\n if (!path || pathIsWildcardAndHasChildren(path, branch)) {\n continue;\n }\n\n // Build the route path\n const newPath = path[0] === '/' || pathBuilder[pathBuilder.length - 1] === '/' ? path : `/${path}`;\n pathBuilder = trimSlash(pathBuilder) + prefixWithSlash(newPath);\n\n // Check if this path matches the current location\n if (trimSlash(location.pathname) !== trimSlash(basename + branch.pathname)) {\n continue;\n }\n\n // Check if this is a parameterized route like /stores/:storeId/products/:productId\n if (\n getNumberOfUrlSegments(pathBuilder) !== getNumberOfUrlSegments(branch.pathname) &&\n !pathEndsWithWildcard(pathBuilder)\n ) {\n return [(_stripBasename ? '' : basename) + newPath, 'route'];\n }\n\n // Handle wildcard routes with children - strip trailing wildcard\n if (pathIsWildcardAndHasChildren(pathBuilder, branch)) {\n pathBuilder = pathBuilder.slice(0, -1);\n }\n\n return [(_stripBasename ? '' : basename) + pathBuilder, 'route'];\n }\n\n // Fallback when no matching route found\n return [getFallbackTransactionName(location, basename), 'url'];\n}\n\n/**\n * Shared helper function to resolve route name and source\n */\nexport function resolveRouteNameAndSource(\n location: Location,\n routes: RouteObject[],\n allRoutes: RouteObject[],\n branches: RouteMatch[],\n basename: string = '',\n lazyRouteManifest?: string[],\n enableAsyncRouteHandlers?: boolean,\n): [string, TransactionSource] {\n // When lazy route manifest is provided, use it as the primary source for transaction names\n if (enableAsyncRouteHandlers && lazyRouteManifest && lazyRouteManifest.length > 0) {\n const manifestMatch = matchRouteManifest(location.pathname, lazyRouteManifest, basename);\n if (manifestMatch) {\n return [(_stripBasename ? '' : basename) + manifestMatch, 'route'];\n }\n }\n\n // Fall back to React Router route matching\n let name: string | undefined;\n let source: TransactionSource = 'url';\n\n const isInDescendantRoute = locationIsInsideDescendantRoute(location, allRoutes);\n\n if (isInDescendantRoute) {\n name = prefixWithSlash(rebuildRoutePathFromAllRoutes(allRoutes, location));\n source = 'route';\n }\n\n if (!isInDescendantRoute || !name) {\n [name, source] = getNormalizedName(routes, location, branches, basename);\n }\n\n // Guard against orphaned descendant subtrees stealing the transaction name: if the location is\n // anchored by a descendant-parent route (`.../*`) whose prefix was dropped, reconstruct with it.\n const anchoredName = reconstructNameFromDescendantParent(location, allRoutes, name);\n if (anchoredName) {\n return [anchoredName, 'route'];\n }\n\n return [name || location.pathname, source];\n}\n\n/**\n * Gets the active root span if it's a pageload or navigation span.\n */\nexport function getActiveRootSpan(): Span | undefined {\n const span = getActiveSpan();\n const rootSpan = span ? getRootSpan(span) : undefined;\n\n if (!rootSpan) {\n return undefined;\n }\n\n const op = spanToJSON(rootSpan).op;\n\n // Only use this root span if it is a pageload or navigation span\n return op === 'navigation' || op === 'pageload' ? rootSpan : undefined;\n}\n"],"names":[],"mappings":";;;;AAOA,IAAI,YAAA;AACJ,IAAI,cAAA,GAA0B,KAAA;AAU9B,MAAM,0BAA+C,EAAC;AACtD,MAAM,sBAAA,GAAyB,EAAA;AAMxB,SAAS,oBAAA,CAAqB,YAAgC,IAAA,EAAgC;AACnG,EAAA,MAAM,QAAQ,EAAC;AAEf,EAAA,IAAI,uBAAA,CAAwB,UAAU,sBAAA,EAAwB;AAC5D,IAAA,WAAA,IAAe,KAAA,CAAM,KAAK,4EAA4E,CAAA;AACtG,IAAA,uBAAA,CAAwB,KAAA,EAAM;AAAA,EAChC;AACA,EAAA,uBAAA,CAAwB,IAAA,CAAK,EAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AACxD,EAAA,OAAO,KAAA;AACT;AAOO,SAAS,uBAAuB,KAAA,EAAqB;AAC1D,EAAA,MAAM,GAAA,GAAM,uBAAA,CAAwB,uBAAA,CAAwB,MAAA,GAAS,CAAC,CAAA;AACtE,EAAA,IAAI,GAAA,EAAK,UAAU,KAAA,EAAO;AACxB,IAAA,uBAAA,CAAwB,GAAA,EAAI;AAAA,EAC9B;AACF;AAGO,SAAS,oBAAA,GAAiD;AAC/D,EAAA,MAAM,SAAS,uBAAA,CAAwB,MAAA;AAEvC,EAAA,OAAO,SAAS,CAAA,GAAK,uBAAA,CAAwB,MAAA,GAAS,CAAC,KAAK,IAAA,GAAQ,IAAA;AACtE;AAMO,SAAS,qBAAA,CAAsB,WAAA,EAA0B,aAAA,GAAyB,KAAA,EAAa;AACpG,EAAA,YAAA,GAAe,WAAA;AACf,EAAA,cAAA,GAAiB,aAAA;AACnB;AAGA,SAAS,SAAS,KAAA,EAA2B;AAC3C,EAAA,OAAO,YAAA,CAAa,KAAA,CAAM,KAAA,CAAM,IAAA,IAAQ,EAAE,CAAA;AAC5C;AAEA,SAAS,UAAU,KAAA,EAA2B;AAC5C,EAAA,OAAO,KAAA,CAAM,MAAA,CAAO,GAAG,CAAA,IAAK,EAAA;AAC9B;AAEA,SAAS,aAAa,IAAA,EAAsB;AAC1C,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,KAAM,MAAM,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,IAAA;AAC7D;AAEA,SAAS,UAAU,IAAA,EAAsB;AACvC,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,KAAM,MAAM,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,IAAA;AAC7D;AAKO,SAAS,qBAAqB,IAAA,EAAuB;AAC1D,EAAA,OAAO,IAAA,CAAK,SAAS,GAAG,CAAA;AAC1B;AAGO,SAAS,2BAA2B,IAAA,EAAuB;AAChE,EAAA,OAAO,KAAK,QAAA,CAAS,IAAI,CAAA,IAAK,IAAA,CAAK,SAAS,GAAG,CAAA;AACjD;AAKO,SAAS,4BAAA,CAA6B,MAAc,MAAA,EAAqC;AAC9F,EAAA,OAAQ,oBAAA,CAAqB,IAAI,CAAA,IAAK,CAAC,CAAC,MAAA,CAAO,KAAA,CAAM,UAAU,MAAA,IAAW,KAAA;AAC5E;AAGO,SAAS,kBAAkB,KAAA,EAA6B;AAC7D,EAAA,OAAO,CAAC,EAAE,CAAC,KAAA,CAAM,QAAA,IAAY,MAAM,OAAA,IAAW,KAAA,CAAM,IAAA,EAAM,QAAA,CAAS,IAAI,CAAA,CAAA;AACzE;AAEA,SAAS,aAAA,CAAc,WAAA,EAAqB,QAAA,EAAkB,QAAA,EAA+C;AAC3G,EAAA,MAAM,iBAAA,GACJ,WAAA,IAAe,WAAA,CAAY,MAAA,GAAS,CAAA,GAChC,cACA,cAAA,GACE,yBAAA,CAA0B,QAAA,EAAU,QAAQ,CAAA,GAC5C,QAAA;AAER,EAAA,IAAI,aAAA;AAAA;AAAA,IAEF,iBAAA,CAAkB,MAAM,EAAE,CAAA,KAAM,OAAO,iBAAA,CAAkB,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI;AAAA,GAAA;AAG1E,EAAA,IAAI,aAAA,CAAc,SAAS,CAAA,IAAK,aAAA,CAAc,cAAc,MAAA,GAAS,CAAC,MAAM,GAAA,EAAK;AAC/E,IAAA,aAAA,GAAgB,aAAA,CAAc,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,EAC3C;AAEA,EAAA,OAAO,CAAC,eAAe,OAAO,CAAA;AAChC;AASO,SAAS,uBAAuB,GAAA,EAAqB;AAE1D,EAAA,OAAO,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,CAAE,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,MAAA,GAAS,CAAA,IAAK,CAAA,KAAM,GAAG,CAAA,CAAE,MAAA;AACnE;AAOO,SAAS,gBAAgB,IAAA,EAAsB;AACpD,EAAA,OAAO,KAAK,CAAC,CAAA,KAAM,GAAA,GAAM,IAAA,GAAO,IAAI,IAAI,CAAA,CAAA;AAC1C;AAKO,SAAS,6BAAA,CAA8B,WAA0B,QAAA,EAA4B;AAClG,EAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,SAAA,EAAW,QAAQ,CAAA;AAEtD,EAAA,IAAI,CAAC,aAAA,IAAiB,aAAA,CAAc,MAAA,KAAW,CAAA,EAAG;AAChD,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,KAAA,MAAW,SAAS,aAAA,EAAe;AACjC,IAAA,IAAI,MAAM,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,KAAA,CAAM,SAAS,GAAA,EAAK;AAChD,MAAA,MAAM,IAAA,GAAO,SAAS,KAAK,CAAA;AAC3B,MAAA,MAAM,eAAe,yBAAA,CAA0B,QAAA,CAAS,UAAU,eAAA,CAAgB,KAAA,CAAM,YAAY,CAAC,CAAA;AAErG,MAAA,IAAI,QAAA,CAAS,aAAa,YAAA,EAAc;AACtC,QAAA,OAAO,UAAU,YAAY,CAAA;AAAA,MAC/B;AAEA,MAAA,OAAO,SAAA;AAAA,QACL,SAAA,CAAU,IAAA,IAAQ,EAAE,CAAA,GAClB,eAAA;AAAA,UACE,6BAAA;AAAA,YACE,SAAA,CAAU,MAAA,CAAO,CAAA,KAAA,KAAS,KAAA,KAAU,MAAM,KAAK,CAAA;AAAA,YAC/C;AAAA,cACE,QAAA,EAAU;AAAA;AACZ;AACF;AACF,OACJ;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAA;AACT;AASA,SAAS,mCAAA,CACP,QAAA,EACA,SAAA,EACA,WAAA,EACoB;AACpB,EAAA,MAAM,iBAAA,GAAoB,SAAA,CAAU,MAAA,CAAO,iBAAiB,CAAA;AAC5D,EAAA,IAAI,CAAC,kBAAkB,MAAA,EAAQ;AAC7B,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,cAAA,GAAiB,YAAA,CAAa,iBAAA,EAAmB,QAAQ,CAAA;AAC/D,EAAA,MAAM,WAAA,GAAc,cAAA,GAAiB,cAAA,CAAe,MAAA,GAAS,CAAC,CAAA;AAC9D,EAAA,IAAI,CAAC,WAAA,IAAe,CAAC,SAAA,CAAU,WAAW,CAAA,EAAG;AAC3C,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,iBAAiB,SAAA,CAAU,YAAA,CAAa,YAAY,KAAA,CAAM,IAAA,IAAQ,EAAE,CAAC,CAAA;AAE3E,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,cAAA,GAAiB,gBAAgB,cAAc,CAAA;AAIrD,EAAA,MAAM,YAAA,GAAe,cAAA,CAAe,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAChD,EAAA,MAAM,cAAA,GAAiB,YAAA,EAAc,UAAA,CAAW,GAAG,CAAA,IAAK,aAAa,KAAA,CAAM,GAAG,CAAA,CAAE,QAAA,CAAS,YAAY,CAAA;AAGrG,EAAA,IAAI,WAAA,KAAgB,kBAAkB,WAAA,EAAa,UAAA,CAAW,GAAG,cAAc,CAAA,CAAA,CAAG,KAAK,cAAA,EAAgB;AACrG,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,iBAAA,GACJ,0BAA0B,QAAA,CAAS,QAAA,EAAU,gBAAgB,WAAA,CAAY,YAAY,CAAC,CAAA,IAAK,GAAA;AAC7F,EAAA,MAAM,aAAA,GAAgB,6BAAA;AAAA,IACpB,SAAA,CAAU,MAAA,CAAO,CAAA,KAAA,KAAS,KAAA,KAAU,YAAY,KAAK,CAAA;AAAA,IACrD,EAAE,UAAU,iBAAA;AAAkB,GAChC;AAEA,EAAA,OAAO,aAAA,GAAgB,gBAAgB,CAAA,EAAG,cAAc,GAAG,eAAA,CAAgB,aAAa,CAAC,CAAA,CAAE,CAAA,GAAI,MAAA;AACjG;AAKO,SAAS,+BAAA,CAAgC,UAAoB,MAAA,EAAgC;AAClG,EAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,MAAA,EAAQ,QAAQ,CAAA;AAEnD,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,KAAA,MAAW,SAAS,aAAA,EAAe;AACjC,MAAA,IAAI,kBAAkB,KAAA,CAAM,KAAK,CAAA,IAAK,SAAA,CAAU,KAAK,CAAA,EAAG;AACtD,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAKA,SAAS,0BAAA,CAA2B,UAAoB,QAAA,EAA0B;AAChF,EAAA,OAAO,iBAAiB,yBAAA,CAA0B,QAAA,CAAS,UAAU,QAAQ,CAAA,GAAI,SAAS,QAAA,IAAY,EAAA;AACxG;AAKO,SAAS,iBAAA,CACd,MAAA,EACA,QAAA,EACA,QAAA,EACA,WAAmB,EAAA,EACU;AAC7B,EAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAClC,IAAA,OAAO,CAAC,iBAAiB,yBAAA,CAA0B,QAAA,CAAS,UAAU,QAAQ,CAAA,GAAI,QAAA,CAAS,QAAA,EAAU,KAAK,CAAA;AAAA,EAC5G;AAEA,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,CAAC,0BAAA,CAA2B,QAAA,EAAU,QAAQ,GAAG,KAAK,CAAA;AAAA,EAC/D;AAEA,EAAA,IAAI,WAAA,GAAc,EAAA;AAElB,EAAA,KAAA,MAAW,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,MAAM,KAAA,EAAO;AACf,MAAA,OAAO,aAAA,CAAc,WAAA,EAAa,MAAA,CAAO,QAAA,EAAU,QAAQ,CAAA;AAAA,IAC7D;AAEA,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,IAAA,IAAI,CAAC,IAAA,IAAQ,4BAAA,CAA6B,IAAA,EAAM,MAAM,CAAA,EAAG;AACvD,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,CAAC,CAAA,KAAM,GAAA,IAAO,WAAA,CAAY,WAAA,CAAY,MAAA,GAAS,CAAC,CAAA,KAAM,GAAA,GAAM,IAAA,GAAO,IAAI,IAAI,CAAA,CAAA;AAChG,IAAA,WAAA,GAAc,SAAA,CAAU,WAAW,CAAA,GAAI,eAAA,CAAgB,OAAO,CAAA;AAG9D,IAAA,IAAI,SAAA,CAAU,SAAS,QAAQ,CAAA,KAAM,UAAU,QAAA,GAAW,MAAA,CAAO,QAAQ,CAAA,EAAG;AAC1E,MAAA;AAAA,IACF;AAGA,IAAA,IACE,sBAAA,CAAuB,WAAW,CAAA,KAAM,sBAAA,CAAuB,MAAA,CAAO,QAAQ,CAAA,IAC9E,CAAC,oBAAA,CAAqB,WAAW,CAAA,EACjC;AACA,MAAA,OAAO,CAAA,CAAE,cAAA,GAAiB,EAAA,GAAK,QAAA,IAAY,SAAS,OAAO,CAAA;AAAA,IAC7D;AAGA,IAAA,IAAI,4BAAA,CAA6B,WAAA,EAAa,MAAM,CAAA,EAAG;AACrD,MAAA,WAAA,GAAc,WAAA,CAAY,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,IACvC;AAEA,IAAA,OAAO,CAAA,CAAE,cAAA,GAAiB,EAAA,GAAK,QAAA,IAAY,aAAa,OAAO,CAAA;AAAA,EACjE;AAGA,EAAA,OAAO,CAAC,0BAAA,CAA2B,QAAA,EAAU,QAAQ,GAAG,KAAK,CAAA;AAC/D;AAKO,SAAS,yBAAA,CACd,UACA,MAAA,EACA,SAAA,EACA,UACA,QAAA,GAAmB,EAAA,EACnB,mBACA,wBAAA,EAC6B;AAE7B,EAAA,IAAI,wBAAA,IAA4B,iBAAA,IAAqB,iBAAA,CAAkB,MAAA,GAAS,CAAA,EAAG;AACjF,IAAA,MAAM,aAAA,GAAgB,kBAAA,CAAmB,QAAA,CAAS,QAAA,EAAU,mBAAmB,QAAQ,CAAA;AACvF,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,OAAO,CAAA,CAAE,cAAA,GAAiB,EAAA,GAAK,QAAA,IAAY,eAAe,OAAO,CAAA;AAAA,IACnE;AAAA,EACF;AAGA,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,MAAA,GAA4B,KAAA;AAEhC,EAAA,MAAM,mBAAA,GAAsB,+BAAA,CAAgC,QAAA,EAAU,SAAS,CAAA;AAE/E,EAAA,IAAI,mBAAA,EAAqB;AACvB,IAAA,IAAA,GAAO,eAAA,CAAgB,6BAAA,CAA8B,SAAA,EAAW,QAAQ,CAAC,CAAA;AACzE,IAAA,MAAA,GAAS,OAAA;AAAA,EACX;AAEA,EAAA,IAAI,CAAC,mBAAA,IAAuB,CAAC,IAAA,EAAM;AACjC,IAAA,CAAC,MAAM,MAAM,CAAA,GAAI,kBAAkB,MAAA,EAAQ,QAAA,EAAU,UAAU,QAAQ,CAAA;AAAA,EACzE;AAIA,EAAA,MAAM,YAAA,GAAe,mCAAA,CAAoC,QAAA,EAAU,SAAA,EAAW,IAAI,CAAA;AAClF,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,OAAO,CAAC,cAAc,OAAO,CAAA;AAAA,EAC/B;AAEA,EAAA,OAAO,CAAC,IAAA,IAAQ,QAAA,CAAS,QAAA,EAAU,MAAM,CAAA;AAC3C;AAKO,SAAS,iBAAA,GAAsC;AACpD,EAAA,MAAM,OAAO,aAAA,EAAc;AAC3B,EAAA,MAAM,QAAA,GAAW,IAAA,GAAO,WAAA,CAAY,IAAI,CAAA,GAAI,MAAA;AAE5C,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,EAAA,GAAK,UAAA,CAAW,QAAQ,CAAA,CAAE,EAAA;AAGhC,EAAA,OAAO,EAAA,KAAO,YAAA,IAAgB,EAAA,KAAO,UAAA,GAAa,QAAA,GAAW,MAAA;AAC/D;;;;"}
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../src/reactrouter-compat-utils/utils.ts"],"sourcesContent":["import type { Span, TransactionSource } from '@sentry/core';\nimport { debug, getActiveSpan, getRootSpan, spanToJSON } from '@sentry/core';\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { Location, MatchRoutes, ReactRouterConfig, RouteMatch, RouteObject } from '../types';\nimport { matchRouteManifest, stripBasenameFromPathname } from './route-manifest';\nimport { SENTRY_OP } from '@sentry/conventions/attributes';\n\n// Navigation context stack for nested/concurrent patchRoutesOnNavigation calls.\n// Required because window.location hasn't updated yet when handlers are invoked.\ninterface NavigationContext {\n token: object;\n targetPath: string | undefined;\n span: Span | undefined;\n}\n\nconst _navigationContextStack: NavigationContext[] = [];\nconst MAX_CONTEXT_STACK_SIZE = 10;\n\n/**\n * Pushes a navigation context and returns a unique token for cleanup.\n * The token uses object identity for uniqueness (no counter needed).\n */\nexport function setNavigationContext(targetPath: string | undefined, span: Span | undefined): object {\n const token = {};\n // Prevent unbounded stack growth - oldest (likely stale) contexts are evicted first\n if (_navigationContextStack.length >= MAX_CONTEXT_STACK_SIZE) {\n DEBUG_BUILD && debug.warn('[React Router] Navigation context stack overflow - removing oldest context');\n _navigationContextStack.shift();\n }\n _navigationContextStack.push({ token, targetPath, span });\n return token;\n}\n\n/**\n * Clears the navigation context if it's on top of the stack (LIFO).\n * If our context is not on top (out-of-order completion), we leave it -\n * it will be cleaned up by overflow protection when the stack fills up.\n */\nexport function clearNavigationContext(token: object): void {\n const top = _navigationContextStack[_navigationContextStack.length - 1];\n if (top?.token === token) {\n _navigationContextStack.pop();\n }\n}\n\n/** Gets the current (most recent) navigation context if inside a patchRoutesOnNavigation call. */\nexport function getNavigationContext(): NavigationContext | null {\n const length = _navigationContextStack.length;\n // The `?? null` converts undefined (from array access) to null to match return type\n return length > 0 ? (_navigationContextStack[length - 1] ?? null) : null;\n}\n\n// Helper functions\nfunction pickPath(match: RouteMatch): string {\n return trimWildcard(match.route.path || '');\n}\n\nfunction pickSplat(match: RouteMatch): string {\n return match.params['*'] || '';\n}\n\nfunction trimWildcard(path: string): string {\n return path[path.length - 1] === '*' ? path.slice(0, -1) : path;\n}\n\nfunction trimSlash(path: string): string {\n return path[path.length - 1] === '/' ? path.slice(0, -1) : path;\n}\n\n/**\n * Checks if a path ends with a wildcard character (*).\n */\nexport function pathEndsWithWildcard(path: string): boolean {\n return path.endsWith('*');\n}\n\n/** Checks if transaction name has wildcard (/* or ends with *). */\nexport function transactionNameHasWildcard(name: string): boolean {\n return name.includes('/*') || name.endsWith('*');\n}\n\n/**\n * Checks if a path is a wildcard and has child routes.\n */\nexport function pathIsWildcardAndHasChildren(path: string, branch: RouteMatch<string>): boolean {\n return (pathEndsWithWildcard(path) && !!branch.route.children?.length) || false;\n}\n\n/** Check if route is in descendant route (<Routes> within <Routes>) */\nexport function routeIsDescendant(route: RouteObject): boolean {\n return !!(!route.children && route.element && route.path?.endsWith('/*'));\n}\n\nfunction sendIndexPath(\n pathBuilder: string,\n pathname: string,\n basename: string,\n stripBasename: boolean,\n): [string, TransactionSource] {\n const reconstructedPath =\n pathBuilder && pathBuilder.length > 0\n ? pathBuilder\n : stripBasename\n ? stripBasenameFromPathname(pathname, basename)\n : pathname;\n\n let formattedPath =\n // If the path ends with a wildcard suffix, remove both the slash and the asterisk\n reconstructedPath.slice(-2) === '/*' ? reconstructedPath.slice(0, -2) : reconstructedPath;\n\n // If the path ends with a slash, remove it (but keep single '/')\n if (formattedPath.length > 1 && formattedPath[formattedPath.length - 1] === '/') {\n formattedPath = formattedPath.slice(0, -1);\n }\n\n return [formattedPath, 'route'];\n}\n\n/**\n * Returns the number of URL segments in the given URL string.\n * Splits at '/' or '\\/' to handle regex URLs correctly.\n *\n * @param url - The URL string to segment.\n * @returns The number of segments in the URL.\n */\nexport function getNumberOfUrlSegments(url: string): number {\n // split at '/' or at '\\/' to split regex urls correctly\n return url.split(/\\\\?\\//).filter(s => s.length > 0 && s !== ',').length;\n}\n\n// Exported utility functions\n\n/**\n * Ensures a path string starts with a forward slash.\n */\nexport function prefixWithSlash(path: string): string {\n return path[0] === '/' ? path : `/${path}`;\n}\n\n/**\n * Rebuilds the route path from all available routes by matching against the current location.\n */\nexport function rebuildRoutePathFromAllRoutes(\n allRoutes: RouteObject[],\n location: Location,\n matchRoutes: MatchRoutes,\n): string {\n const matchedRoutes = matchRoutes(allRoutes, location) as RouteMatch[];\n\n if (!matchedRoutes || matchedRoutes.length === 0) {\n return '';\n }\n\n for (const match of matchedRoutes) {\n if (match.route.path && match.route.path !== '*') {\n const path = pickPath(match);\n const strippedPath = stripBasenameFromPathname(location.pathname, prefixWithSlash(match.pathnameBase));\n\n if (location.pathname === strippedPath) {\n return trimSlash(strippedPath);\n }\n\n return trimSlash(\n trimSlash(path || '') +\n prefixWithSlash(\n rebuildRoutePathFromAllRoutes(\n allRoutes.filter(route => route !== match.route),\n {\n pathname: strippedPath,\n },\n matchRoutes,\n ),\n ),\n );\n }\n }\n\n return '';\n}\n\n/**\n * Recovers the parent prefix for descendant `<Routes>` names.\n *\n * `allRoutes` flattens every mounted `<Routes>` into one set, so an orphaned descendant subtree can\n * outscore the `.../*` route that anchors the location and drop its prefix (e.g. `/:id/:sub` instead of `/child/:id`).\n * Matching only the descendant-parent routes recovers the true anchor.\n */\nfunction reconstructNameFromDescendantParent(\n location: Location,\n allRoutes: RouteObject[],\n currentName: string | undefined,\n matchRoutes: MatchRoutes,\n): string | undefined {\n const descendantParents = allRoutes.filter(routeIsDescendant);\n if (!descendantParents.length) {\n return undefined;\n }\n\n const matchedParents = matchRoutes(descendantParents, location) as RouteMatch[] | null;\n const parentMatch = matchedParents?.[matchedParents.length - 1];\n if (!parentMatch || !pickSplat(parentMatch)) {\n return undefined;\n }\n\n const parentTemplate = trimSlash(trimWildcard(parentMatch.route.path || ''));\n\n if (!parentTemplate) {\n return undefined;\n }\n\n const expectedPrefix = prefixWithSlash(parentTemplate);\n\n // Child `<Routes>` resolve against the matched parent, but flattened route matching can already retain\n // a dynamic leading parameter. Adding the parent again would duplicate it (e.g. `/:id/:id`)\n const firstElement = parentTemplate.split('/')[0];\n const hasDynamicLead = firstElement?.startsWith(':') && currentName?.split('/').includes(firstElement);\n\n // Rebuild only when matching the descendant subtree discarded its parent route template\n if (currentName === expectedPrefix || currentName?.startsWith(`${expectedPrefix}/`) || hasDynamicLead) {\n return undefined;\n }\n\n const remainingPathname =\n stripBasenameFromPathname(location.pathname, prefixWithSlash(parentMatch.pathnameBase)) || '/';\n const remainingName = rebuildRoutePathFromAllRoutes(\n allRoutes.filter(route => route !== parentMatch.route),\n { pathname: remainingPathname },\n matchRoutes,\n );\n\n return remainingName ? prefixWithSlash(`${parentTemplate}${prefixWithSlash(remainingName)}`) : undefined;\n}\n\n/**\n * Checks if the current location is inside a descendant route (route with splat parameter).\n */\nexport function locationIsInsideDescendantRoute(\n location: Location,\n routes: RouteObject[],\n matchRoutes: MatchRoutes,\n): boolean {\n const matchedRoutes = matchRoutes(routes, location) as RouteMatch[];\n\n if (matchedRoutes) {\n for (const match of matchedRoutes) {\n if (routeIsDescendant(match.route) && pickSplat(match)) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n/**\n * Returns a fallback transaction name from location pathname.\n */\nfunction getFallbackTransactionName(location: Location, basename: string, stripBasename: boolean): string {\n return stripBasename ? stripBasenameFromPathname(location.pathname, basename) : location.pathname || '';\n}\n\n/**\n * Gets a normalized route name and transaction source from the current routes and location.\n */\nexport function getNormalizedName(\n routes: RouteObject[],\n location: Location,\n branches: RouteMatch[],\n basename: string = '',\n stripBasename: boolean = false,\n): [string, TransactionSource] {\n if (!routes || routes.length === 0) {\n return [stripBasename ? stripBasenameFromPathname(location.pathname, basename) : location.pathname, 'url'];\n }\n\n if (!branches) {\n return [getFallbackTransactionName(location, basename, stripBasename), 'url'];\n }\n\n let pathBuilder = '';\n\n for (const branch of branches) {\n const route = branch.route;\n if (!route) {\n continue;\n }\n\n // Early return for index routes\n if (route.index) {\n return sendIndexPath(pathBuilder, branch.pathname, basename, stripBasename);\n }\n\n const path = route.path;\n if (!path || pathIsWildcardAndHasChildren(path, branch)) {\n continue;\n }\n\n // Build the route path\n const newPath = path[0] === '/' || pathBuilder[pathBuilder.length - 1] === '/' ? path : `/${path}`;\n pathBuilder = trimSlash(pathBuilder) + prefixWithSlash(newPath);\n\n // Check if this path matches the current location\n if (trimSlash(location.pathname) !== trimSlash(basename + branch.pathname)) {\n continue;\n }\n\n // Check if this is a parameterized route like /stores/:storeId/products/:productId\n if (\n getNumberOfUrlSegments(pathBuilder) !== getNumberOfUrlSegments(branch.pathname) &&\n !pathEndsWithWildcard(pathBuilder)\n ) {\n return [(stripBasename ? '' : basename) + newPath, 'route'];\n }\n\n // Handle wildcard routes with children - strip trailing wildcard\n if (pathIsWildcardAndHasChildren(pathBuilder, branch)) {\n pathBuilder = pathBuilder.slice(0, -1);\n }\n\n return [(stripBasename ? '' : basename) + pathBuilder, 'route'];\n }\n\n // Fallback when no matching route found\n return [getFallbackTransactionName(location, basename, stripBasename), 'url'];\n}\n\n/**\n * Shared helper function to resolve route name and source\n */\nexport function resolveRouteNameAndSource(\n location: Location,\n routes: RouteObject[],\n allRoutes: RouteObject[],\n branches: RouteMatch[],\n config: ReactRouterConfig,\n): [string, TransactionSource] {\n const { matchRoutes, stripBasename, basename, lazyRouteManifest, enableAsyncRouteHandlers } = config;\n\n // When lazy route manifest is provided, use it as the primary source for transaction names\n if (enableAsyncRouteHandlers && lazyRouteManifest && lazyRouteManifest.length > 0) {\n const manifestMatch = matchRouteManifest(location.pathname, lazyRouteManifest, basename);\n if (manifestMatch) {\n return [(stripBasename ? '' : basename) + manifestMatch, 'route'];\n }\n }\n\n // Fall back to React Router route matching\n let name: string | undefined;\n let source: TransactionSource = 'url';\n\n const isInDescendantRoute = locationIsInsideDescendantRoute(location, allRoutes, matchRoutes);\n\n if (isInDescendantRoute) {\n name = prefixWithSlash(rebuildRoutePathFromAllRoutes(allRoutes, location, matchRoutes));\n source = 'route';\n }\n\n if (!isInDescendantRoute || !name) {\n [name, source] = getNormalizedName(routes, location, branches, basename, stripBasename);\n }\n\n // Guard against orphaned descendant subtrees stealing the transaction name: if the location is\n // anchored by a descendant-parent route (`.../*`) whose prefix was dropped, reconstruct with it.\n const anchoredName = reconstructNameFromDescendantParent(location, allRoutes, name, matchRoutes);\n if (anchoredName) {\n return [anchoredName, 'route'];\n }\n\n return [name || location.pathname, source];\n}\n\n/**\n * Gets the active root span if it's a pageload or navigation span.\n */\nexport function 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).attributes[SENTRY_OP];\n\n // Only use this root span if it is a pageload or navigation span\n return op === 'navigation' || op === 'pageload' ? rootSpan : undefined;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,4 @@
|
|
|
1
1
|
import { createReactRouterV6CompatibleTracingIntegration, createV6CompatibleWrapCreateBrowserRouter, createV6CompatibleWrapCreateMemoryRouter, createV6CompatibleWithSentryReactRouterRouting, createV6CompatibleWrapUseRoutes } from './reactrouter-compat-utils/instrumentation.js';
|
|
2
|
-
import '@sentry/core/browser';
|
|
3
|
-
import '@sentry/browser';
|
|
4
|
-
import '@sentry/core';
|
|
5
2
|
|
|
6
3
|
function reactRouterBrowserTracingIntegration(options) {
|
|
7
4
|
return createReactRouterV6CompatibleTracingIntegration(options, "");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactrouter.compat.js","sources":["../../src/reactrouter.compat.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 to instrument navigations.\n * Expects `useEffect`, `useLocation`, `useNavigationType`, `createRoutesFromChildren` and `matchRoutes` to be passed as options.\n *\n * Works with React Router v6+.\n */\nexport function reactRouterBrowserTracingIntegration(\n options: Parameters<typeof browserTracingIntegration>[0] & ReactRouterOptions,\n): Integration {\n return createReactRouterV6CompatibleTracingIntegration(options, '');\n}\n\n/**\n * A higher-order component that adds Sentry routing instrumentation to a React Router Route component.\n * This is used to automatically capture route changes as transactions.\n *\n * Works with React Router v6+.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function wrapReactRouterRouting<P extends Record<string, any>, R extends React.FC<P>>(routes: R): R {\n return createV6CompatibleWithSentryReactRouterRouting<P, R>(routes, '');\n}\n\n/**\n * A wrapper function that adds Sentry routing instrumentation to a React Router createBrowserRouter function.\n * This is used to automatically capture route changes as transactions when using the createBrowserRouter API.\n *\n * Works with React Router v6+.\n */\nexport function wrapCreateBrowserRouter<\n TState extends RouterState = RouterState,\n TRouter extends Router<TState> = Router<TState>,\n>(createRouterFunction: CreateRouterFunction<TState, TRouter>): CreateRouterFunction<TState, TRouter> {\n return createV6CompatibleWrapCreateBrowserRouter(createRouterFunction, '');\n}\n\n/**\n * A wrapper function that adds Sentry routing instrumentation to a React Router 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 * Works with React Router v6+.\n */\nexport function wrapCreateMemoryRouter<\n TState extends RouterState = RouterState,\n TRouter extends Router<TState> = Router<TState>,\n>(createMemoryRouterFunction: CreateRouterFunction<TState, TRouter>): CreateRouterFunction<TState, TRouter> {\n return createV6CompatibleWrapCreateMemoryRouter(createMemoryRouterFunction, '');\n}\n\n/**\n * A wrapper function that adds Sentry routing instrumentation to a React Router useRoutes hook.\n * This is used to automatically capture route changes as transactions when using the useRoutes hook.\n *\n * Works with React Router v6+.\n */\nexport function wrapUseRoutes(origUseRoutes: UseRoutes): UseRoutes {\n return createV6CompatibleWrapUseRoutes(origUseRoutes, '');\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"reactrouter.compat.js","sources":["../../src/reactrouter.compat.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 to instrument navigations.\n * Expects `useEffect`, `useLocation`, `useNavigationType`, `createRoutesFromChildren` and `matchRoutes` to be passed as options.\n *\n * Works with React Router v6+.\n */\nexport function reactRouterBrowserTracingIntegration(\n options: Parameters<typeof browserTracingIntegration>[0] & ReactRouterOptions,\n): Integration {\n return createReactRouterV6CompatibleTracingIntegration(options, '');\n}\n\n/**\n * A higher-order component that adds Sentry routing instrumentation to a React Router Route component.\n * This is used to automatically capture route changes as transactions.\n *\n * Works with React Router v6+.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function wrapReactRouterRouting<P extends Record<string, any>, R extends React.FC<P>>(routes: R): R {\n return createV6CompatibleWithSentryReactRouterRouting<P, R>(routes, '');\n}\n\n/**\n * A wrapper function that adds Sentry routing instrumentation to a React Router createBrowserRouter function.\n * This is used to automatically capture route changes as transactions when using the createBrowserRouter API.\n *\n * Works with React Router v6+.\n */\nexport function wrapCreateBrowserRouter<\n TState extends RouterState = RouterState,\n TRouter extends Router<TState> = Router<TState>,\n>(createRouterFunction: CreateRouterFunction<TState, TRouter>): CreateRouterFunction<TState, TRouter> {\n return createV6CompatibleWrapCreateBrowserRouter(createRouterFunction, '');\n}\n\n/**\n * A wrapper function that adds Sentry routing instrumentation to a React Router 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 * Works with React Router v6+.\n */\nexport function wrapCreateMemoryRouter<\n TState extends RouterState = RouterState,\n TRouter extends Router<TState> = Router<TState>,\n>(createMemoryRouterFunction: CreateRouterFunction<TState, TRouter>): CreateRouterFunction<TState, TRouter> {\n return createV6CompatibleWrapCreateMemoryRouter(createMemoryRouterFunction, '');\n}\n\n/**\n * A wrapper function that adds Sentry routing instrumentation to a React Router useRoutes hook.\n * This is used to automatically capture route changes as transactions when using the useRoutes hook.\n *\n * Works with React Router v6+.\n */\nexport function wrapUseRoutes(origUseRoutes: UseRoutes): UseRoutes {\n return createV6CompatibleWrapUseRoutes(origUseRoutes, '');\n}\n"],"names":[],"mappings":";;AAkBO,SAAS,qCACd,OAAA,EACa;AACb,EAAA,OAAO,+CAAA,CAAgD,SAAS,EAAE,CAAA;AACpE;AASO,SAAS,uBAA6E,MAAA,EAAc;AACzG,EAAA,OAAO,8CAAA,CAAqD,QAAQ,EAAE,CAAA;AACxE;AAQO,SAAS,wBAGd,oBAAA,EAAoG;AACpG,EAAA,OAAO,yCAAA,CAA0C,sBAAsB,EAAE,CAAA;AAC3E;AAUO,SAAS,uBAGd,0BAAA,EAA0G;AAC1G,EAAA,OAAO,wCAAA,CAAyC,4BAA4B,EAAE,CAAA;AAChF;AAQO,SAAS,cAAc,aAAA,EAAqC;AACjE,EAAA,OAAO,+BAAA,CAAgC,eAAe,EAAE,CAAA;AAC1D;;;;"}
|
package/build/esm/reactrouter.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { browserTracingIntegration, startBrowserTracingPageLoadSpan, startBrowserTracingNavigationSpan, WINDOW } from '@sentry/browser';
|
|
2
|
-
import {
|
|
2
|
+
import { PAGELOAD_SPAN_NAME_FALLBACK, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, hasSpanStreamingEnabled, NAVIGATION_SPAN_NAME_FALLBACK, getCurrentScope, getActiveSpan, getRootSpan, spanToJSON, SEMANTIC_ATTRIBUTE_SENTRY_OP } from '@sentry/core';
|
|
3
3
|
import * as React from 'react';
|
|
4
4
|
import { hoistNonReactStatics } from './hoist-non-react-statics.js';
|
|
5
|
-
import { URL_TEMPLATE } from '@sentry/conventions/attributes';
|
|
5
|
+
import { URL_TEMPLATE, SENTRY_SEGMENT_NAME_SOURCE, SENTRY_OP } from '@sentry/conventions/attributes';
|
|
6
|
+
import { PAGELOAD, NAVIGATION } from '@sentry/conventions/op';
|
|
6
7
|
|
|
7
8
|
function reactRouterV4BrowserTracingIntegration(options) {
|
|
8
9
|
const integration = browserTracingIntegration({
|
|
@@ -77,11 +78,12 @@ function instrumentReactRouter(client, instrumentPageLoad, instrumentNavigation,
|
|
|
77
78
|
if (initPathName) {
|
|
78
79
|
const [name, source] = normalizeTransactionName(initPathName);
|
|
79
80
|
startBrowserTracingPageLoadSpan(client, {
|
|
80
|
-
|
|
81
|
+
// With span streaming, span names have to be low cardinality, so we can't fall back to the URL.
|
|
82
|
+
name: source === "route" || !hasSpanStreamingEnabled(client) ? name : PAGELOAD_SPAN_NAME_FALLBACK,
|
|
81
83
|
attributes: {
|
|
82
|
-
[
|
|
84
|
+
[SENTRY_OP]: PAGELOAD,
|
|
83
85
|
[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: `auto.pageload.react.${instrumentationName}`,
|
|
84
|
-
[
|
|
86
|
+
[SENTRY_SEGMENT_NAME_SOURCE]: source,
|
|
85
87
|
...source === "route" && { [URL_TEMPLATE]: name }
|
|
86
88
|
}
|
|
87
89
|
});
|
|
@@ -92,11 +94,12 @@ function instrumentReactRouter(client, instrumentPageLoad, instrumentNavigation,
|
|
|
92
94
|
if (action && (action === "PUSH" || action === "POP")) {
|
|
93
95
|
const [name, source] = normalizeTransactionName(location.pathname);
|
|
94
96
|
startBrowserTracingNavigationSpan(client, {
|
|
95
|
-
|
|
97
|
+
// With span streaming, span names have to be low cardinality, so we can't fall back to the URL.
|
|
98
|
+
name: source === "route" || !hasSpanStreamingEnabled(client) ? name : NAVIGATION_SPAN_NAME_FALLBACK,
|
|
96
99
|
attributes: {
|
|
97
|
-
[
|
|
100
|
+
[SENTRY_OP]: NAVIGATION,
|
|
98
101
|
[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: `auto.navigation.react.${instrumentationName}`,
|
|
99
|
-
[
|
|
102
|
+
[SENTRY_SEGMENT_NAME_SOURCE]: source,
|
|
100
103
|
...source === "route" && { [URL_TEMPLATE]: name }
|
|
101
104
|
}
|
|
102
105
|
});
|
|
@@ -132,7 +135,10 @@ function withSentryRouting(Route) {
|
|
|
132
135
|
getCurrentScope().setTransactionName(route);
|
|
133
136
|
if (activeRootSpan) {
|
|
134
137
|
activeRootSpan.updateName(route);
|
|
135
|
-
activeRootSpan.setAttributes({
|
|
138
|
+
activeRootSpan.setAttributes({
|
|
139
|
+
[SENTRY_SEGMENT_NAME_SOURCE]: "route",
|
|
140
|
+
[URL_TEMPLATE]: route
|
|
141
|
+
});
|
|
136
142
|
}
|
|
137
143
|
}
|
|
138
144
|
return /* @__PURE__ */ React.createElement(Route, { ...props });
|
|
@@ -147,7 +153,7 @@ function getActiveRootSpan() {
|
|
|
147
153
|
if (!rootSpan) {
|
|
148
154
|
return void 0;
|
|
149
155
|
}
|
|
150
|
-
const op = spanToJSON(rootSpan).
|
|
156
|
+
const op = spanToJSON(rootSpan).attributes[SEMANTIC_ATTRIBUTE_SENTRY_OP];
|
|
151
157
|
return op === "navigation" || op === "pageload" ? rootSpan : void 0;
|
|
152
158
|
}
|
|
153
159
|
|
|
@@ -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';\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":[],"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 hasSpanStreamingEnabled,\n NAVIGATION_SPAN_NAME_FALLBACK,\n PAGELOAD_SPAN_NAME_FALLBACK,\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\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 { SENTRY_OP, SENTRY_SEGMENT_NAME_SOURCE, URL_TEMPLATE } from '@sentry/conventions/attributes';\nimport { NAVIGATION, PAGELOAD } from '@sentry/conventions/op';\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 // With span streaming, span names have to be low cardinality, so we can't fall back to the URL.\n name: source === 'route' || !hasSpanStreamingEnabled(client) ? name : PAGELOAD_SPAN_NAME_FALLBACK,\n attributes: {\n [SENTRY_OP]: PAGELOAD,\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: `auto.pageload.react.${instrumentationName}`,\n [SENTRY_SEGMENT_NAME_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 // With span streaming, span names have to be low cardinality, so we can't fall back to the URL.\n name: source === 'route' || !hasSpanStreamingEnabled(client) ? name : NAVIGATION_SPAN_NAME_FALLBACK,\n attributes: {\n [SENTRY_OP]: NAVIGATION,\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: `auto.navigation.react.${instrumentationName}`,\n [SENTRY_SEGMENT_NAME_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/**\n * A higher-order component that adds Sentry routing instrumentation to a React Router v4 or v5 `Route` component.\n * When the wrapped `Route` matches, the active pageload/navigation span is renamed to the parameterized route path.\n *\n * The wrapped `Route` must be rendered inside a `Switch`, since the match is read from the `computedMatch` prop\n * that only `Switch` passes down. For React Router v6 and later, use `wrapReactRouterRouting` instead.\n *\n * @example\n * ```jsx\n * const SentryRoute = Sentry.withSentryRouting(Route);\n *\n * <Switch>\n * <SentryRoute path=\"/users/:id\" component={User} />\n * </Switch>\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({\n [SENTRY_SEGMENT_NAME_SOURCE]: 'route',\n [URL_TEMPLATE]: route,\n });\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).attributes[SEMANTIC_ATTRIBUTE_SENTRY_OP];\n\n // Only use this root span if it is a pageload or navigation span\n return op === 'navigation' || op === 'pageload' ? rootSpan : undefined;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { browserTracingIntegration, WINDOW, startBrowserTracingPageLoadSpan, startBrowserTracingNavigationSpan } from '@sentry/browser';
|
|
2
|
-
import {
|
|
3
|
-
import { URL_TEMPLATE } from '@sentry/conventions/attributes';
|
|
2
|
+
import { PAGELOAD_SPAN_NAME_FALLBACK, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, hasSpanStreamingEnabled, NAVIGATION_SPAN_NAME_FALLBACK } from '@sentry/core';
|
|
3
|
+
import { URL_TEMPLATE, SENTRY_SEGMENT_NAME_SOURCE, SENTRY_OP } from '@sentry/conventions/attributes';
|
|
4
|
+
import { PAGELOAD, NAVIGATION } from '@sentry/conventions/op';
|
|
4
5
|
|
|
5
6
|
function reactRouterV3BrowserTracingIntegration(options) {
|
|
6
7
|
const integration = browserTracingIntegration({
|
|
@@ -20,11 +21,12 @@ function reactRouterV3BrowserTracingIntegration(options) {
|
|
|
20
21
|
match,
|
|
21
22
|
(localName, source = "url") => {
|
|
22
23
|
startBrowserTracingPageLoadSpan(client, {
|
|
23
|
-
|
|
24
|
+
// With span streaming, span names have to be low cardinality, so we can't fall back to the URL.
|
|
25
|
+
name: source === "route" || !hasSpanStreamingEnabled(client) ? localName : PAGELOAD_SPAN_NAME_FALLBACK,
|
|
24
26
|
attributes: {
|
|
25
|
-
[
|
|
27
|
+
[SENTRY_OP]: PAGELOAD,
|
|
26
28
|
[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.pageload.react.reactrouter_v3",
|
|
27
|
-
[
|
|
29
|
+
[SENTRY_SEGMENT_NAME_SOURCE]: source,
|
|
28
30
|
...source === "route" && { [URL_TEMPLATE]: localName }
|
|
29
31
|
}
|
|
30
32
|
});
|
|
@@ -40,11 +42,12 @@ function reactRouterV3BrowserTracingIntegration(options) {
|
|
|
40
42
|
match,
|
|
41
43
|
(localName, source = "url") => {
|
|
42
44
|
startBrowserTracingNavigationSpan(client, {
|
|
43
|
-
|
|
45
|
+
// With span streaming, span names have to be low cardinality, so we can't fall back to the URL.
|
|
46
|
+
name: source === "route" || !hasSpanStreamingEnabled(client) ? localName : NAVIGATION_SPAN_NAME_FALLBACK,
|
|
44
47
|
attributes: {
|
|
45
|
-
[
|
|
48
|
+
[SENTRY_OP]: NAVIGATION,
|
|
46
49
|
[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.navigation.react.reactrouter_v3",
|
|
47
|
-
[
|
|
50
|
+
[SENTRY_SEGMENT_NAME_SOURCE]: source,
|
|
48
51
|
...source === "route" && { [URL_TEMPLATE]: localName }
|
|
49
52
|
}
|
|
50
53
|
});
|
|
@@ -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
|
|
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 hasSpanStreamingEnabled,\n NAVIGATION_SPAN_NAME_FALLBACK,\n PAGELOAD_SPAN_NAME_FALLBACK,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n} from '@sentry/core';\nimport type { Location } from './types';\nimport { SENTRY_OP, SENTRY_SEGMENT_NAME_SOURCE, URL_TEMPLATE } from '@sentry/conventions/attributes';\nimport { NAVIGATION, PAGELOAD } from '@sentry/conventions/op';\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,\n match,\n (localName: string, source: ReactRouterV3TransactionSource = 'url') => {\n startBrowserTracingPageLoadSpan(client, {\n // With span streaming, span names have to be low cardinality, so we can't fall back to the URL.\n name: source === 'route' || !hasSpanStreamingEnabled(client) ? localName : PAGELOAD_SPAN_NAME_FALLBACK,\n attributes: {\n [SENTRY_OP]: PAGELOAD,\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.pageload.react.reactrouter_v3',\n [SENTRY_SEGMENT_NAME_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 // With span streaming, span names have to be low cardinality, so we can't fall back to the URL.\n name:\n source === 'route' || !hasSpanStreamingEnabled(client) ? localName : NAVIGATION_SPAN_NAME_FALLBACK,\n attributes: {\n [SENTRY_OP]: NAVIGATION,\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.navigation.react.reactrouter_v3',\n [SENTRY_SEGMENT_NAME_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":[],"mappings":"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"}
|
|
@@ -1,7 +1,4 @@
|
|
|
1
1
|
import { createReactRouterV6CompatibleTracingIntegration, createV6CompatibleWithSentryReactRouterRouting, createV6CompatibleWrapCreateBrowserRouter, createV6CompatibleWrapCreateMemoryRouter, createV6CompatibleWrapUseRoutes } from './reactrouter-compat-utils/instrumentation.js';
|
|
2
|
-
import '@sentry/core/browser';
|
|
3
|
-
import '@sentry/browser';
|
|
4
|
-
import '@sentry/core';
|
|
5
2
|
|
|
6
3
|
function reactRouterV6BrowserTracingIntegration(options) {
|
|
7
4
|
return createReactRouterV6CompatibleTracingIntegration(options, "6");
|
|
@@ -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 *\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":[],"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":[],"mappings":";;AAkBO,SAAS,uCACd,OAAA,EACa;AACb,EAAA,OAAO,+CAAA,CAAgD,SAAS,GAAG,CAAA;AACrE;AAQO,SAAS,gBAAgB,aAAA,EAAqC;AACnE,EAAA,OAAO,+BAAA,CAAgC,eAAe,GAAG,CAAA;AAC3D;AAQO,SAAS,0BAGd,oBAAA,EAAoG;AACpG,EAAA,OAAO,yCAAA,CAA0C,sBAAsB,GAAG,CAAA;AAC5E;AAUO,SAAS,yBAGd,0BAAA,EAA0G;AAC1G,EAAA,OAAO,wCAAA,CAAyC,4BAA4B,GAAG,CAAA;AACjF;AASO,SAAS,+BAAqF,MAAA,EAAc;AACjH,EAAA,OAAO,8CAAA,CAAqD,QAAQ,GAAG,CAAA;AACzE;;;;"}
|
|
@@ -1,7 +1,4 @@
|
|
|
1
1
|
import { createReactRouterV6CompatibleTracingIntegration, createV6CompatibleWithSentryReactRouterRouting, createV6CompatibleWrapCreateBrowserRouter, createV6CompatibleWrapCreateMemoryRouter, createV6CompatibleWrapUseRoutes } from './reactrouter-compat-utils/instrumentation.js';
|
|
2
|
-
import '@sentry/core/browser';
|
|
3
|
-
import '@sentry/browser';
|
|
4
|
-
import '@sentry/core';
|
|
5
2
|
|
|
6
3
|
function reactRouterV7BrowserTracingIntegration(options) {
|
|
7
4
|
return createReactRouterV6CompatibleTracingIntegration(options, "7");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactrouterv7.js","sources":["../../src/reactrouterv7.tsx"],"sourcesContent":["// React Router v7 uses the same integration as v6\nimport 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 v7 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 reactRouterV7BrowserTracingIntegration(\n options: Parameters<typeof browserTracingIntegration>[0] & ReactRouterOptions,\n): Integration {\n return createReactRouterV6CompatibleTracingIntegration(options, '7');\n}\n\n/**\n * A higher-order component that adds Sentry routing instrumentation to a React Router v7 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 withSentryReactRouterV7Routing<P extends Record<string, any>, R extends React.FC<P>>(routes: R): R {\n return createV6CompatibleWithSentryReactRouterRouting<P, R>(routes, '7');\n}\n\n/**\n * A wrapper function that adds Sentry routing instrumentation to a React Router v7 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 wrapCreateBrowserRouterV7<\n TState extends RouterState = RouterState,\n TRouter extends Router<TState> = Router<TState>,\n>(createRouterFunction: CreateRouterFunction<TState, TRouter>): CreateRouterFunction<TState, TRouter> {\n return createV6CompatibleWrapCreateBrowserRouter(createRouterFunction, '7');\n}\n\n/**\n * A wrapper function that adds Sentry routing instrumentation to a React Router v7 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 wrapCreateMemoryRouterV7<\n TState extends RouterState = RouterState,\n TRouter extends Router<TState> = Router<TState>,\n>(createMemoryRouterFunction: CreateRouterFunction<TState, TRouter>): CreateRouterFunction<TState, TRouter> {\n return createV6CompatibleWrapCreateMemoryRouter(createMemoryRouterFunction, '7');\n}\n\n/**\n * A wrapper function that adds Sentry routing instrumentation to a React Router v7 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 wrapUseRoutesV7(origUseRoutes: UseRoutes): UseRoutes {\n return createV6CompatibleWrapUseRoutes(origUseRoutes, '7');\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"reactrouterv7.js","sources":["../../src/reactrouterv7.tsx"],"sourcesContent":["// React Router v7 uses the same integration as v6\nimport 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 v7 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 reactRouterV7BrowserTracingIntegration(\n options: Parameters<typeof browserTracingIntegration>[0] & ReactRouterOptions,\n): Integration {\n return createReactRouterV6CompatibleTracingIntegration(options, '7');\n}\n\n/**\n * A higher-order component that adds Sentry routing instrumentation to a React Router v7 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 withSentryReactRouterV7Routing<P extends Record<string, any>, R extends React.FC<P>>(routes: R): R {\n return createV6CompatibleWithSentryReactRouterRouting<P, R>(routes, '7');\n}\n\n/**\n * A wrapper function that adds Sentry routing instrumentation to a React Router v7 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 wrapCreateBrowserRouterV7<\n TState extends RouterState = RouterState,\n TRouter extends Router<TState> = Router<TState>,\n>(createRouterFunction: CreateRouterFunction<TState, TRouter>): CreateRouterFunction<TState, TRouter> {\n return createV6CompatibleWrapCreateBrowserRouter(createRouterFunction, '7');\n}\n\n/**\n * A wrapper function that adds Sentry routing instrumentation to a React Router v7 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 wrapCreateMemoryRouterV7<\n TState extends RouterState = RouterState,\n TRouter extends Router<TState> = Router<TState>,\n>(createMemoryRouterFunction: CreateRouterFunction<TState, TRouter>): CreateRouterFunction<TState, TRouter> {\n return createV6CompatibleWrapCreateMemoryRouter(createMemoryRouterFunction, '7');\n}\n\n/**\n * A wrapper function that adds Sentry routing instrumentation to a React Router v7 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 wrapUseRoutesV7(origUseRoutes: UseRoutes): UseRoutes {\n return createV6CompatibleWrapUseRoutes(origUseRoutes, '7');\n}\n"],"names":[],"mappings":";;AAmBO,SAAS,uCACd,OAAA,EACa;AACb,EAAA,OAAO,+CAAA,CAAgD,SAAS,GAAG,CAAA;AACrE;AASO,SAAS,+BAAqF,MAAA,EAAc;AACjH,EAAA,OAAO,8CAAA,CAAqD,QAAQ,GAAG,CAAA;AACzE;AAQO,SAAS,0BAGd,oBAAA,EAAoG;AACpG,EAAA,OAAO,yCAAA,CAA0C,sBAAsB,GAAG,CAAA;AAC5E;AAUO,SAAS,yBAGd,0BAAA,EAA0G;AAC1G,EAAA,OAAO,wCAAA,CAAyC,4BAA4B,GAAG,CAAA;AACjF;AAQO,SAAS,gBAAgB,aAAA,EAAqC;AACnE,EAAA,OAAO,+BAAA,CAAgC,eAAe,GAAG,CAAA;AAC3D;;;;"}
|
package/build/esm/redux.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getGlobalScope, getCurrentScope, addBreadcrumb, getClient, setNormalizationDepthOverrideHint } from '@sentry/core
|
|
1
|
+
import { getGlobalScope, getCurrentScope, addBreadcrumb, getClient, setNormalizationDepthOverrideHint } from '@sentry/core';
|
|
2
2
|
|
|
3
3
|
const ACTION_BREADCRUMB_CATEGORY = "redux.action";
|
|
4
4
|
const ACTION_BREADCRUMB_TYPE = "info";
|