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