diff --git a/packages/react-router/src/fileRoute.ts b/packages/react-router/src/fileRoute.ts index 82770727671..aeb77f2be8b 100644 --- a/packages/react-router/src/fileRoute.ts +++ b/packages/react-router/src/fileRoute.ts @@ -22,9 +22,12 @@ import type { import type { RegisteredRouter } from './router' import type { AnyContext, + AnyRoute as AnyCoreRoute, AnyPathParams, + AnyRouter, AnyValidator, Constrain, + ConstrainLiteral, FileRoutesByPath, ResolveParams, RouteById, @@ -175,7 +178,7 @@ export type LazyRouteOptions = Pick< 'component' | 'errorComponent' | 'pendingComponent' | 'notFoundComponent' > -export class LazyRoute { +export class LazyRoute { options: { id: string } & LazyRouteOptions @@ -236,11 +239,15 @@ export class LazyRoute { } export function createLazyRoute< - TId extends RouteIds, - TRoute extends AnyRoute = RouteById, ->(id: TId) { + TRouter extends AnyRouter = RegisteredRouter, + TId extends string = string, + TRoute extends AnyCoreRoute = RouteById, +>(id: ConstrainLiteral>) { return (opts: LazyRouteOptions) => { - return new LazyRoute({ id: id as any, ...opts }) + return new LazyRoute({ + id: id, + ...opts, + }) } } diff --git a/packages/react-router/src/index.tsx b/packages/react-router/src/index.tsx index aadd9085b38..19483866829 100644 --- a/packages/react-router/src/index.tsx +++ b/packages/react-router/src/index.tsx @@ -195,6 +195,10 @@ export type { AnyRouterWithContext, CommitLocationOptions, MatchLocation, + UseNavigateResult, + AnyRedirect, + Redirect, + ResolvedRedirect, } from '@tanstack/router-core' export type { UseLinkPropsOptions, @@ -232,7 +236,6 @@ export { useLoaderDeps } from './useLoaderDeps' export { useLoaderData } from './useLoaderData' export { redirect, isRedirect } from './redirects' -export type { AnyRedirect, Redirect, ResolvedRedirect } from './redirects' export { RouteApi, @@ -310,7 +313,6 @@ export type { UseBlockerOpts, ShouldBlockFn } from './useBlocker' export { useBlocker, Block } from './useBlocker' export { useNavigate, Navigate } from './useNavigate' -export type { UseNavigateResult } from './useNavigate' export { useParams } from './useParams' export { useSearch } from './useSearch' diff --git a/packages/react-router/src/redirects.ts b/packages/react-router/src/redirects.ts index 348d7aa40d6..3a92d071839 100644 --- a/packages/react-router/src/redirects.ts +++ b/packages/react-router/src/redirects.ts @@ -1,41 +1,9 @@ -import type { AnyRouter, RegisteredRouter } from './router' import type { - NavigateOptions, - PickAsRequired, - RoutePaths, + AnyRedirect, + Redirect, + ResolvedRedirect, } from '@tanstack/router-core' - -export type AnyRedirect = Redirect - -export type Redirect< - TRouter extends AnyRouter = RegisteredRouter, - TFrom extends RoutePaths | string = '/', - TTo extends string | undefined = '.', - TMaskFrom extends RoutePaths | string = TFrom, - TMaskTo extends string = '.', -> = { - href?: string - /** - * @deprecated Use `statusCode` instead - **/ - code?: number - statusCode?: number - throw?: any - headers?: HeadersInit -} & NavigateOptions - -export type ResolvedRedirect< - TRouter extends AnyRouter = RegisteredRouter, - TFrom extends RoutePaths = '/', - TTo extends string = '', - TMaskFrom extends RoutePaths = TFrom, - TMaskTo extends string = '', -> = PickAsRequired< - Redirect, - 'code' | 'statusCode' | 'headers' -> & { - href: string -} +import type { RegisteredRouter } from './router' export function redirect< TRouter extends RegisteredRouter, diff --git a/packages/react-router/src/route.ts b/packages/react-router/src/route.ts index eafee6a61a1..04f0209a360 100644 --- a/packages/react-router/src/route.ts +++ b/packages/react-router/src/route.ts @@ -51,6 +51,7 @@ import type { ToMaskOptions, TrimPathRight, UpdatableStaticRouteOption, + UseNavigateResult, } from '@tanstack/router-core' import type { UseLoaderDataRoute } from './useLoaderData' import type { UseMatchRoute } from './useMatch' @@ -58,7 +59,6 @@ import type { UseLoaderDepsRoute } from './useLoaderDeps' import type { UseParamsRoute } from './useParams' import type { UseSearchRoute } from './useSearch' import type * as React from 'react' -import type { UseNavigateResult } from './useNavigate' import type { AnyRouteMatch, MakeRouteMatchFromRoute, @@ -68,7 +68,6 @@ import type { import type { AnyRouter, RegisteredRouter, Router } from './router' import type { NotFoundError } from './not-found' import type { LazyRoute } from './fileRoute' - import type { UseRouteContextRoute } from './useRouteContext' export type RouteOptions< diff --git a/packages/react-router/src/router.ts b/packages/react-router/src/router.ts index 5056de5100b..e86e729c91e 100644 --- a/packages/react-router/src/router.ts +++ b/packages/react-router/src/router.ts @@ -41,6 +41,7 @@ import type { NoInfer } from '@tanstack/react-store' import type { AnyContext, + AnyRedirect, AnySchema, AnyValidator, BuildLocationFn, @@ -56,6 +57,7 @@ import type { PickAsRequired, Register, ResolveRelativePath, + ResolvedRedirect, RouteById, RoutePaths, RoutesById, @@ -88,7 +90,6 @@ import type { MatchRouteOptions, } from './Matches' -import type { AnyRedirect, ResolvedRedirect } from './redirects' import type { NotFoundError } from './not-found' declare global { diff --git a/packages/react-router/src/typePrimitives.ts b/packages/react-router/src/typePrimitives.ts index f6b100a0d3a..dde3531820e 100644 --- a/packages/react-router/src/typePrimitives.ts +++ b/packages/react-router/src/typePrimitives.ts @@ -4,15 +4,18 @@ import type { FromPathOption, NavigateOptions, PathParamOptions, + Redirect, RouteIds, SearchParamOptions, ToPathOption, + UseParamsResult, + UseSearchResult, } from '@tanstack/router-core' import type { LinkComponentProps } from './link' -import type { Redirect } from './redirects' import type { AnyRouter, RegisteredRouter } from './router' -import type { UseParamsOptions, UseParamsResult } from './useParams' -import type { UseSearchOptions, UseSearchResult } from './useSearch' + +import type { UseParamsOptions } from './useParams' +import type { UseSearchOptions } from './useSearch' export type ValidateFromPath< TRouter extends AnyRouter = RegisteredRouter, diff --git a/packages/react-router/src/useLoaderData.tsx b/packages/react-router/src/useLoaderData.tsx index d979492bf63..c7dcccc7438 100644 --- a/packages/react-router/src/useLoaderData.tsx +++ b/packages/react-router/src/useLoaderData.tsx @@ -4,8 +4,11 @@ import type { ValidateSelected, } from './structuralSharing' import type { AnyRouter, RegisteredRouter } from './router' -import type { AllLoaderData, Expand, RouteById } from '@tanstack/router-core' -import type { StrictOrFrom } from './utils' +import type { + ResolveUseLoaderData, + StrictOrFrom, + UseLoaderDataResult, +} from '@tanstack/router-core' export interface UseLoaderDataBaseOptions< TRouter extends AnyRouter, @@ -15,7 +18,7 @@ export interface UseLoaderDataBaseOptions< TStructuralSharing, > { select?: ( - match: ResolveLoaderData, + match: ResolveUseLoaderData, ) => ValidateSelected } @@ -35,23 +38,6 @@ export type UseLoaderDataOptions< > & StructuralSharingOption -export type ResolveLoaderData< - TRouter extends AnyRouter, - TFrom, - TStrict extends boolean, -> = TStrict extends false - ? AllLoaderData - : Expand['types']['loaderData']> - -export type UseLoaderDataResult< - TRouter extends AnyRouter, - TFrom, - TStrict extends boolean, - TSelected, -> = unknown extends TSelected - ? ResolveLoaderData - : TSelected - export type UseLoaderDataRoute = < TRouter extends AnyRouter = RegisteredRouter, TSelected = unknown, diff --git a/packages/react-router/src/useLoaderDeps.tsx b/packages/react-router/src/useLoaderDeps.tsx index 326bec856fe..d7d9b51a0f3 100644 --- a/packages/react-router/src/useLoaderDeps.tsx +++ b/packages/react-router/src/useLoaderDeps.tsx @@ -4,8 +4,11 @@ import type { ValidateSelected, } from './structuralSharing' import type { AnyRouter, RegisteredRouter } from './router' -import type { StrictOrFrom } from './utils' -import type { Expand, RouteById } from '@tanstack/router-core' +import type { + ResolveUseLoaderDeps, + StrictOrFrom, + UseLoaderDepsResult, +} from '@tanstack/router-core' export interface UseLoaderDepsBaseOptions< TRouter extends AnyRouter, @@ -14,7 +17,7 @@ export interface UseLoaderDepsBaseOptions< TStructuralSharing, > { select?: ( - deps: ResolveLoaderDeps, + deps: ResolveUseLoaderDeps, ) => ValidateSelected } @@ -27,16 +30,6 @@ export type UseLoaderDepsOptions< UseLoaderDepsBaseOptions & StructuralSharingOption -export type ResolveLoaderDeps = Expand< - RouteById['types']['loaderDeps'] -> - -export type UseLoaderDepsResult< - TRouter extends AnyRouter, - TFrom, - TSelected, -> = unknown extends TSelected ? ResolveLoaderDeps : TSelected - export type UseLoaderDepsRoute = < TRouter extends AnyRouter = RegisteredRouter, TSelected = unknown, diff --git a/packages/react-router/src/useMatch.tsx b/packages/react-router/src/useMatch.tsx index 351d29a2fb8..4a7a0aee825 100644 --- a/packages/react-router/src/useMatch.tsx +++ b/packages/react-router/src/useMatch.tsx @@ -8,8 +8,7 @@ import type { } from './structuralSharing' import type { AnyRouter, RegisteredRouter } from './router' import type { MakeRouteMatch, MakeRouteMatchUnion } from './Matches' -import type { StrictOrFrom } from './utils' -import type { ThrowOrOptional } from '@tanstack/router-core' +import type { StrictOrFrom, ThrowOrOptional } from '@tanstack/router-core' export interface UseMatchBaseOptions< TRouter extends AnyRouter, diff --git a/packages/react-router/src/useNavigate.tsx b/packages/react-router/src/useNavigate.tsx index 4d77a52c309..4b023a16c41 100644 --- a/packages/react-router/src/useNavigate.tsx +++ b/packages/react-router/src/useNavigate.tsx @@ -1,19 +1,12 @@ import * as React from 'react' import { useRouter } from './useRouter' -import type { FromPathOption, NavigateOptions } from '@tanstack/router-core' +import type { + FromPathOption, + NavigateOptions, + UseNavigateResult, +} from '@tanstack/router-core' import type { AnyRouter, RegisteredRouter } from './router' -export type UseNavigateResult = < - TRouter extends RegisteredRouter, - TTo extends string | undefined, - TFrom extends string = TDefaultFrom, - TMaskFrom extends string = TFrom, - TMaskTo extends string = '', ->({ - from, - ...rest -}: NavigateOptions) => Promise - export function useNavigate< TRouter extends AnyRouter = RegisteredRouter, TDefaultFrom extends string = string, diff --git a/packages/react-router/src/useParams.tsx b/packages/react-router/src/useParams.tsx index 82bbe015550..96362c1a2f3 100644 --- a/packages/react-router/src/useParams.tsx +++ b/packages/react-router/src/useParams.tsx @@ -5,12 +5,11 @@ import type { ValidateSelected, } from './structuralSharing' import type { AnyRouter, RegisteredRouter } from './router' -import type { StrictOrFrom } from './utils' import type { - AllParams, - Expand, - RouteById, + ResolveUseParams, + StrictOrFrom, ThrowOrOptional, + UseParamsResult, } from '@tanstack/router-core' export interface UseParamsBaseOptions< @@ -22,7 +21,7 @@ export interface UseParamsBaseOptions< TStructuralSharing, > { select?: ( - params: ResolveParams, + params: ResolveUseParams, ) => ValidateSelected shouldThrow?: TThrow } @@ -45,23 +44,6 @@ export type UseParamsOptions< > & StructuralSharingOption -export type ResolveParams< - TRouter extends AnyRouter, - TFrom, - TStrict extends boolean, -> = TStrict extends false - ? AllParams - : Expand['types']['allParams']> - -export type UseParamsResult< - TRouter extends AnyRouter, - TFrom, - TStrict extends boolean, - TSelected, -> = unknown extends TSelected - ? ResolveParams - : TSelected - export type UseParamsRoute = < TRouter extends AnyRouter = RegisteredRouter, TSelected = unknown, diff --git a/packages/react-router/src/useRouteContext.ts b/packages/react-router/src/useRouteContext.ts index bfc0f32bf97..a77a5935d9b 100644 --- a/packages/react-router/src/useRouteContext.ts +++ b/packages/react-router/src/useRouteContext.ts @@ -1,41 +1,10 @@ import { useMatch } from './useMatch' import type { AnyRouter, RegisteredRouter } from './router' -import type { StrictOrFrom } from './utils' -import type { AllContext, Expand, RouteById } from '@tanstack/router-core' - -export interface UseRouteContextBaseOptions< - TRouter extends AnyRouter, - TFrom, - TStrict extends boolean, - TSelected, -> { - select?: (search: ResolveRouteContext) => TSelected -} - -export type UseRouteContextOptions< - TRouter extends AnyRouter, - TFrom extends string | undefined, - TStrict extends boolean, - TSelected, -> = StrictOrFrom & - UseRouteContextBaseOptions - -export type ResolveRouteContext< - TRouter extends AnyRouter, - TFrom, - TStrict extends boolean, -> = TStrict extends false - ? AllContext - : Expand['types']['allContext']> - -export type UseRouteContextResult< - TRouter extends AnyRouter, - TFrom, - TStrict extends boolean, - TSelected, -> = unknown extends TSelected - ? ResolveRouteContext - : TSelected +import type { + UseRouteContextBaseOptions, + UseRouteContextOptions, + UseRouteContextResult, +} from '@tanstack/router-core' export type UseRouteContextRoute = < TRouter extends AnyRouter = RegisteredRouter, diff --git a/packages/react-router/src/useSearch.tsx b/packages/react-router/src/useSearch.tsx index 4b36565243b..3b6c86b7add 100644 --- a/packages/react-router/src/useSearch.tsx +++ b/packages/react-router/src/useSearch.tsx @@ -5,12 +5,11 @@ import type { ValidateSelected, } from './structuralSharing' import type { AnyRouter, RegisteredRouter } from './router' -import type { StrictOrFrom } from './utils' import type { - Expand, - FullSearchSchema, - RouteById, + ResolveUseSearch, + StrictOrFrom, ThrowOrOptional, + UseSearchResult, } from '@tanstack/router-core' export interface UseSearchBaseOptions< @@ -22,7 +21,7 @@ export interface UseSearchBaseOptions< TStructuralSharing, > { select?: ( - state: ResolveSearch, + state: ResolveUseSearch, ) => ValidateSelected shouldThrow?: TThrow } @@ -45,23 +44,6 @@ export type UseSearchOptions< > & StructuralSharingOption -export type UseSearchResult< - TRouter extends AnyRouter, - TFrom, - TStrict extends boolean, - TSelected, -> = unknown extends TSelected - ? ResolveSearch - : TSelected - -export type ResolveSearch< - TRouter extends AnyRouter, - TFrom, - TStrict extends boolean, -> = TStrict extends false - ? FullSearchSchema - : Expand['types']['fullSearchSchema']> - export type UseSearchRoute = < TRouter extends AnyRouter = RegisteredRouter, TSelected = unknown, diff --git a/packages/react-router/src/utils.ts b/packages/react-router/src/utils.ts index 048f5c0f68c..d78025e0861 100644 --- a/packages/react-router/src/utils.ts +++ b/packages/react-router/src/utils.ts @@ -1,9 +1,4 @@ import * as React from 'react' -import type { - AnyRouter, - ConstrainLiteral, - RouteIds, -} from '@tanstack/router-core' export function useStableCallback) => any>( fn: T, @@ -15,20 +10,6 @@ export function useStableCallback) => any>( return ref.current as T } -export type StrictOrFrom< - TRouter extends AnyRouter, - TFrom, - TStrict extends boolean = true, -> = TStrict extends false - ? { - from?: never - strict: TStrict - } - : { - from: ConstrainLiteral> - strict?: TStrict - } - export const useLayoutEffect = typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect diff --git a/packages/router-core/src/index.ts b/packages/router-core/src/index.ts index 4f7a7797f29..aec2a70f1ea 100644 --- a/packages/router-core/src/index.ts +++ b/packages/router-core/src/index.ts @@ -245,6 +245,7 @@ export type { MergeAllObjects, MergeAll, ValidateJSON, + StrictOrFrom, } from './utils' export type { @@ -274,3 +275,21 @@ export type { ResolveValidatorOutputFn, ResolveValidatorOutput, } from './validators' + +export type { + UseRouteContextBaseOptions, + UseRouteContextOptions, + UseRouteContextResult, +} from './useRouteContext' + +export type { UseSearchResult, ResolveUseSearch } from './useSearch' + +export type { UseParamsResult, ResolveUseParams } from './useParams' + +export type { UseNavigateResult } from './useNavigate' + +export type { UseLoaderDepsResult, ResolveUseLoaderDeps } from './useLoaderDeps' + +export type { UseLoaderDataResult, ResolveUseLoaderData } from './useLoaderData' + +export type { Redirect, ResolvedRedirect, AnyRedirect } from './redirect' diff --git a/packages/router-core/src/redirect.ts b/packages/router-core/src/redirect.ts new file mode 100644 index 00000000000..8642f43b42b --- /dev/null +++ b/packages/router-core/src/redirect.ts @@ -0,0 +1,36 @@ +import type { NavigateOptions } from './link' +import type { RoutePaths } from './routeInfo' +import type { AnyRouter, RegisteredRouter } from './router' +import type { PickAsRequired } from './utils' + +export type AnyRedirect = Redirect + +export type Redirect< + TRouter extends AnyRouter = RegisteredRouter, + TFrom extends RoutePaths | string = '/', + TTo extends string | undefined = '.', + TMaskFrom extends RoutePaths | string = TFrom, + TMaskTo extends string = '.', +> = { + href?: string + /** + * @deprecated Use `statusCode` instead + **/ + code?: number + statusCode?: number + throw?: any + headers?: HeadersInit +} & NavigateOptions + +export type ResolvedRedirect< + TRouter extends AnyRouter = RegisteredRouter, + TFrom extends RoutePaths = '/', + TTo extends string = '', + TMaskFrom extends RoutePaths = TFrom, + TMaskTo extends string = '', +> = PickAsRequired< + Redirect, + 'code' | 'statusCode' | 'headers' +> & { + href: string +} diff --git a/packages/router-core/src/useLoaderData.ts b/packages/router-core/src/useLoaderData.ts new file mode 100644 index 00000000000..f3167fc7e41 --- /dev/null +++ b/packages/router-core/src/useLoaderData.ts @@ -0,0 +1,20 @@ +import type { AllLoaderData, RouteById } from './routeInfo' +import type { AnyRouter } from './router' +import type { Expand } from './utils' + +export type ResolveUseLoaderData< + TRouter extends AnyRouter, + TFrom, + TStrict extends boolean, +> = TStrict extends false + ? AllLoaderData + : Expand['types']['loaderData']> + +export type UseLoaderDataResult< + TRouter extends AnyRouter, + TFrom, + TStrict extends boolean, + TSelected, +> = unknown extends TSelected + ? ResolveUseLoaderData + : TSelected diff --git a/packages/router-core/src/useLoaderDeps.ts b/packages/router-core/src/useLoaderDeps.ts new file mode 100644 index 00000000000..4a1634702cc --- /dev/null +++ b/packages/router-core/src/useLoaderDeps.ts @@ -0,0 +1,13 @@ +import type { RouteById } from './routeInfo' +import type { AnyRouter } from './router' +import type { Expand } from './utils' + +export type ResolveUseLoaderDeps = Expand< + RouteById['types']['loaderDeps'] +> + +export type UseLoaderDepsResult< + TRouter extends AnyRouter, + TFrom, + TSelected, +> = unknown extends TSelected ? ResolveUseLoaderDeps : TSelected diff --git a/packages/router-core/src/useNavigate.ts b/packages/router-core/src/useNavigate.ts new file mode 100644 index 00000000000..ca0282bccec --- /dev/null +++ b/packages/router-core/src/useNavigate.ts @@ -0,0 +1,13 @@ +import type { NavigateOptions } from './link' +import type { RegisteredRouter } from './router' + +export type UseNavigateResult = < + TRouter extends RegisteredRouter, + TTo extends string | undefined, + TFrom extends string = TDefaultFrom, + TMaskFrom extends string = TFrom, + TMaskTo extends string = '', +>({ + from, + ...rest +}: NavigateOptions) => Promise diff --git a/packages/router-core/src/useParams.ts b/packages/router-core/src/useParams.ts new file mode 100644 index 00000000000..4938ed7f057 --- /dev/null +++ b/packages/router-core/src/useParams.ts @@ -0,0 +1,20 @@ +import type { AllParams, RouteById } from './routeInfo' +import type { AnyRouter } from './router' +import type { Expand } from './utils' + +export type ResolveUseParams< + TRouter extends AnyRouter, + TFrom, + TStrict extends boolean, +> = TStrict extends false + ? AllParams + : Expand['types']['allParams']> + +export type UseParamsResult< + TRouter extends AnyRouter, + TFrom, + TStrict extends boolean, + TSelected, +> = unknown extends TSelected + ? ResolveUseParams + : TSelected diff --git a/packages/router-core/src/useRouteContext.ts b/packages/router-core/src/useRouteContext.ts new file mode 100644 index 00000000000..8cfcd197ce1 --- /dev/null +++ b/packages/router-core/src/useRouteContext.ts @@ -0,0 +1,39 @@ +import type { AllContext, RouteById } from './routeInfo' +import type { AnyRouter } from './router' +import type { Expand, StrictOrFrom } from './utils' + +export interface UseRouteContextBaseOptions< + TRouter extends AnyRouter, + TFrom, + TStrict extends boolean, + TSelected, +> { + select?: ( + search: ResolveUseRouteContext, + ) => TSelected +} + +export type UseRouteContextOptions< + TRouter extends AnyRouter, + TFrom extends string | undefined, + TStrict extends boolean, + TSelected, +> = StrictOrFrom & + UseRouteContextBaseOptions + +export type ResolveUseRouteContext< + TRouter extends AnyRouter, + TFrom, + TStrict extends boolean, +> = TStrict extends false + ? AllContext + : Expand['types']['allContext']> + +export type UseRouteContextResult< + TRouter extends AnyRouter, + TFrom, + TStrict extends boolean, + TSelected, +> = unknown extends TSelected + ? ResolveUseRouteContext + : TSelected diff --git a/packages/router-core/src/useSearch.ts b/packages/router-core/src/useSearch.ts new file mode 100644 index 00000000000..2abe0ecaa3f --- /dev/null +++ b/packages/router-core/src/useSearch.ts @@ -0,0 +1,20 @@ +import type { FullSearchSchema, RouteById } from './routeInfo' +import type { AnyRouter } from './router' +import type { Expand } from './utils' + +export type UseSearchResult< + TRouter extends AnyRouter, + TFrom, + TStrict extends boolean, + TSelected, +> = unknown extends TSelected + ? ResolveUseSearch + : TSelected + +export type ResolveUseSearch< + TRouter extends AnyRouter, + TFrom, + TStrict extends boolean, +> = TStrict extends false + ? FullSearchSchema + : Expand['types']['fullSearchSchema']> diff --git a/packages/router-core/src/utils.ts b/packages/router-core/src/utils.ts index 87c40aac34c..1ffc5e505b8 100644 --- a/packages/router-core/src/utils.ts +++ b/packages/router-core/src/utils.ts @@ -1,3 +1,6 @@ +import type { RouteIds } from './routeInfo' +import type { AnyRouter } from './router' + export type NoInfer = [T][T extends any ? 0 : never] export type IsAny = 1 extends 0 & TValue ? TYesResult @@ -330,6 +333,20 @@ export type ThrowOrOptional = TThrow extends true ? T : T | undefined +export type StrictOrFrom< + TRouter extends AnyRouter, + TFrom, + TStrict extends boolean = true, +> = TStrict extends false + ? { + from?: never + strict: TStrict + } + : { + from: ConstrainLiteral> + strict?: TStrict + } + export type ControlledPromise = Promise & { resolve: (value: T) => void reject: (value: any) => void diff --git a/packages/solid-router/src/fileRoute.ts b/packages/solid-router/src/fileRoute.ts index 34a3031b4a3..dfaa88a77db 100644 --- a/packages/solid-router/src/fileRoute.ts +++ b/packages/solid-router/src/fileRoute.ts @@ -12,9 +12,12 @@ import type { UseMatchRoute } from './useMatch' import type { UseSearchRoute } from './useSearch' import type { AnyContext, + AnyRoute as AnyCoreRoute, AnyPathParams, + AnyRouter, AnyValidator, Constrain, + ConstrainLiteral, FileRoutesByPath, ResolveParams, RouteById, @@ -175,7 +178,7 @@ export type LazyRouteOptions = Pick< 'component' | 'errorComponent' | 'pendingComponent' | 'notFoundComponent' > -export class LazyRoute { +export class LazyRoute { options: { id: string } & LazyRouteOptions @@ -230,14 +233,17 @@ export class LazyRoute { } export function createLazyRoute< - TId extends RouteIds, - TRoute extends AnyRoute = RouteById, ->(id: TId) { + TRouter extends AnyRouter = RegisteredRouter, + TId extends string = string, + TRoute extends AnyCoreRoute = RouteById, +>(id: ConstrainLiteral>) { return (opts: LazyRouteOptions) => { - return new LazyRoute({ id: id as any, ...opts }) + return new LazyRoute({ + id: id, + ...opts, + }) } } - export function createLazyFileRoute< TFilePath extends keyof FileRoutesByPath, TRoute extends FileRoutesByPath[TFilePath]['preLoaderRoute'], diff --git a/packages/solid-router/src/index.tsx b/packages/solid-router/src/index.tsx index c40bae7d81a..e3ff1a97c77 100644 --- a/packages/solid-router/src/index.tsx +++ b/packages/solid-router/src/index.tsx @@ -165,6 +165,10 @@ export type { RemountDepsOptions, FileRouteTypes, FileRoutesByPath, + UseNavigateResult, + AnyRedirect, + Redirect, + ResolvedRedirect, } from '@tanstack/router-core' export { @@ -238,7 +242,6 @@ export { useLoaderDeps } from './useLoaderDeps' export { useLoaderData } from './useLoaderData' export { redirect, isRedirect } from './redirects' -export type { AnyRedirect, Redirect, ResolvedRedirect } from './redirects' export { RouteApi, @@ -318,7 +321,6 @@ export type { UseBlockerOpts, ShouldBlockFn } from './useBlocker' export { useBlocker, Block } from './useBlocker' export { useNavigate, Navigate } from './useNavigate' -export type { UseNavigateResult } from './useNavigate' export { useParams } from './useParams' export { useSearch } from './useSearch' diff --git a/packages/solid-router/src/redirects.ts b/packages/solid-router/src/redirects.ts index 348d7aa40d6..aca4388d09e 100644 --- a/packages/solid-router/src/redirects.ts +++ b/packages/solid-router/src/redirects.ts @@ -1,42 +1,10 @@ -import type { AnyRouter, RegisteredRouter } from './router' +import type { RegisteredRouter } from './router' import type { - NavigateOptions, - PickAsRequired, - RoutePaths, + AnyRedirect, + Redirect, + ResolvedRedirect, } from '@tanstack/router-core' -export type AnyRedirect = Redirect - -export type Redirect< - TRouter extends AnyRouter = RegisteredRouter, - TFrom extends RoutePaths | string = '/', - TTo extends string | undefined = '.', - TMaskFrom extends RoutePaths | string = TFrom, - TMaskTo extends string = '.', -> = { - href?: string - /** - * @deprecated Use `statusCode` instead - **/ - code?: number - statusCode?: number - throw?: any - headers?: HeadersInit -} & NavigateOptions - -export type ResolvedRedirect< - TRouter extends AnyRouter = RegisteredRouter, - TFrom extends RoutePaths = '/', - TTo extends string = '', - TMaskFrom extends RoutePaths = TFrom, - TMaskTo extends string = '', -> = PickAsRequired< - Redirect, - 'code' | 'statusCode' | 'headers' -> & { - href: string -} - export function redirect< TRouter extends RegisteredRouter, const TTo extends string | undefined, diff --git a/packages/solid-router/src/route.ts b/packages/solid-router/src/route.ts index 131021c0579..7b620645b6b 100644 --- a/packages/solid-router/src/route.ts +++ b/packages/solid-router/src/route.ts @@ -51,6 +51,7 @@ import type { ToMaskOptions, TrimPathRight, UpdatableStaticRouteOption, + UseNavigateResult, } from '@tanstack/router-core' import type { UseLoaderDataRoute } from './useLoaderData' import type { UseMatchRoute } from './useMatch' @@ -58,7 +59,6 @@ import type { UseLoaderDepsRoute } from './useLoaderDeps' import type { UseParamsRoute } from './useParams' import type { UseSearchRoute } from './useSearch' import type * as Solid from 'solid-js' -import type { UseNavigateResult } from './useNavigate' import type { AnyRouteMatch, MakeRouteMatchFromRoute, @@ -68,7 +68,6 @@ import type { import type { AnyRouter, RegisteredRouter, Router } from './router' import type { NotFoundError } from './not-found' import type { LazyRoute } from './fileRoute' - import type { UseRouteContextRoute } from './useRouteContext' export type RouteOptions< diff --git a/packages/solid-router/src/router.ts b/packages/solid-router/src/router.ts index 482ee7a1b41..c379c6ebcf3 100644 --- a/packages/solid-router/src/router.ts +++ b/packages/solid-router/src/router.ts @@ -40,6 +40,7 @@ import type { NoInfer } from '@tanstack/solid-store' import type { AnyContext, + AnyRedirect, AnySchema, AnyValidator, BuildLocationFn, @@ -55,6 +56,7 @@ import type { PickAsRequired, Register, ResolveRelativePath, + ResolvedRedirect, RouteById, RoutePaths, RoutesById, @@ -86,7 +88,6 @@ import type { MatchRouteOptions, } from './Matches' -import type { AnyRedirect, ResolvedRedirect } from './redirects' import type { NotFoundError } from './not-found' declare global { diff --git a/packages/solid-router/src/typePrimitives.ts b/packages/solid-router/src/typePrimitives.ts index cc448533ed8..d934fd7cb70 100644 --- a/packages/solid-router/src/typePrimitives.ts +++ b/packages/solid-router/src/typePrimitives.ts @@ -1,17 +1,19 @@ import type { LinkComponentProps } from './link' -import type { Redirect } from './redirects' import type { AnyRouter, RegisteredRouter } from './router' -import type { UseParamsOptions, UseParamsResult } from './useParams' -import type { UseSearchOptions, UseSearchResult } from './useSearch' +import type { UseParamsOptions } from './useParams' +import type { UseSearchOptions } from './useSearch' import type { Constrain, ConstrainLiteral, FromPathOption, NavigateOptions, PathParamOptions, + Redirect, RouteIds, SearchParamOptions, ToPathOption, + UseParamsResult, + UseSearchResult, } from '@tanstack/router-core' export type ValidateFromPath< diff --git a/packages/solid-router/src/useLoaderData.tsx b/packages/solid-router/src/useLoaderData.tsx index 25bc698d15e..636fd8defc4 100644 --- a/packages/solid-router/src/useLoaderData.tsx +++ b/packages/solid-router/src/useLoaderData.tsx @@ -2,7 +2,10 @@ import { useMatch } from './useMatch' import type { Accessor } from 'solid-js' import type { AnyRouter, RegisteredRouter } from './router' import type { StrictOrFrom } from './utils' -import type { AllLoaderData, Expand, RouteById } from '@tanstack/router-core' +import type { + ResolveUseLoaderData, + UseLoaderDataResult, +} from '@tanstack/router-core' export interface UseLoaderDataBaseOptions< TRouter extends AnyRouter, @@ -10,7 +13,7 @@ export interface UseLoaderDataBaseOptions< TStrict extends boolean, TSelected, > { - select?: (match: ResolveLoaderData) => TSelected + select?: (match: ResolveUseLoaderData) => TSelected } export type UseLoaderDataOptions< @@ -21,23 +24,6 @@ export type UseLoaderDataOptions< > = StrictOrFrom & UseLoaderDataBaseOptions -export type ResolveLoaderData< - TRouter extends AnyRouter, - TFrom, - TStrict extends boolean, -> = TStrict extends false - ? AllLoaderData - : Expand['types']['loaderData']> - -export type UseLoaderDataResult< - TRouter extends AnyRouter, - TFrom, - TStrict extends boolean, - TSelected, -> = unknown extends TSelected - ? ResolveLoaderData - : TSelected - export type UseLoaderDataRoute = < TRouter extends AnyRouter = RegisteredRouter, TSelected = unknown, diff --git a/packages/solid-router/src/useLoaderDeps.tsx b/packages/solid-router/src/useLoaderDeps.tsx index 7b8d42cb8bc..e91d0fe6c56 100644 --- a/packages/solid-router/src/useLoaderDeps.tsx +++ b/packages/solid-router/src/useLoaderDeps.tsx @@ -1,14 +1,17 @@ import { useMatch } from './useMatch' import type { AnyRouter, RegisteredRouter } from './router' import type { StrictOrFrom } from './utils' -import type { Expand, RouteById } from '@tanstack/router-core' +import type { + ResolveUseLoaderDeps, + UseLoaderDepsResult, +} from '@tanstack/router-core' export interface UseLoaderDepsBaseOptions< TRouter extends AnyRouter, TFrom, TSelected, > { - select?: (deps: ResolveLoaderDeps) => TSelected + select?: (deps: ResolveUseLoaderDeps) => TSelected } export type UseLoaderDepsOptions< @@ -17,15 +20,6 @@ export type UseLoaderDepsOptions< TSelected, > = StrictOrFrom & UseLoaderDepsBaseOptions -export type ResolveLoaderDeps = Expand< - RouteById['types']['loaderDeps'] -> - -export type UseLoaderDepsResult< - TRouter extends AnyRouter, - TFrom, - TSelected, -> = unknown extends TSelected ? ResolveLoaderDeps : TSelected export type UseLoaderDepsRoute = < TRouter extends AnyRouter = RegisteredRouter, diff --git a/packages/solid-router/src/useNavigate.tsx b/packages/solid-router/src/useNavigate.tsx index cba9ea257f5..2d135ab2432 100644 --- a/packages/solid-router/src/useNavigate.tsx +++ b/packages/solid-router/src/useNavigate.tsx @@ -1,19 +1,12 @@ import * as Solid from 'solid-js' import { useRouter } from './useRouter' -import type { FromPathOption, NavigateOptions } from '@tanstack/router-core' +import type { + FromPathOption, + NavigateOptions, + UseNavigateResult, +} from '@tanstack/router-core' import type { AnyRouter, RegisteredRouter } from './router' -export type UseNavigateResult = < - TRouter extends RegisteredRouter, - TTo extends string | undefined, - TFrom extends string = TDefaultFrom, - TMaskFrom extends string = TFrom, - TMaskTo extends string = '', ->({ - from, - ...rest -}: NavigateOptions) => Promise - export function useNavigate< TRouter extends AnyRouter = RegisteredRouter, TDefaultFrom extends string = string, diff --git a/packages/solid-router/src/useParams.tsx b/packages/solid-router/src/useParams.tsx index 4d04a9509d8..57a5e821be2 100644 --- a/packages/solid-router/src/useParams.tsx +++ b/packages/solid-router/src/useParams.tsx @@ -4,10 +4,9 @@ import type { Accessor } from 'solid-js' import type { AnyRouter, RegisteredRouter } from './router' import type { StrictOrFrom } from './utils' import type { - AllParams, - Expand, - RouteById, + ResolveUseParams, ThrowOrOptional, + UseParamsResult, } from '@tanstack/router-core' export interface UseParamsBaseOptions< @@ -17,7 +16,7 @@ export interface UseParamsBaseOptions< TThrow extends boolean, TSelected, > { - select?: (params: ResolveParams) => TSelected + select?: (params: ResolveUseParams) => TSelected shouldThrow?: TThrow } @@ -29,22 +28,6 @@ export type UseParamsOptions< TSelected, > = StrictOrFrom & UseParamsBaseOptions -export type ResolveParams< - TRouter extends AnyRouter, - TFrom, - TStrict extends boolean, -> = TStrict extends false - ? AllParams - : Expand['types']['allParams']> - -export type UseParamsResult< - TRouter extends AnyRouter, - TFrom, - TStrict extends boolean, - TSelected, -> = unknown extends TSelected - ? ResolveParams - : TSelected export type UseParamsRoute = < TRouter extends AnyRouter = RegisteredRouter, diff --git a/packages/solid-router/src/useRouteContext.ts b/packages/solid-router/src/useRouteContext.ts index 3f9b2a877e2..0ae39977d67 100644 --- a/packages/solid-router/src/useRouteContext.ts +++ b/packages/solid-router/src/useRouteContext.ts @@ -2,42 +2,11 @@ import { useMatch } from './useMatch' import type { Accessor } from 'solid-js' import type { AnyRouter, RegisteredRouter } from './router' -import type { StrictOrFrom } from './utils' -import type { AllContext, Expand, RouteById } from '@tanstack/router-core' - -export interface UseRouteContextBaseOptions< - TRouter extends AnyRouter, - TFrom, - TStrict extends boolean, - TSelected, -> { - select?: (search: ResolveRouteContext) => TSelected -} - -export type UseRouteContextOptions< - TRouter extends AnyRouter, - TFrom extends string | undefined, - TStrict extends boolean, - TSelected, -> = StrictOrFrom & - UseRouteContextBaseOptions - -export type ResolveRouteContext< - TRouter extends AnyRouter, - TFrom, - TStrict extends boolean, -> = TStrict extends false - ? AllContext - : Expand['types']['allContext']> - -export type UseRouteContextResult< - TRouter extends AnyRouter, - TFrom, - TStrict extends boolean, - TSelected, -> = unknown extends TSelected - ? ResolveRouteContext - : TSelected +import type { + UseRouteContextBaseOptions, + UseRouteContextOptions, + UseRouteContextResult, +} from '@tanstack/router-core' export type UseRouteContextRoute = < TRouter extends AnyRouter = RegisteredRouter, diff --git a/packages/solid-router/src/useSearch.tsx b/packages/solid-router/src/useSearch.tsx index b1c849e9691..bb6586ce96a 100644 --- a/packages/solid-router/src/useSearch.tsx +++ b/packages/solid-router/src/useSearch.tsx @@ -4,10 +4,9 @@ import type { Accessor } from 'solid-js' import type { AnyRouter, RegisteredRouter } from './router' import type { StrictOrFrom } from './utils' import type { - Expand, - FullSearchSchema, - RouteById, + ResolveUseSearch, ThrowOrOptional, + UseSearchResult, } from '@tanstack/router-core' export interface UseSearchBaseOptions< @@ -17,7 +16,7 @@ export interface UseSearchBaseOptions< TThrow extends boolean, TSelected, > { - select?: (state: ResolveSearch) => TSelected + select?: (state: ResolveUseSearch) => TSelected shouldThrow?: TThrow } @@ -30,23 +29,6 @@ export type UseSearchOptions< > = StrictOrFrom & UseSearchBaseOptions -export type UseSearchResult< - TRouter extends AnyRouter, - TFrom, - TStrict extends boolean, - TSelected, -> = unknown extends TSelected - ? ResolveSearch - : TSelected - -export type ResolveSearch< - TRouter extends AnyRouter, - TFrom, - TStrict extends boolean, -> = TStrict extends false - ? FullSearchSchema - : Expand['types']['fullSearchSchema']> - export type UseSearchRoute = < TRouter extends AnyRouter = RegisteredRouter, TSelected = unknown,