import type { RequestOptions } from './instance' type NoStringIndex = { [K in keyof T as string extends K ? never : K]: T[K] } export type Method = 'get' | 'delete' | 'post' | 'put' | 'patch' export interface IRequestHandler { (path?: string | number): IRequestHandler // @ts-ignore get:

( options?: Omit, 'data'>, ) => RequestProxyResult // @ts-ignore post:

( options?: RequestOptions, ) => RequestProxyResult // @ts-ignore patch:

( options?: RequestOptions, ) => RequestProxyResult // @ts-ignore delete:

( options?: Omit, 'data'>, ) => RequestProxyResult // @ts-ignore put:

( options?: RequestOptions, ) => RequestProxyResult // @ts-ignore toString: (withBase?: boolean) => string // @ts-ignore valueOf: (withBase?: boolean) => string [key: string]: IRequestHandler } export type RequestProxyResult< T, ResponseWrapper, R = ResponseWrapper extends unknown ? { data: T; [key: string]: any } : ResponseWrapper extends { data: T } ? ResponseWrapper : Omit & { data: T }, > = Promise> type CamelToSnake = string extends T ? string : T extends `${infer C0}${infer R}` ? CamelToSnake< R, `${P}${C0 extends Lowercase ? '' : '_'}${Lowercase}` > : P type CamelKeysToSnake = { [K in keyof T as CamelToSnake>]: T[K] } type ResponseWrapperType = { $raw: Response extends { data: infer T } ? Response : Response extends unknown ? { [i: string]: any data: RawData extends unknown ? CamelKeysToSnake : RawData } : Response $request: { path: string method: string [k: string]: string } $serialized: T } export type ResponseProxyExtraRaw< T, RawData = unknown, Response = unknown, > = T extends object ? T & ResponseWrapperType : T extends unknown ? T & ResponseWrapperType : unknown