{"version":3,"file":"api.config.mjs","sources":["../../src/config/api.config.ts"],"sourcesContent":["/**\n * @file API Configuration\n * @description Centralized API endpoints, configuration, and query keys.\n *\n * This module consolidates:\n * - API endpoint definitions\n * - Request configuration (timeouts, retries)\n * - React Query key factories\n *\n * USAGE:\n * ```typescript\n * import { API_CONFIG, QUERY_KEYS, API_ENDPOINTS } from '@/config';\n *\n * // Use endpoints\n * const url = `${API_CONFIG.BASE_URL}${API_ENDPOINTS.USERS.BASE}`;\n *\n * // Use query keys\n * useQuery({\n *   queryKey: QUERY_KEYS.USERS.LIST({ page: 1 }),\n *   // ...\n * });\n * ```\n */\n\nimport { env } from './env';\nimport { API_TIMING, RETRY_CONFIG } from './timing.constants';\n\n// =============================================================================\n// API Endpoints\n// =============================================================================\n\n/**\n * API endpoint definitions with full type safety\n *\n * Organized by domain for easy discovery and maintenance.\n */\nexport const API_ENDPOINTS = {\n  // ---------------------------------------------------------------------------\n  // Authentication\n  // ---------------------------------------------------------------------------\n  AUTH: {\n    /** User login */\n    LOGIN: '/auth/login',\n    /** User logout */\n    LOGOUT: '/auth/logout',\n    /** User registration */\n    REGISTER: '/auth/register',\n    /** Token refresh */\n    REFRESH: '/auth/refresh',\n    /** Session validation */\n    SESSION: '/auth/session',\n    /** Current user info */\n    ME: '/auth/me',\n    /** Email verification */\n    VERIFY_EMAIL: '/auth/verify-email',\n    /** Resend verification email */\n    RESEND_VERIFICATION: '/auth/resend-verification',\n    /** Request password reset */\n    FORGOT_PASSWORD: '/auth/forgot-password',\n    /** Reset password with token */\n    RESET_PASSWORD: '/auth/reset-password',\n    /** MFA endpoints */\n    MFA: {\n      /** Setup MFA */\n      SETUP: '/auth/mfa/setup',\n      /** Enable MFA */\n      ENABLE: '/auth/mfa/enable',\n      /** Disable MFA */\n      DISABLE: '/auth/mfa/disable',\n      /** Verify MFA code */\n      VERIFY: '/auth/mfa/verify',\n    },\n  },\n\n  // ---------------------------------------------------------------------------\n  // Users\n  // ---------------------------------------------------------------------------\n  USERS: {\n    /** Users list (GET) / Create user (POST) */\n    BASE: '/users',\n    /** Single user by ID */\n    DETAIL: (id: string) => `/users/${id}` as const,\n    /** Current user profile */\n    PROFILE: '/users/profile',\n    /** User avatar upload */\n    AVATAR: (id: string) => `/users/${id}/avatar` as const,\n    /** User permissions */\n    PERMISSIONS: (id: string) => `/users/${id}/permissions` as const,\n  },\n\n  // ---------------------------------------------------------------------------\n  // Reports\n  // ---------------------------------------------------------------------------\n  REPORTS: {\n    /** Reports list (GET) / Create report (POST) */\n    BASE: '/reports',\n    /** Single report by ID */\n    DETAIL: (id: string) => `/reports/${id}` as const,\n    /** Generate a new report */\n    GENERATE: '/reports/generate',\n    /** Export report */\n    EXPORT: (id: string) => `/reports/${id}/export` as const,\n    /** Report summary/stats */\n    SUMMARY: '/reports/summary',\n    /** Report templates */\n    TEMPLATES: '/reports/templates',\n  },\n\n  // ---------------------------------------------------------------------------\n  // Dashboard / Analytics\n  // ---------------------------------------------------------------------------\n  ANALYTICS: {\n    /** Dashboard overview stats */\n    DASHBOARD: '/analytics/dashboard',\n    /** Detailed metrics */\n    METRICS: '/analytics/metrics',\n    /** Activity feed */\n    ACTIVITY: '/analytics/activity',\n    /** Charts data */\n    CHARTS: '/analytics/charts',\n    /** Events tracking */\n    EVENTS: '/analytics/events',\n  },\n\n  // ---------------------------------------------------------------------------\n  // Settings\n  // ---------------------------------------------------------------------------\n  SETTINGS: {\n    /** General settings */\n    GENERAL: '/settings/general',\n    /** Notification preferences */\n    NOTIFICATIONS: '/settings/notifications',\n    /** Security settings */\n    SECURITY: '/settings/security',\n    /** API keys */\n    API_KEYS: '/settings/api-keys',\n  },\n\n  // ---------------------------------------------------------------------------\n  // Admin\n  // ---------------------------------------------------------------------------\n  ADMIN: {\n    /** System overview */\n    OVERVIEW: '/admin/overview',\n    /** User management */\n    USERS: '/admin/users',\n    /** Role management */\n    ROLES: '/admin/roles',\n    /** System logs */\n    LOGS: '/admin/logs',\n    /** System configuration */\n    CONFIG: '/admin/config',\n  },\n\n  // ---------------------------------------------------------------------------\n  // Entities (Generic CRUD)\n  // ---------------------------------------------------------------------------\n  ENTITIES: {\n    /** Entities list */\n    BASE: '/entities',\n    /** Single entity by ID */\n    DETAIL: (id: string) => `/entities/${id}` as const,\n  },\n\n  // ---------------------------------------------------------------------------\n  // File Uploads\n  // ---------------------------------------------------------------------------\n  FILES: {\n    /** Upload file */\n    UPLOAD: '/files/upload',\n    /** Download file */\n    DOWNLOAD: (id: string) => `/files/${id}` as const,\n    /** Delete file */\n    DELETE: (id: string) => `/files/${id}` as const,\n  },\n\n  // ---------------------------------------------------------------------------\n  // Health & System\n  // ---------------------------------------------------------------------------\n  HEALTH: {\n    /** Health check */\n    CHECK: '/health',\n    /** Readiness check */\n    READY: '/health/ready',\n    /** Liveness check */\n    LIVE: '/health/live',\n  },\n} as const;\n\n// =============================================================================\n// API Configuration Object\n// =============================================================================\n\n/**\n * Complete API configuration\n */\nexport const API_CONFIG = {\n  /** Base URL for all API requests */\n  BASE_URL: env.apiBaseUrl,\n\n  /** Request timeout settings */\n  TIMEOUT: {\n    /** Default timeout (30s) */\n    DEFAULT: API_TIMING.TIMEOUT,\n    /** Long timeout for uploads/reports (2min) */\n    LONG: API_TIMING.TIMEOUT_LONG,\n    /** Short timeout for quick endpoints (10s) */\n    SHORT: API_TIMING.TIMEOUT_SHORT,\n    /** Health check timeout (5s) */\n    HEALTH: API_TIMING.TIMEOUT_HEALTH,\n  },\n\n  /** Retry configuration */\n  RETRY: {\n    /** Number of retry attempts */\n    ATTEMPTS: RETRY_CONFIG.API_ATTEMPTS,\n    /** Base delay for exponential backoff */\n    BASE_DELAY: API_TIMING.RETRY_BASE_DELAY,\n    /** Maximum delay between retries */\n    MAX_DELAY: API_TIMING.RETRY_MAX_DELAY,\n  },\n\n  /** All endpoints */\n  ENDPOINTS: API_ENDPOINTS,\n\n  /** Default request headers */\n  HEADERS: {\n    'Content-Type': 'application/json',\n    Accept: 'application/json',\n  } as const,\n\n  /** Pagination defaults */\n  PAGINATION: {\n    DEFAULT_PAGE: 1,\n    DEFAULT_PAGE_SIZE: 20,\n    MAX_PAGE_SIZE: 100,\n    PAGE_SIZE_OPTIONS: [10, 20, 50, 100] as const,\n  },\n} as const;\n\n// =============================================================================\n// Query Keys Factory\n// =============================================================================\n\n/**\n * React Query key factory for consistent cache key generation\n *\n * Using a factory pattern ensures:\n * 1. Type-safe query key generation\n * 2. Consistent key structure across the app\n * 3. Easy invalidation with partial matching\n *\n * @example\n * ```typescript\n * // In a query\n * useQuery({\n *   queryKey: QUERY_KEYS.USERS.DETAIL('123'),\n *   // ...\n * });\n *\n * // Invalidating\n * queryClient.invalidateQueries({\n *   queryKey: QUERY_KEYS.USERS.ALL\n * });\n * ```\n */\nexport const QUERY_KEYS = {\n  // ---------------------------------------------------------------------------\n  // Auth Keys\n  // ---------------------------------------------------------------------------\n  AUTH: {\n    /** All auth-related queries */\n    ALL: ['auth'] as const,\n    /** Current session */\n    SESSION: ['auth', 'session'] as const,\n    /** Current user */\n    USER: ['auth', 'user'] as const,\n    /** MFA status */\n    MFA: ['auth', 'mfa'] as const,\n  },\n\n  // ---------------------------------------------------------------------------\n  // Users Keys\n  // ---------------------------------------------------------------------------\n  USERS: {\n    /** All user-related queries */\n    ALL: ['users'] as const,\n    /** Users list with optional filters */\n    LIST: (filters?: Record<string, unknown>) => ['users', 'list', filters] as const,\n    /** Single user detail */\n    DETAIL: (id: string) => ['users', 'detail', id] as const,\n    /** Current user profile */\n    PROFILE: () => ['users', 'profile'] as const,\n    /** User permissions */\n    PERMISSIONS: (id: string) => ['users', 'permissions', id] as const,\n  },\n\n  // ---------------------------------------------------------------------------\n  // Reports Keys\n  // ---------------------------------------------------------------------------\n  REPORTS: {\n    /** All report-related queries */\n    ALL: ['reports'] as const,\n    /** Reports list with optional filters */\n    LIST: (filters?: Record<string, unknown>) => ['reports', 'list', filters] as const,\n    /** Single report detail */\n    DETAIL: (id: string) => ['reports', 'detail', id] as const,\n    /** Report summary for a time range */\n    SUMMARY: (range: string) => ['reports', 'summary', range] as const,\n    /** Report templates */\n    TEMPLATES: () => ['reports', 'templates'] as const,\n  },\n\n  // ---------------------------------------------------------------------------\n  // Dashboard Keys\n  // ---------------------------------------------------------------------------\n  DASHBOARD: {\n    /** All dashboard queries */\n    ALL: ['dashboard'] as const,\n    /** Dashboard statistics */\n    STATS: () => ['dashboard', 'stats'] as const,\n    /** Dashboard charts for a time range */\n    CHARTS: (range: string) => ['dashboard', 'charts', range] as const,\n    /** Activity feed with pagination */\n    ACTIVITY: (page: number) => ['dashboard', 'activity', page] as const,\n    /** Real-time metrics */\n    METRICS: () => ['dashboard', 'metrics'] as const,\n  },\n\n  // ---------------------------------------------------------------------------\n  // Analytics Keys\n  // ---------------------------------------------------------------------------\n  ANALYTICS: {\n    /** All analytics queries */\n    ALL: ['analytics'] as const,\n    /** Analytics overview */\n    OVERVIEW: (range: string) => ['analytics', 'overview', range] as const,\n    /** Specific metric */\n    METRIC: (metricId: string, range: string) => ['analytics', 'metric', metricId, range] as const,\n  },\n\n  // ---------------------------------------------------------------------------\n  // Settings Keys\n  // ---------------------------------------------------------------------------\n  SETTINGS: {\n    /** All settings queries */\n    ALL: ['settings'] as const,\n    /** General settings */\n    GENERAL: () => ['settings', 'general'] as const,\n    /** Notification settings */\n    NOTIFICATIONS: () => ['settings', 'notifications'] as const,\n    /** Security settings */\n    SECURITY: () => ['settings', 'security'] as const,\n  },\n\n  // ---------------------------------------------------------------------------\n  // Entities Keys (Generic)\n  // ---------------------------------------------------------------------------\n  ENTITIES: {\n    /** All entity queries */\n    ALL: ['entities'] as const,\n    /** Entity list with filters */\n    LIST: (filters?: Record<string, unknown>) => ['entities', 'list', filters] as const,\n    /** Single entity detail */\n    DETAIL: (id: string) => ['entities', 'detail', id] as const,\n    /** Infinite scroll list */\n    INFINITE: (filters?: Record<string, unknown>) => ['entities', 'infinite', filters] as const,\n  },\n\n  // ---------------------------------------------------------------------------\n  // Admin Keys\n  // ---------------------------------------------------------------------------\n  ADMIN: {\n    /** All admin queries */\n    ALL: ['admin'] as const,\n    /** System overview */\n    OVERVIEW: () => ['admin', 'overview'] as const,\n    /** Admin users list */\n    USERS: (filters?: Record<string, unknown>) => ['admin', 'users', filters] as const,\n    /** System logs */\n    LOGS: (filters?: Record<string, unknown>) => ['admin', 'logs', filters] as const,\n    /** Roles list */\n    ROLES: () => ['admin', 'roles'] as const,\n  },\n} as const;\n\n// =============================================================================\n// Type Exports\n// =============================================================================\n\n/** Type for API endpoints object */\nexport type ApiEndpoints = typeof API_ENDPOINTS;\n\n/** Type for API configuration object */\nexport type ApiConfig = typeof API_CONFIG;\n\n/** Type for query key factory */\nexport type QueryKeyFactory = typeof QUERY_KEYS;\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Build a full API URL from an endpoint\n *\n * @param endpoint - Relative endpoint path\n * @returns Full URL with base URL\n *\n * @example\n * ```typescript\n * buildApiUrl(API_ENDPOINTS.USERS.BASE)\n * // Returns: 'http://localhost:3001/api/users'\n *\n * buildApiUrl(API_ENDPOINTS.USERS.DETAIL('123'))\n * // Returns: 'http://localhost:3001/api/users/123'\n * ```\n */\nexport function buildApiUrl(endpoint: string): string {\n  const baseUrl = API_CONFIG.BASE_URL.replace(/\\/$/, '');\n  const path = endpoint.startsWith('/') ? endpoint : `/${endpoint}`;\n  return `${baseUrl}${path}`;\n}\n\n/**\n * Build a full API URL with query parameters\n *\n * @param endpoint - Relative endpoint path\n * @param params - Query parameters\n * @returns Full URL with base URL and query string\n *\n * @example\n * ```typescript\n * buildApiUrlWithParams(API_ENDPOINTS.USERS.BASE, { page: 1, limit: 20 })\n * // Returns: 'http://localhost:3001/api/users?page=1&limit=20'\n * ```\n */\nexport function buildApiUrlWithParams(\n  endpoint: string,\n  params?: Record<string, string | number | boolean | undefined>\n): string {\n  const url = buildApiUrl(endpoint);\n\n  if (!params || Object.keys(params).length === 0) {\n    return url;\n  }\n\n  const searchParams = new URLSearchParams();\n  for (const [key, value] of Object.entries(params)) {\n    if (value !== undefined && value !== null) {\n      searchParams.set(key, String(value));\n    }\n  }\n\n  const queryString = searchParams.toString();\n  return queryString ? `${url}?${queryString}` : url;\n}\n\n/**\n * Check if an HTTP status code indicates a retryable error\n *\n * @param status - HTTP status code\n * @returns True if the error should be retried\n */\nexport function isRetryableStatus(status: number): boolean {\n  // Retry on timeout (408), rate limit (429), and server errors (5xx)\n  // But NOT on other client errors (4xx)\n  if (status === 408 || status === 429) {\n    return true;\n  }\n  return status >= 500;\n}\n\n/**\n * Check if an error is a network error (no status code)\n */\nexport function isNetworkError(error: unknown): boolean {\n  if (error instanceof Error) {\n    return (\n      error.name === 'TypeError' ||\n      error.message.includes('network') ||\n      error.message.includes('fetch')\n    );\n  }\n  return false;\n}\n\n// =============================================================================\n// Endpoint Registry (Enhanced)\n// =============================================================================\n\n/**\n * HTTP method types\n */\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n\n/**\n * Endpoint definition with full metadata\n */\nexport interface EndpointDefinition {\n  /** HTTP method */\n  method: HttpMethod;\n  /** URL path (can include :param placeholders) */\n  path: string;\n  /** Endpoint description */\n  description?: string;\n  /** Whether authentication is required */\n  auth: boolean;\n  /** Request timeout override */\n  timeout?: number;\n  /** Cache configuration */\n  cache?: {\n    /** Cache strategy */\n    strategy: 'no-cache' | 'cache-first' | 'network-first' | 'stale-while-revalidate';\n    /** TTL in milliseconds */\n    ttl: number;\n  };\n  /** Rate limiting configuration */\n  rateLimit?: {\n    /** Requests per window */\n    requests: number;\n    /** Window size in milliseconds */\n    window: number;\n  };\n  /** Tags for categorization */\n  tags?: string[];\n}\n\n/**\n * Typed endpoint registry for API contract definition\n *\n * This registry provides complete metadata about each endpoint,\n * enabling automatic client generation and documentation.\n *\n * @example\n * ```typescript\n * const userEndpoint = ENDPOINT_REGISTRY.users.getById;\n * console.log(userEndpoint.method); // 'GET'\n * console.log(userEndpoint.auth); // true\n * ```\n */\nexport const ENDPOINT_REGISTRY = {\n  // ---------------------------------------------------------------------------\n  // Authentication Endpoints\n  // ---------------------------------------------------------------------------\n  auth: {\n    login: {\n      method: 'POST' as const,\n      path: API_ENDPOINTS.AUTH.LOGIN,\n      description: 'Authenticate user with credentials',\n      auth: false,\n      cache: { strategy: 'no-cache' as const, ttl: 0 },\n      tags: ['auth', 'public'],\n    },\n    logout: {\n      method: 'POST' as const,\n      path: API_ENDPOINTS.AUTH.LOGOUT,\n      description: 'End user session',\n      auth: true,\n      cache: { strategy: 'no-cache' as const, ttl: 0 },\n      tags: ['auth'],\n    },\n    register: {\n      method: 'POST' as const,\n      path: API_ENDPOINTS.AUTH.REGISTER,\n      description: 'Register new user account',\n      auth: false,\n      cache: { strategy: 'no-cache' as const, ttl: 0 },\n      tags: ['auth', 'public'],\n    },\n    refresh: {\n      method: 'POST' as const,\n      path: API_ENDPOINTS.AUTH.REFRESH,\n      description: 'Refresh authentication tokens',\n      auth: false,\n      cache: { strategy: 'no-cache' as const, ttl: 0 },\n      tags: ['auth'],\n    },\n    session: {\n      method: 'GET' as const,\n      path: API_ENDPOINTS.AUTH.SESSION,\n      description: 'Get current session status',\n      auth: true,\n      cache: { strategy: 'network-first' as const, ttl: 60000 },\n      tags: ['auth'],\n    },\n    me: {\n      method: 'GET' as const,\n      path: API_ENDPOINTS.AUTH.ME,\n      description: 'Get current user info',\n      auth: true,\n      cache: { strategy: 'cache-first' as const, ttl: 300000 },\n      tags: ['auth', 'user'],\n    },\n  },\n\n  // ---------------------------------------------------------------------------\n  // User Endpoints\n  // ---------------------------------------------------------------------------\n  users: {\n    list: {\n      method: 'GET' as const,\n      path: API_ENDPOINTS.USERS.BASE,\n      description: 'List all users with pagination',\n      auth: true,\n      cache: { strategy: 'stale-while-revalidate' as const, ttl: 60000 },\n      tags: ['users'],\n    },\n    getById: {\n      method: 'GET' as const,\n      path: '/users/:id',\n      description: 'Get user by ID',\n      auth: true,\n      cache: { strategy: 'cache-first' as const, ttl: 300000 },\n      tags: ['users'],\n    },\n    create: {\n      method: 'POST' as const,\n      path: API_ENDPOINTS.USERS.BASE,\n      description: 'Create new user',\n      auth: true,\n      cache: { strategy: 'no-cache' as const, ttl: 0 },\n      tags: ['users', 'mutation'],\n    },\n    update: {\n      method: 'PATCH' as const,\n      path: '/users/:id',\n      description: 'Update user by ID',\n      auth: true,\n      cache: { strategy: 'no-cache' as const, ttl: 0 },\n      tags: ['users', 'mutation'],\n    },\n    delete: {\n      method: 'DELETE' as const,\n      path: '/users/:id',\n      description: 'Delete user by ID',\n      auth: true,\n      cache: { strategy: 'no-cache' as const, ttl: 0 },\n      tags: ['users', 'mutation'],\n    },\n    profile: {\n      method: 'GET' as const,\n      path: API_ENDPOINTS.USERS.PROFILE,\n      description: 'Get current user profile',\n      auth: true,\n      cache: { strategy: 'cache-first' as const, ttl: 300000 },\n      tags: ['users', 'profile'],\n    },\n  },\n\n  // ---------------------------------------------------------------------------\n  // Report Endpoints\n  // ---------------------------------------------------------------------------\n  reports: {\n    list: {\n      method: 'GET' as const,\n      path: API_ENDPOINTS.REPORTS.BASE,\n      description: 'List all reports with pagination',\n      auth: true,\n      cache: { strategy: 'stale-while-revalidate' as const, ttl: 120000 },\n      tags: ['reports'],\n    },\n    getById: {\n      method: 'GET' as const,\n      path: '/reports/:id',\n      description: 'Get report by ID',\n      auth: true,\n      cache: { strategy: 'cache-first' as const, ttl: 600000 },\n      tags: ['reports'],\n    },\n    generate: {\n      method: 'POST' as const,\n      path: API_ENDPOINTS.REPORTS.GENERATE,\n      description: 'Generate new report',\n      auth: true,\n      timeout: API_TIMING.TIMEOUT_LONG,\n      cache: { strategy: 'no-cache' as const, ttl: 0 },\n      tags: ['reports', 'mutation', 'long-running'],\n    },\n    export: {\n      method: 'GET' as const,\n      path: '/reports/:id/export',\n      description: 'Export report to file',\n      auth: true,\n      timeout: API_TIMING.TIMEOUT_LONG,\n      cache: { strategy: 'no-cache' as const, ttl: 0 },\n      tags: ['reports', 'export'],\n    },\n  },\n\n  // ---------------------------------------------------------------------------\n  // Analytics Endpoints\n  // ---------------------------------------------------------------------------\n  analytics: {\n    dashboard: {\n      method: 'GET' as const,\n      path: API_ENDPOINTS.ANALYTICS.DASHBOARD,\n      description: 'Get dashboard overview data',\n      auth: true,\n      cache: { strategy: 'stale-while-revalidate' as const, ttl: 30000 },\n      tags: ['analytics', 'dashboard'],\n    },\n    metrics: {\n      method: 'GET' as const,\n      path: API_ENDPOINTS.ANALYTICS.METRICS,\n      description: 'Get detailed metrics',\n      auth: true,\n      cache: { strategy: 'stale-while-revalidate' as const, ttl: 60000 },\n      tags: ['analytics', 'metrics'],\n    },\n    activity: {\n      method: 'GET' as const,\n      path: API_ENDPOINTS.ANALYTICS.ACTIVITY,\n      description: 'Get activity feed',\n      auth: true,\n      cache: { strategy: 'network-first' as const, ttl: 30000 },\n      tags: ['analytics', 'activity'],\n    },\n  },\n\n  // ---------------------------------------------------------------------------\n  // Health Endpoints\n  // ---------------------------------------------------------------------------\n  health: {\n    check: {\n      method: 'GET' as const,\n      path: API_ENDPOINTS.HEALTH.CHECK,\n      description: 'Basic health check',\n      auth: false,\n      timeout: API_TIMING.TIMEOUT_HEALTH,\n      cache: { strategy: 'no-cache' as const, ttl: 0 },\n      tags: ['health', 'public'],\n    },\n    ready: {\n      method: 'GET' as const,\n      path: API_ENDPOINTS.HEALTH.READY,\n      description: 'Readiness probe',\n      auth: false,\n      timeout: API_TIMING.TIMEOUT_HEALTH,\n      cache: { strategy: 'no-cache' as const, ttl: 0 },\n      tags: ['health', 'public'],\n    },\n    live: {\n      method: 'GET' as const,\n      path: API_ENDPOINTS.HEALTH.LIVE,\n      description: 'Liveness probe',\n      auth: false,\n      timeout: API_TIMING.TIMEOUT_HEALTH,\n      cache: { strategy: 'no-cache' as const, ttl: 0 },\n      tags: ['health', 'public'],\n    },\n  },\n} as const;\n\n/** Type for endpoint registry */\nexport type EndpointRegistry = typeof ENDPOINT_REGISTRY;\n\n// =============================================================================\n// Environment-Specific Configuration\n// =============================================================================\n\n/**\n * Environment-specific API settings\n */\nexport interface EnvironmentApiConfig {\n  /** Base URL for this environment */\n  baseUrl: string;\n  /** Enable request logging */\n  logging: boolean;\n  /** Enable mock server */\n  mockEnabled: boolean;\n  /** Default timeout */\n  timeout: number;\n  /** Retry attempts */\n  retryAttempts: number;\n  /** Enable request deduplication */\n  deduplicate: boolean;\n}\n\n/**\n * Get API configuration for specific environment\n */\nexport function getEnvironmentApiConfig(): EnvironmentApiConfig {\n  const { isDev } = env;\n  const { isProd } = env;\n\n  return {\n    baseUrl: env.apiBaseUrl,\n    logging: isDev,\n    mockEnabled: isDev && !env.apiBaseUrl.includes('api.'),\n    timeout: isProd ? API_TIMING.TIMEOUT : API_TIMING.TIMEOUT * 2,\n    retryAttempts: isProd ? RETRY_CONFIG.API_ATTEMPTS : 1,\n    deduplicate: true,\n  };\n}\n\n// =============================================================================\n// Request/Response Types (OpenAPI Compatible)\n// =============================================================================\n\n/**\n * Standard success response envelope\n */\nexport interface ApiSuccessResponse<T> {\n  success: true;\n  data: T;\n  meta?: {\n    requestId?: string;\n    timestamp?: string;\n    version?: string;\n  };\n}\n\n/**\n * Standard error response envelope\n */\nexport interface ApiErrorResponse {\n  success: false;\n  error: {\n    code: string;\n    message: string;\n    details?: unknown;\n    fieldErrors?: Array<{\n      field: string;\n      message: string;\n      code?: string;\n    }>;\n  };\n  meta?: {\n    requestId?: string;\n    timestamp?: string;\n  };\n}\n\n/**\n * Standard paginated response envelope\n */\nexport interface ApiPaginatedResponse<T> {\n  success: true;\n  data: {\n    items: T[];\n    pagination: {\n      page: number;\n      pageSize: number;\n      total: number;\n      totalPages: number;\n      hasMore: boolean;\n      nextCursor?: string;\n      prevCursor?: string;\n    };\n  };\n  meta?: {\n    requestId?: string;\n    timestamp?: string;\n  };\n}\n\n/**\n * Common request parameters for list endpoints\n */\nexport interface ListRequestParams {\n  page?: number;\n  pageSize?: number;\n  sort?: string;\n  order?: 'asc' | 'desc';\n  search?: string;\n  filters?: Record<string, unknown>;\n}\n\n/**\n * Build list request query string\n */\nexport function buildListParams(params: ListRequestParams): Record<string, string | number> {\n  const query: Record<string, string | number> = {};\n\n  if (params.page !== undefined) query.page = params.page;\n  if (params.pageSize !== undefined) query.pageSize = params.pageSize;\n  if (params.sort != null) query.sort = params.sort;\n  if (params.order) query.order = params.order;\n  if (params.search != null) query.search = params.search;\n\n  // Flatten filters\n  if (params.filters) {\n    for (const [key, value] of Object.entries(params.filters)) {\n      if (value !== undefined && value !== null) {\n        // Only stringify primitive values\n        if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n          query[`filter[${key}]`] = String(value);\n        }\n      }\n    }\n  }\n\n  return query;\n}\n\n// =============================================================================\n// API Versioning\n// =============================================================================\n\n/**\n * Current API version\n */\nexport const API_VERSION = 'v1';\n\n/**\n * Supported API versions\n */\nexport const SUPPORTED_API_VERSIONS = ['v1'] as const;\n\n/**\n * API version type\n */\nexport type ApiVersion = (typeof SUPPORTED_API_VERSIONS)[number];\n\n/**\n * Get versioned API URL\n */\nexport function getVersionedApiUrl(version: ApiVersion = API_VERSION): string {\n  return `${API_CONFIG.BASE_URL}/${version}`;\n}\n\n/**\n * Build versioned endpoint URL\n */\nexport function buildVersionedUrl(endpoint: string, version: ApiVersion = API_VERSION): string {\n  const versionedBase = getVersionedApiUrl(version);\n  const path = endpoint.startsWith('/') ? endpoint : `/${endpoint}`;\n  return `${versionedBase}${path}`;\n}\n"],"names":["API_ENDPOINTS","id","API_CONFIG","env","API_TIMING","RETRY_CONFIG","QUERY_KEYS","filters","range","page","metricId","buildApiUrl","endpoint","baseUrl","path","buildApiUrlWithParams","params","url","searchParams","key","value","queryString","isRetryableStatus","status","isNetworkError","error","ENDPOINT_REGISTRY","getEnvironmentApiConfig","isDev","isProd","buildListParams","query","API_VERSION","SUPPORTED_API_VERSIONS","getVersionedApiUrl","version","buildVersionedUrl","versionedBase"],"mappings":"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"}