diff --git a/examples/react/wip-with-framer-motion/src/main.tsx b/examples/react/wip-with-framer-motion/src/main.tsx index 4f17f30700..0aec3b764a 100644 --- a/examples/react/wip-with-framer-motion/src/main.tsx +++ b/examples/react/wip-with-framer-motion/src/main.tsx @@ -158,6 +158,9 @@ const indexRoute = new Route({ const postsRoute = new Route({ getParentRoute: () => rootRoute, path: 'posts', + beforeLoad: () => ({ + test: true, + }), loader: async ({ context: { loaderClient } }) => { await loaderClient.load({ key: 'posts' }) }, diff --git a/packages/react-router/src/react.tsx b/packages/react-router/src/react.tsx index fa0e8a409f..d8167fd169 100644 --- a/packages/react-router/src/react.tsx +++ b/packages/react-router/src/react.tsx @@ -39,6 +39,8 @@ import { AnyPathParams, Expand, ResolveAllParams, + DeepMergeAll, + IsAny, } from '@tanstack/router-core' declare module '@tanstack/router-core' { @@ -124,12 +126,15 @@ declare module '@tanstack/router-core' { TParentRoute, TParams >, - TParentContext extends RouteConstraints['TParentContext'] = TParentRoute['types']['routeContext'], - TAllParentContext extends RouteConstraints['TAllParentContext'] = TParentRoute['types']['context'], TRouteContext extends RouteConstraints['TRouteContext'] = RouteContext, - TAllContext extends RouteConstraints['TAllContext'] = MergeFromFromParent< - TParentRoute['types']['context'], - TRouteContext + TAllContext extends RouteConstraints['TAllContext'] = Expand< + DeepMergeAll< + [ + IsAny, + TLoaderContext, + TRouteContext, + ] + > >, TRouterContext extends RouteConstraints['TRouterContext'] = AnyContext, TChildren extends RouteConstraints['TChildren'] = unknown, @@ -141,12 +146,9 @@ declare module '@tanstack/router-core' { useLoader: (opts?: { select?: (search: TLoader) => TSelected }) => UseLoaderResult - useContext: (opts?: { + useRouteContext: (opts?: { select?: (search: TAllContext) => TSelected }) => TSelected - useRouteContext: (opts?: { - select?: (search: TRouteContext) => TSelected - }) => TSelected useSearch: (opts?: { select?: (search: TFullSearchSchema) => TSelected }) => TSelected @@ -208,12 +210,9 @@ export type RouteProps< useMatch: (opts?: { select?: (search: TAllContext) => TSelected }) => TSelected - useContext: (opts?: { + useRouteContext: (opts?: { select?: (search: TAllContext) => TSelected }) => TSelected - useRouteContext: (opts?: { - select?: (search: TRouteContext) => TSelected - }) => TSelected useSearch: (opts?: { select?: (search: TFullSearchSchema) => TSelected }) => TSelected @@ -265,19 +264,11 @@ Route.__onInit = (route) => { useLoader: (opts = {}) => { return useLoader({ ...opts, from: route.id }) as any }, - useContext: (opts: any = {}) => { - return useMatch({ - ...opts, - from: route.id, - select: (d: any) => (opts?.select ? opts.select(d.context) : d.context), - } as any) - }, useRouteContext: (opts: any = {}) => { return useMatch({ ...opts, from: route.id, - select: (d: any) => - opts?.select ? opts.select(d.routeContext) : d.routeContext, + select: (d: any) => (opts?.select ? opts.select(d.context) : d.context), } as any) }, useSearch: (opts = {}) => { @@ -659,7 +650,6 @@ function Matches() { return React.createElement(ErrorComponent, { ...props, useMatch: route.useMatch, - useContext: route.useContext, useRouteContext: route.useRouteContext, useSearch: route.useSearch, useParams: route.useParams, @@ -999,7 +989,6 @@ function Match({ matchIds }: { matchIds: string[] }) { return React.createElement(routeErrorComponent, { ...props, useMatch: route.useMatch, - useContext: route.useContext, useRouteContext: route.useRouteContext, useSearch: route.useSearch, useParams: route.useParams, @@ -1013,7 +1002,6 @@ function Match({ matchIds }: { matchIds: string[] }) { , - TParentContext extends RouteConstraints['TParentContext'] = TParentRoute['types']['routeContext'], - TAllParentContext extends RouteConstraints['TAllParentContext'] = TParentRoute['types']['context'], TRouteContext extends RouteConstraints['TRouteContext'] = RouteContext, - TContext extends RouteConstraints['TAllContext'] = MergeFromFromParent< - TParentRoute['types']['context'], - TRouteContext + TContext extends RouteConstraints['TAllContext'] = Expand< + DeepMergeAll< + [ + IsAny, + TLoaderContext, + TRouteContext, + ] + > >, TRouterContext extends RouteConstraints['TRouterContext'] = AnyContext, TChildren extends RouteConstraints['TChildren'] = unknown, @@ -121,8 +125,6 @@ export class FileRoute< TFullSearchSchema, TParams, TAllParams, - TParentContext, - TAllParentContext, TRouteContext, TContext >, @@ -148,8 +150,6 @@ export class FileRoute< TFullSearchSchema, TParams, TAllParams, - TParentContext, - TAllParentContext, TRouteContext, TContext, TRouterContext, diff --git a/packages/router-core/src/route.ts b/packages/router-core/src/route.ts index 2784cfab6d..90811e35cb 100644 --- a/packages/router-core/src/route.ts +++ b/packages/router-core/src/route.ts @@ -206,8 +206,6 @@ export type RouteOptions< TFullSearchSchema extends Record = TSearchSchema, TParams extends AnyPathParams = AnyPathParams, TAllParams extends AnyPathParams = TParams, - TParentContext extends Record = AnyContext, - TAllParentContext extends Record = AnyContext, TRouteContext extends RouteContext = RouteContext, TAllContext extends Record = AnyContext, > = BaseRouteOptions< @@ -220,8 +218,6 @@ export type RouteOptions< TFullSearchSchema, TParams, TAllParams, - TParentContext, - TAllParentContext, TRouteContext, TAllContext > & @@ -253,8 +249,6 @@ export type BaseRouteOptions< TFullSearchSchema extends Record = TSearchSchema, TParams extends AnyPathParams = {}, TAllParams = ParamsFallback, - TParentContext extends Record = AnyContext, - TAllParentContext extends Record = AnyContext, TRouteContext extends RouteContext = RouteContext, TAllContext extends Record = AnyContext, > = RoutePathOptions & { @@ -270,7 +264,6 @@ export type BaseRouteOptions< beforeLoad?: BeforeLoadFn< TParentRoute, TAllParams, - TAllParentContext, NoInfer, TRouteContext > @@ -279,7 +272,6 @@ export type BaseRouteOptions< beforeLoad: BeforeLoadFn< TParentRoute, TAllParams, - TAllParentContext, NoInfer, TRouteContext > @@ -315,16 +307,15 @@ export type BaseRouteOptions< ) type BeforeLoadFn< - TParentRoute, + TParentRoute extends AnyRoute, TAllParams, - TParentContext, TLoaderContext, TRouteContext, > = (opts: { abortController: AbortController preload: boolean params: TAllParams - context: Expand + context: Expand }) => Promise | TRouteContext | void export type UpdatableRouteOptions< @@ -489,8 +480,6 @@ export interface AnyRoute any, any, any, - any, - any, any > {} @@ -535,7 +524,6 @@ export type RouteConstraints = { TParams: Record TAllParams: Record TParentContext: AnyContext - TAllParentContext: AnyContext TRouteContext: RouteContext TAllContext: AnyContext TRouterContext: AnyContext @@ -556,7 +544,7 @@ export class Route< TCustomId, TPath >, - TLoaderContext extends RouteConstraints['TLoaderContext'] = AnyContext, + TLoaderContext extends RouteConstraints['TLoaderContext'] = {}, TLoader = unknown, TSearchSchema extends RouteConstraints['TSearchSchema'] = {}, TFullSearchSchema extends RouteConstraints['TFullSearchSchema'] = ResolveFullSearchSchema< @@ -570,12 +558,15 @@ export class Route< TParentRoute, TParams >, - TParentContext extends RouteConstraints['TParentContext'] = TParentRoute['types']['routeContext'], - TAllParentContext extends RouteConstraints['TAllParentContext'] = TParentRoute['types']['context'], TRouteContext extends RouteConstraints['TRouteContext'] = RouteContext, - TAllContext extends RouteConstraints['TAllContext'] = MergeFromFromParent< - TParentRoute['types']['context'], - TRouteContext + TAllContext extends RouteConstraints['TAllContext'] = Expand< + DeepMergeAll< + [ + IsAny, + TLoaderContext, + TRouteContext, + ] + > >, TRouterContext extends RouteConstraints['TRouterContext'] = AnyContext, TChildren extends RouteConstraints['TChildren'] = unknown, @@ -593,8 +584,6 @@ export class Route< fullSearchSchema: TFullSearchSchema params: TParams allParams: TAllParams - parentContext: TParentContext - allParentContext: TAllParentContext routeContext: TRouteContext context: TAllContext children: TChildren @@ -612,8 +601,6 @@ export class Route< TFullSearchSchema, TParams, TAllParams, - TParentContext, - TAllParentContext, TRouteContext, TAllContext > @@ -643,8 +630,6 @@ export class Route< TFullSearchSchema, TParams, TAllParams, - TParentContext, - TAllParentContext, TRouteContext, TAllContext > & @@ -676,8 +661,6 @@ export class Route< TFullSearchSchema, TParams, TAllParams, - TParentContext, - TAllParentContext, TRouteContext, TAllContext > & @@ -747,8 +730,6 @@ export class Route< TFullSearchSchema, TParams, TAllParams, - TParentContext, - TAllParentContext, TRouteContext, TAllContext, TRouterContext, @@ -792,19 +773,17 @@ export class RouterContext { >( options?: Omit< RouteOptions< - AnyRoute, - RootRouteId, - '', - TLoaderContext, - TLoader, - TSearchSchema, - TSearchSchema, - {}, - {}, - TRouterContext, - TRouterContext, - TRouteContext, - MergeFromFromParent + AnyRoute, // TParentRoute + RootRouteId, // TCustomId + '', // TPath + TLoaderContext, // TLoaderContext + TLoader, // TLoader + TSearchSchema, // TSearchSchema + TSearchSchema, // TFullSearchSchema + {}, // TParams + {}, // TAllParams + TRouteContext, // TRouteContext + DeepMergeAll<[TRouterContext, TLoaderContext, TRouteContext]> // TAllContext >, | 'path' | 'id' @@ -831,41 +810,37 @@ export class RootRoute< TRouteContext extends RouteContext = RouteContext, TRouterContext extends {} = {}, > extends Route< - any, - '/', - '/', - string, - RootRouteId, - TLoaderContext, - TLoader, - TSearchSchema, - TSearchSchema, - {}, - {}, - TRouterContext, - TRouterContext, - TRouteContext, - MergeFromFromParent, - TRouterContext, - any, - any + any, // TParentRoute + '/', // TPath + '/', // TFullPath + string, // TCustomId + RootRouteId, // TId + TLoaderContext, // TLoaderContext + TLoader, // TLoader + TSearchSchema, // TSearchSchema + TSearchSchema, // TFullSearchSchema + {}, // TParams + {}, // TAllParams + TRouteContext, // TRouteContext + DeepMergeAll<[TRouterContext, TLoaderContext, TRouteContext]>, // TAllContext + TRouterContext, // TRouterContext + any, // TChildren + any // TRouteTree > { constructor( options?: Omit< RouteOptions< - AnyRoute, - RootRouteId, - '', - TLoaderContext, - TLoader, - TSearchSchema, - TSearchSchema, - {}, - {}, - TRouterContext, - TRouterContext, - TRouteContext, - MergeFromFromParent + AnyRoute, // TParentRoute + RootRouteId, // TCustomId + '', // TPath + TLoaderContext, // TLoaderContext + TLoader, // TLoader + TSearchSchema, // TSearchSchema + TSearchSchema, // TFullSearchSchema + {}, // TParams + {}, // TAllParams + TRouteContext, // TRouteContext + DeepMergeAll<[TRouterContext, TLoaderContext, TRouteContext]> // TAllContext >, | 'path' | 'id' diff --git a/packages/router-core/src/routeInfo.ts b/packages/router-core/src/routeInfo.ts index 9701483837..841c4ca539 100644 --- a/packages/router-core/src/routeInfo.ts +++ b/packages/router-core/src/routeInfo.ts @@ -21,8 +21,6 @@ export type ParseRouteChildren = any, any, any, - any, - any, infer TChildren, any > diff --git a/packages/router-core/src/router.ts b/packages/router-core/src/router.ts index 92782deb83..875511452a 100644 --- a/packages/router-core/src/router.ts +++ b/packages/router-core/src/router.ts @@ -1050,7 +1050,7 @@ export class Router< this.setRouteMatch(match.id, (s) => ({ ...s, - context, + context: replaceEqualDeep(s.context, context), })) } catch (err) { handleError(err, 'BEFORE_LOAD') diff --git a/packages/router-core/src/utils.ts b/packages/router-core/src/utils.ts index 1584e6dacc..1e18c8a1a1 100644 --- a/packages/router-core/src/utils.ts +++ b/packages/router-core/src/utils.ts @@ -1,5 +1,5 @@ export type NoInfer = [T][T extends any ? 0 : never] -export type IsAny = 1 extends 0 & T ? Y : N +export type IsAny = 1 extends 0 & T ? Y : N export type IsAnyBoolean = 1 extends 0 & T ? true : false export type IsKnown = unknown extends T ? N : Y export type PickAsRequired = Omit &