import type { BASE_KEY } from './constants.js'; /****************************************************************************** Types ******************************************************************************/ type Primitive = string | number | boolean | null | undefined; export type Dict = Record; type BaseKey = typeof BASE_KEY; type CollapseType = { -readonly [K in keyof T]: T[K]; } & {}; export type ArgObj = { _: string; [key: string]: string | ArgObj; }; export interface IOptions { prepend?: string; disableRegex?: boolean; } type SearchParams = Exclude extends never ? T extends { [K in keyof T]: Primitive | Primitive[]; } ? T : never : never; type ParamNames = Path extends `${string}/:${infer Param}/${infer Rest}` ? Param | ParamNames<`/${Rest}`> : Path extends `${string}/:${infer Param}` ? Param : never; type PathParams = { [K in ParamNames]: Primitive; }; type ResolveType>> = S extends `${string}/:${string}` ? (pathParams?: P, searchParams?: SearchParams) => S : (searchParams?: SearchParams) => S; type Iterate = { [K in keyof T]: T[K] extends string ? ResolveType : T[K] extends object ? CollapseType> : never; }; type Join = A extends '' ? B : B extends '' ? A : `${A}${B}`; type ExpandPaths = { [K in keyof T]: T[K] extends string ? K extends '_' ? Prefix : Join : T[K] extends ArgObj ? ExpandPaths> : never; }; type SetupPrefix = undefined extends U ? T[BaseKey] : U extends IOptions ? U['prepend'] extends string ? `${U['prepend']}${T[BaseKey]}` : T[BaseKey] : never; export type RetVal = Iterate>>; export {};