@tanstack/router-core
Version:
Modern and scalable routing for React applications
1 lines • 117 kB
Source Map (JSON)
{"version":3,"file":"router.cjs","names":[],"sources":["../../src/router.ts"],"sourcesContent":["import { createBrowserHistory, parseHref } from '@tanstack/history'\nimport { isServer, loadServerRoute } from '@tanstack/router-core/isServer'\nimport {\n DEFAULT_PROTOCOL_ALLOWLIST,\n decodePath,\n deepEqual,\n encodePathLikeUrl,\n findLast,\n functionalUpdate,\n hasKeys,\n isDangerousProtocol,\n last,\n nullReplaceEqualDeep,\n replaceEqualDeep,\n} from './utils'\nimport {\n buildRouteBranch,\n findFlatMatch,\n findRouteMatch,\n findSingleMatch,\n processRouteMasks,\n processRouteTree,\n} from './new-process-route-tree'\nimport {\n compileDecodeCharMap,\n interpolatePath,\n resolvePath,\n trimPath,\n trimPathRight,\n} from './path'\nimport { createLRUCache } from './lru-cache'\nimport { isNotFound } from './not-found'\nimport { setupScrollRestoration } from './scroll-restoration'\nimport { defaultParseSearch, defaultStringifySearch } from './searchParams'\nimport { rootRouteId } from './root'\nimport { isRedirect } from './redirect'\nimport {\n loadClientRoute,\n loadRouteChunk,\n preloadClientRoute,\n refreshClientRoute,\n replaceRouteChunk,\n} from './load-client'\nimport {\n composeRewrites,\n executeRewriteInput,\n executeRewriteOutput,\n rewriteBasepath,\n} from './rewrite'\nimport { createRouterStores } from './stores'\nimport type { LRUCache } from './lru-cache'\nimport type {\n ProcessRouteTreeResult,\n ProcessedTree,\n} from './new-process-route-tree'\nimport type { SearchParser, SearchSerializer } from './searchParams'\nimport type { AnyRedirect, ResolvedRedirect } from './redirect'\nimport type {\n LoadTransaction,\n LoaderFlight,\n PendingSession,\n} from './load-client'\nimport type { ServerLoadResult } from './load-server'\nimport type {\n HistoryAction,\n HistoryLocation,\n HistoryState,\n ParsedHistoryState,\n RouterHistory,\n} from '@tanstack/history'\n\nimport type {\n Awaitable,\n Constrain,\n NoInfer,\n NonNullableUpdater,\n PickAsRequired,\n Updater,\n} from './utils'\nimport type { ParsedLocation } from './location'\nimport type {\n AnyContext,\n AnyRoute,\n AnyRouteWithContext,\n LoaderStaleReloadMode,\n MakeRemountDepsOptionsUnion,\n RouteMask,\n SearchMiddleware,\n SearchMiddlewareMeta,\n} from './route'\nimport type {\n FullSearchSchema,\n RouteById,\n RoutePaths,\n RoutesById,\n RoutesByPath,\n} from './routeInfo'\nimport type {\n AnyRouteMatch,\n MakeRouteMatch,\n MakeRouteMatchUnion,\n MatchRouteOptions,\n} from './Matches'\nimport type {\n BuildLocationFn,\n CommitLocationOptions,\n NavigateFn,\n} from './RouterProvider'\nimport type {\n Manifest,\n ManifestRouteAssets,\n RouterManagedTag,\n} from './manifest'\nimport type { AnySchema, AnyValidator } from './validators'\nimport type { NavigateOptions, ResolveRelativePath, ToOptions } from './link'\nimport type {\n AnySerializationAdapter,\n ValidateSerializableInput,\n} from './ssr/serializer/transformer'\nimport type { GetStoreConfig, RouterStores } from './stores'\n\nexport type ControllablePromise<T = any> = Promise<T> & {\n resolve: (value: T) => void\n reject: (value?: any) => void\n}\n\nexport type InjectedHtmlEntry = Promise<string>\n\nexport interface Register {\n // Lots of things on here like...\n // router\n // config\n // ssr\n}\n\nexport type RegisteredSsr<TRegister = Register> = TRegister extends {\n ssr: infer TSSR\n}\n ? TSSR\n : false\n\nexport type RegisteredRouter<TRegister = Register> = TRegister extends {\n router: infer TRouter\n}\n ? TRouter\n : AnyRouter\n\nexport type RegisteredConfigType<TRegister, TKey> = TRegister extends {\n config: infer TConfig\n}\n ? TConfig extends {\n '~types': infer TTypes\n }\n ? TKey extends keyof TTypes\n ? TTypes[TKey]\n : unknown\n : unknown\n : unknown\n\nexport type DefaultRemountDepsFn<TRouteTree extends AnyRoute> = (\n opts: MakeRemountDepsOptionsUnion<TRouteTree>,\n) => any\n\nexport interface DefaultRouterOptionsExtensions {}\n\nexport interface RouterOptionsExtensions extends DefaultRouterOptionsExtensions {}\n\nexport type SSROption = boolean | 'data-only'\n\nexport interface RouterOptions<\n TRouteTree extends AnyRoute,\n TTrailingSlashOption extends TrailingSlashOption,\n TDefaultStructuralSharingOption extends boolean = false,\n TRouterHistory extends RouterHistory = RouterHistory,\n TDehydrated = undefined,\n> extends RouterOptionsExtensions {\n /**\n * The history object that will be used to manage the browser history.\n *\n * If not provided, a new createBrowserHistory instance will be created and used.\n *\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#history-property)\n * @link [Guide](https://tanstack.com/router/latest/docs/framework/react/guide/history-types)\n */\n history?: TRouterHistory\n /**\n * A function that will be used to stringify search params when generating links.\n *\n * @default defaultStringifySearch\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#stringifysearch-method)\n * @link [Guide](https://tanstack.com/router/latest/docs/framework/react/guide/custom-search-param-serialization)\n */\n stringifySearch?: SearchSerializer\n /**\n * A function that will be used to parse search params when parsing the current location.\n *\n * @default defaultParseSearch\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#parsesearch-method)\n * @link [Guide](https://tanstack.com/router/latest/docs/framework/react/guide/custom-search-param-serialization)\n */\n parseSearch?: SearchParser\n /**\n * If `false`, routes will not be preloaded by default in any way.\n *\n * If `'intent'`, routes will be preloaded by default when the user hovers over a link or a `touchstart` event is detected on a `<Link>`.\n *\n * If `'viewport'`, routes will be preloaded by default when they are within the viewport.\n *\n * @default false\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#defaultpreload-property)\n * @link [Guide](https://tanstack.com/router/latest/docs/framework/react/guide/preloading)\n */\n defaultPreload?: false | 'intent' | 'viewport' | 'render'\n /**\n * The delay in milliseconds before intent focus/hover and viewport preloading.\n * Touch intent preloads immediately.\n *\n * @default 50\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#defaultpreloaddelay-property)\n * @link [Guide](https://tanstack.com/router/latest/docs/framework/react/guide/preloading#preload-delay)\n */\n defaultPreloadDelay?: number\n /**\n * The default `preloadIntentProximity` a route should use if no preloadIntentProximity is provided.\n *\n * @default 0\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#defaultpreloadintentproximity-property)\n * @link [Guide](https://tanstack.com/router/latest/docs/framework/react/guide/preloading#preload-intent-proximity)\n */\n defaultPreloadIntentProximity?: number\n /**\n * The default `pendingMs` a route should use if no pendingMs is provided.\n *\n * @default 1000\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#defaultpendingms-property)\n * @link [Guide](https://tanstack.com/router/latest/docs/framework/react/guide/data-loading#avoiding-pending-component-flash)\n */\n defaultPendingMs?: number\n /**\n * The default `pendingMinMs` a route should use if no pendingMinMs is provided.\n *\n * @default 500\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#defaultpendingminms-property)\n * @link [Guide](https://tanstack.com/router/latest/docs/framework/react/guide/data-loading#avoiding-pending-component-flash)\n */\n defaultPendingMinMs?: number\n /**\n * The default `staleTime` a route should use if no staleTime is provided. This is the time in milliseconds that a route will be considered fresh.\n *\n * @default 0\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#defaultstaletime-property)\n * @link [Guide](https://tanstack.com/router/latest/docs/framework/react/guide/data-loading#key-options)\n */\n defaultStaleTime?: number\n /**\n * The default stale reload mode a route loader should use if no `loader.staleReloadMode` is provided.\n *\n * `'background'` preserves the current stale-while-revalidate behavior.\n * `'blocking'` waits for stale loader reloads to complete before resolving navigation.\n *\n * @default 'background'\n */\n defaultStaleReloadMode?: LoaderStaleReloadMode\n /**\n * The default `preloadStaleTime` a route should use if no preloadStaleTime is provided.\n *\n * @default 30_000 `(30 seconds)`\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#defaultpreloadstaletime-property)\n * @link [Guide](https://tanstack.com/router/latest/docs/framework/react/guide/preloading)\n */\n defaultPreloadStaleTime?: number\n /**\n * The default `preloadGcTime` a route should use if none is provided.\n *\n * @default 300_000 `(5 minutes)`\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#defaultpreloadgctime-property)\n * @link [Guide](https://tanstack.com/router/latest/docs/framework/react/guide/preloading)\n */\n defaultPreloadGcTime?: number\n /**\n * If `true`, route navigations will called using `document.startViewTransition()`.\n *\n * If the browser does not support this api, this option will be ignored.\n *\n * See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/Document/startViewTransition) for more information on how this function works.\n *\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#defaultviewtransition-property)\n */\n defaultViewTransition?: boolean | ViewTransitionOptions\n /**\n * The default `hashScrollIntoView` a route should use if no hashScrollIntoView is provided while navigating\n *\n * See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView) for more information on `ScrollIntoViewOptions`.\n *\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#defaulthashscrollintoview-property)\n */\n defaultHashScrollIntoView?: boolean | ScrollIntoViewOptions\n /**\n * @default 'fuzzy'\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#notfoundmode-property)\n * @link [Guide](https://tanstack.com/router/latest/docs/framework/react/guide/not-found-errors#the-notfoundmode-option)\n */\n notFoundMode?: 'root' | 'fuzzy'\n /**\n * The default `gcTime` a route should use if no gcTime is provided.\n *\n * @default 300_000 `(5 minutes)`\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#defaultgctime-property)\n * @link [Guide](https://tanstack.com/router/latest/docs/framework/react/guide/data-loading#key-options)\n */\n defaultGcTime?: number\n /**\n * If `true`, all routes will be matched as case-sensitive.\n *\n * @default false\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#casesensitive-property)\n */\n caseSensitive?: boolean\n /**\n *\n * The route tree that will be used to configure the router instance.\n *\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#routetree-property)\n * @link [Guide](https://tanstack.com/router/latest/docs/framework/react/routing/route-trees)\n */\n routeTree?: TRouteTree\n /**\n * The basepath for then entire router. This is useful for mounting a router instance at a subpath.\n * ```\n * @default '/'\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#basepath-property)\n */\n basepath?: string\n /**\n * The root context that will be provided to all routes in the route tree.\n *\n * This can be used to provide a context to all routes in the tree without having to provide it to each route individually.\n *\n * Optional or required if the root route was created with [`createRootRouteWithContext()`](https://tanstack.com/router/latest/docs/framework/react/api/router/createRootRouteWithContextFunction).\n *\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#context-property)\n * @link [Guide](https://tanstack.com/router/latest/docs/framework/react/guide/router-context)\n */\n context?: InferRouterContext<TRouteTree>\n\n additionalContext?: any\n\n /**\n * A function that will be called when the router is dehydrated.\n *\n * The return value of this function will be serialized and stored in the router's dehydrated state.\n *\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#dehydrate-method)\n * @link [Guide](https://tanstack.com/router/latest/docs/framework/react/guide/external-data-loading#critical-dehydrationhydration)\n */\n dehydrate?: () => Awaitable<\n Constrain<TDehydrated, ValidateSerializableInput<Register, TDehydrated>>\n >\n /**\n * A function that will be called when the router is hydrated.\n *\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#hydrate-method)\n * @link [Guide](https://tanstack.com/router/latest/docs/framework/react/guide/external-data-loading#critical-dehydrationhydration)\n */\n hydrate?: (dehydrated: TDehydrated) => Awaitable<void>\n /**\n * An array of route masks that will be used to mask routes in the route tree.\n *\n * Route masking is when you display a route at a different path than the one it is configured to match, like a modal popup that when shared will unmask to the modal's content instead of the modal's context.\n *\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#routemasks-property)\n * @link [Guide](https://tanstack.com/router/latest/docs/framework/react/guide/route-masking)\n */\n routeMasks?: Array<RouteMask<TRouteTree>>\n /**\n * If `true`, route masks will, by default, be removed when the page is reloaded.\n *\n * This can be overridden on a per-mask basis by setting the `unmaskOnReload` option on the mask, or on a per-navigation basis by setting the `unmaskOnReload` option in the `Navigate` options.\n *\n * @default false\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#unmaskonreload-property)\n * @link [Guide](https://tanstack.com/router/latest/docs/framework/react/guide/route-masking#unmasking-on-page-reload)\n */\n unmaskOnReload?: boolean\n\n /**\n * Use `notFoundComponent` instead.\n *\n * @deprecated\n * See https://tanstack.com/router/v1/docs/guide/not-found-errors#migrating-from-notfoundroute for more info.\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#notfoundroute-property)\n */\n notFoundRoute?: AnyRoute\n /**\n * Configures how trailing slashes are treated.\n *\n * - `'always'` will add a trailing slash if not present\n * - `'never'` will remove the trailing slash if present\n * - `'preserve'` will not modify the trailing slash.\n *\n * @default 'never'\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#trailingslash-property)\n */\n trailingSlash?: TTrailingSlashOption\n /**\n * While usually automatic, sometimes it can be useful to force the router into a server-side state, e.g. when using the router in a non-browser environment that has access to a global.document object.\n *\n * @default typeof document !== 'undefined'\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#isserver-property)\n */\n isServer?: boolean\n\n /**\n * @default false\n */\n isShell?: boolean\n\n /**\n * @default false\n */\n isPrerendering?: boolean\n\n /**\n * The default `ssr` a route should use if no `ssr` is provided.\n *\n * @default true\n */\n defaultSsr?: SSROption\n\n search?: {\n /**\n * Configures how unknown search params (= not returned by any `validateSearch`) are treated.\n *\n * @default false\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#search.strict-property)\n */\n strict?: boolean\n }\n\n /**\n * Configures whether structural sharing is enabled by default for fine-grained selectors.\n *\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#defaultstructuralsharing-property)\n */\n defaultStructuralSharing?: TDefaultStructuralSharingOption\n\n /**\n * Configures which URI characters are allowed in path params that would ordinarily be escaped by encodeURIComponent.\n *\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#pathparamsallowedcharacters-property)\n * @link [Guide](https://tanstack.com/router/latest/docs/framework/react/guide/path-params#allowed-characters)\n */\n pathParamsAllowedCharacters?: Array<\n ';' | ':' | '@' | '&' | '=' | '+' | '$' | ','\n >\n\n defaultRemountDeps?: DefaultRemountDepsFn<TRouteTree>\n\n /**\n * If `true`, scroll restoration will be enabled\n *\n * @default false\n */\n scrollRestoration?:\n | boolean\n | ((opts: { location: ParsedLocation }) => boolean)\n\n /**\n * A function that will be called to get the key for the scroll restoration cache.\n *\n * @default (location) => location.href\n */\n getScrollRestorationKey?: (location: ParsedLocation) => string\n /**\n * The default behavior for scroll restoration.\n *\n * @default 'auto'\n */\n scrollRestorationBehavior?: ScrollBehavior\n /**\n * An array of selectors that will be used to scroll to the top of the page in addition to `window`\n *\n * @default ['window']\n */\n scrollToTopSelectors?: Array<string | (() => Element | null | undefined)>\n\n /**\n * When `true`, disables the global catch boundary that normally wraps all route matches.\n * This allows unhandled errors to bubble up to top-level error handlers in the browser.\n *\n * Useful for testing tools (like Storybook Test Runner), error reporting services,\n * and debugging scenarios where you want errors to reach the browser's global error handlers.\n *\n * @default false\n */\n disableGlobalCatchBoundary?: boolean\n\n /**\n * An array of URL protocols to allow in links, redirects, and navigation.\n * Absolute URLs with protocols not in this list will be rejected.\n *\n * @default DEFAULT_PROTOCOL_ALLOWLIST (http:, https:, mailto:, tel:)\n * @link [API Docs](https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#protocolallowlist-property)\n */\n protocolAllowlist?: Array<string>\n\n serializationAdapters?: ReadonlyArray<AnySerializationAdapter>\n /**\n * Configures how the router will rewrite the location between the actual href and the internal href of the router.\n *\n * @default undefined\n * @description You can provide a custom rewrite pair (in/out).\n * This is useful for shifting data from the origin to the path (for things like subdomain routing), or other advanced use cases.\n */\n rewrite?: LocationRewrite\n origin?: string\n ssr?: {\n nonce?: string\n }\n}\n\nexport type LocationRewrite = {\n /**\n * A function that will be called to rewrite the URL before it is interpreted by the router from the history instance.\n *\n * @default undefined\n */\n input?: LocationRewriteFunction\n /**\n * A function that will be called to rewrite the URL before it is committed to the actual history instance from the router.\n *\n * @default undefined\n */\n output?: LocationRewriteFunction\n}\n\n/**\n * A function that will be called to rewrite the URL.\n *\n * @param url The URL to rewrite.\n * @returns The rewritten URL (as a URL instance or full href string) or undefined if no rewrite is needed.\n */\nexport type LocationRewriteFunction = ({\n url,\n}: {\n url: URL\n}) => undefined | string | URL\n\nexport interface RouterState<\n in out TRouteTree extends AnyRoute = AnyRoute,\n in out TRouteMatch = MakeRouteMatchUnion,\n> {\n status: 'pending' | 'idle'\n isLoading: boolean\n matches: Array<TRouteMatch>\n location: ParsedLocation<FullSearchSchema<TRouteTree>>\n resolvedLocation?: ParsedLocation<FullSearchSchema<TRouteTree>>\n}\n\nexport interface BuildNextOptions {\n to?: string | number | null\n params?: true | Updater<unknown>\n search?: true | Updater<unknown>\n hash?: true | Updater<string>\n state?: true | NonNullableUpdater<ParsedHistoryState, HistoryState>\n mask?: {\n to?: string | number | null\n params?: true | Updater<unknown>\n search?: true | Updater<unknown>\n hash?: true | Updater<string>\n state?: true | NonNullableUpdater<ParsedHistoryState, HistoryState>\n unmaskOnReload?: boolean\n }\n from?: string\n href?: string\n _fromLocation?: ParsedLocation\n unsafeRelative?: 'path'\n _isNavigate?: boolean\n}\n\ntype NavigationEventInfo = {\n fromLocation?: ParsedLocation\n toLocation: ParsedLocation\n pathChanged: boolean\n hrefChanged: boolean\n hashChanged: boolean\n}\n\nexport interface RouterEvents {\n onBeforeNavigate: {\n type: 'onBeforeNavigate'\n } & NavigationEventInfo\n onBeforeLoad: {\n type: 'onBeforeLoad'\n } & NavigationEventInfo\n onLoad: {\n type: 'onLoad'\n } & NavigationEventInfo\n onResolved: {\n type: 'onResolved'\n } & NavigationEventInfo\n onBeforeRouteMount: {\n type: 'onBeforeRouteMount'\n } & NavigationEventInfo\n onRendered: {\n type: 'onRendered'\n } & NavigationEventInfo\n}\n\nexport type RouterEvent = RouterEvents[keyof RouterEvents]\n\nexport type ListenerFn<TEvent extends RouterEvent> = (event: TEvent) => void\n\nexport type RouterListener<TRouterEvent extends RouterEvent> = {\n eventType: TRouterEvent['type']\n fn: ListenerFn<TRouterEvent>\n}\n\nexport type SubscribeFn = <TType extends keyof RouterEvents>(\n eventType: TType,\n fn: ListenerFn<RouterEvents[TType]>,\n) => () => void\n\nexport interface MatchRoutesOpts {\n throwOnError?: boolean\n /** @internal */\n _controller?: AbortController\n /** @internal */\n _rematerialize?: boolean\n}\n\nfunction routeNeedsLoad(route: AnyRoute): unknown {\n return (\n route.options.loader ||\n route.options.beforeLoad ||\n route.lazyFn ||\n (route.options.component as any)?.preload ||\n (route.options.pendingComponent as any)?.preload\n )\n}\n\nexport type InferRouterContext<TRouteTree extends AnyRoute> =\n TRouteTree['types']['routerContext']\n\nexport type RouterContextOptions<TRouteTree extends AnyRoute> =\n AnyContext extends InferRouterContext<TRouteTree>\n ? {\n context?: InferRouterContext<TRouteTree>\n }\n : {\n context: InferRouterContext<TRouteTree>\n }\n\nexport type RouterConstructorOptions<\n TRouteTree extends AnyRoute,\n TTrailingSlashOption extends TrailingSlashOption,\n TDefaultStructuralSharingOption extends boolean,\n TRouterHistory extends RouterHistory,\n TDehydrated extends Record<string, any>,\n> = Omit<\n RouterOptions<\n TRouteTree,\n TTrailingSlashOption,\n TDefaultStructuralSharingOption,\n TRouterHistory,\n TDehydrated\n >,\n 'context' | 'serializationAdapters' | 'defaultSsr'\n> &\n RouterContextOptions<TRouteTree>\n\nexport type PreloadRouteFn<\n TRouteTree extends AnyRoute,\n TTrailingSlashOption extends TrailingSlashOption,\n TDefaultStructuralSharingOption extends boolean,\n TRouterHistory extends RouterHistory,\n TDehydrated extends Record<string, any> = Record<string, any>,\n> = <\n TFrom extends RoutePaths<TRouteTree> | string = string,\n TTo extends string | undefined = undefined,\n TMaskFrom extends RoutePaths<TRouteTree> | string = TFrom,\n TMaskTo extends string = '',\n>(\n opts: NavigateOptions<\n RouterCore<\n TRouteTree,\n TTrailingSlashOption,\n TDefaultStructuralSharingOption,\n TRouterHistory,\n TDehydrated\n >,\n TFrom,\n TTo,\n TMaskFrom,\n TMaskTo\n >,\n) => Promise<Array<AnyRouteMatch> | undefined>\n\nexport type MatchRouteFn<\n TRouteTree extends AnyRoute,\n TTrailingSlashOption extends TrailingSlashOption,\n TDefaultStructuralSharingOption extends boolean,\n TRouterHistory extends RouterHistory,\n> = <\n TFrom extends RoutePaths<TRouteTree> = '/',\n TTo extends string | undefined = undefined,\n TResolved = ResolveRelativePath<TFrom, NoInfer<TTo>>,\n>(\n location: ToOptions<\n RouterCore<\n TRouteTree,\n TTrailingSlashOption,\n TDefaultStructuralSharingOption,\n TRouterHistory\n >,\n TFrom,\n TTo\n >,\n opts?: MatchRouteOptions,\n) => false | RouteById<TRouteTree, TResolved>['types']['allParams']\n\nexport type UpdateFn<\n TRouteTree extends AnyRoute,\n TTrailingSlashOption extends TrailingSlashOption,\n TDefaultStructuralSharingOption extends boolean,\n TRouterHistory extends RouterHistory,\n TDehydrated extends Record<string, any>,\n> = (\n newOptions: RouterConstructorOptions<\n TRouteTree,\n TTrailingSlashOption,\n TDefaultStructuralSharingOption,\n TRouterHistory,\n TDehydrated\n >,\n) => void\n\nexport type InvalidateFn<TRouter extends AnyRouter> = (opts?: {\n filter?: (d: MakeRouteMatchUnion<TRouter>) => boolean\n sync?: boolean\n forcePending?: boolean\n}) => Promise<void>\n\nexport type ParseLocationFn<TRouteTree extends AnyRoute> = (\n locationToParse: HistoryLocation,\n previousLocation?: ParsedLocation<FullSearchSchema<TRouteTree>>,\n) => ParsedLocation<FullSearchSchema<TRouteTree>>\n\nexport type GetMatchRoutesFn = (pathname: string) => [\n matchedRoutes: ReadonlyArray<AnyRoute>,\n /** exhaustive params, still in their string form */\n rawParams: Record<string, string>,\n foundRoute: AnyRoute | undefined,\n]\n\nexport type EmitFn = (routerEvent: RouterEvent) => void\n\nexport type LoadFn = (opts?: {\n sync?: boolean\n action?: { type: HistoryAction }\n _signal?: AbortSignal\n}) => Promise<void>\n\nexport type CommitLocationFn = ({\n viewTransition,\n ignoreBlocker,\n ...next\n}: ParsedLocation & CommitLocationOptions) => Promise<void>\n\nexport type StartTransitionFn = (\n fn: () => void,\n expected: Array<AnyRouteMatch>,\n) => Promise<boolean>\n\nexport interface MatchRoutesFn {\n (\n pathname: string,\n locationSearch?: AnySchema,\n opts?: MatchRoutesOpts,\n ): Array<MakeRouteMatchUnion>\n /**\n * @deprecated use the following signature instead\n */\n (next: ParsedLocation, opts?: MatchRoutesOpts): Array<AnyRouteMatch>\n (\n pathnameOrNext: string | ParsedLocation,\n locationSearchOrOpts?: AnySchema | MatchRoutesOpts,\n opts?: MatchRoutesOpts,\n ): Array<AnyRouteMatch>\n}\n\nexport type LoadRouteChunkFn = (route: AnyRoute) => Promise<Array<void>>\n\nexport type ResolveRedirect = (err: AnyRedirect) => ResolvedRedirect\n\nexport type ClearCacheFn<TRouter extends AnyRouter> = (opts?: {\n filter?: (d: MakeRouteMatchUnion<TRouter>) => boolean\n}) => void\n\nexport interface ServerSsr {\n /** Framework-only: injects router-owned HTML into the SSR stream. */\n injectHtml: (html: string) => void\n /** Framework-only: injects a router-owned script tag into the SSR stream. */\n injectScript: (script: string) => void\n isDehydrated: () => boolean\n isSerializationFinished: () => boolean\n /** Framework-only: atomically reserves the pass-through stream path if safe. */\n reserveStreamFastPath: () => boolean\n /** Framework-only. */\n onInjectedHtml: (listener: () => void) => () => void\n /** Framework-only. */\n onRenderFinished: (listener: () => void) => void\n /** Framework-only. */\n setRenderFinished: () => void\n /** Framework-only. */\n cleanup: () => void\n /**\n * Register a listener invoked when the SSR request lifecycle ends (success,\n * error, abort, or stream lifetime expiry). Use to tear down per-request\n * resources whose references would otherwise pin the router (e.g. query\n * cache subscriptions, gcTime timers, abort controllers).\n *\n * Listeners run synchronously and exactly once. Errors are caught and logged.\n */\n onCleanup: (listener: () => void) => void\n /** Framework-only. */\n onSerializationFinished: (listener: () => void) => () => void\n /** Framework-only. */\n dehydrate: (opts?: { requestAssets?: ManifestRouteAssets }) => Promise<void>\n /** Framework-only. */\n takeBufferedScripts: () => RouterManagedTag | undefined\n /** Framework-only: takes buffered router-owned HTML. */\n takeBufferedHtml: () => string | undefined\n /** Framework-only. */\n liftScriptBarrier: () => void\n}\n\nexport interface RouterSsrLifecycle {\n onServerSsrAttach?: Array<(serverSsr: ServerSsr) => void>\n}\n\nexport type AnyRouterWithContext<TContext> = RouterCore<\n AnyRouteWithContext<TContext>,\n any,\n any,\n any,\n any\n>\n\nexport type AnyRouter = RouterCore<any, any, any, any, any>\n\nexport interface ViewTransitionOptions {\n types:\n | Array<string>\n | ((locationChangeInfo: {\n fromLocation?: ParsedLocation\n toLocation: ParsedLocation\n pathChanged: boolean\n hrefChanged: boolean\n hashChanged: boolean\n }) => Array<string> | false)\n}\n\n// TODO where is this used? can we remove this?\n/**\n * Convert an unknown error into a minimal, serializable object.\n * Includes name and message (and stack in development).\n */\nexport function defaultSerializeError(err: unknown) {\n if (err instanceof Error) {\n const obj = {\n name: err.name,\n message: err.message,\n }\n\n if (process.env.NODE_ENV === 'development') {\n ;(obj as any).stack = err.stack\n }\n\n return obj\n }\n\n return {\n data: err,\n }\n}\n\n/** Options for configuring trailing-slash behavior. */\nexport const trailingSlashOptions = {\n always: 'always',\n never: 'never',\n preserve: 'preserve',\n} as const\n\nexport type TrailingSlashOption =\n (typeof trailingSlashOptions)[keyof typeof trailingSlashOptions]\n\n/**\n * Compute whether path, href or hash changed between previous and current\n * resolved locations.\n */\nexport function getLocationChangeInfo(\n location: ParsedLocation,\n resolvedLocation?: ParsedLocation,\n) {\n return {\n fromLocation: resolvedLocation,\n toLocation: location,\n pathChanged: resolvedLocation?.pathname !== location.pathname,\n hrefChanged: resolvedLocation?.href !== location.href,\n hashChanged: resolvedLocation?.hash !== location.hash,\n }\n}\n\n/**\n * Return only state owned by the application, excluding volatile history\n * bookkeeping. Mask payloads (`__tempLocation`/`__tempKey`) are kept: they\n * distinguish otherwise-identical locations.\n */\nexport function _getUserHistoryState({\n key: _key,\n __TSR_key: _tsrKey,\n __TSR_index: _tsrIndex,\n __hashScrollIntoViewOptions: _hashScroll,\n ...state\n}: ParsedHistoryState): HistoryState {\n return state\n}\n\n/** Run route lifecycle callbacks in leave/enter/stay phases. */\nexport function runRouteLifecycle(\n router: AnyRouter,\n previous: Array<AnyRouteMatch>,\n matches: Array<AnyRouteMatch>,\n owner?: LoadTransaction,\n): void {\n for (const match of previous) {\n if (owner && router._tx !== owner) {\n return\n }\n if (!matches.some((candidate) => candidate.routeId === match.routeId)) {\n ;(router.routesById as Record<string, AnyRoute>)[\n match.routeId\n ]!.options.onLeave?.(match)\n }\n }\n for (const match of matches) {\n if (owner && router._tx !== owner) {\n return\n }\n const route = (router.routesById as Record<string, AnyRoute>)[\n match.routeId\n ]!\n route.options[\n previous.some((candidate) => candidate.routeId === match.routeId)\n ? 'onStay'\n : 'onEnter'\n ]?.(match)\n }\n}\n\ntype LightweightRouteMatchResult = [\n matchedRoutes: ReadonlyArray<AnyRoute>,\n fullPath: string,\n search: Record<string, unknown>,\n params: Record<string, unknown>,\n]\n\ntype LightweightRouteMatchCacheEntry = [\n lastMatchId: string | undefined,\n result: LightweightRouteMatchResult,\n]\n\nexport type CreateRouterFn = <\n TRouteTree extends AnyRoute,\n TTrailingSlashOption extends TrailingSlashOption = 'never',\n TDefaultStructuralSharingOption extends boolean = false,\n TRouterHistory extends RouterHistory = RouterHistory,\n TDehydrated extends Record<string, any> = Record<string, any>,\n>(\n options: undefined extends number\n ? 'strictNullChecks must be enabled in tsconfig.json'\n : RouterConstructorOptions<\n TRouteTree,\n TTrailingSlashOption,\n TDefaultStructuralSharingOption,\n TRouterHistory,\n TDehydrated\n >,\n) => RouterCore<\n TRouteTree,\n TTrailingSlashOption,\n TDefaultStructuralSharingOption,\n TRouterHistory,\n TDehydrated\n>\n\ndeclare global {\n // eslint-disable-next-line no-var\n var __TSR_CACHE__:\n | {\n routeTree: AnyRoute\n processRouteTreeResult: ProcessRouteTreeResult<AnyRoute>\n resolvePathCache: LRUCache<string, string>\n }\n | undefined\n}\n\nexport interface RouterCore<\n in out TRouteTree extends AnyRoute,\n in out TTrailingSlashOption extends TrailingSlashOption,\n in out TDefaultStructuralSharingOption extends boolean,\n in out TRouterHistory extends RouterHistory = RouterHistory,\n in out TDehydrated extends Record<string, any> = Record<string, any>,\n> {\n shouldViewTransition?: boolean | ViewTransitionOptions\n /** Current client load transaction and owner of navigation writes. */\n _tx?: LoadTransaction\n /** Joinable in-flight loader generations keyed by match ID. */\n _flights?: Map<string, LoaderFlight>\n /** Active speculative lanes retained for cancellation, invalidation, and cache clearing. */\n _preloads?: Map<AbortController, Array<AnyRouteMatch>>\n /** Owns cancellable work before a client transaction publishes. */\n _preflight?: AbortController\n /** Transfers one reconstructed SSR prefix into its initial client load. */\n _handoff?: HydrationHandoff\n /** Pending-boundary reveal and minimum-visible timing state. */\n _pending?: PendingSession\n /** Result of the latest server load, used to render or redirect. */\n _serverResult?: ServerLoadResult\n /** Framework publication waiting for an exact render acknowledgement. */\n _rendered?: [\n offered?: Array<AnyRouteMatch>,\n settle?: (rendered: boolean) => void,\n ]\n /** Development-only HMR reload for a route and its descendants. */\n _refreshRoute: (() => Promise<void>) | undefined\n /** Development-only replacement for a route's lazy chunk owner. */\n _replaceRouteChunk:\n | ((route: AnyRoute, lazyFn: AnyRoute['lazyFn']) => void)\n | undefined\n}\n\nexport type HydrationHandoff = [\n claim: () => AbortController | undefined,\n finish: (matches?: Array<AnyRouteMatch>) => number | undefined,\n]\n\n/**\n * Core, framework-agnostic router engine that powers TanStack Router.\n *\n * Provides navigation, matching, loading, preloading, caching and event APIs\n * used by framework adapters (React/Solid). Prefer framework helpers like\n * `createRouter` in app code.\n *\n * @link https://tanstack.com/router/latest/docs/framework/react/api/router/RouterType\n */\nexport class RouterCore<\n in out TRouteTree extends AnyRoute,\n in out TTrailingSlashOption extends TrailingSlashOption,\n in out TDefaultStructuralSharingOption extends boolean,\n in out TRouterHistory extends RouterHistory = RouterHistory,\n in out TDehydrated extends Record<string, any> = Record<string, any>,\n> {\n // Option-independent properties\n tempLocationKey: string | undefined = `${Math.round(\n Math.random() * 10000000,\n )}`\n _scroll: {\n next: boolean\n // True until the current PUSH/REPLACE renders, so its hash owns window scroll.\n hash?: boolean\n restoring?: boolean\n restoration?: boolean\n reset?: boolean\n } = { next: true }\n subscribers = new Set<RouterListener<RouterEvent>>()\n /** Accepted off-screen loader generations keyed by match ID. */\n _cache = new Map<string, AnyRouteMatch>()\n /** Accepted semantic lane, excluding temporary pending presentation. */\n _committed: Array<AnyRouteMatch> = []\n\n // Must build in constructor\n stores!: RouterStores<TRouteTree>\n private getStoreConfig!: GetStoreConfig\n batch!: (fn: () => void) => void\n\n options!: PickAsRequired<\n RouterOptions<\n TRouteTree,\n TTrailingSlashOption,\n TDefaultStructuralSharingOption,\n TRouterHistory,\n TDehydrated\n >,\n 'stringifySearch' | 'parseSearch' | 'context'\n >\n history!: TRouterHistory\n rewrite?: LocationRewrite\n origin?: string\n latestLocation!: ParsedLocation<FullSearchSchema<TRouteTree>>\n _pendingLocation?: ParsedLocation<FullSearchSchema<TRouteTree>>\n basepath!: string\n routeTree!: TRouteTree\n routesById!: RoutesById<TRouteTree>\n routesByPath!: RoutesByPath<TRouteTree>\n processedTree!: ProcessedTree<TRouteTree, any, any>\n resolvePathCache!: LRUCache<string, string>\n private routeBranchCache = new WeakMap<AnyRoute, ReadonlyArray<AnyRoute>>()\n private lightweightCache = new WeakMap<\n ParsedLocation,\n LightweightRouteMatchCacheEntry\n >()\n isServer!: boolean\n pathParamsDecoder?: (encoded: string) => string\n protocolAllowlist!: Set<string>\n\n /**\n * @deprecated Use the `createRouter` function instead\n */\n constructor(\n options: RouterConstructorOptions<\n TRouteTree,\n TTrailingSlashOption,\n TDefaultStructuralSharingOption,\n TRouterHistory,\n TDehydrated\n >,\n getStoreConfig: GetStoreConfig,\n ) {\n this.getStoreConfig = getStoreConfig\n\n this.update({\n defaultPreloadDelay: 50,\n defaultPendingMs: 1000,\n defaultPendingMinMs: 500,\n context: undefined!,\n ...options,\n caseSensitive: options.caseSensitive ?? false,\n notFoundMode: options.notFoundMode ?? 'fuzzy',\n stringifySearch: options.stringifySearch ?? defaultStringifySearch,\n parseSearch: options.parseSearch ?? defaultParseSearch,\n protocolAllowlist:\n options.protocolAllowlist ?? DEFAULT_PROTOCOL_ALLOWLIST,\n })\n\n if (!(isServer ?? typeof document === 'undefined')) {\n self.__TSR_ROUTER__ = this\n }\n }\n\n startTransition: StartTransitionFn = async (fn) => {\n fn()\n return false\n }\n isShell() {\n return !!this.options.isShell\n }\n\n update: UpdateFn<\n TRouteTree,\n TTrailingSlashOption,\n TDefaultStructuralSharingOption,\n TRouterHistory,\n TDehydrated\n > = (newOptions) => {\n if (process.env.NODE_ENV !== 'production') {\n if (newOptions.notFoundRoute) {\n console.warn(\n 'The notFoundRoute API is deprecated and will be removed in the next major version. See https://tanstack.com/router/v1/docs/framework/react/guide/not-found-errors#migrating-from-notfoundroute for more info.',\n )\n }\n }\n\n const prevOptions = this.options\n const prevBasepath = this.basepath ?? prevOptions?.basepath ?? '/'\n const basepathWasUnset = this.basepath === undefined\n const prevRewriteOption = prevOptions?.rewrite\n\n this.options = {\n ...prevOptions,\n ...newOptions,\n }\n\n this.isServer =\n this.options.isServer ?? isServer ?? typeof document === 'undefined'\n\n this.protocolAllowlist = new Set(this.options.protocolAllowlist)\n\n if (this.options.pathParamsAllowedCharacters)\n this.pathParamsDecoder = compileDecodeCharMap(\n this.options.pathParamsAllowedCharacters,\n )\n\n if (\n !this.history ||\n (this.options.history && this.options.history !== this.history)\n ) {\n if (!this.options.history) {\n if (!(isServer ?? this.isServer)) {\n this.history = createBrowserHistory() as TRouterHistory\n }\n } else {\n this.history = this.options.history\n }\n }\n\n this.origin = this.options.origin\n if (!this.origin) {\n if (\n !(isServer ?? this.isServer) &&\n window?.origin &&\n window.origin !== 'null'\n ) {\n this.origin = window.origin\n } else {\n // fallback for the server, can be overridden by calling router.update({origin}) on the server\n this.origin = 'http://localhost'\n }\n }\n\n if (this.history) {\n this.updateLatestLocation()\n }\n\n if (this.options.routeTree !== this.routeTree) {\n this.routeTree = this.options.routeTree as TRouteTree\n let processRouteTreeResult: ProcessRouteTreeResult<TRouteTree>\n if (\n (isServer ?? this.isServer) &&\n process.env.NODE_ENV !== 'development' &&\n globalThis.__TSR_CACHE__ &&\n globalThis.__TSR_CACHE__.routeTree === this.routeTree\n ) {\n const cached = globalThis.__TSR_CACHE__\n this.resolvePathCache = cached.resolvePathCache\n processRouteTreeResult = cached.processRouteTreeResult as any\n } else {\n this.resolvePathCache = createLRUCache(1000)\n processRouteTreeResult = this.buildRouteTree()\n // only cache if nothing else is cached yet\n if (\n (isServer ?? this.isServer) &&\n process.env.NODE_ENV !== 'development' &&\n globalThis.__TSR_CACHE__ === undefined\n ) {\n globalThis.__TSR_CACHE__ = {\n routeTree: this.routeTree,\n processRouteTreeResult: processRouteTreeResult as any,\n resolvePathCache: this.resolvePathCache,\n }\n }\n }\n this.setRoutes(processRouteTreeResult)\n }\n\n if (!this.stores && this.latestLocation) {\n const config = this.getStoreConfig(this)\n this.batch = config.batch\n this.stores = createRouterStores(this.latestLocation, config)\n\n if (!(isServer ?? this.isServer)) {\n setupScrollRestoration(this)\n }\n }\n\n const nextBasepath = this.options.basepath ?? '/'\n const nextRewriteOption = this.options.rewrite\n const basepathChanged = basepathWasUnset || prevBasepath !== nextBasepath\n const rewriteChanged = prevRewriteOption !== nextRewriteOption\n\n if (basepathChanged || rewriteChanged) {\n this.basepath = nextBasepath\n\n const rewrites: Array<LocationRewrite> = []\n const trimmed = trimPath(nextBasepath)\n if (trimmed && trimmed !== '/') {\n rewrites.push(\n rewriteBasepath({\n basepath: nextBasepath,\n }),\n )\n }\n if (nextRewriteOption) {\n rewrites.push(nextRewriteOption)\n }\n\n this.rewrite =\n rewrites.length === 0\n ? undefined\n : rewrites.length === 1\n ? rewrites[0]\n : composeRewrites(rewrites)\n\n if (this.history) {\n this.updateLatestLocation()\n }\n\n if (this.stores) {\n this.stores.location.set(this.latestLocation)\n }\n }\n }\n\n get state(): RouterState<TRouteTree> {\n return this.stores.__store.get()\n }\n\n updateLatestLocation = () => {\n this.latestLocation = this.parseLocation(\n this.history.location,\n this.latestLocation,\n )\n }\n\n buildRouteTree = () => {\n const result = processRouteTree(\n this.routeTree,\n this.options.caseSensitive,\n (route, i) => {\n route.init({\n originalIndex: i,\n })\n },\n )\n if (this.options.routeMasks) {\n processRouteMasks(this.options.routeMasks, result.processedTree)\n }\n\n return result\n }\n\n setRoutes({\n routesById,\n routesByPath,\n processedTree,\n }: ProcessRouteTreeResult<TRouteTree>) {\n this.routesById = routesById as RoutesById<TRouteTree>\n this.routesByPath = routesByPath as RoutesByPath<TRouteTree>\n this.processedTree = processedTree\n\n const notFoundRoute = this.options.notFoundRoute\n\n if (notFoundRoute) {\n notFoundRoute.init({\n originalIndex: 99999999999,\n })\n this.routesById[notFoundRoute.id] = notFoundRoute\n }\n }\n\n /**\n * Subscribe to router lifecycle events like `onBeforeNavigate`, `onLoad`,\n * `onResolved`, etc. Returns an unsubscribe function.\n *\n * @link https://tanstack.com/router/latest/docs/framework/react/api/router/RouterEventsType\n */\n subscribe: SubscribeFn = (eventType, fn) => {\n const listener: RouterListener<any> = {\n eventType,\n fn,\n }\n\n this.subscribers.add(listener)\n\n return () => {\n this.subscribers.delete(listener)\n }\n }\n\n emit: EmitFn = (routerEvent) => {\n for (const listener of this.subscribers) {\n if (listener.eventType === routerEvent.type) {\n try {\n listener.fn(routerEvent)\n } catch (e) {\n console.error(e)\n }\n }\n }\n }\n\n /**\n * Parse a HistoryLocation into a strongly-typed ParsedLocation using the\n * current router options, rewrite rules and search parser/stringifier.\n */\n parseLocation: ParseLocationFn<TRouteTree> = (\n locationToParse,\n previousLocation,\n ) => {\n const parse = ({\n pathname,\n search,\n hash,\n href,\n state,\n }: HistoryLocation): ParsedLocation<FullSearchSchema<TRouteTree>> => {\n // Fast path: no rewrite configured and pathname doesn't need encoding\n // Characters that need encoding: space, high unicode, control chars\n // eslint-disable-next-line no-control-regex\n if (!this.rewrite && !/[ \\x00-\\x1f\\x7f\\u0080-\\uffff]/.test(pathname)) {\n const parsedSearch = this.options.parseSearch(search)\n const searchStr = this.options.stringifySearch(parsedSearch)\n\n return {\n href: pathname + searchStr + hash,\n publicHref: pathname + searchStr + hash,\n pathname: decodePath(pathname).path,\n external: false,\n searchStr,\n search: nullReplaceEqualDeep(\n previousLocation?.search,\n parsedSearch,\n ) as any,\n hash: decodePath(hash.slice(1)).path,\n state: replaceEqualDeep(previousLocation?.state, state),\n }\n }\n\n // Before we do any processing, we need to allow rewrites to modify the URL\n // build up the full URL by combining the href from history with the router's origin\n const fullUrl = new URL(href, this.origin)\n\n const url = executeRewriteInput(this.rewrite, fullUrl)\n\n const parsedSearch = this.options.parseSearch(url.search)\n const searchStr = this.options.stringifySearch(parsedSearch)\n // Make sure our final url uses the re-stringified pathname, search, and has for consistency\n // (We were already doing this, so just keeping it for now)\n url.search = searchStr\n\n const fullPath = url.href.replace(url.origin, '')\n\n return {\n href: fullPath,\n publicHref: href,\n pathname: decodePath(url.pathname).path,\n external: !!this.rewrite && url.origin !== this.origin,\n searchStr,\n search: nullReplaceEqualDeep(\n previousLocation?.search,\n parsedSearch,\n ) as any,\n hash: decodePath(url.hash.slice(1)).path,\n state: replaceEqualDeep(previousLocation?.state, state),\n }\n }\n\n const location = parse(locationToParse)\n\n const { __tempLocation, __tempKey } = location.state\n\n if (__tempLocation && (!__tempKey || __tempKey === this.tempLocationKey)) {\n // Sync up the location keys\n const parsedTempLocation = parse(__tempLocation) as any\n parsedTempLocation.state.key = location.state.key // TODO: Remove in v2 - use __TSR_key instead\n parsedTempLocation.state.__TSR_key = location.state.__TSR_key\n\n delete parsedTempLocation.state.__tempLocation\n\n return {\n ...parsedTempLocation,\n maskedLocation: location,\n }\n }\n return location\n }\n\n /** Resolve a path using the router's trailing-slash policy. */\n resolvePathWithBase = (from: string, path: string) => {\n return resolvePath({\n base: from,\n to: path,\n trailingSlash: this.options.trailingSlash,\n cache: this.resolvePathCache,\n })\n }\n\n private getRouteBranch(route: AnyRoute) {\n let branch = this.routeBranchCache.get(route)\n if (!branch) {\n branch = buildRouteBranch(route)\n this.routeBranchCache.set(route, branch)\n }\n return branch\n }\n\n matchRoutes: MatchRoutesFn = (\n pathnameOrNext: string | ParsedLocation,\n locationSearchOrOpts?: AnySchema | MatchRoutesOpts,\n opts?: MatchRoutesOpts,\n ) => {\n if (typeof pathnameOrNext === 'string') {\n return this.matchRoutesInternal(\n {\n pathname: pathnameOrNext,\n search: locationSearchOrOpts,\n } as ParsedLocation,\n opts,\n )\n }\n\n return this.matchRoutesInternal(pathnameOrNext, locationSearchOrOpts)\n }\n\n private matchRoutesInternal(\n next: ParsedLocation,\n opts?: MatchRoutesOpts,\n ): Array<AnyRouteMatch> {\n const [initialMatchedRoutes, rawParams, foundRoute] = this.getMatchedRoutes(\n next.pathname,\n )\n let matchedRoutes = initialMatchedRoutes\n let isGlobalNotFound = false\n\n // Check to see if the route needs a 404 entry\n if (\n // If we found a route, and it's not an index route and we have left over path\n foundRoute\n ? foundRoute.path !== '/' && rawParams['**']\n : // Or if we didn't find a route and we have left over path\n trimPathRight(next.pathname)\n ) {\n // If the user has defined an (old) 404 route, use it\n if (this.options.notFoundRoute) {\n matchedRoutes = [...matchedRoutes, this.options.notFoundRoute]\n } else {\n // If there is no routes found during path matching\n isGlobalNotFound = true\n }\n }\n\n const _notFoundRouteId = isGlobalNotFound\n ? findGlobalNotFoundRouteId(this.options.notFoundMode, matchedRoutes)\n : undefined\n\n const matches = new Array<AnyRouteMatch>(matchedRoutes.length)\n const committed = this._committed\n const previousAt = (route: AnyRoute, index: number) => {\n const match = committed[index]\n return match?.routeId === route.id\n ? match\n : route === this.options.notFoundRoute\n ? committed.find((candidate) => candidate.routeId === route.id)\n : undefined\n }\n\n let strictParams: AnyRouteMatch['_strictParams'] | undefined\n for (let index = 0; index < matchedRoutes.length; index++) {\n const route = matchedRoutes[index]!\n // Take each matched route and resolve + validate its search params\n // This has to happen serially because each route's search params\n // can depend on the parent route's search params\n // It must also happen before we create the match so that we can\n // pass the search params to the route's potential key function\n // which is used to uniquely identify the route match in state\n\n const parentMatch = matches[index - 1]\n\n let preMatchSearch: Record<string, any>\n let strictMatchSearch: Record<string, any>\n let searchError: any\n {\n // Validate the search params and stabilize them\n const parentSearch = parentMatch?.search ?? next.search\n const parentStrictSearch = parentMatch?._strictSearch ?? undefined\n\n try {\n const strictSearch =\n validateSearch(route.options.validateSearch, { ...parentSearch }) ??\n undefined\n\n preMatchSearch = {\n ...parentSearch,\n ...strictSearch,\n }\n strictMatchSearch = { ...parentStrictSearch, ...strictSearch }\n } catch (err: any) {\n let searchParamError = err\n if (!(err instanceof SearchParamError)) {\n searchParamError = new SearchParamError(err.message, {\n cause: err,\n })\n }\n\n if (opts?.throwOnError) {\n throw searchParamError\n }\n\n preMatchSearch = parentSearch\n strictMatchSearch = {}\n searchError = searchParamError\n }\n }\n // This is where we need to call route.options.loaderDeps() to get any additional\n // deps that the route's loader function might need to run. We need to do this\n // before we create the match so that we can pass the deps to the route's\n // potential key function which is used to uniquely identify the route match in state\n\n let loaderDeps: any = ''\n let loaderDepsHash = ''\n try {\n loaderDeps =\n route.options.loaderDeps?.({\n search: preMatchSearch,\n }) ?? ''\n loaderDepsHash = loaderDeps ? JSON.stringify(loaderDeps) || '' : ''\n } catch (cause) {\n if (opts?.throwOnError) {\n throw cause\n }\n searchError ??= cause\n }\n // Match identity must only use the raw params captured from the URL.\n const { interpolatedPath, usedParams } = interpolatePath({\n path: route.fullPath,\n params: rawParams,\n decoder: this.pathParamsDecoder,\n server: this.isServer,\n })\n\n // Seed planning from the accepted same-ID cache generation first, then\n // from the committed generation for this route. Presentation stores are\n // deliberately not a semantic reuse authority.\n const matchId =\n // route.id for disambiguation\n route.id +\n // interpolatedPath for param changes\n interpolatedPath +\n // explicit deps\n loaderDepsHash\n\n const previousMatch = previousAt(route, index)\n const existingMatch =\n process.env.NODE_ENV !== 'production' && opts?._rematerialize\n ? undefined\n : (this._cache.get(matchId) ??\n (previousMatch?.id === matchId ? previousMatch : undefined))\n\n // Carry parsed ancestors forward without mutating the raw route params.\n strictParams =\n existingMatch?._strictParams ?? Object.assign(usedParams, strictParams)\n\n let paramsError: unknown\n\n if (!existingMatch) {\n try {\n extractStrictParams(route, strictParams)\n } catch (err: any) {\n if (isNotFound(err) || isRedirect(err)) {\n paramsError = err\n } else {\n paramsError = new PathParamError(err.message, {\n cause: err,\n })\n }\n\n if (opts?.throwOnError) {\n throw paramsError\n }\n }\n }\n\n const cause = previousMatch ? 'stay' : 'enter'\n\n let match: AnyRouteMatch\n\n if (existingMatch) {\n match = {\n ...existingMatch,\n cause,\n search: previousMatch\n ? nullReplaceEqualDeep(previousMatch.search, preMatchSearch)\n : nullReplaceEqualDeep(existingMatch.search, preMatchSearch),\n _strictSearch: strictMatchSearch,\n searchError,\n }\n } else {\n const status = routeNeedsLoad(route) ? 'pending' : 'success'\n\n match = {\n id: matchId,\n ssr: (isServer ?? this.isServer) ? undefined : route.options.ssr,\n index,\n routeId: route.id,\n params: previousMatch?.params ?? strictParams,\n _strictParams: strictParams,\n pathname: interpolatedPath,\n updatedAt: Date.now(),\n search: previousMatch\n ? nullReplaceEqualDeep(previousMatch.search, preMatchSearch)\n : preMatchSearch,\n _strictSearch: strictMatchSearch,\n searchError,\n status,\n isFetching: false,\n error: undefined,\n paramsError,\n context: {},\n abortController: opts?._controller ?? new AbortController(),\n cause,\n loaderDeps: previousMatch\n ? replaceEqualDeep(previousMatch.loaderDeps, loaderDeps)\n : loaderDeps,\n invalid: false,\n preload: false,\n staticData: route.options.staticData || {},\n fullPath: route.fullPath,\n }\n }\n\n // If we have a global not found, mark the right match as global not found\n const _notFound = _notFoundRouteId === route.id\n if (match._notFound && !_notFound) {\n match.error = undefined\n }\n match._notFound = _notFound\n\n matches[index] = match\n }\n\n for (let index = 0; index < matches.length; index++) {\n const match = matches[index]!\n match.params =\n match.cause === 'stay'\n ? nullReplaceEqualDeep(match.params, strictParams)\n : strictParams!\n if (opts?._controller) {\n match.context = {}\n }\n }\n\n return matches\n }\n\n getMatchedRoutes: GetMatchRoutesFn = (pathname) => {\n const rawParams: Record<string, string> = Object.create(null)\n const match = findRouteMatch(\n trimPathRight(pathname),\n this.processedTree,\n true,\n )\n if (match) {\n Object.assign(rawParams, match.rawParams)\n }\n return [\n match?.branch || [this.routesById[rootRouteId]!],\n rawParams,\n match?.route,\n ]\n }\n\n /**\n * Lightweight route matching for buildLocation.\n * Only computes fullPath, accumulated search, and params - skipping expensive\n * operations like AbortController, loaderDeps, and full match objects.\n */\n private matchRoutesLightweight(\n location: ParsedLocation,\n ): LightweightRouteMatchResult {\n const lastRouteId = last(this.stores.ids.get())\n const lastStateMatch = lastRouteId\n ? this.stores.byRoute.get(lastRouteId)!.get()\n : undefined\n const lastStateMatchId = lastStateMatch?.id\n const cached = this.lightweightCache.get(location)\n if (cached && cached[0 /* lastMatchId */] === lastStateMatchId) {\n return cached[1 /* result */]\n }\n\n const [matchedRoutes, rawParams] = this.getMatchedRoutes(location.pathname)\n const lastRoute = last(matchedRoutes)!\n\n // I don't know if we should run the full search middleware chain, or just validateSearch\n // // Accumulate search validation through the route chain\n // const accumulatedSearch: Record<string, unknown> = applySearchMiddleware({\n // search: { ...location.search },\n // dest: location,\n // destRoutes: matchedRoutes,\n // _includeValidateSearch: true,\n // })\n\n // Accumulate search validation through route chain\n const accumulatedSearch = { ...location.search }\n for (const route of matchedRoutes) {\n try {\n Object.assign(\n accumulatedSearch,\n validateSearch(route.options.validateSearch, accumulatedSearch),\n )\n } catch {\n // Ignore errors, we're not actually routing\n }\n }\n\n // Determine params: reuse from state if possible, otherwise parse\n const canReuseParams =\n lastStateMatch &&\n lastStateMatch.routeId === lastRoute.id &&\n lastStateMatch.pathname === location.pathname\n\n let params: Record<string, unknown>\n if (canReuseParams) {\n params = lastStateMatch.params\n } else {\n // Parse params through the route chain\n const strictParams: Record<string, unknown> = Object.assign(\n Object.create(null),\n rawParams,\n )\n for (const route of matchedRoutes) {\n try {\n extractStrictParams(route, strictParams)\n } catch {\n // Ignore errors, we're not actually routing\n }\n }\n params = strictParams\n }\n\n const result: LightweightRouteMatchResult = [\n matchedRoutes,\n lastRoute.fullPath,\n accumulatedSearch,\n params,\n ]\n this.lightweightCache.set(location, [lastStateMatchId, result])\n return result\n }\n\n /**\n * Build the next ParsedLocation from navigation options without committing.\n * Resolves `to`/`from`, params/search/hash/state, applies search validation\n * and middlewares, and returns a stable, stringified location object.\n *\n * @link https://tanstack.com/router/latest/docs/framework/react/api/router/RouterType#buildlocation-method\n */\n buildLocation: BuildLocationFn = (opts) => {\n const build = (\n dest: BuildNextOptions & {\n unmaskOnReload?: boolean\n } = {},\n ): ParsedLocation => {\n if (dest.href) {\n const parsed = parseHref(dest.href, {} as ParsedHistoryState)\n dest = {\n ...dest,\n to: executeRewriteInput(\n this.rewrite,\n new URL(parsed.pathname, this.origin),\n ).pathname,\n search: this.options.parseSearch(parsed.search),\n hash: parsed.hash.slice(1),\n }\n }\n\n // We allow the caller to override the current location\n const currentLocation =\n dest._fromLocation || this._pendingLocation || this.latestLocation\n\n // Use lightweight matching - only computes what buildLocation needs\n // (fullPath, search, params) without creating full match objects\n const lightweightResult = this.matchRoutesLightweight(currentLocation)\n\n // check that from path exists in the current route tree\n // do this check only on navigations during test or development\n if (\n dest.from &&\n process.env.NODE_ENV !== 'production' &&\n dest._isNavigate\n ) {\n const [allFromMatches] = this.getMatchedRoutes(dest.from)\n\n const matchedFrom = findLast(\n lightweightResult[0 /* matchedRoutes */],\n (d) => {\n return comparePaths(d.fullPath, dest.from!)\n },\n )\n\n const matchedCurrent = findLast(allFromMatches, (d) => {\n return comparePaths(d.fullPath, lightweightResult[1 /* fullPath */])\n })\n\n // for from to be invalid it shouldn't just be unmatched to currentLocation\n // but the currentLocation should also be unmatched to from\n if (!matchedFrom && !matchedCurrent) {\n console.warn(`Could not find match for from: ${dest.from}`)\n }\n }\n\n const defaultedFromPath =\n dest.unsafeRelative === 'path'\n ? currentLocation.pathname\n : (dest.from ?? lightweightResult[1 /* fullPath */])\n\n // From search should always use the current location\n const fromSearch = lightweightResult[2 /* search */]\n // Same with params. It can't hurt to provide as many as possible\n const fromParams = lightweightResult[3 /* params */]\n\n const nextTo = this.resolvePathWithBase(\n defaultedFromPath,\n dest.to ? `${dest.to}` : '.',\n )\n\n // Resolve the next params\n let nextParams = resolveNextParams(dest.params, fromParams)\n\n const destRoute = this.routesByPath[\n trimPathRight(nextTo) as keyof typeof this.routesByPath\n ] as AnyRoute | undefined\n\n let destRoutes: ReadonlyArray<AnyRoute>\n if (destRoute) {\n destRoutes = this.getRouteBranch(destRoute)\n } else if (nextTo.includes('$')) {\n // Route templates must match routesByPath exactly. A miss here is a\n // typed destination mismatch, not a concrete URL to route-match.\n destRoutes = []\n } else {\n const [matchedRoutes, rawParams, foundRoute] =\n this.getMatchedRoutes(nextTo)\n destRoutes = matchedRoutes\n\n if (\n this.options.notFoundRoute &&\n (!foundRoute || (foundRoute.path !== '/' && rawParams['**']))\n ) {\n destRoutes = [...destRoutes, this.options.notFoundRoute]\n }\n }\n\n // If there are any params, we need to stringify them\n if (destRoutes.length && hasKeys(nextParams)) {\n for (const route of destRoutes) {\n const fn =\n route.options.params?.stringify ?? route.options.stringifyParams\n if (fn) {\n if (nextParams === fromParams) {\n nextParams = Object.assign(Object.create(null), nextParams)\n }\n try {\n Object.assign(nextParams, fn(nextParams))\n } catch {\n // Ignore errors here. When a paired parseParams is defined,\n // extractStrictParams will re-throw during route matching,\n // storing the error on the match and allowing the route's\n // errorComponent to render. If no parseParams is defined,\n // the stringify error is silently dropped.\n }\n }\n }\n }\n\n const nextPathname = opts.leaveParams\n ? // Keep path params uninterpolated for matchRoute/template matching.\n nextTo\n : decodePath(\n interpolatePath({\n path: nextTo,\n params: nextParams,\n decoder: this.pathParamsDecoder,\n server: this.isServer,\n }).interpolatedPath,\n ).path\n\n if (\n process.env.NODE_ENV !== 'production' &&\n destRoute &&\n !opts.leaveParams\n ) {\n try {\n const foundRoute = this.getMatchedRoutes(nextPathname)[2]\n if (foundRoute?.id !== destRoute.id) {\n console.warn(\n `Generated path \"${nextPathname}\" for route \"${destRoute.id}\" matched route \"${foundRoute?.id}\" instead. This can happen when multiple route templates resolve to the same URL. Use the route template that matches the intended route, or adjust params.stringify if it changed the target path.`,\n )\n }\n } catch {\n // Ignore roundtrip validation errors. The generated location will be\n // handled by the normal navigation flow.\n }\n }\n\n // Resolve the next search\n let nextSearch = fromSearch\n if (opts._includeValidateSearch && this.options.search?.strict) {\n const validatedSearch = {}\n destRoutes.forEach((route) => {\n if (route.options.validateSearch) {\n try {\n Object.assign(\n validatedSearch,\n validateSearch(route.options.validateSearch, {\n ...validatedSearch,\n ...nextSearch,\n }),\n )\n } catch {\n // ignore errors here because they are already handled in matchRoutes\n }\n }\n })\n nextSearch = validatedSearch\n }\n\n nextSearch = applySearchMiddleware(\n nextSearch,\n dest,\n destRoutes,\n opts._includeValidateSearch,\n )\n\n // Replace the equal deep\n nextSearch = nullReplaceEqualDeep(fromSearch, nextSearch)\n\n // Stringify the next search\n const searchStr = this.options.stringifySearch(nextSearch)\n\n // Resolve the next hash\n const hash =\n dest.hash === true\n ? currentLocation.hash\n : dest.hash\n ? functionalUpdate(dest.hash, currentLocation.hash)\n : undefined\n\n // Resolve the next hash string\n const hashStr = hash ? `#${hash}` : ''\n\n // Resolve the next state\n let nextState =\n dest.state === true\n ? currentLocation.state\n : dest.state\n ? functionalUpdate(dest.state, currentLocation.state)\n : {}\n\n // Replace the equal deep\n if (dest.state) {\n nextState = replaceEqualDeep(currentLocation.state, nextState)\n }\n\n // Create the full path of the location\n const fullPath = `${nextPathname}${searchStr}${hashStr}`\n\n // Compute href and publicHref without URL construction when no rewrite\n let href: string\n let publicHref: string\n let external = false\n\n if (this.rewrite) {\n // With rewrite, we need to construct URL to apply the rewrite\n const url = new URL(fullPath, this.origin)\n const rewrittenUrl = executeRewriteOutput(this.rewrite, url)\n href = url.href.replace(url.origin, '')\n // If rewrite changed the origin, publicHref needs full URL\n // Otherwise just use the path components\n if (rewrittenUrl.origin !== this.origin) {\n publicHref = rewrittenUrl.href\n external = true\n } else {\n publicHref =\n rewrittenUrl.pathname + rewrittenUrl.search + rewrittenUrl.hash\n }\n } else {\n // Fast path: no rewrite, skip URL construction entirely\n // fullPath is already the correct href (origin-stripped)\n // We need to encode non-ASCII (unicode) characters for the href\n // since decodePath decoded them from the interpolated path\n href = encodePathLikeUrl(fullPath)\n publicHref = href\n }\n\n return {\n publicHref,\n href,\n pathname: nextPathname,\n search: nextSearch,\n searchStr,\n state: nextState as any,\n hash: hash ?? '',\n external,\n unmaskOnReload: dest.unmaskOnReload,\n }\n }\n\n const next = build(opts)\n\n if (opts.mask) {\n next.maskedLocation = build({\n from: opts.from,\n ...opts.mask,\n })\n } else if (this.options.routeMasks) {\n const match = findFlatMatch<RouteMask<TRouteTree>>(\n next.pathname,\n this.processedTree,\n )\n if (match) {\n const params = Object.assign(Object.create(null), match.rawParams)\n const { from: _from, params: maskParams, ...maskProps } = match.route\n\n // If mask has a params function, call it with the matched params as context\n // Otherwise, use the matched params or the provided params value\n const nextParams = resolveNextParams(maskParams, params)\n\n next.maskedLocation = build({\n from: opts.from,\n ...maskProps,\n params: nextParams,\n })\n }\n }\n\n return next\n }\n\n _commitPromise: (Promise<void> & { resolve: () => void }) | undefined\n\n /**\n * Commit a previously built location to history (push/replace), optionally\n * using view transitions and scroll restoration options.\n */\n commitLocation: CommitLocationFn = async ({\n viewTransition,\n ignoreBlocker,\n ...next\n }) => {\n let historyAction: HistoryAction | undefined\n const isSameLocation =\n trimPathRight(this.latestLocation.href) === trimPathRight(next.href) &&\n deepEqual(\n _getUserHistoryState(next.state),\n _getUserHistoryState(this.latestLocation.state),\n )\n\n const previousCommitPromise = this._commitPromise\n let resolve!: () => void\n const commitPromise = new Promise<void>((done) => {\n resolve = done\n }) as Promise<void> & { resolve: () => void }\n commitPromise.resolve = () => {\n resolve()\n previousCommitPromise?.resolve()\n }\n this._commitPromise = commitPromise\n\n // Don't commit to history if nothing changed\n if (isSameLocation) {\n this.load()\n } else {\n let {\n // eslint-disable-next-line prefer-const\n maskedLocation,\n // eslint-disable-next-line prefer-const\n hashScrollIntoView,\n ...nextHistory\n } = next\n\n if (maskedLocation) {\n nextHistory = {\n ...maskedLocation,\n state: {\n ...maskedLocation.state,\n __tempKey: undefined,\n __tempLocation: {\n ...nextHistory,\n search: nextHistory.searchStr,\n state: {\n ...nextHistory.state,\n __tempKey: undefined!,\n __tempLocation: undefined!,\n __TSR_key: undefined!,\n key: undefined!, // TODO: Remove in v2 - use __TSR_key instead\n },\n },\n },\n }\n\n if (\n nextHistory.unmaskOnReload ??\n this.options.unmaskOnReload ??\n false\n ) {\n nextHistory.state.__tempKey = this.tempLocationKey\n }\n }\n\n nextHistory.state.__hashScrollIntoViewOptions =\n hashScrollIntoView ?? this.options.defaultHashScrollIntoView ?? true\n\n this.shouldViewTransition = viewTransition\n\n historyAction = next.replace ? 'REPLACE' : 'PUSH'\n\n this.history[historyAction === 'REPLACE' ? 'replace' : 'push'](\n nextHistory.publicHref,\n nextHistory.state,\n { ignoreBlocker },\n )\n\n // Without a subscribed adapter the history commit cannot trigger the\n // load itself. The same-location branch already loads directly.\n if (!this.history.subscribers.size) {\n this.load({ action: { type: historyAction } })\n }\n }\n\n this._scroll.next = next.resetScroll ?? true\n\n return this._commitPromise\n }\n\n /** Convenience helper: build a location from options, then commit it. */\n buildAndCommitLocation = ({\n replace,\n resetScroll,\n hashScrollIntoView,\n viewTransition,\n ignoreBlocker,\n ...rest\n }: BuildNextOptions & CommitLocationOptions = {}) => {\n const location = this.buildLocation({\n ...(rest as any),\n _includeValidateSearch: true,\n })\n\n this._pendingLocation = location as ParsedLocation<\n FullSearchSchema<TRouteTree>\n >\n\n const commitPromise = this.commitLocation({\n ...location,\n viewTransition,\n replace,\n resetScroll,\n hashScrollIntoView,\n ignoreBlocker,\n })\n\n // Clear pending location after commit starts\n // We do this on next microtask to allow synchronous navigate calls to chain\n queueMicrotask(() => {\n if (this._pendingLocation === location) {\n this._pendingLocation = undefined\n }\n })\n\n return commitPromise\n }\n\n /**\n * Imperatively navigate using standard `NavigateOptions`. When `reloadDocument`\n * or an absolute `href` is provided, performs a full document navigation.\n * Otherwise, builds and commits a client-side location.\n *\n * @link https://tanstack.com/router/latest/docs/framework/react/api/router/NavigateOptionsType\n */\n navigate: NavigateFn = async ({\n to,\n reloadDocument,\n href,\n publicHref,\n ...rest\n }) => {\n let hrefIsUrl = false\n\n if (href) {\n try {\n new URL(`${href}`)\n hrefIsUrl = true\n } catch {}\n }\n\n if (hrefIsUrl && !reloadDocument) {\n reloadDocument = true\n }\n\n if (reloadDocument) {\n // When to is provided, always build a location to get the proper publicHref\n // (this handles redirects where href might be an internal path from resolveRedirect)\n // When only href is provided (no to), use it directly as it should already\n // be a complete path (possibly with basepath)\n if (to !== undefined || !href) {\n const location = this.buildLocation({ to, ...rest } as any)\n // Use publicHref which contains the path (origin-stripped is fine for reload)\n href = href ?? location.publicHref\n publicHref = publicHref ?? location.publicHref\n }\n\n // Use publicHref when available and href is not a full URL,\n // otherwise use href directly (which may already include basepath)\n const reloadHref = !hrefIsUrl && publicHref ? publicHref : href\n\n // Block dangerous protocols like javascript:, blob:, data:\n // These could execute arbitrary code if passed to window.location\n if (isDangerousProtocol(reloadHref, this.protocolAllowlist)) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n `Blocked navigation to dangerous protocol: ${reloadHref}`,\n )\n }\n return\n }\n\n // Check blockers for external URLs unless ignoreBlocker is true\n if (!rest.ignoreBlocker) {\n // Cast to access internal getBlockers method\n const historyWithBlockers = this.history as any\n const blockers = historyWithBlockers.getBlockers?.() ?? []\n for (const blocker of blockers) {\n if (blocker?.blockerFn) {\n const shouldBlock = await blocker.blockerFn({\n currentLocation: this.latestLocation,\n nextLocation: this.latestLocation, // External URLs don't have a next location in our router\n action: 'PUSH',\n })\n if (shouldBlock) {\n return\n }\n }\n }\n }\n\n if (rest.replace) {\n window.location.replace(reloadHref)\n } else {\n window.location.href = reloadHref\n }\n return\n }\n\n return this.buildAndCommitLocation({\n ...rest,\n href,\n to: to as string,\n _isNavigate: true,\n })\n }\n\n load: LoadFn = async (opts): Promise<void> => {\n if (isServer ?? this.isServer) {\n return loadServerRoute(this, opts)\n }\n\n this.updateLatestLocation()\n if (opts?.action) {\n this._scroll.hash =\n opts.action.type === 'PUSH' || opts.action.type === 'REPLACE'\n }\n await loadClientRoute(this, opts)\n }\n\n startViewTransition = (fn: () => Promise<void>) => {\n // Determine if we should start a view transition from the navigation\n // or from the router default\n const shouldViewTransition =\n this.shouldViewTransition ?? this.options.defaultViewTransition\n\n // Reset the view transition flag\n this.shouldViewTransition = undefined\n\n // Attempt to start a view transition (or just apply the changes if we can't)\n if (\n shouldViewTransition &&\n !(isServer ?? typeof document === 'undefined') &&\n typeof (document as any).startViewTransition === 'function'\n ) {\n // lib.dom.ts doesn't support viewTransition types variant yet.\n // TODO: Fix this when dom types are updated\n let startViewTransitionParams: any\n\n if (\n typeof shouldViewTransition === 'object' &&\n window.CSS?.supports?.('selector(:active-view-transition-type(a))')\n ) {\n const next = this.latestLocation\n const prevLocation = this.stores.resolvedLocation.get()\n\n const resolvedViewTransitionTypes =\n typeof shouldViewTransition.types === 'function'\n ? shouldViewTransition.types(\n getLocationChangeInfo(next, prevLocation),\n )\n : shouldViewTransition.types\n\n if (resolvedViewTransitionTypes === false) {\n return fn()\n }\n\n startViewTransitionParams = {\n update: fn,\n types: resolvedViewTransitionTypes,\n }\n } else {\n startViewTransitionParams = fn\n }\n\n return (document as any).startViewTransition(startViewTransitionParams)\n .updateCallbackDone\n }\n return fn()\n }\n\n /**\n * Invalidate selected match generations and optionally force current matches\n * back into a pending state.\n *\n * - Marks committed and cached matches whose IDs are selected as invalid.\n * - Retires selected active preloads so older work cannot publish fresh data.\n *\n * The next load decides when to publish pending UI, so invalidation does not\n * mutate the currently rendered status.\n */\n invalidate: InvalidateFn<\n RouterCore<\n TRouteTree,\n TTrailingSlashOption,\n TDefaultStructuralSharingOption,\n TRouterHistory,\n TDehydrated\n >\n > = (opts) => {\n const committedMatches = this._committed\n const filter = opts?.filter\n const preloads = this._preloads\n const invalidIds = new Set(\n [\n ...committedMatches,\n ...this._cache.values(),\n ...[...(preloads?.values() ?? [])].flat(),\n ...(this._tx?.[3 /* matches */] ?? []),\n ]\n .filter(\n (match) => !filter || filter(match as MakeRouteMatchUnion<this>),\n )\n .map((match) => match.id),\n )\n const discardedPreloads: Array<AbortController> = []\n for (const [controller, matches] of preloads ?? []) {\n if (matches.some((match) => invalidIds.has(match.id))) {\n preloads!.delete(controller)\n discardedPreloads.push(controller)\n }\n }\n const invalidate = (d: MakeRouteMatch<TRouteTree>) => {\n if (invalidIds.has(d.id)) {\n const route = this.routesById[d.routeId] as AnyRoute\n const next = {\n ...d,\n invalid: true,\n ...((opts?.forcePending ||\n d.status === 'error' ||\n d.status === 'notFound') &&\n routeNeedsLoad(route)\n ? ({ status: 'pending', error: undefined } as const)\n : undefined),\n }\n // Invalidation replaces this owner; it does not create another lease.\n ;(d as AnyRouteMatch & { _flight?: LoaderFlight })._flight = undefined\n return next\n }\n return d\n }\n\n this._committed = committedMatches.map(invalidate)\n // Cache entries are settled successes. Retiring matching active preload\n // owners makes an in-place stale mark sufficient while preserving data.\n for (const [id, match] of this._cache) {\n if (invalidIds.has(id)) {\n match.invalid = true\n if (opts?.forcePending) {\n match.status = 'pending'\n }\n }\n }\n // The superseding load must not discover any same-ID generation selected\n // for replacement. Existing owners release it in their normal order.\n for (const id of invalidIds) {\n this._flights?.delete(id)\n }\n for (const controller of discardedPreloads) {\n controller.abort()\n }\n\n this.shouldViewTransition = false\n return this.load({ sync: opts?.sync })\n }\n\n resolveRedirect = (redirect: AnyRedirect): AnyRedirect => {\n const locationHeader = redirect.headers.get('Location')\n\n if (!redirect.options.href) {\n const location = this.buildLocation(redirect.options)\n const href = location.publicHref || '/'\n redirect.options.href = href\n redirect.headers.set('Location', href)\n } else if (locationHeader) {\n try {\n const url = new URL(locationHeader)\n if (this.origin && url.origin === this.origin) {\n const href = url.pathname + url.search + url.hash\n redirect.options.href = href\n redirect.headers.set('Location', href)\n }\n } catch {\n // ignore invalid URLs\n }\n }\n\n if (\n redirect.options.href &&\n // Check for dangerous protocols before processing the redirect\n isDangerousProtocol(redirect.options.href, this.protocolAllowlist)\n ) {\n throw new Error(\n process.env.NODE_ENV !== 'production'\n ? `Redirect blocked: unsafe protocol in href \"${redirect.options.href}\". Allowed protocols: ${Array.from(this.protocolAllowlist).join(', ')}.`\n : 'Redirect blocked: unsafe protocol',\n )\n }\n\n if (!redirect.headers.get('Location')) {\n redirect.headers.set('Location', redirect.options.href)\n }\n\n return redirect\n }\n\n clearCache: ClearCacheFn<this> = (opts) => {\n const cached = this._cache\n const preloads = this._preloads\n const filter = opts?.filter\n const discarded: Array<AnyRouteMatch> = []\n const discardedIds: Array<string> = []\n for (const [id, match] of cached) {\n if (!filter || filter(match as MakeRouteMatchUnion<this>)) {\n discardedIds.push(id)\n discarded.push(match)\n }\n }\n const abort: Array<AbortController> = []\n for (const [controller, matches] of preloads ?? []) {\n if (!filter || matches.some(filter as any)) {\n abort.push(controller)\n discarded.push(...matches)\n }\n }\n\n // Run every public filter before changing authority, then prune both maps\n // before releasing a public loader\n // signal, whose abort listeners can synchronously reenter the router.\n for (const id of discardedIds) {\n cached.delete(id)\n }\n for (const controller of abort) {\n preloads!.delete(controller)\n }\n // clearCache is a force-retirement boundary, so a final discarded lease\n // must not use the normal zero-owner handoff window.\n for (const match of discarded as Array<\n AnyRouteMatch & { _flight?: LoaderFlight }\n >) {\n const flight = match._flight\n match._flight = undefined\n if (flight && !--flight[2 /* leases */]) {\n if (this._flights?.get(match.id) === flight) {\n this._flights.delete(match.id)\n }\n abort.push(flight[1 /* controller */])\n }\n }\n for (const controller of abort) {\n controller.abort()\n }\n }\n\n loadRouteChunk: (\n route: AnyRoute,\n componentType?: 'errorComponent' | 'notFoundComponent' | false,\n ) => Promise<void> | undefined = loadRouteChunk\n\n preloadRoute: PreloadRouteFn<\n TRouteTree,\n TTrailingSlashOption,\n TDefaultStructuralSharingOption,\n TRouterHistory,\n TDehydrated\n > = (opts) => preloadClientRoute(this, opts)\n\n matchRoute: MatchRouteFn<\n TRouteTree,\n TTrailingSlashOption,\n TDefaultStructuralSharingOption,\n TRouterHistory\n > = (location, opts) => {\n const matchLocation = {\n ...location,\n to: location.to\n ? this.resolvePathWithBase(location.from || '', location.to as string)\n : undefined,\n params: location.params || {},\n leaveParams: true,\n }\n const next = this.buildLocation(matchLocation as any)\n\n const isPending = this.stores.status.get() === 'pending'\n if (opts?.pending && !isPending) {\n return false\n }\n\n const pending = opts?.pending ?? !isPending\n\n const baseLocation = pending\n ? this.latestLocation\n : this.stores.resolvedLocation.get() || this.stores.location.get()\n\n const match = findSingleMatch(\n next.pathname,\n opts?.caseSensitive ?? false,\n opts?.fuzzy ?? false,\n baseLocation.pathname,\n this.processedTree,\n )\n\n if (!match) {\n return false\n }\n\n if (location.params) {\n if (!deepEqual(match.rawParams, location.params, { partial: true })) {\n return false\n }\n }\n\n if (opts?.includeSearch ?? true) {\n return deepEqual(baseLocation.search, next.search, { partial: true })\n ? match.rawParams\n : false\n }\n\n return match.rawParams\n }\n\n ssr?: {\n manifest: Manifest | undefined\n }\n\n serverSsr?: ServerSsr\n\n serverSsrLifecycle?: RouterSsrLifecycle\n}\n\n/**\n * In non-production environments,\n * augment the RouterCore class with a `_refreshRoute` method\n * dedicated to HMR.\n */\nif (process.env.NODE_ENV !== 'production') {\n RouterCore.prototype._replaceRouteChunk = replaceRouteChunk\n RouterCore.prototype._refreshRoute = async function () {\n this._serverResult = undefined\n this.updateLatestLocation()\n await refreshClientRoute(this)\n }\n}\n\n/** Error thrown when search parameter validation fails. */\nexport class SearchParamError extends Error {}\n\n/** Error thrown when path parameter parsing/validation fails. */\nexport class PathParamError extends Error {}\n\nconst normalize = (str: string) =>\n str.endsWith('/') && str.length > 1 ? str.slice(0, -1) : str\nfunction comparePaths(a: string, b: string) {\n return normalize(a) === normalize(b)\n}\n\n/**\n * Lazily import a module function and forward arguments to it, retaining\n * parameter and return types for the selected export key.\n */\nexport function lazyFn<\n T extends Record<string, (...args: Array<any>) => any>,\n TKey extends keyof T = 'default',\n>(fn: () => Promise<T>, key?: TKey) {\n return async (\n ...args: Parameters<T[TKey]>\n ): Promise<Awaited<ReturnType<T[TKey]>>> => {\n const imported = await fn()\n return imported[key || 'default'](...args)\n }\n}\n\n/** Create an initial RouterState from a parsed location. */\nexport function getInitialRouterState(\n location: ParsedLocation,\n): RouterState<any> {\n return {\n isLoading: false,\n status: 'idle',\n resolvedLocation: undefined,\n location,\n matches: [],\n }\n}\n\nfunction validateSearch(validateSearch: AnyValidator, input: unknown): unknown {\n if (validateSearch == null) return {}\n\n if ('~standard' in validateSearch) {\n const result = validateSearch['~standard'].validate(input)\n\n if (result instanceof Promise)\n throw new SearchParamError('Async validation not supported')\n\n if (result.issues)\n throw new SearchParamError(JSON.stringify(result.issues, undefined, 2), {\n cause: result,\n })\n\n return result.value\n }\n\n if ('parse' in validateSearch) {\n return validateSearch.parse(input)\n }\n\n if (typeof validateSearch === 'function') {\n return validateSearch(input)\n }\n\n return {}\n}\n\nfunction applySearchMiddleware(\n search: any,\n dest: BuildNextOptions,\n destRoutes: ReadonlyArray<AnyRoute>,\n includeValidateSearch: boolean | undefined,\n) {\n const middlewares = [] as Array<SearchMiddleware<any>>\n\n for (const route of destRoutes) {\n const routeOptions = route.options\n if ('search' in routeOptions) {\n if (routeOptions.search?.middlewares) {\n middlewares.push(...routeOptions.search.middlewares)\n }\n }\n // TODO remove preSearchFilters and postSearchFilters in v2\n else if (routeOptions.preSearchFilters || routeOptions.postSearchFilters) {\n const legacyMiddleware: SearchMiddleware<any> = ({ search, next }) => {\n const nextSearch = routeOptions.preSearchFilters\n ? routeOptions.preSearchFilters.reduce(\n (prev, next) => next(prev),\n search,\n )\n : search\n\n const result = next(nextSearch)\n\n return routeOptions.postSearchFilters\n ? routeOptions.postSearchFilters.reduce(\n (prev, next) => next(prev),\n result,\n )\n : result\n }\n middlewares.push(legacyMiddleware)\n }\n\n const routeValidateSearch = routeOptions.validateSearch\n if (includeValidateSearch && routeValidateSearch) {\n const validate: SearchMiddleware<any> = ({ search, next, meta }) => {\n const result = next(search)\n try {\n const validated = validateSearch(routeValidateSearch, result) as any\n\n if (meta && validated) {\n for (const key in validated) {\n if (!(key in result)) {\n ;(meta.defaulted ||= new Map()).set(key, validated[key])\n }\n }\n }\n return { ...result, ...validated }\n } catch {\n // ignore errors here because they are already handled in matchRoutes\n }\n return result\n }\n\n middlewares.push(validate)\n }\n }\n\n const applyNext = (\n index: number,\n currentSearch: any,\n meta?: SearchMiddlewareMeta,\n ): any => {\n // no more middlewares left, return the current search\n if (index >= middlewares.length) {\n if (!dest.search) {\n return {}\n }\n if (dest.search === true) {\n return currentSearch\n }\n const result = functionalUpdate(dest.search, currentSearch)\n if (meta) {\n meta.explicit = result\n }\n return result\n }\n\n const next = (newSearch: any, collectMeta?: true): any => {\n if (collectMeta) {\n const nextMeta = meta || ({} as SearchMiddlewareMeta)\n return {\n search: applyNext(index + 1, newSearch, nextMeta),\n meta: nextMeta,\n }\n }\n return applyNext(index + 1, newSearch, meta)\n }\n\n return (middlewares[index]! as any)({ search: currentSearch, next, meta })\n }\n\n return applyNext(0, search)\n}\n\nfunction findGlobalNotFoundRouteId(\n notFoundMode: 'root' | 'fuzzy' | undefined,\n routes: ReadonlyArray<AnyRoute>,\n) {\n if (notFoundMode !== 'root') {\n let fallback\n for (let i = routes.length - 1; i >= 0; i--) {\n const route = routes[i]!\n if (route.options.notFoundComponent) {\n return route.id\n }\n fallback ||= route.children && route.id\n }\n if (fallback) {\n return fallback\n }\n }\n return rootRouteId\n}\n\nfunction resolveNextParams(\n spec: unknown,\n base: Record<string, unknown>,\n): Record<string, unknown> {\n if (spec === false || spec === null) {\n return Object.create(null)\n }\n if ((spec ?? true) === true) {\n return base\n }\n const next = Object.assign(Object.create(null), base)\n return Object.assign(next, functionalUpdate(spec as any, next))\n}\n\nfunction extractStrictParams(\n route: AnyRoute,\n accumulatedParams: Record<string, unknown>,\n) {\n const parseParams = route.options.params?.parse ?? route.options.parseParams\n if (parseParams) {\n Object.assign(\n accumulatedParams,\n parseParams(accumulatedParams as Record<string, string>),\n )\n }\n}\n"],"mappings":"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"}