UNPKG

next-typesafe-path

Version:
30 lines (29 loc) 1.61 kB
import { RouteList } from '@@@next-typesafe-path'; type RoutePath = keyof RouteList & string; type RouteParams<T extends RoutePath> = RouteList[T]["params"]; type RouteSearchParams<T extends RoutePath> = RouteList[T]["searchParams"]; type IsAllOptional<T> = { [K in keyof T]?: any; } extends T ? true : false; type HasSearchParams<T> = T extends { searchParams: undefined; } ? false : true; type HasParams<T> = T extends Record<string, never> ? false : true; type PickSearchParams<T extends RoutePath> = Pick<RouteList[T], "searchParams">; type RouteParameters<T extends RoutePath> = { RequiredBoth: [ params: RouteParams<T>, searchParams: RouteSearchParams<T> ]; RequiredParamsOptionalSearch: [ params: RouteParams<T>, searchParams?: RouteSearchParams<T> ]; ParamsOnly: [params: RouteParams<T>]; SearchOnly: [searchParams: RouteSearchParams<T>]; OptionalSearchOnly: [searchParams?: RouteSearchParams<T>]; None: []; }; type RouteArgs<T extends RoutePath> = HasParams<RouteParams<T>> extends true ? HasSearchParams<PickSearchParams<T>> extends true ? IsAllOptional<RouteSearchParams<T>> extends true ? RouteParameters<T>["RequiredParamsOptionalSearch"] : RouteParameters<T>["RequiredBoth"] : RouteParameters<T>["ParamsOnly"] : HasSearchParams<PickSearchParams<T>> extends true ? IsAllOptional<RouteSearchParams<T>> extends true ? RouteParameters<T>["OptionalSearchOnly"] : RouteParameters<T>["SearchOnly"] : RouteParameters<T>["None"]; export declare const $path: <T extends RoutePath>(path: T, ...args: RouteArgs<T>) => T; export {};