UNPKG

@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
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