import type { InferFileRouteTypes } from './fileRoute' import type { AddTrailingSlash, RemoveTrailingSlashes } from './link' import type { AnyRoute } from './route' import type { AnyRouter, TrailingSlashOption } from './router' import type { PartialMergeAll } from './utils' export type ParseRoute = TRouteTree extends { types: { children: infer TChildren } } ? unknown extends TChildren ? TAcc : TChildren extends ReadonlyArray ? ParseRoute : ParseRoute< TChildren[keyof TChildren], TAcc | TChildren[keyof TChildren] > : TAcc export type ParseRouteWithoutBranches = ParseRoute extends infer TRoute extends AnyRoute ? TRoute extends any ? unknown extends TRoute['types']['children'] ? TRoute : TRoute['types']['children'] extends ReadonlyArray ? '/' extends TRoute['types']['children'][number]['path'] ? never : TRoute : '/' extends TRoute['types']['children'][keyof TRoute['types']['children']]['path'] ? never : TRoute : never : never export type CodeRoutesById = ParseRoute extends infer TRoutes extends AnyRoute ? { [K in TRoutes as K['id']]: K } : never export type RoutesById = InferFileRouteTypes extends never ? CodeRoutesById : InferFileRouteTypes['fileRoutesById'] export type RouteById = Extract< RoutesById[TId & keyof RoutesById], AnyRoute > export type CodeRouteIds = ParseRoute extends infer TRoutes extends AnyRoute ? TRoutes['id'] : never export type RouteIds = InferFileRouteTypes extends never ? CodeRouteIds : InferFileRouteTypes['id'] export type ParentPath = TrailingSlashOptionByRouter extends 'always' ? '../' : TrailingSlashOptionByRouter extends 'never' ? '..' : '../' | '..' export type CurrentPath = TrailingSlashOptionByRouter extends 'always' ? './' : TrailingSlashOptionByRouter extends 'never' ? '.' : './' | '.' export type ToPath = TrailingSlashOptionByRouter extends 'always' ? AddTrailingSlash : TrailingSlashOptionByRouter extends 'never' ? RemoveTrailingSlashes : AddTrailingSlash | RemoveTrailingSlashes export type CatchAllPaths = | CurrentPath | ParentPath export type CodeRoutesByPath = ParseRoute extends infer TRoutes extends AnyRoute ? { [K in TRoutes as K['fullPath']]: K } : never export type RoutesByPath = InferFileRouteTypes extends never ? CodeRoutesByPath : InferFileRouteTypes['fileRoutesByFullPath'] export type RouteByPath = Extract< RoutesByPath[TPath & keyof RoutesByPath], AnyRoute > export type CodeRoutePaths = ParseRoute extends infer TRoutes extends AnyRoute ? TRoutes['fullPath'] : never export type RoutePaths = unknown extends TRouteTree ? string : | (InferFileRouteTypes extends never ? CodeRoutePaths : InferFileRouteTypes['fullPaths']) | '/' export type RouteToPathAlwaysTrailingSlash = TRoute['path'] extends '/' ? TRoute['fullPath'] : TRoute['fullPath'] extends '/' ? TRoute['fullPath'] : `${TRoute['fullPath']}/` export type RouteToPathNeverTrailingSlash = TRoute['path'] extends '/' ? TRoute['fullPath'] extends '/' ? TRoute['fullPath'] : RemoveTrailingSlashes : TRoute['fullPath'] export type RouteToPathPreserveTrailingSlash = | RouteToPathNeverTrailingSlash | RouteToPathAlwaysTrailingSlash export type RouteToPathByTrailingSlashOption = { always: RouteToPathAlwaysTrailingSlash preserve: RouteToPathPreserveTrailingSlash never: RouteToPathNeverTrailingSlash } export type TrailingSlashOptionByRouter = TrailingSlashOption extends TRouter['options']['trailingSlash'] ? 'never' : NonNullable export type RouteToByRouter< TRouter extends AnyRouter, TRoute extends AnyRoute, > = RouteToPathByTrailingSlashOption[TrailingSlashOptionByRouter] export type CodeRouteToPath = ParseRouteWithoutBranches extends infer TRoute extends AnyRoute ? TRoute extends any ? RouteToByRouter : never : never export type FileRouteToPath< TRouter extends AnyRouter, TTo = InferFileRouteTypes['to'], TTrailingSlashOption = TrailingSlashOptionByRouter, > = 'never' extends TTrailingSlashOption ? TTo : 'always' extends TTrailingSlashOption ? AddTrailingSlash : TTo | AddTrailingSlash export type RouteToPath = unknown extends TRouter ? string : InferFileRouteTypes extends never ? CodeRouteToPath : FileRouteToPath export type CodeRoutesByToPath = ParseRouteWithoutBranches extends infer TRoutes extends AnyRoute ? { [TRoute in TRoutes as RouteToByRouter]: TRoute } : never export type RoutesByToPath = InferFileRouteTypes extends never ? CodeRoutesByToPath : InferFileRouteTypes['fileRoutesByTo'] export type CodeRouteByToPath = Extract< RoutesByToPath[TTo & keyof RoutesByToPath], AnyRoute > export type FileRouteByToPath = 'never' extends TrailingSlashOptionByRouter ? CodeRouteByToPath : 'always' extends TrailingSlashOptionByRouter ? TTo extends '/' ? CodeRouteByToPath : TTo extends `${infer TPath}/` ? CodeRouteByToPath : never : CodeRouteByToPath< TRouter, TTo extends '/' ? TTo : RemoveTrailingSlashes > export type RouteByToPath = InferFileRouteTypes extends never ? CodeRouteByToPath : FileRouteByToPath export type FullSearchSchema = ParseRoute extends infer TRoutes extends AnyRoute ? PartialMergeAll : never export type FullSearchSchemaInput = ParseRoute extends infer TRoutes extends AnyRoute ? PartialMergeAll : never export type AllParams = ParseRoute extends infer TRoutes extends AnyRoute ? PartialMergeAll : never export type AllContext = ParseRoute extends infer TRoutes extends AnyRoute ? PartialMergeAll : never export type AllLoaderData = ParseRoute extends infer TRoutes extends AnyRoute ? PartialMergeAll : never