{"version":3,"file":"FlagConfigurable.mjs","sources":["../../../../src/lib/flags/integration/FlagConfigurable.tsx"],"sourcesContent":["/**\n * @fileoverview FlagConfigurable wrapper component for universal flag control.\n *\n * This component provides a universal wrapper that makes any component or element\n * configurable via feature flags. It supports fallback rendering, loading states,\n * metadata exposure, and A/B testing capabilities.\n *\n * @module flags/integration/FlagConfigurable\n *\n * @example\n * ```tsx\n * import { FlagConfigurable } from '@/lib/flags/integration/FlagConfigurable';\n *\n * // Basic usage\n * <FlagConfigurable flagKey=\"new-feature\">\n *   <NewFeatureComponent />\n * </FlagConfigurable>\n *\n * // With fallback\n * <FlagConfigurable\n *   flagKey=\"new-checkout\"\n *   fallback={<OldCheckout />}\n * >\n *   <NewCheckout />\n * </FlagConfigurable>\n *\n * // With render props\n * <FlagConfigurable flagKey=\"dark-mode\">\n *   {({ isEnabled, flagKey, metadata }) => (\n *     <div data-flag={flagKey} data-enabled={isEnabled}>\n *       {isEnabled ? <DarkTheme /> : <LightTheme />}\n *     </div>\n *   )}\n * </FlagConfigurable>\n * ```\n */\n\nimport React, {\n  createContext,\n  type ReactNode,\n  type ComponentType,\n  type ReactElement,\n  useMemo,\n  useEffect,\n  useCallback,\n  useContext,\n  useState,\n} from 'react';\nimport { useFeatureFlag } from '../useFeatureFlag';\nimport type { FlagKey } from '../flag-keys';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Flag metadata exposed to children\n */\nexport interface FlagMetadata {\n  /** The feature flag key */\n  readonly flagKey: string;\n  /** Whether the flag is enabled */\n  readonly isEnabled: boolean;\n  /** Source of the flag value */\n  readonly source: 'flag' | 'override' | 'default';\n  /** Timestamp when flag was evaluated */\n  readonly evaluatedAt: number;\n  /** Variant name if applicable */\n  readonly variant?: string;\n}\n\n/**\n * Render props function type\n */\nexport type FlagRenderProps = {\n  /** Whether the flag is enabled */\n  isEnabled: boolean;\n  /** The feature flag key */\n  flagKey: string;\n  /** Additional metadata */\n  metadata: FlagMetadata;\n  /** Toggle function (if available) */\n  toggle?: () => void;\n};\n\n/**\n * Props for FlagConfigurable component\n */\nexport interface FlagConfigurableProps {\n  /** Feature flag key to check */\n  readonly flagKey: FlagKey | string;\n  /** Content to render when flag is enabled (or render function) */\n  readonly children: ReactNode | ((props: FlagRenderProps) => ReactNode);\n  /** Content to render when flag is disabled */\n  readonly fallback?: ReactNode;\n  /** Invert the flag check (show children when disabled) */\n  readonly invert?: boolean;\n  /** Custom flag getter function */\n  readonly getFlag?: (flagKey: string) => boolean;\n  /** Callback when flag is evaluated */\n  readonly onEvaluation?: (metadata: FlagMetadata) => void;\n  /** Callback when component is exposed (rendered) */\n  readonly onExposure?: (metadata: FlagMetadata) => void;\n  /** Track exposure for analytics */\n  readonly trackExposure?: boolean;\n  /** Variant identifier for A/B testing */\n  readonly variant?: string;\n  /** Loading component while flag is being evaluated */\n  readonly loading?: ReactNode;\n  /** Wrapper element type */\n  readonly as?: keyof React.JSX.IntrinsicElements;\n  /** Additional wrapper props */\n  readonly wrapperProps?: Record<string, unknown>;\n  /** Debug mode - logs flag evaluation */\n  readonly debug?: boolean;\n  /** Minimum display time to prevent flashing (ms) */\n  readonly minDisplayTime?: number;\n}\n\n/**\n * Context for nested flag access\n */\nexport interface FlagConfigurableContextValue {\n  /** Parent flag key */\n  readonly parentFlagKey: string | null;\n  /** Parent flag enabled state */\n  readonly parentEnabled: boolean;\n  /** Depth of nesting */\n  readonly depth: number;\n  /** Get configuration value */\n  readonly getConfig: (\n    flagKey: string\n  ) => import('../../contexts/FlagConfigurableContext').ConfigurableValue | undefined;\n  /** Set configuration value */\n  readonly setConfig: (\n    flagKey: string,\n    value: import('../../contexts/FlagConfigurableContext').ConfigurableValue\n  ) => void;\n  /** Check if configuration exists */\n  readonly hasConfig: (flagKey: string) => boolean;\n  /** Get all configurations */\n  readonly getAllConfigs: () => import('../../contexts/FlagConfigurableContext').FlagConfiguration[];\n  /** Render variant */\n  readonly renderVariant: (flagKey: string, variants: Record<string, ReactNode>) => ReactNode;\n}\n\n/**\n * Context for FlagConfigurable\n */\nconst FlagConfigurableContext = createContext<FlagConfigurableContextValue>({\n  parentFlagKey: null,\n  parentEnabled: true,\n  depth: 0,\n  getConfig: () => null,\n  setConfig: () => {},\n  hasConfig: () => false,\n  getAllConfigs: () => [],\n  renderVariant: () => null,\n});\n\n// =============================================================================\n// Context\n// =============================================================================\n\n/**\n * Hook to access parent flag context\n */\n// eslint-disable-next-line react-refresh/only-export-components -- Utility hook needed alongside components\nexport function useFlagConfigurableContext(): FlagConfigurableContextValue {\n  return useContext(FlagConfigurableContext);\n}\n\n// =============================================================================\n// Component\n// =============================================================================\n\n/**\n * Universal flag-configurable wrapper component\n */\nexport function FlagConfigurable({\n  flagKey,\n  children,\n  fallback = null,\n  invert = false,\n  getFlag,\n  onEvaluation,\n  onExposure,\n  trackExposure = false,\n  variant,\n  as: WrapperElement,\n  wrapperProps = {},\n}: FlagConfigurableProps): ReactElement | null {\n  const parentContext = useFlagConfigurableContext();\n\n  // Get flag value using hook or custom getter\n  const hookEnabled = useFeatureFlag(flagKey);\n  const isEnabled = getFlag ? getFlag(flagKey) : hookEnabled;\n\n  // Apply inversion\n  const shouldRender = invert ? !isEnabled : isEnabled;\n\n  // Capture evaluation timestamp (stable across re-renders using lazy initialization)\n  const [evaluatedAt] = useState<number>(() => Date.now());\n\n  // Create metadata\n  const metadata = useMemo<FlagMetadata>(\n    () => ({\n      flagKey,\n      isEnabled,\n      source: 'flag',\n      evaluatedAt,\n      variant: variant ?? (isEnabled ? 'enabled' : 'disabled'),\n    }),\n    [flagKey, isEnabled, variant, evaluatedAt]\n  );\n\n  // Debug logging\n  useEffect(() => {\n    // if (debug) {\n    //   console.log(`[FlagConfigurable:${flagKey}]`, {\n    //     isEnabled,\n    //     shouldRender,\n    //     invert,\n    //     depth: parentContext.depth + 1,\n    //   });\n    // }\n  }, [flagKey, isEnabled, shouldRender, invert, parentContext.depth]);\n\n  // Evaluation callback\n  useEffect(() => {\n    onEvaluation?.(metadata);\n  }, [metadata, onEvaluation]);\n\n  // Exposure callback\n  useEffect(() => {\n    if (shouldRender) {\n      onExposure?.(metadata);\n\n      if (trackExposure) {\n        // Track exposure event (integrate with analytics)\n        try {\n          const event = new CustomEvent('flag-exposure', {\n            detail: metadata,\n          });\n          window.dispatchEvent(event);\n        } catch {\n          // Silent fail in SSR\n        }\n      }\n    }\n  }, [shouldRender, metadata, onExposure, trackExposure]);\n\n  // Create render props\n  const renderProps = useMemo<FlagRenderProps>(\n    () => ({\n      isEnabled,\n      flagKey,\n      metadata,\n    }),\n    [isEnabled, flagKey, metadata]\n  );\n\n  // Context value for nested components\n  const contextValue = useMemo<FlagConfigurableContextValue>(\n    () => ({\n      parentFlagKey: flagKey,\n      parentEnabled: isEnabled,\n      depth: parentContext.depth + 1,\n      getConfig: parentContext.getConfig,\n      setConfig: parentContext.setConfig,\n      hasConfig: parentContext.hasConfig,\n      getAllConfigs: parentContext.getAllConfigs,\n      renderVariant: parentContext.renderVariant,\n    }),\n    [flagKey, isEnabled, parentContext]\n  );\n\n  // Determine content to render\n  const content = useMemo((): ReactNode => {\n    if (typeof children === 'function') {\n      return children(renderProps);\n    }\n    return shouldRender ? children : fallback;\n  }, [children, shouldRender, fallback, renderProps]);\n\n  // Wrap with element if specified\n  const wrappedContent = WrapperElement ? (\n    <WrapperElement {...wrapperProps} data-flag={flagKey} data-enabled={isEnabled}>\n      {content}\n    </WrapperElement>\n  ) : (\n    <>{content}</>\n  );\n\n  return (\n    <FlagConfigurableContext.Provider value={contextValue}>\n      {wrappedContent}\n    </FlagConfigurableContext.Provider>\n  );\n}\n\n// =============================================================================\n// HOC Version\n// =============================================================================\n\n/**\n * Options for withFlagConfigurable HOC\n */\nexport interface WithFlagConfigurableOptions {\n  /** Feature flag key */\n  readonly flagKey: FlagKey | string;\n  /** Fallback component when flag is disabled */\n  readonly fallback?: ComponentType;\n  /** Invert the flag check */\n  readonly invert?: boolean;\n  /** Custom flag getter */\n  readonly getFlag?: (flagKey: string) => boolean;\n  /** Track exposure */\n  readonly trackExposure?: boolean;\n}\n\n/**\n * HOC to wrap a component with flag configuration\n */\n// eslint-disable-next-line react-refresh/only-export-components -- HOC factory function\nexport function withFlagConfigurable<P extends object>(\n  Component: ComponentType<P>,\n  options: WithFlagConfigurableOptions\n): ComponentType<P> {\n  const { flagKey, fallback: FallbackComponent, invert, getFlag, trackExposure } = options;\n\n  function WithFlagConfigurable(props: P): ReactElement {\n    return (\n      <FlagConfigurable\n        flagKey={flagKey}\n        fallback={FallbackComponent ? <FallbackComponent /> : null}\n        invert={invert}\n        getFlag={getFlag}\n        trackExposure={trackExposure}\n      >\n        <Component {...props} />\n      </FlagConfigurable>\n    );\n  }\n\n  WithFlagConfigurable.displayName = `WithFlagConfigurable(${Component.displayName ?? Component.name ?? 'Component'})`;\n\n  return WithFlagConfigurable;\n}\n\n// =============================================================================\n// Specialized Variants\n// =============================================================================\n\n/**\n * Props for FlagConfigurableAB (A/B testing variant)\n */\nexport interface FlagConfigurableABProps {\n  /** Feature flag key */\n  readonly flagKey: FlagKey | string;\n  /** Variant A content (flag disabled) */\n  readonly variantA: ReactNode;\n  /** Variant B content (flag enabled) */\n  readonly variantB: ReactNode;\n  /** Track exposure for both variants */\n  readonly trackExposure?: boolean;\n  /** Custom flag getter */\n  readonly getFlag?: (flagKey: string) => boolean;\n  /** Callback on variant selection */\n  readonly onVariantSelected?: (variant: 'A' | 'B', metadata: FlagMetadata) => void;\n}\n\n/**\n * A/B testing variant of FlagConfigurable\n */\nexport function FlagConfigurableAB({\n  flagKey,\n  variantA,\n  variantB,\n  trackExposure = true,\n  getFlag,\n  onVariantSelected,\n}: FlagConfigurableABProps): ReactElement {\n  const handleExposure = useCallback(\n    (metadata: FlagMetadata) => {\n      const selectedVariant = metadata.isEnabled ? 'B' : 'A';\n      onVariantSelected?.(selectedVariant, metadata);\n    },\n    [onVariantSelected]\n  );\n\n  return (\n    <FlagConfigurable\n      flagKey={flagKey}\n      fallback={variantA}\n      trackExposure={trackExposure}\n      getFlag={getFlag}\n      onExposure={handleExposure}\n      variant=\"B\"\n    >\n      {variantB}\n    </FlagConfigurable>\n  );\n}\n\n/**\n * Props for FlagConfigurableMulti (multi-variant)\n */\nexport interface FlagConfigurableMultiProps {\n  /** Flag keys to check */\n  readonly flagKeys: (FlagKey | string)[];\n  /** Variants to render based on flag states */\n  readonly variants: Record<string, ReactNode>;\n  /** Default variant key if no match */\n  readonly defaultVariant?: string;\n  /** Strategy for combining flags */\n  readonly strategy?: 'first' | 'all';\n  /** Custom flag getter */\n  readonly getFlag?: (flagKey: string) => boolean;\n}\n\n/**\n * Multi-variant flag configurable\n */\nexport function FlagConfigurableMulti({\n  flagKeys,\n  variants,\n  defaultVariant = 'default',\n  strategy = 'first',\n  getFlag: customGetFlag,\n}: FlagConfigurableMultiProps): ReactElement | null {\n  const hookGetFlag = (): boolean => {\n    // This is a simplified version - in real use, integrate with useFeatureFlags\n    return false;\n  };\n\n  const getFlag = customGetFlag ?? hookGetFlag;\n\n  const selectedVariant = useMemo(() => {\n    if (strategy === 'first') {\n      // Return first enabled flag's variant\n      for (const key of flagKeys) {\n        if (getFlag(key) && variants[key] !== undefined) {\n          return key;\n        }\n      }\n    } else {\n      // Return variant based on all flags being enabled\n      const allEnabled = flagKeys.every((key) => getFlag(key));\n      if (allEnabled) {\n        return 'all';\n      }\n    }\n    return defaultVariant;\n  }, [flagKeys, variants, strategy, defaultVariant, getFlag]);\n\n  return <>{variants[selectedVariant] ?? variants[defaultVariant] ?? null}</>;\n}\n\n/**\n * Props for FlagConfigurableGated (gate with redirect)\n */\nexport interface FlagConfigurableGatedProps {\n  /** Feature flag key */\n  readonly flagKey: FlagKey | string;\n  /** Content to render when flag is enabled */\n  readonly children: ReactNode;\n  /** Redirect path when flag is disabled */\n  readonly redirectTo?: string;\n  /** Fallback content when not redirecting */\n  readonly fallback?: ReactNode;\n  /** Custom flag getter */\n  readonly getFlag?: (flagKey: string) => boolean;\n  /** Custom redirect handler */\n  readonly onRedirect?: (path: string) => void;\n}\n\n/**\n * Gated access variant with redirect support\n */\nexport function FlagConfigurableGated({\n  flagKey,\n  children,\n  redirectTo,\n  fallback = null,\n  getFlag,\n  onRedirect,\n}: FlagConfigurableGatedProps): ReactElement | null {\n  const hookEnabled = useFeatureFlag(flagKey);\n  const isEnabled = getFlag ? getFlag(flagKey) : hookEnabled;\n\n  useEffect(() => {\n    if (!isEnabled && redirectTo !== undefined && redirectTo !== '') {\n      if (onRedirect !== undefined) {\n        onRedirect(redirectTo);\n      } else if (typeof window !== 'undefined') {\n        window.location.href = redirectTo;\n      }\n    }\n  }, [isEnabled, redirectTo, onRedirect]);\n\n  if (!isEnabled) {\n    if (redirectTo !== undefined && redirectTo !== '') {\n      return null; // Will redirect\n    }\n    return <>{fallback}</>;\n  }\n\n  return <>{children}</>;\n}\n\n// =============================================================================\n// Utility Components\n// =============================================================================\n\n/**\n * Debug component to show flag state\n */\nexport function FlagConfigurableDebug({\n  flagKey,\n  getFlag,\n}: {\n  flagKey: FlagKey | string;\n  getFlag?: (flagKey: string) => boolean;\n}): ReactElement {\n  const hookEnabled = useFeatureFlag(flagKey);\n  const isEnabled = getFlag ? getFlag(flagKey) : hookEnabled;\n\n  return (\n    <div\n      style={{\n        padding: '8px',\n        margin: '4px',\n        backgroundColor: isEnabled ? '#e6ffe6' : '#ffe6e6',\n        border: `1px solid ${isEnabled ? '#00cc00' : '#cc0000'}`,\n        borderRadius: '4px',\n        fontSize: '12px',\n        fontFamily: 'monospace',\n      }}\n    >\n      <strong>Flag:</strong> {flagKey}\n      <br />\n      <strong>Enabled:</strong> {String(isEnabled)}\n    </div>\n  );\n}\n\n/**\n * Component to list all flags and their states\n */\nexport function FlagConfigurableList({\n  flagKeys,\n  getFlag,\n}: {\n  flagKeys: (FlagKey | string)[];\n  getFlag?: (flagKey: string) => boolean;\n}): ReactElement {\n  return (\n    <div style={{ display: 'flex', flexDirection: 'column', gap: '4px' }}>\n      {flagKeys.map((key) => (\n        <FlagConfigurableDebug key={key} flagKey={key} getFlag={getFlag} />\n      ))}\n    </div>\n  );\n}\n"],"names":["FlagConfigurableContext","createContext","useFlagConfigurableContext","useContext","FlagConfigurable","flagKey","children","fallback","invert","getFlag","onEvaluation","onExposure","trackExposure","variant","WrapperElement","wrapperProps","parentContext","hookEnabled","useFeatureFlag","isEnabled","shouldRender","evaluatedAt","useState","metadata","useMemo","useEffect","event","renderProps","contextValue","content","wrappedContent","jsx","withFlagConfigurable","Component","options","FallbackComponent","WithFlagConfigurable","props","FlagConfigurableAB","variantA","variantB","onVariantSelected","handleExposure","useCallback","selectedVariant","FlagConfigurableMulti","flagKeys","variants","defaultVariant","strategy","customGetFlag","key","FlagConfigurableGated","redirectTo","onRedirect","FlagConfigurableDebug","jsxs","FlagConfigurableList"],"mappings":"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"}