next-typesafe-path
Version:
Type-safe path for Next.js
30 lines (29 loc) • 1.61 kB
TypeScript
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 {};