import type { IResp } from "../../types/api.d.mts"; /** * Неизвестный ответ от REST по-умолчанию */ type TDefaultResp = Record; /** * Функция-адаптер для преобразования ответа сервера. * @template TResponse Тип исходного ответа. * @template TResult Тип результата после адаптации. */ export type TAdapterFn, TResult = TResponse> = (resp: TResponse) => TResult; /** * Тип промиса API-запроса с поддержкой цепочки валидации. * @template TResult Тип результата API-запроса. */ export type TApiClientRequest = Promise & { validate: (schema: TValidationSchema, options?: Record) => Promise; }; /** * Параметры инициализации API-клиента. */ export type TArgs = Partial<{ url: string; getAdapterFn: TAdapterFn; }>; /** * Асинхронная функция-адаптер для преобразования ответа сервера. * @template TResponse Тип исходного ответа. * @template TResult Тип результата после адаптации. */ export type TAsyncAdapterFn, TResult = TResponse> = (resp: TResponse) => PromiseLike; /** * Универсальный асинхронный адаптер для извлечения `data` из `IResp`. */ export type TAsyncRespAdapterFn = (resp: IResp) => PromiseLike; /** * Допустимые значения заголовка `Content-Type` для API-запросов. */ export type TContentType = "application/json" | "application/octet-stream" | "text/plain" | "text/xml" | "text/html" | "multipart/form-data"; /** * Допустимые HTTP-методы запроса. */ export type TMethod = "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | "OPTIONS" | "TRACE" | "HEAD"; /** * Синхронный или асинхронный адаптер ответа сервера. * @template TResponse Тип исходного ответа. * @template TResult Тип результата после адаптации. */ export type TRequestAdapterFn, TResult = TResponse> = TAdapterFn | TAsyncAdapterFn; /** * Параметры HTTP-запроса API-клиента. * @template TResponse Тип исходного ответа. * @template TResult Тип результата после адаптации. */ export type TRequestProps, TResult = TResponse> = { signal?: AbortSignal; endpoint: string; data?: unknown; method?: TMethod; contentType?: TContentType; responseType?: TResponseType; getAdapterFn?: TRequestAdapterFn; credentials?: RequestCredentials; headers?: Record; timeout?: number; }; /** * Универсальный адаптер для извлечения `data` из `IResp`. */ export type TRespAdapterFn = (resp: IResp) => TData; /** * Тип ожидаемого тела ответа. */ export type TResponseType = "text" | "blob" | "arrayBuffer" | "json"; /** * Базовый контракт yup-схемы для валидации ответа. * @template TValue Тип входного значения для валидации. * @template TResult Тип результата после валидации. */ export type TValidationSchema = { validate?: (value: TValue, options?: Record) => Promise | TResult; validateSync?: (value: TValue, options?: Record) => TResult; }; /** * Клиент для работы с API. Singleton. * @example * const Api = new ApiClient({ * url: process.env.API_URL, * ver: "api/v1" * }); * await Api.post({ * endpoint: "myEndpoint/", * data: new FormData() * }).then(data => data); */ export declare class ApiClient { #private; /** * Singleton-экземпляр API-клиента. */ static instance: ApiClient | null; /** * Конфигурация API-клиента по умолчанию. * Используется как fallback для `url` и `getAdapterFn`. */ static defaults: Required; /** * Имена всплывающих событий результата API-запросов. */ static events: { success: string; error: string; }; private getAdapterFn; /** * Сохраняет точные входной и выходной типы синхронного или асинхронного адаптера. * @template TResponse Тип исходного ответа. * @template TResult Тип результата после адаптации. * @param adapter Адаптер ответа. * @returns Переданный адаптер с сохраненными типами. */ static defineAdapter: (adapter: TAdapterFn) => TAdapterFn; constructor(props: TArgs); /** * Получает базовый URL API * @returns {String} базовый URL */ get url(): string; /** * Устанавливает базовый URL API * @param url{String} новый базовый URL */ set url(url: string); /** * Формирует полный URL endpoint из базового URL и относительного пути * @param baseUrl{String} базовый URL * @param endpoint{String} относительный путь endpoint * @returns {String} полный URL endpoint */ static getEndpoint(baseUrl: string, endpoint: string): string; /** * Отправляет GET запрос на endpoint * @template TResponse - тип ответа сервера * @template TResult - тип результата после адаптера * @param params{Object} параметры запроса * @param params.endpoint{String} адрес endpoint * @param params.data{Object=} данные запроса * @param params.signal{AbortSignal=} сигнал для отмены запроса * @param params.responseType{String=} тип ожидаемого ответа (text, blob, arrayBuffer, json) * @param params.getAdapterFn{Function=} функция-адаптер для преобразования ответа * @param params.credentials{String=} режим передачи credentials * @param params.headers{Object=} дополнительные заголовки * @param params.timeout{Number=} таймаут запроса в миллисекундах * @returns {Promise} промис с результатом запроса */ get({ endpoint, data, ...props }: TRequestProps): TApiClientRequest; /** * Отправляет POST запрос на endpoint * @template TResponse - тип ответа сервера * @template TResult - тип результата после адаптера * @param params{Object} параметры запроса * @param params.endpoint{String} адрес endpoint * @param params.data{Object=} данные запроса * @param params.signal{AbortSignal=} сигнал для отмены запроса * @param params.contentType{String=} тип контента запроса * @param params.responseType{String=} тип ожидаемого ответа (text, blob, arrayBuffer, json) * @param params.getAdapterFn{Function=} функция-адаптер для преобразования ответа * @param params.credentials{String=} режим передачи credentials * @param params.headers{Object=} дополнительные заголовки * @param params.timeout{Number=} таймаут запроса в миллисекундах * @returns {Promise} промис с результатом запроса */ post({ endpoint, data, ...props }: TRequestProps): TApiClientRequest; } export {};