{"version":3,"file":"api-flags.mjs","sources":["../../../../src/lib/flags/integration/api-flags.ts"],"sourcesContent":["/**\n * @fileoverview API feature flags for controlling API behavior.\n *\n * This module provides feature flag integration for the API layer, enabling\n * dynamic control over endpoints, caching, rate limiting, and mock data.\n *\n * @module flags/integration/api-flags\n *\n * @example\n * ```typescript\n * import {\n *   apiFlags,\n *   useApiFlagConfig,\n *   createFlaggedApiClient,\n * } from '@/lib/flags/integration/api-flags';\n *\n * // Check API feature flags\n * if (apiFlags.isRetryEnabled()) {\n *   // Use retry logic\n * }\n *\n * // Use in component\n * function DataFetcher() {\n *   const config = useApiFlagConfig();\n *   // config.cacheEnabled, config.retryEnabled, etc.\n * }\n * ```\n */\n\nimport { useCallback, useMemo } from 'react';\nimport {\n  createLibraryIntegration,\n  integrationRegistry,\n  type LibraryIntegration,\n  useLibraryFlags,\n} from './library-integration';\nimport { apiClient } from '../../api/api-client';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * API flag keys\n */\nexport const API_FLAG_KEYS = {\n  /** Enable API retry logic */\n  API_RETRY_ENABLED: 'api-retry-enabled',\n  /** Enable API response caching */\n  API_CACHE_ENABLED: 'api-cache-enabled',\n  /** Enable request deduplication */\n  API_DEDUPE_ENABLED: 'api-dedupe-enabled',\n  /** Enable rate limiting */\n  API_RATE_LIMIT_ENABLED: 'api-rate-limit-enabled',\n  /** Use mock API responses */\n  API_MOCK_ENABLED: 'api-mock-enabled',\n  /** Enable API metrics collection */\n  API_METRICS_ENABLED: 'api-metrics-enabled',\n  /** Enable API request logging */\n  API_LOGGING_ENABLED: 'api-logging-enabled',\n  /** Enable optimistic updates */\n  API_OPTIMISTIC_ENABLED: 'api-optimistic-enabled',\n  /** Enable API versioning */\n  API_VERSIONING_ENABLED: 'api-versioning-enabled',\n  /** Enable streaming responses */\n  API_STREAMING_ENABLED: 'api-streaming-enabled',\n  /** Use new API gateway */\n  API_GATEWAY_V2: 'api-gateway-v2',\n  /** Enable batch requests */\n  API_BATCH_ENABLED: 'api-batch-enabled',\n  /** Enable GraphQL mode */\n  API_GRAPHQL_ENABLED: 'api-graphql-enabled',\n  /** Enable offline support */\n  API_OFFLINE_ENABLED: 'api-offline-enabled',\n} as const;\n\nexport type ApiFlagKey = (typeof API_FLAG_KEYS)[keyof typeof API_FLAG_KEYS];\n\n/**\n * API flag configuration\n */\nexport interface ApiFlagConfig {\n  /** Enable retry logic */\n  readonly retryEnabled: boolean;\n  /** Enable response caching */\n  readonly cacheEnabled: boolean;\n  /** Enable request deduplication */\n  readonly dedupeEnabled: boolean;\n  /** Enable rate limiting */\n  readonly rateLimitEnabled: boolean;\n  /** Use mock responses */\n  readonly mockEnabled: boolean;\n  /** Enable metrics collection */\n  readonly metricsEnabled: boolean;\n  /** Enable request logging */\n  readonly loggingEnabled: boolean;\n  /** Enable optimistic updates */\n  readonly optimisticEnabled: boolean;\n  /** Enable API versioning */\n  readonly versioningEnabled: boolean;\n  /** Enable streaming responses */\n  readonly streamingEnabled: boolean;\n  /** Use new gateway */\n  readonly gatewayV2: boolean;\n  /** Enable batch requests */\n  readonly batchEnabled: boolean;\n  /** Enable GraphQL */\n  readonly graphqlEnabled: boolean;\n  /** Enable offline support */\n  readonly offlineEnabled: boolean;\n  /** Index signature for Record<string, unknown> compatibility */\n  [key: string]: unknown;\n}\n\n/**\n * API endpoint flag configuration\n */\nexport interface EndpointFlagConfig {\n  /** Endpoint path pattern */\n  readonly path: string;\n  /** Feature flag key */\n  readonly flagKey: string;\n  /** Enabled endpoint URL */\n  readonly enabledUrl: string;\n  /** Fallback endpoint URL */\n  readonly fallbackUrl: string;\n  /** Mock data when mocking is enabled */\n  readonly mockData?: unknown;\n}\n\n/**\n * Flagged request options\n */\nexport interface FlaggedRequestOptions {\n  /** Override retry setting */\n  readonly forceRetry?: boolean;\n  /** Override cache setting */\n  readonly forceCache?: boolean;\n  /** Override mock setting */\n  readonly forceMock?: boolean;\n  /** Additional flag context */\n  readonly flagContext?: Record<string, unknown>;\n}\n\n// =============================================================================\n// Default Configuration\n// =============================================================================\n\n/**\n * Default API flag configuration\n */\nexport const DEFAULT_API_FLAG_CONFIG: ApiFlagConfig = {\n  retryEnabled: true,\n  cacheEnabled: true,\n  dedupeEnabled: true,\n  rateLimitEnabled: false,\n  mockEnabled: false,\n  metricsEnabled: true,\n  loggingEnabled: false,\n  optimisticEnabled: false,\n  versioningEnabled: false,\n  streamingEnabled: false,\n  gatewayV2: false,\n  batchEnabled: false,\n  graphqlEnabled: false,\n  offlineEnabled: false,\n};\n\n// =============================================================================\n// Library Integration\n// =============================================================================\n\n/**\n * Create API flag integration\n */\nexport function createApiFlagIntegration(): LibraryIntegration<ApiFlagConfig> {\n  return createLibraryIntegration<ApiFlagConfig>({\n    libraryId: 'api',\n    defaultConfig: DEFAULT_API_FLAG_CONFIG,\n    flagMappings: {\n      [API_FLAG_KEYS.API_RETRY_ENABLED]: 'retryEnabled',\n      [API_FLAG_KEYS.API_CACHE_ENABLED]: 'cacheEnabled',\n      [API_FLAG_KEYS.API_DEDUPE_ENABLED]: 'dedupeEnabled',\n      [API_FLAG_KEYS.API_RATE_LIMIT_ENABLED]: 'rateLimitEnabled',\n      [API_FLAG_KEYS.API_MOCK_ENABLED]: 'mockEnabled',\n      [API_FLAG_KEYS.API_METRICS_ENABLED]: 'metricsEnabled',\n      [API_FLAG_KEYS.API_LOGGING_ENABLED]: 'loggingEnabled',\n      [API_FLAG_KEYS.API_OPTIMISTIC_ENABLED]: 'optimisticEnabled',\n      [API_FLAG_KEYS.API_VERSIONING_ENABLED]: 'versioningEnabled',\n      [API_FLAG_KEYS.API_STREAMING_ENABLED]: 'streamingEnabled',\n      [API_FLAG_KEYS.API_GATEWAY_V2]: 'gatewayV2',\n      [API_FLAG_KEYS.API_BATCH_ENABLED]: 'batchEnabled',\n      [API_FLAG_KEYS.API_GRAPHQL_ENABLED]: 'graphqlEnabled',\n      [API_FLAG_KEYS.API_OFFLINE_ENABLED]: 'offlineEnabled',\n    },\n    onConfigChange: (config, changedFlags) => {\n      console.info('[API Flags] Config changed:', changedFlags, config);\n    },\n  });\n}\n\n// Initialize and register the API integration\nconst apiIntegration = createApiFlagIntegration();\nintegrationRegistry.register(apiIntegration);\n\n// =============================================================================\n// API Flag Helpers\n// =============================================================================\n\n/**\n * API flags helper object for direct flag checking\n */\nclass ApiFlagsHelper {\n  /**\n   * Set the flag getter function\n   */\n  setFlagGetter(getter: (flagKey: string) => boolean): void {\n    this.getFlag = getter;\n  }\n\n  /**\n   * Check if retry is enabled\n   */\n  isRetryEnabled(): boolean {\n    return this.getFlag(API_FLAG_KEYS.API_RETRY_ENABLED);\n  }\n\n  /**\n   * Check if caching is enabled\n   */\n  isCacheEnabled(): boolean {\n    return this.getFlag(API_FLAG_KEYS.API_CACHE_ENABLED);\n  }\n\n  /**\n   * Check if deduplication is enabled\n   */\n  isDedupeEnabled(): boolean {\n    return this.getFlag(API_FLAG_KEYS.API_DEDUPE_ENABLED);\n  }\n\n  /**\n   * Check if rate limiting is enabled\n   */\n  isRateLimitEnabled(): boolean {\n    return this.getFlag(API_FLAG_KEYS.API_RATE_LIMIT_ENABLED);\n  }\n\n  /**\n   * Check if mock mode is enabled\n   */\n  isMockEnabled(): boolean {\n    return this.getFlag(API_FLAG_KEYS.API_MOCK_ENABLED);\n  }\n\n  /**\n   * Check if metrics are enabled\n   */\n  isMetricsEnabled(): boolean {\n    return this.getFlag(API_FLAG_KEYS.API_METRICS_ENABLED);\n  }\n\n  /**\n   * Check if logging is enabled\n   */\n  isLoggingEnabled(): boolean {\n    return this.getFlag(API_FLAG_KEYS.API_LOGGING_ENABLED);\n  }\n\n  /**\n   * Check if optimistic updates are enabled\n   */\n  isOptimisticEnabled(): boolean {\n    return this.getFlag(API_FLAG_KEYS.API_OPTIMISTIC_ENABLED);\n  }\n\n  /**\n   * Check if versioning is enabled\n   */\n  isVersioningEnabled(): boolean {\n    return this.getFlag(API_FLAG_KEYS.API_VERSIONING_ENABLED);\n  }\n\n  /**\n   * Check if streaming is enabled\n   */\n  isStreamingEnabled(): boolean {\n    return this.getFlag(API_FLAG_KEYS.API_STREAMING_ENABLED);\n  }\n\n  /**\n   * Check if gateway v2 is enabled\n   */\n  isGatewayV2Enabled(): boolean {\n    return this.getFlag(API_FLAG_KEYS.API_GATEWAY_V2);\n  }\n\n  /**\n   * Check if batch requests are enabled\n   */\n  isBatchEnabled(): boolean {\n    return this.getFlag(API_FLAG_KEYS.API_BATCH_ENABLED);\n  }\n\n  /**\n   * Check if GraphQL is enabled\n   */\n  isGraphQLEnabled(): boolean {\n    return this.getFlag(API_FLAG_KEYS.API_GRAPHQL_ENABLED);\n  }\n\n  /**\n   * Check if offline support is enabled\n   */\n  isOfflineEnabled(): boolean {\n    return this.getFlag(API_FLAG_KEYS.API_OFFLINE_ENABLED);\n  }\n\n  /**\n   * Get all flag states\n   */\n  getAllFlags(): Record<ApiFlagKey, boolean> {\n    return {\n      [API_FLAG_KEYS.API_RETRY_ENABLED]: this.isRetryEnabled(),\n      [API_FLAG_KEYS.API_CACHE_ENABLED]: this.isCacheEnabled(),\n      [API_FLAG_KEYS.API_DEDUPE_ENABLED]: this.isDedupeEnabled(),\n      [API_FLAG_KEYS.API_RATE_LIMIT_ENABLED]: this.isRateLimitEnabled(),\n      [API_FLAG_KEYS.API_MOCK_ENABLED]: this.isMockEnabled(),\n      [API_FLAG_KEYS.API_METRICS_ENABLED]: this.isMetricsEnabled(),\n      [API_FLAG_KEYS.API_LOGGING_ENABLED]: this.isLoggingEnabled(),\n      [API_FLAG_KEYS.API_OPTIMISTIC_ENABLED]: this.isOptimisticEnabled(),\n      [API_FLAG_KEYS.API_VERSIONING_ENABLED]: this.isVersioningEnabled(),\n      [API_FLAG_KEYS.API_STREAMING_ENABLED]: this.isStreamingEnabled(),\n      [API_FLAG_KEYS.API_GATEWAY_V2]: this.isGatewayV2Enabled(),\n      [API_FLAG_KEYS.API_BATCH_ENABLED]: this.isBatchEnabled(),\n      [API_FLAG_KEYS.API_GRAPHQL_ENABLED]: this.isGraphQLEnabled(),\n      [API_FLAG_KEYS.API_OFFLINE_ENABLED]: this.isOfflineEnabled(),\n    };\n  }\n\n  private getFlag: (flagKey: string) => boolean = () => false;\n}\n\n/**\n * Global API flags helper instance\n */\nexport const apiFlags = new ApiFlagsHelper();\n\n// =============================================================================\n// React Hooks\n// =============================================================================\n\n/**\n * Hook to get API flag configuration\n */\nexport function useApiFlagConfig(): ApiFlagConfig {\n  const config = useLibraryFlags<ApiFlagConfig>('api');\n  return config ?? DEFAULT_API_FLAG_CONFIG;\n}\n\n/**\n * Hook to check a specific API flag\n */\nexport function useApiFlag(flagKey: ApiFlagKey): boolean {\n  const config = useApiFlagConfig();\n\n  return useMemo(() => {\n    switch (flagKey) {\n      case API_FLAG_KEYS.API_RETRY_ENABLED:\n        return config.retryEnabled;\n      case API_FLAG_KEYS.API_CACHE_ENABLED:\n        return config.cacheEnabled;\n      case API_FLAG_KEYS.API_DEDUPE_ENABLED:\n        return config.dedupeEnabled;\n      case API_FLAG_KEYS.API_RATE_LIMIT_ENABLED:\n        return config.rateLimitEnabled;\n      case API_FLAG_KEYS.API_MOCK_ENABLED:\n        return config.mockEnabled;\n      case API_FLAG_KEYS.API_METRICS_ENABLED:\n        return config.metricsEnabled;\n      case API_FLAG_KEYS.API_LOGGING_ENABLED:\n        return config.loggingEnabled;\n      case API_FLAG_KEYS.API_OPTIMISTIC_ENABLED:\n        return config.optimisticEnabled;\n      case API_FLAG_KEYS.API_VERSIONING_ENABLED:\n        return config.versioningEnabled;\n      case API_FLAG_KEYS.API_STREAMING_ENABLED:\n        return config.streamingEnabled;\n      case API_FLAG_KEYS.API_GATEWAY_V2:\n        return config.gatewayV2;\n      case API_FLAG_KEYS.API_BATCH_ENABLED:\n        return config.batchEnabled;\n      case API_FLAG_KEYS.API_GRAPHQL_ENABLED:\n        return config.graphqlEnabled;\n      case API_FLAG_KEYS.API_OFFLINE_ENABLED:\n        return config.offlineEnabled;\n      default:\n        return false;\n    }\n  }, [config, flagKey]);\n}\n\n/**\n * Hook for flagged API request configuration\n */\nexport function useFlaggedApiRequest<T>(\n  endpoint: string,\n  options: FlaggedRequestOptions = {}\n): {\n  shouldRetry: boolean;\n  shouldCache: boolean;\n  shouldMock: boolean;\n  shouldLog: boolean;\n  makeRequest: () => Promise<T>;\n} {\n  const config = useApiFlagConfig();\n\n  const shouldRetry = options.forceRetry ?? config.retryEnabled;\n  const shouldCache = options.forceCache ?? config.cacheEnabled;\n  const shouldMock = options.forceMock ?? config.mockEnabled;\n  const shouldLog = config.loggingEnabled;\n\n  const makeRequest = useCallback(async (): Promise<T> => {\n    if (shouldLog) {\n      console.info(`[API] Request to ${endpoint}`, { shouldRetry, shouldCache, shouldMock });\n    }\n\n    // Use the centralized apiClient for consistent error handling, retry logic, and auth\n    const response = await apiClient.get<T>(endpoint, {\n      meta: {\n        // Skip retry if disabled by feature flag\n        skipRetry: !shouldRetry,\n      },\n    });\n    return response.data;\n  }, [endpoint, shouldLog, shouldRetry, shouldCache, shouldMock]);\n\n  return {\n    shouldRetry,\n    shouldCache,\n    shouldMock,\n    shouldLog,\n    makeRequest,\n  };\n}\n\n// =============================================================================\n// Endpoint Flag Management\n// =============================================================================\n\nconst endpointFlags = new Map<string, EndpointFlagConfig>();\n\n/**\n * Register a flagged endpoint\n */\nexport function registerFlaggedEndpoint(config: EndpointFlagConfig): void {\n  endpointFlags.set(config.path, config);\n}\n\n/**\n * Get endpoint URL based on flag state\n */\nexport function getFlaggedEndpointUrl(\n  path: string,\n  getFlag: (flagKey: string) => boolean\n): string {\n  const config = endpointFlags.get(path);\n  if (!config) return path;\n\n  const isEnabled = getFlag(config.flagKey);\n  return isEnabled ? config.enabledUrl : config.fallbackUrl;\n}\n\n/**\n * Get mock data for endpoint if mocking is enabled\n */\nexport function getFlaggedEndpointMockData(\n  path: string,\n  isMockEnabled: boolean\n): unknown | undefined {\n  if (!isMockEnabled) return undefined;\n\n  const config = endpointFlags.get(path);\n  return config?.mockData;\n}\n\n/**\n * Clear all registered endpoint flags\n */\nexport function clearFlaggedEndpoints(): void {\n  endpointFlags.clear();\n}\n\n// =============================================================================\n// API Client Factory\n// =============================================================================\n\n/**\n * Create a flag-aware fetch wrapper\n *\n * Note: This function intentionally returns a raw fetch wrapper because:\n * 1. It provides a drop-in replacement for the native fetch API\n * 2. Users may need to use this with existing code that expects fetch\n * 3. The wrapper applies feature flag logic on top of fetch\n *\n * For new API calls, prefer using apiClient from @/lib/api directly,\n * which provides retry, authentication, and error handling out of the box.\n *\n * @see {@link @/lib/api/api-client} for the recommended API client\n */\nexport function createFlaggedFetch(\n  getFlag: (flagKey: string) => boolean\n): typeof fetch {\n  return async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {\n    const config = apiIntegration.getConfig(\n      Object.fromEntries(\n        Object.values(API_FLAG_KEYS).map((key) => [key, getFlag(key)])\n      )\n    );\n\n    let url: string;\n    if (typeof input === 'string') {\n      url = input;\n    } else if (input instanceof URL) {\n      url = input.toString();\n    } else if (input instanceof Request) {\n      ({ url } = input);\n    } else {\n      url = String(input);\n    }\n\n    // Check for mock mode\n    if (config.mockEnabled) {\n      const mockData = getFlaggedEndpointMockData(url, true);\n      if (mockData !== undefined) {\n        return new Response(JSON.stringify(mockData), {\n          status: 200,\n          headers: { 'Content-Type': 'application/json' },\n        });\n      }\n    }\n\n    // Get flagged URL\n    const flaggedUrl = getFlaggedEndpointUrl(url, getFlag);\n\n    // Log if enabled\n    if (config.loggingEnabled) {\n      console.info(`[FlaggedFetch] ${flaggedUrl}`, { config });\n    }\n\n    // Make request with retry if enabled\n    // Raw fetch is intentional here - this IS the fetch wrapper that applies flags\n    let lastError: Error | null = null;\n    const maxRetries = config.retryEnabled ? 3 : 1;\n\n    for (let attempt = 0; attempt < maxRetries; attempt++) {\n      try {\n        // Raw fetch is intentional - this wrapper implements flag-based behavior\n\n        return await fetch(flaggedUrl, init);\n      } catch (error) {\n        lastError = error instanceof Error ? error : new Error(String(error));\n        if (attempt < maxRetries - 1) {\n          await new Promise((resolve) => setTimeout(resolve, 1000 * (attempt + 1)));\n        }\n      }\n    }\n\n    throw lastError ?? new Error('Fetch failed with no error details');\n  };\n}\n\n// =============================================================================\n// Exports\n// =============================================================================\n\nexport { apiIntegration };\n"],"names":["API_FLAG_KEYS","DEFAULT_API_FLAG_CONFIG","createApiFlagIntegration","createLibraryIntegration","config","changedFlags","apiIntegration","integrationRegistry","ApiFlagsHelper","getter","apiFlags","useApiFlagConfig","useLibraryFlags","useApiFlag","flagKey","useMemo","useFlaggedApiRequest","endpoint","options","shouldRetry","shouldCache","shouldMock","shouldLog","makeRequest","useCallback","apiClient","endpointFlags","registerFlaggedEndpoint","getFlaggedEndpointUrl","path","getFlag","getFlaggedEndpointMockData","isMockEnabled","clearFlaggedEndpoints","createFlaggedFetch","input","init","key","url","mockData","flaggedUrl","lastError","maxRetries","attempt","error","resolve"],"mappings":"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"}