@sentry/react 10.62.0 → 10.64.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/tanstackrouter.js +54 -35
- package/build/cjs/tanstackrouter.js.map +1 -1
- package/build/esm/package.json +1 -1
- package/build/esm/tanstackrouter.js +54 -35
- package/build/esm/tanstackrouter.js.map +1 -1
- package/build/types/tanstackrouter.d.ts.map +1 -1
- package/build/types/vendor/tanstackrouter-types.d.ts +1 -1
- package/build/types/vendor/tanstackrouter-types.d.ts.map +1 -1
- package/build/types-ts3.8/vendor/tanstackrouter-types.d.ts +1 -1
- package/package.json +3 -3
|
@@ -15,16 +15,21 @@ function tanstackRouterBrowserTracingIntegration(router, options = {}) {
|
|
|
15
15
|
...browserTracingIntegrationInstance,
|
|
16
16
|
afterAllSetup(client) {
|
|
17
17
|
browserTracingIntegrationInstance.afterAllSetup(client);
|
|
18
|
+
const resolveRouteMatch = (pathname, search) => {
|
|
19
|
+
const matchedRoutes = castRouterInstance.matchRoutes(pathname, search, {
|
|
20
|
+
preload: false,
|
|
21
|
+
throwOnError: false
|
|
22
|
+
});
|
|
23
|
+
const lastMatch = matchedRoutes[matchedRoutes.length - 1];
|
|
24
|
+
return lastMatch?.routeId !== "__root__" ? lastMatch : void 0;
|
|
25
|
+
};
|
|
18
26
|
const initialWindowLocation = browser.WINDOW.location;
|
|
19
27
|
if (instrumentPageLoad && initialWindowLocation) {
|
|
20
|
-
const
|
|
28
|
+
const routeMatch = resolveRouteMatch(
|
|
21
29
|
initialWindowLocation.pathname,
|
|
22
|
-
castRouterInstance.options.parseSearch(initialWindowLocation.search)
|
|
23
|
-
{ preload: false, throwOnError: false }
|
|
30
|
+
castRouterInstance.options.parseSearch(initialWindowLocation.search)
|
|
24
31
|
);
|
|
25
|
-
const
|
|
26
|
-
const routeMatch = lastMatch?.routeId !== "__root__" ? lastMatch : void 0;
|
|
27
|
-
browser.startBrowserTracingPageLoadSpan(client, {
|
|
32
|
+
const pageloadSpan = browser.startBrowserTracingPageLoadSpan(client, {
|
|
28
33
|
name: routeMatch ? routeMatch.routeId : initialWindowLocation.pathname,
|
|
29
34
|
attributes: {
|
|
30
35
|
[browser$1.SEMANTIC_ATTRIBUTE_SENTRY_OP]: "pageload",
|
|
@@ -33,46 +38,60 @@ function tanstackRouterBrowserTracingIntegration(router, options = {}) {
|
|
|
33
38
|
...routeMatchToParamSpanAttributes(routeMatch)
|
|
34
39
|
}
|
|
35
40
|
});
|
|
41
|
+
const unsubscribePageloadResolved = castRouterInstance.subscribe("onResolved", (onResolvedArgs) => {
|
|
42
|
+
unsubscribePageloadResolved();
|
|
43
|
+
if (!pageloadSpan) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const resolvedMatch = resolveRouteMatch(onResolvedArgs.toLocation.pathname, onResolvedArgs.toLocation.search);
|
|
47
|
+
if (resolvedMatch && resolvedMatch.routeId !== routeMatch?.routeId) {
|
|
48
|
+
pageloadSpan.updateName(resolvedMatch.routeId);
|
|
49
|
+
pageloadSpan.setAttribute(browser$1.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, "route");
|
|
50
|
+
pageloadSpan.setAttributes(routeMatchToParamSpanAttributes(resolvedMatch));
|
|
51
|
+
}
|
|
52
|
+
});
|
|
36
53
|
}
|
|
37
54
|
if (instrumentNavigation) {
|
|
38
|
-
|
|
39
|
-
|
|
55
|
+
let inFlightNavigationSpan;
|
|
56
|
+
const applyRouteMatch = (span, match, fallbackName) => {
|
|
57
|
+
span.updateName(match ? match.routeId : fallbackName);
|
|
58
|
+
span.setAttribute(browser$1.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, match ? "route" : "url");
|
|
59
|
+
span.setAttributes(routeMatchToParamSpanAttributes(match));
|
|
60
|
+
};
|
|
61
|
+
castRouterInstance.subscribe("onBeforeLoad", (onBeforeLoadArgs) => {
|
|
62
|
+
if (!onBeforeLoadArgs.fromLocation || onBeforeLoadArgs.toLocation.state === onBeforeLoadArgs.fromLocation.state) {
|
|
40
63
|
return;
|
|
41
64
|
}
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
{ preload: false, throwOnError: false }
|
|
65
|
+
const routeMatch = resolveRouteMatch(
|
|
66
|
+
onBeforeLoadArgs.toLocation.pathname,
|
|
67
|
+
onBeforeLoadArgs.toLocation.search
|
|
46
68
|
);
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
69
|
+
const fallbackName = browser.WINDOW.location.pathname;
|
|
70
|
+
if (inFlightNavigationSpan) {
|
|
71
|
+
applyRouteMatch(inFlightNavigationSpan, routeMatch, fallbackName);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
inFlightNavigationSpan = browser.startBrowserTracingNavigationSpan(client, {
|
|
75
|
+
name: routeMatch ? routeMatch.routeId : fallbackName,
|
|
52
76
|
attributes: {
|
|
53
77
|
[browser$1.SEMANTIC_ATTRIBUTE_SENTRY_OP]: "navigation",
|
|
54
78
|
[browser$1.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.navigation.react.tanstack_router",
|
|
55
|
-
[browser$1.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]:
|
|
56
|
-
|
|
57
|
-
});
|
|
58
|
-
const unsubscribeOnResolved = castRouterInstance.subscribe("onResolved", (onResolvedArgs) => {
|
|
59
|
-
unsubscribeOnResolved();
|
|
60
|
-
if (navigationSpan) {
|
|
61
|
-
const matchedRoutesOnResolved = castRouterInstance.matchRoutes(
|
|
62
|
-
onResolvedArgs.toLocation.pathname,
|
|
63
|
-
onResolvedArgs.toLocation.search,
|
|
64
|
-
{ preload: false, throwOnError: false }
|
|
65
|
-
);
|
|
66
|
-
const onResolvedLastMatch = matchedRoutesOnResolved[matchedRoutesOnResolved.length - 1];
|
|
67
|
-
const onResolvedRouteMatch = onResolvedLastMatch?.routeId !== "__root__" ? onResolvedLastMatch : void 0;
|
|
68
|
-
if (onResolvedRouteMatch) {
|
|
69
|
-
navigationSpan.updateName(onResolvedRouteMatch.routeId);
|
|
70
|
-
navigationSpan.setAttribute(browser$1.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, "route");
|
|
71
|
-
navigationSpan.setAttributes(routeMatchToParamSpanAttributes(onResolvedRouteMatch));
|
|
72
|
-
}
|
|
79
|
+
[browser$1.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: routeMatch ? "route" : "url",
|
|
80
|
+
...routeMatchToParamSpanAttributes(routeMatch)
|
|
73
81
|
}
|
|
74
82
|
});
|
|
75
83
|
});
|
|
84
|
+
castRouterInstance.subscribe("onResolved", (onResolvedArgs) => {
|
|
85
|
+
const span = inFlightNavigationSpan;
|
|
86
|
+
inFlightNavigationSpan = void 0;
|
|
87
|
+
if (!span) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const resolvedMatch = resolveRouteMatch(onResolvedArgs.toLocation.pathname, onResolvedArgs.toLocation.search);
|
|
91
|
+
if (resolvedMatch) {
|
|
92
|
+
applyRouteMatch(span, resolvedMatch, browser.WINDOW.location.pathname);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
76
95
|
}
|
|
77
96
|
}
|
|
78
97
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tanstackrouter.js","sources":["../../src/tanstackrouter.ts"],"sourcesContent":["import {\n browserTracingIntegration as originalBrowserTracingIntegration,\n startBrowserTracingNavigationSpan,\n startBrowserTracingPageLoadSpan,\n WINDOW,\n} from '@sentry/browser';\nimport type { Integration } from '@sentry/core/browser';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n} from '@sentry/core/browser';\nimport type { VendoredTanstackRouter, VendoredTanstackRouterRouteMatch } from './vendor/tanstackrouter-types';\n\n/**\n * A custom browser tracing integration for TanStack Router.\n *\n * The minimum compatible version of `@tanstack/react-router` is `1.64.0`.\n *\n * @param router A TanStack Router `Router` instance that should be used for routing instrumentation.\n * @param options Sentry browser tracing configuration.\n */\nexport function tanstackRouterBrowserTracingIntegration(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n router: any, // This is `any` because we don't want any type mismatches if TanStack Router changes their types\n options: Parameters<typeof originalBrowserTracingIntegration>[0] = {},\n): Integration {\n const castRouterInstance: VendoredTanstackRouter = router;\n\n const browserTracingIntegrationInstance = originalBrowserTracingIntegration({\n ...options,\n instrumentNavigation: false,\n instrumentPageLoad: false,\n });\n\n const { instrumentPageLoad = true, instrumentNavigation = true } = options;\n\n return {\n ...browserTracingIntegrationInstance,\n afterAllSetup(client) {\n browserTracingIntegrationInstance.afterAllSetup(client);\n\n const initialWindowLocation = WINDOW.location;\n if (instrumentPageLoad && initialWindowLocation) {\n const matchedRoutes = castRouterInstance.matchRoutes(\n initialWindowLocation.pathname,\n castRouterInstance.options.parseSearch(initialWindowLocation.search),\n { preload: false, throwOnError: false },\n );\n\n const lastMatch = matchedRoutes[matchedRoutes.length - 1];\n // If we only match __root__, we ended up not matching any route at all, so\n // we fall back to the pathname.\n const routeMatch = lastMatch?.routeId !== '__root__' ? lastMatch : undefined;\n\n startBrowserTracingPageLoadSpan(client, {\n name: routeMatch ? routeMatch.routeId : initialWindowLocation.pathname,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'pageload',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.pageload.react.tanstack_router',\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: routeMatch ? 'route' : 'url',\n ...routeMatchToParamSpanAttributes(routeMatch),\n },\n });\n }\n\n if (instrumentNavigation) {\n // The onBeforeNavigate hook is called at the very beginning of a navigation and is only called once per navigation, even when the user is redirected\n castRouterInstance.subscribe('onBeforeNavigate', onBeforeNavigateArgs => {\n // onBeforeNavigate is called during pageloads. We can avoid creating navigation spans by:\n // 1. Checking if there's no fromLocation (initial pageload)\n // 2. Comparing the states of the to and from arguments\n if (\n !onBeforeNavigateArgs.fromLocation ||\n onBeforeNavigateArgs.toLocation.state === onBeforeNavigateArgs.fromLocation.state\n ) {\n return;\n }\n\n const matchedRoutesOnBeforeNavigate = castRouterInstance.matchRoutes(\n onBeforeNavigateArgs.toLocation.pathname,\n onBeforeNavigateArgs.toLocation.search,\n { preload: false, throwOnError: false },\n );\n\n const onBeforeNavigateLastMatch = matchedRoutesOnBeforeNavigate[matchedRoutesOnBeforeNavigate.length - 1];\n const onBeforeNavigateRouteMatch =\n onBeforeNavigateLastMatch?.routeId !== '__root__' ? onBeforeNavigateLastMatch : undefined;\n\n const navigationLocation = WINDOW.location;\n const navigationSpan = startBrowserTracingNavigationSpan(client, {\n name: onBeforeNavigateRouteMatch ? onBeforeNavigateRouteMatch.routeId : navigationLocation.pathname,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'navigation',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.navigation.react.tanstack_router',\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: onBeforeNavigateRouteMatch ? 'route' : 'url',\n },\n });\n\n // In case the user is redirected during navigation we want to update the span with the right value.\n const unsubscribeOnResolved = castRouterInstance.subscribe('onResolved', onResolvedArgs => {\n unsubscribeOnResolved();\n if (navigationSpan) {\n const matchedRoutesOnResolved = castRouterInstance.matchRoutes(\n onResolvedArgs.toLocation.pathname,\n onResolvedArgs.toLocation.search,\n { preload: false, throwOnError: false },\n );\n\n const onResolvedLastMatch = matchedRoutesOnResolved[matchedRoutesOnResolved.length - 1];\n const onResolvedRouteMatch =\n onResolvedLastMatch?.routeId !== '__root__' ? onResolvedLastMatch : undefined;\n\n if (onResolvedRouteMatch) {\n navigationSpan.updateName(onResolvedRouteMatch.routeId);\n navigationSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, 'route');\n navigationSpan.setAttributes(routeMatchToParamSpanAttributes(onResolvedRouteMatch));\n }\n }\n });\n });\n }\n },\n };\n}\n\nfunction routeMatchToParamSpanAttributes(match: VendoredTanstackRouterRouteMatch | undefined): Record<string, string> {\n if (!match) {\n return {};\n }\n\n const paramAttributes: Record<string, string> = {};\n Object.entries(match.params).forEach(([key, value]) => {\n paramAttributes[`url.path.params.${key}`] = value; // TODO(v11): remove attribute which does not adhere to Sentry's semantic convention\n paramAttributes[`url.path.parameter.${key}`] = value;\n paramAttributes[`params.${key}`] = value; // params.[key] is an alias\n });\n\n return paramAttributes;\n}\n"],"names":["originalBrowserTracingIntegration","WINDOW","startBrowserTracingPageLoadSpan","SEMANTIC_ATTRIBUTE_SENTRY_OP","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","SEMANTIC_ATTRIBUTE_SENTRY_SOURCE","startBrowserTracingNavigationSpan"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tanstackrouter.js","sources":["../../src/tanstackrouter.ts"],"sourcesContent":["import {\n browserTracingIntegration as originalBrowserTracingIntegration,\n startBrowserTracingNavigationSpan,\n startBrowserTracingPageLoadSpan,\n WINDOW,\n} from '@sentry/browser';\nimport type { Integration } from '@sentry/core/browser';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n} from '@sentry/core/browser';\nimport type { VendoredTanstackRouter, VendoredTanstackRouterRouteMatch } from './vendor/tanstackrouter-types';\n\n/**\n * A custom browser tracing integration for TanStack Router.\n *\n * The minimum compatible version of `@tanstack/react-router` is `1.64.0`.\n *\n * @param router A TanStack Router `Router` instance that should be used for routing instrumentation.\n * @param options Sentry browser tracing configuration.\n */\nexport function tanstackRouterBrowserTracingIntegration(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n router: any, // This is `any` because we don't want any type mismatches if TanStack Router changes their types\n options: Parameters<typeof originalBrowserTracingIntegration>[0] = {},\n): Integration {\n const castRouterInstance: VendoredTanstackRouter = router;\n\n const browserTracingIntegrationInstance = originalBrowserTracingIntegration({\n ...options,\n instrumentNavigation: false,\n instrumentPageLoad: false,\n });\n\n const { instrumentPageLoad = true, instrumentNavigation = true } = options;\n\n return {\n ...browserTracingIntegrationInstance,\n afterAllSetup(client) {\n browserTracingIntegrationInstance.afterAllSetup(client);\n\n const resolveRouteMatch = (pathname: string, search: unknown): VendoredTanstackRouterRouteMatch | undefined => {\n const matchedRoutes = castRouterInstance.matchRoutes(pathname, search as {}, {\n preload: false,\n throwOnError: false,\n });\n const lastMatch = matchedRoutes[matchedRoutes.length - 1];\n // If we only match __root__, we ended up not matching any route at all, so\n // we fall back to the pathname.\n return lastMatch?.routeId !== '__root__' ? lastMatch : undefined;\n };\n\n const initialWindowLocation = WINDOW.location;\n if (instrumentPageLoad && initialWindowLocation) {\n const routeMatch = resolveRouteMatch(\n initialWindowLocation.pathname,\n castRouterInstance.options.parseSearch(initialWindowLocation.search),\n );\n\n const pageloadSpan = startBrowserTracingPageLoadSpan(client, {\n name: routeMatch ? routeMatch.routeId : initialWindowLocation.pathname,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'pageload',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.pageload.react.tanstack_router',\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: routeMatch ? 'route' : 'url',\n ...routeMatchToParamSpanAttributes(routeMatch),\n },\n });\n\n // A redirect thrown during the initial pageload leaves the span named after the pre-redirect\n // route, so correct it to the resolved route once.\n const unsubscribePageloadResolved = castRouterInstance.subscribe('onResolved', onResolvedArgs => {\n unsubscribePageloadResolved();\n if (!pageloadSpan) {\n return;\n }\n const resolvedMatch = resolveRouteMatch(onResolvedArgs.toLocation.pathname, onResolvedArgs.toLocation.search);\n if (resolvedMatch && resolvedMatch.routeId !== routeMatch?.routeId) {\n pageloadSpan.updateName(resolvedMatch.routeId);\n pageloadSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, 'route');\n pageloadSpan.setAttributes(routeMatchToParamSpanAttributes(resolvedMatch));\n }\n });\n }\n\n if (instrumentNavigation) {\n // Navigation is driven by `onBeforeLoad` (accurate start) + `onResolved` (final route), not\n // `onBeforeNavigate`, which TanStack stops firing after any loader redirect (TanStack/router#3920).\n // A redirect chain emits one `onBeforeLoad` per load but a single `onResolved`, so we start the\n // span on the first `onBeforeLoad`, rename it on later ones, and clear it on `onResolved`.\n let inFlightNavigationSpan: ReturnType<typeof startBrowserTracingNavigationSpan> | undefined;\n\n const applyRouteMatch = (\n span: NonNullable<typeof inFlightNavigationSpan>,\n match: VendoredTanstackRouterRouteMatch | undefined,\n fallbackName: string,\n ): void => {\n span.updateName(match ? match.routeId : fallbackName);\n span.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, match ? 'route' : 'url');\n span.setAttributes(routeMatchToParamSpanAttributes(match));\n };\n\n castRouterInstance.subscribe('onBeforeLoad', onBeforeLoadArgs => {\n // Skip the initial pageload (no fromLocation) and no-op reloads (same state).\n if (\n !onBeforeLoadArgs.fromLocation ||\n onBeforeLoadArgs.toLocation.state === onBeforeLoadArgs.fromLocation.state\n ) {\n return;\n }\n\n const routeMatch = resolveRouteMatch(\n onBeforeLoadArgs.toLocation.pathname,\n onBeforeLoadArgs.toLocation.search,\n );\n const fallbackName = WINDOW.location.pathname;\n\n if (inFlightNavigationSpan) {\n // Redirect continuation within the same navigation: keep the span, update the target.\n applyRouteMatch(inFlightNavigationSpan, routeMatch, fallbackName);\n return;\n }\n\n inFlightNavigationSpan = startBrowserTracingNavigationSpan(client, {\n name: routeMatch ? routeMatch.routeId : fallbackName,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'navigation',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.navigation.react.tanstack_router',\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: routeMatch ? 'route' : 'url',\n ...routeMatchToParamSpanAttributes(routeMatch),\n },\n });\n });\n\n castRouterInstance.subscribe('onResolved', onResolvedArgs => {\n const span = inFlightNavigationSpan;\n inFlightNavigationSpan = undefined;\n if (!span) {\n return;\n }\n const resolvedMatch = resolveRouteMatch(onResolvedArgs.toLocation.pathname, onResolvedArgs.toLocation.search);\n if (resolvedMatch) {\n applyRouteMatch(span, resolvedMatch, WINDOW.location.pathname);\n }\n });\n }\n },\n };\n}\n\nfunction routeMatchToParamSpanAttributes(match: VendoredTanstackRouterRouteMatch | undefined): Record<string, string> {\n if (!match) {\n return {};\n }\n\n const paramAttributes: Record<string, string> = {};\n Object.entries(match.params).forEach(([key, value]) => {\n paramAttributes[`url.path.params.${key}`] = value; // TODO(v11): remove attribute which does not adhere to Sentry's semantic convention\n paramAttributes[`url.path.parameter.${key}`] = value;\n paramAttributes[`params.${key}`] = value; // params.[key] is an alias\n });\n\n return paramAttributes;\n}\n"],"names":["originalBrowserTracingIntegration","WINDOW","startBrowserTracingPageLoadSpan","SEMANTIC_ATTRIBUTE_SENTRY_OP","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","SEMANTIC_ATTRIBUTE_SENTRY_SOURCE","startBrowserTracingNavigationSpan"],"mappings":"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"}
|
package/build/esm/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"type":"module","version":"10.
|
|
1
|
+
{"type":"module","version":"10.64.0","sideEffects":false}
|
|
@@ -13,16 +13,21 @@ function tanstackRouterBrowserTracingIntegration(router, options = {}) {
|
|
|
13
13
|
...browserTracingIntegrationInstance,
|
|
14
14
|
afterAllSetup(client) {
|
|
15
15
|
browserTracingIntegrationInstance.afterAllSetup(client);
|
|
16
|
+
const resolveRouteMatch = (pathname, search) => {
|
|
17
|
+
const matchedRoutes = castRouterInstance.matchRoutes(pathname, search, {
|
|
18
|
+
preload: false,
|
|
19
|
+
throwOnError: false
|
|
20
|
+
});
|
|
21
|
+
const lastMatch = matchedRoutes[matchedRoutes.length - 1];
|
|
22
|
+
return lastMatch?.routeId !== "__root__" ? lastMatch : void 0;
|
|
23
|
+
};
|
|
16
24
|
const initialWindowLocation = WINDOW.location;
|
|
17
25
|
if (instrumentPageLoad && initialWindowLocation) {
|
|
18
|
-
const
|
|
26
|
+
const routeMatch = resolveRouteMatch(
|
|
19
27
|
initialWindowLocation.pathname,
|
|
20
|
-
castRouterInstance.options.parseSearch(initialWindowLocation.search)
|
|
21
|
-
{ preload: false, throwOnError: false }
|
|
28
|
+
castRouterInstance.options.parseSearch(initialWindowLocation.search)
|
|
22
29
|
);
|
|
23
|
-
const
|
|
24
|
-
const routeMatch = lastMatch?.routeId !== "__root__" ? lastMatch : void 0;
|
|
25
|
-
startBrowserTracingPageLoadSpan(client, {
|
|
30
|
+
const pageloadSpan = startBrowserTracingPageLoadSpan(client, {
|
|
26
31
|
name: routeMatch ? routeMatch.routeId : initialWindowLocation.pathname,
|
|
27
32
|
attributes: {
|
|
28
33
|
[SEMANTIC_ATTRIBUTE_SENTRY_OP]: "pageload",
|
|
@@ -31,46 +36,60 @@ function tanstackRouterBrowserTracingIntegration(router, options = {}) {
|
|
|
31
36
|
...routeMatchToParamSpanAttributes(routeMatch)
|
|
32
37
|
}
|
|
33
38
|
});
|
|
39
|
+
const unsubscribePageloadResolved = castRouterInstance.subscribe("onResolved", (onResolvedArgs) => {
|
|
40
|
+
unsubscribePageloadResolved();
|
|
41
|
+
if (!pageloadSpan) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const resolvedMatch = resolveRouteMatch(onResolvedArgs.toLocation.pathname, onResolvedArgs.toLocation.search);
|
|
45
|
+
if (resolvedMatch && resolvedMatch.routeId !== routeMatch?.routeId) {
|
|
46
|
+
pageloadSpan.updateName(resolvedMatch.routeId);
|
|
47
|
+
pageloadSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, "route");
|
|
48
|
+
pageloadSpan.setAttributes(routeMatchToParamSpanAttributes(resolvedMatch));
|
|
49
|
+
}
|
|
50
|
+
});
|
|
34
51
|
}
|
|
35
52
|
if (instrumentNavigation) {
|
|
36
|
-
|
|
37
|
-
|
|
53
|
+
let inFlightNavigationSpan;
|
|
54
|
+
const applyRouteMatch = (span, match, fallbackName) => {
|
|
55
|
+
span.updateName(match ? match.routeId : fallbackName);
|
|
56
|
+
span.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, match ? "route" : "url");
|
|
57
|
+
span.setAttributes(routeMatchToParamSpanAttributes(match));
|
|
58
|
+
};
|
|
59
|
+
castRouterInstance.subscribe("onBeforeLoad", (onBeforeLoadArgs) => {
|
|
60
|
+
if (!onBeforeLoadArgs.fromLocation || onBeforeLoadArgs.toLocation.state === onBeforeLoadArgs.fromLocation.state) {
|
|
38
61
|
return;
|
|
39
62
|
}
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
{ preload: false, throwOnError: false }
|
|
63
|
+
const routeMatch = resolveRouteMatch(
|
|
64
|
+
onBeforeLoadArgs.toLocation.pathname,
|
|
65
|
+
onBeforeLoadArgs.toLocation.search
|
|
44
66
|
);
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
67
|
+
const fallbackName = WINDOW.location.pathname;
|
|
68
|
+
if (inFlightNavigationSpan) {
|
|
69
|
+
applyRouteMatch(inFlightNavigationSpan, routeMatch, fallbackName);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
inFlightNavigationSpan = startBrowserTracingNavigationSpan(client, {
|
|
73
|
+
name: routeMatch ? routeMatch.routeId : fallbackName,
|
|
50
74
|
attributes: {
|
|
51
75
|
[SEMANTIC_ATTRIBUTE_SENTRY_OP]: "navigation",
|
|
52
76
|
[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.navigation.react.tanstack_router",
|
|
53
|
-
[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]:
|
|
54
|
-
|
|
55
|
-
});
|
|
56
|
-
const unsubscribeOnResolved = castRouterInstance.subscribe("onResolved", (onResolvedArgs) => {
|
|
57
|
-
unsubscribeOnResolved();
|
|
58
|
-
if (navigationSpan) {
|
|
59
|
-
const matchedRoutesOnResolved = castRouterInstance.matchRoutes(
|
|
60
|
-
onResolvedArgs.toLocation.pathname,
|
|
61
|
-
onResolvedArgs.toLocation.search,
|
|
62
|
-
{ preload: false, throwOnError: false }
|
|
63
|
-
);
|
|
64
|
-
const onResolvedLastMatch = matchedRoutesOnResolved[matchedRoutesOnResolved.length - 1];
|
|
65
|
-
const onResolvedRouteMatch = onResolvedLastMatch?.routeId !== "__root__" ? onResolvedLastMatch : void 0;
|
|
66
|
-
if (onResolvedRouteMatch) {
|
|
67
|
-
navigationSpan.updateName(onResolvedRouteMatch.routeId);
|
|
68
|
-
navigationSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, "route");
|
|
69
|
-
navigationSpan.setAttributes(routeMatchToParamSpanAttributes(onResolvedRouteMatch));
|
|
70
|
-
}
|
|
77
|
+
[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: routeMatch ? "route" : "url",
|
|
78
|
+
...routeMatchToParamSpanAttributes(routeMatch)
|
|
71
79
|
}
|
|
72
80
|
});
|
|
73
81
|
});
|
|
82
|
+
castRouterInstance.subscribe("onResolved", (onResolvedArgs) => {
|
|
83
|
+
const span = inFlightNavigationSpan;
|
|
84
|
+
inFlightNavigationSpan = void 0;
|
|
85
|
+
if (!span) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const resolvedMatch = resolveRouteMatch(onResolvedArgs.toLocation.pathname, onResolvedArgs.toLocation.search);
|
|
89
|
+
if (resolvedMatch) {
|
|
90
|
+
applyRouteMatch(span, resolvedMatch, WINDOW.location.pathname);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
74
93
|
}
|
|
75
94
|
}
|
|
76
95
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tanstackrouter.js","sources":["../../src/tanstackrouter.ts"],"sourcesContent":["import {\n browserTracingIntegration as originalBrowserTracingIntegration,\n startBrowserTracingNavigationSpan,\n startBrowserTracingPageLoadSpan,\n WINDOW,\n} from '@sentry/browser';\nimport type { Integration } from '@sentry/core/browser';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n} from '@sentry/core/browser';\nimport type { VendoredTanstackRouter, VendoredTanstackRouterRouteMatch } from './vendor/tanstackrouter-types';\n\n/**\n * A custom browser tracing integration for TanStack Router.\n *\n * The minimum compatible version of `@tanstack/react-router` is `1.64.0`.\n *\n * @param router A TanStack Router `Router` instance that should be used for routing instrumentation.\n * @param options Sentry browser tracing configuration.\n */\nexport function tanstackRouterBrowserTracingIntegration(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n router: any, // This is `any` because we don't want any type mismatches if TanStack Router changes their types\n options: Parameters<typeof originalBrowserTracingIntegration>[0] = {},\n): Integration {\n const castRouterInstance: VendoredTanstackRouter = router;\n\n const browserTracingIntegrationInstance = originalBrowserTracingIntegration({\n ...options,\n instrumentNavigation: false,\n instrumentPageLoad: false,\n });\n\n const { instrumentPageLoad = true, instrumentNavigation = true } = options;\n\n return {\n ...browserTracingIntegrationInstance,\n afterAllSetup(client) {\n browserTracingIntegrationInstance.afterAllSetup(client);\n\n const initialWindowLocation = WINDOW.location;\n if (instrumentPageLoad && initialWindowLocation) {\n const matchedRoutes = castRouterInstance.matchRoutes(\n initialWindowLocation.pathname,\n castRouterInstance.options.parseSearch(initialWindowLocation.search),\n { preload: false, throwOnError: false },\n );\n\n const lastMatch = matchedRoutes[matchedRoutes.length - 1];\n // If we only match __root__, we ended up not matching any route at all, so\n // we fall back to the pathname.\n const routeMatch = lastMatch?.routeId !== '__root__' ? lastMatch : undefined;\n\n startBrowserTracingPageLoadSpan(client, {\n name: routeMatch ? routeMatch.routeId : initialWindowLocation.pathname,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'pageload',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.pageload.react.tanstack_router',\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: routeMatch ? 'route' : 'url',\n ...routeMatchToParamSpanAttributes(routeMatch),\n },\n });\n }\n\n if (instrumentNavigation) {\n // The onBeforeNavigate hook is called at the very beginning of a navigation and is only called once per navigation, even when the user is redirected\n castRouterInstance.subscribe('onBeforeNavigate', onBeforeNavigateArgs => {\n // onBeforeNavigate is called during pageloads. We can avoid creating navigation spans by:\n // 1. Checking if there's no fromLocation (initial pageload)\n // 2. Comparing the states of the to and from arguments\n if (\n !onBeforeNavigateArgs.fromLocation ||\n onBeforeNavigateArgs.toLocation.state === onBeforeNavigateArgs.fromLocation.state\n ) {\n return;\n }\n\n const matchedRoutesOnBeforeNavigate = castRouterInstance.matchRoutes(\n onBeforeNavigateArgs.toLocation.pathname,\n onBeforeNavigateArgs.toLocation.search,\n { preload: false, throwOnError: false },\n );\n\n const onBeforeNavigateLastMatch = matchedRoutesOnBeforeNavigate[matchedRoutesOnBeforeNavigate.length - 1];\n const onBeforeNavigateRouteMatch =\n onBeforeNavigateLastMatch?.routeId !== '__root__' ? onBeforeNavigateLastMatch : undefined;\n\n const navigationLocation = WINDOW.location;\n const navigationSpan = startBrowserTracingNavigationSpan(client, {\n name: onBeforeNavigateRouteMatch ? onBeforeNavigateRouteMatch.routeId : navigationLocation.pathname,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'navigation',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.navigation.react.tanstack_router',\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: onBeforeNavigateRouteMatch ? 'route' : 'url',\n },\n });\n\n // In case the user is redirected during navigation we want to update the span with the right value.\n const unsubscribeOnResolved = castRouterInstance.subscribe('onResolved', onResolvedArgs => {\n unsubscribeOnResolved();\n if (navigationSpan) {\n const matchedRoutesOnResolved = castRouterInstance.matchRoutes(\n onResolvedArgs.toLocation.pathname,\n onResolvedArgs.toLocation.search,\n { preload: false, throwOnError: false },\n );\n\n const onResolvedLastMatch = matchedRoutesOnResolved[matchedRoutesOnResolved.length - 1];\n const onResolvedRouteMatch =\n onResolvedLastMatch?.routeId !== '__root__' ? onResolvedLastMatch : undefined;\n\n if (onResolvedRouteMatch) {\n navigationSpan.updateName(onResolvedRouteMatch.routeId);\n navigationSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, 'route');\n navigationSpan.setAttributes(routeMatchToParamSpanAttributes(onResolvedRouteMatch));\n }\n }\n });\n });\n }\n },\n };\n}\n\nfunction routeMatchToParamSpanAttributes(match: VendoredTanstackRouterRouteMatch | undefined): Record<string, string> {\n if (!match) {\n return {};\n }\n\n const paramAttributes: Record<string, string> = {};\n Object.entries(match.params).forEach(([key, value]) => {\n paramAttributes[`url.path.params.${key}`] = value; // TODO(v11): remove attribute which does not adhere to Sentry's semantic convention\n paramAttributes[`url.path.parameter.${key}`] = value;\n paramAttributes[`params.${key}`] = value; // params.[key] is an alias\n });\n\n return paramAttributes;\n}\n"],"names":["originalBrowserTracingIntegration"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tanstackrouter.js","sources":["../../src/tanstackrouter.ts"],"sourcesContent":["import {\n browserTracingIntegration as originalBrowserTracingIntegration,\n startBrowserTracingNavigationSpan,\n startBrowserTracingPageLoadSpan,\n WINDOW,\n} from '@sentry/browser';\nimport type { Integration } from '@sentry/core/browser';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n} from '@sentry/core/browser';\nimport type { VendoredTanstackRouter, VendoredTanstackRouterRouteMatch } from './vendor/tanstackrouter-types';\n\n/**\n * A custom browser tracing integration for TanStack Router.\n *\n * The minimum compatible version of `@tanstack/react-router` is `1.64.0`.\n *\n * @param router A TanStack Router `Router` instance that should be used for routing instrumentation.\n * @param options Sentry browser tracing configuration.\n */\nexport function tanstackRouterBrowserTracingIntegration(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n router: any, // This is `any` because we don't want any type mismatches if TanStack Router changes their types\n options: Parameters<typeof originalBrowserTracingIntegration>[0] = {},\n): Integration {\n const castRouterInstance: VendoredTanstackRouter = router;\n\n const browserTracingIntegrationInstance = originalBrowserTracingIntegration({\n ...options,\n instrumentNavigation: false,\n instrumentPageLoad: false,\n });\n\n const { instrumentPageLoad = true, instrumentNavigation = true } = options;\n\n return {\n ...browserTracingIntegrationInstance,\n afterAllSetup(client) {\n browserTracingIntegrationInstance.afterAllSetup(client);\n\n const resolveRouteMatch = (pathname: string, search: unknown): VendoredTanstackRouterRouteMatch | undefined => {\n const matchedRoutes = castRouterInstance.matchRoutes(pathname, search as {}, {\n preload: false,\n throwOnError: false,\n });\n const lastMatch = matchedRoutes[matchedRoutes.length - 1];\n // If we only match __root__, we ended up not matching any route at all, so\n // we fall back to the pathname.\n return lastMatch?.routeId !== '__root__' ? lastMatch : undefined;\n };\n\n const initialWindowLocation = WINDOW.location;\n if (instrumentPageLoad && initialWindowLocation) {\n const routeMatch = resolveRouteMatch(\n initialWindowLocation.pathname,\n castRouterInstance.options.parseSearch(initialWindowLocation.search),\n );\n\n const pageloadSpan = startBrowserTracingPageLoadSpan(client, {\n name: routeMatch ? routeMatch.routeId : initialWindowLocation.pathname,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'pageload',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.pageload.react.tanstack_router',\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: routeMatch ? 'route' : 'url',\n ...routeMatchToParamSpanAttributes(routeMatch),\n },\n });\n\n // A redirect thrown during the initial pageload leaves the span named after the pre-redirect\n // route, so correct it to the resolved route once.\n const unsubscribePageloadResolved = castRouterInstance.subscribe('onResolved', onResolvedArgs => {\n unsubscribePageloadResolved();\n if (!pageloadSpan) {\n return;\n }\n const resolvedMatch = resolveRouteMatch(onResolvedArgs.toLocation.pathname, onResolvedArgs.toLocation.search);\n if (resolvedMatch && resolvedMatch.routeId !== routeMatch?.routeId) {\n pageloadSpan.updateName(resolvedMatch.routeId);\n pageloadSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, 'route');\n pageloadSpan.setAttributes(routeMatchToParamSpanAttributes(resolvedMatch));\n }\n });\n }\n\n if (instrumentNavigation) {\n // Navigation is driven by `onBeforeLoad` (accurate start) + `onResolved` (final route), not\n // `onBeforeNavigate`, which TanStack stops firing after any loader redirect (TanStack/router#3920).\n // A redirect chain emits one `onBeforeLoad` per load but a single `onResolved`, so we start the\n // span on the first `onBeforeLoad`, rename it on later ones, and clear it on `onResolved`.\n let inFlightNavigationSpan: ReturnType<typeof startBrowserTracingNavigationSpan> | undefined;\n\n const applyRouteMatch = (\n span: NonNullable<typeof inFlightNavigationSpan>,\n match: VendoredTanstackRouterRouteMatch | undefined,\n fallbackName: string,\n ): void => {\n span.updateName(match ? match.routeId : fallbackName);\n span.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, match ? 'route' : 'url');\n span.setAttributes(routeMatchToParamSpanAttributes(match));\n };\n\n castRouterInstance.subscribe('onBeforeLoad', onBeforeLoadArgs => {\n // Skip the initial pageload (no fromLocation) and no-op reloads (same state).\n if (\n !onBeforeLoadArgs.fromLocation ||\n onBeforeLoadArgs.toLocation.state === onBeforeLoadArgs.fromLocation.state\n ) {\n return;\n }\n\n const routeMatch = resolveRouteMatch(\n onBeforeLoadArgs.toLocation.pathname,\n onBeforeLoadArgs.toLocation.search,\n );\n const fallbackName = WINDOW.location.pathname;\n\n if (inFlightNavigationSpan) {\n // Redirect continuation within the same navigation: keep the span, update the target.\n applyRouteMatch(inFlightNavigationSpan, routeMatch, fallbackName);\n return;\n }\n\n inFlightNavigationSpan = startBrowserTracingNavigationSpan(client, {\n name: routeMatch ? routeMatch.routeId : fallbackName,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'navigation',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.navigation.react.tanstack_router',\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: routeMatch ? 'route' : 'url',\n ...routeMatchToParamSpanAttributes(routeMatch),\n },\n });\n });\n\n castRouterInstance.subscribe('onResolved', onResolvedArgs => {\n const span = inFlightNavigationSpan;\n inFlightNavigationSpan = undefined;\n if (!span) {\n return;\n }\n const resolvedMatch = resolveRouteMatch(onResolvedArgs.toLocation.pathname, onResolvedArgs.toLocation.search);\n if (resolvedMatch) {\n applyRouteMatch(span, resolvedMatch, WINDOW.location.pathname);\n }\n });\n }\n },\n };\n}\n\nfunction routeMatchToParamSpanAttributes(match: VendoredTanstackRouterRouteMatch | undefined): Record<string, string> {\n if (!match) {\n return {};\n }\n\n const paramAttributes: Record<string, string> = {};\n Object.entries(match.params).forEach(([key, value]) => {\n paramAttributes[`url.path.params.${key}`] = value; // TODO(v11): remove attribute which does not adhere to Sentry's semantic convention\n paramAttributes[`url.path.parameter.${key}`] = value;\n paramAttributes[`params.${key}`] = value; // params.[key] is an alias\n });\n\n return paramAttributes;\n}\n"],"names":["originalBrowserTracingIntegration"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tanstackrouter.d.ts","sourceRoot":"","sources":["../../src/tanstackrouter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,IAAI,iCAAiC,EAI/D,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAQxD;;;;;;;GAOG;AACH,wBAAgB,uCAAuC,CAErD,MAAM,EAAE,GAAG,EAAE,iGAAiG;AAC9G,OAAO,GAAE,UAAU,CAAC,OAAO,iCAAiC,CAAC,CAAC,CAAC,CAAM,GACpE,WAAW,
|
|
1
|
+
{"version":3,"file":"tanstackrouter.d.ts","sourceRoot":"","sources":["../../src/tanstackrouter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,IAAI,iCAAiC,EAI/D,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAQxD;;;;;;;GAOG;AACH,wBAAgB,uCAAuC,CAErD,MAAM,EAAE,GAAG,EAAE,iGAAiG;AAC9G,OAAO,GAAE,UAAU,CAAC,OAAO,iCAAiC,CAAC,CAAC,CAAC,CAAM,GACpE,WAAW,CA2Hb"}
|
|
@@ -8,7 +8,7 @@ export interface VendoredTanstackRouter {
|
|
|
8
8
|
preload?: boolean;
|
|
9
9
|
throwOnError?: boolean;
|
|
10
10
|
}) => Array<VendoredTanstackRouterRouteMatch>;
|
|
11
|
-
subscribe(eventType: 'onResolved' | 'onBeforeNavigate', callback: (stateUpdate: {
|
|
11
|
+
subscribe(eventType: 'onResolved' | 'onBeforeNavigate' | 'onBeforeLoad', callback: (stateUpdate: {
|
|
12
12
|
toLocation: VendoredTanstackRouterLocation;
|
|
13
13
|
fromLocation?: VendoredTanstackRouterLocation;
|
|
14
14
|
}) => void): () => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tanstackrouter-types.d.ts","sourceRoot":"","sources":["../../../src/vendor/tanstackrouter-types.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,6BAA6B,CAAC;IACvC,KAAK,EAAE,2BAA2B,CAAC;IACnC,OAAO,EAAE;QAEP,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KACtD,CAAC;IACF,WAAW,EAAE,CACX,QAAQ,EAAE,MAAM,EAEhB,cAAc,EAAE,EAAE,EAClB,IAAI,CAAC,EAAE;QACL,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,YAAY,CAAC,EAAE,OAAO,CAAC;KACxB,KACE,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAC7C,SAAS,CACP,SAAS,EAAE,YAAY,GAAG,kBAAkB,
|
|
1
|
+
{"version":3,"file":"tanstackrouter-types.d.ts","sourceRoot":"","sources":["../../../src/vendor/tanstackrouter-types.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,6BAA6B,CAAC;IACvC,KAAK,EAAE,2BAA2B,CAAC;IACnC,OAAO,EAAE;QAEP,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KACtD,CAAC;IACF,WAAW,EAAE,CACX,QAAQ,EAAE,MAAM,EAEhB,cAAc,EAAE,EAAE,EAClB,IAAI,CAAC,EAAE;QACL,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,YAAY,CAAC,EAAE,OAAO,CAAC;KACxB,KACE,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAC7C,SAAS,CACP,SAAS,EAAE,YAAY,GAAG,kBAAkB,GAAG,cAAc,EAC7D,QAAQ,EAAE,CAAC,WAAW,EAAE;QACtB,UAAU,EAAE,8BAA8B,CAAC;QAC3C,YAAY,CAAC,EAAE,8BAA8B,CAAC;KAC/C,KAAK,IAAI,GACT,MAAM,IAAI,CAAC;CACf;AAED,UAAU,8BAA8B;IACtC,QAAQ,EAAE,MAAM,CAAC;IAEjB,MAAM,EAAE,EAAE,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,6BAA6B;IACrC,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;CAC3C;AAED,UAAU,2BAA2B;IACnC,OAAO,EAAE,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACjD,cAAc,CAAC,EAAE,KAAK,CAAC,gCAAgC,CAAC,CAAC;CAC1D;AAED,MAAM,WAAW,gCAAgC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;CACnC"}
|
|
@@ -8,7 +8,7 @@ export interface VendoredTanstackRouter {
|
|
|
8
8
|
preload?: boolean;
|
|
9
9
|
throwOnError?: boolean;
|
|
10
10
|
}) => Array<VendoredTanstackRouterRouteMatch>;
|
|
11
|
-
subscribe(eventType: 'onResolved' | 'onBeforeNavigate', callback: (stateUpdate: {
|
|
11
|
+
subscribe(eventType: 'onResolved' | 'onBeforeNavigate' | 'onBeforeLoad', callback: (stateUpdate: {
|
|
12
12
|
toLocation: VendoredTanstackRouterLocation;
|
|
13
13
|
fromLocation?: VendoredTanstackRouterLocation;
|
|
14
14
|
}) => void): () => void;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sentry/react",
|
|
3
|
-
"version": "10.
|
|
3
|
+
"version": "10.64.0",
|
|
4
4
|
"description": "Official Sentry SDK for React.js",
|
|
5
5
|
"repository": "git://github.com/getsentry/sentry-javascript.git",
|
|
6
6
|
"homepage": "https://github.com/getsentry/sentry-javascript/tree/master/packages/react",
|
|
@@ -43,8 +43,8 @@
|
|
|
43
43
|
"access": "public"
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"@sentry/browser": "10.
|
|
47
|
-
"@sentry/core": "10.
|
|
46
|
+
"@sentry/browser": "10.64.0",
|
|
47
|
+
"@sentry/core": "10.64.0"
|
|
48
48
|
},
|
|
49
49
|
"peerDependencies": {
|
|
50
50
|
"react": "^16.14.0 || 17.x || 18.x || 19.x"
|