{"version":3,"file":"feature-guard.mjs","sources":["../../../../src/lib/routing/guards/feature-guard.ts"],"sourcesContent":["/**\n * @file Feature Flag Guard\n * @description Route guard for feature flag-based access control. Controls route\n * access based on feature flag states.\n *\n * @module @/lib/routing/guards/feature-guard\n *\n * This module provides:\n * - Feature flag checking\n * - Multiple flag combinations\n * - Flag-based redirects\n * - Fallback handling\n * - Dynamic flag evaluation\n *\n * @example\n * ```typescript\n * import { createFeatureGuard, FeatureGuard } from '@/lib/routing/guards/feature-guard';\n *\n * const betaGuard = createFeatureGuard({\n *   requiredFlags: ['beta-features'],\n *   matchStrategy: 'all',\n *   fallbackPath: '/coming-soon',\n * });\n * ```\n */\n\nimport {\n  BaseRouteGuard,\n  GuardResult,\n  type GuardContext,\n  type GuardResultObject,\n} from './route-guard';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Feature flag matching strategy\n */\nexport type FeatureFlagMatchStrategy =\n  | 'any'   // Any flag must be enabled\n  | 'all'   // All flags must be enabled\n  | 'none'; // No flags should be enabled (for deprecated features)\n\n/**\n * Feature flag state\n */\nexport type FeatureFlagState = boolean | string | number | null | undefined;\n\n/**\n * Feature flag provider function\n */\nexport type FeatureFlagProvider = (\n  flagKey: string,\n  context?: GuardContext\n) => FeatureFlagState | Promise<FeatureFlagState>;\n\n/**\n * Feature guard configuration\n */\nexport interface FeatureGuardConfig {\n  /** Guard name */\n  readonly name?: string;\n  /** Required feature flags */\n  readonly requiredFlags: readonly string[];\n  /** How to match flags */\n  readonly matchStrategy?: FeatureFlagMatchStrategy;\n  /** Path to redirect when flags not met */\n  readonly fallbackPath?: string;\n  /** Custom message for fallback */\n  readonly fallbackMessage?: string;\n  /** Feature flag provider function */\n  readonly getFlag?: FeatureFlagProvider;\n  /** Default flag value when not found */\n  readonly defaultFlagValue?: boolean;\n  /** Custom flag evaluation logic */\n  readonly evaluateFlag?: (\n    flagKey: string,\n    flagValue: FeatureFlagState,\n    context: GuardContext\n  ) => boolean;\n  /** Enable caching of flag values */\n  readonly cacheFlags?: boolean;\n  /** Cache TTL in milliseconds */\n  readonly cacheTTL?: number;\n  /** Routes this guard applies to */\n  readonly routes?: readonly string[];\n  /** Routes to exclude */\n  readonly exclude?: readonly string[];\n  /** Guard priority */\n  readonly priority?: number;\n  /** Parent feature flag for this guard */\n  readonly featureFlag?: string;\n}\n\n/**\n * Feature flag check result\n */\nexport interface FeatureFlagCheckResult {\n  /** Whether flags allow access */\n  readonly hasAccess: boolean;\n  /** Evaluated flag states */\n  readonly flagStates: Readonly<Record<string, FeatureFlagState>>;\n  /** Enabled flags */\n  readonly enabledFlags: readonly string[];\n  /** Disabled flags */\n  readonly disabledFlags: readonly string[];\n  /** Strategy used */\n  readonly strategy: FeatureFlagMatchStrategy;\n  /** Whether result came from cache */\n  readonly fromCache: boolean;\n}\n\n/**\n * Flag cache entry\n */\ninterface FlagCacheEntry {\n  readonly value: FeatureFlagState;\n  readonly expiresAt: number;\n}\n\n// =============================================================================\n// Constants\n// =============================================================================\n\n/**\n * Default feature guard configuration\n */\nexport const DEFAULT_FEATURE_CONFIG: Partial<FeatureGuardConfig> = {\n  name: 'feature',\n  matchStrategy: 'all',\n  fallbackPath: '/feature-unavailable',\n  fallbackMessage: 'This feature is not available',\n  defaultFlagValue: false,\n  cacheFlags: true,\n  cacheTTL: 60000, // 1 minute\n  priority: 5, // Run early\n};\n\n// =============================================================================\n// FeatureGuard Class\n// =============================================================================\n\n/**\n * Feature flag route guard\n *\n * @example\n * ```typescript\n * const guard = new FeatureGuard({\n *   requiredFlags: ['new-dashboard', 'beta-analytics'],\n *   matchStrategy: 'all',\n *   getFlag: async (key) => featureFlagService.isEnabled(key),\n * });\n *\n * const result = await guard.execute('canActivate', context);\n * ```\n */\nexport class FeatureGuard extends BaseRouteGuard {\n  private readonly featureConfig: FeatureGuardConfig;\n  private readonly flagCache: Map<string, FlagCacheEntry> = new Map();\n\n  constructor(config: FeatureGuardConfig) {\n    const mergedConfig = { ...DEFAULT_FEATURE_CONFIG, ...config };\n\n    super({\n      name: mergedConfig.name ?? 'feature',\n      description: `Feature guard - requires: ${config.requiredFlags.join(', ')}`,\n      priority: mergedConfig.priority,\n      routes: mergedConfig.routes,\n      exclude: mergedConfig.exclude,\n      featureFlag: mergedConfig.featureFlag,\n      canActivate: async (context) => this.checkFeatureAccess(context),\n      canMatch: async (context) => this.checkFeatureAccess(context),\n      canLoad: async (context) => this.checkFeatureAccess(context),\n    });\n\n    this.featureConfig = mergedConfig;\n  }\n\n  /**\n   * Get required flags\n   */\n  getRequiredFlags(): readonly string[] {\n    return this.featureConfig.requiredFlags;\n  }\n\n  /**\n   * Get match strategy\n   */\n  getMatchStrategy(): FeatureFlagMatchStrategy {\n    return this.featureConfig.matchStrategy ?? 'all';\n  }\n\n  /**\n   * Check a single flag without full guard execution\n   */\n  async checkFlag(flagKey: string, context: GuardContext): Promise<boolean> {\n    const { value } = await this.getFlagValue(flagKey, context);\n    return this.isFlagEnabled(flagKey, value, context);\n  }\n\n  /**\n   * Clear flag cache\n   */\n  clearCache(): void {\n    this.flagCache.clear();\n  }\n\n  /**\n   * Invalidate specific flag in cache\n   */\n  invalidateFlag(flagKey: string): void {\n    this.flagCache.delete(flagKey);\n  }\n\n  /**\n   * Check if required features are enabled\n   */\n  private async checkFeatureAccess(context: GuardContext): Promise<GuardResultObject> {\n    const checkResult = await this.performFeatureCheck(context);\n\n    if (!checkResult.hasAccess) {\n      return this.handleFeatureDisabled(context, checkResult);\n    }\n\n    return GuardResult.allow({ featureCheck: checkResult });\n  }\n\n  /**\n   * Perform feature flag check\n   */\n  private async performFeatureCheck(context: GuardContext): Promise<FeatureFlagCheckResult> {\n    const strategy = this.featureConfig.matchStrategy ?? 'all';\n    const {requiredFlags} = this.featureConfig;\n\n    const flagStates: Record<string, FeatureFlagState> = {};\n    const enabledFlags: string[] = [];\n    const disabledFlags: string[] = [];\n    let fromCache = true;\n\n    for (const flagKey of requiredFlags) {\n      const { value, cached } = await this.getFlagValue(flagKey, context);\n      flagStates[flagKey] = value;\n      if (!cached) fromCache = false;\n\n      const isEnabled = this.isFlagEnabled(flagKey, value, context);\n      if (isEnabled) {\n        enabledFlags.push(flagKey);\n      } else {\n        disabledFlags.push(flagKey);\n      }\n    }\n\n    let hasAccess = false;\n    switch (strategy) {\n      case 'any':\n        hasAccess = enabledFlags.length > 0;\n        break;\n      case 'all':\n        hasAccess = disabledFlags.length === 0;\n        break;\n      case 'none':\n        hasAccess = enabledFlags.length === 0;\n        break;\n    }\n\n    return {\n      hasAccess,\n      flagStates,\n      enabledFlags,\n      disabledFlags,\n      strategy,\n      fromCache,\n    };\n  }\n\n  /**\n   * Get flag value (with caching)\n   */\n  private async getFlagValue(\n    flagKey: string,\n    context: GuardContext\n  ): Promise<{ value: FeatureFlagState; cached: boolean }> {\n    // Check cache first\n    if (this.featureConfig.cacheFlags === true) {\n      const cached = this.flagCache.get(flagKey);\n      if (cached && Date.now() < cached.expiresAt) {\n        return { value: cached.value, cached: true };\n      }\n    }\n\n    // Get fresh value\n    let value: FeatureFlagState;\n\n    if (this.featureConfig.getFlag) {\n      value = await this.featureConfig.getFlag(flagKey, context);\n    } else if (context.features) {\n      value = context.features[flagKey];\n    } else {\n      value = this.featureConfig.defaultFlagValue;\n    }\n\n    // Update cache\n    if (this.featureConfig.cacheFlags === true) {\n      this.flagCache.set(flagKey, {\n        value,\n        expiresAt: Date.now() + (this.featureConfig.cacheTTL ?? 60000),\n      });\n    }\n\n    return { value, cached: false };\n  }\n\n  /**\n   * Determine if a flag is enabled\n   */\n  private isFlagEnabled(\n    flagKey: string,\n    value: FeatureFlagState,\n    context: GuardContext\n  ): boolean {\n    // Use custom evaluator if provided\n    if (this.featureConfig.evaluateFlag) {\n      return this.featureConfig.evaluateFlag(flagKey, value, context);\n    }\n\n    // Default evaluation\n    if (value === undefined || value === null) {\n      return this.featureConfig.defaultFlagValue ?? false;\n    }\n\n    if (typeof value === 'boolean') {\n      return value;\n    }\n\n    if (typeof value === 'string') {\n      return value.toLowerCase() === 'true' || value === '1' || value === 'enabled';\n    }\n\n    return value > 0;\n\n  }\n\n  /**\n   * Handle disabled feature\n   */\n  private handleFeatureDisabled(\n    _context: GuardContext,\n    checkResult: FeatureFlagCheckResult\n  ): GuardResultObject {\n    const fallbackPath = this.featureConfig.fallbackPath ?? '/feature-unavailable';\n    const message = this.featureConfig.fallbackMessage ?? 'This feature is not available';\n\n    return GuardResult.redirect(fallbackPath, {\n      state: {\n        reason: message,\n        requiredFlags: this.featureConfig.requiredFlags,\n        disabledFlags: checkResult.disabledFlags,\n        strategy: checkResult.strategy,\n      },\n    });\n  }\n}\n\n// =============================================================================\n// Factory Functions\n// =============================================================================\n\n/**\n * Create a feature guard\n *\n * @param config - Guard configuration\n * @returns FeatureGuard instance\n */\nexport function createFeatureGuard(config: FeatureGuardConfig): FeatureGuard {\n  return new FeatureGuard(config);\n}\n\n/**\n * Create a guard requiring a single feature flag\n *\n * @param flag - Required flag\n * @param options - Additional options\n * @returns FeatureGuard instance\n */\nexport function requireFeature(\n  flag: string,\n  options: Partial<Omit<FeatureGuardConfig, 'requiredFlags'>> = {}\n): FeatureGuard {\n  return new FeatureGuard({\n    ...options,\n    requiredFlags: [flag],\n    matchStrategy: 'any',\n  });\n}\n\n/**\n * Create a guard requiring any of the specified features\n *\n * @param flags - Feature flags (any one required)\n * @param options - Additional options\n * @returns FeatureGuard instance\n */\nexport function requireAnyFeature(\n  flags: readonly string[],\n  options: Partial<Omit<FeatureGuardConfig, 'requiredFlags' | 'matchStrategy'>> = {}\n): FeatureGuard {\n  return new FeatureGuard({\n    ...options,\n    requiredFlags: flags,\n    matchStrategy: 'any',\n  });\n}\n\n/**\n * Create a guard requiring all specified features\n *\n * @param flags - Feature flags (all required)\n * @param options - Additional options\n * @returns FeatureGuard instance\n */\nexport function requireAllFeatures(\n  flags: readonly string[],\n  options: Partial<Omit<FeatureGuardConfig, 'requiredFlags' | 'matchStrategy'>> = {}\n): FeatureGuard {\n  return new FeatureGuard({\n    ...options,\n    requiredFlags: flags,\n    matchStrategy: 'all',\n  });\n}\n\n/**\n * Create a guard for deprecated features (must be disabled)\n *\n * @param flags - Deprecated feature flags\n * @param options - Additional options\n * @returns FeatureGuard instance\n */\nexport function deprecatedFeature(\n  flags: readonly string[],\n  options: Partial<Omit<FeatureGuardConfig, 'requiredFlags' | 'matchStrategy'>> = {}\n): FeatureGuard {\n  return new FeatureGuard({\n    ...options,\n    requiredFlags: flags,\n    matchStrategy: 'none',\n    fallbackMessage: 'This feature has been deprecated',\n  });\n}\n\n/**\n * Create a beta feature guard\n *\n * @param featureName - Name of the beta feature\n * @param options - Additional options\n * @returns FeatureGuard instance\n */\nexport function betaFeature(\n  featureName: string,\n  options: Partial<Omit<FeatureGuardConfig, 'requiredFlags'>> = {}\n): FeatureGuard {\n  return new FeatureGuard({\n    name: `beta-${featureName}`,\n    requiredFlags: [`beta-${featureName}`],\n    matchStrategy: 'any',\n    fallbackPath: '/beta-program',\n    fallbackMessage: 'This feature is currently in beta',\n    ...options,\n  });\n}\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\n/**\n * Create a feature flag provider from a static config\n *\n * @param flags - Static flag configuration\n * @returns Feature flag provider function\n */\nexport function createStaticFlagProvider(\n  flags: Record<string, FeatureFlagState>\n): FeatureFlagProvider {\n  return (flagKey: string) => flags[flagKey];\n}\n\n/**\n * Create a feature flag provider from localStorage\n *\n * @param prefix - Key prefix in localStorage\n * @returns Feature flag provider function\n */\nexport function createLocalStorageFlagProvider(\n  prefix = 'feature:'\n): FeatureFlagProvider {\n  return (flagKey: string) => {\n    try {\n      const value = localStorage.getItem(`${prefix}${flagKey}`);\n      if (value === null) return undefined;\n      return JSON.parse(value) as FeatureFlagState;\n    } catch {\n      return undefined;\n    }\n  };\n}\n\n/**\n * Create a feature flag provider from URL parameters\n *\n * @param paramPrefix - URL parameter prefix\n * @returns Feature flag provider function\n */\nexport function createUrlFlagProvider(\n  paramPrefix = 'ff_'\n): FeatureFlagProvider {\n  return (flagKey: string, context?: GuardContext) => {\n    if (context?.query) {\n      const paramKey = `${paramPrefix}${flagKey}`;\n      const value = context.query[paramKey];\n      if (value === 'true' || value === '1') return true;\n      if (value === 'false' || value === '0') return false;\n      return value;\n    }\n    return undefined;\n  };\n}\n\n/**\n * Combine multiple flag providers (first defined value wins)\n *\n * @param providers - Array of providers\n * @returns Combined provider function\n */\nexport function combineFlagProviders(\n  providers: readonly FeatureFlagProvider[]\n): FeatureFlagProvider {\n  return async (flagKey: string, context?: GuardContext) => {\n    for (const provider of providers) {\n      const value = await provider(flagKey, context);\n      if (value !== undefined) {\n        return value;\n      }\n    }\n    return undefined;\n  };\n}\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\n/**\n * Type guard for FeatureGuard\n */\nexport function isFeatureGuard(value: unknown): value is FeatureGuard {\n  return value instanceof FeatureGuard;\n}\n\n/**\n * Type guard for FeatureFlagCheckResult\n */\nexport function isFeatureFlagCheckResult(value: unknown): value is FeatureFlagCheckResult {\n  return (\n    typeof value === 'object' &&\n    value !== null &&\n    'hasAccess' in value &&\n    'flagStates' in value &&\n    'enabledFlags' in value &&\n    'strategy' in value\n  );\n}\n"],"names":["DEFAULT_FEATURE_CONFIG","FeatureGuard","BaseRouteGuard","config","mergedConfig","context","flagKey","value","checkResult","GuardResult","strategy","requiredFlags","flagStates","enabledFlags","disabledFlags","fromCache","cached","hasAccess","_context","fallbackPath","message","createFeatureGuard","requireFeature","flag","options","requireAnyFeature","flags","requireAllFeatures","deprecatedFeature","betaFeature","featureName","createStaticFlagProvider","createLocalStorageFlagProvider","prefix","createUrlFlagProvider","paramPrefix","paramKey","combineFlagProviders","providers","provider","isFeatureGuard","isFeatureFlagCheckResult"],"mappings":"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"}