type DefaultArgs = [string]; type AcceptedParser = ((input: unknown) => T) | { parse: (input: unknown) => T; }; type SchemaMap = Map; type Schemas = { input: AcceptedParser | undefined; output: AcceptedParser | undefined; }; interface UntypeableBase { pushArg: () => UntypeableBase<[...TArgs, TArg]>; unshiftArg: () => UntypeableBase<[TArg, ...TArgs]>; args(): UntypeableBase<[TArg1]>; args(): UntypeableBase<[ TArg1, TArg2 ]>; args(): UntypeableBase<[TArg1, TArg2, TArg3]>; args(): UntypeableBase<[TArg1, TArg2, TArg3, TArg4]>; args(): UntypeableBase; router: >>(routes: TNewRoutes) => UntypeableRouter>; input: (parser?: AcceptedParser) => UntypeableInput; output: (parser?: AcceptedParser) => UntypeableOutput<{}, TOutput>; } type Prettify = { [K in keyof T]: T[K]; } & {}; interface UntypeableInput { __type: "input"; output: (schema?: AcceptedParser) => UntypeableOutput; inputSchema: AcceptedParser | undefined; } interface UntypeableOutput { __type: "output"; outputSchema: AcceptedParser | undefined; inputSchema: AcceptedParser | undefined; } interface UntypeableRouter = {}> { _schemaMap: SchemaMap; add: >>(routes: TNewRoutes) => UntypeableRouter>; merge: >(router: UntypeableRouter) => UntypeableRouter>; } type LooseUntypeableHandler = (...args: [...args: TArgs, input: any]) => Promise; type UntypeableHandler = {}> = TArgs["length"] extends 1 ? (firstArg: T1, ...args: ArgsFromRoutes) => TRoutes[T1] extends UntypeableOutput ? Promise : never : TArgs["length"] extends 2 ? (firstArg: T1, secondArg: T2, ...args: ArgsFromRoutes) => TRoutes[T1][T2] extends UntypeableOutput ? Promise : never : TArgs["length"] extends 3 ? (firstArg: T1, secondArg: T2, thirdArg: T3, ...args: ArgsFromRoutes) => TRoutes[T1][T2][T3] extends UntypeableOutput ? Promise : never : TArgs["length"] extends 4 ? (firstArg: T1, secondArg: T2, thirdArg: T3, fourthArg: T4, ...args: ArgsFromRoutes) => TRoutes[T1][T2][T3][T4] extends UntypeableOutput ? Promise : never : never; type ArgsFromRoutes = TRoutes extends UntypeableOutput ? TInput extends Record ? [] : [input: Prettify] : never; type StringArrayToObject = T extends [ infer THead extends string, ...infer TTail extends readonly string[] ] ? { [K in THead]?: StringArrayToObject; } : TValue; type ArgsFromRouter> = TRouter extends UntypeableRouter ? TArgs : never; type RoutesFromRouter> = TRouter extends UntypeableRouter ? TRoutes : never; /** * Creates an API client that does not check the input or output * at runtime. For runtime checking, use createSafeClient. * * If you're using createTypeLevelClient, we recommend importing * it from 'untypeable/client' to minimize bundle size. * * @example * * const client = createTypeLevelClient((path) => { * return fetch(path).then(res => res.json()); * }); */ declare const createTypeLevelClient: , TArgs extends readonly string[] = ArgsFromRouter, TConfig extends Record = RoutesFromRouter>(handler: LooseUntypeableHandler) => UntypeableHandler; export { ArgsFromRouter as A, LooseUntypeableHandler as L, Prettify as P, RoutesFromRouter as R, SchemaMap as S, UntypeableBase as U, UntypeableRouter as a, UntypeableHandler as b, createTypeLevelClient as c, AcceptedParser as d, Schemas as e, UntypeableInput as f, UntypeableOutput as g, ArgsFromRoutes as h, StringArrayToObject as i };