import type { AnyObject } from '../types/misc.js'; import { EndpointsPathsConfig, type IEndpointsPathsConfig } from './config.js'; import type { IEndpointInfo } from './endpoint.types.js'; import type { LogTypes } from './logging.js'; import type { EndpointMethods } from './methods.js'; import type { CallerHooks } from './hooks.js'; /** Request options to be used by call implementation (e.g. interceptor). Passed as separate object argument to the call method. */ export type RequestExtra = { headers?: IEndpointInfo.ExtractHeaders; log?: LogTypes, IEndpointInfo.ExtractOut>; noLoader?: boolean; }; /** axios/fetch compatible interface for data passed as request config */ export interface IRequestRawConfig { method: EndpointMethods; url: string; data: TIn | null | undefined; headers: AnyObject; } export interface IRequestMeta { readonly api: T; readonly pathsConfig: EndpointsPathsConfig; readonly log: LogTypes; readonly noLoader: boolean; readonly extra: TExtra; } /** Compiled request config object passed to `request` implementation */ export interface IRequestConfig, TExtra extends object = Record> extends IRequestRawConfig { /** * Extends raw config with additional details. * */ readonly _meta: IRequestMeta; } export type CallerResponse = { data: TOut; }; export type CallerOptions> = { /** Request implementation */ request: (config: IRequestConfig) => Promise>; /** Endpoints paths config shared with all calls. In case of class instance passed, will be used as is so can be mutated outside. */ config?: IEndpointsPathsConfig | EndpointsPathsConfig; /** Optional hooks for pre- or post-processing request */ hooks?: CallerHooks | CallerHooks[]; }; type CombineInputs = IEndpointInfo.ExtractIn & IEndpointInfo.ExtractPath & IEndpointInfo.ExtractQuery; export type EndpointCallArgs = object extends CombineInputs ? (null | undefined | object) : CombineInputs; type CallerParams = object extends CombineInputs ? [data?: EndpointCallArgs, extra?: RequestExtra & TExtra] : [data: EndpointCallArgs, extra?: RequestExtra & TExtra]; export interface GenericApiCaller> { (api: T, ...[data, extra]: CallerParams): Promise>; readonly config: EndpointsPathsConfig; } export interface ApiCaller> { (...[data, extra]: CallerParams): Promise>; readonly config: EndpointsPathsConfig; } export {};