import { AdapterI } from '@foscia/core'; import { Awaitable, Dictionary, Transformer } from '@foscia/shared'; /** * The HTTP method to use in request. */ export type HttpMethod = 'get' | 'GET' | 'delete' | 'DELETE' | 'head' | 'HEAD' | 'options' | 'OPTIONS' | 'post' | 'POST' | 'put' | 'PUT' | 'patch' | 'PATCH' | 'purge' | 'PURGE' | 'link' | 'LINK' | 'unlink' | 'UNLINK'; /** * Keys which are simply inherited from request init. */ export type HttpRequestInitPickKey = 'cache' | 'credentials' | 'integrity' | 'keepalive' | 'mode' | 'redirect' | 'referrer' | 'referrerPolicy' | 'signal' | 'window'; /** * Context value representing a HTTP request config. */ export type HttpRequestConfig = { request?: Request; method?: HttpMethod; baseURL?: string; path?: string; params?: Dictionary | string; headers?: Dictionary; body?: unknown; bodyAs?: BodyAsTransformer; modelPaths?: boolean; responseReader?: HttpResponseReader; requestTransformers?: RequestTransformer[]; responseTransformers?: ResponseTransformer[]; errorTransformers?: ErrorTransformer[]; } & Pick; /** * Context containing a HTTP request config. */ export type ConsumeHttpRequestConfig = { httpRequestConfig: HttpRequestConfig; }; /** * Prepared context for URL building. */ export type HttpURLContext = { baseURL: string; modelPath?: string; idPath?: string; relationPath?: string; additionalPath?: string; }; /** * Read the response's content to a deserializable data. */ export type HttpResponseReader = (response: Response) => Promise; /** * The configuration for the HTTP adapter implementation. */ export type HttpAdapterConfig = { fetch?: typeof fetch; baseURL?: string | null; buildURL?: (urlContext: HttpURLContext, context: {}) => string; serializeParams: HttpParamsSerializer; defaultHeaders?: Dictionary; defaultBodyAs?: BodyAsTransformer | null; defaultResponseReader?: HttpResponseReader; appendParams?: (context: {}) => Awaitable>; appendHeaders?: (context: {}) => Awaitable>; modelPathTransformer?: Transformer; idPathTransformer?: Transformer; relationPathTransformer?: Transformer; requestTransformers?: RequestTransformer[]; responseTransformers?: ResponseTransformer[]; errorTransformers?: ErrorTransformer[]; }; export interface HttpAdapter extends AdapterI { } export type HttpParamsSerializer = (params: Dictionary) => string | undefined; export type RequestTransformer = (request: Request) => Awaitable; export type ResponseTransformer = (response: Response) => Awaitable; export type ErrorTransformer = (error: unknown) => Awaitable; export type BodyAsTransformer = (body: unknown, headers: Dictionary) => Awaitable;