import { ApiClient, type ApiClientLoggingOptions, type ApiClientValidationErrorHandler, type ApiRequestSchema, type ApiResponseSchema, } from "@alt-stack/http-client-core"; import { FetchExecutor, type FetchExecutorOptions } from "./executor.js"; /** * Options for creating a fetch-based API client */ export interface FetchClientOptions< TRequest extends ApiRequestSchema, TResponse extends ApiResponseSchema, > extends ApiClientLoggingOptions { baseUrl: string; headers?: Record; Request: TRequest; Response: TResponse; /** * Called when Zod validation fails for request or response data. */ onValidationError?: ApiClientValidationErrorHandler; /** * Additional fetch options to pass to every request. * Useful for credentials, cache, mode, etc. */ fetchOptions?: FetchExecutorOptions["fetchOptions"]; } /** * Type alias for the fetch-based API client. * The raw response type is the native Response object. */ export type FetchApiClient< TRequest extends ApiRequestSchema, TResponse extends ApiResponseSchema, > = ApiClient; /** * Creates a type-safe API client using native fetch. * * @example * ```typescript * import { createApiClient } from "@alt-stack/http-client-fetch"; * import { Request, Response } from "./generated-types.js"; * * const client = createApiClient({ * baseUrl: "https://api.example.com", * Request, * Response, * fetchOptions: { credentials: "include" }, * }); * * const result = await client.get("/users/{id}", { params: { id: "123" } }); * * if (result.success) { * console.log(result.body); * // Access raw Response if needed * console.log(result.raw.headers.get("x-request-id")); * } * ``` */ export function createApiClient< TRequest extends ApiRequestSchema, TResponse extends ApiResponseSchema, >(options: FetchClientOptions): FetchApiClient { const executor = new FetchExecutor({ fetchOptions: options.fetchOptions }); return new ApiClient({ baseUrl: options.baseUrl, headers: options.headers, Request: options.Request, Response: options.Response, onValidationError: options.onValidationError, logger: options.logger, executor, }); }