import { joinPaths, trimPathLeft } from './path' import { notFound } from './not-found' import { rootRouteId } from './root' import type { LazyRoute } from './fileRoute' import type { NotFoundError } from './not-found' import type { NavigateOptions, ParsePathParams } from './link' import type { ParsedLocation } from './location' import type { AnyRouteMatch, MakeRouteMatchFromRoute, MakeRouteMatchUnion, RouteMatch, } from './Matches' import type { RootRouteId } from './root' import type { ParseRoute, RouteById, RoutePaths } from './routeInfo' import type { AnyRouter, RegisteredRouter } from './router' import type { BuildLocationFn, NavigateFn } from './RouterProvider' import type { Assign, Constrain, Expand, IntersectAssign, NoInfer, } from './utils' import type { AnySchema, AnyStandardSchemaValidator, AnyValidator, AnyValidatorAdapter, AnyValidatorObj, DefaultValidator, ResolveSearchValidatorInput, ResolveValidatorOutput, StandardSchemaValidator, ValidatorAdapter, ValidatorFn, ValidatorObj, } from './validators' export type AnyPathParams = {} export type SearchSchemaInput = { __TSearchSchemaInput__: 'TSearchSchemaInput' } export type AnyContext = {} export interface RouteContext {} export type PreloadableObj = { preload?: () => Promise } export type RoutePathOptions = | { path: TPath } | { id: TCustomId } export interface StaticDataRouteOption {} export type RoutePathOptionsIntersection = { path: TPath id: TCustomId } export type SearchFilter = (prev: TInput) => TResult export type SearchMiddlewareContext = { search: TSearchSchema next: (newSearch: TSearchSchema) => TSearchSchema } export type SearchMiddleware = ( ctx: SearchMiddlewareContext, ) => TSearchSchema export type ResolveId< TParentRoute, TCustomId extends string, TPath extends string, > = TParentRoute extends { id: infer TParentId extends string } ? RoutePrefix : RootRouteId export type InferFullSearchSchema = TRoute extends { types: { fullSearchSchema: infer TFullSearchSchema } } ? TFullSearchSchema : {} export type InferFullSearchSchemaInput = TRoute extends { types: { fullSearchSchemaInput: infer TFullSearchSchemaInput } } ? TFullSearchSchemaInput : {} export type InferAllParams = TRoute extends { types: { allParams: infer TAllParams } } ? TAllParams : {} export type InferAllContext = unknown extends TRoute ? TRoute : TRoute extends { types: { allContext: infer TAllContext } } ? TAllContext : {} export type ResolveSearchSchemaFnInput = TSearchValidator extends (input: infer TSearchSchemaInput) => any ? TSearchSchemaInput extends SearchSchemaInput ? Omit : ResolveSearchSchemaFn : AnySchema export type ResolveSearchSchemaInput = TSearchValidator extends AnyStandardSchemaValidator ? NonNullable['input'] : TSearchValidator extends AnyValidatorAdapter ? TSearchValidator['types']['input'] : TSearchValidator extends AnyValidatorObj ? ResolveSearchSchemaFnInput : ResolveSearchSchemaFnInput export type ResolveSearchSchemaFn = TSearchValidator extends ( ...args: any ) => infer TSearchSchema ? TSearchSchema : AnySchema export type ResolveSearchSchema = unknown extends TSearchValidator ? TSearchValidator : TSearchValidator extends AnyStandardSchemaValidator ? NonNullable['output'] : TSearchValidator extends AnyValidatorAdapter ? TSearchValidator['types']['output'] : TSearchValidator extends AnyValidatorObj ? ResolveSearchSchemaFn : ResolveSearchSchemaFn export type ParseSplatParams = TPath & `${string}$` extends never ? TPath & `${string}$/${string}` extends never ? never : '_splat' : '_splat' export interface SplatParams { _splat?: string } export type ResolveParams = ParseSplatParams extends never ? Record, string> : Record, string> & SplatParams export type ParseParamsFn = ( rawParams: ResolveParams, ) => TParams extends Record, any> ? TParams : Record, any> export type StringifyParamsFn = ( params: TParams, ) => ResolveParams export type ParamsOptions = { params?: { parse?: ParseParamsFn stringify?: StringifyParamsFn } /** @deprecated Use params.parse instead */ parseParams?: ParseParamsFn /** @deprecated Use params.stringify instead */ stringifyParams?: StringifyParamsFn } interface RequiredStaticDataRouteOption { staticData: StaticDataRouteOption } interface OptionalStaticDataRouteOption { staticData?: StaticDataRouteOption } export type UpdatableStaticRouteOption = {} extends StaticDataRouteOption ? OptionalStaticDataRouteOption : RequiredStaticDataRouteOption export type MetaDescriptor = | { charSet: 'utf-8' } | { title: string } | { name: string; content: string } | { property: string; content: string } | { httpEquiv: string; content: string } | { 'script:ld+json': LdJsonObject } | { tagName: 'meta' | 'link'; [name: string]: string } | Record type LdJsonObject = { [Key in string]: LdJsonValue } & { [Key in string]?: LdJsonValue | undefined } type LdJsonArray = Array | ReadonlyArray type LdJsonPrimitive = string | number | boolean | null type LdJsonValue = LdJsonPrimitive | LdJsonObject | LdJsonArray export type RouteLinkEntry = {} export type SearchValidator = | ValidatorObj | ValidatorFn | ValidatorAdapter | StandardSchemaValidator | undefined export type AnySearchValidator = SearchValidator export type DefaultSearchValidator = SearchValidator< Record, AnySchema > export type RoutePrefix< TPrefix extends string, TPath extends string, > = string extends TPath ? RootRouteId : TPath extends string ? TPrefix extends RootRouteId ? TPath extends '/' ? '/' : `/${TrimPath}` : `${TPrefix}/${TPath}` extends '/' ? '/' : `/${TrimPathLeft<`${TrimPathRight}/${TrimPath}`>}` : never export type TrimPath = '' extends T ? '' : TrimPathRight> export type TrimPathLeft = T extends `${RootRouteId}/${infer U}` ? TrimPathLeft : T extends `/${infer U}` ? TrimPathLeft : T export type TrimPathRight = T extends '/' ? '/' : T extends `${infer U}/` ? TrimPathRight : T export type LooseReturnType = T extends ( ...args: Array ) => infer TReturn ? TReturn : never export type LooseAsyncReturnType = T extends ( ...args: Array ) => infer TReturn ? TReturn extends Promise ? TReturn : TReturn : never export type ContextReturnType = unknown extends TContextFn ? TContextFn : LooseReturnType extends never ? AnyContext : LooseReturnType export type ContextAsyncReturnType = unknown extends TContextFn ? TContextFn : LooseAsyncReturnType extends never ? AnyContext : LooseAsyncReturnType export type ResolveRouteContext = Assign< ContextReturnType, ContextAsyncReturnType > export type ResolveLoaderData = unknown extends TLoaderFn ? TLoaderFn : LooseAsyncReturnType extends never ? undefined : LooseAsyncReturnType export type ResolveFullSearchSchema< TParentRoute extends AnyRoute, TSearchValidator, > = unknown extends TParentRoute ? ResolveValidatorOutput : IntersectAssign< InferFullSearchSchema, ResolveValidatorOutput > export type ResolveFullSearchSchemaInput< TParentRoute extends AnyRoute, TSearchValidator, > = IntersectAssign< InferFullSearchSchemaInput, ResolveSearchValidatorInput > export type ResolveAllParamsFromParent< TParentRoute extends AnyRoute, TParams, > = Assign, TParams> export type RouteContextParameter< TParentRoute extends AnyRoute, TRouterContext, > = unknown extends TParentRoute ? TRouterContext : Assign> export type BeforeLoadContextParameter< TParentRoute extends AnyRoute, TRouterContext, TRouteContextFn, > = Assign< RouteContextParameter, ContextReturnType > export type ResolveAllContext< TParentRoute extends AnyRoute, TRouterContext, TRouteContextFn, TBeforeLoadFn, > = Assign< BeforeLoadContextParameter, ContextAsyncReturnType > export interface FullSearchSchemaOption< in out TParentRoute extends AnyRoute, in out TSearchValidator, > { search: Expand> } export interface RemountDepsOptions< in out TRouteId, in out TFullSearchSchema, in out TAllParams, in out TLoaderDeps, > { routeId: TRouteId search: TFullSearchSchema params: TAllParams loaderDeps: TLoaderDeps } export type MakeRemountDepsOptionsUnion< TRouteTree extends AnyRoute = RegisteredRouter['routeTree'], > = ParseRoute extends infer TRoute extends AnyRoute ? TRoute extends any ? RemountDepsOptions< TRoute['id'], TRoute['types']['fullSearchSchema'], TRoute['types']['allParams'], TRoute['types']['loaderDeps'] > : never : never export interface RouteTypes< in out TParentRoute extends AnyRoute, in out TPath extends string, in out TFullPath extends string, in out TCustomId extends string, in out TId extends string, in out TSearchValidator, in out TParams, in out TRouterContext, in out TRouteContextFn, in out TBeforeLoadFn, in out TLoaderDeps, in out TLoaderFn, in out TChildren, in out TFileRouteTypes, > { parentRoute: TParentRoute path: TPath to: TrimPathRight fullPath: TFullPath customId: TCustomId id: TId searchSchema: ResolveValidatorOutput searchSchemaInput: ResolveSearchValidatorInput searchValidator: TSearchValidator fullSearchSchema: ResolveFullSearchSchema fullSearchSchemaInput: ResolveFullSearchSchemaInput< TParentRoute, TSearchValidator > params: TParams allParams: ResolveAllParamsFromParent routerContext: TRouterContext routeContext: ResolveRouteContext routeContextFn: TRouteContextFn beforeLoadFn: TBeforeLoadFn allContext: ResolveAllContext< TParentRoute, TRouterContext, TRouteContextFn, TBeforeLoadFn > children: TChildren loaderData: ResolveLoaderData loaderDeps: TLoaderDeps fileRouteTypes: TFileRouteTypes } export type ResolveFullPath< TParentRoute extends AnyRoute, TPath extends string, TPrefixed = RoutePrefix, > = TPrefixed extends RootRouteId ? '/' : TPrefixed export interface RouteExtensions {} export type RouteLazyFn = ( lazyFn: () => Promise, ) => TRoute export type RouteAddChildrenFn< in out TParentRoute extends AnyRoute, in out TPath extends string, in out TFullPath extends string, in out TCustomId extends string, in out TId extends string, in out TSearchValidator, in out TParams, in out TRouterContext, in out TRouteContextFn, in out TBeforeLoadFn, in out TLoaderDeps extends Record, in out TLoaderFn, in out TFileRouteTypes, > = ( children: Constrain< TNewChildren, ReadonlyArray | Record >, ) => Route< TParentRoute, TPath, TFullPath, TCustomId, TId, TSearchValidator, TParams, TRouterContext, TRouteContextFn, TBeforeLoadFn, TLoaderDeps, TLoaderFn, TNewChildren, TFileRouteTypes > export type RouteAddFileChildrenFn< in out TParentRoute extends AnyRoute, in out TPath extends string, in out TFullPath extends string, in out TCustomId extends string, in out TId extends string, in out TSearchValidator, in out TParams, in out TRouterContext, in out TRouteContextFn, in out TBeforeLoadFn, in out TLoaderDeps extends Record, in out TLoaderFn, in out TFileRouteTypes, > = ( children: TNewChildren, ) => Route< TParentRoute, TPath, TFullPath, TCustomId, TId, TSearchValidator, TParams, TRouterContext, TRouteContextFn, TBeforeLoadFn, TLoaderDeps, TLoaderFn, TNewChildren, TFileRouteTypes > export type RouteAddFileTypesFn< TParentRoute extends AnyRoute, TPath extends string, TFullPath extends string, TCustomId extends string, TId extends string, TSearchValidator, TParams, TRouterContext, TRouteContextFn, TBeforeLoadFn, TLoaderDeps extends Record, TLoaderFn, TChildren, > = () => Route< TParentRoute, TPath, TFullPath, TCustomId, TId, TSearchValidator, TParams, TRouterContext, TRouteContextFn, TBeforeLoadFn, TLoaderDeps, TLoaderFn, TChildren, TNewFileRouteTypes > export interface Route< in out TParentRoute extends AnyRoute, in out TPath extends string, in out TFullPath extends string, in out TCustomId extends string, in out TId extends string, in out TSearchValidator, in out TParams, in out TRouterContext, in out TRouteContextFn, in out TBeforeLoadFn, in out TLoaderDeps extends Record, in out TLoaderFn, in out TChildren, in out TFileRouteTypes, > extends RouteExtensions { fullPath: TFullPath path: TPath id: TId parentRoute: TParentRoute children?: TChildren types: RouteTypes< TParentRoute, TPath, TFullPath, TCustomId, TId, TSearchValidator, TParams, TRouterContext, TRouteContextFn, TBeforeLoadFn, TLoaderDeps, TLoaderFn, TChildren, TFileRouteTypes > options: RouteOptions< TParentRoute, TId, TCustomId, TFullPath, TPath, TSearchValidator, TParams, TLoaderDeps, TLoaderFn, TRouterContext, TRouteContextFn, TBeforeLoadFn > isRoot: TParentRoute extends AnyRoute ? true : false _componentsPromise?: Promise> lazyFn?: () => Promise _lazyPromise?: Promise rank: number to: TrimPathRight init: (opts: { originalIndex: number; defaultSsr?: boolean }) => void update: ( options: UpdatableRouteOptions< TParentRoute, TCustomId, TFullPath, TParams, TSearchValidator, TLoaderFn, TLoaderDeps, TRouterContext, TRouteContextFn, TBeforeLoadFn >, ) => this lazy: RouteLazyFn addChildren: RouteAddChildrenFn< TParentRoute, TPath, TFullPath, TCustomId, TId, TSearchValidator, TParams, TRouterContext, TRouteContextFn, TBeforeLoadFn, TLoaderDeps, TLoaderFn, TFileRouteTypes > _addFileChildren: RouteAddFileChildrenFn< TParentRoute, TPath, TFullPath, TCustomId, TId, TSearchValidator, TParams, TRouterContext, TRouteContextFn, TBeforeLoadFn, TLoaderDeps, TLoaderFn, TFileRouteTypes > _addFileTypes: RouteAddFileTypesFn< TParentRoute, TPath, TFullPath, TCustomId, TId, TSearchValidator, TParams, TRouterContext, TRouteContextFn, TBeforeLoadFn, TLoaderDeps, TLoaderFn, TChildren > } export type AnyRoute = Route< any, any, any, any, any, any, any, any, any, any, any, any, any, any > export type AnyRouteWithContext = AnyRoute & { types: { allContext: TContext } } export type RouteOptions< TParentRoute extends AnyRoute = AnyRoute, TId extends string = string, TCustomId extends string = string, TFullPath extends string = string, TPath extends string = string, TSearchValidator = undefined, TParams = AnyPathParams, TLoaderDeps extends Record = {}, TLoaderFn = undefined, TRouterContext = {}, TRouteContextFn = AnyContext, TBeforeLoadFn = AnyContext, > = BaseRouteOptions< TParentRoute, TId, TCustomId, TPath, TSearchValidator, TParams, TLoaderDeps, TLoaderFn, TRouterContext, TRouteContextFn, TBeforeLoadFn > & UpdatableRouteOptions< NoInfer, NoInfer, NoInfer, NoInfer, NoInfer, NoInfer, NoInfer, NoInfer, NoInfer, NoInfer > export type RouteContextFn< in out TParentRoute extends AnyRoute, in out TSearchValidator, in out TParams, in out TRouterContext, > = ( ctx: RouteContextOptions< TParentRoute, TSearchValidator, TParams, TRouterContext >, ) => any export type BeforeLoadFn< in out TParentRoute extends AnyRoute, in out TSearchValidator, in out TParams, in out TRouterContext, in out TRouteContextFn, > = ( ctx: BeforeLoadContextOptions< TParentRoute, TSearchValidator, TParams, TRouterContext, TRouteContextFn >, ) => any export type FileBaseRouteOptions< TParentRoute extends AnyRoute = AnyRoute, TId extends string = string, TPath extends string = string, TSearchValidator = undefined, TParams = {}, TLoaderDeps extends Record = {}, TLoaderFn = undefined, TRouterContext = {}, TRouteContextFn = AnyContext, TBeforeLoadFn = AnyContext, TRemountDepsFn = AnyContext, > = ParamsOptions & { validateSearch?: Constrain shouldReload?: | boolean | (( match: LoaderFnContext< TParentRoute, TId, TParams, TLoaderDeps, TRouterContext, TRouteContextFn, TBeforeLoadFn >, ) => any) context?: Constrain< TRouteContextFn, ( ctx: RouteContextOptions< TParentRoute, TParams, TRouterContext, TLoaderDeps >, ) => any > // This async function is called before a route is loaded. // If an error is thrown here, the route's loader will not be called. // If thrown during a navigation, the navigation will be cancelled and the error will be passed to the `onError` function. // If thrown during a preload event, the error will be logged to the console. beforeLoad?: Constrain< TBeforeLoadFn, ( ctx: BeforeLoadContextOptions< TParentRoute, TSearchValidator, TParams, TRouterContext, TRouteContextFn >, ) => any > loaderDeps?: ( opts: FullSearchSchemaOption, ) => TLoaderDeps remountDeps?: Constrain< TRemountDepsFn, ( opt: RemountDepsOptions< TId, FullSearchSchemaOption, Expand>, TLoaderDeps >, ) => any > loader?: Constrain< TLoaderFn, ( ctx: LoaderFnContext< TParentRoute, TId, TParams, TLoaderDeps, TRouterContext, TRouteContextFn, TBeforeLoadFn >, ) => any > } export type BaseRouteOptions< TParentRoute extends AnyRoute = AnyRoute, TId extends string = string, TCustomId extends string = string, TPath extends string = string, TSearchValidator = undefined, TParams = {}, TLoaderDeps extends Record = {}, TLoaderFn = undefined, TRouterContext = {}, TRouteContextFn = AnyContext, TBeforeLoadFn = AnyContext, > = RoutePathOptions & FileBaseRouteOptions< TParentRoute, TId, TPath, TSearchValidator, TParams, TLoaderDeps, TLoaderFn, TRouterContext, TRouteContextFn, TBeforeLoadFn > & { getParentRoute: () => TParentRoute } export interface ContextOptions< in out TParentRoute extends AnyRoute, in out TParams, > { abortController: AbortController preload: boolean params: Expand> location: ParsedLocation /** * @deprecated Use `throw redirect({ to: '/somewhere' })` instead **/ navigate: NavigateFn buildLocation: BuildLocationFn cause: 'preload' | 'enter' | 'stay' matches: Array } export interface RouteContextOptions< in out TParentRoute extends AnyRoute, in out TParams, in out TRouterContext, in out TLoaderDeps, > extends ContextOptions { deps: TLoaderDeps context: Expand> } export interface BeforeLoadContextOptions< in out TParentRoute extends AnyRoute, in out TSearchValidator, in out TParams, in out TRouterContext, in out TRouteContextFn, > extends ContextOptions, FullSearchSchemaOption { context: Expand< BeforeLoadContextParameter > } type AssetFnContextOptions< in out TRouteId, in out TFullPath, in out TParentRoute extends AnyRoute, in out TParams, in out TSearchValidator, in out TLoaderFn, in out TRouterContext, in out TRouteContextFn, in out TBeforeLoadFn, in out TLoaderDeps, > = { matches: Array< RouteMatch< TRouteId, TFullPath, ResolveAllParamsFromParent, ResolveFullSearchSchema, ResolveLoaderData, ResolveAllContext< TParentRoute, TRouterContext, TRouteContextFn, TBeforeLoadFn >, TLoaderDeps > > match: RouteMatch< TRouteId, TFullPath, ResolveAllParamsFromParent, ResolveFullSearchSchema, ResolveLoaderData, ResolveAllContext< TParentRoute, TRouterContext, TRouteContextFn, TBeforeLoadFn >, TLoaderDeps > params: ResolveAllParamsFromParent loaderData: ResolveLoaderData } export interface DefaultUpdatableRouteOptionsExtensions { component?: unknown errorComponent?: unknown notFoundComponent?: unknown pendingComponent?: unknown } export interface UpdatableRouteOptionsExtensions extends DefaultUpdatableRouteOptionsExtensions {} export interface UpdatableRouteOptions< in out TParentRoute extends AnyRoute, in out TRouteId, in out TFullPath, in out TParams, in out TSearchValidator, in out TLoaderFn, in out TLoaderDeps, in out TRouterContext, in out TRouteContextFn, in out TBeforeLoadFn, > extends UpdatableStaticRouteOption, UpdatableRouteOptionsExtensions { // If true, this route will be matched as case-sensitive caseSensitive?: boolean // If true, this route will be forcefully wrapped in a suspense boundary wrapInSuspense?: boolean // The content to be rendered when the route is matched. If no component is provided, defaults to `` pendingMs?: number pendingMinMs?: number staleTime?: number gcTime?: number preload?: boolean preloadStaleTime?: number preloadGcTime?: number search?: { middlewares?: Array< SearchMiddleware< ResolveFullSearchSchemaInput > > } /** @deprecated Use search.middlewares instead */ preSearchFilters?: Array< SearchFilter> > /** @deprecated Use search.middlewares instead */ postSearchFilters?: Array< SearchFilter> > onCatch?: (error: Error) => void onError?: (err: any) => void // These functions are called as route matches are loaded, stick around and leave the active // matches onEnter?: ( match: RouteMatch< TRouteId, TFullPath, ResolveAllParamsFromParent, ResolveFullSearchSchema, ResolveLoaderData, ResolveAllContext< TParentRoute, TRouterContext, TRouteContextFn, TBeforeLoadFn >, TLoaderDeps >, ) => void onStay?: ( match: RouteMatch< TRouteId, TFullPath, ResolveAllParamsFromParent, ResolveFullSearchSchema, ResolveLoaderData, ResolveAllContext< TParentRoute, TRouterContext, TRouteContextFn, TBeforeLoadFn >, TLoaderDeps >, ) => void onLeave?: ( match: RouteMatch< TRouteId, TFullPath, ResolveAllParamsFromParent, ResolveFullSearchSchema, ResolveLoaderData, ResolveAllContext< TParentRoute, TRouterContext, TRouteContextFn, TBeforeLoadFn >, TLoaderDeps >, ) => void headers?: (ctx: { loaderData: ResolveLoaderData }) => Record head?: ( ctx: AssetFnContextOptions< TRouteId, TFullPath, TParentRoute, TParams, TSearchValidator, TLoaderFn, TRouterContext, TRouteContextFn, TBeforeLoadFn, TLoaderDeps >, ) => { links?: AnyRouteMatch['links'] scripts?: AnyRouteMatch['headScripts'] meta?: AnyRouteMatch['meta'] } scripts?: ( ctx: AssetFnContextOptions< TRouteId, TFullPath, TParentRoute, TParams, TSearchValidator, TLoaderFn, TRouterContext, TRouteContextFn, TBeforeLoadFn, TLoaderDeps >, ) => AnyRouteMatch['scripts'] ssr?: boolean codeSplitGroupings?: Array< Array< | 'loader' | 'component' | 'pendingComponent' | 'notFoundComponent' | 'errorComponent' > > } export type RouteLoaderFn< in out TParentRoute extends AnyRoute = AnyRoute, in out TId extends string = string, in out TParams = {}, in out TLoaderDeps = {}, in out TRouterContext = {}, in out TRouteContextFn = AnyContext, in out TBeforeLoadFn = AnyContext, > = ( match: LoaderFnContext< TParentRoute, TId, TParams, TLoaderDeps, TRouterContext, TRouteContextFn, TBeforeLoadFn >, ) => any export interface LoaderFnContext< in out TParentRoute extends AnyRoute = AnyRoute, in out TId extends string = string, in out TParams = {}, in out TLoaderDeps = {}, in out TRouterContext = {}, in out TRouteContextFn = AnyContext, in out TBeforeLoadFn = AnyContext, > { abortController: AbortController preload: boolean params: Expand> deps: TLoaderDeps context: Expand< ResolveAllContext< TParentRoute, TRouterContext, TRouteContextFn, TBeforeLoadFn > > location: ParsedLocation // Do not supply search schema here so as to demotivate people from trying to shortcut loaderDeps /** * @deprecated Use `throw redirect({ to: '/somewhere' })` instead **/ navigate: (opts: NavigateOptions) => Promise | void // root route does not have a parent match parentMatchPromise: TId extends RootRouteId ? never : Promise> cause: 'preload' | 'enter' | 'stay' route: AnyRoute } export type RootRouteOptions< TSearchValidator = undefined, TRouterContext = {}, TRouteContextFn = AnyContext, TBeforeLoadFn = AnyContext, TLoaderDeps extends Record = {}, TLoaderFn = undefined, > = Omit< RouteOptions< any, // TParentRoute RootRouteId, // TId RootRouteId, // TCustomId '', // TFullPath '', // TPath TSearchValidator, {}, // TParams TLoaderDeps, TLoaderFn, TRouterContext, TRouteContextFn, TBeforeLoadFn >, | 'path' | 'id' | 'getParentRoute' | 'caseSensitive' | 'parseParams' | 'stringifyParams' | 'params' > export type RouteConstraints = { TParentRoute: AnyRoute TPath: string TFullPath: string TCustomId: string TId: string TSearchSchema: AnySchema TFullSearchSchema: AnySchema TParams: Record TAllParams: Record TParentContext: AnyContext TRouteContext: RouteContext TAllContext: AnyContext TRouterContext: AnyContext TChildren: unknown TRouteTree: AnyRoute } export type RouteTypesById = RouteById< TRouter['routeTree'], TId >['types'] export type RouteMask = { routeTree: TRouteTree from: RoutePaths to?: any params?: any search?: any hash?: any state?: any unmaskOnReload?: boolean } /** * @deprecated Use `ErrorComponentProps` instead. */ export type ErrorRouteProps = { error: unknown info?: { componentStack: string } reset: () => void } export type ErrorComponentProps = { error: Error info?: { componentStack: string } reset: () => void } export type NotFoundRouteProps = { // TODO: Make sure this is `| null | undefined` (this is for global not-founds) data: unknown } export class BaseRoute< in out TParentRoute extends AnyRoute = AnyRoute, in out TPath extends string = '/', in out TFullPath extends string = ResolveFullPath, in out TCustomId extends string = string, in out TId extends string = ResolveId, in out TSearchValidator = undefined, in out TParams = ResolveParams, in out TRouterContext = AnyContext, in out TRouteContextFn = AnyContext, in out TBeforeLoadFn = AnyContext, in out TLoaderDeps extends Record = {}, in out TLoaderFn = undefined, in out TChildren = unknown, in out TFileRouteTypes = unknown, > implements Route< TParentRoute, TPath, TFullPath, TCustomId, TId, TSearchValidator, TParams, TRouterContext, TRouteContextFn, TBeforeLoadFn, TLoaderDeps, TLoaderFn, TChildren, TFileRouteTypes > { isRoot: TParentRoute extends AnyRoute ? true : false options: RouteOptions< TParentRoute, TId, TCustomId, TFullPath, TPath, TSearchValidator, TParams, TLoaderDeps, TLoaderFn, TRouterContext, TRouteContextFn, TBeforeLoadFn > // The following properties are set up in this.init() parentRoute!: TParentRoute private _id!: TId private _path!: TPath private _fullPath!: TFullPath private _to!: TrimPathRight private _ssr!: boolean public get to() { return this._to } public get id() { return this._id } public get path() { return this._path } public get fullPath() { return this._fullPath } public get ssr() { return this._ssr } // Optional children?: TChildren originalIndex?: number rank!: number lazyFn?: () => Promise _lazyPromise?: Promise _componentsPromise?: Promise> constructor( options?: RouteOptions< TParentRoute, TId, TCustomId, TFullPath, TPath, TSearchValidator, TParams, TLoaderDeps, TLoaderFn, TRouterContext, TRouteContextFn, TBeforeLoadFn >, ) { this.options = (options as any) || {} this.isRoot = !options?.getParentRoute as any if ((options as any)?.id && (options as any)?.path) { throw new Error(`Route cannot have both an 'id' and a 'path' option.`) } } types!: RouteTypes< TParentRoute, TPath, TFullPath, TCustomId, TId, TSearchValidator, TParams, TRouterContext, TRouteContextFn, TBeforeLoadFn, TLoaderDeps, TLoaderFn, TChildren, TFileRouteTypes > init = (opts: { originalIndex: number; defaultSsr?: boolean }): void => { this.originalIndex = opts.originalIndex const options = this.options as | (RouteOptions< TParentRoute, TId, TCustomId, TFullPath, TPath, TSearchValidator, TParams, TLoaderDeps, TLoaderFn, TRouterContext, TRouteContextFn, TBeforeLoadFn > & RoutePathOptionsIntersection) | undefined const isRoot = !options?.path && !options?.id this.parentRoute = this.options.getParentRoute?.() if (isRoot) { this._path = rootRouteId as TPath } else if (!this.parentRoute) { throw new Error( `Child Route instances must pass a 'getParentRoute: () => ParentRoute' option that returns a Route instance.`, ) } let path: undefined | string = isRoot ? rootRouteId : options?.path // If the path is anything other than an index path, trim it up if (path && path !== '/') { path = trimPathLeft(path) } const customId = options?.id || path // Strip the parentId prefix from the first level of children let id = isRoot ? rootRouteId : joinPaths([ this.parentRoute.id === rootRouteId ? '' : this.parentRoute.id, customId, ]) if (path === rootRouteId) { path = '/' } if (id !== rootRouteId) { id = joinPaths(['/', id]) } const fullPath = id === rootRouteId ? '/' : joinPaths([this.parentRoute.fullPath, path]) this._path = path as TPath this._id = id as TId this._fullPath = fullPath as TFullPath this._to = fullPath as TrimPathRight this._ssr = options?.ssr ?? opts.defaultSsr ?? true } addChildren: RouteAddChildrenFn< TParentRoute, TPath, TFullPath, TCustomId, TId, TSearchValidator, TParams, TRouterContext, TRouteContextFn, TBeforeLoadFn, TLoaderDeps, TLoaderFn, TFileRouteTypes > = (children) => { return this._addFileChildren(children) as any } _addFileChildren: RouteAddFileChildrenFn< TParentRoute, TPath, TFullPath, TCustomId, TId, TSearchValidator, TParams, TRouterContext, TRouteContextFn, TBeforeLoadFn, TLoaderDeps, TLoaderFn, TFileRouteTypes > = (children) => { if (Array.isArray(children)) { this.children = children as TChildren } if (typeof children === 'object' && children !== null) { this.children = Object.values(children) as TChildren } return this as any } _addFileTypes: RouteAddFileTypesFn< TParentRoute, TPath, TFullPath, TCustomId, TId, TSearchValidator, TParams, TRouterContext, TRouteContextFn, TBeforeLoadFn, TLoaderDeps, TLoaderFn, TChildren > = () => { return this as any } updateLoader = (options: { loader: Constrain< TNewLoaderFn, RouteLoaderFn< TParentRoute, TCustomId, TParams, TLoaderDeps, TRouterContext, TRouteContextFn, TBeforeLoadFn > > }) => { Object.assign(this.options, options) return this as unknown as BaseRoute< TParentRoute, TPath, TFullPath, TCustomId, TId, TSearchValidator, TParams, TRouterContext, TRouteContextFn, TBeforeLoadFn, TLoaderDeps, TNewLoaderFn, TChildren, TFileRouteTypes > } update = ( options: UpdatableRouteOptions< TParentRoute, TCustomId, TFullPath, TParams, TSearchValidator, TLoaderFn, TLoaderDeps, TRouterContext, TRouteContextFn, TBeforeLoadFn >, ): this => { Object.assign(this.options, options) return this } lazy: RouteLazyFn = (lazyFn) => { this.lazyFn = lazyFn return this } } export class BaseRouteApi { id: TId constructor({ id }: { id: TId }) { this.id = id as any } notFound = (opts?: NotFoundError) => { return notFound({ routeId: this.id as string, ...opts }) } } export class BaseRootRoute< in out TSearchValidator = undefined, in out TRouterContext = {}, in out TRouteContextFn = AnyContext, in out TBeforeLoadFn = AnyContext, in out TLoaderDeps extends Record = {}, in out TLoaderFn = undefined, in out TChildren = unknown, in out TFileRouteTypes = unknown, > extends BaseRoute< any, // TParentRoute '/', // TPath '/', // TFullPath string, // TCustomId RootRouteId, // TId TSearchValidator, // TSearchValidator {}, // TParams TRouterContext, TRouteContextFn, TBeforeLoadFn, TLoaderDeps, TLoaderFn, TChildren, // TChildren TFileRouteTypes > { constructor( options?: RootRouteOptions< TSearchValidator, TRouterContext, TRouteContextFn, TBeforeLoadFn, TLoaderDeps, TLoaderFn >, ) { super(options as any) } } //