import { Interceptors } from './middleware/Interceptors'; import { RequestHeaders, ResponseWrapper } from '../../types/request.types'; import { AbstractEndpoint } from '../endpoint/AbstractEndpoint'; import { AbstractClient } from './AbstractClient'; interface ClientPlugin { getClient?: () => void; init?: (client: AbstractClient) => void; transformRequest?: () => void; transformResponse?: (response: ResponseWrapper>) => ResponseWrapper>; } type PluginConstructor = (client: AbstractClient) => ClientPlugin; export interface ClientConfig { baseUrl?: string; headers?: RequestHeaders; parameters?: Record; plugins?: PluginConstructor[]; options?: ClientOptions; interceptors?: { request: Interceptors; response: Interceptors; }; } export interface ClientOptions { timeout?: number; [key: string]: unknown; } export type ClientRequest = (endpoint: E, options: OptionsWithoutBody | OptionsWithBody) => Promise>>; export type EndpointParameters = E['definition']['parameters']; export type EndpointPath = E['definition']['path']; export type EndpointResponse = E['definition']['response']; export type PaginatedEndpointResponse = E['definition']['response'] & { page?: number; size?: number; results?: number; }; export type EndpointBody = E['definition']['body']; export type EndpointResponseProperty = E['responseProperty'] extends string ? E['responseProperty'] : E['property'] extends string ? E['property'] : never; type EndpointResponseBodyWrapper = EndpointResponseProperty; type Page = 'page' | 'size' | 'results'; export type EndpointResponseBody = { [key in EndpointResponseBodyWrapper]: EndpointResponse; } & { [key in Page]?: number; }; export interface OptionsWithBody { body?: EndpointBody; headers?: RequestHeaders; parameters?: EndpointParameters; path?: EndpointPath; timeout?: number; } export type OptionsWithoutBody = Omit, 'body'>; export type Options = OptionsWithBody | OptionsWithoutBody; export {};