feat: move api-client as core's monorepo
Signed-off-by: Innei <tukon479@gmail.com>
This commit is contained in:
36
packages/api-client/interfaces/adapter.ts
Normal file
36
packages/api-client/interfaces/adapter.ts
Normal 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>
|
||||
}
|
||||
>
|
||||
15
packages/api-client/interfaces/client.ts
Normal file
15
packages/api-client/interfaces/client.ts
Normal 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>
|
||||
5
packages/api-client/interfaces/controller.ts
Normal file
5
packages/api-client/interfaces/controller.ts
Normal file
@@ -0,0 +1,5 @@
|
||||
export interface IController {
|
||||
base: string
|
||||
|
||||
name: string | string[]
|
||||
}
|
||||
8
packages/api-client/interfaces/instance.ts
Normal file
8
packages/api-client/interfaces/instance.ts
Normal 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
|
||||
}
|
||||
1
packages/api-client/interfaces/options.ts
Normal file
1
packages/api-client/interfaces/options.ts
Normal file
@@ -0,0 +1 @@
|
||||
export type SortOrder = 'asc' | 'desc'
|
||||
4
packages/api-client/interfaces/params.ts
Normal file
4
packages/api-client/interfaces/params.ts
Normal file
@@ -0,0 +1,4 @@
|
||||
export interface PaginationParams {
|
||||
size?: number
|
||||
page?: number
|
||||
}
|
||||
83
packages/api-client/interfaces/request.ts
Normal file
83
packages/api-client/interfaces/request.ts
Normal 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
|
||||
3
packages/api-client/interfaces/types.ts
Normal file
3
packages/api-client/interfaces/types.ts
Normal file
@@ -0,0 +1,3 @@
|
||||
export type Class<T> = new (...args: any[]) => T
|
||||
|
||||
export type SelectFields<T extends string> = `${'+' | '-' | ''}${T}`[]
|
||||
Reference in New Issue
Block a user