feat: move api-client as core's monorepo

Signed-off-by: Innei <tukon479@gmail.com>
This commit is contained in:
Innei
2022-12-20 21:26:21 +08:00
parent 06ab476c8a
commit a281f45ab4
101 changed files with 7990 additions and 297 deletions

View File

@@ -0,0 +1,36 @@
import { RequestOptions } from './instance'
export type IAdaptorRequestResponseType<P> = Promise<
Record<string, any> & { data: P }
>
export type IRequestAdapter<T = any, Response = undefined> = Readonly<
(Response extends undefined ? {} : { responseWrapper: Response }) & {
default: T
get<P = unknown>(
url: string,
options?: Omit<RequestOptions, 'data'>,
): IAdaptorRequestResponseType<P>
post<P = unknown>(
url: string,
options: Partial<RequestOptions>,
): IAdaptorRequestResponseType<P>
patch<P = unknown>(
url: string,
options: Partial<RequestOptions>,
): IAdaptorRequestResponseType<P>
delete<P = unknown>(
url: string,
options?: Omit<RequestOptions, 'data'>,
): IAdaptorRequestResponseType<P>
put<P = unknown>(
url: string,
options: Partial<RequestOptions>,
): IAdaptorRequestResponseType<P>
}
>

View File

@@ -0,0 +1,15 @@
import { IController } from './controller'
import { Class } from './types'
interface IClientOptions {
controllers: Class<IController>[]
getCodeMessageFromException: <T = Error>(
error: T,
) => {
message?: string | undefined | null
code?: number | undefined | null
}
customThrowResponseError: <T extends Error = Error>(err: any) => T
transformResponse: <T = any>(data: any) => T
}
export type ClientOptions = Partial<IClientOptions>

View File

@@ -0,0 +1,5 @@
export interface IController {
base: string
name: string | string[]
}

View File

@@ -0,0 +1,8 @@
export interface RequestOptions {
method?: string
data?: Record<string, any>
params?: Record<string, any> | URLSearchParams
headers?: Record<string, string>
[key: string]: any
}

View File

@@ -0,0 +1 @@
export type SortOrder = 'asc' | 'desc'

View File

@@ -0,0 +1,4 @@
export interface PaginationParams {
size?: number
page?: number
}

View File

@@ -0,0 +1,83 @@
import { 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
}
}
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

View File

@@ -0,0 +1,3 @@
export type Class<T> = new (...args: any[]) => T
export type SelectFields<T extends string> = `${'+' | '-' | ''}${T}`[]