{"version":3,"sources":["../src/client.ts","../src/errors.ts","../src/logging.ts"],"sourcesContent":["import { z } from \"zod\";\nimport type {\n  ApiResponse,\n  ApiRequestSchema,\n  ApiResponseSchema,\n  ApiClientLoggingOptions,\n  RequestOptions,\n  ExtractRequestBody,\n  SuccessResponse,\n  ErrorResponse,\n  UnexpectedErrorResponse,\n  EndpointsWithMethod,\n  RetryContext,\n  HttpExecutor,\n  ExecuteResponse,\n} from \"./types.js\";\nimport { UnexpectedApiClientError, ValidationError } from \"./errors.js\";\nimport { createInternalLogger } from \"./logging.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ApiClientOptions<\n  TRequest extends ApiRequestSchema,\n  TResponse extends ApiResponseSchema,\n  TRawResponse = unknown,\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   * This is only invoked for schema parse failures (i.e. when Zod would throw),\n   * not for other validation errors like missing path params.\n   */\n  onValidationError?: ApiClientValidationErrorHandler<TRawResponse>;\n  executor: HttpExecutor<TRawResponse>;\n}\n\nexport type ApiClientValidationErrorLocation = \"params\" | \"query\" | \"body\" | \"response\";\n\nexport type ApiClientValidationErrorContext<TRawResponse = unknown> = {\n  kind: \"request\" | \"response\";\n  location: ApiClientValidationErrorLocation;\n  endpoint: string;\n  method: string;\n  /** Human-readable context string (also used as the thrown ValidationError message). */\n  message: string;\n  /** The data that failed validation. */\n  data: unknown;\n  /** Zod issues produced by the schema. */\n  issues: z.ZodIssue[];\n  /** The underlying ZodError object. */\n  zodError: z.ZodError;\n  /** Response-only context. */\n  status?: number;\n  statusCode?: string;\n  statusText?: string;\n  raw?: TRawResponse;\n};\n\nexport type ApiClientValidationErrorHandler<TRawResponse = unknown> = (\n  context: ApiClientValidationErrorContext<TRawResponse>,\n) => void;\n\ntype ValidationContext<TRawResponse> = Omit<\n  ApiClientValidationErrorContext<TRawResponse>,\n  \"data\" | \"issues\" | \"zodError\" | \"message\"\n>;\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Interpolates path parameters into endpoint string\n */\nfunction interpolatePath(endpoint: string, params: Record<string, unknown>): string {\n  let result = endpoint;\n  for (const [key, value] of Object.entries(params)) {\n    result = result.replace(`{${key}}`, String(value));\n  }\n  return result;\n}\n\n/**\n * Builds query string from query object\n */\nfunction buildQueryString(query: Record<string, unknown>): string {\n  const params = new URLSearchParams();\n  for (const [key, value] of Object.entries(query)) {\n    if (value !== undefined && value !== null) {\n      params.append(key, String(value));\n    }\n  }\n  const queryString = params.toString();\n  return queryString ? `?${queryString}` : \"\";\n}\n\n/**\n * Sleep for specified milliseconds\n */\nfunction sleep(ms: number): Promise<void> {\n  return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Calculates exponential backoff delay\n */\nfunction calculateBackoff(attempt: number, baseDelay: number = 1000): number {\n  return Math.min(baseDelay * Math.pow(2, attempt), 30000); // Max 30 seconds\n}\n\nfunction formatLogError(error: unknown): Record<string, unknown> {\n  if (error instanceof Error) {\n    return { name: error.name, message: error.message };\n  }\n  return { error };\n}\n\nfunction buildHeaders(\n  clientHeaders: Record<string, unknown> | undefined,\n  requestHeaders: Record<string, unknown>,\n): Record<string, string> {\n  const headers: Record<string, string> = {\n    \"Content-Type\": \"application/json\",\n  };\n\n  for (const headerSet of [clientHeaders, requestHeaders]) {\n    if (!headerSet) continue;\n\n    for (const [key, value] of Object.entries(headerSet)) {\n      if (value !== undefined && value !== null) {\n        headers[key] = String(value);\n      }\n    }\n  }\n\n  return headers;\n}\n\n// ============================================================================\n// ApiClient Class\n// ============================================================================\n\nexport class ApiClient<\n  TRequest extends ApiRequestSchema,\n  TResponse extends ApiResponseSchema,\n  TRawResponse = unknown,\n> {\n  private readonly internalLog: ReturnType<typeof createInternalLogger>;\n\n  constructor(public readonly options: ApiClientOptions<TRequest, TResponse, TRawResponse>) {\n    this.internalLog = createInternalLogger(options);\n  }\n\n  private log(\n    level: \"error\" | \"warn\" | \"info\" | \"debug\",\n    message: string,\n    meta?: Record<string, unknown>,\n  ): void {\n    this.internalLog(level, message, meta);\n  }\n\n  private safeInvokeOnValidationError(\n    context: ApiClientValidationErrorContext<TRawResponse>,\n  ): void {\n    if (!this.options.onValidationError) return;\n    try {\n      this.options.onValidationError(context);\n    } catch {\n      // Never allow a user-provided callback to affect control-flow, retries, etc.\n    }\n  }\n\n  private validateSchema<TSchema extends z.ZodTypeAny>(\n    schema: TSchema,\n    data: unknown,\n    message: string,\n    context: ValidationContext<TRawResponse>,\n  ): z.output<TSchema> {\n    const parsed = schema.safeParse(data);\n    if (parsed.success) return parsed.data;\n\n    return this.throwValidationError(parsed.error, data, message, context);\n  }\n\n  private throwValidationError(\n    error: z.ZodError,\n    data: unknown,\n    message: string,\n    context: ValidationContext<TRawResponse>,\n  ): never {\n    this.safeInvokeOnValidationError({\n      ...context,\n      message,\n      data,\n      issues: error.issues,\n      zodError: error,\n    });\n\n    this.log(\"error\", \"HTTP validation failed\", {\n      kind: context.kind,\n      location: context.location,\n      endpoint: context.endpoint,\n      method: context.method,\n      status: context.status,\n      statusText: context.statusText,\n      message,\n    });\n\n    throw new ValidationError(message, error.issues, context.endpoint, context.method);\n  }\n\n  private validateAndEncodeSchema<TSchema extends z.ZodTypeAny>(\n    schema: TSchema,\n    data: unknown,\n    message: string,\n    context: ValidationContext<TRawResponse>,\n  ): z.input<TSchema> {\n    const parsed = this.validateSchema(schema, data, message, context);\n    try {\n      return z.encode(schema, parsed);\n    } catch (error: unknown) {\n      if (error instanceof z.ZodError) {\n        return this.throwValidationError(error, data, message, context);\n      }\n      throw error;\n    }\n  }\n\n  /**\n   * Makes a GET request\n   */\n  async get<TEndpoint extends EndpointsWithMethod<TRequest, \"GET\">>(\n    endpoint: TEndpoint,\n    options: RequestOptions<TRequest, TEndpoint, \"GET\">,\n  ): Promise<ApiResponse<TResponse, TEndpoint, \"GET\", TRawResponse>> {\n    return this.request(\"GET\", endpoint, options);\n  }\n\n  /**\n   * Makes a POST request\n   */\n  async post<TEndpoint extends EndpointsWithMethod<TRequest, \"POST\">>(\n    endpoint: TEndpoint,\n    options: RequestOptions<TRequest, TEndpoint, \"POST\"> & {\n      body: ExtractRequestBody<TRequest, TEndpoint, \"POST\">;\n    },\n  ): Promise<ApiResponse<TResponse, TEndpoint, \"POST\", TRawResponse>> {\n    return this.request(\"POST\", endpoint, options);\n  }\n\n  /**\n   * Makes a PUT request\n   */\n  async put<TEndpoint extends EndpointsWithMethod<TRequest, \"PUT\">>(\n    endpoint: TEndpoint,\n    options: RequestOptions<TRequest, TEndpoint, \"PUT\"> & {\n      body: ExtractRequestBody<TRequest, TEndpoint, \"PUT\">;\n    },\n  ): Promise<ApiResponse<TResponse, TEndpoint, \"PUT\", TRawResponse>> {\n    return this.request(\"PUT\", endpoint, options);\n  }\n\n  /**\n   * Makes a PATCH request\n   */\n  async patch<TEndpoint extends EndpointsWithMethod<TRequest, \"PATCH\">>(\n    endpoint: TEndpoint,\n    options: RequestOptions<TRequest, TEndpoint, \"PATCH\"> & {\n      body: ExtractRequestBody<TRequest, TEndpoint, \"PATCH\">;\n    },\n  ): Promise<ApiResponse<TResponse, TEndpoint, \"PATCH\", TRawResponse>> {\n    return this.request(\"PATCH\", endpoint, options);\n  }\n\n  /**\n   * Makes a DELETE request\n   */\n  async delete<TEndpoint extends EndpointsWithMethod<TRequest, \"DELETE\">>(\n    endpoint: TEndpoint,\n    options: RequestOptions<TRequest, TEndpoint, \"DELETE\">,\n  ): Promise<ApiResponse<TResponse, TEndpoint, \"DELETE\", TRawResponse>> {\n    return this.request(\"DELETE\", endpoint, options);\n  }\n\n  /**\n   * Internal request method\n   */\n  private async request<\n    TEndpoint extends keyof TRequest & string,\n    TMethod extends keyof TRequest[TEndpoint] & string,\n  >(\n    method: TMethod,\n    endpoint: TEndpoint,\n    options: RequestOptions<TRequest, TEndpoint, TMethod> & {\n      body?: ExtractRequestBody<TRequest, TEndpoint, TMethod>;\n    },\n  ): Promise<ApiResponse<TResponse, TEndpoint, TMethod, TRawResponse>> {\n    const {\n      params = {},\n      query = {},\n      body,\n      timeout,\n      retries = 0,\n      headers: requestHeaders = {},\n      shouldRetry,\n    } = options;\n\n    // Validate and interpolate path\n    const wirePathParams = this.validatePathParams(endpoint, params, method);\n    const interpolatedPath = interpolatePath(endpoint, wirePathParams);\n\n    // Validate query if schema exists\n    const wireQuery = this.validateQuery(endpoint, method, query);\n\n    // Validate body if schema exists\n    const wireBody = body === undefined ? undefined : this.validateBody(endpoint, method, body);\n\n    // Build URL\n    const queryString = buildQueryString(wireQuery);\n    const url = `${this.options.baseUrl}${interpolatedPath}${queryString}`;\n\n    // Merge headers\n    const headers = buildHeaders(this.options.headers, requestHeaders);\n\n    // Make request with retry logic\n    let lastError: unknown;\n    let lastResult: ExecuteResponse<TRawResponse> | undefined;\n    let attempt = 0;\n\n    while (attempt <= retries) {\n      try {\n        const result = await this.options.executor.execute({\n          method,\n          url,\n          headers,\n          body: wireBody !== undefined && (method === \"POST\" || method === \"PUT\" || method === \"PATCH\")\n            ? JSON.stringify(wireBody)\n            : undefined,\n          timeout,\n        });\n\n        // Check custom shouldRetry for response-based retry (e.g., 5xx errors)\n        if (shouldRetry && attempt < retries) {\n          const retryContext: RetryContext = {\n            attempt,\n            response: { status: result.status, statusText: result.statusText, data: result.data },\n          };\n          if (shouldRetry(retryContext)) {\n            this.log(\"warn\", \"HTTP retry requested (response)\", {\n              method,\n              endpoint,\n              status: result.status,\n              statusText: result.statusText,\n              attempt,\n              retries,\n            });\n            lastResult = result;\n            const delay = calculateBackoff(attempt);\n            await sleep(delay);\n            attempt++;\n            continue;\n          }\n        }\n\n        return this.handleResponse(result, endpoint, method) as ApiResponse<\n          TResponse,\n          TEndpoint,\n          TMethod,\n          TRawResponse\n        >;\n      } catch (error: unknown) {\n        lastError = error;\n\n        // Don't retry on validation errors\n        if (error instanceof ValidationError) {\n          throw error;\n        }\n\n        // Check custom shouldRetry or fall back to default behavior\n        if (attempt < retries) {\n          const retryContext: RetryContext = { attempt, error };\n\n          if (shouldRetry) {\n            if (shouldRetry(retryContext)) {\n              this.log(\"warn\", \"HTTP retry requested (error)\", {\n                method,\n                endpoint,\n                attempt,\n                retries,\n                ...formatLogError(error),\n              });\n              const delay = calculateBackoff(attempt);\n              await sleep(delay);\n              attempt++;\n              continue;\n            }\n            // Custom shouldRetry returned false, stop retrying\n            break;\n          }\n\n          // Default behavior: don't retry on 4xx client errors\n          if (\n            error instanceof UnexpectedApiClientError &&\n            error.code !== undefined &&\n            error.code >= 400 &&\n            error.code < 500\n          ) {\n            this.log(\"error\", \"HTTP request failed with non-retriable status\", {\n              method,\n              endpoint,\n              status: error.code,\n              ...formatLogError(error),\n            });\n            throw error;\n          }\n\n          // Default: retry on network errors\n          this.log(\"warn\", \"HTTP retrying after error\", {\n            method,\n            endpoint,\n            attempt,\n            retries,\n            ...formatLogError(error),\n          });\n          const delay = calculateBackoff(attempt);\n          await sleep(delay);\n          attempt++;\n        } else {\n          break;\n        }\n      }\n    }\n\n    // If we have a last result (from response-based retry), return it\n    if (lastResult) {\n      return this.handleResponse(lastResult, endpoint, method) as ApiResponse<\n        TResponse,\n        TEndpoint,\n        TMethod,\n        TRawResponse\n      >;\n    }\n\n    // If we get here, all retries failed\n    this.log(\"error\", \"HTTP request failed after retries\", {\n      method,\n      endpoint,\n      attempts: attempt,\n      retries,\n      ...formatLogError(lastError),\n    });\n    if (lastError instanceof Error) {\n      throw lastError;\n    }\n    throw new UnexpectedApiClientError(\n      \"Request failed after retries\",\n      undefined,\n      endpoint,\n      method,\n      lastError,\n    );\n  }\n\n  /**\n   * Validates path parameters against Request schema\n   */\n  private validatePathParams<\n    TEndpoint extends keyof TRequest & string,\n    TMethod extends keyof TRequest[TEndpoint] & string,\n  >(\n    endpoint: TEndpoint,\n    params: Record<string, unknown>,\n    method: TMethod,\n  ): Record<string, unknown> {\n    const requestDef = this.options.Request[endpoint]?.[method];\n    if (!requestDef || typeof requestDef !== \"object\") {\n      // No schema, but check if path has params\n      const requiredParams = this.getPathParamNames(endpoint);\n      if (requiredParams.length > 0 && Object.keys(params).length === 0) {\n        this.log(\"error\", \"HTTP request validation failed\", {\n          method,\n          endpoint,\n          missing: requiredParams,\n        });\n        throw new ValidationError(\n          `Missing required path parameters: ${requiredParams.join(\", \")}`,\n          { missing: requiredParams },\n          endpoint,\n          method,\n        );\n      }\n      return params;\n    }\n\n    const paramsSchema = (requestDef as { params?: z.ZodTypeAny }).params;\n    if (paramsSchema) {\n      return this.validateAndEncodeSchema(\n        paramsSchema,\n        params,\n        \"Path parameters validation failed\",\n        {\n          kind: \"request\",\n          location: \"params\",\n          endpoint,\n          method,\n        },\n      ) as Record<string, unknown>;\n    }\n\n    // Check if endpoint requires params but none provided\n    const requiredParams = this.getPathParamNames(endpoint);\n    if (requiredParams.length > 0 && Object.keys(params).length === 0) {\n      this.log(\"error\", \"HTTP request validation failed\", {\n        method,\n        endpoint,\n        missing: requiredParams,\n      });\n      throw new ValidationError(\n        `Missing required path parameters: ${requiredParams.join(\", \")}`,\n        { missing: requiredParams },\n        endpoint,\n        method,\n      );\n    }\n\n    return params;\n  }\n\n  /**\n   * Validates query parameters against Request schema\n   */\n  private validateQuery<\n    TEndpoint extends keyof TRequest & string,\n    TMethod extends keyof TRequest[TEndpoint] & string,\n  >(\n    endpoint: TEndpoint,\n    method: TMethod,\n    query: Record<string, unknown>,\n  ): Record<string, unknown> {\n    const requestDef = this.options.Request[endpoint]?.[method];\n    if (!requestDef || typeof requestDef !== \"object\") {\n      return query;\n    }\n\n    const querySchema = (requestDef as { query?: z.ZodTypeAny }).query;\n    if (querySchema) {\n      return this.validateAndEncodeSchema(\n        querySchema,\n        query,\n        \"Query parameters validation failed\",\n        {\n          kind: \"request\",\n          location: \"query\",\n          endpoint,\n          method,\n        },\n      ) as Record<string, unknown>;\n    }\n\n    return query;\n  }\n\n  /**\n   * Validates body against Request schema\n   */\n  private validateBody<\n    TEndpoint extends keyof TRequest & string,\n    TMethod extends keyof TRequest[TEndpoint] & string,\n  >(endpoint: TEndpoint, method: TMethod, body: unknown): unknown {\n    const requestDef = this.options.Request[endpoint]?.[method];\n    if (!requestDef || typeof requestDef !== \"object\") {\n      return body;\n    }\n\n    const bodySchema = (requestDef as { body?: z.ZodTypeAny }).body;\n    if (bodySchema) {\n      return this.validateAndEncodeSchema(bodySchema, body, \"Request body validation failed\", {\n        kind: \"request\",\n        location: \"body\",\n        endpoint,\n        method,\n      });\n    }\n\n    return body;\n  }\n\n  /**\n   * Gets path parameter names from endpoint string\n   */\n  private getPathParamNames(endpoint: string): string[] {\n    const matches = endpoint.matchAll(/\\{([^}]+)\\}/g);\n    return Array.from(matches, (m) => m[1]).filter((name): name is string => name !== undefined);\n  }\n\n  /**\n   * Handles the response and returns discriminated union\n   */\n  private handleResponse(\n    result: ExecuteResponse<TRawResponse>,\n    endpoint: string,\n    method: string,\n  ):\n    | SuccessResponse<unknown, string, TRawResponse>\n    | ErrorResponse<unknown, string, TRawResponse>\n    | UnexpectedErrorResponse<TRawResponse> {\n    const { status, statusText, data, raw } = result;\n    const statusCode = String(status);\n\n    // Get schema from Response for this status code\n    const responseSchema =\n      endpoint in this.options.Response\n        ? this.options.Response[endpoint]?.[method]?.[statusCode]\n        : undefined;\n\n    if (!responseSchema) {\n      // No schema defined for this status code\n      if (statusCode.startsWith(\"2\")) {\n        return {\n          success: true,\n          body: data,\n          code: statusCode,\n          raw,\n        } as SuccessResponse<unknown, string, TRawResponse>;\n      }\n      this.log(\"error\", \"HTTP error response\", {\n        method,\n        endpoint,\n        status,\n        statusText,\n      });\n      return {\n        success: false,\n        error: new UnexpectedApiClientError(\n          `Unexpected error response: ${statusText}`,\n          status,\n          endpoint,\n          method,\n          data,\n        ),\n        code: status,\n        raw,\n      } as UnexpectedErrorResponse<TRawResponse>;\n    }\n\n    // Validate against schema\n    try {\n      const validated = this.validateSchema(\n        responseSchema,\n        data,\n        `Response validation failed for ${statusCode}`,\n        {\n          kind: \"response\",\n          location: \"response\",\n          endpoint,\n          method,\n          status,\n          statusCode,\n          statusText,\n          raw,\n        },\n      );\n\n      if (statusCode.startsWith(\"2\")) {\n        return {\n          success: true,\n          body: validated,\n          code: statusCode,\n          raw,\n        } as SuccessResponse<unknown, string, TRawResponse>;\n      }\n\n      this.log(\"error\", \"HTTP error response\", {\n        method,\n        endpoint,\n        status,\n        statusText,\n      });\n      return {\n        success: false,\n        error: validated,\n        code: statusCode,\n        raw,\n      } as ErrorResponse<unknown, string, TRawResponse>;\n    } catch {\n      // Validation failed\n      return {\n        success: false,\n        error: new UnexpectedApiClientError(\n          `Response validation failed: ${statusText}`,\n          status,\n          endpoint,\n          method,\n          data,\n        ),\n        code: status,\n        raw,\n      } as UnexpectedErrorResponse<TRawResponse>;\n    }\n  }\n}\n","/**\n * Base error class for API client errors\n */\nexport class ApiClientError extends Error {\n  constructor(\n    message: string,\n    public readonly endpoint?: string,\n    public readonly method?: string,\n    public readonly cause?: unknown,\n  ) {\n    super(message);\n    this.name = \"ApiClientError\";\n    Object.setPrototypeOf(this, ApiClientError.prototype);\n  }\n}\n\n/**\n * Unexpected error that doesn't match any defined error schema\n * Used in the discriminated union for errors not in the OpenAPI spec\n */\nexport class UnexpectedApiClientError extends ApiClientError {\n  constructor(\n    message: string,\n    public readonly code?: number,\n    endpoint?: string,\n    method?: string,\n    cause?: unknown,\n  ) {\n    super(message, endpoint, method, cause);\n    this.name = \"UnexpectedApiClientError\";\n    Object.setPrototypeOf(this, UnexpectedApiClientError.prototype);\n  }\n}\n\n/**\n * Validation error for request/response schema validation failures\n */\nexport class ValidationError extends ApiClientError {\n  constructor(\n    message: string,\n    public readonly validationErrors: unknown,\n    endpoint?: string,\n    method?: string,\n  ) {\n    super(message, endpoint, method);\n    this.name = \"ValidationError\";\n    Object.setPrototypeOf(this, ValidationError.prototype);\n  }\n}\n\n/**\n * Timeout error when request exceeds configured timeout\n */\nexport class TimeoutError extends ApiClientError {\n  constructor(\n    public readonly timeout: number,\n    endpoint?: string,\n    method?: string,\n    cause?: unknown,\n  ) {\n    super(`Request timeout after ${timeout}ms`, endpoint, method, cause);\n    this.name = \"TimeoutError\";\n    Object.setPrototypeOf(this, TimeoutError.prototype);\n  }\n}\n\n","import createDebug from \"debug\";\nimport type { ApiClientLoggingOptions, LogLevel, LogMeta } from \"./types.js\";\n\ntype InternalLogger = (level: LogLevel, message: string, meta?: LogMeta) => void;\ntype DebugLoggers = Partial<Record<LogLevel, (...args: unknown[]) => void>>;\nexport const HTTP_CLIENT_DEBUG_NAMESPACE = \"alt-stack:http-client\";\n\nfunction createDebugLoggers(): DebugLoggers {\n  const debugLogger = createDebug(HTTP_CLIENT_DEBUG_NAMESPACE);\n\n  return {\n    error: debugLogger.extend(\"error\"),\n    warn: debugLogger.extend(\"warn\"),\n    info: debugLogger.extend(\"info\"),\n    debug: debugLogger.extend(\"debug\"),\n  };\n}\n\nfunction invokeLogger(\n  logger: ApiClientLoggingOptions[\"logger\"],\n  level: LogLevel,\n  message: string,\n  meta?: LogMeta,\n): void {\n  const handler = logger?.[level];\n  if (!handler) return;\n\n  try {\n    handler(message, meta);\n  } catch {\n    // Never allow a user-provided logger to affect control-flow.\n  }\n}\n\nfunction invokeDebug(\n  debugLoggers: DebugLoggers,\n  level: LogLevel,\n  message: string,\n  meta?: LogMeta,\n): void {\n  const debuggerInstance = debugLoggers[level];\n  if (!debuggerInstance) return;\n\n  try {\n    if (meta) {\n      debuggerInstance(\"%s %O\", message, meta);\n      return;\n    }\n\n    debuggerInstance(message);\n  } catch {\n    // Never allow debug logging to affect control-flow.\n  }\n}\n\nexport function createInternalLogger(options: ApiClientLoggingOptions): InternalLogger {\n  const debugLoggers = createDebugLoggers();\n\n  return (level, message, meta) => {\n    invokeLogger(options.logger, level, message, meta);\n    invokeDebug(debugLoggers, level, message, meta);\n  };\n}\n"],"mappings":"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","names":["delay","requiredParams"]}