import { InferFileRouteTypes } from './fileRoute.js'; import { AddTrailingSlash, RemoveTrailingSlashes } from './link.js'; import { AnyRoute } from './route.js'; import { AnyRouter, TrailingSlashOption } from './router.js'; import { PartialMergeAll } from './utils.js'; export type ParseRoute = TRouteTree extends { types: { children: infer TChildren; }; } ? unknown extends TChildren ? TAcc : TChildren extends ReadonlyArray ? ParseRoute : ParseRoute : 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[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[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 = RouteToPathByTrailingSlashOption[TrailingSlashOptionByRouter]; export type CodeRouteToPath = ParseRouteWithoutBranches extends infer TRoute extends AnyRoute ? TRoute extends any ? RouteToByRouter : never : never; export type FileRouteToPath['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[TTo & keyof RoutesByToPath], AnyRoute>; export type FileRouteByToPath = 'never' extends TrailingSlashOptionByRouter ? CodeRouteByToPath : 'always' extends TrailingSlashOptionByRouter ? TTo extends '/' ? CodeRouteByToPath : TTo extends `${infer TPath}/` ? CodeRouteByToPath : never : CodeRouteByToPath>; 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;