{"version":3,"sources":["../src/client.ts","../src/executor.ts","../src/index.ts"],"sourcesContent":["import {\n  ApiClient,\n  type ApiClientLoggingOptions,\n  type ApiClientValidationErrorHandler,\n  type ApiRequestSchema,\n  type ApiResponseSchema,\n} from \"@alt-stack/http-client-core\";\nimport { FetchExecutor, type FetchExecutorOptions } from \"./executor.js\";\n\n/**\n * Options for creating a fetch-based API client\n */\nexport interface FetchClientOptions<\n  TRequest extends ApiRequestSchema,\n  TResponse extends ApiResponseSchema,\n> extends ApiClientLoggingOptions {\n  baseUrl: string;\n  headers?: Record<string, unknown>;\n  Request: TRequest;\n  Response: TResponse;\n  /**\n   * Called when Zod validation fails for request or response data.\n   */\n  onValidationError?: ApiClientValidationErrorHandler<Response>;\n  /**\n   * Additional fetch options to pass to every request.\n   * Useful for credentials, cache, mode, etc.\n   */\n  fetchOptions?: FetchExecutorOptions[\"fetchOptions\"];\n}\n\n/**\n * Type alias for the fetch-based API client.\n * The raw response type is the native Response object.\n */\nexport type FetchApiClient<\n  TRequest extends ApiRequestSchema,\n  TResponse extends ApiResponseSchema,\n> = ApiClient<TRequest, TResponse, Response>;\n\n/**\n * Creates a type-safe API client using native fetch.\n *\n * @example\n * ```typescript\n * import { createApiClient } from \"@alt-stack/http-client-fetch\";\n * import { Request, Response } from \"./generated-types.js\";\n *\n * const client = createApiClient({\n *   baseUrl: \"https://api.example.com\",\n *   Request,\n *   Response,\n *   fetchOptions: { credentials: \"include\" },\n * });\n *\n * const result = await client.get(\"/users/{id}\", { params: { id: \"123\" } });\n *\n * if (result.success) {\n *   console.log(result.body);\n *   // Access raw Response if needed\n *   console.log(result.raw.headers.get(\"x-request-id\"));\n * }\n * ```\n */\nexport function createApiClient<\n  TRequest extends ApiRequestSchema,\n  TResponse extends ApiResponseSchema,\n>(options: FetchClientOptions<TRequest, TResponse>): FetchApiClient<TRequest, TResponse> {\n  const executor = new FetchExecutor({ fetchOptions: options.fetchOptions });\n\n  return new ApiClient({\n    baseUrl: options.baseUrl,\n    headers: options.headers,\n    Request: options.Request,\n    Response: options.Response,\n    onValidationError: options.onValidationError,\n    logger: options.logger,\n    executor,\n  });\n}\n","import type { HttpExecutor, ExecuteRequest, ExecuteResponse } from \"@alt-stack/http-client-core\";\nimport { TimeoutError, UnexpectedApiClientError } from \"@alt-stack/http-client-core\";\n\nexport interface FetchExecutorOptions {\n  /**\n   * Additional fetch options to pass to every request.\n   * These are merged with the request-specific options.\n   */\n  fetchOptions?: Omit<RequestInit, \"method\" | \"headers\" | \"body\" | \"signal\">;\n}\n\nasync function parseResponseData(response: Response): Promise<unknown> {\n  const contentLength = response.headers.get(\"content-length\")?.trim();\n  if (contentLength === \"0\") {\n    return null;\n  }\n\n  const contentType = response.headers.get(\"content-type\")?.trim();\n  if (contentType?.includes(\"application/json\")) {\n    try {\n      return await response.json();\n    } catch {\n      return await response.text();\n    }\n  }\n\n  return await response.text();\n}\n\n/**\n * HTTP executor using native fetch API.\n * Exposes the raw Response object for advanced use cases.\n */\nexport class FetchExecutor implements HttpExecutor<Response> {\n  constructor(private readonly options: FetchExecutorOptions = {}) {}\n\n  async execute(request: ExecuteRequest): Promise<ExecuteResponse<Response>> {\n    const controller = new AbortController();\n    let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n    if (request.timeout !== undefined) {\n      timeoutId = setTimeout(() => controller.abort(), request.timeout);\n    }\n\n    try {\n      const fetchOptions: RequestInit = {\n        ...this.options.fetchOptions,\n        method: request.method,\n        headers: request.headers,\n        signal: controller.signal,\n      };\n\n      if (request.body !== undefined) {\n        fetchOptions.body = request.body;\n      }\n\n      const response = await fetch(request.url, fetchOptions);\n      const data = await parseResponseData(response);\n\n      return {\n        status: response.status,\n        statusText: response.statusText,\n        data,\n        raw: response,\n      };\n    } catch (error: unknown) {\n      if (error instanceof Error && error.name === \"AbortError\") {\n        throw new TimeoutError(request.timeout!, request.url, request.method, error);\n      }\n      throw new UnexpectedApiClientError(\n        `Network error: ${error instanceof Error ? error.message : String(error)}`,\n        undefined,\n        request.url,\n        request.method,\n        error,\n      );\n    } finally {\n      if (timeoutId) {\n        clearTimeout(timeoutId);\n      }\n    }\n  }\n}\n","// Client factory\nexport { createApiClient } from \"./client.js\";\nexport { HTTP_CLIENT_DEBUG_NAMESPACE } from \"@alt-stack/http-client-core\";\nexport type { FetchClientOptions, FetchApiClient } from \"./client.js\";\n\n// Executor\nexport { FetchExecutor } from \"./executor.js\";\nexport type { FetchExecutorOptions } from \"./executor.js\";\n\n// Re-export core types and errors\nexport {\n  ApiClient,\n  ApiClientError,\n  UnexpectedApiClientError,\n  ValidationError,\n  TimeoutError,\n} from \"@alt-stack/http-client-core\";\n\nexport type {\n  ApiClientOptions,\n  ApiClientValidationErrorLocation,\n  ApiClientValidationErrorContext,\n  ApiClientValidationErrorHandler,\n  ApiRequestSchema,\n  ApiResponseSchema,\n  LogLevel,\n  LogMeta,\n  LogHandler,\n  Logger,\n  ApiClientLoggingOptions,\n  HttpExecutor,\n  ExecuteRequest,\n  ExecuteResponse,\n  ExtractPathParams,\n  ExtractRequestParams,\n  ExtractRequestQuery,\n  ExtractRequestBody,\n  ParamsRequired,\n  BodyRequired,\n  EndpointsWithMethod,\n  RequestOptions,\n  RetryContext,\n  ExtractStatusCodes,\n  ExtractSuccessCodes,\n  ExtractErrorCodes,\n  ExtractResponseSchema,\n  ExtractSuccessBody,\n  SuccessResponse,\n  ErrorResponse,\n  UnexpectedErrorResponse,\n  ApiResponse,\n} from \"@alt-stack/http-client-core\";\n"],"mappings":";AAAA;AAAA,EACE;AAAA,OAKK;;;ACLP,SAAS,cAAc,gCAAgC;AAUvD,eAAe,kBAAkB,UAAsC;AACrE,QAAM,gBAAgB,SAAS,QAAQ,IAAI,gBAAgB,GAAG,KAAK;AACnE,MAAI,kBAAkB,KAAK;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,SAAS,QAAQ,IAAI,cAAc,GAAG,KAAK;AAC/D,MAAI,aAAa,SAAS,kBAAkB,GAAG;AAC7C,QAAI;AACF,aAAO,MAAM,SAAS,KAAK;AAAA,IAC7B,QAAQ;AACN,aAAO,MAAM,SAAS,KAAK;AAAA,IAC7B;AAAA,EACF;AAEA,SAAO,MAAM,SAAS,KAAK;AAC7B;AAMO,IAAM,gBAAN,MAAsD;AAAA,EAC3D,YAA6B,UAAgC,CAAC,GAAG;AAApC;AAAA,EAAqC;AAAA,EAElE,MAAM,QAAQ,SAA6D;AACzE,UAAM,aAAa,IAAI,gBAAgB;AACvC,QAAI;AAEJ,QAAI,QAAQ,YAAY,QAAW;AACjC,kBAAY,WAAW,MAAM,WAAW,MAAM,GAAG,QAAQ,OAAO;AAAA,IAClE;AAEA,QAAI;AACF,YAAM,eAA4B;AAAA,QAChC,GAAG,KAAK,QAAQ;AAAA,QAChB,QAAQ,QAAQ;AAAA,QAChB,SAAS,QAAQ;AAAA,QACjB,QAAQ,WAAW;AAAA,MACrB;AAEA,UAAI,QAAQ,SAAS,QAAW;AAC9B,qBAAa,OAAO,QAAQ;AAAA,MAC9B;AAEA,YAAM,WAAW,MAAM,MAAM,QAAQ,KAAK,YAAY;AACtD,YAAM,OAAO,MAAM,kBAAkB,QAAQ;AAE7C,aAAO;AAAA,QACL,QAAQ,SAAS;AAAA,QACjB,YAAY,SAAS;AAAA,QACrB;AAAA,QACA,KAAK;AAAA,MACP;AAAA,IACF,SAAS,OAAgB;AACvB,UAAI,iBAAiB,SAAS,MAAM,SAAS,cAAc;AACzD,cAAM,IAAI,aAAa,QAAQ,SAAU,QAAQ,KAAK,QAAQ,QAAQ,KAAK;AAAA,MAC7E;AACA,YAAM,IAAI;AAAA,QACR,kBAAkB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QACxE;AAAA,QACA,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR;AAAA,MACF;AAAA,IACF,UAAE;AACA,UAAI,WAAW;AACb,qBAAa,SAAS;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AACF;;;ADlBO,SAAS,gBAGd,SAAuF;AACvF,QAAM,WAAW,IAAI,cAAc,EAAE,cAAc,QAAQ,aAAa,CAAC;AAEzE,SAAO,IAAI,UAAU;AAAA,IACnB,SAAS,QAAQ;AAAA,IACjB,SAAS,QAAQ;AAAA,IACjB,SAAS,QAAQ;AAAA,IACjB,UAAU,QAAQ;AAAA,IAClB,mBAAmB,QAAQ;AAAA,IAC3B,QAAQ,QAAQ;AAAA,IAChB;AAAA,EACF,CAAC;AACH;;;AE7EA,SAAS,mCAAmC;AAQ5C;AAAA,EACE,aAAAA;AAAA,EACA;AAAA,EACA,4BAAAC;AAAA,EACA;AAAA,EACA,gBAAAC;AAAA,OACK;","names":["ApiClient","UnexpectedApiClientError","TimeoutError"]}