@kubb/plugin-client
Version:
API client generator plugin for Kubb, creating type-safe HTTP clients (Axios, Fetch) from OpenAPI specifications for making API requests.
76 lines (62 loc) • 2.2 kB
text/typescript
import type { AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios'
import axios from 'axios'
declare const AXIOS_BASE: string
declare const AXIOS_HEADERS: string
/**
* Subset of AxiosRequestConfig
*/
export type RequestConfig<TData = unknown> = {
baseURL?: string
url?: string
method?: 'GET' | 'PUT' | 'PATCH' | 'POST' | 'DELETE' | 'OPTIONS' | 'HEAD'
params?: unknown
data?: TData | FormData
responseType?: 'arraybuffer' | 'blob' | 'document' | 'json' | 'text' | 'stream'
signal?: AbortSignal
validateStatus?: (status: number) => boolean
headers?: AxiosRequestConfig['headers']
paramsSerializer?: AxiosRequestConfig['paramsSerializer']
}
/**
* Subset of AxiosResponse
*/
export type ResponseConfig<TData = unknown> = {
data: TData
status: number
statusText: string
headers: AxiosResponse['headers']
}
export type ResponseErrorConfig<TError = unknown> = AxiosError<TError>
export type Client = <TResponseData, _TError = unknown, TRequestData = unknown>(config: RequestConfig<TRequestData>) => Promise<ResponseConfig<TResponseData>>
let _config: Partial<RequestConfig> = {
baseURL: typeof AXIOS_BASE !== 'undefined' ? AXIOS_BASE : undefined,
headers: typeof AXIOS_HEADERS !== 'undefined' ? JSON.parse(AXIOS_HEADERS) : undefined,
}
export const getConfig = () => _config
export const setConfig = (config: RequestConfig) => {
_config = config
return getConfig()
}
export const mergeConfig = <T extends RequestConfig>(...configs: Array<Partial<T>>): Partial<T> => {
return configs.reduce<Partial<T>>((merged, config) => {
return {
...merged,
...config,
headers: {
...merged.headers,
...config.headers,
},
}
}, {})
}
export const axiosInstance = axios.create(getConfig())
export const client = async <TResponseData, TError = unknown, TRequestData = unknown>(
config: RequestConfig<TRequestData>,
): Promise<ResponseConfig<TResponseData>> => {
return axiosInstance.request<TResponseData, ResponseConfig<TResponseData>>(mergeConfig(getConfig(), config)).catch((e: AxiosError<TError>) => {
throw e
})
}
client.getConfig = getConfig
client.setConfig = setConfig
export default client