@sentry/react 10.25.0 → 10.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/reactrouter-compat-utils/instrumentation.js +521 -228
- package/build/cjs/reactrouter-compat-utils/instrumentation.js.map +1 -1
- package/build/cjs/reactrouter-compat-utils/utils.js +57 -42
- package/build/cjs/reactrouter-compat-utils/utils.js.map +1 -1
- package/build/esm/package.json +1 -1
- package/build/esm/reactrouter-compat-utils/instrumentation.js +521 -230
- package/build/esm/reactrouter-compat-utils/instrumentation.js.map +1 -1
- package/build/esm/reactrouter-compat-utils/utils.js +57 -43
- package/build/esm/reactrouter-compat-utils/utils.js.map +1 -1
- package/build/types/reactrouter-compat-utils/index.d.ts +1 -1
- package/build/types/reactrouter-compat-utils/index.d.ts.map +1 -1
- package/build/types/reactrouter-compat-utils/instrumentation.d.ts +35 -4
- package/build/types/reactrouter-compat-utils/instrumentation.d.ts.map +1 -1
- package/build/types/reactrouter-compat-utils/utils.d.ts +2 -0
- package/build/types/reactrouter-compat-utils/utils.d.ts.map +1 -1
- package/build/types-ts3.8/reactrouter-compat-utils/index.d.ts +1 -1
- package/build/types-ts3.8/reactrouter-compat-utils/instrumentation.d.ts +35 -4
- package/build/types-ts3.8/reactrouter-compat-utils/utils.d.ts +2 -0
- package/package.json +3 -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 getActiveSpan,\n getClient,\n getCurrentScope,\n getRootSpan,\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n spanToJSON,\n} from '@sentry/core';\nimport * 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 { initializeRouterUtils, resolveRouteNameAndSource } from './utils';\n\nlet _useEffect: UseEffect;\nlet _useLocation: UseLocation;\nlet _useNavigationType: UseNavigationType;\nlet _createRoutesFromChildren: CreateRoutesFromChildren;\nlet _matchRoutes: MatchRoutes;\nlet _enableAsyncRouteHandlers: boolean = false;\n\nconst CLIENTS_WITH_INSTRUMENT_NAVIGATION = new WeakSet<Client>();\n\n/**\n * Adds resolved routes as children to the parent route.\n * Prevents duplicate routes by checking if they already exist.\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\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\ntype V6CompatibleVersion = '6' | '7';\n\n// Keeping as a global variable for cross-usage in multiple functions\n// only exported for testing purposes\nexport const allRoutes = new Set<RouteObject>();\n\n/**\n * Processes resolved routes by adding them to allRoutes and checking for nested async handlers.\n */\nexport function processResolvedRoutes(\n resolvedRoutes: RouteObject[],\n parentRoute?: RouteObject,\n currentLocation: Location | null = null,\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 // After processing lazy routes, check if we need to update an active transaction\n const activeRootSpan = getActiveRootSpan();\n if (activeRootSpan) {\n const spanOp = spanToJSON(activeRootSpan).op;\n\n // Try to use the provided location first, then fall back to global window location if needed\n let location = currentLocation;\n if (!location) {\n if (typeof WINDOW !== 'undefined') {\n const globalLocation = WINDOW.location;\n if (globalLocation) {\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,\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(activeRootSpan, 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 // Check if this span has already been named to avoid multiple updates\n // But allow updates if this is a forced update (e.g., when lazy routes are loaded)\n const hasBeenNamed =\n !forceUpdate && (activeRootSpan as { __sentry_navigation_name_set__?: boolean })?.__sentry_navigation_name_set__;\n\n if (!hasBeenNamed) {\n // Get fresh branches for the current location with all loaded routes\n const currentBranches = matchRoutes(allRoutes, location);\n const [name, source] = resolveRouteNameAndSource(\n location,\n allRoutes,\n allRoutes,\n (currentBranches as RouteMatch[]) || [],\n '',\n );\n\n // Only update if we have a valid name and the span hasn't finished\n const spanJson = spanToJSON(activeRootSpan);\n if (name && !spanJson.timestamp) {\n activeRootSpan.updateName(name);\n activeRootSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, source);\n\n // Mark this span as having its name set to prevent future updates\n addNonEnumerableProperty(\n activeRootSpan as { __sentry_navigation_name_set__?: boolean },\n '__sentry_navigation_name_set__',\n true,\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 `reactRouterV${version}Instrumentation was unable to wrap the \\`createRouter\\` function because of one or more missing parameters.`,\n );\n\n return createRouterFunction;\n }\n\n return function (routes: RouteObject[], opts?: Record<string, unknown> & { basename?: string }): TRouter {\n addRoutesToAllRoutes(routes);\n\n // Check for async handlers that might contain sub-route declarations (only if enabled)\n if (_enableAsyncRouteHandlers) {\n for (const route of routes) {\n checkRouteForAsyncHandler(route, processResolvedRoutes);\n }\n }\n\n // Wrap patchRoutesOnNavigation to detect when lazy routes are loaded\n const wrappedOpts = wrapPatchRoutesOnNavigation(opts);\n\n const router = createRouterFunction(routes, wrappedOpts);\n const basename = opts?.basename;\n\n const activeRootSpan = getActiveRootSpan();\n\n // Track whether we've completed the initial pageload to properly distinguish\n // between POPs that occur during pageload vs. legitimate back/forward navigation.\n let isInitialPageloadComplete = false;\n let hasSeenPageloadSpan = !!activeRootSpan && spanToJSON(activeRootSpan).op === 'pageload';\n let hasSeenPopAfterPageload = false;\n\n // The initial load ends when `createBrowserRouter` is called.\n // This is the earliest convenient time to update the transaction name.\n // Callbacks to `router.subscribe` are not called for the initial load.\n if (router.state.historyAction === 'POP' && activeRootSpan) {\n updatePageloadTransaction({\n activeRootSpan,\n location: router.state.location,\n routes,\n basename,\n allRoutes: Array.from(allRoutes),\n });\n }\n\n router.subscribe((state: RouterState) => {\n // Track pageload completion to distinguish POPs during pageload from legitimate back/forward navigation\n if (!isInitialPageloadComplete) {\n const currentRootSpan = getActiveRootSpan();\n const isCurrentlyInPageload = currentRootSpan && spanToJSON(currentRootSpan).op === 'pageload';\n\n if (isCurrentlyInPageload) {\n hasSeenPageloadSpan = true;\n } else if (hasSeenPageloadSpan) {\n // Pageload span was active but is now gone - pageload has completed\n if (state.historyAction === 'POP' && !hasSeenPopAfterPageload) {\n // Pageload ended: ignore the first POP after pageload\n hasSeenPopAfterPageload = true;\n } else {\n // Pageload ended: either non-POP action or subsequent POP\n isInitialPageloadComplete = true;\n }\n }\n // If we haven't seen a pageload span yet, keep waiting (don't mark as complete)\n }\n\n const shouldHandleNavigation =\n state.historyAction === 'PUSH' || (state.historyAction === 'POP' && isInitialPageloadComplete);\n\n if (shouldHandleNavigation) {\n const navigationHandler = (): void => {\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 // Wait for the next render if loading an unsettled route\n if (state.navigation.state !== 'idle') {\n requestAnimationFrame(navigationHandler);\n } else {\n navigationHandler();\n }\n }\n });\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 `reactRouterV${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 // Check for async handlers that might contain sub-route declarations (only if enabled)\n if (_enableAsyncRouteHandlers) {\n for (const route of routes) {\n checkRouteForAsyncHandler(route, processResolvedRoutes);\n }\n }\n\n // Wrap patchRoutesOnNavigation to detect when lazy routes are loaded\n const wrappedOpts = wrapPatchRoutesOnNavigation(opts, true);\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 && initialEntries.length === 1;\n const hasIndexedEntry = initialIndex !== undefined && initialEntries && 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 // Track whether we've completed the initial pageload to properly distinguish\n // between POPs that occur during pageload vs. legitimate back/forward navigation.\n let isInitialPageloadComplete = false;\n let hasSeenPageloadSpan = !!memoryActiveRootSpan && spanToJSON(memoryActiveRootSpan).op === 'pageload';\n let hasSeenPopAfterPageload = false;\n\n router.subscribe((state: RouterState) => {\n // Track pageload completion to distinguish POPs during pageload from legitimate back/forward navigation\n if (!isInitialPageloadComplete) {\n const currentRootSpan = getActiveRootSpan();\n const isCurrentlyInPageload = currentRootSpan && spanToJSON(currentRootSpan).op === 'pageload';\n\n if (isCurrentlyInPageload) {\n hasSeenPageloadSpan = true;\n } else if (hasSeenPageloadSpan) {\n // Pageload span was active but is now gone - pageload has completed\n if (state.historyAction === 'POP' && !hasSeenPopAfterPageload) {\n // Pageload ended: ignore the first POP after pageload\n hasSeenPopAfterPageload = true;\n } else {\n // Pageload ended: either non-POP action or subsequent POP\n isInitialPageloadComplete = true;\n }\n }\n // If we haven't seen a pageload span yet, keep waiting (don't mark as complete)\n }\n\n const location = state.location;\n\n const shouldHandleNavigation =\n state.historyAction === 'PUSH' || (state.historyAction === 'POP' && isInitialPageloadComplete);\n\n if (shouldHandleNavigation) {\n const navigationHandler = (): void => {\n handleNavigation({\n location,\n routes,\n navigationType: state.historyAction,\n version,\n basename,\n allRoutes: Array.from(allRoutes),\n });\n };\n\n // Wait for the next render if loading an unsettled route\n if (state.navigation.state !== 'idle') {\n requestAnimationFrame(navigationHandler);\n } else {\n navigationHandler();\n }\n }\n });\n\n return router;\n };\n}\n\n/**\n * Creates a browser tracing integration that can be used with all React Router v6 compatible versions.\n */\nexport function createReactRouterV6CompatibleTracingIntegration(\n options: Parameters<typeof browserTracingIntegration>[0] & ReactRouterOptions,\n version: V6CompatibleVersion,\n): Integration {\n const integration = browserTracingIntegration({ ...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 } = options;\n\n return {\n ...integration,\n setup(client) {\n integration.setup(client);\n\n _useEffect = useEffect;\n _useLocation = useLocation;\n _useNavigationType = useNavigationType;\n _matchRoutes = matchRoutes;\n _createRoutesFromChildren = createRoutesFromChildren;\n _enableAsyncRouteHandlers = enableAsyncRouteHandlers;\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 name: initPathName,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'url',\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'pageload',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: `auto.pageload.react.reactrouter_v${version}`,\n },\n });\n }\n\n if (instrumentNavigation) {\n CLIENTS_WITH_INSTRUMENT_NAVIGATION.add(client);\n }\n },\n };\n}\n\nexport function createV6CompatibleWrapUseRoutes(origUseRoutes: UseRoutes, version: V6CompatibleVersion): UseRoutes {\n if (!_useEffect || !_useLocation || !_useNavigationType || !_matchRoutes) {\n DEBUG_BUILD &&\n 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 _useEffect(() => {\n const normalizedLocation =\n typeof stableLocationParam === 'string' ? { pathname: stableLocationParam } : stableLocationParam;\n\n if (isMountRenderPass.current) {\n addRoutesToAllRoutes(routes);\n\n updatePageloadTransaction({\n activeRootSpan: getActiveRootSpan(),\n location: normalizedLocation,\n routes,\n allRoutes: Array.from(allRoutes),\n });\n isMountRenderPass.current = false;\n } else {\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}\n\nfunction wrapPatchRoutesOnNavigation(\n opts: Record<string, unknown> | undefined,\n isMemoryRouter = false,\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 // For browser router, wrap the patch function to update span during patching\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 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 const activeRootSpan = getActiveRootSpan();\n if (activeRootSpan && (spanToJSON(activeRootSpan) as { op?: string }).op === 'navigation') {\n updateNavigationSpan(\n activeRootSpan,\n { pathname: targetPath, search: '', hash: '', state: null, key: 'default' },\n Array.from(allRoutes),\n true, // forceUpdate = true since we're loading lazy routes\n _matchRoutes,\n );\n }\n return originalPatch(routeId, children);\n };\n }\n }\n\n const result = await originalPatchRoutes(args);\n\n // Update navigation span after routes are patched\n const activeRootSpan = getActiveRootSpan();\n if (activeRootSpan && (spanToJSON(activeRootSpan) as { op?: string }).op === 'navigation') {\n // Determine pathname based on router type\n let pathname: string | undefined;\n if (isMemoryRouter) {\n // For memory routers, only use targetPath\n pathname = targetPath;\n } else {\n // For browser routers, use targetPath or fall back to window.location\n pathname = targetPath || WINDOW.location?.pathname;\n }\n\n if (pathname) {\n updateNavigationSpan(\n activeRootSpan,\n { pathname, search: '', hash: '', state: null, key: 'default' },\n Array.from(allRoutes),\n false, // forceUpdate = false since this is after lazy routes are loaded\n _matchRoutes,\n );\n }\n }\n\n return result;\n },\n };\n}\n\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(routes, location, basename);\n\n const client = getClient();\n if (!client || !CLIENTS_WITH_INSTRUMENT_NAVIGATION.has(client)) {\n return;\n }\n\n // Avoid starting a navigation span on initial load when a pageload root span is active.\n // This commonly happens when lazy routes resolve during the first render and React Router emits a POP.\n const activeRootSpan = getActiveRootSpan();\n if (activeRootSpan && spanToJSON(activeRootSpan).op === 'pageload' && navigationType === 'POP') {\n return;\n }\n\n if ((navigationType === 'PUSH' || navigationType === 'POP') && branches) {\n const [name, source] = resolveRouteNameAndSource(\n location,\n routes,\n allRoutes || routes,\n branches as RouteMatch[],\n basename,\n );\n\n const activeSpan = getActiveSpan();\n const spanJson = activeSpan && spanToJSON(activeSpan);\n const isAlreadyInNavigationSpan = spanJson?.op === 'navigation';\n\n // Cross usage can result in multiple navigation spans being created without this check\n if (!isAlreadyInNavigationSpan) {\n const navigationSpan = startBrowserTracingNavigationSpan(client, {\n name,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: source,\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'navigation',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: `auto.navigation.react.reactrouter_v${version}`,\n },\n });\n\n // Patch navigation span to handle early cancellation (e.g., document.hidden)\n if (navigationSpan) {\n patchNavigationSpanEnd(navigationSpan, location, routes, basename, allRoutes);\n }\n }\n }\n}\n\n/* Only exported for testing purposes */\nexport function addRoutesToAllRoutes(routes: RouteObject[]): void {\n routes.forEach(route => {\n const extractedChildRoutes = getChildRoutesRecursively(route);\n\n extractedChildRoutes.forEach(r => {\n allRoutes.add(r);\n });\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(location, routes, allRoutes || routes, branches, basename);\n\n getCurrentScope().setTransactionName(name || '/');\n\n if (activeRootSpan) {\n activeRootSpan.updateName(name);\n activeRootSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, source);\n\n // Patch span.end() to ensure we update the name one last time before the span is sent\n patchPageloadSpanEnd(activeRootSpan, location, routes, basename, allRoutes);\n }\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 _allRoutes: RouteObject[] | 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 const originalEnd = span.end.bind(span);\n\n span.end = function patchedEnd(...args) {\n try {\n // Only update if the span source is not already 'route' (i.e., it hasn't been parameterized yet)\n const spanJson = spanToJSON(span);\n const currentSource = spanJson.data?.[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE];\n if (currentSource !== 'route') {\n // Last chance to update the transaction name with the latest route info\n // Use the live global allRoutes Set to include any lazy routes loaded after patching\n const currentAllRoutes = Array.from(allRoutes);\n const branches = _matchRoutes(\n currentAllRoutes.length > 0 ? currentAllRoutes : routes,\n location,\n basename,\n ) as unknown as RouteMatch[];\n\n if (branches) {\n const [name, source] = resolveRouteNameAndSource(\n location,\n routes,\n currentAllRoutes.length > 0 ? currentAllRoutes : routes,\n branches,\n basename,\n );\n\n // Only update if we have a valid name\n if (name && (spanType === 'pageload' || !spanJson.timestamp)) {\n span.updateName(name);\n span.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, source);\n }\n }\n }\n } catch (error) {\n // Silently catch errors to ensure span.end() is always called\n DEBUG_BUILD && debug.warn(`Error updating span details before ending: ${error}`);\n }\n\n return originalEnd(...args);\n };\n\n // Mark this span as having its end() method patched to prevent duplicate patching\n addNonEnumerableProperty(span as unknown as Record<string, boolean>, patchedPropertyName, true);\n}\n\nfunction patchPageloadSpanEnd(\n span: Span,\n location: Location,\n routes: RouteObject[],\n basename: string | undefined,\n _allRoutes: RouteObject[] | undefined,\n): void {\n patchSpanEnd(span, location, routes, basename, _allRoutes, 'pageload');\n}\n\nfunction patchNavigationSpanEnd(\n span: Span,\n location: Location,\n routes: RouteObject[],\n basename: string | undefined,\n _allRoutes: RouteObject[] | undefined,\n): void {\n patchSpanEnd(span, location, routes, basename, _allRoutes, 'navigation');\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 _useEffect(\n () => {\n const routes = _createRoutesFromChildren(props.children) as RouteObject[];\n\n if (isMountRenderPass.current) {\n addRoutesToAllRoutes(routes);\n\n updatePageloadTransaction({\n activeRootSpan: getActiveRootSpan(),\n location,\n routes,\n allRoutes: Array.from(allRoutes),\n });\n isMountRenderPass.current = false;\n } else {\n handleNavigation({ location, routes, navigationType, version, allRoutes: Array.from(allRoutes) });\n }\n },\n // `props.children` is purposely not included in the dependency array, because we do not want to re-run this effect\n // when the children change. We only want to start transactions when the location or navigation type change.\n [location, navigationType],\n );\n\n // @ts-expect-error Setting more specific React Component typing for `R` generic above\n // will break advanced type inference done by react router params\n return <Routes {...props} />;\n };\n\n hoistNonReactStatics(SentryRoutes, Routes);\n\n // @ts-expect-error Setting more specific React Component typing for `R` generic above\n // will break advanced type inference done by react router params\n return SentryRoutes;\n}\n\nfunction getActiveRootSpan(): Span | undefined {\n const span = getActiveSpan();\n const rootSpan = span ? getRootSpan(span) : undefined;\n\n if (!rootSpan) {\n return undefined;\n }\n\n const op = spanToJSON(rootSpan).op;\n\n // Only use this root span if it is a pageload or navigation span\n return op === 'navigation' || op === 'pageload' ? rootSpan : undefined;\n}\n"],"names":[],"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 getActiveSpan,\n getClient,\n getCurrentScope,\n getRootSpan,\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n spanToJSON,\n} from '@sentry/core';\nimport * 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 { initializeRouterUtils, resolveRouteNameAndSource, transactionNameHasWildcard } from './utils';\n\nlet _useEffect: UseEffect;\nlet _useLocation: UseLocation;\nlet _useNavigationType: UseNavigationType;\nlet _createRoutesFromChildren: CreateRoutesFromChildren;\nlet _matchRoutes: MatchRoutes;\n\nlet _enableAsyncRouteHandlers: boolean = false;\nlet _lazyRouteTimeout = 3000;\n\nconst CLIENTS_WITH_INSTRUMENT_NAVIGATION = new WeakSet<Client>();\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/**\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\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 promise.finally(() => {\n const currentPromises = pendingLazyRouteLoads.get(span);\n if (currentPromises) {\n currentPromises.delete(promise);\n }\n });\n}\n\n/**\n * Processes resolved routes by adding them to allRoutes and checking for nested async handlers.\n */\nexport function processResolvedRoutes(\n resolvedRoutes: RouteObject[],\n parentRoute?: RouteObject,\n currentLocation: Location | null = null,\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 // After processing lazy routes, check if we need to update an active transaction\n const activeRootSpan = getActiveRootSpan();\n if (activeRootSpan) {\n const spanOp = spanToJSON(activeRootSpan).op;\n\n // Try to use the provided location first, then fall back to global window location if needed\n let location = currentLocation;\n if (!location) {\n if (typeof WINDOW !== 'undefined') {\n const globalLocation = WINDOW.location;\n if (globalLocation) {\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,\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(activeRootSpan, 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 spanJson = spanToJSON(activeRootSpan);\n const currentName = spanJson.description;\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 && !spanJson.timestamp) {\n const currentBranches = matchRoutes(allRoutes, location);\n const [name, source] = resolveRouteNameAndSource(\n location,\n allRoutes,\n allRoutes,\n (currentBranches as RouteMatch[]) || [],\n '',\n );\n\n const currentSource = spanJson.data?.[SEMANTIC_ATTRIBUTE_SENTRY_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 activeRootSpan.updateName(name);\n activeRootSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, source);\n\n // Only mark as finalized for non-wildcard route names (allows URL→route upgrades).\n if (!transactionNameHasWildcard(name) && source === 'route') {\n addNonEnumerableProperty(\n activeRootSpan as { __sentry_navigation_name_set__?: boolean },\n '__sentry_navigation_name_set__',\n true,\n );\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).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).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 `reactRouterV${version}Instrumentation was unable to wrap the \\`createRouter\\` function because of one or more missing parameters.`,\n );\n\n return createRouterFunction;\n }\n\n 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 const wrappedOpts = wrapPatchRoutesOnNavigation(opts);\n const router = createRouterFunction(routes, wrappedOpts);\n const basename = opts?.basename;\n const activeRootSpan = getActiveRootSpan();\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 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 `reactRouterV${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 const wrappedOpts = wrapPatchRoutesOnNavigation(opts, true);\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 && initialEntries.length === 1;\n const hasIndexedEntry = initialIndex !== undefined && initialEntries && 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 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 } = 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\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 name: initPathName,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'url',\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'pageload',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: `auto.pageload.react.reactrouter_v${version}`,\n },\n });\n }\n\n if (instrumentNavigation) {\n CLIENTS_WITH_INSTRUMENT_NAVIGATION.add(client);\n }\n },\n };\n}\n\nexport function createV6CompatibleWrapUseRoutes(origUseRoutes: UseRoutes, version: V6CompatibleVersion): UseRoutes {\n if (!_useEffect || !_useLocation || !_useNavigationType || !_matchRoutes) {\n DEBUG_BUILD &&\n 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 _useEffect(() => {\n const normalizedLocation =\n typeof stableLocationParam === 'string' ? { pathname: stableLocationParam } : stableLocationParam;\n\n if (isMountRenderPass.current) {\n addRoutesToAllRoutes(routes);\n\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}\n\nfunction wrapPatchRoutesOnNavigation(\n opts: Record<string, unknown> | undefined,\n isMemoryRouter = false,\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 const activeRootSpan = getActiveRootSpan();\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 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 const currentActiveRootSpan = getActiveRootSpan();\n if (currentActiveRootSpan && (spanToJSON(currentActiveRootSpan) as { op?: string }).op === 'navigation') {\n updateNavigationSpan(\n currentActiveRootSpan,\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 const result = await originalPatchRoutes(args);\n\n const currentActiveRootSpan = getActiveRootSpan();\n if (currentActiveRootSpan && (spanToJSON(currentActiveRootSpan) as { op?: string }).op === 'navigation') {\n const pathname = isMemoryRouter ? targetPath : targetPath || WINDOW.location?.pathname;\n\n if (pathname) {\n updateNavigationSpan(\n currentActiveRootSpan,\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).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 );\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).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 trackedNav.span.updateName(name);\n trackedNav.span.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, source as 'route' | 'url' | 'custom');\n addNonEnumerableProperty(\n trackedNav.span as { __sentry_navigation_name_set__?: boolean },\n '__sentry_navigation_name_set__',\n true,\n );\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 name: placeholderEntry.routeName, // Use placeholder's routeName in case it was updated\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: source,\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'navigation',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: `auto.navigation.react.reactrouter_v${version}`,\n },\n });\n } 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, allRoutes, '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[]): void {\n routes.forEach(route => {\n const extractedChildRoutes = getChildRoutesRecursively(route);\n\n extractedChildRoutes.forEach(r => {\n allRoutes.add(r);\n });\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 );\n\n getCurrentScope().setTransactionName(name || '/');\n\n if (activeRootSpan) {\n activeRootSpan.updateName(name);\n activeRootSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, source);\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, allRoutes, 'pageload');\n }\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.data?.[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE];\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(location, routesToUse, routesToUse, branches, basename);\n\n const isImprovement = shouldUpdateWildcardSpanName(currentName, currentSource, name, source, true);\n const spanNotEnded = spanType === 'pageload' || !spanJson.timestamp;\n\n if (isImprovement && spanNotEnded) {\n span.updateName(name);\n span.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, source);\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 _allRoutes: RouteObject[] | 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 // Use the passed route context, or fall back to global Set\n const allRoutesSet = _allRoutes ? new Set(_allRoutes) : allRoutes;\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.description;\n const currentSource = spanJson.data?.[SEMANTIC_ATTRIBUTE_SENTRY_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 && trackedNav.span === span) {\n activeNavigationSpans.delete(client);\n }\n }\n };\n\n const pendingPromises = pendingLazyRouteLoads.get(span);\n // Wait for lazy routes if:\n // 1. There are pending promises 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 shouldWaitForLazyRoutes =\n pendingPromises &&\n pendingPromises.size > 0 &&\n currentName &&\n (transactionNameHasWildcard(currentName) || currentSource !== 'route');\n\n if (shouldWaitForLazyRoutes) {\n if (_lazyRouteTimeout === 0) {\n tryUpdateSpanNameBeforeEnd(span, spanJson, currentName, location, routes, basename, spanType, allRoutesSet);\n cleanupNavigationSpan();\n originalEnd(endTimestamp);\n return;\n }\n\n const allSettled = Promise.allSettled(pendingPromises).then(() => {});\n const waitPromise =\n _lazyRouteTimeout === Infinity\n ? allSettled\n : Promise.race([allSettled, new Promise<void>(r => setTimeout(r, _lazyRouteTimeout))]);\n\n waitPromise\n .then(() => {\n const updatedSpanJson = spanToJSON(span);\n tryUpdateSpanNameBeforeEnd(\n span,\n updatedSpanJson,\n updatedSpanJson.description,\n location,\n routes,\n basename,\n spanType,\n allRoutesSet,\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, allRoutesSet);\n cleanupNavigationSpan();\n originalEnd(endTimestamp);\n };\n\n addNonEnumerableProperty(span as unknown as Record<string, boolean>, 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 _useEffect(\n () => {\n const routes = _createRoutesFromChildren(props.children) as RouteObject[];\n\n if (isMountRenderPass.current) {\n addRoutesToAllRoutes(routes);\n\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\nfunction getActiveRootSpan(): Span | undefined {\n const span = getActiveSpan();\n const rootSpan = span ? getRootSpan(span) : undefined;\n\n if (!rootSpan) {\n return undefined;\n }\n\n const op = spanToJSON(rootSpan).op;\n\n // Only use this root span if it is a pageload or navigation span\n return op === 'navigation' || op === 'pageload' ? rootSpan : undefined;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -35,6 +35,11 @@ function pathEndsWithWildcard(path) {
|
|
|
35
35
|
return path.endsWith('*');
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
+
/** Checks if transaction name has wildcard (/* or ends with *). */
|
|
39
|
+
function transactionNameHasWildcard(name) {
|
|
40
|
+
return name.includes('/*') || name.endsWith('*');
|
|
41
|
+
}
|
|
42
|
+
|
|
38
43
|
/**
|
|
39
44
|
* Checks if a path is a wildcard and has child routes.
|
|
40
45
|
*/
|
|
@@ -168,6 +173,13 @@ function locationIsInsideDescendantRoute(location, routes) {
|
|
|
168
173
|
return false;
|
|
169
174
|
}
|
|
170
175
|
|
|
176
|
+
/**
|
|
177
|
+
* Returns a fallback transaction name from location pathname.
|
|
178
|
+
*/
|
|
179
|
+
function getFallbackTransactionName(location, basename) {
|
|
180
|
+
return _stripBasename ? stripBasenameFromPathname(location.pathname, basename) : location.pathname || '';
|
|
181
|
+
}
|
|
182
|
+
|
|
171
183
|
/**
|
|
172
184
|
* Gets a normalized route name and transaction source from the current routes and location.
|
|
173
185
|
*/
|
|
@@ -181,53 +193,55 @@ function getNormalizedName(
|
|
|
181
193
|
return [_stripBasename ? stripBasenameFromPathname(location.pathname, basename) : location.pathname, 'url'];
|
|
182
194
|
}
|
|
183
195
|
|
|
196
|
+
if (!branches) {
|
|
197
|
+
return [getFallbackTransactionName(location, basename), 'url'];
|
|
198
|
+
}
|
|
199
|
+
|
|
184
200
|
let pathBuilder = '';
|
|
185
201
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
!pathEndsWithWildcard(pathBuilder)
|
|
210
|
-
) {
|
|
211
|
-
return [(_stripBasename ? '' : basename) + newPath, 'route'];
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
// if the last character of the pathbuilder is a wildcard and there are children, remove the wildcard
|
|
215
|
-
if (pathIsWildcardAndHasChildren(pathBuilder, branch)) {
|
|
216
|
-
pathBuilder = pathBuilder.slice(0, -1);
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
return [(_stripBasename ? '' : basename) + pathBuilder, 'route'];
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
}
|
|
202
|
+
for (const branch of branches) {
|
|
203
|
+
const route = branch.route;
|
|
204
|
+
if (!route) {
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// Early return for index routes
|
|
209
|
+
if (route.index) {
|
|
210
|
+
return sendIndexPath(pathBuilder, branch.pathname, basename);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
const path = route.path;
|
|
214
|
+
if (!path || pathIsWildcardAndHasChildren(path, branch)) {
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// Build the route path
|
|
219
|
+
const newPath = path[0] === '/' || pathBuilder[pathBuilder.length - 1] === '/' ? path : `/${path}`;
|
|
220
|
+
pathBuilder = trimSlash(pathBuilder) + prefixWithSlash(newPath);
|
|
221
|
+
|
|
222
|
+
// Check if this path matches the current location
|
|
223
|
+
if (trimSlash(location.pathname) !== trimSlash(basename + branch.pathname)) {
|
|
224
|
+
continue;
|
|
223
225
|
}
|
|
224
|
-
}
|
|
225
226
|
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
227
|
+
// Check if this is a parameterized route like /stores/:storeId/products/:productId
|
|
228
|
+
if (
|
|
229
|
+
getNumberOfUrlSegments(pathBuilder) !== getNumberOfUrlSegments(branch.pathname) &&
|
|
230
|
+
!pathEndsWithWildcard(pathBuilder)
|
|
231
|
+
) {
|
|
232
|
+
return [(_stripBasename ? '' : basename) + newPath, 'route'];
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// Handle wildcard routes with children - strip trailing wildcard
|
|
236
|
+
if (pathIsWildcardAndHasChildren(pathBuilder, branch)) {
|
|
237
|
+
pathBuilder = pathBuilder.slice(0, -1);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
return [(_stripBasename ? '' : basename) + pathBuilder, 'route'];
|
|
241
|
+
}
|
|
229
242
|
|
|
230
|
-
|
|
243
|
+
// Fallback when no matching route found
|
|
244
|
+
return [getFallbackTransactionName(location, basename), 'url'];
|
|
231
245
|
}
|
|
232
246
|
|
|
233
247
|
/**
|
|
@@ -257,5 +271,5 @@ function resolveRouteNameAndSource(
|
|
|
257
271
|
return [name || location.pathname, source];
|
|
258
272
|
}
|
|
259
273
|
|
|
260
|
-
export { getNormalizedName, getNumberOfUrlSegments, initializeRouterUtils, locationIsInsideDescendantRoute, pathEndsWithWildcard, pathIsWildcardAndHasChildren, prefixWithSlash, rebuildRoutePathFromAllRoutes, resolveRouteNameAndSource, routeIsDescendant };
|
|
274
|
+
export { getNormalizedName, getNumberOfUrlSegments, initializeRouterUtils, locationIsInsideDescendantRoute, pathEndsWithWildcard, pathIsWildcardAndHasChildren, prefixWithSlash, rebuildRoutePathFromAllRoutes, resolveRouteNameAndSource, routeIsDescendant, transactionNameHasWildcard };
|
|
261
275
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../../../src/reactrouter-compat-utils/utils.ts"],"sourcesContent":["import type { TransactionSource } from '@sentry/core';\nimport type { Location, MatchRoutes, RouteMatch, RouteObject } from '../types';\n\n// Global variables that these utilities depend on\nlet _matchRoutes: MatchRoutes;\nlet _stripBasename: boolean = false;\n\n/**\n * Initialize function to set dependencies that the router utilities need.\n * Must be called before using any of the exported utility functions.\n */\nexport function initializeRouterUtils(matchRoutes: MatchRoutes, stripBasename: boolean = false): void {\n _matchRoutes = matchRoutes;\n _stripBasename = stripBasename;\n}\n\n// Helper functions\nfunction pickPath(match: RouteMatch): string {\n return trimWildcard(match.route.path || '');\n}\n\nfunction pickSplat(match: RouteMatch): string {\n return match.params['*'] || '';\n}\n\nfunction trimWildcard(path: string): string {\n return path[path.length - 1] === '*' ? path.slice(0, -1) : path;\n}\n\nfunction trimSlash(path: string): string {\n return path[path.length - 1] === '/' ? path.slice(0, -1) : path;\n}\n\n/**\n * Checks if a path ends with a wildcard character (*).\n */\nexport function pathEndsWithWildcard(path: string): boolean {\n return path.endsWith('*');\n}\n\n/**\n * Checks if a path is a wildcard and has child routes.\n */\nexport function pathIsWildcardAndHasChildren(path: string, branch: RouteMatch<string>): boolean {\n return (pathEndsWithWildcard(path) && !!branch.route.children?.length) || false;\n}\n\n/** Check if route is in descendant route (<Routes> within <Routes>) */\nexport function routeIsDescendant(route: RouteObject): boolean {\n return !!(!route.children && route.element && route.path?.endsWith('/*'));\n}\n\nfunction sendIndexPath(pathBuilder: string, pathname: string, basename: string): [string, TransactionSource] {\n const reconstructedPath =\n pathBuilder && pathBuilder.length > 0\n ? pathBuilder\n : _stripBasename\n ? stripBasenameFromPathname(pathname, basename)\n : pathname;\n\n let formattedPath =\n // If the path ends with a wildcard suffix, remove both the slash and the asterisk\n reconstructedPath.slice(-2) === '/*' ? reconstructedPath.slice(0, -2) : reconstructedPath;\n\n // If the path ends with a slash, remove it (but keep single '/')\n if (formattedPath.length > 1 && formattedPath[formattedPath.length - 1] === '/') {\n formattedPath = formattedPath.slice(0, -1);\n }\n\n return [formattedPath, 'route'];\n}\n\n/**\n * Returns the number of URL segments in the given URL string.\n * Splits at '/' or '\\/' to handle regex URLs correctly.\n *\n * @param url - The URL string to segment.\n * @returns The number of segments in the URL.\n */\nexport function getNumberOfUrlSegments(url: string): number {\n // split at '/' or at '\\/' to split regex urls correctly\n return url.split(/\\\\?\\//).filter(s => s.length > 0 && s !== ',').length;\n}\n\n/**\n * Strip the basename from a pathname if exists.\n *\n * Vendored and modified from `react-router`\n * https://github.com/remix-run/react-router/blob/462bb712156a3f739d6139a0f14810b76b002df6/packages/router/utils.ts#L1038\n */\nfunction stripBasenameFromPathname(pathname: string, basename: string): string {\n if (!basename || basename === '/') {\n return pathname;\n }\n\n if (!pathname.toLowerCase().startsWith(basename.toLowerCase())) {\n return pathname;\n }\n\n // We want to leave trailing slash behavior in the user's control, so if they\n // specify a basename with a trailing slash, we should support it\n const startIndex = basename.endsWith('/') ? basename.length - 1 : basename.length;\n const nextChar = pathname.charAt(startIndex);\n if (nextChar && nextChar !== '/') {\n // pathname does not start with basename/\n return pathname;\n }\n\n return pathname.slice(startIndex) || '/';\n}\n\n// Exported utility functions\n\n/**\n * Ensures a path string starts with a forward slash.\n */\nexport function prefixWithSlash(path: string): string {\n return path[0] === '/' ? path : `/${path}`;\n}\n\n/**\n * Rebuilds the route path from all available routes by matching against the current location.\n */\nexport function rebuildRoutePathFromAllRoutes(allRoutes: RouteObject[], location: Location): string {\n const matchedRoutes = _matchRoutes(allRoutes, location) as RouteMatch[];\n\n if (!matchedRoutes || matchedRoutes.length === 0) {\n return '';\n }\n\n for (const match of matchedRoutes) {\n if (match.route.path && match.route.path !== '*') {\n const path = pickPath(match);\n const strippedPath = stripBasenameFromPathname(location.pathname, prefixWithSlash(match.pathnameBase));\n\n if (location.pathname === strippedPath) {\n return trimSlash(strippedPath);\n }\n\n return trimSlash(\n trimSlash(path || '') +\n prefixWithSlash(\n rebuildRoutePathFromAllRoutes(\n allRoutes.filter(route => route !== match.route),\n {\n pathname: strippedPath,\n },\n ),\n ),\n );\n }\n }\n\n return '';\n}\n\n/**\n * Checks if the current location is inside a descendant route (route with splat parameter).\n */\nexport function locationIsInsideDescendantRoute(location: Location, routes: RouteObject[]): boolean {\n const matchedRoutes = _matchRoutes(routes, location) as RouteMatch[];\n\n if (matchedRoutes) {\n for (const match of matchedRoutes) {\n if (routeIsDescendant(match.route) && pickSplat(match)) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n/**\n * Gets a normalized route name and transaction source from the current routes and location.\n */\nexport function getNormalizedName(\n routes: RouteObject[],\n location: Location,\n branches: RouteMatch[],\n basename: string = '',\n): [string, TransactionSource] {\n if (!routes || routes.length === 0) {\n return [_stripBasename ? stripBasenameFromPathname(location.pathname, basename) : location.pathname, 'url'];\n }\n\n let pathBuilder = '';\n\n if (branches) {\n for (const branch of branches) {\n const route = branch.route;\n if (route) {\n // Early return if index route\n if (route.index) {\n return sendIndexPath(pathBuilder, branch.pathname, basename);\n }\n const path = route.path;\n\n // If path is not a wildcard and has no child routes, append the path\n if (path && !pathIsWildcardAndHasChildren(path, branch)) {\n const newPath = path[0] === '/' || pathBuilder[pathBuilder.length - 1] === '/' ? path : `/${path}`;\n pathBuilder = trimSlash(pathBuilder) + prefixWithSlash(newPath);\n\n // If the path matches the current location, return the path\n if (trimSlash(location.pathname) === trimSlash(basename + branch.pathname)) {\n if (\n // If the route defined on the element is something like\n // <Route path=\"/stores/:storeId/products/:productId\" element={<div>Product</div>} />\n // We should check against the branch.pathname for the number of / separators\n getNumberOfUrlSegments(pathBuilder) !== getNumberOfUrlSegments(branch.pathname) &&\n // We should not count wildcard operators in the url segments calculation\n !pathEndsWithWildcard(pathBuilder)\n ) {\n return [(_stripBasename ? '' : basename) + newPath, 'route'];\n }\n\n // if the last character of the pathbuilder is a wildcard and there are children, remove the wildcard\n if (pathIsWildcardAndHasChildren(pathBuilder, branch)) {\n pathBuilder = pathBuilder.slice(0, -1);\n }\n\n return [(_stripBasename ? '' : basename) + pathBuilder, 'route'];\n }\n }\n }\n }\n }\n\n const fallbackTransactionName = _stripBasename\n ? stripBasenameFromPathname(location.pathname, basename)\n : location.pathname || '';\n\n return [fallbackTransactionName, 'url'];\n}\n\n/**\n * Shared helper function to resolve route name and source\n */\nexport function resolveRouteNameAndSource(\n location: Location,\n routes: RouteObject[],\n allRoutes: RouteObject[],\n branches: RouteMatch[],\n basename: string = '',\n): [string, TransactionSource] {\n let name: string | undefined;\n let source: TransactionSource = 'url';\n\n const isInDescendantRoute = locationIsInsideDescendantRoute(location, allRoutes);\n\n if (isInDescendantRoute) {\n name = prefixWithSlash(rebuildRoutePathFromAllRoutes(allRoutes, location));\n source = 'route';\n }\n\n if (!isInDescendantRoute || !name) {\n [name, source] = getNormalizedName(routes, location, branches, basename);\n }\n\n return [name || location.pathname, source];\n}\n"],"names":[],"mappings":"AAGA;AACA,IAAI,YAAY;AAChB,IAAI,cAAc,GAAY,KAAK;;AAEnC;AACA;AACA;AACA;AACO,SAAS,qBAAqB,CAAC,WAAW,EAAe,aAAa,GAAY,KAAK,EAAQ;AACtG,EAAE,YAAA,GAAe,WAAW;AAC5B,EAAE,cAAA,GAAiB,aAAa;AAChC;;AAEA;AACA,SAAS,QAAQ,CAAC,KAAK,EAAsB;AAC7C,EAAE,OAAO,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,IAAA,IAAQ,EAAE,CAAC;AAC7C;;AAEA,SAAS,SAAS,CAAC,KAAK,EAAsB;AAC9C,EAAE,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAA,IAAK,EAAE;AAChC;;AAEA,SAAS,YAAY,CAAC,IAAI,EAAkB;AAC5C,EAAE,OAAO,IAAI,CAAC,IAAI,CAAC,MAAA,GAAS,CAAC,CAAA,KAAM,GAAA,GAAM,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAA,GAAI,IAAI;AACjE;;AAEA,SAAS,SAAS,CAAC,IAAI,EAAkB;AACzC,EAAE,OAAO,IAAI,CAAC,IAAI,CAAC,MAAA,GAAS,CAAC,CAAA,KAAM,GAAA,GAAM,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAA,GAAI,IAAI;AACjE;;AAEA;AACA;AACA;AACO,SAAS,oBAAoB,CAAC,IAAI,EAAmB;AAC5D,EAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;AAC3B;;AAEA;AACA;AACA;AACO,SAAS,4BAA4B,CAAC,IAAI,EAAU,MAAM,EAA+B;AAChG,EAAE,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAA,IAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,KAAK,KAAK;AACjF;;AAEA;AACO,SAAS,iBAAiB,CAAC,KAAK,EAAwB;AAC/D,EAAE,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,KAAK,CAAC,OAAA,IAAW,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC3E;;AAEA,SAAS,aAAa,CAAC,WAAW,EAAU,QAAQ,EAAU,QAAQ,EAAuC;AAC7G,EAAE,MAAM,iBAAA;AACR,IAAI,WAAA,IAAe,WAAW,CAAC,SAAS;AACxC,QAAQ;AACR,QAAQ;AACR,UAAU,yBAAyB,CAAC,QAAQ,EAAE,QAAQ;AACtD,UAAU,QAAQ;;AAElB,EAAE,IAAI,aAAA;AACN;AACA,IAAI,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAA,KAAM,IAAA,GAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAA,GAAI,iBAAiB;;AAE7F;AACA,EAAE,IAAI,aAAa,CAAC,MAAA,GAAS,KAAK,aAAa,CAAC,aAAa,CAAC,MAAA,GAAS,CAAC,CAAA,KAAM,GAAG,EAAE;AACnF,IAAI,aAAA,GAAgB,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;AAC9C,EAAE;;AAEF,EAAE,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC;AACjC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,sBAAsB,CAAC,GAAG,EAAkB;AAC5D;AACA,EAAE,OAAO,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAA,IAAK,CAAC,CAAC,MAAA,GAAS,CAAA,IAAK,MAAM,GAAG,CAAC,CAAC,MAAM;AACzE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,yBAAyB,CAAC,QAAQ,EAAU,QAAQ,EAAkB;AAC/E,EAAE,IAAI,CAAC,QAAA,IAAY,QAAA,KAAa,GAAG,EAAE;AACrC,IAAI,OAAO,QAAQ;AACnB,EAAE;;AAEF,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,EAAE;AAClE,IAAI,OAAO,QAAQ;AACnB,EAAE;;AAEF;AACA;AACA,EAAE,MAAM,UAAA,GAAa,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAA,GAAI,QAAQ,CAAC,MAAA,GAAS,IAAI,QAAQ,CAAC,MAAM;AACnF,EAAE,MAAM,WAAW,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC;AAC9C,EAAE,IAAI,QAAA,IAAY,QAAA,KAAa,GAAG,EAAE;AACpC;AACA,IAAI,OAAO,QAAQ;AACnB,EAAE;;AAEF,EAAE,OAAO,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAA,IAAK,GAAG;AAC1C;;AAEA;;AAEA;AACA;AACA;AACO,SAAS,eAAe,CAAC,IAAI,EAAkB;AACtD,EAAE,OAAO,IAAI,CAAC,CAAC,MAAM,GAAA,GAAM,IAAA,GAAO,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;AACA;;AAEA;AACA;AACA;AACA,SAAA,6BAAA,CAAA,SAAA,EAAA,QAAA,EAAA;AACA,EAAA,MAAA,aAAA,GAAA,YAAA,CAAA,SAAA,EAAA,QAAA,CAAA;;AAEA,EAAA,IAAA,CAAA,aAAA,IAAA,aAAA,CAAA,MAAA,KAAA,CAAA,EAAA;AACA,IAAA,OAAA,EAAA;AACA,EAAA;;AAEA,EAAA,KAAA,MAAA,KAAA,IAAA,aAAA,EAAA;AACA,IAAA,IAAA,KAAA,CAAA,KAAA,CAAA,IAAA,IAAA,KAAA,CAAA,KAAA,CAAA,IAAA,KAAA,GAAA,EAAA;AACA,MAAA,MAAA,IAAA,GAAA,QAAA,CAAA,KAAA,CAAA;AACA,MAAA,MAAA,YAAA,GAAA,yBAAA,CAAA,QAAA,CAAA,QAAA,EAAA,eAAA,CAAA,KAAA,CAAA,YAAA,CAAA,CAAA;;AAEA,MAAA,IAAA,QAAA,CAAA,QAAA,KAAA,YAAA,EAAA;AACA,QAAA,OAAA,SAAA,CAAA,YAAA,CAAA;AACA,MAAA;;AAEA,MAAA,OAAA,SAAA;AACA,QAAA,SAAA,CAAA,IAAA,IAAA,EAAA,CAAA;AACA,UAAA,eAAA;AACA,YAAA,6BAAA;AACA,cAAA,SAAA,CAAA,MAAA,CAAA,KAAA,IAAA,KAAA,KAAA,KAAA,CAAA,KAAA,CAAA;AACA,cAAA;AACA,gBAAA,QAAA,EAAA,YAAA;AACA,eAAA;AACA,aAAA;AACA,WAAA;AACA,OAAA;AACA,IAAA;AACA,EAAA;;AAEA,EAAA,OAAA,EAAA;AACA;;AAEA;AACA;AACA;AACA,SAAA,+BAAA,CAAA,QAAA,EAAA,MAAA,EAAA;AACA,EAAA,MAAA,aAAA,GAAA,YAAA,CAAA,MAAA,EAAA,QAAA,CAAA;;AAEA,EAAA,IAAA,aAAA,EAAA;AACA,IAAA,KAAA,MAAA,KAAA,IAAA,aAAA,EAAA;AACA,MAAA,IAAA,iBAAA,CAAA,KAAA,CAAA,KAAA,CAAA,IAAA,SAAA,CAAA,KAAA,CAAA,EAAA;AACA,QAAA,OAAA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;;AAEA,EAAA,OAAA,KAAA;AACA;;AAEA;AACA;AACA;AACA,SAAA,iBAAA;AACA,EAAA,MAAA;AACA,EAAA,QAAA;AACA,EAAA,QAAA;AACA,EAAA,QAAA,GAAA,EAAA;AACA,EAAA;AACA,EAAA,IAAA,CAAA,MAAA,IAAA,MAAA,CAAA,MAAA,KAAA,CAAA,EAAA;AACA,IAAA,OAAA,CAAA,cAAA,GAAA,yBAAA,CAAA,QAAA,CAAA,QAAA,EAAA,QAAA,CAAA,GAAA,QAAA,CAAA,QAAA,EAAA,KAAA,CAAA;AACA,EAAA;;AAEA,EAAA,IAAA,WAAA,GAAA,EAAA;;AAEA,EAAA,IAAA,QAAA,EAAA;AACA,IAAA,KAAA,MAAA,MAAA,IAAA,QAAA,EAAA;AACA,MAAA,MAAA,KAAA,GAAA,MAAA,CAAA,KAAA;AACA,MAAA,IAAA,KAAA,EAAA;AACA;AACA,QAAA,IAAA,KAAA,CAAA,KAAA,EAAA;AACA,UAAA,OAAA,aAAA,CAAA,WAAA,EAAA,MAAA,CAAA,QAAA,EAAA,QAAA,CAAA;AACA,QAAA;AACA,QAAA,MAAA,IAAA,GAAA,KAAA,CAAA,IAAA;;AAEA;AACA,QAAA,IAAA,IAAA,IAAA,CAAA,4BAAA,CAAA,IAAA,EAAA,MAAA,CAAA,EAAA;AACA,UAAA,MAAA,OAAA,GAAA,IAAA,CAAA,CAAA,CAAA,KAAA,GAAA,IAAA,WAAA,CAAA,WAAA,CAAA,MAAA,GAAA,CAAA,CAAA,KAAA,GAAA,GAAA,IAAA,GAAA,CAAA,CAAA,EAAA,IAAA,CAAA,CAAA;AACA,UAAA,WAAA,GAAA,SAAA,CAAA,WAAA,CAAA,GAAA,eAAA,CAAA,OAAA,CAAA;;AAEA;AACA,UAAA,IAAA,SAAA,CAAA,QAAA,CAAA,QAAA,CAAA,KAAA,SAAA,CAAA,QAAA,GAAA,MAAA,CAAA,QAAA,CAAA,EAAA;AACA,YAAA;AACA;AACA;AACA;AACA,cAAA,sBAAA,CAAA,WAAA,CAAA,KAAA,sBAAA,CAAA,MAAA,CAAA,QAAA,CAAA;AACA;AACA,cAAA,CAAA,oBAAA,CAAA,WAAA;AACA,cAAA;AACA,cAAA,OAAA,CAAA,CAAA,cAAA,GAAA,EAAA,GAAA,QAAA,IAAA,OAAA,EAAA,OAAA,CAAA;AACA,YAAA;;AAEA;AACA,YAAA,IAAA,4BAAA,CAAA,WAAA,EAAA,MAAA,CAAA,EAAA;AACA,cAAA,WAAA,GAAA,WAAA,CAAA,KAAA,CAAA,CAAA,EAAA,EAAA,CAAA;AACA,YAAA;;AAEA,YAAA,OAAA,CAAA,CAAA,cAAA,GAAA,EAAA,GAAA,QAAA,IAAA,WAAA,EAAA,OAAA,CAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;;AAEA,EAAA,MAAA,uBAAA,GAAA;AACA,MAAA,yBAAA,CAAA,QAAA,CAAA,QAAA,EAAA,QAAA;AACA,MAAA,QAAA,CAAA,QAAA,IAAA,EAAA;;AAEA,EAAA,OAAA,CAAA,uBAAA,EAAA,KAAA,CAAA;AACA;;AAEA;AACA;AACA;AACA,SAAA,yBAAA;AACA,EAAA,QAAA;AACA,EAAA,MAAA;AACA,EAAA,SAAA;AACA,EAAA,QAAA;AACA,EAAA,QAAA,GAAA,EAAA;AACA,EAAA;AACA,EAAA,IAAA,IAAA;AACA,EAAA,IAAA,MAAA,GAAA,KAAA;;AAEA,EAAA,MAAA,mBAAA,GAAA,+BAAA,CAAA,QAAA,EAAA,SAAA,CAAA;;AAEA,EAAA,IAAA,mBAAA,EAAA;AACA,IAAA,IAAA,GAAA,eAAA,CAAA,6BAAA,CAAA,SAAA,EAAA,QAAA,CAAA,CAAA;AACA,IAAA,MAAA,GAAA,OAAA;AACA,EAAA;;AAEA,EAAA,IAAA,CAAA,mBAAA,IAAA,CAAA,IAAA,EAAA;AACA,IAAA,CAAA,IAAA,EAAA,MAAA,CAAA,GAAA,iBAAA,CAAA,MAAA,EAAA,QAAA,EAAA,QAAA,EAAA,QAAA,CAAA;AACA,EAAA;;AAEA,EAAA,OAAA,CAAA,IAAA,IAAA,QAAA,CAAA,QAAA,EAAA,MAAA,CAAA;AACA;;;;"}
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../src/reactrouter-compat-utils/utils.ts"],"sourcesContent":["import type { TransactionSource } from '@sentry/core';\nimport type { Location, MatchRoutes, RouteMatch, RouteObject } from '../types';\n\n// Global variables that these utilities depend on\nlet _matchRoutes: MatchRoutes;\nlet _stripBasename: boolean = false;\n\n/**\n * Initialize function to set dependencies that the router utilities need.\n * Must be called before using any of the exported utility functions.\n */\nexport function initializeRouterUtils(matchRoutes: MatchRoutes, stripBasename: boolean = false): void {\n _matchRoutes = matchRoutes;\n _stripBasename = stripBasename;\n}\n\n// Helper functions\nfunction pickPath(match: RouteMatch): string {\n return trimWildcard(match.route.path || '');\n}\n\nfunction pickSplat(match: RouteMatch): string {\n return match.params['*'] || '';\n}\n\nfunction trimWildcard(path: string): string {\n return path[path.length - 1] === '*' ? path.slice(0, -1) : path;\n}\n\nfunction trimSlash(path: string): string {\n return path[path.length - 1] === '/' ? path.slice(0, -1) : path;\n}\n\n/**\n * Checks if a path ends with a wildcard character (*).\n */\nexport function pathEndsWithWildcard(path: string): boolean {\n return path.endsWith('*');\n}\n\n/** Checks if transaction name has wildcard (/* or ends with *). */\nexport function transactionNameHasWildcard(name: string): boolean {\n return name.includes('/*') || name.endsWith('*');\n}\n\n/**\n * Checks if a path is a wildcard and has child routes.\n */\nexport function pathIsWildcardAndHasChildren(path: string, branch: RouteMatch<string>): boolean {\n return (pathEndsWithWildcard(path) && !!branch.route.children?.length) || false;\n}\n\n/** Check if route is in descendant route (<Routes> within <Routes>) */\nexport function routeIsDescendant(route: RouteObject): boolean {\n return !!(!route.children && route.element && route.path?.endsWith('/*'));\n}\n\nfunction sendIndexPath(pathBuilder: string, pathname: string, basename: string): [string, TransactionSource] {\n const reconstructedPath =\n pathBuilder && pathBuilder.length > 0\n ? pathBuilder\n : _stripBasename\n ? stripBasenameFromPathname(pathname, basename)\n : pathname;\n\n let formattedPath =\n // If the path ends with a wildcard suffix, remove both the slash and the asterisk\n reconstructedPath.slice(-2) === '/*' ? reconstructedPath.slice(0, -2) : reconstructedPath;\n\n // If the path ends with a slash, remove it (but keep single '/')\n if (formattedPath.length > 1 && formattedPath[formattedPath.length - 1] === '/') {\n formattedPath = formattedPath.slice(0, -1);\n }\n\n return [formattedPath, 'route'];\n}\n\n/**\n * Returns the number of URL segments in the given URL string.\n * Splits at '/' or '\\/' to handle regex URLs correctly.\n *\n * @param url - The URL string to segment.\n * @returns The number of segments in the URL.\n */\nexport function getNumberOfUrlSegments(url: string): number {\n // split at '/' or at '\\/' to split regex urls correctly\n return url.split(/\\\\?\\//).filter(s => s.length > 0 && s !== ',').length;\n}\n\n/**\n * Strip the basename from a pathname if exists.\n *\n * Vendored and modified from `react-router`\n * https://github.com/remix-run/react-router/blob/462bb712156a3f739d6139a0f14810b76b002df6/packages/router/utils.ts#L1038\n */\nfunction stripBasenameFromPathname(pathname: string, basename: string): string {\n if (!basename || basename === '/') {\n return pathname;\n }\n\n if (!pathname.toLowerCase().startsWith(basename.toLowerCase())) {\n return pathname;\n }\n\n // We want to leave trailing slash behavior in the user's control, so if they\n // specify a basename with a trailing slash, we should support it\n const startIndex = basename.endsWith('/') ? basename.length - 1 : basename.length;\n const nextChar = pathname.charAt(startIndex);\n if (nextChar && nextChar !== '/') {\n // pathname does not start with basename/\n return pathname;\n }\n\n return pathname.slice(startIndex) || '/';\n}\n\n// Exported utility functions\n\n/**\n * Ensures a path string starts with a forward slash.\n */\nexport function prefixWithSlash(path: string): string {\n return path[0] === '/' ? path : `/${path}`;\n}\n\n/**\n * Rebuilds the route path from all available routes by matching against the current location.\n */\nexport function rebuildRoutePathFromAllRoutes(allRoutes: RouteObject[], location: Location): string {\n const matchedRoutes = _matchRoutes(allRoutes, location) as RouteMatch[];\n\n if (!matchedRoutes || matchedRoutes.length === 0) {\n return '';\n }\n\n for (const match of matchedRoutes) {\n if (match.route.path && match.route.path !== '*') {\n const path = pickPath(match);\n const strippedPath = stripBasenameFromPathname(location.pathname, prefixWithSlash(match.pathnameBase));\n\n if (location.pathname === strippedPath) {\n return trimSlash(strippedPath);\n }\n\n return trimSlash(\n trimSlash(path || '') +\n prefixWithSlash(\n rebuildRoutePathFromAllRoutes(\n allRoutes.filter(route => route !== match.route),\n {\n pathname: strippedPath,\n },\n ),\n ),\n );\n }\n }\n\n return '';\n}\n\n/**\n * Checks if the current location is inside a descendant route (route with splat parameter).\n */\nexport function locationIsInsideDescendantRoute(location: Location, routes: RouteObject[]): boolean {\n const matchedRoutes = _matchRoutes(routes, location) as RouteMatch[];\n\n if (matchedRoutes) {\n for (const match of matchedRoutes) {\n if (routeIsDescendant(match.route) && pickSplat(match)) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n/**\n * Returns a fallback transaction name from location pathname.\n */\nfunction getFallbackTransactionName(location: Location, basename: string): string {\n return _stripBasename ? stripBasenameFromPathname(location.pathname, basename) : location.pathname || '';\n}\n\n/**\n * Gets a normalized route name and transaction source from the current routes and location.\n */\nexport function getNormalizedName(\n routes: RouteObject[],\n location: Location,\n branches: RouteMatch[],\n basename: string = '',\n): [string, TransactionSource] {\n if (!routes || routes.length === 0) {\n return [_stripBasename ? stripBasenameFromPathname(location.pathname, basename) : location.pathname, 'url'];\n }\n\n if (!branches) {\n return [getFallbackTransactionName(location, basename), 'url'];\n }\n\n let pathBuilder = '';\n\n for (const branch of branches) {\n const route = branch.route;\n if (!route) {\n continue;\n }\n\n // Early return for index routes\n if (route.index) {\n return sendIndexPath(pathBuilder, branch.pathname, basename);\n }\n\n const path = route.path;\n if (!path || pathIsWildcardAndHasChildren(path, branch)) {\n continue;\n }\n\n // Build the route path\n const newPath = path[0] === '/' || pathBuilder[pathBuilder.length - 1] === '/' ? path : `/${path}`;\n pathBuilder = trimSlash(pathBuilder) + prefixWithSlash(newPath);\n\n // Check if this path matches the current location\n if (trimSlash(location.pathname) !== trimSlash(basename + branch.pathname)) {\n continue;\n }\n\n // Check if this is a parameterized route like /stores/:storeId/products/:productId\n if (\n getNumberOfUrlSegments(pathBuilder) !== getNumberOfUrlSegments(branch.pathname) &&\n !pathEndsWithWildcard(pathBuilder)\n ) {\n return [(_stripBasename ? '' : basename) + newPath, 'route'];\n }\n\n // Handle wildcard routes with children - strip trailing wildcard\n if (pathIsWildcardAndHasChildren(pathBuilder, branch)) {\n pathBuilder = pathBuilder.slice(0, -1);\n }\n\n return [(_stripBasename ? '' : basename) + pathBuilder, 'route'];\n }\n\n // Fallback when no matching route found\n return [getFallbackTransactionName(location, basename), 'url'];\n}\n\n/**\n * Shared helper function to resolve route name and source\n */\nexport function resolveRouteNameAndSource(\n location: Location,\n routes: RouteObject[],\n allRoutes: RouteObject[],\n branches: RouteMatch[],\n basename: string = '',\n): [string, TransactionSource] {\n let name: string | undefined;\n let source: TransactionSource = 'url';\n\n const isInDescendantRoute = locationIsInsideDescendantRoute(location, allRoutes);\n\n if (isInDescendantRoute) {\n name = prefixWithSlash(rebuildRoutePathFromAllRoutes(allRoutes, location));\n source = 'route';\n }\n\n if (!isInDescendantRoute || !name) {\n [name, source] = getNormalizedName(routes, location, branches, basename);\n }\n\n return [name || location.pathname, source];\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export type { ReactRouterOptions } from './instrumentation';
|
|
2
2
|
export { createReactRouterV6CompatibleTracingIntegration, createV6CompatibleWithSentryReactRouterRouting, createV6CompatibleWrapCreateBrowserRouter, createV6CompatibleWrapCreateMemoryRouter, createV6CompatibleWrapUseRoutes, handleNavigation, addResolvedRoutesToParent, processResolvedRoutes, updateNavigationSpan, } from './instrumentation';
|
|
3
|
-
export { resolveRouteNameAndSource, getNormalizedName, initializeRouterUtils, locationIsInsideDescendantRoute, prefixWithSlash, rebuildRoutePathFromAllRoutes, pathEndsWithWildcard, pathIsWildcardAndHasChildren, getNumberOfUrlSegments, } from './utils';
|
|
3
|
+
export { resolveRouteNameAndSource, getNormalizedName, initializeRouterUtils, locationIsInsideDescendantRoute, prefixWithSlash, rebuildRoutePathFromAllRoutes, pathEndsWithWildcard, pathIsWildcardAndHasChildren, getNumberOfUrlSegments, transactionNameHasWildcard, } from './utils';
|
|
4
4
|
export { createAsyncHandlerProxy, handleAsyncHandlerResult, checkRouteForAsyncHandler } from './lazy-routes';
|
|
5
5
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/reactrouter-compat-utils/index.ts"],"names":[],"mappings":"AAGA,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EACL,+CAA+C,EAC/C,8CAA8C,EAC9C,yCAAyC,EACzC,wCAAwC,EACxC,+BAA+B,EAC/B,gBAAgB,EAChB,yBAAyB,EACzB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,yBAAyB,EACzB,iBAAiB,EACjB,qBAAqB,EACrB,+BAA+B,EAC/B,eAAe,EACf,6BAA6B,EAC7B,oBAAoB,EACpB,4BAA4B,EAC5B,sBAAsB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/reactrouter-compat-utils/index.ts"],"names":[],"mappings":"AAGA,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EACL,+CAA+C,EAC/C,8CAA8C,EAC9C,yCAAyC,EACzC,wCAAwC,EACxC,+BAA+B,EAC/B,gBAAgB,EAChB,yBAAyB,EACzB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,yBAAyB,EACzB,iBAAiB,EACjB,qBAAqB,EACrB,+BAA+B,EAC/B,eAAe,EACf,6BAA6B,EAC7B,oBAAoB,EACpB,4BAA4B,EAC5B,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -2,11 +2,30 @@ import { browserTracingIntegration } from '@sentry/browser';
|
|
|
2
2
|
import type { Integration, Span } from '@sentry/core';
|
|
3
3
|
import * as React from 'react';
|
|
4
4
|
import type { Action, AgnosticDataRouteMatch, CreateRouterFunction, CreateRoutesFromChildren, Location, MatchRoutes, RouteObject, Router, RouterState, UseEffect, UseLocation, UseNavigationType, UseRoutes } from '../types';
|
|
5
|
+
export declare const allRoutes: Set<RouteObject>;
|
|
5
6
|
/**
|
|
6
|
-
*
|
|
7
|
-
*
|
|
7
|
+
* Computes location key for duplicate detection. Normalizes undefined/null to empty strings.
|
|
8
|
+
* Exported for testing.
|
|
8
9
|
*/
|
|
9
|
-
export declare function
|
|
10
|
+
export declare function computeLocationKey(location: Location): string;
|
|
11
|
+
/**
|
|
12
|
+
* Determines if a navigation should be skipped as a duplicate, and if an existing span should be updated.
|
|
13
|
+
* Exported for testing.
|
|
14
|
+
*
|
|
15
|
+
* @returns An object with:
|
|
16
|
+
* - skip: boolean - Whether to skip creating a new span
|
|
17
|
+
* - shouldUpdate: boolean - Whether to update the existing span name (wildcard upgrade)
|
|
18
|
+
*/
|
|
19
|
+
export declare function shouldSkipNavigation(trackedNav: {
|
|
20
|
+
span: Span;
|
|
21
|
+
routeName: string;
|
|
22
|
+
pathname: string;
|
|
23
|
+
locationKey: string;
|
|
24
|
+
isPlaceholder?: boolean;
|
|
25
|
+
} | undefined, locationKey: string, proposedName: string, spanHasEnded: boolean): {
|
|
26
|
+
skip: boolean;
|
|
27
|
+
shouldUpdate: boolean;
|
|
28
|
+
};
|
|
10
29
|
export interface ReactRouterOptions {
|
|
11
30
|
useEffect: UseEffect;
|
|
12
31
|
useLocation: UseLocation;
|
|
@@ -27,9 +46,21 @@ export interface ReactRouterOptions {
|
|
|
27
46
|
* @default false
|
|
28
47
|
*/
|
|
29
48
|
enableAsyncRouteHandlers?: boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Maximum time (in milliseconds) to wait for lazy routes to load before finalizing span names.
|
|
51
|
+
*
|
|
52
|
+
* - Set to `0` to not wait at all (immediate finalization)
|
|
53
|
+
* - Set to `Infinity` to wait as long as possible (capped at `finalTimeout` to prevent indefinite hangs)
|
|
54
|
+
* - Negative values will fall back to the default
|
|
55
|
+
*
|
|
56
|
+
* Defaults to 3× the configured `idleTimeout` (default: 3000ms).
|
|
57
|
+
*
|
|
58
|
+
* @default idleTimeout * 3
|
|
59
|
+
*/
|
|
60
|
+
lazyRouteTimeout?: number;
|
|
30
61
|
}
|
|
31
62
|
type V6CompatibleVersion = '6' | '7';
|
|
32
|
-
export declare
|
|
63
|
+
export declare function addResolvedRoutesToParent(resolvedRoutes: RouteObject[], parentRoute: RouteObject): void;
|
|
33
64
|
/**
|
|
34
65
|
* Processes resolved routes by adding them to allRoutes and checking for nested async handlers.
|
|
35
66
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../../src/reactrouter-compat-utils/instrumentation.tsx"],"names":[],"mappings":"AAIA,OAAO,EACL,yBAAyB,EAI1B,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAU,WAAW,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAa9D,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,KAAK,EACV,MAAM,EACN,sBAAsB,EACtB,oBAAoB,EACpB,wBAAwB,EACxB,QAAQ,EACR,WAAW,EAEX,WAAW,EACX,MAAM,EACN,WAAW,EACX,SAAS,EACT,WAAW,EACX,iBAAiB,EACjB,SAAS,EACV,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../../src/reactrouter-compat-utils/instrumentation.tsx"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,8 @@ export declare function initializeRouterUtils(matchRoutes: MatchRoutes, stripBas
|
|
|
9
9
|
* Checks if a path ends with a wildcard character (*).
|
|
10
10
|
*/
|
|
11
11
|
export declare function pathEndsWithWildcard(path: string): boolean;
|
|
12
|
+
/** Checks if transaction name has wildcard (/* or ends with *). */
|
|
13
|
+
export declare function transactionNameHasWildcard(name: string): boolean;
|
|
12
14
|
/**
|
|
13
15
|
* Checks if a path is a wildcard and has child routes.
|
|
14
16
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/reactrouter-compat-utils/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAM/E;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,WAAW,EAAE,aAAa,GAAE,OAAe,GAAG,IAAI,CAGpG;AAmBD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,GAAG,OAAO,CAE9F;AAED,uEAAuE;AACvE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAE7D;AAsBD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG1D;AA+BD;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,WAAW,EAAE,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,CA+BlG;AAED;;GAEG;AACH,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAYlG;
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/reactrouter-compat-utils/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAM/E;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,WAAW,EAAE,aAAa,GAAE,OAAe,GAAG,IAAI,CAGpG;AAmBD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,mEAAmE;AACnE,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,GAAG,OAAO,CAE9F;AAED,uEAAuE;AACvE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAE7D;AAsBD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG1D;AA+BD;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,WAAW,EAAE,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,CA+BlG;AAED;;GAEG;AACH,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAYlG;AASD;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,WAAW,EAAE,EACrB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,UAAU,EAAE,EACtB,QAAQ,GAAE,MAAW,GACpB,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAsD7B;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,WAAW,EAAE,EACrB,SAAS,EAAE,WAAW,EAAE,EACxB,QAAQ,EAAE,UAAU,EAAE,EACtB,QAAQ,GAAE,MAAW,GACpB,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAgB7B"}
|