{"version":3,"file":"error-utils.mjs","sources":["../../../src/lib/shared/error-utils.ts"],"sourcesContent":["/**\n * @file Unified Error Utilities\n * @description Standardized error creation, classification, normalization,\n * and error handling patterns.\n *\n * @module shared/error-utils\n */\n\n// =============================================================================\n// Error Categories\n// =============================================================================\n\n/**\n * Error category for classification and handling decisions.\n */\nexport type ErrorCategory =\n  | 'network'\n  | 'validation'\n  | 'authentication'\n  | 'authorization'\n  | 'not_found'\n  | 'conflict'\n  | 'rate_limit'\n  | 'timeout'\n  | 'server'\n  | 'client'\n  | 'unknown';\n\n/**\n * Error severity level.\n */\nexport type ErrorSeverity = 'low' | 'medium' | 'high' | 'critical';\n\n// =============================================================================\n// Base Error Classes\n// =============================================================================\n\n/**\n * Base application error with category and metadata support.\n */\nexport class AppError extends Error {\n  readonly category: ErrorCategory;\n  readonly severity: ErrorSeverity;\n  readonly code?: string;\n  readonly statusCode?: number;\n  readonly metadata?: Record<string, unknown>;\n  readonly timestamp: number;\n  readonly isRetryable: boolean;\n\n  constructor(\n    message: string,\n    options: {\n      category?: ErrorCategory;\n      severity?: ErrorSeverity;\n      code?: string;\n      statusCode?: number;\n      metadata?: Record<string, unknown>;\n      cause?: Error;\n      isRetryable?: boolean;\n    } = {}\n  ) {\n    super(message, { cause: options.cause });\n    this.name = 'AppError';\n    this.category = options.category ?? 'unknown';\n    this.severity = options.severity ?? 'medium';\n    this.code = options.code;\n    this.statusCode = options.statusCode;\n    this.metadata = options.metadata;\n    this.timestamp = Date.now();\n    this.isRetryable = options.isRetryable ?? this.determineRetryable();\n  }\n\n  /**\n   * Convert to plain object for serialization.\n   */\n  toJSON(): Record<string, unknown> {\n    return {\n      name: this.name,\n      message: this.message,\n      category: this.category,\n      severity: this.severity,\n      code: this.code,\n      statusCode: this.statusCode,\n      metadata: this.metadata,\n      timestamp: this.timestamp,\n      isRetryable: this.isRetryable,\n      stack: this.stack,\n    };\n  }\n\n  private determineRetryable(): boolean {\n    const retryableCategories: ErrorCategory[] = [\n      'network',\n      'timeout',\n      'rate_limit',\n      'server',\n    ];\n    return retryableCategories.includes(this.category);\n  }\n}\n\n/**\n * Network-related error.\n */\nexport class NetworkError extends AppError {\n  constructor(\n    message: string,\n    options: Omit<ConstructorParameters<typeof AppError>[1], 'category'> = {}\n  ) {\n    super(message, { ...options, category: 'network' });\n    this.name = 'NetworkError';\n  }\n}\n\n/**\n * Validation error with field-level details.\n */\nexport class ValidationError extends AppError {\n  readonly fields: Record<string, string[]>;\n\n  constructor(\n    message: string,\n    fields: Record<string, string[]> = {},\n    options: Omit<\n      ConstructorParameters<typeof AppError>[1],\n      'category' | 'isRetryable'\n    > = {}\n  ) {\n    super(message, { ...options, category: 'validation', isRetryable: false });\n    this.name = 'ValidationError';\n    this.fields = fields;\n  }\n\n  /**\n   * Get all error messages as flat array.\n   */\n  getAllMessages(): string[] {\n    return Object.values(this.fields).flat();\n  }\n\n  /**\n   * Get error messages for a specific field.\n   */\n  getFieldErrors(field: string): string[] {\n    return this.fields[field] ?? [];\n  }\n}\n\n/**\n * Authentication error.\n */\nexport class AuthenticationError extends AppError {\n  constructor(\n    message = 'Authentication required',\n    options: Omit<\n      ConstructorParameters<typeof AppError>[1],\n      'category' | 'statusCode' | 'isRetryable'\n    > = {}\n  ) {\n    super(message, {\n      ...options,\n      category: 'authentication',\n      statusCode: 401,\n      isRetryable: false,\n    });\n    this.name = 'AuthenticationError';\n  }\n}\n\n/**\n * Authorization error.\n */\nexport class AuthorizationError extends AppError {\n  constructor(\n    message = 'Access denied',\n    options: Omit<\n      ConstructorParameters<typeof AppError>[1],\n      'category' | 'statusCode' | 'isRetryable'\n    > = {}\n  ) {\n    super(message, {\n      ...options,\n      category: 'authorization',\n      statusCode: 403,\n      isRetryable: false,\n    });\n    this.name = 'AuthorizationError';\n  }\n}\n\n/**\n * Not found error.\n */\nexport class NotFoundError extends AppError {\n  readonly resource?: string;\n\n  constructor(\n    message = 'Resource not found',\n    resource?: string,\n    options: Omit<\n      ConstructorParameters<typeof AppError>[1],\n      'category' | 'statusCode' | 'isRetryable'\n    > = {}\n  ) {\n    super(message, {\n      ...options,\n      category: 'not_found',\n      statusCode: 404,\n      isRetryable: false,\n    });\n    this.name = 'NotFoundError';\n    this.resource = resource;\n  }\n}\n\n/**\n * Rate limit error.\n */\nexport class RateLimitError extends AppError {\n  readonly retryAfterMs?: number;\n\n  constructor(\n    message = 'Rate limit exceeded',\n    retryAfterMs?: number,\n    options: Omit<\n      ConstructorParameters<typeof AppError>[1],\n      'category' | 'statusCode'\n    > = {}\n  ) {\n    super(message, {\n      ...options,\n      category: 'rate_limit',\n      statusCode: 429,\n      isRetryable: true,\n    });\n    this.name = 'RateLimitError';\n    this.retryAfterMs = retryAfterMs;\n  }\n}\n\n/**\n * Timeout error.\n */\nexport class TimeoutError extends AppError {\n  readonly timeoutMs: number;\n\n  constructor(\n    message: string,\n    timeoutMs: number,\n    options: Omit<ConstructorParameters<typeof AppError>[1], 'category'> = {}\n  ) {\n    super(message, { ...options, category: 'timeout', isRetryable: true });\n    this.name = 'TimeoutError';\n    this.timeoutMs = timeoutMs;\n  }\n}\n\n/**\n * Conflict error (e.g., resource already exists).\n */\nexport class ConflictError extends AppError {\n  constructor(\n    message = 'Resource conflict',\n    options: Omit<\n      ConstructorParameters<typeof AppError>[1],\n      'category' | 'statusCode' | 'isRetryable'\n    > = {}\n  ) {\n    super(message, {\n      ...options,\n      category: 'conflict',\n      statusCode: 409,\n      isRetryable: false,\n    });\n    this.name = 'ConflictError';\n  }\n}\n\n// =============================================================================\n// Error Normalization\n// =============================================================================\n\n/**\n * Normalize any error into an AppError instance.\n *\n * @param error - Any error value\n * @returns Normalized AppError\n *\n * @example\n * ```ts\n * try {\n *   await fetchData();\n * } catch (error) {\n *   const appError = normalizeError(error);\n *   console.log(appError.category, appError.message);\n * }\n * ```\n */\nexport function normalizeError(error: unknown): AppError {\n  // Already an AppError\n  if (error instanceof AppError) {\n    return error;\n  }\n\n  // Standard Error\n  if (error instanceof Error) {\n    return fromError(error);\n  }\n\n  // String\n  if (typeof error === 'string') {\n    return new AppError(error);\n  }\n\n  // Object with message\n  if (\n    error !== null &&\n    typeof error === 'object' &&\n    'message' in error &&\n    typeof (error as { message: unknown }).message === 'string'\n  ) {\n    return fromErrorObject(error as { message: string; [key: string]: unknown });\n  }\n\n  // Unknown\n  return new AppError('An unknown error occurred', {\n    metadata: { originalError: String(error) },\n  });\n}\n\n/**\n * Convert standard Error to AppError.\n */\nfunction fromError(error: Error): AppError {\n  const category = categorizeError(error);\n  const severity = determineSeverity(category, error);\n\n  return new AppError(error.message, {\n    category,\n    severity,\n    cause: error,\n    metadata: {\n      originalName: error.name,\n      originalStack: error.stack,\n    },\n  });\n}\n\n/**\n * Convert error-like object to AppError.\n */\nfunction fromErrorObject(obj: {\n  message: string;\n  [key: string]: unknown;\n}): AppError {\n  const category = (obj.category as ErrorCategory) ?? categorizeByStatusCode(obj);\n\n  const { statusCode, status } = obj;\n  let resolvedStatusCode: number | undefined;\n  if (typeof statusCode === 'number') {\n    resolvedStatusCode = statusCode;\n  } else if (typeof status === 'number') {\n    resolvedStatusCode = status;\n  } else {\n    resolvedStatusCode = undefined;\n  }\n\n  return new AppError(obj.message, {\n    category,\n    statusCode: resolvedStatusCode,\n    code: typeof obj.code === 'string' ? obj.code : undefined,\n    metadata: obj,\n  });\n}\n\n/**\n * Categorize error based on message and type.\n */\nfunction categorizeError(error: Error): ErrorCategory {\n  const message = error.message.toLowerCase();\n  const name = error.name.toLowerCase();\n\n  // Network errors\n  if (\n    message.includes('network') ||\n    message.includes('fetch') ||\n    message.includes('econnrefused') ||\n    message.includes('enotfound') ||\n    name === 'networkerror' ||\n    name === 'typeerror' // fetch throws TypeError on network failure\n  ) {\n    return 'network';\n  }\n\n  // Timeout errors\n  if (message.includes('timeout') || message.includes('timed out')) {\n    return 'timeout';\n  }\n\n  // Abort errors\n  if (message.includes('abort') || name === 'aborterror') {\n    return 'client';\n  }\n\n  return 'unknown';\n}\n\n/**\n * Categorize by HTTP status code.\n */\nfunction categorizeByStatusCode(obj: Record<string, unknown>): ErrorCategory {\n  const { statusCode, status } = obj;\n  let resolvedStatus: number;\n  if (typeof statusCode === 'number') {\n    resolvedStatus = statusCode;\n  } else if (typeof status === 'number') {\n    resolvedStatus = status;\n  } else {\n    resolvedStatus = 0;\n  }\n\n  if (resolvedStatus === 400) return 'validation';\n  if (resolvedStatus === 401) return 'authentication';\n  if (resolvedStatus === 403) return 'authorization';\n  if (resolvedStatus === 404) return 'not_found';\n  if (resolvedStatus === 409) return 'conflict';\n  if (resolvedStatus === 429) return 'rate_limit';\n  if (resolvedStatus >= 500) return 'server';\n  if (resolvedStatus >= 400) return 'client';\n\n  return 'unknown';\n}\n\n/**\n * Determine error severity.\n */\nfunction determineSeverity(\n  category: ErrorCategory,\n  error: Error\n): ErrorSeverity {\n  // Critical errors\n  if (category === 'server' && error.message.toLowerCase().includes('critical')) {\n    return 'critical';\n  }\n\n  // High severity\n  if (category === 'authentication' || category === 'server') {\n    return 'high';\n  }\n\n  // Medium severity\n  if (\n    category === 'network' ||\n    category === 'timeout' ||\n    category === 'authorization'\n  ) {\n    return 'medium';\n  }\n\n  // Low severity\n  if (category === 'validation' || category === 'not_found') {\n    return 'low';\n  }\n\n  return 'medium';\n}\n\n// =============================================================================\n// Error Checking Utilities\n// =============================================================================\n\n/**\n * Check if error is retryable based on category and properties.\n */\nexport function isRetryableError(error: unknown): boolean {\n  if (error instanceof AppError) {\n    return error.isRetryable;\n  }\n\n  const normalized = normalizeError(error);\n  return normalized.isRetryable;\n}\n\n/**\n * Check if error is a specific category.\n */\nexport function isErrorCategory(\n  error: unknown,\n  category: ErrorCategory\n): boolean {\n  if (error instanceof AppError) {\n    return error.category === category;\n  }\n\n  const normalized = normalizeError(error);\n  return normalized.category === category;\n}\n\n/**\n * Check if error is a network error.\n */\nexport function isNetworkError(error: unknown): error is NetworkError {\n  return (\n    error instanceof NetworkError ||\n    isErrorCategory(error, 'network')\n  );\n}\n\n/**\n * Check if error is a validation error.\n */\nexport function isValidationError(error: unknown): error is ValidationError {\n  return (\n    error instanceof ValidationError ||\n    isErrorCategory(error, 'validation')\n  );\n}\n\n/**\n * Check if error is an authentication error.\n */\nexport function isAuthenticationError(\n  error: unknown\n): error is AuthenticationError {\n  return (\n    error instanceof AuthenticationError ||\n    isErrorCategory(error, 'authentication')\n  );\n}\n\n/**\n * Check if error is a timeout error.\n */\nexport function isTimeoutError(error: unknown): error is TimeoutError {\n  return (\n    error instanceof TimeoutError ||\n    isErrorCategory(error, 'timeout')\n  );\n}\n\n// =============================================================================\n// Error Creation Helpers\n// =============================================================================\n\n/**\n * Create error from HTTP response.\n *\n * @param response - HTTP response object\n * @param body - Parsed response body\n * @returns Appropriate AppError subclass\n */\nexport function fromHttpResponse(\n  response: { status: number; statusText: string },\n  body?: { message?: string; error?: string; errors?: Record<string, string[]> }\n): AppError {\n  const message =\n    body?.message ??\n    body?.error ??\n    response.statusText ??\n    `HTTP ${response.status}`;\n\n  switch (response.status) {\n    case 400:\n      return new ValidationError(message, body?.errors ?? {}, {\n        statusCode: 400,\n      });\n    case 401:\n      return new AuthenticationError(message);\n    case 403:\n      return new AuthorizationError(message);\n    case 404:\n      return new NotFoundError(message);\n    case 409:\n      return new ConflictError(message);\n    case 429:\n      return new RateLimitError(message);\n    default:\n      if (response.status >= 500) {\n        return new AppError(message, {\n          category: 'server',\n          statusCode: response.status,\n          severity: 'high',\n        });\n      }\n      return new AppError(message, {\n        category: 'client',\n        statusCode: response.status,\n      });\n  }\n}\n\n// =============================================================================\n// Error Handling Patterns\n// =============================================================================\n\n/**\n * Result type for operations that can fail.\n */\nexport type Result<T, E = AppError> =\n  | { success: true; data: T }\n  | { success: false; error: E };\n\n/**\n * Create a success result.\n */\nexport function success<T>(data: T): Result<T, never> {\n  return { success: true, data };\n}\n\n/**\n * Create a failure result.\n */\nexport function failure<E>(error: E): Result<never, E> {\n  return { success: false, error };\n}\n\n/**\n * Wrap an async function to return Result instead of throwing.\n *\n * @example\n * ```ts\n * const result = await tryCatch(() => fetchData());\n * if (result.success) {\n *   console.log(result.data);\n * } else {\n *   console.error(result.error.message);\n * }\n * ```\n */\nexport async function tryCatch<T>(\n  fn: () => Promise<T>\n): Promise<Result<T>> {\n  try {\n    const data = await fn();\n    return success(data);\n  } catch (error) {\n    return failure(normalizeError(error));\n  }\n}\n\n/**\n * Sync version of tryCatch.\n */\nexport function tryCatchSync<T>(fn: () => T): Result<T> {\n  try {\n    const data = fn();\n    return success(data);\n  } catch (error) {\n    return failure(normalizeError(error));\n  }\n}\n\n/**\n * Unwrap a Result, throwing if it's a failure.\n */\nexport function unwrap<T>(result: Result<T>): T {\n  if (result.success) {\n    return result.data;\n  }\n  throw result.error;\n}\n\n/**\n * Unwrap a Result with a default value for failures.\n */\nexport function unwrapOr<T>(result: Result<T>, defaultValue: T): T {\n  if (result.success) {\n    return result.data;\n  }\n  return defaultValue;\n}\n\n/**\n * Map over a successful Result.\n */\nexport function mapResult<T, U>(\n  result: Result<T>,\n  fn: (data: T) => U\n): Result<U> {\n  if (result.success) {\n    return success(fn(result.data));\n  }\n  return result;\n}\n\n/**\n * Flat map over a successful Result.\n */\nexport function flatMapResult<T, U>(\n  result: Result<T>,\n  fn: (data: T) => Result<U>\n): Result<U> {\n  if (result.success) {\n    return fn(result.data);\n  }\n  return result;\n}\n"],"names":["AppError","message","options","NetworkError","ValidationError","fields","field","AuthenticationError","AuthorizationError","NotFoundError","resource","RateLimitError","retryAfterMs","TimeoutError","timeoutMs","ConflictError","normalizeError","error","fromError","fromErrorObject","category","categorizeError","severity","determineSeverity","obj","categorizeByStatusCode","statusCode","status","resolvedStatusCode","name","resolvedStatus","isRetryableError","isErrorCategory","isNetworkError","isValidationError","isAuthenticationError","isTimeoutError","fromHttpResponse","response","body","success","data","failure","tryCatch","fn","tryCatchSync","unwrap","result","unwrapOr","defaultValue","mapResult","flatMapResult"],"mappings":"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"}