@tanstack/react-router
Version:
Modern and scalable routing for React applications
48 lines (42 loc) • 1.56 kB
text/typescript
import type {
AnyRouter,
Constrain,
OptionalStructuralSharing,
ValidateJSON,
} from '@tanstack/router-core'
export type DefaultStructuralSharingEnabled<TRouter extends AnyRouter> =
boolean extends TRouter['options']['defaultStructuralSharing']
? // for now, default to false.
// TODO in V2: default to true
false
: NonNullable<TRouter['options']['defaultStructuralSharing']>
export interface RequiredStructuralSharing<TStructuralSharing, TConstraint> {
readonly structuralSharing: Constrain<TStructuralSharing, TConstraint>
}
export type StructuralSharingOption<
TRouter extends AnyRouter,
TSelected,
TStructuralSharing,
> = unknown extends TSelected
? OptionalStructuralSharing<TStructuralSharing, boolean>
: unknown extends TRouter['routeTree']
? OptionalStructuralSharing<TStructuralSharing, boolean>
: TSelected extends ValidateJSON<TSelected>
? OptionalStructuralSharing<TStructuralSharing, boolean>
: DefaultStructuralSharingEnabled<TRouter> extends true
? RequiredStructuralSharing<TStructuralSharing, false>
: OptionalStructuralSharing<TStructuralSharing, false>
export type StructuralSharingEnabled<
TRouter extends AnyRouter,
TStructuralSharing,
> = boolean extends TStructuralSharing
? DefaultStructuralSharingEnabled<TRouter>
: TStructuralSharing
export type ValidateSelected<
TRouter extends AnyRouter,
TSelected,
TStructuralSharing,
> =
StructuralSharingEnabled<TRouter, TStructuralSharing> extends true
? ValidateJSON<TSelected>
: TSelected