import {mapValues} from "@lodestar/utils"; import {Endpoint, HasOnlyOptionalProps, RouteDefinition, RouteDefinitions} from "../types.js"; import {compileRouteUrlFormatter} from "../urlFormat.js"; import {IHttpClient} from "./httpClient.js"; import {ApiRequestInit} from "./request.js"; import {ApiResponse} from "./response.js"; export type ApiClientMethod = E["args"] extends void ? (init?: ApiRequestInit) => Promise> : HasOnlyOptionalProps extends true ? (args?: E["args"], init?: ApiRequestInit) => Promise> : (args: E["args"], init?: ApiRequestInit) => Promise>; export type ApiClientMethods> = {[K in keyof Es]: ApiClientMethod}; export function createApiClientMethod( definition: RouteDefinition, client: IHttpClient, operationId: string ): ApiClientMethod { const urlFormatter = compileRouteUrlFormatter(definition.url); const definitionExtended = { ...definition, urlFormatter, operationId, }; // If the request args is void, then completely remove the args parameter if ( definition.req.schema.body === undefined && definition.req.schema.params === undefined && definition.req.schema.query === undefined ) { return (async (init?: ApiRequestInit) => { return client.request(definitionExtended, undefined, init); }) as ApiClientMethod; } return async (args?: E["args"], init?: ApiRequestInit) => { return client.request(definitionExtended, args ?? {}, init); }; } export function createApiClientMethods>( definitions: RouteDefinitions, client: IHttpClient ): ApiClientMethods { return mapValues(definitions, (definition, operationId) => { return createApiClientMethod(definition, client, operationId as string); }) as unknown as ApiClientMethods; }