{"version":3,"sources":["../src/client.ts","../src/executor.ts","../src/index.ts"],"sourcesContent":["import type { KyInstance, Options as KyOptions, KyResponse } from \"ky\";\nimport {\n  ApiClient,\n  type ApiClientLoggingOptions,\n  type ApiClientValidationErrorHandler,\n  type ApiRequestSchema,\n  type ApiResponseSchema,\n} from \"@alt-stack/http-client-core\";\nimport { KyExecutor, type KyExecutorOptions } from \"./executor.js\";\n\n/**\n * Options for creating a ky-based API client\n */\nexport interface KyClientOptions<\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<KyResponse>;\n  /**\n   * Use a custom ky instance.\n   * Useful for pre-configured ky instances with hooks, defaults, etc.\n   */\n  ky?: KyInstance;\n  /**\n   * Additional ky options to pass to every request.\n   * Useful for hooks, retry config, prefixUrl, etc.\n   */\n  kyOptions?: KyExecutorOptions[\"kyOptions\"];\n}\n\n/**\n * Type alias for the ky-based API client.\n * The raw response type is the KyResponse object.\n */\nexport type KyApiClient<\n  TRequest extends ApiRequestSchema,\n  TResponse extends ApiResponseSchema,\n> = ApiClient<TRequest, TResponse, KyResponse>;\n\n/**\n * Creates a type-safe API client using ky.\n *\n * @example\n * ```typescript\n * import { createApiClient } from \"@alt-stack/http-client-ky\";\n * import { Request, Response } from \"./generated-types.js\";\n *\n * const client = createApiClient({\n *   baseUrl: \"https://api.example.com\",\n *   Request,\n *   Response,\n *   kyOptions: {\n *     hooks: {\n *       beforeRequest: [(request) => {\n *         console.log(\"Making request to:\", request.url);\n *       }],\n *     },\n *   },\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 KyResponse 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: KyClientOptions<TRequest, TResponse>): KyApiClient<TRequest, TResponse> {\n  const executor = new KyExecutor({\n    ky: options.ky,\n    kyOptions: options.kyOptions,\n  });\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\n// Re-export ky types for convenience\nexport type { KyInstance, KyOptions, KyResponse };\n","import ky, { type KyInstance, type Options as KyOptions, type KyResponse } from \"ky\";\nimport type { HttpExecutor, ExecuteRequest, ExecuteResponse } from \"@alt-stack/http-client-core\";\nimport { TimeoutError, UnexpectedApiClientError } from \"@alt-stack/http-client-core\";\n\nexport interface KyExecutorOptions {\n  /**\n   * Use a custom ky instance.\n   * Useful for pre-configured ky instances with hooks, defaults, etc.\n   */\n  ky?: KyInstance;\n  /**\n   * Additional ky options to pass to every request.\n   * These are merged with the request-specific options.\n   */\n  kyOptions?: Omit<KyOptions, \"method\" | \"headers\" | \"body\" | \"timeout\" | \"signal\">;\n}\n\n/**\n * HTTP executor using ky library.\n * Exposes the raw KyResponse object for advanced use cases.\n */\nexport class KyExecutor implements HttpExecutor<KyResponse> {\n  private readonly kyInstance: KyInstance;\n  private readonly kyOptions: KyExecutorOptions[\"kyOptions\"];\n\n  constructor(options: KyExecutorOptions = {}) {\n    this.kyInstance = options.ky ?? ky;\n    this.kyOptions = options.kyOptions;\n  }\n\n  async execute(request: ExecuteRequest): Promise<ExecuteResponse<KyResponse>> {\n    try {\n      const response = await this.kyInstance(request.url, {\n        ...this.kyOptions,\n        method: request.method,\n        headers: request.headers,\n        body: request.body,\n        timeout: request.timeout === undefined ? false : request.timeout,\n        throwHttpErrors: false, // Handle errors ourselves\n      });\n\n      let data: unknown;\n      const contentType = response.headers.get(\"content-type\");\n      if (contentType?.includes(\"application/json\")) {\n        try {\n          data = await response.json();\n        } catch {\n          data = await response.text();\n        }\n      } else {\n        data = await response.text();\n      }\n\n      return {\n        status: response.status,\n        statusText: response.statusText,\n        data,\n        raw: response,\n      };\n    } catch (error: unknown) {\n      // Handle ky timeout errors\n      if (error instanceof Error && error.name === \"TimeoutError\") {\n        throw new TimeoutError(request.timeout ?? 0, request.url, request.method, error);\n      }\n      // Handle abort errors (manual timeout via AbortController)\n      if (error instanceof Error && error.name === \"AbortError\") {\n        throw new TimeoutError(request.timeout ?? 0, 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    }\n  }\n}\n\n","// Client factory\nexport { createApiClient } from \"./client.js\";\nexport { HTTP_CLIENT_DEBUG_NAMESPACE } from \"@alt-stack/http-client-core\";\nexport type { KyClientOptions, KyApiClient, KyInstance, KyOptions, KyResponse } from \"./client.js\";\n\n// Executor\nexport { KyExecutor } from \"./executor.js\";\nexport type { KyExecutorOptions } 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":";AACA;AAAA,EACE;AAAA,OAKK;;;ACPP,OAAO,QAAyE;AAEhF,SAAS,cAAc,gCAAgC;AAmBhD,IAAM,aAAN,MAAqD;AAAA,EACzC;AAAA,EACA;AAAA,EAEjB,YAAY,UAA6B,CAAC,GAAG;AAC3C,SAAK,aAAa,QAAQ,MAAM;AAChC,SAAK,YAAY,QAAQ;AAAA,EAC3B;AAAA,EAEA,MAAM,QAAQ,SAA+D;AAC3E,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,WAAW,QAAQ,KAAK;AAAA,QAClD,GAAG,KAAK;AAAA,QACR,QAAQ,QAAQ;AAAA,QAChB,SAAS,QAAQ;AAAA,QACjB,MAAM,QAAQ;AAAA,QACd,SAAS,QAAQ,YAAY,SAAY,QAAQ,QAAQ;AAAA,QACzD,iBAAiB;AAAA;AAAA,MACnB,CAAC;AAED,UAAI;AACJ,YAAM,cAAc,SAAS,QAAQ,IAAI,cAAc;AACvD,UAAI,aAAa,SAAS,kBAAkB,GAAG;AAC7C,YAAI;AACF,iBAAO,MAAM,SAAS,KAAK;AAAA,QAC7B,QAAQ;AACN,iBAAO,MAAM,SAAS,KAAK;AAAA,QAC7B;AAAA,MACF,OAAO;AACL,eAAO,MAAM,SAAS,KAAK;AAAA,MAC7B;AAEA,aAAO;AAAA,QACL,QAAQ,SAAS;AAAA,QACjB,YAAY,SAAS;AAAA,QACrB;AAAA,QACA,KAAK;AAAA,MACP;AAAA,IACF,SAAS,OAAgB;AAEvB,UAAI,iBAAiB,SAAS,MAAM,SAAS,gBAAgB;AAC3D,cAAM,IAAI,aAAa,QAAQ,WAAW,GAAG,QAAQ,KAAK,QAAQ,QAAQ,KAAK;AAAA,MACjF;AAEA,UAAI,iBAAiB,SAAS,MAAM,SAAS,cAAc;AACzD,cAAM,IAAI,aAAa,QAAQ,WAAW,GAAG,QAAQ,KAAK,QAAQ,QAAQ,KAAK;AAAA,MACjF;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;AAAA,EACF;AACF;;;ADDO,SAAS,gBAGd,SAAiF;AACjF,QAAM,WAAW,IAAI,WAAW;AAAA,IAC9B,IAAI,QAAQ;AAAA,IACZ,WAAW,QAAQ;AAAA,EACrB,CAAC;AAED,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;;;AE5FA,SAAS,mCAAmC;AAQ5C;AAAA,EACE,aAAAA;AAAA,EACA;AAAA,EACA,4BAAAC;AAAA,EACA;AAAA,EACA,gBAAAC;AAAA,OACK;","names":["ApiClient","UnexpectedApiClientError","TimeoutError"]}