Files
core/packages/api-client/interfaces/request.ts
2023-06-10 16:33:12 +08:00

86 lines
2.3 KiB
TypeScript

import type { RequestOptions } from './instance'
type NoStringIndex<T> = { [K in keyof T as string extends K ? never : K]: T[K] }
export type Method = 'get' | 'delete' | 'post' | 'put' | 'patch'
export interface IRequestHandler<ResponseWrapper> {
(path?: string | number): IRequestHandler<ResponseWrapper>
// @ts-ignore
get<P = unknown>(
options?: Omit<NoStringIndex<RequestOptions>, 'data'>,
): RequestProxyResult<P, ResponseWrapper>
// @ts-ignore
post<P = unknown>(
options?: RequestOptions,
): RequestProxyResult<P, ResponseWrapper>
// @ts-ignore
patch<P = unknown>(
options?: RequestOptions,
): RequestProxyResult<P, ResponseWrapper>
// @ts-ignore
delete<P = unknown>(
options?: Omit<NoStringIndex<RequestOptions>, 'data'>,
): RequestProxyResult<P, ResponseWrapper>
// @ts-ignore
put<P = unknown>(
options?: RequestOptions,
): RequestProxyResult<P, ResponseWrapper>
// @ts-ignore
toString(withBase?: boolean): string
// @ts-ignore
valueOf(withBase?: boolean): string
[key: string]: IRequestHandler<ResponseWrapper>
}
export type RequestProxyResult<
T,
ResponseWrapper,
R = ResponseWrapper extends unknown
? { data: T; [key: string]: any }
: ResponseWrapper extends { data: T }
? ResponseWrapper
: Omit<ResponseWrapper, 'data'> & { data: T },
> = Promise<ResponseProxyExtraRaw<T, R, ResponseWrapper>>
type CamelToSnake<T extends string, P extends string = ''> = string extends T
? string
: T extends `${infer C0}${infer R}`
? CamelToSnake<
R,
`${P}${C0 extends Lowercase<C0> ? '' : '_'}${Lowercase<C0>}`
>
: P
type CamelKeysToSnake<T> = {
[K in keyof T as CamelToSnake<Extract<K, string>>]: T[K]
}
type ResponseWrapperType<Response, RawData, T> = {
$raw: Response extends { data: infer T }
? Response
: Response extends unknown
? {
[i: string]: any
data: RawData extends unknown ? CamelKeysToSnake<T> : 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<Response, RawData, T>
: T extends unknown
? T & ResponseWrapperType<Response, RawData, T>
: unknown