Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 19 additions & 14 deletions packages/react-router/src/link.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -465,20 +465,25 @@ export type LinkComponent<
props: LinkComponentProps<TComp, TRouter, TFrom, TTo, TMaskFrom, TMaskTo>,
) => React.ReactElement

export type LinkComponentRoute<in out TDefaultFrom extends string = string> = <
TRouter extends AnyRouter = RegisteredRouter,
const TTo extends string | undefined = undefined,
const TMaskTo extends string = '',
>(
props: LinkComponentProps<
'a',
TRouter,
TDefaultFrom,
TTo,
TDefaultFrom,
TMaskTo
>,
) => React.ReactElement
export interface LinkComponentRoute<
in out TDefaultFrom extends string = string,
> {
defaultFrom: TDefaultFrom
<
TRouter extends AnyRouter = RegisteredRouter,
const TTo extends string | undefined = undefined,
const TMaskTo extends string = '',
>(
props: LinkComponentProps<
'a',
TRouter,
this['defaultFrom'],
TTo,
this['defaultFrom'],
TMaskTo
>,
): React.ReactElement
}

export function createLink<const TComp>(
Comp: Constrain<TComp, any, (props: CreateLinkProps) => ReactNode>,
Expand Down
4 changes: 2 additions & 2 deletions packages/react-router/src/route.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,8 @@ declare module '@tanstack/router-core' {
}

export interface RouteExtensions<
TId extends string,
TFullPath extends string,
in out TId extends string,
in out TFullPath extends string,
> {
useMatch: UseMatchRoute<TId>
useRouteContext: UseRouteContextRoute<TId>
Expand Down
12 changes: 5 additions & 7 deletions packages/router-core/src/link.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,7 @@ import type {
MakeDifferenceOptional,
NoInfer,
NonNullableUpdater,
PickRequired,
Updater,
WithoutEmpty,
} from './utils'
import type { ParsedLocation } from './location'

Expand Down Expand Up @@ -469,11 +467,11 @@ type MakeRequiredParamsReducer<
> =
| (string extends TFrom
? never
: ResolveFromParams<TRouter, TParamVariant, TFrom> extends WithoutEmpty<
PickRequired<
ResolveRelativeToParams<TRouter, TParamVariant, TFrom, TTo>
>
>
: ResolveFromParams<
TRouter,
TParamVariant,
TFrom
> extends ResolveRelativeToParams<TRouter, TParamVariant, TFrom, TTo>
? true
: never)
| (ParamsReducer<TRouter, TParamVariant, TFrom, TTo> & {})
Expand Down
11 changes: 5 additions & 6 deletions packages/router-core/src/redirect.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import type { NavigateOptions } from './link'
import type { RoutePaths } from './routeInfo'
import type { AnyRouter, RegisteredRouter } from './router'
import type { PickAsRequired } from './utils'

Expand All @@ -10,9 +9,9 @@ export type AnyRedirect = Redirect<any, any, any, any, any>
*/
export type Redirect<
TRouter extends AnyRouter = RegisteredRouter,
TFrom extends RoutePaths<TRouter['routeTree']> | string = '/',
TTo extends string | undefined = '.',
TMaskFrom extends RoutePaths<TRouter['routeTree']> | string = TFrom,
TFrom extends string = string,
TTo extends string | undefined = undefined,
TMaskFrom extends string = TFrom,
TMaskTo extends string = '.',
> = {
href?: string
Expand All @@ -39,9 +38,9 @@ export type Redirect<

export type ResolvedRedirect<
TRouter extends AnyRouter = RegisteredRouter,
TFrom extends RoutePaths<TRouter['routeTree']> = '/',
TFrom extends string = string,
TTo extends string = '',
TMaskFrom extends RoutePaths<TRouter['routeTree']> = TFrom,
TMaskFrom extends string = TFrom,
TMaskTo extends string = '',
> = PickAsRequired<
Redirect<TRouter, TFrom, TTo, TMaskFrom, TMaskTo>,
Expand Down
7 changes: 4 additions & 3 deletions packages/router-core/src/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -442,7 +442,10 @@ export type ResolveFullPath<
TPrefixed = RoutePrefix<TParentRoute['fullPath'], TPath>,
> = TPrefixed extends RootRouteId ? '/' : TPrefixed

export interface RouteExtensions<TId, TFullPath> {}
export interface RouteExtensions<in out TId, in out TFullPath> {
id: TId
fullPath: TFullPath
}

export type RouteLazyFn<TRoute extends AnyRoute> = (
lazyFn: () => Promise<LazyRoute>,
Expand Down Expand Up @@ -564,9 +567,7 @@ export interface Route<
in out TChildren,
in out TFileRouteTypes,
> extends RouteExtensions<TId, TFullPath> {
fullPath: TFullPath
path: TPath
id: TId
parentRoute: TParentRoute
children?: TChildren
types: RouteTypes<
Expand Down
12 changes: 6 additions & 6 deletions packages/router-core/src/router.ts
Original file line number Diff line number Diff line change
Expand Up @@ -94,15 +94,15 @@ export type ControllablePromise<T = any> = Promise<T> & {

export type InjectedHtmlEntry = Promise<string>

export interface Register {
// router: Router
export interface DefaultRegister {
router: AnyRouter
}

export type RegisteredRouter = Register extends {
router: infer TRouter extends AnyRouter
export interface Register extends DefaultRegister {
// router: Router
}
? TRouter
: AnyRouter

export type RegisteredRouter = Register['router']

export type DefaultRemountDepsFn<TRouteTree extends AnyRoute> = (
opts: MakeRemountDepsOptionsUnion<TRouteTree>,
Expand Down
12 changes: 6 additions & 6 deletions packages/router-core/src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,12 +37,12 @@ export type DeepPartial<T> = T extends object
}
: T

export type MakeDifferenceOptional<TLeft, TRight> = Omit<
TRight,
keyof TLeft
> & {
[K in keyof TLeft & keyof TRight]?: TRight[K]
}
export type MakeDifferenceOptional<TLeft, TRight> = keyof TLeft &
keyof TRight extends never
? TRight
: Omit<TRight, keyof TLeft & keyof TRight> & {
[K in keyof TLeft & keyof TRight]?: TRight[K]
}

// from https://stackoverflow.com/a/53955431
// eslint-disable-next-line @typescript-eslint/naming-convention
Expand Down
33 changes: 19 additions & 14 deletions packages/solid-router/src/link.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -522,20 +522,25 @@ export type LinkComponent<
props: LinkComponentProps<TComp, TRouter, TFrom, TTo, TMaskFrom, TMaskTo>,
) => Solid.JSX.Element

export type LinkComponentRoute<in out TDefaultFrom extends string = string> = <
TRouter extends AnyRouter = RegisteredRouter,
const TTo extends string | undefined = undefined,
const TMaskTo extends string = '',
>(
props: LinkComponentProps<
'a',
TRouter,
TDefaultFrom,
TTo,
TDefaultFrom,
TMaskTo
>,
) => Solid.JSX.Element
export interface LinkComponentRoute<
in out TDefaultFrom extends string = string,
> {
defaultFrom: TDefaultFrom
<
TRouter extends AnyRouter = RegisteredRouter,
const TTo extends string | undefined = undefined,
const TMaskTo extends string = '',
>(
props: LinkComponentProps<
'a',
TRouter,
this['defaultFrom'],
TTo,
this['defaultFrom'],
TMaskTo
>,
): Solid.JSX.Element
}

export function createLink<const TComp>(
Comp: Constrain<TComp, any, (props: CreateLinkProps) => Solid.JSX.Element>,
Expand Down
16 changes: 8 additions & 8 deletions packages/solid-router/src/route.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,8 @@ declare module '@tanstack/router-core' {
}

export interface RouteExtensions<
TId extends string,
TFullPath extends string,
in out TId extends string,
in out TFullPath extends string,
> {
useMatch: UseMatchRoute<TId>
useRouteContext: UseRouteContextRoute<TId>
Expand Down Expand Up @@ -132,13 +132,13 @@ export class RouteApi<
return notFound({ routeId: this.id as string, ...opts })
}

Link: LinkComponentRoute<RouteTypesById<TRouter, TId>['fullPath']> = (
Link: LinkComponentRoute<RouteTypesById<TRouter, TId>['fullPath']> = ((
props,
) => {
const router = useRouter()
const fullPath = router.routesById[this.id as string].fullPath
return <Link from={fullPath as never} {...props} />
}
}) as LinkComponentRoute<RouteTypesById<TRouter, TId>['fullPath']>
}

export class Route<
Expand Down Expand Up @@ -242,9 +242,9 @@ export class Route<
return useNavigate({ from: this.fullPath })
}

Link: LinkComponentRoute<TFullPath> = (props) => {
Link: LinkComponentRoute<TFullPath> = ((props) => {
return <Link from={this.fullPath} {...props} />
}
}) as LinkComponentRoute<TFullPath>
}

export function createRoute<
Expand Down Expand Up @@ -427,9 +427,9 @@ export class RootRoute<
return useNavigate({ from: this.fullPath })
}

Link: LinkComponentRoute<'/'> = (props) => {
Link: LinkComponentRoute<'/'> = ((props) => {
return <Link from={this.fullPath} {...(props as any)} />
}
}) as LinkComponentRoute<'/'>
}

export function createRouteMask<
Expand Down