import { Simplify } from 'type-fest'; /** * Create a `Route` given a path. Route has the provided `path` and a `makePath` method that helps making a path. * @param path it can be a simple string (e.g. `/` or `/home/`) or a more complex with variables (e.g. `/users/:name/` or `/orders/:id?/`) * @returns */ export declare function createRoute = ExtractParameters>(path: ValidPath): Route; /** * Create a typed `Route` given a path. Route has the provided `path` and a `makePath` method that helps making a path. * @param path it can be a simple string (e.g. `/` or `/home/`) or a more complex with variables (e.g. `/users/:name/` or `/orders/:id?/`) * @example * ```ts * const route = createTypedRoute<{ * orderNumber: number * shipmentCode?: 'IT' | 'US' * }>()('/orders/:orderNumber/:shipmentCode?/') * ``` */ export declare const createTypedRoute: >() => (path: ValidPath) => Route; /** * Get params from a `Route`. * * @example * ```ts * const route = createRoute('/orders/:id/:name?/') * * type Params = GetParams * * // equivalent to * * type Params = { * id: string; * name?: string | undefined; * } * ``` * * @example * ```ts * const route = createTypedRoute<{ type: 'A' | 42; enabled?: boolean }>()( * '/orders/:type/:enabled?/' * ) * * type Params = GetParams * * // equivalent to * * type Params = { * type: 'A' | '42'; * enabled?: "false" | "true" | undefined; * } * ``` */ export type GetParams string; }> = { [K in keyof Parameters[0]]: Exclude[0][K]>, "undefined" | "null">; }; /** * Cast a valid `string | number | bigint | boolean | null | undefined` to literal. * * @example * ```ts * type N = ToLiteral<42> //= '42' * type B = ToLiteral //= 'false' | 'true' * ``` */ type ToLiteral = `${V}`; export interface Route = ExtractParameters> { path: Path extends `/${infer P}/` ? `/${P}` : "/"; makePath: (parameters: Parameters, searchParams?: string | URLSearchParams) => string; } type ExtractParameters = Path extends `${string}:${infer Var}/${infer Rest}` ? Simplify & ExtractParameters> : {}; type FixOptional> = Omit & { [K in keyof T as K extends `${infer VariableName}?` ? VariableName : never]?: T[K]; }; type ErrorParameters, Path extends string> = keyof ({ [key in keyof ExtractParameters as key extends keyof Parameters ? never : undefined extends ExtractParameters[key] ? key extends string ? `${key}?` : key : key]-?: "Is not properly set."; } & { [key in keyof Parameters as key extends string ? Path extends `${string}/:${key}${undefined extends Parameters[key] ? "?" : ""}/${string}` ? never : undefined extends Parameters[key] ? `${key}?` : key : never]-?: "Is not properly set."; }); type ValidPath, Path extends string> = ErrorParameters extends never ? Path : `Missing variable '${ErrorParameters extends string ? ErrorParameters : "unknown"}'`; export {};