@sentry/react 11.0.0-beta.0 → 11.0.0-beta.2

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.
Files changed (28) hide show
  1. package/build/cjs/react-router.js +21 -0
  2. package/build/cjs/react-router.js.map +1 -0
  3. package/build/cjs/reactrouter-compat-utils/instrumentation.js +141 -136
  4. package/build/cjs/reactrouter-compat-utils/instrumentation.js.map +1 -1
  5. package/build/cjs/reactrouter-compat-utils/utils.js +28 -32
  6. package/build/cjs/reactrouter-compat-utils/utils.js.map +1 -1
  7. package/build/cjs/reactrouter.js.map +1 -1
  8. package/build/esm/package.json +1 -1
  9. package/build/esm/react-router.js +16 -0
  10. package/build/esm/react-router.js.map +1 -0
  11. package/build/esm/reactrouter-compat-utils/instrumentation.js +143 -138
  12. package/build/esm/reactrouter-compat-utils/instrumentation.js.map +1 -1
  13. package/build/esm/reactrouter-compat-utils/utils.js +29 -32
  14. package/build/esm/reactrouter-compat-utils/utils.js.map +1 -1
  15. package/build/esm/reactrouter.js.map +1 -1
  16. package/build/types/react-router.d.ts +26 -0
  17. package/build/types/react-router.d.ts.map +1 -0
  18. package/build/types/reactrouter-compat-utils/index.d.ts +1 -1
  19. package/build/types/reactrouter-compat-utils/index.d.ts.map +1 -1
  20. package/build/types/reactrouter-compat-utils/instrumentation.d.ts +9 -5
  21. package/build/types/reactrouter-compat-utils/instrumentation.d.ts.map +1 -1
  22. package/build/types/reactrouter-compat-utils/utils.d.ts +5 -10
  23. package/build/types/reactrouter-compat-utils/utils.d.ts.map +1 -1
  24. package/build/types/reactrouter.d.ts +16 -0
  25. package/build/types/reactrouter.d.ts.map +1 -1
  26. package/build/types/types.d.ts +16 -0
  27. package/build/types/types.d.ts.map +1 -1
  28. package/package.json +33 -5
@@ -1 +1 @@
1
- {"version":3,"file":"instrumentation.js","sources":["../../../src/reactrouter-compat-utils/instrumentation.tsx"],"sourcesContent":["/* eslint-disable max-lines */\n// Inspired from Donnie McNeal's solution:\n// https://gist.github.com/wontondon/e8c4bdf2888875e4c755712e99279536\n\nimport {\n browserTracingIntegration,\n startBrowserTracingNavigationSpan,\n startBrowserTracingPageLoadSpan,\n WINDOW,\n} from '@sentry/browser';\nimport type { Client, Integration, Span } from '@sentry/core';\nimport {\n addNonEnumerableProperty,\n debug,\n getClient,\n getCurrentScope,\n hasSpanStreamingEnabled,\n NAVIGATION_SPAN_NAME_FALLBACK,\n PAGELOAD_SPAN_NAME_FALLBACK,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n spanToJSON,\n} from '@sentry/core';\nimport * as React from 'react';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { hoistNonReactStatics } from '../hoist-non-react-statics';\nimport type {\n Action,\n AgnosticDataRouteMatch,\n CreateRouterFunction,\n CreateRoutesFromChildren,\n Location,\n MatchRoutes,\n RouteMatch,\n RouteObject,\n Router,\n RouterState,\n UseEffect,\n UseLocation,\n UseNavigationType,\n UseRoutes,\n} from '../types';\nimport { checkRouteForAsyncHandler } from './lazy-routes';\nimport {\n clearNavigationContext,\n getActiveRootSpan,\n initializeRouterUtils,\n resolveRouteNameAndSource,\n setNavigationContext,\n transactionNameHasWildcard,\n} from './utils';\nimport { SENTRY_SEGMENT_NAME_SOURCE, SENTRY_OP, URL_TEMPLATE } from '@sentry/conventions/attributes';\nimport { NAVIGATION, PAGELOAD } from '@sentry/conventions/op';\n\nlet _useEffect: UseEffect;\nlet _useLocation: UseLocation;\nlet _useNavigationType: UseNavigationType;\nlet _createRoutesFromChildren: CreateRoutesFromChildren;\nlet _matchRoutes: MatchRoutes;\n\nlet _enableAsyncRouteHandlers: boolean = false;\nlet _lazyRouteTimeout = 3000;\nlet _lazyRouteManifest: string[] | undefined;\nlet _basename: string = '';\n\nconst CLIENTS_WITH_INSTRUMENT_NAVIGATION = new WeakSet<Client>();\n\n// Detect navigations in a layout effect so the navigation trace is set up before child route components'\n// passive mount effects fire requests (else they propagate the stale pageload trace).\n// Guard on `document` (present in real browsers and jsdom) so we only fall back to `useEffect` in true\n// SSR, where `useLayoutEffect` warns and effects don't run anyway.\nconst useIsomorphicLayoutEffect = WINDOW?.document ? React.useLayoutEffect : React.useEffect;\n\n// Prevents duplicate spans when router.subscribe fires multiple times\nconst activeNavigationSpans = new WeakMap<\n Client,\n { span: Span; routeName: string; pathname: string; locationKey: string; isPlaceholder?: boolean }\n>();\n\n// Exported for testing only\nexport const allRoutes = new Set<RouteObject>();\n\n// Tracks lazy route loads to wait before finalizing span names\nconst pendingLazyRouteLoads = new WeakMap<Span, Set<Promise<unknown>>>();\n\n// Tracks deferred lazy route promises that can be resolved when patchRoutesOnNavigation is called\nconst deferredLazyRouteResolvers = new WeakMap<Span, () => void>();\n\n/**\n * Schedules a callback using requestAnimationFrame when available (browser),\n * or falls back to setTimeout for SSR environments (Node.js, createMemoryRouter tests).\n */\nfunction scheduleCallback(callback: () => void): number {\n if (WINDOW?.requestAnimationFrame) {\n return WINDOW.requestAnimationFrame(callback);\n }\n return setTimeout(callback, 0) as unknown as number;\n}\n\n/**\n * Cancels a scheduled callback, handling both RAF (browser) and timeout (SSR) IDs.\n */\nfunction cancelScheduledCallback(id: number): void {\n if (WINDOW?.cancelAnimationFrame) {\n WINDOW.cancelAnimationFrame(id);\n } else {\n clearTimeout(id);\n }\n}\n\n/**\n * Computes location key for duplicate detection. Normalizes undefined/null to empty strings.\n * Exported for testing.\n */\nexport function computeLocationKey(location: Location): string {\n return `${location.pathname}${location.search || ''}${location.hash || ''}`;\n}\n\n/**\n * Checks if a route name is parameterized (contains route parameters like :id or wildcards like *)\n * vs a raw URL path.\n */\nfunction isParameterizedRoute(routeName: string): boolean {\n return routeName.includes(':') || routeName.includes('*');\n}\n\n/**\n * Determines if a navigation should be skipped as a duplicate, and if an existing span should be updated.\n * Exported for testing.\n *\n * @returns An object with:\n * - skip: boolean - Whether to skip creating a new span\n * - shouldUpdate: boolean - Whether to update the existing span name (wildcard upgrade)\n */\nexport function shouldSkipNavigation(\n trackedNav:\n | { span: Span; routeName: string; pathname: string; locationKey: string; isPlaceholder?: boolean }\n | undefined,\n locationKey: string,\n proposedName: string,\n spanHasEnded: boolean,\n): { skip: boolean; shouldUpdate: boolean } {\n if (!trackedNav) {\n return { skip: false, shouldUpdate: false };\n }\n\n // Check if this is a duplicate navigation (same location)\n // 1. If it's a placeholder, it's always a duplicate (we're waiting for the real one)\n // 2. If it's a real span, it's a duplicate only if it hasn't ended yet\n const isDuplicate = trackedNav.locationKey === locationKey && (trackedNav.isPlaceholder || !spanHasEnded);\n\n if (isDuplicate) {\n // Check if we should update the span name with a better route\n // Allow updates if:\n // 1. Current has wildcard and new doesn't (wildcard → parameterized upgrade)\n // 2. Current is raw path and new is parameterized (raw → parameterized upgrade)\n // 3. New name is different and more specific (longer, indicating nested routes resolved)\n const currentHasWildcard = !!trackedNav.routeName && transactionNameHasWildcard(trackedNav.routeName);\n const proposedHasWildcard = transactionNameHasWildcard(proposedName);\n const currentIsParameterized = !!trackedNav.routeName && isParameterizedRoute(trackedNav.routeName);\n const proposedIsParameterized = isParameterizedRoute(proposedName);\n\n const isWildcardUpgrade = currentHasWildcard && !proposedHasWildcard;\n const isRawToParameterized = !currentIsParameterized && proposedIsParameterized;\n const isMoreSpecific =\n proposedName !== trackedNav.routeName &&\n proposedName.length > (trackedNav.routeName?.length || 0) &&\n !proposedHasWildcard;\n\n const shouldUpdate = !!(trackedNav.routeName && (isWildcardUpgrade || isRawToParameterized || isMoreSpecific));\n\n return { skip: true, shouldUpdate };\n }\n\n return { skip: false, shouldUpdate: false };\n}\n\nexport interface ReactRouterOptions {\n useEffect: UseEffect;\n useLocation: UseLocation;\n useNavigationType: UseNavigationType;\n createRoutesFromChildren: CreateRoutesFromChildren;\n matchRoutes: MatchRoutes;\n /**\n * Whether to strip the basename from the pathname when creating transactions.\n *\n * This is useful for applications that use a basename in their routing setup.\n * @default false\n */\n stripBasename?: boolean;\n /**\n * Enables support for async route handlers.\n *\n * This allows Sentry to track and instrument routes dynamically resolved from async handlers.\n * @default false\n */\n enableAsyncRouteHandlers?: boolean;\n\n /**\n * Maximum time (in milliseconds) to wait for lazy routes to load before finalizing span names.\n *\n * - Set to `0` to not wait at all (immediate finalization)\n * - Set to `Infinity` to wait as long as possible (capped at `finalTimeout` to prevent indefinite hangs)\n * - Negative values will fall back to the default\n *\n * Defaults to 3× the configured `idleTimeout` (default: 3000ms).\n *\n * @default idleTimeout * 3\n */\n lazyRouteTimeout?: number;\n\n /**\n * Static route manifest for resolving parameterized route names with lazy routes.\n *\n * Requires `enableAsyncRouteHandlers: true`. When provided, the manifest is used\n * as the primary source for determining transaction names. This is more reliable\n * than depending on React Router's lazy route resolution timing.\n *\n * @example\n * ```ts\n * lazyRouteManifest: [\n * '/',\n * '/users',\n * '/users/:userId',\n * '/org/:orgSlug/projects/:projectId',\n * ]\n * ```\n */\n lazyRouteManifest?: string[];\n}\n\ntype V6CompatibleVersion = '6' | '7' | '';\n\nexport function addResolvedRoutesToParent(resolvedRoutes: RouteObject[], parentRoute: RouteObject): void {\n const existingChildren = parentRoute.children || [];\n\n const newRoutes = resolvedRoutes.filter(\n newRoute =>\n !existingChildren.some(\n existing =>\n existing === newRoute ||\n (newRoute.path && existing.path === newRoute.path) ||\n (newRoute.id && existing.id === newRoute.id),\n ),\n );\n\n if (newRoutes.length > 0) {\n parentRoute.children = [...existingChildren, ...newRoutes];\n }\n}\n\n/** Registers a pending lazy route load promise for a span. */\nfunction trackLazyRouteLoad(span: Span, promise: Promise<unknown>): void {\n let promises = pendingLazyRouteLoads.get(span);\n if (!promises) {\n promises = new Set();\n pendingLazyRouteLoads.set(span, promises);\n }\n promises.add(promise);\n\n // Clean up when promise resolves/rejects\n // oxlint-disable-next-line typescript/no-floating-promises\n promise.finally(() => {\n const currentPromises = pendingLazyRouteLoads.get(span);\n if (currentPromises) {\n currentPromises.delete(promise);\n }\n });\n}\n\n/**\n * Creates a deferred promise for a span that will be resolved when patchRoutesOnNavigation is called.\n * This ensures that patchedEnd waits for patchRoutesOnNavigation to be called before ending the span.\n */\nfunction createDeferredLazyRoutePromise(span: Span): void {\n const deferredPromise = new Promise<void>(resolve => {\n deferredLazyRouteResolvers.set(span, resolve);\n });\n\n trackLazyRouteLoad(span, deferredPromise);\n}\n\n/**\n * Resolves the deferred lazy route promise for a span.\n * Called when patchRoutesOnNavigation is invoked.\n */\nfunction resolveDeferredLazyRoutePromise(span: Span): void {\n const resolver = deferredLazyRouteResolvers.get(span);\n if (resolver) {\n resolver();\n deferredLazyRouteResolvers.delete(span);\n // Clear the flag so patchSpanEnd doesn't wait unnecessarily for routes that have already loaded\n if ((span as unknown as Record<string, boolean>).__sentry_may_have_lazy_routes__) {\n (span as unknown as Record<string, boolean>).__sentry_may_have_lazy_routes__ = false;\n }\n }\n}\n\n/**\n * Processes resolved routes by adding them to allRoutes and checking for nested async handlers.\n * When capturedSpan is provided, updates that specific span instead of the current active span.\n * This prevents race conditions where a lazy handler resolves after the user has navigated away.\n */\nexport function processResolvedRoutes(\n resolvedRoutes: RouteObject[],\n parentRoute?: RouteObject,\n currentLocation: Location | null = null,\n capturedSpan?: Span,\n): void {\n resolvedRoutes.forEach(child => {\n allRoutes.add(child);\n // Only check for async handlers if the feature is enabled\n if (_enableAsyncRouteHandlers) {\n checkRouteForAsyncHandler(child, processResolvedRoutes);\n }\n });\n\n if (parentRoute) {\n // If a parent route is provided, add the resolved routes as children to the parent route\n addResolvedRoutesToParent(resolvedRoutes, parentRoute);\n }\n\n // Use captured span if provided, otherwise fall back to current active span\n const targetSpan = capturedSpan ?? getActiveRootSpan();\n if (targetSpan) {\n const { end_timestamp, attributes } = spanToJSON(targetSpan);\n\n // Skip update if span has already ended (end_timestamp is set when span.end() is called)\n if (end_timestamp) {\n DEBUG_BUILD && debug.warn('[React Router] Lazy handler resolved after span ended - skipping update');\n return;\n }\n\n const spanOp = attributes[SENTRY_OP];\n\n // Use captured location for route matching (ensures we match against the correct route)\n // Fall back to window.location only if no captured location and no captured span\n // (i.e., this is not from an async handler)\n let location = currentLocation;\n if (!location && !capturedSpan) {\n if (typeof WINDOW !== 'undefined') {\n const globalLocation = WINDOW.location;\n if (globalLocation?.pathname) {\n location = { pathname: globalLocation.pathname };\n }\n }\n }\n\n if (location) {\n if (spanOp === 'pageload') {\n // Re-run the pageload transaction update with the newly loaded routes\n updatePageloadTransaction({\n activeRootSpan: targetSpan,\n location: { pathname: location.pathname },\n routes: Array.from(allRoutes),\n allRoutes: Array.from(allRoutes),\n });\n } else if (spanOp === 'navigation') {\n // For navigation spans, update the name with the newly loaded routes\n updateNavigationSpan(targetSpan, location, Array.from(allRoutes), false, _matchRoutes);\n }\n }\n }\n}\n\n/**\n * Updates a navigation span with the correct route name after lazy routes have been loaded.\n */\nexport function updateNavigationSpan(\n activeRootSpan: Span,\n location: Location,\n allRoutes: RouteObject[],\n forceUpdate = false,\n matchRoutes: MatchRoutes,\n): void {\n const { name: currentName, end_timestamp, attributes } = spanToJSON(activeRootSpan);\n\n const hasBeenNamed = (activeRootSpan as { __sentry_navigation_name_set__?: boolean })?.__sentry_navigation_name_set__;\n const currentNameHasWildcard = currentName && transactionNameHasWildcard(currentName);\n const shouldUpdate = !hasBeenNamed || forceUpdate || currentNameHasWildcard;\n\n if (shouldUpdate && !end_timestamp) {\n const currentBranches = matchRoutes(allRoutes, location);\n const [name, source] = resolveRouteNameAndSource(\n location,\n allRoutes,\n allRoutes,\n (currentBranches as RouteMatch[]) || [],\n _basename,\n _lazyRouteManifest,\n _enableAsyncRouteHandlers,\n );\n\n const currentSource = attributes[SENTRY_SEGMENT_NAME_SOURCE];\n const isImprovement =\n name &&\n (!currentName || // No current name - always set\n (!hasBeenNamed && (currentSource !== 'route' || source === 'route')) || // Not finalized - allow unless downgrading route→url\n (currentSource !== 'route' && source === 'route') || // URL → route upgrade\n (currentSource === 'route' && source === 'route' && currentNameHasWildcard)); // Route → better route (only if current has wildcard)\n if (isImprovement) {\n // With span streaming, span names have to be low cardinality, so we can't fall back to the URL.\n const client = getClient();\n const isUnparameterizedStreamedNavigation = source !== 'route' && !!client && hasSpanStreamingEnabled(client);\n activeRootSpan.updateName(isUnparameterizedStreamedNavigation ? NAVIGATION_SPAN_NAME_FALLBACK : name);\n activeRootSpan.setAttribute(SENTRY_SEGMENT_NAME_SOURCE, source);\n if (source === 'route') {\n activeRootSpan.setAttribute(URL_TEMPLATE, name);\n }\n\n // Only mark as finalized for non-wildcard route names (allows URL→route upgrades).\n if (!transactionNameHasWildcard(name) && source === 'route') {\n addNonEnumerableProperty(activeRootSpan, '__sentry_navigation_name_set__', true);\n }\n }\n }\n}\n\nfunction setupRouterSubscription(\n router: Router,\n routes: RouteObject[],\n version: V6CompatibleVersion,\n basename: string | undefined,\n activeRootSpan: Span | undefined,\n): void {\n let isInitialPageloadComplete = false;\n let hasSeenPageloadSpan = !!activeRootSpan && spanToJSON(activeRootSpan).attributes[SENTRY_OP] === 'pageload';\n let hasSeenPopAfterPageload = false;\n let scheduledNavigationHandler: number | null = null;\n let lastHandledPathname: string | null = null;\n\n router.subscribe((state: RouterState) => {\n if (!isInitialPageloadComplete) {\n const currentRootSpan = getActiveRootSpan();\n const isCurrentlyInPageload = currentRootSpan && spanToJSON(currentRootSpan).attributes[SENTRY_OP] === 'pageload';\n\n if (isCurrentlyInPageload) {\n hasSeenPageloadSpan = true;\n } else if (hasSeenPageloadSpan) {\n if (state.historyAction === 'POP' && !hasSeenPopAfterPageload) {\n hasSeenPopAfterPageload = true;\n } else {\n isInitialPageloadComplete = true;\n }\n }\n }\n\n const shouldHandleNavigation =\n state.historyAction === 'PUSH' || (state.historyAction === 'POP' && isInitialPageloadComplete);\n\n if (shouldHandleNavigation) {\n // Include search and hash to allow query/hash-only navigations\n // Use computeLocationKey() to ensure undefined/null values are normalized to empty strings\n const currentLocationKey = computeLocationKey(state.location);\n const navigationHandler = (): void => {\n // Prevent multiple calls for the same location within the same navigation cycle\n if (lastHandledPathname === currentLocationKey) {\n return;\n }\n lastHandledPathname = currentLocationKey;\n scheduledNavigationHandler = null;\n handleNavigation({\n location: state.location,\n routes,\n navigationType: state.historyAction,\n version,\n basename,\n allRoutes: Array.from(allRoutes),\n });\n };\n\n if (state.navigation.state !== 'idle') {\n // Navigation in progress - reset if location changed\n if (lastHandledPathname !== currentLocationKey) {\n lastHandledPathname = null;\n }\n // Cancel any previously scheduled handler to avoid duplicates\n if (scheduledNavigationHandler !== null) {\n cancelScheduledCallback(scheduledNavigationHandler);\n }\n scheduledNavigationHandler = scheduleCallback(navigationHandler);\n } else {\n // Navigation completed - cancel scheduled handler if any, then call immediately\n if (scheduledNavigationHandler !== null) {\n cancelScheduledCallback(scheduledNavigationHandler);\n scheduledNavigationHandler = null;\n }\n navigationHandler();\n // Don't reset - next navigation cycle resets to prevent duplicates within same cycle.\n }\n }\n });\n}\n\n/**\n * Creates a wrapCreateBrowserRouter function that can be used with all React Router v6 compatible versions.\n */\nexport function createV6CompatibleWrapCreateBrowserRouter<\n TState extends RouterState = RouterState,\n TRouter extends Router<TState> = Router<TState>,\n>(\n createRouterFunction: CreateRouterFunction<TState, TRouter>,\n version: V6CompatibleVersion,\n): CreateRouterFunction<TState, TRouter> {\n if (!_useEffect || !_useLocation || !_useNavigationType || !_matchRoutes) {\n DEBUG_BUILD &&\n debug.warn(\n `reactRouter${version ? `V${version}` : ''}Instrumentation was unable to wrap the \\`createRouter\\` function because of one or more missing parameters.`,\n );\n\n return createRouterFunction;\n }\n\n return function (routes: RouteObject[], opts?: Record<string, unknown> & { basename?: string }): TRouter {\n addRoutesToAllRoutes(routes);\n\n if (_enableAsyncRouteHandlers) {\n for (const route of routes) {\n checkRouteForAsyncHandler(route, processResolvedRoutes);\n }\n }\n\n // Capture the active span BEFORE creating the router.\n // This is important because the span might end (due to idle timeout) before\n // patchRoutesOnNavigation is called by React Router.\n const activeRootSpan = getActiveRootSpan();\n\n // If patchRoutesOnNavigation is provided and we have an active span,\n // mark the span as having potential lazy routes and create a deferred promise.\n const hasPatchRoutesOnNavigation =\n opts && 'patchRoutesOnNavigation' in opts && typeof opts.patchRoutesOnNavigation === 'function';\n if (hasPatchRoutesOnNavigation && activeRootSpan) {\n // Mark the span as potentially having lazy routes\n addNonEnumerableProperty(activeRootSpan, '__sentry_may_have_lazy_routes__', true);\n createDeferredLazyRoutePromise(activeRootSpan);\n }\n\n // Pass the captured span to wrapPatchRoutesOnNavigation so it uses the same span\n // even if the span has ended by the time patchRoutesOnNavigation is called.\n const wrappedOpts = wrapPatchRoutesOnNavigation(opts, false, activeRootSpan);\n const router = createRouterFunction(routes, wrappedOpts);\n const basename = opts?.basename;\n\n if (router.state.historyAction === 'POP' && activeRootSpan) {\n updatePageloadTransaction({\n activeRootSpan,\n location: router.state.location,\n routes,\n basename,\n allRoutes: Array.from(allRoutes),\n });\n }\n\n // Store basename for use in updateNavigationSpan\n _basename = basename || '';\n\n setupRouterSubscription(router, routes, version, basename, activeRootSpan);\n\n return router;\n };\n}\n\n/**\n * Creates a wrapCreateMemoryRouter function that can be used with all React Router v6 compatible versions.\n */\nexport function createV6CompatibleWrapCreateMemoryRouter<\n TState extends RouterState = RouterState,\n TRouter extends Router<TState> = Router<TState>,\n>(\n createRouterFunction: CreateRouterFunction<TState, TRouter>,\n version: V6CompatibleVersion,\n): CreateRouterFunction<TState, TRouter> {\n if (!_useEffect || !_useLocation || !_useNavigationType || !_matchRoutes) {\n DEBUG_BUILD &&\n debug.warn(\n `reactRouter${version ? `V${version}` : ''}Instrumentation was unable to wrap the \\`createMemoryRouter\\` function because of one or more missing parameters.`,\n );\n\n return createRouterFunction;\n }\n\n return function (\n routes: RouteObject[],\n opts?: Record<string, unknown> & {\n basename?: string;\n initialEntries?: (string | { pathname: string })[];\n initialIndex?: number;\n },\n ): TRouter {\n addRoutesToAllRoutes(routes);\n\n if (_enableAsyncRouteHandlers) {\n for (const route of routes) {\n checkRouteForAsyncHandler(route, processResolvedRoutes);\n }\n }\n\n // Capture the active span BEFORE creating the router (same as browser router)\n const memoryActiveRootSpanEarly = getActiveRootSpan();\n\n // If patchRoutesOnNavigation is provided and we have an active span,\n // mark the span as having potential lazy routes and create a deferred promise.\n const hasPatchRoutesOnNavigation =\n opts && 'patchRoutesOnNavigation' in opts && typeof opts.patchRoutesOnNavigation === 'function';\n if (hasPatchRoutesOnNavigation && memoryActiveRootSpanEarly) {\n addNonEnumerableProperty(memoryActiveRootSpanEarly, '__sentry_may_have_lazy_routes__', true);\n createDeferredLazyRoutePromise(memoryActiveRootSpanEarly);\n }\n\n const wrappedOpts = wrapPatchRoutesOnNavigation(opts, true, memoryActiveRootSpanEarly);\n\n const router = createRouterFunction(routes, wrappedOpts);\n const basename = opts?.basename;\n\n let initialEntry = undefined;\n\n const initialEntries = opts?.initialEntries;\n const initialIndex = opts?.initialIndex;\n\n const hasOnlyOneInitialEntry = initialEntries?.length === 1;\n const hasIndexedEntry = initialIndex !== undefined && initialEntries?.[initialIndex];\n\n initialEntry = hasOnlyOneInitialEntry\n ? initialEntries[0]\n : hasIndexedEntry\n ? initialEntries[initialIndex]\n : undefined;\n\n const location = initialEntry\n ? typeof initialEntry === 'string'\n ? { pathname: initialEntry }\n : initialEntry\n : router.state.location;\n\n const memoryActiveRootSpan = getActiveRootSpan();\n\n if (router.state.historyAction === 'POP' && memoryActiveRootSpan) {\n updatePageloadTransaction({\n activeRootSpan: memoryActiveRootSpan,\n location,\n routes,\n basename,\n allRoutes: Array.from(allRoutes),\n });\n }\n\n // Store basename for use in updateNavigationSpan\n _basename = basename || '';\n\n setupRouterSubscription(router, routes, version, basename, memoryActiveRootSpan);\n\n return router;\n };\n}\n\n/**\n * Creates a browser tracing integration that can be used with all React Router v6 compatible versions.\n */\nexport function createReactRouterV6CompatibleTracingIntegration(\n options: Parameters<typeof browserTracingIntegration>[0] & ReactRouterOptions,\n version: V6CompatibleVersion,\n): Integration {\n const integration = browserTracingIntegration({ ...options, instrumentPageLoad: false, instrumentNavigation: false });\n\n const {\n useEffect,\n useLocation,\n useNavigationType,\n createRoutesFromChildren,\n matchRoutes,\n stripBasename,\n enableAsyncRouteHandlers = false,\n instrumentPageLoad = true,\n instrumentNavigation = true,\n lazyRouteTimeout,\n lazyRouteManifest,\n } = options;\n\n return {\n ...integration,\n setup(client) {\n integration.setup(client);\n\n const finalTimeout = options.finalTimeout ?? 30000;\n const defaultMaxWait = (options.idleTimeout ?? 1000) * 3;\n const configuredMaxWait = lazyRouteTimeout ?? defaultMaxWait;\n\n // Cap Infinity at finalTimeout to prevent indefinite hangs\n if (configuredMaxWait === Infinity) {\n _lazyRouteTimeout = finalTimeout;\n DEBUG_BUILD &&\n debug.log(\n '[React Router] lazyRouteTimeout set to Infinity, capping at finalTimeout:',\n finalTimeout,\n 'ms to prevent indefinite hangs',\n );\n } else if (Number.isNaN(configuredMaxWait)) {\n DEBUG_BUILD &&\n debug.warn('[React Router] lazyRouteTimeout must be a number, falling back to default:', defaultMaxWait);\n _lazyRouteTimeout = defaultMaxWait;\n } else if (configuredMaxWait < 0) {\n DEBUG_BUILD &&\n debug.warn(\n '[React Router] lazyRouteTimeout must be non-negative or Infinity, got:',\n configuredMaxWait,\n 'falling back to:',\n defaultMaxWait,\n );\n _lazyRouteTimeout = defaultMaxWait;\n } else {\n _lazyRouteTimeout = configuredMaxWait;\n }\n\n _useEffect = useEffect;\n _useLocation = useLocation;\n _useNavigationType = useNavigationType;\n _matchRoutes = matchRoutes;\n _createRoutesFromChildren = createRoutesFromChildren;\n _enableAsyncRouteHandlers = enableAsyncRouteHandlers;\n _lazyRouteManifest = lazyRouteManifest;\n\n // Initialize the router utils with the required dependencies\n initializeRouterUtils(matchRoutes, stripBasename || false);\n },\n afterAllSetup(client) {\n integration.afterAllSetup(client);\n\n const initPathName = WINDOW.location?.pathname;\n if (instrumentPageLoad && initPathName) {\n startBrowserTracingPageLoadSpan(client, {\n // With span streaming, span names have to be low cardinality. The route is only resolved\n // once the router renders, which updates the span name then.\n name: hasSpanStreamingEnabled(client) ? PAGELOAD_SPAN_NAME_FALLBACK : initPathName,\n attributes: {\n [SENTRY_SEGMENT_NAME_SOURCE]: 'url',\n [SENTRY_OP]: PAGELOAD,\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: `auto.pageload.react.reactrouter${version ? `_v${version}` : ''}`,\n },\n });\n }\n\n if (instrumentNavigation) {\n CLIENTS_WITH_INSTRUMENT_NAVIGATION.add(client);\n }\n },\n };\n}\n\nexport function createV6CompatibleWrapUseRoutes(origUseRoutes: UseRoutes, version: V6CompatibleVersion): UseRoutes {\n if (!_useEffect || !_useLocation || !_useNavigationType || !_matchRoutes) {\n DEBUG_BUILD &&\n debug.warn(\n 'reactRouterV6Instrumentation was unable to wrap `useRoutes` because of one or more missing parameters.',\n );\n\n return origUseRoutes;\n }\n\n const SentryRoutes: React.FC<{\n children?: React.ReactNode;\n routes: RouteObject[];\n locationArg?: Partial<Location> | string;\n }> = (props: { children?: React.ReactNode; routes: RouteObject[]; locationArg?: Partial<Location> | string }) => {\n const isMountRenderPass = React.useRef(true);\n const { routes, locationArg } = props;\n\n const Routes = origUseRoutes(routes, locationArg);\n\n const location = _useLocation();\n const navigationType = _useNavigationType();\n\n // A value with stable identity to either pick `locationArg` if available or `location` if not\n const stableLocationParam =\n typeof locationArg === 'string' || locationArg?.pathname ? (locationArg as { pathname: string }) : location;\n\n // Register this `<Routes>`'s routes in the shared set for as long as it is mounted, removing them on\n // unmount so they don't leak into later unrelated navigations (#22782). Tying add and remove to the\n // same effect lifecycle keeps it correct under StrictMode's mount/unmount/remount.\n useIsomorphicLayoutEffect(() => {\n const added = addRoutesToAllRoutes(routes);\n\n return () => removeRoutesFromAllRoutes(added);\n });\n\n useIsomorphicLayoutEffect(() => {\n const normalizedLocation =\n typeof stableLocationParam === 'string' ? { pathname: stableLocationParam } : stableLocationParam;\n\n if (isMountRenderPass.current) {\n updatePageloadTransaction({\n activeRootSpan: getActiveRootSpan(),\n location: normalizedLocation,\n routes,\n allRoutes: Array.from(allRoutes),\n });\n isMountRenderPass.current = false;\n } else {\n // Note: Component-based routes don't support lazy route tracking via lazyRouteTimeout\n // because React.lazy() loads happen at the component level, not the router level.\n // Use createBrowserRouter with patchRoutesOnNavigation for lazy route tracking.\n handleNavigation({\n location: normalizedLocation,\n routes,\n navigationType,\n version,\n allRoutes: Array.from(allRoutes),\n });\n }\n }, [navigationType, stableLocationParam]);\n\n return Routes;\n };\n\n // eslint-disable-next-line react/display-name\n return (routes: RouteObject[], locationArg?: Partial<Location> | string): React.ReactElement | null => {\n return <SentryRoutes routes={routes} locationArg={locationArg} />;\n };\n}\nfunction wrapPatchRoutesOnNavigation(\n opts: Record<string, unknown> | undefined,\n isMemoryRouter = false,\n capturedSpan?: Span,\n): Record<string, unknown> {\n if (!opts || !('patchRoutesOnNavigation' in opts) || typeof opts.patchRoutesOnNavigation !== 'function') {\n return opts || {};\n }\n\n const originalPatchRoutes = opts.patchRoutesOnNavigation;\n return {\n ...opts,\n patchRoutesOnNavigation: async (args: unknown) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n const targetPath = (args as any)?.path;\n\n // Use current active span if available, otherwise fall back to captured span (from router creation time).\n // This ensures navigation spans use their own span (not the stale pageload span), while still\n // supporting pageload spans that may have ended before patchRoutesOnNavigation is called.\n const activeRootSpan = getActiveRootSpan() ?? capturedSpan;\n\n if (!isMemoryRouter) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n const originalPatch = (args as any)?.patch;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n const matches = (args as any)?.matches as Array<{ route: RouteObject }> | undefined;\n if (originalPatch) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n (args as any).patch = (routeId: string, children: RouteObject[]) => {\n addRoutesToAllRoutes(children);\n\n // Find the parent route from matches and attach children to it in allRoutes.\n // React Router's patch attaches children to its internal route copies, but we need\n // to update the route objects in our allRoutes Set for proper route matching.\n if (matches && matches.length > 0) {\n const leafMatch = matches[matches.length - 1];\n const leafRoute = leafMatch?.route;\n if (leafRoute) {\n // Find the matching route in allRoutes by id, reference, or path\n const matchingRoute = Array.from(allRoutes).find(route => {\n const idMatches = route.id !== undefined && route.id === routeId;\n const referenceMatches = route === leafRoute;\n const pathMatches =\n route.path !== undefined && leafRoute.path !== undefined && route.path === leafRoute.path;\n\n return idMatches || referenceMatches || pathMatches;\n });\n\n if (matchingRoute) {\n addResolvedRoutesToParent(children, matchingRoute);\n }\n }\n }\n\n // Use the captured activeRootSpan instead of getActiveRootSpan() to avoid race conditions\n // where user navigates away during lazy route loading and we'd update the wrong span\n const spanJson = activeRootSpan ? spanToJSON(activeRootSpan) : undefined;\n // Only update if we have a valid targetPath (patchRoutesOnNavigation can be called without path),\n // the captured span exists, hasn't ended, and is a navigation span\n if (\n targetPath &&\n activeRootSpan &&\n spanJson &&\n !spanJson.end_timestamp && // Span hasn't ended yet\n spanJson.attributes[SENTRY_OP] === 'navigation'\n ) {\n updateNavigationSpan(\n activeRootSpan,\n { pathname: targetPath, search: '', hash: '', state: null, key: 'default' },\n Array.from(allRoutes),\n true,\n _matchRoutes,\n );\n }\n return originalPatch(routeId, children);\n };\n }\n }\n\n const lazyLoadPromise = (async () => {\n // Set context so async handlers can access correct targetPath and span\n const contextToken = setNavigationContext(targetPath, activeRootSpan);\n let result;\n try {\n result = await originalPatchRoutes(args);\n } finally {\n clearNavigationContext(contextToken);\n // Resolve the deferred promise now that patchRoutesOnNavigation has completed.\n // This ensures patchedEnd has waited long enough for the lazy routes to load.\n if (activeRootSpan) {\n resolveDeferredLazyRoutePromise(activeRootSpan);\n }\n }\n\n // Use the captured activeRootSpan instead of getActiveRootSpan() to avoid race conditions\n // where user navigates away during lazy route loading and we'd update the wrong span\n const spanJson = activeRootSpan ? spanToJSON(activeRootSpan) : undefined;\n if (\n activeRootSpan &&\n spanJson &&\n !spanJson.end_timestamp && // Span hasn't ended yet\n spanJson.attributes[SENTRY_OP] === 'navigation'\n ) {\n // Use targetPath consistently - don't fall back to WINDOW.location which may have changed\n // if the user navigated away during async loading\n const pathname = targetPath;\n\n if (pathname) {\n updateNavigationSpan(\n activeRootSpan,\n { pathname, search: '', hash: '', state: null, key: 'default' },\n Array.from(allRoutes),\n false,\n _matchRoutes,\n );\n }\n }\n\n return result;\n })();\n\n if (activeRootSpan) {\n trackLazyRouteLoad(activeRootSpan, lazyLoadPromise);\n }\n\n return lazyLoadPromise;\n },\n };\n}\n\n// eslint-disable-next-line complexity\nexport function handleNavigation(opts: {\n location: Location;\n routes: RouteObject[];\n navigationType: Action;\n version: V6CompatibleVersion;\n matches?: AgnosticDataRouteMatch;\n basename?: string;\n allRoutes?: RouteObject[];\n}): void {\n const { location, routes, navigationType, version, matches, basename, allRoutes } = opts;\n const branches = Array.isArray(matches) ? matches : _matchRoutes(allRoutes || routes, location, basename);\n\n const client = getClient();\n if (!client || !CLIENTS_WITH_INSTRUMENT_NAVIGATION.has(client)) {\n return;\n }\n\n const activeRootSpan = getActiveRootSpan();\n if (activeRootSpan && spanToJSON(activeRootSpan).attributes[SENTRY_OP] === 'pageload' && navigationType === 'POP') {\n return;\n }\n\n if ((navigationType === 'PUSH' || navigationType === 'POP') && branches) {\n const [name, source] = resolveRouteNameAndSource(\n location,\n allRoutes || routes,\n allRoutes || routes,\n branches as RouteMatch[],\n basename,\n _lazyRouteManifest,\n _enableAsyncRouteHandlers,\n );\n\n const locationKey = computeLocationKey(location);\n const trackedNav = activeNavigationSpans.get(client);\n\n // Determine if this navigation should be skipped as a duplicate\n const trackedSpanHasEnded =\n trackedNav && !trackedNav.isPlaceholder ? !!spanToJSON(trackedNav.span).end_timestamp : false;\n const { skip, shouldUpdate } = shouldSkipNavigation(trackedNav, locationKey, name, trackedSpanHasEnded);\n\n if (skip) {\n if (shouldUpdate && trackedNav) {\n const oldName = trackedNav.routeName;\n\n if (trackedNav.isPlaceholder) {\n // Update placeholder's route name - the real span will be created with this name\n trackedNav.routeName = name;\n DEBUG_BUILD &&\n debug.log(\n `[Tracing] Updated placeholder navigation name from \"${oldName}\" to \"${name}\" (will apply to real span)`,\n );\n } else {\n // Update existing real span from wildcard to parameterized route name.\n // With span streaming, span names have to be low cardinality, so we can't fall back to the URL.\n const isUnparameterizedStreamedNavigation = source !== 'route' && hasSpanStreamingEnabled(client);\n trackedNav.span.updateName(isUnparameterizedStreamedNavigation ? NAVIGATION_SPAN_NAME_FALLBACK : name);\n trackedNav.span.setAttribute(SENTRY_SEGMENT_NAME_SOURCE, source);\n if (source === 'route') {\n trackedNav.span.setAttribute(URL_TEMPLATE, name);\n }\n addNonEnumerableProperty(trackedNav.span, '__sentry_navigation_name_set__', true);\n trackedNav.routeName = name;\n DEBUG_BUILD && debug.log(`[Tracing] Updated navigation span name from \"${oldName}\" to \"${name}\"`);\n }\n } else {\n DEBUG_BUILD && debug.log(`[Tracing] Skipping duplicate navigation for location: ${locationKey}`);\n }\n return;\n }\n\n // Create new navigation span (first navigation or legitimate new navigation)\n // Reserve the spot in the map first to prevent race conditions\n // Mark as placeholder to prevent concurrent handleNavigation calls from creating duplicates\n const placeholderSpan = { end: () => {} } as unknown as Span;\n const placeholderEntry = {\n span: placeholderSpan,\n routeName: name,\n pathname: location.pathname,\n locationKey,\n isPlaceholder: true as const,\n };\n activeNavigationSpans.set(client, placeholderEntry);\n\n let navigationSpan: Span | undefined;\n try {\n navigationSpan = startBrowserTracingNavigationSpan(client, {\n // Use placeholder's routeName in case it was updated. With span streaming, span names have to\n // be low cardinality, so we can't fall back to the URL.\n name:\n source === 'route' || !hasSpanStreamingEnabled(client)\n ? placeholderEntry.routeName\n : NAVIGATION_SPAN_NAME_FALLBACK,\n attributes: {\n [SENTRY_SEGMENT_NAME_SOURCE]: source,\n [SENTRY_OP]: NAVIGATION,\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: `auto.navigation.react.reactrouter${version ? `_v${version}` : ''}`,\n ...(source === 'route' && { [URL_TEMPLATE]: placeholderEntry.routeName }),\n },\n });\n } catch (e) {\n // If span creation fails, remove the placeholder so we don't block future navigations\n activeNavigationSpans.delete(client);\n throw e;\n }\n\n if (navigationSpan) {\n // Update the map with the real span (isPlaceholder omitted, defaults to false)\n activeNavigationSpans.set(client, {\n span: navigationSpan,\n routeName: placeholderEntry.routeName, // Use the (potentially updated) placeholder routeName\n pathname: location.pathname,\n locationKey,\n });\n patchSpanEnd(navigationSpan, location, routes, basename, 'navigation');\n } else {\n // If no span was created, remove the placeholder\n activeNavigationSpans.delete(client);\n }\n }\n}\n\n/* Only exported for testing purposes */\nexport function addRoutesToAllRoutes(routes: RouteObject[]): RouteObject[] {\n const added: RouteObject[] = [];\n routes.forEach(route => {\n const extractedChildRoutes = getChildRoutesRecursively(route);\n\n extractedChildRoutes.forEach(r => {\n allRoutes.add(r);\n added.push(r);\n });\n });\n\n return added;\n}\n\n/**\n * Removes routes previously added via `addRoutesToAllRoutes` from the shared set. Called when a\n * `<Routes>` unmounts so its routes don't linger and get matched against later, unrelated navigations\n * (which produced hybrid names like `/bar/:fooId` across independent routers - see #22782).\n */\nfunction removeRoutesFromAllRoutes(routes: RouteObject[]): void {\n routes.forEach(route => {\n allRoutes.delete(route);\n });\n}\n\nfunction getChildRoutesRecursively(route: RouteObject, allRoutes: Set<RouteObject> = new Set()): Set<RouteObject> {\n if (!allRoutes.has(route)) {\n allRoutes.add(route);\n\n if (route.children && !route.index) {\n route.children.forEach(child => {\n const childRoutes = getChildRoutesRecursively(child, allRoutes);\n\n childRoutes.forEach(r => {\n allRoutes.add(r);\n });\n });\n }\n }\n\n return allRoutes;\n}\n\nfunction updatePageloadTransaction({\n activeRootSpan,\n location,\n routes,\n matches,\n basename,\n allRoutes,\n}: {\n activeRootSpan: Span | undefined;\n location: Location;\n routes: RouteObject[];\n matches?: AgnosticDataRouteMatch;\n basename?: string;\n allRoutes?: RouteObject[];\n}): void {\n const branches = Array.isArray(matches)\n ? matches\n : (_matchRoutes(allRoutes || routes, location, basename) as unknown as RouteMatch[]);\n\n if (branches) {\n const [name, source] = resolveRouteNameAndSource(\n location,\n allRoutes || routes,\n allRoutes || routes,\n branches,\n basename,\n _lazyRouteManifest,\n _enableAsyncRouteHandlers,\n );\n\n getCurrentScope().setTransactionName(name || '/');\n\n if (activeRootSpan) {\n // With span streaming, span names have to be low cardinality, so we can't fall back to the URL.\n const client = getClient();\n const isUnparameterizedStreamedPageload = source !== 'route' && !!client && hasSpanStreamingEnabled(client);\n activeRootSpan.updateName(isUnparameterizedStreamedPageload ? PAGELOAD_SPAN_NAME_FALLBACK : name);\n activeRootSpan.setAttribute(SENTRY_SEGMENT_NAME_SOURCE, source);\n if (source === 'route') {\n activeRootSpan.setAttribute(URL_TEMPLATE, name);\n }\n\n // Patch span.end() to ensure we update the name one last time before the span is sent\n patchSpanEnd(activeRootSpan, location, routes, basename, 'pageload');\n }\n } else if (activeRootSpan) {\n // Even if branches is null (can happen when lazy routes haven't loaded yet),\n // we still need to patch span.end() so that when lazy routes load and the span ends,\n // we can update the transaction name correctly.\n patchSpanEnd(activeRootSpan, location, routes, basename, 'pageload');\n }\n}\n\n/**\n * Determines if a span name should be updated during wildcard route resolution.\n *\n * Update conditions (in priority order):\n * 1. No current name + allowNoCurrentName: true → always update (pageload spans)\n * 2. Current name has wildcard + new is route without wildcard → upgrade (e.g., \"/users/*\" → \"/users/:id\")\n * 3. Current source is not 'route' + new source is 'route' → upgrade (e.g., URL → parameterized route)\n *\n * @param currentName - The current span name (may be undefined)\n * @param currentSource - The current span source ('route', 'url', or undefined)\n * @param newName - The proposed new span name\n * @param newSource - The proposed new span source\n * @param allowNoCurrentName - If true, allow updates when there's no current name (for pageload spans)\n * @returns true if the span name should be updated\n */\nfunction shouldUpdateWildcardSpanName(\n currentName: string | undefined,\n currentSource: string | undefined,\n newName: string,\n newSource: string,\n allowNoCurrentName = false,\n): boolean {\n if (!newName) {\n return false;\n }\n\n if (!currentName && allowNoCurrentName) {\n return true;\n }\n\n const hasWildcard = currentName && transactionNameHasWildcard(currentName);\n\n if (hasWildcard && newSource === 'route' && !transactionNameHasWildcard(newName)) {\n return true;\n }\n\n if (currentSource !== 'route' && newSource === 'route') {\n return true;\n }\n\n return false;\n}\n\nfunction tryUpdateSpanNameBeforeEnd(\n span: Span,\n spanJson: ReturnType<typeof spanToJSON>,\n currentName: string | undefined,\n location: Location,\n routes: RouteObject[],\n basename: string | undefined,\n spanType: 'pageload' | 'navigation',\n allRoutes: Set<RouteObject>,\n): void {\n try {\n const currentSource = spanJson.attributes[SENTRY_SEGMENT_NAME_SOURCE] as string | undefined;\n\n if (currentSource === 'route' && currentName && !transactionNameHasWildcard(currentName)) {\n return;\n }\n\n const currentAllRoutes = Array.from(allRoutes);\n const routesToUse = currentAllRoutes.length > 0 ? currentAllRoutes : routes;\n const branches = _matchRoutes(routesToUse, location, basename) as unknown as RouteMatch[];\n\n if (!branches) {\n return;\n }\n\n const [name, source] = resolveRouteNameAndSource(\n location,\n routesToUse,\n routesToUse,\n branches,\n basename,\n _lazyRouteManifest,\n _enableAsyncRouteHandlers,\n );\n\n const isImprovement = shouldUpdateWildcardSpanName(currentName, currentSource, name, source, true);\n const spanNotEnded = spanType === 'pageload' || !spanJson.end_timestamp;\n\n if (isImprovement && spanNotEnded) {\n // With span streaming, span names have to be low cardinality, so we can't fall back to the URL.\n const client = getClient();\n const isUnparameterizedStreamedSpan = source !== 'route' && !!client && hasSpanStreamingEnabled(client);\n const fallbackName = spanType === 'pageload' ? PAGELOAD_SPAN_NAME_FALLBACK : NAVIGATION_SPAN_NAME_FALLBACK;\n span.updateName(isUnparameterizedStreamedSpan ? fallbackName : name);\n span.setAttribute(SENTRY_SEGMENT_NAME_SOURCE, source);\n if (source === 'route') {\n span.setAttribute(URL_TEMPLATE, name);\n }\n }\n } catch (error) {\n DEBUG_BUILD && debug.warn(`Error updating span details before ending: ${error}`);\n }\n}\n\n/**\n * Patches the span.end() method to update the transaction name one last time before the span is sent.\n * This handles cases where the span is cancelled early (e.g., document.hidden) before lazy routes have finished loading.\n */\nfunction patchSpanEnd(\n span: Span,\n location: Location,\n routes: RouteObject[],\n basename: string | undefined,\n spanType: 'pageload' | 'navigation',\n): void {\n const patchedPropertyName = `__sentry_${spanType}_end_patched__` as const;\n const hasEndBeenPatched = (span as unknown as Record<string, boolean | undefined>)?.[patchedPropertyName];\n\n if (hasEndBeenPatched || !span.end) {\n return;\n }\n\n // Uses global allRoutes to access lazy-loaded routes added after this function was called.\n\n const originalEnd = span.end.bind(span);\n let endCalled = false;\n\n span.end = function patchedEnd(...args) {\n if (endCalled) {\n return;\n }\n endCalled = true;\n\n // Capture timestamp immediately to avoid delay from async operations\n // If no timestamp was provided, capture the current time now\n const endTimestamp = args.length > 0 ? args[0] : Date.now() / 1000;\n\n const spanJson = spanToJSON(span);\n const currentName = spanJson.name;\n const currentSource = spanJson.attributes[SENTRY_SEGMENT_NAME_SOURCE];\n\n // Helper to clean up activeNavigationSpans after span ends\n const cleanupNavigationSpan = (): void => {\n const client = getClient();\n if (client && spanType === 'navigation') {\n const trackedNav = activeNavigationSpans.get(client);\n if (trackedNav?.span === span) {\n activeNavigationSpans.delete(client);\n }\n }\n };\n\n const pendingPromises = pendingLazyRouteLoads.get(span);\n const mayHaveLazyRoutes = (span as unknown as Record<string, boolean>).__sentry_may_have_lazy_routes__;\n\n // Wait for lazy routes if:\n // 1. (There are pending promises OR the span was marked as potentially having lazy routes) AND\n // 2. Current name exists AND\n // 3. Either the name has a wildcard OR the source is not 'route' (URL-based names)\n const hasPendingOrMayHaveLazyRoutes = (pendingPromises && pendingPromises.size > 0) || mayHaveLazyRoutes;\n const shouldWaitForLazyRoutes =\n hasPendingOrMayHaveLazyRoutes &&\n currentName &&\n (transactionNameHasWildcard(currentName) || currentSource !== 'route');\n\n if (shouldWaitForLazyRoutes) {\n if (_lazyRouteTimeout === 0) {\n tryUpdateSpanNameBeforeEnd(span, spanJson, currentName, location, routes, basename, spanType, allRoutes);\n cleanupNavigationSpan();\n originalEnd(endTimestamp);\n return;\n }\n\n // If we have pending promises, wait for them. Otherwise, just wait for the timeout.\n // This handles the case where we know lazy routes might load but patchRoutesOnNavigation\n // hasn't been called yet.\n const timeoutPromise = new Promise<void>(r => setTimeout(r, _lazyRouteTimeout));\n let waitPromise: Promise<void>;\n\n if (pendingPromises && pendingPromises.size > 0) {\n const allSettled = Promise.allSettled(pendingPromises).then(() => {});\n waitPromise = _lazyRouteTimeout === Infinity ? allSettled : Promise.race([allSettled, timeoutPromise]);\n } else {\n // No pending promises yet, but we know lazy routes might load\n // Wait for the timeout to give React Router time to call patchRoutesOnNavigation\n waitPromise = timeoutPromise;\n }\n\n waitPromise\n .then(() => {\n const updatedSpanJson = spanToJSON(span);\n tryUpdateSpanNameBeforeEnd(\n span,\n updatedSpanJson,\n updatedSpanJson.name,\n location,\n routes,\n basename,\n spanType,\n allRoutes,\n );\n cleanupNavigationSpan();\n originalEnd(endTimestamp);\n })\n .catch(() => {\n cleanupNavigationSpan();\n originalEnd(endTimestamp);\n });\n return;\n }\n\n tryUpdateSpanNameBeforeEnd(span, spanJson, currentName, location, routes, basename, spanType, allRoutes);\n cleanupNavigationSpan();\n originalEnd(endTimestamp);\n };\n\n addNonEnumerableProperty(span, patchedPropertyName, true);\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function createV6CompatibleWithSentryReactRouterRouting<P extends Record<string, any>, R extends React.FC<P>>(\n Routes: R,\n version: V6CompatibleVersion,\n): R {\n if (!_useEffect || !_useLocation || !_useNavigationType || !_createRoutesFromChildren || !_matchRoutes) {\n DEBUG_BUILD &&\n debug.warn(`reactRouterV6Instrumentation was unable to wrap Routes because of one or more missing parameters.\n useEffect: ${_useEffect}. useLocation: ${_useLocation}. useNavigationType: ${_useNavigationType}.\n createRoutesFromChildren: ${_createRoutesFromChildren}. matchRoutes: ${_matchRoutes}.`);\n\n return Routes;\n }\n\n const SentryRoutes: React.FC<P> = (props: P) => {\n const isMountRenderPass = React.useRef(true);\n\n const location = _useLocation();\n const navigationType = _useNavigationType();\n\n const routes = _createRoutesFromChildren(props.children) as RouteObject[];\n\n // Register this `<Routes>`'s routes in the shared set for as long as it is mounted, removing them on\n // unmount so they don't leak into later unrelated navigations (#22782). Tying add and remove to the\n // same effect lifecycle keeps it correct under StrictMode's mount/unmount/remount.\n useIsomorphicLayoutEffect(() => {\n const added = addRoutesToAllRoutes(routes);\n\n return () => removeRoutesFromAllRoutes(added);\n });\n\n useIsomorphicLayoutEffect(\n () => {\n if (isMountRenderPass.current) {\n updatePageloadTransaction({\n activeRootSpan: getActiveRootSpan(),\n location,\n routes,\n allRoutes: Array.from(allRoutes),\n });\n isMountRenderPass.current = false;\n } else {\n // Note: Component-based routes don't support lazy route tracking via lazyRouteTimeout\n // because React.lazy() loads happen at the component level, not the router level.\n // Use createBrowserRouter with patchRoutesOnNavigation for lazy route tracking.\n handleNavigation({ location, routes, navigationType, version, allRoutes: Array.from(allRoutes) });\n }\n },\n // Re-run only on location/navigation changes, not children changes\n [location, navigationType],\n );\n\n // @ts-expect-error Setting more specific React Component typing for `R` generic above\n // will break advanced type inference done by react router params\n return <Routes {...props} />;\n };\n\n hoistNonReactStatics(SentryRoutes, Routes);\n\n // @ts-expect-error Setting more specific React Component typing for `R` generic above\n // will break advanced type inference done by react router params\n return SentryRoutes;\n}\n"],"names":["allRoutes"],"mappings":"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"}
1
+ {"version":3,"file":"instrumentation.js","sources":["../../../src/reactrouter-compat-utils/instrumentation.tsx"],"sourcesContent":["/* eslint-disable max-lines */\n// Inspired from Donnie McNeal's solution:\n// https://gist.github.com/wontondon/e8c4bdf2888875e4c755712e99279536\n\nimport {\n browserTracingIntegration,\n startBrowserTracingNavigationSpan,\n startBrowserTracingPageLoadSpan,\n WINDOW,\n} from '@sentry/browser';\nimport type { Client, Integration, Span } from '@sentry/core';\nimport {\n addNonEnumerableProperty,\n debug,\n extendIntegration,\n getClient,\n getCurrentScope,\n hasSpanStreamingEnabled,\n NAVIGATION_SPAN_NAME_FALLBACK,\n PAGELOAD_SPAN_NAME_FALLBACK,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n spanToJSON,\n} from '@sentry/core';\nimport * as React from 'react';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { hoistNonReactStatics } from '../hoist-non-react-statics';\nimport type {\n Action,\n AgnosticDataRouteMatch,\n CreateRouterFunction,\n CreateRoutesFromChildren,\n Location,\n MatchRoutes,\n ReactRouterConfig,\n RouteMatch,\n RouteObject,\n Router,\n RouterState,\n UseEffect,\n UseLocation,\n UseNavigationType,\n UseRoutes,\n} from '../types';\nimport { checkRouteForAsyncHandler } from './lazy-routes';\nimport {\n clearNavigationContext,\n getActiveRootSpan,\n resolveRouteNameAndSource,\n setNavigationContext,\n transactionNameHasWildcard,\n} from './utils';\nimport { SENTRY_SEGMENT_NAME_SOURCE, SENTRY_OP, URL_TEMPLATE } from '@sentry/conventions/attributes';\nimport { NAVIGATION, PAGELOAD } from '@sentry/conventions/op';\n\nconst reactRouterConfigByClient = new WeakMap<Client, ReactRouterConfig>();\n\nfunction getRouterConfig(client: Client | undefined): ReactRouterConfig | undefined {\n return client ? reactRouterConfigByClient.get(client) : undefined;\n}\n\n// Detect navigations in a layout effect so the navigation trace is set up before child route components'\n// passive mount effects fire requests (else they propagate the stale pageload trace).\n// Guard on `document` (present in real browsers and jsdom) so we only fall back to `useEffect` in true\n// SSR, where `useLayoutEffect` warns and effects don't run anyway.\nconst useIsomorphicLayoutEffect = WINDOW?.document ? React.useLayoutEffect : React.useEffect;\n\n// Prevents duplicate spans when router.subscribe fires multiple times\nconst activeNavigationSpans = new WeakMap<\n Client,\n { span: Span; routeName: string; pathname: string; locationKey: string; isPlaceholder?: boolean }\n>();\n\n// Exported for testing only\nexport const allRoutes = new Set<RouteObject>();\n\n// Tracks lazy route loads to wait before finalizing span names\nconst pendingLazyRouteLoads = new WeakMap<Span, Set<Promise<unknown>>>();\n\n// Tracks deferred lazy route promises that can be resolved when patchRoutesOnNavigation is called\nconst deferredLazyRouteResolvers = new WeakMap<Span, () => void>();\n\n/**\n * Schedules a callback using requestAnimationFrame when available (browser),\n * or falls back to setTimeout for SSR environments (Node.js, createMemoryRouter tests).\n */\nfunction scheduleCallback(callback: () => void): number {\n if (WINDOW?.requestAnimationFrame) {\n return WINDOW.requestAnimationFrame(callback);\n }\n return setTimeout(callback, 0) as unknown as number;\n}\n\n/**\n * Cancels a scheduled callback, handling both RAF (browser) and timeout (SSR) IDs.\n */\nfunction cancelScheduledCallback(id: number): void {\n if (WINDOW?.cancelAnimationFrame) {\n WINDOW.cancelAnimationFrame(id);\n } else {\n clearTimeout(id);\n }\n}\n\n/**\n * Computes location key for duplicate detection. Normalizes undefined/null to empty strings.\n * Exported for testing.\n */\nexport function computeLocationKey(location: Location): string {\n return `${location.pathname}${location.search || ''}${location.hash || ''}`;\n}\n\n/**\n * Checks if a route name is parameterized (contains route parameters like :id or wildcards like *)\n * vs a raw URL path.\n */\nfunction isParameterizedRoute(routeName: string): boolean {\n return routeName.includes(':') || routeName.includes('*');\n}\n\n/**\n * Determines if a navigation should be skipped as a duplicate, and if an existing span should be updated.\n * Exported for testing.\n *\n * @returns An object with:\n * - skip: boolean - Whether to skip creating a new span\n * - shouldUpdate: boolean - Whether to update the existing span name (wildcard upgrade)\n */\nexport function shouldSkipNavigation(\n trackedNav:\n | { span: Span; routeName: string; pathname: string; locationKey: string; isPlaceholder?: boolean }\n | undefined,\n locationKey: string,\n proposedName: string,\n spanHasEnded: boolean,\n): { skip: boolean; shouldUpdate: boolean } {\n if (!trackedNav) {\n return { skip: false, shouldUpdate: false };\n }\n\n // Check if this is a duplicate navigation (same location)\n // 1. If it's a placeholder, it's always a duplicate (we're waiting for the real one)\n // 2. If it's a real span, it's a duplicate only if it hasn't ended yet\n const isDuplicate = trackedNav.locationKey === locationKey && (trackedNav.isPlaceholder || !spanHasEnded);\n\n if (isDuplicate) {\n // Check if we should update the span name with a better route\n // Allow updates if:\n // 1. Current has wildcard and new doesn't (wildcard → parameterized upgrade)\n // 2. Current is raw path and new is parameterized (raw → parameterized upgrade)\n // 3. New name is different and more specific (longer, indicating nested routes resolved)\n const currentHasWildcard = !!trackedNav.routeName && transactionNameHasWildcard(trackedNav.routeName);\n const proposedHasWildcard = transactionNameHasWildcard(proposedName);\n const currentIsParameterized = !!trackedNav.routeName && isParameterizedRoute(trackedNav.routeName);\n const proposedIsParameterized = isParameterizedRoute(proposedName);\n\n const isWildcardUpgrade = currentHasWildcard && !proposedHasWildcard;\n const isRawToParameterized = !currentIsParameterized && proposedIsParameterized;\n const isMoreSpecific =\n proposedName !== trackedNav.routeName &&\n proposedName.length > (trackedNav.routeName?.length || 0) &&\n !proposedHasWildcard;\n\n const shouldUpdate = !!(trackedNav.routeName && (isWildcardUpgrade || isRawToParameterized || isMoreSpecific));\n\n return { skip: true, shouldUpdate };\n }\n\n return { skip: false, shouldUpdate: false };\n}\n\nexport interface ReactRouterOptions {\n /**\n * @deprecated This is no longer used - the instrumentation relies on React's own effect hook. It is kept\n * as an optional field for backwards compatibility and can safely be omitted.\n */\n useEffect?: UseEffect;\n useLocation: UseLocation;\n useNavigationType: UseNavigationType;\n createRoutesFromChildren: CreateRoutesFromChildren;\n matchRoutes: MatchRoutes;\n /**\n * Whether to strip the basename from the pathname when creating transactions.\n *\n * This is useful for applications that use a basename in their routing setup.\n * @default false\n */\n stripBasename?: boolean;\n /**\n * Enables support for async route handlers.\n *\n * This allows Sentry to track and instrument routes dynamically resolved from async handlers.\n * @default false\n */\n enableAsyncRouteHandlers?: boolean;\n\n /**\n * Maximum time (in milliseconds) to wait for lazy routes to load before finalizing span names.\n *\n * - Set to `0` to not wait at all (immediate finalization)\n * - Set to `Infinity` to wait as long as possible (capped at `finalTimeout` to prevent indefinite hangs)\n * - Negative values will fall back to the default\n *\n * Defaults to 3× the configured `idleTimeout` (default: 3000ms).\n *\n * @default idleTimeout * 3\n */\n lazyRouteTimeout?: number;\n\n /**\n * Static route manifest for resolving parameterized route names with lazy routes.\n *\n * Requires `enableAsyncRouteHandlers: true`. When provided, the manifest is used\n * as the primary source for determining transaction names. This is more reliable\n * than depending on React Router's lazy route resolution timing.\n *\n * @example\n * ```ts\n * lazyRouteManifest: [\n * '/',\n * '/users',\n * '/users/:userId',\n * '/org/:orgSlug/projects/:projectId',\n * ]\n * ```\n */\n lazyRouteManifest?: string[];\n}\n\ntype V6CompatibleVersion = '6' | '7' | '';\n\nexport function addResolvedRoutesToParent(resolvedRoutes: RouteObject[], parentRoute: RouteObject): void {\n const existingChildren = parentRoute.children || [];\n\n const newRoutes = resolvedRoutes.filter(\n newRoute =>\n !existingChildren.some(\n existing =>\n existing === newRoute ||\n (newRoute.path && existing.path === newRoute.path) ||\n (newRoute.id && existing.id === newRoute.id),\n ),\n );\n\n if (newRoutes.length > 0) {\n parentRoute.children = [...existingChildren, ...newRoutes];\n }\n}\n\n/** Registers a pending lazy route load promise for a span. */\nfunction trackLazyRouteLoad(span: Span, promise: Promise<unknown>): void {\n let promises = pendingLazyRouteLoads.get(span);\n if (!promises) {\n promises = new Set();\n pendingLazyRouteLoads.set(span, promises);\n }\n promises.add(promise);\n\n // Clean up when promise resolves/rejects\n // oxlint-disable-next-line typescript/no-floating-promises\n promise.finally(() => {\n const currentPromises = pendingLazyRouteLoads.get(span);\n if (currentPromises) {\n currentPromises.delete(promise);\n }\n });\n}\n\n/**\n * Creates a deferred promise for a span that will be resolved when patchRoutesOnNavigation is called.\n * This ensures that patchedEnd waits for patchRoutesOnNavigation to be called before ending the span.\n */\nfunction createDeferredLazyRoutePromise(span: Span): void {\n const deferredPromise = new Promise<void>(resolve => {\n deferredLazyRouteResolvers.set(span, resolve);\n });\n\n trackLazyRouteLoad(span, deferredPromise);\n}\n\n/**\n * Resolves the deferred lazy route promise for a span.\n * Called when patchRoutesOnNavigation is invoked.\n */\nfunction resolveDeferredLazyRoutePromise(span: Span): void {\n const resolver = deferredLazyRouteResolvers.get(span);\n if (resolver) {\n resolver();\n deferredLazyRouteResolvers.delete(span);\n // Clear the flag so patchSpanEnd doesn't wait unnecessarily for routes that have already loaded\n if ((span as unknown as Record<string, boolean>).__sentry_may_have_lazy_routes__) {\n (span as unknown as Record<string, boolean>).__sentry_may_have_lazy_routes__ = false;\n }\n }\n}\n\n/**\n * Processes resolved routes by adding them to allRoutes and checking for nested async handlers.\n * When capturedSpan is provided, updates that specific span instead of the current active span.\n * This prevents race conditions where a lazy handler resolves after the user has navigated away.\n */\nexport function processResolvedRoutes(\n resolvedRoutes: RouteObject[],\n config: ReactRouterConfig,\n parentRoute?: RouteObject,\n currentLocation: Location | null = null,\n capturedSpan?: Span,\n): void {\n resolvedRoutes.forEach(child => {\n allRoutes.add(child);\n // Only check for async handlers if the feature is enabled\n if (config.enableAsyncRouteHandlers) {\n checkRouteForAsyncHandler(child, (r, p, l, s) => processResolvedRoutes(r, config, p, l, s));\n }\n });\n\n if (parentRoute) {\n // If a parent route is provided, add the resolved routes as children to the parent route\n addResolvedRoutesToParent(resolvedRoutes, parentRoute);\n }\n\n // Use captured span if provided, otherwise fall back to current active span\n const targetSpan = capturedSpan ?? getActiveRootSpan();\n if (targetSpan) {\n const { end_timestamp, attributes } = spanToJSON(targetSpan);\n\n // Skip update if span has already ended (end_timestamp is set when span.end() is called)\n if (end_timestamp) {\n DEBUG_BUILD && debug.warn('[React Router] Lazy handler resolved after span ended - skipping update');\n return;\n }\n\n const spanOp = attributes[SENTRY_OP];\n\n // Use captured location for route matching (ensures we match against the correct route)\n // Fall back to window.location only if no captured location and no captured span\n // (i.e., this is not from an async handler)\n let location = currentLocation;\n if (!location && !capturedSpan) {\n if (typeof WINDOW !== 'undefined') {\n const globalLocation = WINDOW.location;\n if (globalLocation?.pathname) {\n location = { pathname: globalLocation.pathname };\n }\n }\n }\n\n if (location) {\n if (spanOp === 'pageload') {\n // Re-run the pageload transaction update with the newly loaded routes\n updatePageloadTransaction({\n activeRootSpan: targetSpan,\n location: { pathname: location.pathname },\n routes: Array.from(allRoutes),\n allRoutes: Array.from(allRoutes),\n config,\n });\n } else if (spanOp === 'navigation') {\n // For navigation spans, update the name with the newly loaded routes\n updateNavigationSpan(targetSpan, location, Array.from(allRoutes), false, config);\n }\n }\n }\n}\n\n/**\n * Updates a navigation span with the correct route name after lazy routes have been loaded.\n */\nexport function updateNavigationSpan(\n activeRootSpan: Span,\n location: Location,\n allRoutes: RouteObject[],\n forceUpdate = false,\n config: ReactRouterConfig,\n): void {\n const { name: currentName, end_timestamp, attributes } = spanToJSON(activeRootSpan);\n\n const hasBeenNamed = (activeRootSpan as { __sentry_navigation_name_set__?: boolean })?.__sentry_navigation_name_set__;\n const currentNameHasWildcard = currentName && transactionNameHasWildcard(currentName);\n const shouldUpdate = !hasBeenNamed || forceUpdate || currentNameHasWildcard;\n\n if (shouldUpdate && !end_timestamp) {\n const currentBranches = config.matchRoutes(allRoutes, location);\n const [name, source] = resolveRouteNameAndSource(\n location,\n allRoutes,\n allRoutes,\n (currentBranches as RouteMatch[]) || [],\n config,\n );\n\n const currentSource = attributes[SENTRY_SEGMENT_NAME_SOURCE];\n const isImprovement =\n name &&\n (!currentName || // No current name - always set\n (!hasBeenNamed && (currentSource !== 'route' || source === 'route')) || // Not finalized - allow unless downgrading route→url\n (currentSource !== 'route' && source === 'route') || // URL → route upgrade\n (currentSource === 'route' && source === 'route' && currentNameHasWildcard)); // Route → better route (only if current has wildcard)\n if (isImprovement) {\n // With span streaming, span names have to be low cardinality, so we can't fall back to the URL.\n const client = getClient();\n const isUnparameterizedStreamedNavigation = source !== 'route' && !!client && hasSpanStreamingEnabled(client);\n activeRootSpan.updateName(isUnparameterizedStreamedNavigation ? NAVIGATION_SPAN_NAME_FALLBACK : name);\n activeRootSpan.setAttribute(SENTRY_SEGMENT_NAME_SOURCE, source);\n if (source === 'route') {\n activeRootSpan.setAttribute(URL_TEMPLATE, name);\n }\n\n // Only mark as finalized for non-wildcard route names (allows URL→route upgrades).\n if (!transactionNameHasWildcard(name) && source === 'route') {\n addNonEnumerableProperty(activeRootSpan, '__sentry_navigation_name_set__', true);\n }\n }\n }\n}\n\nfunction setupRouterSubscription(\n router: Router,\n routes: RouteObject[],\n version: V6CompatibleVersion,\n activeRootSpan: Span | undefined,\n config: ReactRouterConfig,\n): void {\n let isInitialPageloadComplete = false;\n let hasSeenPageloadSpan = !!activeRootSpan && spanToJSON(activeRootSpan).attributes[SENTRY_OP] === 'pageload';\n let hasSeenPopAfterPageload = false;\n let scheduledNavigationHandler: number | null = null;\n let lastHandledPathname: string | null = null;\n\n router.subscribe((state: RouterState) => {\n if (!isInitialPageloadComplete) {\n const currentRootSpan = getActiveRootSpan();\n const isCurrentlyInPageload = currentRootSpan && spanToJSON(currentRootSpan).attributes[SENTRY_OP] === 'pageload';\n\n if (isCurrentlyInPageload) {\n hasSeenPageloadSpan = true;\n } else if (hasSeenPageloadSpan) {\n if (state.historyAction === 'POP' && !hasSeenPopAfterPageload) {\n hasSeenPopAfterPageload = true;\n } else {\n isInitialPageloadComplete = true;\n }\n }\n }\n\n const shouldHandleNavigation =\n state.historyAction === 'PUSH' || (state.historyAction === 'POP' && isInitialPageloadComplete);\n\n if (shouldHandleNavigation) {\n // Include search and hash to allow query/hash-only navigations\n // Use computeLocationKey() to ensure undefined/null values are normalized to empty strings\n const currentLocationKey = computeLocationKey(state.location);\n const navigationHandler = (): void => {\n // Prevent multiple calls for the same location within the same navigation cycle\n if (lastHandledPathname === currentLocationKey) {\n return;\n }\n lastHandledPathname = currentLocationKey;\n scheduledNavigationHandler = null;\n handleNavigation({\n location: state.location,\n routes,\n navigationType: state.historyAction,\n version,\n allRoutes: Array.from(allRoutes),\n config,\n });\n };\n\n if (state.navigation.state !== 'idle') {\n // Navigation in progress - reset if location changed\n if (lastHandledPathname !== currentLocationKey) {\n lastHandledPathname = null;\n }\n // Cancel any previously scheduled handler to avoid duplicates\n if (scheduledNavigationHandler !== null) {\n cancelScheduledCallback(scheduledNavigationHandler);\n }\n scheduledNavigationHandler = scheduleCallback(navigationHandler);\n } else {\n // Navigation completed - cancel scheduled handler if any, then call immediately\n if (scheduledNavigationHandler !== null) {\n cancelScheduledCallback(scheduledNavigationHandler);\n scheduledNavigationHandler = null;\n }\n navigationHandler();\n // Don't reset - next navigation cycle resets to prevent duplicates within same cycle.\n }\n }\n });\n}\n\n/**\n * Creates a wrapCreateBrowserRouter function that can be used with all React Router v6 compatible versions.\n */\nexport function createV6CompatibleWrapCreateBrowserRouter<\n TState extends RouterState = RouterState,\n TRouter extends Router<TState> = Router<TState>,\n>(\n createRouterFunction: CreateRouterFunction<TState, TRouter>,\n version: V6CompatibleVersion,\n): CreateRouterFunction<TState, TRouter> {\n return function (routes: RouteObject[], opts?: Record<string, unknown> & { basename?: string }): TRouter {\n const base = getRouterConfig(getClient());\n if (!base) {\n DEBUG_BUILD &&\n debug.warn(\n `reactRouter${version ? `V${version}` : ''}Instrumentation was unable to wrap the \\`createRouter\\` function because the React Router browser tracing integration was not set up. Make sure \\`Sentry.init()\\` runs before the router is created.`,\n );\n\n return createRouterFunction(routes, opts);\n }\n\n // Copy per-router so the router's basename doesn't leak into other routers sharing the client config.\n const config: ReactRouterConfig = { ...base, basename: opts?.basename || '' };\n\n addRoutesToAllRoutes(routes);\n\n if (config.enableAsyncRouteHandlers) {\n for (const route of routes) {\n checkRouteForAsyncHandler(route, (r, p, l, s) => processResolvedRoutes(r, config, p, l, s));\n }\n }\n\n // Capture the active span BEFORE creating the router.\n // This is important because the span might end (due to idle timeout) before\n // patchRoutesOnNavigation is called by React Router.\n const activeRootSpan = getActiveRootSpan();\n\n // If patchRoutesOnNavigation is provided and we have an active span,\n // mark the span as having potential lazy routes and create a deferred promise.\n const hasPatchRoutesOnNavigation =\n opts && 'patchRoutesOnNavigation' in opts && typeof opts.patchRoutesOnNavigation === 'function';\n if (hasPatchRoutesOnNavigation && activeRootSpan) {\n // Mark the span as potentially having lazy routes\n addNonEnumerableProperty(activeRootSpan, '__sentry_may_have_lazy_routes__', true);\n createDeferredLazyRoutePromise(activeRootSpan);\n }\n\n // Pass the captured span to wrapPatchRoutesOnNavigation so it uses the same span\n // even if the span has ended by the time patchRoutesOnNavigation is called.\n const wrappedOpts = wrapPatchRoutesOnNavigation(opts, false, activeRootSpan, config);\n const router = createRouterFunction(routes, wrappedOpts);\n\n if (router.state.historyAction === 'POP' && activeRootSpan) {\n updatePageloadTransaction({\n activeRootSpan,\n location: router.state.location,\n routes,\n allRoutes: Array.from(allRoutes),\n config,\n });\n }\n\n setupRouterSubscription(router, routes, version, activeRootSpan, config);\n\n return router;\n };\n}\n\n/**\n * Creates a wrapCreateMemoryRouter function that can be used with all React Router v6 compatible versions.\n */\nexport function createV6CompatibleWrapCreateMemoryRouter<\n TState extends RouterState = RouterState,\n TRouter extends Router<TState> = Router<TState>,\n>(\n createRouterFunction: CreateRouterFunction<TState, TRouter>,\n version: V6CompatibleVersion,\n): CreateRouterFunction<TState, TRouter> {\n return function (\n routes: RouteObject[],\n opts?: Record<string, unknown> & {\n basename?: string;\n initialEntries?: (string | { pathname: string })[];\n initialIndex?: number;\n },\n ): TRouter {\n const base = getRouterConfig(getClient());\n if (!base) {\n DEBUG_BUILD &&\n debug.warn(\n `reactRouter${version ? `V${version}` : ''}Instrumentation was unable to wrap the \\`createMemoryRouter\\` function because the React Router browser tracing integration was not set up. Make sure \\`Sentry.init()\\` runs before the router is created.`,\n );\n\n return createRouterFunction(routes, opts);\n }\n\n // Copy per-router so the router's basename doesn't leak into other routers sharing the client config.\n const config: ReactRouterConfig = { ...base, basename: opts?.basename || '' };\n\n addRoutesToAllRoutes(routes);\n\n if (config.enableAsyncRouteHandlers) {\n for (const route of routes) {\n checkRouteForAsyncHandler(route, (r, p, l, s) => processResolvedRoutes(r, config, p, l, s));\n }\n }\n\n // Capture the active span BEFORE creating the router (same as browser router)\n const memoryActiveRootSpanEarly = getActiveRootSpan();\n\n // If patchRoutesOnNavigation is provided and we have an active span,\n // mark the span as having potential lazy routes and create a deferred promise.\n const hasPatchRoutesOnNavigation =\n opts && 'patchRoutesOnNavigation' in opts && typeof opts.patchRoutesOnNavigation === 'function';\n if (hasPatchRoutesOnNavigation && memoryActiveRootSpanEarly) {\n addNonEnumerableProperty(memoryActiveRootSpanEarly, '__sentry_may_have_lazy_routes__', true);\n createDeferredLazyRoutePromise(memoryActiveRootSpanEarly);\n }\n\n const wrappedOpts = wrapPatchRoutesOnNavigation(opts, true, memoryActiveRootSpanEarly, config);\n\n const router = createRouterFunction(routes, wrappedOpts);\n\n let initialEntry = undefined;\n\n const initialEntries = opts?.initialEntries;\n const initialIndex = opts?.initialIndex;\n\n const hasOnlyOneInitialEntry = initialEntries?.length === 1;\n const hasIndexedEntry = initialIndex !== undefined && initialEntries?.[initialIndex];\n\n initialEntry = hasOnlyOneInitialEntry\n ? initialEntries[0]\n : hasIndexedEntry\n ? initialEntries[initialIndex]\n : undefined;\n\n const location = initialEntry\n ? typeof initialEntry === 'string'\n ? { pathname: initialEntry }\n : initialEntry\n : router.state.location;\n\n const memoryActiveRootSpan = getActiveRootSpan();\n\n if (router.state.historyAction === 'POP' && memoryActiveRootSpan) {\n updatePageloadTransaction({\n activeRootSpan: memoryActiveRootSpan,\n location,\n routes,\n allRoutes: Array.from(allRoutes),\n config,\n });\n }\n\n setupRouterSubscription(router, routes, version, memoryActiveRootSpan, config);\n\n return router;\n };\n}\n\n/**\n * Creates a browser tracing integration that can be used with all React Router v6 compatible versions.\n */\nexport function createReactRouterV6CompatibleTracingIntegration(\n options: Parameters<typeof browserTracingIntegration>[0] & ReactRouterOptions,\n version: V6CompatibleVersion,\n): Integration {\n const integration = browserTracingIntegration({ ...options, instrumentPageLoad: false, instrumentNavigation: false });\n\n const {\n useLocation,\n useNavigationType,\n createRoutesFromChildren,\n matchRoutes,\n stripBasename,\n enableAsyncRouteHandlers = false,\n instrumentPageLoad = true,\n instrumentNavigation = true,\n lazyRouteTimeout,\n lazyRouteManifest,\n } = options;\n\n return extendIntegration(integration, {\n setup(client) {\n const finalTimeout = options.finalTimeout ?? 30000;\n const defaultMaxWait = (options.idleTimeout ?? 1000) * 3;\n const configuredMaxWait = lazyRouteTimeout ?? defaultMaxWait;\n\n let resolvedLazyRouteTimeout: number;\n // Cap Infinity at finalTimeout to prevent indefinite hangs\n if (configuredMaxWait === Infinity) {\n resolvedLazyRouteTimeout = finalTimeout;\n DEBUG_BUILD &&\n debug.log(\n '[React Router] lazyRouteTimeout set to Infinity, capping at finalTimeout:',\n finalTimeout,\n 'ms to prevent indefinite hangs',\n );\n } else if (Number.isNaN(configuredMaxWait)) {\n DEBUG_BUILD &&\n debug.warn('[React Router] lazyRouteTimeout must be a number, falling back to default:', defaultMaxWait);\n resolvedLazyRouteTimeout = defaultMaxWait;\n } else if (configuredMaxWait < 0) {\n DEBUG_BUILD &&\n debug.warn(\n '[React Router] lazyRouteTimeout must be non-negative or Infinity, got:',\n configuredMaxWait,\n 'falling back to:',\n defaultMaxWait,\n );\n resolvedLazyRouteTimeout = defaultMaxWait;\n } else {\n resolvedLazyRouteTimeout = configuredMaxWait;\n }\n\n // Only store a config when every hook the wrappers call is present. Storing a partial config would\n // make the wrappers take the instrumented branch and invoke a missing hook (e.g. `config.useLocation`)\n // at render time, crashing the host app. Without a config the wrappers fall back to uninstrumented\n // routes instead. The `@sentry/react/react-router` entry supplies these automatically.\n if (\n typeof useLocation === 'function' &&\n typeof useNavigationType === 'function' &&\n typeof createRoutesFromChildren === 'function' &&\n typeof matchRoutes === 'function'\n ) {\n reactRouterConfigByClient.set(client, {\n useLocation,\n useNavigationType,\n createRoutesFromChildren,\n matchRoutes,\n stripBasename: stripBasename || false,\n enableAsyncRouteHandlers,\n instrumentNavigation,\n lazyRouteTimeout: resolvedLazyRouteTimeout,\n lazyRouteManifest,\n basename: '',\n });\n } else {\n DEBUG_BUILD &&\n debug.warn(\n '[React Router] Skipping route instrumentation because `useLocation`, `useNavigationType`, `createRoutesFromChildren` or `matchRoutes` was not provided. ' +\n 'Pass them to `reactRouterBrowserTracingIntegration`, or import it from `@sentry/react/react-router` to have them supplied automatically.',\n );\n }\n },\n afterAllSetup(client) {\n const initPathName = WINDOW.location?.pathname;\n if (instrumentPageLoad && initPathName) {\n startBrowserTracingPageLoadSpan(client, {\n // With span streaming, span names have to be low cardinality. The route is only resolved\n // once the router renders, which updates the span name then.\n name: hasSpanStreamingEnabled(client) ? PAGELOAD_SPAN_NAME_FALLBACK : initPathName,\n attributes: {\n [SENTRY_SEGMENT_NAME_SOURCE]: 'url',\n [SENTRY_OP]: PAGELOAD,\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: `auto.pageload.react.reactrouter${version ? `_v${version}` : ''}`,\n },\n });\n }\n },\n });\n}\n\nexport function createV6CompatibleWrapUseRoutes(origUseRoutes: UseRoutes, version: V6CompatibleVersion): UseRoutes {\n // Null-rendering reporter that owns every config-dependent hook. It is mounted as a *sibling* of the\n // routes element (never wrapping it) and only once a client config exists, so the routes element always\n // keeps its position across the `Sentry.init()` transition and is never remounted - remounting would wipe\n // form state and in-flight work in the host app. As a freshly mounted component, its own hook sequence\n // stays self-consistent for its whole lifetime, so this is Rules-of-Hooks safe.\n const RouteReporter: React.FC<{\n config: ReactRouterConfig;\n routes: RouteObject[];\n locationArg?: Partial<Location> | string;\n }> = ({ config, routes, locationArg }) => {\n const isMountRenderPass = React.useRef(true);\n\n const location = config.useLocation();\n const navigationType = config.useNavigationType();\n\n // A value with stable identity to either pick `locationArg` if available or `location` if not\n const stableLocationParam =\n typeof locationArg === 'string' || locationArg?.pathname ? (locationArg as { pathname: string }) : location;\n\n // Register this `<Routes>`'s routes in the shared set for as long as it is mounted, removing them on\n // unmount so they don't leak into later unrelated navigations (#22782). Tying add and remove to the\n // same effect lifecycle keeps it correct under StrictMode's mount/unmount/remount.\n useIsomorphicLayoutEffect(() => {\n const added = addRoutesToAllRoutes(routes);\n\n return () => removeRoutesFromAllRoutes(added);\n });\n\n useIsomorphicLayoutEffect(() => {\n const normalizedLocation =\n typeof stableLocationParam === 'string' ? { pathname: stableLocationParam } : stableLocationParam;\n\n if (isMountRenderPass.current) {\n updatePageloadTransaction({\n activeRootSpan: getActiveRootSpan(),\n location: normalizedLocation,\n routes,\n allRoutes: Array.from(allRoutes),\n config,\n });\n isMountRenderPass.current = false;\n } else {\n // Note: Component-based routes don't support lazy route tracking via lazyRouteTimeout\n // because React.lazy() loads happen at the component level, not the router level.\n // Use createBrowserRouter with patchRoutesOnNavigation for lazy route tracking.\n handleNavigation({\n location: normalizedLocation,\n routes,\n navigationType,\n version,\n allRoutes: Array.from(allRoutes),\n config,\n });\n }\n }, [navigationType, stableLocationParam]);\n\n return null;\n };\n\n // Reads the client config at *render* time (so wrapping before `Sentry.init()` still instruments once the\n // app renders). `origUseRoutes` is called unconditionally (a stable hook) and its element is always\n // rendered; instrumentation lives in the sibling `RouteReporter`, which mounts only when config exists -\n // so config appearing after the first paint toggles a null-rendering sibling instead of swapping the\n // wrapper's type and remounting the routes.\n const SentryRoutesWrapper: React.FC<{ routes: RouteObject[]; locationArg?: Partial<Location> | string }> = ({\n routes,\n locationArg,\n }) => {\n const config = getRouterConfig(getClient());\n const routesElement = origUseRoutes(routes, locationArg);\n return (\n <>\n {routesElement}\n {/* Rendered after the routes so the reporter's layout effects run *after* the (descendant) route\n subtree has registered into `allRoutes`, matching the pre-refactor parent-after-child order. */}\n {config ? <RouteReporter config={config} routes={routes} locationArg={locationArg} /> : null}\n </>\n );\n };\n\n // eslint-disable-next-line react/display-name\n return (routes: RouteObject[], locationArg?: Partial<Location> | string): React.ReactElement | null => {\n return <SentryRoutesWrapper routes={routes} locationArg={locationArg} />;\n };\n}\nfunction wrapPatchRoutesOnNavigation(\n opts: Record<string, unknown> | undefined,\n isMemoryRouter: boolean,\n capturedSpan: Span | undefined,\n config: ReactRouterConfig,\n): Record<string, unknown> {\n if (!opts || !('patchRoutesOnNavigation' in opts) || typeof opts.patchRoutesOnNavigation !== 'function') {\n return opts || {};\n }\n\n const originalPatchRoutes = opts.patchRoutesOnNavigation;\n return {\n ...opts,\n patchRoutesOnNavigation: async (args: unknown) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n const targetPath = (args as any)?.path;\n\n // Use current active span if available, otherwise fall back to captured span (from router creation time).\n // This ensures navigation spans use their own span (not the stale pageload span), while still\n // supporting pageload spans that may have ended before patchRoutesOnNavigation is called.\n const activeRootSpan = getActiveRootSpan() ?? capturedSpan;\n\n if (!isMemoryRouter) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n const originalPatch = (args as any)?.patch;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n const matches = (args as any)?.matches as Array<{ route: RouteObject }> | undefined;\n if (originalPatch) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n (args as any).patch = (routeId: string, children: RouteObject[]) => {\n addRoutesToAllRoutes(children);\n\n // Find the parent route from matches and attach children to it in allRoutes.\n // React Router's patch attaches children to its internal route copies, but we need\n // to update the route objects in our allRoutes Set for proper route matching.\n if (matches && matches.length > 0) {\n const leafMatch = matches[matches.length - 1];\n const leafRoute = leafMatch?.route;\n if (leafRoute) {\n // Find the matching route in allRoutes by id, reference, or path\n const matchingRoute = Array.from(allRoutes).find(route => {\n const idMatches = route.id !== undefined && route.id === routeId;\n const referenceMatches = route === leafRoute;\n const pathMatches =\n route.path !== undefined && leafRoute.path !== undefined && route.path === leafRoute.path;\n\n return idMatches || referenceMatches || pathMatches;\n });\n\n if (matchingRoute) {\n addResolvedRoutesToParent(children, matchingRoute);\n }\n }\n }\n\n // Use the captured activeRootSpan instead of getActiveRootSpan() to avoid race conditions\n // where user navigates away during lazy route loading and we'd update the wrong span\n const spanJson = activeRootSpan ? spanToJSON(activeRootSpan) : undefined;\n // Only update if we have a valid targetPath (patchRoutesOnNavigation can be called without path),\n // the captured span exists, hasn't ended, and is a navigation span\n if (\n targetPath &&\n activeRootSpan &&\n spanJson &&\n !spanJson.end_timestamp && // Span hasn't ended yet\n spanJson.attributes[SENTRY_OP] === 'navigation'\n ) {\n updateNavigationSpan(\n activeRootSpan,\n { pathname: targetPath, search: '', hash: '', state: null, key: 'default' },\n Array.from(allRoutes),\n true,\n config,\n );\n }\n return originalPatch(routeId, children);\n };\n }\n }\n\n const lazyLoadPromise = (async () => {\n // Set context so async handlers can access correct targetPath and span\n const contextToken = setNavigationContext(targetPath, activeRootSpan);\n let result;\n try {\n result = await originalPatchRoutes(args);\n } finally {\n clearNavigationContext(contextToken);\n // Resolve the deferred promise now that patchRoutesOnNavigation has completed.\n // This ensures patchedEnd has waited long enough for the lazy routes to load.\n if (activeRootSpan) {\n resolveDeferredLazyRoutePromise(activeRootSpan);\n }\n }\n\n // Use the captured activeRootSpan instead of getActiveRootSpan() to avoid race conditions\n // where user navigates away during lazy route loading and we'd update the wrong span\n const spanJson = activeRootSpan ? spanToJSON(activeRootSpan) : undefined;\n if (\n activeRootSpan &&\n spanJson &&\n !spanJson.end_timestamp && // Span hasn't ended yet\n spanJson.attributes[SENTRY_OP] === 'navigation'\n ) {\n // Use targetPath consistently - don't fall back to WINDOW.location which may have changed\n // if the user navigated away during async loading\n const pathname = targetPath;\n\n if (pathname) {\n updateNavigationSpan(\n activeRootSpan,\n { pathname, search: '', hash: '', state: null, key: 'default' },\n Array.from(allRoutes),\n false,\n config,\n );\n }\n }\n\n return result;\n })();\n\n if (activeRootSpan) {\n trackLazyRouteLoad(activeRootSpan, lazyLoadPromise);\n }\n\n return lazyLoadPromise;\n },\n };\n}\n\n// eslint-disable-next-line complexity\nexport function handleNavigation(opts: {\n location: Location;\n routes: RouteObject[];\n navigationType: Action;\n version: V6CompatibleVersion;\n config: ReactRouterConfig;\n matches?: AgnosticDataRouteMatch;\n allRoutes?: RouteObject[];\n}): void {\n const { location, routes, navigationType, version, config, matches, allRoutes } = opts;\n const branches = Array.isArray(matches)\n ? matches\n : config.matchRoutes(allRoutes || routes, location, config.basename);\n\n const client = getClient();\n if (!client || !config.instrumentNavigation) {\n return;\n }\n\n const activeRootSpan = getActiveRootSpan();\n if (activeRootSpan && spanToJSON(activeRootSpan).attributes[SENTRY_OP] === 'pageload' && navigationType === 'POP') {\n return;\n }\n\n if ((navigationType === 'PUSH' || navigationType === 'POP') && branches) {\n const [name, source] = resolveRouteNameAndSource(\n location,\n allRoutes || routes,\n allRoutes || routes,\n branches as RouteMatch[],\n config,\n );\n\n const locationKey = computeLocationKey(location);\n const trackedNav = activeNavigationSpans.get(client);\n\n // Determine if this navigation should be skipped as a duplicate\n const trackedSpanHasEnded =\n trackedNav && !trackedNav.isPlaceholder ? !!spanToJSON(trackedNav.span).end_timestamp : false;\n const { skip, shouldUpdate } = shouldSkipNavigation(trackedNav, locationKey, name, trackedSpanHasEnded);\n\n if (skip) {\n if (shouldUpdate && trackedNav) {\n const oldName = trackedNav.routeName;\n\n if (trackedNav.isPlaceholder) {\n // Update placeholder's route name - the real span will be created with this name\n trackedNav.routeName = name;\n DEBUG_BUILD &&\n debug.log(\n `[Tracing] Updated placeholder navigation name from \"${oldName}\" to \"${name}\" (will apply to real span)`,\n );\n } else {\n // Update existing real span from wildcard to parameterized route name.\n // With span streaming, span names have to be low cardinality, so we can't fall back to the URL.\n const isUnparameterizedStreamedNavigation = source !== 'route' && hasSpanStreamingEnabled(client);\n trackedNav.span.updateName(isUnparameterizedStreamedNavigation ? NAVIGATION_SPAN_NAME_FALLBACK : name);\n trackedNav.span.setAttribute(SENTRY_SEGMENT_NAME_SOURCE, source);\n if (source === 'route') {\n trackedNav.span.setAttribute(URL_TEMPLATE, name);\n }\n addNonEnumerableProperty(trackedNav.span, '__sentry_navigation_name_set__', true);\n trackedNav.routeName = name;\n DEBUG_BUILD && debug.log(`[Tracing] Updated navigation span name from \"${oldName}\" to \"${name}\"`);\n }\n } else {\n DEBUG_BUILD && debug.log(`[Tracing] Skipping duplicate navigation for location: ${locationKey}`);\n }\n return;\n }\n\n // Create new navigation span (first navigation or legitimate new navigation)\n // Reserve the spot in the map first to prevent race conditions\n // Mark as placeholder to prevent concurrent handleNavigation calls from creating duplicates\n const placeholderSpan = { end: () => {} } as unknown as Span;\n const placeholderEntry = {\n span: placeholderSpan,\n routeName: name,\n pathname: location.pathname,\n locationKey,\n isPlaceholder: true as const,\n };\n activeNavigationSpans.set(client, placeholderEntry);\n\n let navigationSpan: Span | undefined;\n try {\n navigationSpan = startBrowserTracingNavigationSpan(client, {\n // Use placeholder's routeName in case it was updated. With span streaming, span names have to\n // be low cardinality, so we can't fall back to the URL.\n name:\n source === 'route' || !hasSpanStreamingEnabled(client)\n ? placeholderEntry.routeName\n : NAVIGATION_SPAN_NAME_FALLBACK,\n attributes: {\n [SENTRY_SEGMENT_NAME_SOURCE]: source,\n [SENTRY_OP]: NAVIGATION,\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: `auto.navigation.react.reactrouter${version ? `_v${version}` : ''}`,\n ...(source === 'route' && { [URL_TEMPLATE]: placeholderEntry.routeName }),\n },\n });\n } catch (e) {\n // If span creation fails, remove the placeholder so we don't block future navigations\n activeNavigationSpans.delete(client);\n throw e;\n }\n\n if (navigationSpan) {\n // Update the map with the real span (isPlaceholder omitted, defaults to false)\n activeNavigationSpans.set(client, {\n span: navigationSpan,\n routeName: placeholderEntry.routeName, // Use the (potentially updated) placeholder routeName\n pathname: location.pathname,\n locationKey,\n });\n patchSpanEnd(navigationSpan, location, routes, 'navigation', config);\n } else {\n // If no span was created, remove the placeholder\n activeNavigationSpans.delete(client);\n }\n }\n}\n\n/* Only exported for testing purposes */\nexport function addRoutesToAllRoutes(routes: RouteObject[]): RouteObject[] {\n const added: RouteObject[] = [];\n routes.forEach(route => {\n const extractedChildRoutes = getChildRoutesRecursively(route);\n\n extractedChildRoutes.forEach(r => {\n allRoutes.add(r);\n added.push(r);\n });\n });\n\n return added;\n}\n\n/**\n * Removes routes previously added via `addRoutesToAllRoutes` from the shared set. Called when a\n * `<Routes>` unmounts so its routes don't linger and get matched against later, unrelated navigations\n * (which produced hybrid names like `/bar/:fooId` across independent routers - see #22782).\n */\nfunction removeRoutesFromAllRoutes(routes: RouteObject[]): void {\n routes.forEach(route => {\n allRoutes.delete(route);\n });\n}\n\nfunction getChildRoutesRecursively(route: RouteObject, allRoutes: Set<RouteObject> = new Set()): Set<RouteObject> {\n if (!allRoutes.has(route)) {\n allRoutes.add(route);\n\n if (route.children && !route.index) {\n route.children.forEach(child => {\n const childRoutes = getChildRoutesRecursively(child, allRoutes);\n\n childRoutes.forEach(r => {\n allRoutes.add(r);\n });\n });\n }\n }\n\n return allRoutes;\n}\n\nfunction updatePageloadTransaction({\n activeRootSpan,\n location,\n routes,\n config,\n matches,\n allRoutes,\n}: {\n activeRootSpan: Span | undefined;\n location: Location;\n routes: RouteObject[];\n config: ReactRouterConfig;\n matches?: AgnosticDataRouteMatch;\n allRoutes?: RouteObject[];\n}): void {\n const branches = Array.isArray(matches)\n ? matches\n : (config.matchRoutes(allRoutes || routes, location, config.basename) as unknown as RouteMatch[]);\n\n if (branches) {\n const [name, source] = resolveRouteNameAndSource(\n location,\n allRoutes || routes,\n allRoutes || routes,\n branches,\n config,\n );\n\n getCurrentScope().setTransactionName(name || '/');\n\n if (activeRootSpan) {\n // With span streaming, span names have to be low cardinality, so we can't fall back to the URL.\n const client = getClient();\n const isUnparameterizedStreamedPageload = source !== 'route' && !!client && hasSpanStreamingEnabled(client);\n activeRootSpan.updateName(isUnparameterizedStreamedPageload ? PAGELOAD_SPAN_NAME_FALLBACK : name);\n activeRootSpan.setAttribute(SENTRY_SEGMENT_NAME_SOURCE, source);\n if (source === 'route') {\n activeRootSpan.setAttribute(URL_TEMPLATE, name);\n }\n\n // Patch span.end() to ensure we update the name one last time before the span is sent\n patchSpanEnd(activeRootSpan, location, routes, 'pageload', config);\n }\n } else if (activeRootSpan) {\n // Even if branches is null (can happen when lazy routes haven't loaded yet),\n // we still need to patch span.end() so that when lazy routes load and the span ends,\n // we can update the transaction name correctly.\n patchSpanEnd(activeRootSpan, location, routes, 'pageload', config);\n }\n}\n\n/**\n * Determines if a span name should be updated during wildcard route resolution.\n *\n * Update conditions (in priority order):\n * 1. No current name + allowNoCurrentName: true → always update (pageload spans)\n * 2. Current name has wildcard + new is route without wildcard → upgrade (e.g., \"/users/*\" → \"/users/:id\")\n * 3. Current source is not 'route' + new source is 'route' → upgrade (e.g., URL → parameterized route)\n *\n * @param currentName - The current span name (may be undefined)\n * @param currentSource - The current span source ('route', 'url', or undefined)\n * @param newName - The proposed new span name\n * @param newSource - The proposed new span source\n * @param allowNoCurrentName - If true, allow updates when there's no current name (for pageload spans)\n * @returns true if the span name should be updated\n */\nfunction shouldUpdateWildcardSpanName(\n currentName: string | undefined,\n currentSource: string | undefined,\n newName: string,\n newSource: string,\n allowNoCurrentName = false,\n): boolean {\n if (!newName) {\n return false;\n }\n\n if (!currentName && allowNoCurrentName) {\n return true;\n }\n\n const hasWildcard = currentName && transactionNameHasWildcard(currentName);\n\n if (hasWildcard && newSource === 'route' && !transactionNameHasWildcard(newName)) {\n return true;\n }\n\n if (currentSource !== 'route' && newSource === 'route') {\n return true;\n }\n\n return false;\n}\n\nfunction tryUpdateSpanNameBeforeEnd(\n span: Span,\n spanJson: ReturnType<typeof spanToJSON>,\n currentName: string | undefined,\n location: Location,\n routes: RouteObject[],\n spanType: 'pageload' | 'navigation',\n allRoutes: Set<RouteObject>,\n config: ReactRouterConfig,\n): void {\n try {\n const currentSource = spanJson.attributes[SENTRY_SEGMENT_NAME_SOURCE] as string | undefined;\n\n if (currentSource === 'route' && currentName && !transactionNameHasWildcard(currentName)) {\n return;\n }\n\n const currentAllRoutes = Array.from(allRoutes);\n const routesToUse = currentAllRoutes.length > 0 ? currentAllRoutes : routes;\n const branches = config.matchRoutes(routesToUse, location, config.basename) as unknown as RouteMatch[];\n\n if (!branches) {\n return;\n }\n\n const [name, source] = resolveRouteNameAndSource(location, routesToUse, routesToUse, branches, config);\n\n const isImprovement = shouldUpdateWildcardSpanName(currentName, currentSource, name, source, true);\n const spanNotEnded = spanType === 'pageload' || !spanJson.end_timestamp;\n\n if (isImprovement && spanNotEnded) {\n // With span streaming, span names have to be low cardinality, so we can't fall back to the URL.\n const client = getClient();\n const isUnparameterizedStreamedSpan = source !== 'route' && !!client && hasSpanStreamingEnabled(client);\n const fallbackName = spanType === 'pageload' ? PAGELOAD_SPAN_NAME_FALLBACK : NAVIGATION_SPAN_NAME_FALLBACK;\n span.updateName(isUnparameterizedStreamedSpan ? fallbackName : name);\n span.setAttribute(SENTRY_SEGMENT_NAME_SOURCE, source);\n if (source === 'route') {\n span.setAttribute(URL_TEMPLATE, name);\n }\n }\n } catch (error) {\n DEBUG_BUILD && debug.warn(`Error updating span details before ending: ${error}`);\n }\n}\n\n/**\n * Patches the span.end() method to update the transaction name one last time before the span is sent.\n * This handles cases where the span is cancelled early (e.g., document.hidden) before lazy routes have finished loading.\n */\nfunction patchSpanEnd(\n span: Span,\n location: Location,\n routes: RouteObject[],\n spanType: 'pageload' | 'navigation',\n config: ReactRouterConfig,\n): void {\n const patchedPropertyName = `__sentry_${spanType}_end_patched__` as const;\n const hasEndBeenPatched = (span as unknown as Record<string, boolean | undefined>)?.[patchedPropertyName];\n\n if (hasEndBeenPatched || !span.end) {\n return;\n }\n\n // Uses global allRoutes to access lazy-loaded routes added after this function was called.\n\n const originalEnd = span.end.bind(span);\n let endCalled = false;\n\n span.end = function patchedEnd(...args) {\n if (endCalled) {\n return;\n }\n endCalled = true;\n\n // Capture timestamp immediately to avoid delay from async operations\n // If no timestamp was provided, capture the current time now\n const endTimestamp = args.length > 0 ? args[0] : Date.now() / 1000;\n\n const spanJson = spanToJSON(span);\n const currentName = spanJson.name;\n const currentSource = spanJson.attributes[SENTRY_SEGMENT_NAME_SOURCE];\n\n // Helper to clean up activeNavigationSpans after span ends\n const cleanupNavigationSpan = (): void => {\n const client = getClient();\n if (client && spanType === 'navigation') {\n const trackedNav = activeNavigationSpans.get(client);\n if (trackedNav?.span === span) {\n activeNavigationSpans.delete(client);\n }\n }\n };\n\n const pendingPromises = pendingLazyRouteLoads.get(span);\n const mayHaveLazyRoutes = (span as unknown as Record<string, boolean>).__sentry_may_have_lazy_routes__;\n\n // Wait for lazy routes if:\n // 1. (There are pending promises OR the span was marked as potentially having lazy routes) AND\n // 2. Current name exists AND\n // 3. Either the name has a wildcard OR the source is not 'route' (URL-based names)\n const hasPendingOrMayHaveLazyRoutes = (pendingPromises && pendingPromises.size > 0) || mayHaveLazyRoutes;\n const shouldWaitForLazyRoutes =\n hasPendingOrMayHaveLazyRoutes &&\n currentName &&\n (transactionNameHasWildcard(currentName) || currentSource !== 'route');\n\n if (shouldWaitForLazyRoutes) {\n if (config.lazyRouteTimeout === 0) {\n tryUpdateSpanNameBeforeEnd(span, spanJson, currentName, location, routes, spanType, allRoutes, config);\n cleanupNavigationSpan();\n originalEnd(endTimestamp);\n return;\n }\n\n // If we have pending promises, wait for them. Otherwise, just wait for the timeout.\n // This handles the case where we know lazy routes might load but patchRoutesOnNavigation\n // hasn't been called yet.\n const timeoutPromise = new Promise<void>(r => setTimeout(r, config.lazyRouteTimeout));\n let waitPromise: Promise<void>;\n\n if (pendingPromises && pendingPromises.size > 0) {\n const allSettled = Promise.allSettled(pendingPromises).then(() => {});\n waitPromise = config.lazyRouteTimeout === Infinity ? allSettled : Promise.race([allSettled, timeoutPromise]);\n } else {\n // No pending promises yet, but we know lazy routes might load\n // Wait for the timeout to give React Router time to call patchRoutesOnNavigation\n waitPromise = timeoutPromise;\n }\n\n waitPromise\n .then(() => {\n const updatedSpanJson = spanToJSON(span);\n tryUpdateSpanNameBeforeEnd(\n span,\n updatedSpanJson,\n updatedSpanJson.name,\n location,\n routes,\n spanType,\n allRoutes,\n config,\n );\n cleanupNavigationSpan();\n originalEnd(endTimestamp);\n })\n .catch(() => {\n cleanupNavigationSpan();\n originalEnd(endTimestamp);\n });\n return;\n }\n\n tryUpdateSpanNameBeforeEnd(span, spanJson, currentName, location, routes, spanType, allRoutes, config);\n cleanupNavigationSpan();\n originalEnd(endTimestamp);\n };\n\n addNonEnumerableProperty(span, patchedPropertyName, true);\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function createV6CompatibleWithSentryReactRouterRouting<P extends Record<string, any>, R extends React.FC<P>>(\n Routes: R,\n version: V6CompatibleVersion,\n): R {\n // Null-rendering reporter that owns every config-dependent hook. It is mounted as a *sibling* of the\n // routes (never wrapping them) and only once a client config exists, so the route subtree always keeps\n // the same component type across the `Sentry.init()` transition and is never remounted - remounting\n // would wipe form state and in-flight work in the host app. As a freshly mounted component, its own hook\n // sequence stays self-consistent for its whole lifetime, so this is Rules-of-Hooks safe.\n const RouteReporter: React.FC<{ config: ReactRouterConfig; routeChildren: React.ReactNode }> = ({\n config,\n routeChildren,\n }) => {\n const isMountRenderPass = React.useRef(true);\n\n const location = config.useLocation();\n const navigationType = config.useNavigationType();\n\n const routes = config.createRoutesFromChildren(\n routeChildren as Parameters<typeof config.createRoutesFromChildren>[0],\n ) as RouteObject[];\n\n // Register this `<Routes>`'s routes in the shared set for as long as it is mounted, removing them on\n // unmount so they don't leak into later unrelated navigations (#22782). Tying add and remove to the\n // same effect lifecycle keeps it correct under StrictMode's mount/unmount/remount.\n useIsomorphicLayoutEffect(() => {\n const added = addRoutesToAllRoutes(routes);\n\n return () => removeRoutesFromAllRoutes(added);\n });\n\n useIsomorphicLayoutEffect(\n () => {\n if (isMountRenderPass.current) {\n updatePageloadTransaction({\n activeRootSpan: getActiveRootSpan(),\n location,\n routes,\n allRoutes: Array.from(allRoutes),\n config,\n });\n isMountRenderPass.current = false;\n } else {\n // Note: Component-based routes don't support lazy route tracking via lazyRouteTimeout\n // because React.lazy() loads happen at the component level, not the router level.\n // Use createBrowserRouter with patchRoutesOnNavigation for lazy route tracking.\n handleNavigation({\n location,\n routes,\n navigationType,\n version,\n allRoutes: Array.from(allRoutes),\n config,\n });\n }\n },\n // Re-run only on location/navigation changes, not children changes\n [location, navigationType],\n );\n\n return null;\n };\n\n // Reads the client config at *render* time (so wrapping before `Sentry.init()` still instruments once\n // the app renders). The routes are always rendered with the same component type; instrumentation lives in\n // the sibling `RouteReporter`, which mounts only when config exists - so config appearing after the first\n // paint toggles a null-rendering sibling instead of swapping the routes' type and remounting them.\n const SentryRoutes: React.FC<P> = (props: P) => {\n const config = getRouterConfig(getClient());\n return (\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 <Routes {...props} />\n }\n {/* Rendered after the routes so the reporter's layout effects run *after* the (descendant) route\n subtree has registered into `allRoutes`, matching the pre-refactor parent-after-child order. */}\n {config ? <RouteReporter config={config} routeChildren={props.children} /> : null}\n </>\n );\n };\n\n hoistNonReactStatics(SentryRoutes, Routes);\n\n // @ts-expect-error Setting more specific React Component typing for `R` generic above\n // will break advanced type inference done by react router params\n return SentryRoutes;\n}\n"],"names":["allRoutes"],"mappings":"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"}
@@ -3,8 +3,6 @@ import { DEBUG_BUILD } from '../debug-build.js';
3
3
  import { matchRouteManifest, stripBasenameFromPathname } from './route-manifest.js';
4
4
  import { SENTRY_OP } from '@sentry/conventions/attributes';
5
5
 
6
- let _matchRoutes;
7
- let _stripBasename = false;
8
6
  const _navigationContextStack = [];
9
7
  const MAX_CONTEXT_STACK_SIZE = 10;
10
8
  function setNavigationContext(targetPath, span) {
@@ -26,10 +24,6 @@ function getNavigationContext() {
26
24
  const length = _navigationContextStack.length;
27
25
  return length > 0 ? _navigationContextStack[length - 1] ?? null : null;
28
26
  }
29
- function initializeRouterUtils(matchRoutes, stripBasename = false) {
30
- _matchRoutes = matchRoutes;
31
- _stripBasename = stripBasename;
32
- }
33
27
  function pickPath(match) {
34
28
  return trimWildcard(match.route.path || "");
35
29
  }
@@ -54,8 +48,8 @@ function pathIsWildcardAndHasChildren(path, branch) {
54
48
  function routeIsDescendant(route) {
55
49
  return !!(!route.children && route.element && route.path?.endsWith("/*"));
56
50
  }
57
- function sendIndexPath(pathBuilder, pathname, basename) {
58
- const reconstructedPath = pathBuilder && pathBuilder.length > 0 ? pathBuilder : _stripBasename ? stripBasenameFromPathname(pathname, basename) : pathname;
51
+ function sendIndexPath(pathBuilder, pathname, basename, stripBasename) {
52
+ const reconstructedPath = pathBuilder && pathBuilder.length > 0 ? pathBuilder : stripBasename ? stripBasenameFromPathname(pathname, basename) : pathname;
59
53
  let formattedPath = (
60
54
  // If the path ends with a wildcard suffix, remove both the slash and the asterisk
61
55
  reconstructedPath.slice(-2) === "/*" ? reconstructedPath.slice(0, -2) : reconstructedPath
@@ -71,8 +65,8 @@ function getNumberOfUrlSegments(url) {
71
65
  function prefixWithSlash(path) {
72
66
  return path[0] === "/" ? path : `/${path}`;
73
67
  }
74
- function rebuildRoutePathFromAllRoutes(allRoutes, location) {
75
- const matchedRoutes = _matchRoutes(allRoutes, location);
68
+ function rebuildRoutePathFromAllRoutes(allRoutes, location, matchRoutes) {
69
+ const matchedRoutes = matchRoutes(allRoutes, location);
76
70
  if (!matchedRoutes || matchedRoutes.length === 0) {
77
71
  return "";
78
72
  }
@@ -89,7 +83,8 @@ function rebuildRoutePathFromAllRoutes(allRoutes, location) {
89
83
  allRoutes.filter((route) => route !== match.route),
90
84
  {
91
85
  pathname: strippedPath
92
- }
86
+ },
87
+ matchRoutes
93
88
  )
94
89
  )
95
90
  );
@@ -97,12 +92,12 @@ function rebuildRoutePathFromAllRoutes(allRoutes, location) {
97
92
  }
98
93
  return "";
99
94
  }
100
- function reconstructNameFromDescendantParent(location, allRoutes, currentName) {
95
+ function reconstructNameFromDescendantParent(location, allRoutes, currentName, matchRoutes) {
101
96
  const descendantParents = allRoutes.filter(routeIsDescendant);
102
97
  if (!descendantParents.length) {
103
98
  return void 0;
104
99
  }
105
- const matchedParents = _matchRoutes(descendantParents, location);
100
+ const matchedParents = matchRoutes(descendantParents, location);
106
101
  const parentMatch = matchedParents?.[matchedParents.length - 1];
107
102
  if (!parentMatch || !pickSplat(parentMatch)) {
108
103
  return void 0;
@@ -120,12 +115,13 @@ function reconstructNameFromDescendantParent(location, allRoutes, currentName) {
120
115
  const remainingPathname = stripBasenameFromPathname(location.pathname, prefixWithSlash(parentMatch.pathnameBase)) || "/";
121
116
  const remainingName = rebuildRoutePathFromAllRoutes(
122
117
  allRoutes.filter((route) => route !== parentMatch.route),
123
- { pathname: remainingPathname }
118
+ { pathname: remainingPathname },
119
+ matchRoutes
124
120
  );
125
121
  return remainingName ? prefixWithSlash(`${parentTemplate}${prefixWithSlash(remainingName)}`) : void 0;
126
122
  }
127
- function locationIsInsideDescendantRoute(location, routes) {
128
- const matchedRoutes = _matchRoutes(routes, location);
123
+ function locationIsInsideDescendantRoute(location, routes, matchRoutes) {
124
+ const matchedRoutes = matchRoutes(routes, location);
129
125
  if (matchedRoutes) {
130
126
  for (const match of matchedRoutes) {
131
127
  if (routeIsDescendant(match.route) && pickSplat(match)) {
@@ -135,15 +131,15 @@ function locationIsInsideDescendantRoute(location, routes) {
135
131
  }
136
132
  return false;
137
133
  }
138
- function getFallbackTransactionName(location, basename) {
139
- return _stripBasename ? stripBasenameFromPathname(location.pathname, basename) : location.pathname || "";
134
+ function getFallbackTransactionName(location, basename, stripBasename) {
135
+ return stripBasename ? stripBasenameFromPathname(location.pathname, basename) : location.pathname || "";
140
136
  }
141
- function getNormalizedName(routes, location, branches, basename = "") {
137
+ function getNormalizedName(routes, location, branches, basename = "", stripBasename = false) {
142
138
  if (!routes || routes.length === 0) {
143
- return [_stripBasename ? stripBasenameFromPathname(location.pathname, basename) : location.pathname, "url"];
139
+ return [stripBasename ? stripBasenameFromPathname(location.pathname, basename) : location.pathname, "url"];
144
140
  }
145
141
  if (!branches) {
146
- return [getFallbackTransactionName(location, basename), "url"];
142
+ return [getFallbackTransactionName(location, basename, stripBasename), "url"];
147
143
  }
148
144
  let pathBuilder = "";
149
145
  for (const branch of branches) {
@@ -152,7 +148,7 @@ function getNormalizedName(routes, location, branches, basename = "") {
152
148
  continue;
153
149
  }
154
150
  if (route.index) {
155
- return sendIndexPath(pathBuilder, branch.pathname, basename);
151
+ return sendIndexPath(pathBuilder, branch.pathname, basename, stripBasename);
156
152
  }
157
153
  const path = route.path;
158
154
  if (!path || pathIsWildcardAndHasChildren(path, branch)) {
@@ -164,33 +160,34 @@ function getNormalizedName(routes, location, branches, basename = "") {
164
160
  continue;
165
161
  }
166
162
  if (getNumberOfUrlSegments(pathBuilder) !== getNumberOfUrlSegments(branch.pathname) && !pathEndsWithWildcard(pathBuilder)) {
167
- return [(_stripBasename ? "" : basename) + newPath, "route"];
163
+ return [(stripBasename ? "" : basename) + newPath, "route"];
168
164
  }
169
165
  if (pathIsWildcardAndHasChildren(pathBuilder, branch)) {
170
166
  pathBuilder = pathBuilder.slice(0, -1);
171
167
  }
172
- return [(_stripBasename ? "" : basename) + pathBuilder, "route"];
168
+ return [(stripBasename ? "" : basename) + pathBuilder, "route"];
173
169
  }
174
- return [getFallbackTransactionName(location, basename), "url"];
170
+ return [getFallbackTransactionName(location, basename, stripBasename), "url"];
175
171
  }
176
- function resolveRouteNameAndSource(location, routes, allRoutes, branches, basename = "", lazyRouteManifest, enableAsyncRouteHandlers) {
172
+ function resolveRouteNameAndSource(location, routes, allRoutes, branches, config) {
173
+ const { matchRoutes, stripBasename, basename, lazyRouteManifest, enableAsyncRouteHandlers } = config;
177
174
  if (enableAsyncRouteHandlers && lazyRouteManifest && lazyRouteManifest.length > 0) {
178
175
  const manifestMatch = matchRouteManifest(location.pathname, lazyRouteManifest, basename);
179
176
  if (manifestMatch) {
180
- return [(_stripBasename ? "" : basename) + manifestMatch, "route"];
177
+ return [(stripBasename ? "" : basename) + manifestMatch, "route"];
181
178
  }
182
179
  }
183
180
  let name;
184
181
  let source = "url";
185
- const isInDescendantRoute = locationIsInsideDescendantRoute(location, allRoutes);
182
+ const isInDescendantRoute = locationIsInsideDescendantRoute(location, allRoutes, matchRoutes);
186
183
  if (isInDescendantRoute) {
187
- name = prefixWithSlash(rebuildRoutePathFromAllRoutes(allRoutes, location));
184
+ name = prefixWithSlash(rebuildRoutePathFromAllRoutes(allRoutes, location, matchRoutes));
188
185
  source = "route";
189
186
  }
190
187
  if (!isInDescendantRoute || !name) {
191
- [name, source] = getNormalizedName(routes, location, branches, basename);
188
+ [name, source] = getNormalizedName(routes, location, branches, basename, stripBasename);
192
189
  }
193
- const anchoredName = reconstructNameFromDescendantParent(location, allRoutes, name);
190
+ const anchoredName = reconstructNameFromDescendantParent(location, allRoutes, name, matchRoutes);
194
191
  if (anchoredName) {
195
192
  return [anchoredName, "route"];
196
193
  }
@@ -206,5 +203,5 @@ function getActiveRootSpan() {
206
203
  return op === "navigation" || op === "pageload" ? rootSpan : void 0;
207
204
  }
208
205
 
209
- export { clearNavigationContext, getActiveRootSpan, getNavigationContext, getNormalizedName, getNumberOfUrlSegments, initializeRouterUtils, locationIsInsideDescendantRoute, pathEndsWithWildcard, pathIsWildcardAndHasChildren, prefixWithSlash, rebuildRoutePathFromAllRoutes, resolveRouteNameAndSource, routeIsDescendant, setNavigationContext, transactionNameHasWildcard };
206
+ export { clearNavigationContext, getActiveRootSpan, getNavigationContext, getNormalizedName, getNumberOfUrlSegments, locationIsInsideDescendantRoute, pathEndsWithWildcard, pathIsWildcardAndHasChildren, prefixWithSlash, rebuildRoutePathFromAllRoutes, resolveRouteNameAndSource, routeIsDescendant, setNavigationContext, transactionNameHasWildcard };
210
207
  //# sourceMappingURL=utils.js.map