{"version":3,"file":"ModuleBoundary.mjs","sources":["../../../src/lib/vdom/ModuleBoundary.tsx"],"sourcesContent":["/**\n * @file Module Boundary Component\n * @module vdom/ModuleBoundary\n * @description Defines module boundaries in the React tree with sandboxed\n * execution, state isolation, error boundaries, and lifecycle management.\n * Core component for the Virtual Modular DOM system.\n *\n * @author Agent 5 - PhD Virtual DOM Expert\n * @version 1.0.0\n */\n\n/* eslint-disable react-refresh/only-export-components, react-hooks/exhaustive-deps */\n\nimport {\n  createContext,\n  useContext,\n  useRef,\n  useState,\n  useCallback,\n  useMemo,\n  useEffect,\n  type ReactNode,\n  type FC,\n  type ErrorInfo,\n  Component,\n} from 'react';\nimport {\n  type ModuleId,\n  type ModuleBoundaryConfig,\n  type ModuleBoundaryState,\n  type ModuleContextValue,\n  type ModuleAction,\n  type ModuleLifecycleHooks,\n  type HydrationConfig,\n  type ModuleSecurityConfig,\n  type SecurityContext,\n  type ModuleSlotDefinition,\n  ModuleLifecycleState,\n  type ModuleLifecycleEvent,\n  HydrationState,\n  DEFAULT_HYDRATION_CONFIG,\n} from './types';\nimport type { VirtualModuleManager } from './virtual-module';\nimport { createVirtualModule, createValidatedModuleId } from './virtual-module';\nimport { createSecuritySandbox, type SecuritySandbox } from './security-sandbox';\nimport { useModuleSystem, ModuleHierarchyProvider } from './ModuleProviderExports';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Module boundary props.\n */\nexport interface ModuleBoundaryProps {\n  /** Unique module identifier */\n  id: string;\n  /** Human-readable module name */\n  name: string;\n  /** Module version */\n  version?: string;\n  /** Child content */\n  children: ReactNode;\n  /** Slot definitions */\n  slots?: ModuleSlotDefinition[];\n  /** Lifecycle hooks */\n  lifecycle?: ModuleLifecycleHooks;\n  /** Hydration configuration */\n  hydration?: Partial<HydrationConfig>;\n  /** Security configuration */\n  security?: Partial<ModuleSecurityConfig>;\n  /** Whether module is isolated */\n  isolated?: boolean;\n  /** Performance budget (ms) */\n  performanceBudget?: number;\n  /** Enable strict mode */\n  strict?: boolean;\n  /** Fallback UI for errors */\n  fallback?: ReactNode | ((error: Error, reset: () => void) => ReactNode);\n  /** Loading UI for hydration */\n  loading?: ReactNode;\n  /** Callback when module mounts */\n  onMount?: () => void;\n  /** Callback when module unmounts */\n  onUnmount?: () => void;\n  /** Callback on error */\n  onError?: (error: Error, errorInfo: ErrorInfo) => void;\n  /** Callback on hydration complete */\n  onHydrated?: () => void;\n}\n\n// ============================================================================\n// Context\n// ============================================================================\n\n/**\n * Module context for accessing boundary information.\n */\nconst ModuleContext = createContext<ModuleContextValue | null>(null);\n\n// ============================================================================\n// Error Boundary\n// ============================================================================\n\n/**\n * Error boundary state.\n */\ninterface ErrorBoundaryState {\n  hasError: boolean;\n  error: Error | null;\n  errorInfo: ErrorInfo | null;\n}\n\n/**\n * Error boundary props.\n */\ninterface ErrorBoundaryProps {\n  children: ReactNode;\n  fallback?: ReactNode | ((error: Error, reset: () => void) => ReactNode);\n  onError?: (error: Error, errorInfo: ErrorInfo) => void;\n  onReset?: () => void;\n}\n\n/**\n * Module-scoped error boundary component.\n */\nclass ModuleErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n  constructor(props: ErrorBoundaryProps) {\n    super(props);\n    this.state = { hasError: false, error: null, errorInfo: null };\n  }\n\n  static getDerivedStateFromError(error: Error): Partial<ErrorBoundaryState> {\n    return { hasError: true, error };\n  }\n\n  override componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n    this.setState({ errorInfo });\n    this.props.onError?.(error, errorInfo);\n  }\n\n  reset = (): void => {\n    this.setState({ hasError: false, error: null, errorInfo: null });\n    this.props.onReset?.();\n  };\n\n  override render(): ReactNode {\n    if (this.state.hasError && this.state.error) {\n      const { fallback } = this.props;\n\n      if (typeof fallback === 'function') {\n        return fallback(this.state.error, this.reset);\n      }\n\n      if (fallback !== null && fallback !== undefined) {\n        return fallback;\n      }\n\n      // Default error UI\n      return (\n        <div\n          role=\"alert\"\n          style={{\n            padding: '16px',\n            backgroundColor: '#fee2e2',\n            border: '1px solid #ef4444',\n            borderRadius: '4px',\n          }}\n        >\n          <h3 style={{ margin: '0 0 8px', color: '#dc2626' }}>Module Error</h3>\n          <p style={{ margin: 0, color: '#7f1d1d' }}>{this.state.error.message}</p>\n          <button\n            onClick={this.reset}\n            style={{\n              marginTop: '12px',\n              padding: '8px 16px',\n              backgroundColor: '#dc2626',\n              color: 'white',\n              border: 'none',\n              borderRadius: '4px',\n              cursor: 'pointer',\n            }}\n          >\n            Retry\n          </button>\n        </div>\n      );\n    }\n\n    return this.props.children;\n  }\n}\n\n// ============================================================================\n// ModuleBoundary Component\n// ============================================================================\n\n/**\n * Internal module boundary implementation.\n */\nconst ModuleBoundaryInner: FC<ModuleBoundaryProps & { moduleId: ModuleId }> = ({\n  moduleId,\n  name,\n  version,\n  children,\n  slots,\n  lifecycle,\n  hydration,\n  security,\n  isolated,\n  performanceBudget,\n  strict,\n  fallback,\n  loading,\n  onMount,\n  onUnmount,\n  onError,\n  onHydrated,\n}) => {\n  // Get system context\n  const system = useModuleSystem();\n\n  // Refs\n  const containerRef = useRef<HTMLDivElement>(null);\n  const managerRef = useRef<VirtualModuleManager | null>(null);\n  const securityRef = useRef<SecuritySandbox | null>(null);\n  const mountTimeRef = useRef<number>(0);\n\n  // State\n  const [state, setState] = useState<ModuleBoundaryState>(() => ({\n    lifecycleState: ModuleLifecycleState.REGISTERED,\n    hydrationState: HydrationState.DEHYDRATED,\n    isVisible: false,\n    isActive: false,\n    error: null,\n    errorInfo: null,\n    slots: new Map(),\n    moduleState: new Map(),\n    metrics: {\n      initTime: 0,\n      mountTime: 0,\n      hydrationTime: 0,\n      renderCount: 0,\n      totalRenderTime: 0,\n      avgRenderTime: 0,\n      peakRenderTime: 0,\n      updateCount: 0,\n      memoryEstimate: 0,\n      vNodeCount: 0,\n      domNodeCount: 0,\n      lastMeasuredAt: 0,\n    },\n  }));\n\n  // Initialize manager on first render\n  if (!managerRef.current) {\n    const config: ModuleBoundaryConfig = {\n      id: moduleId,\n      name,\n      version,\n      slots,\n      lifecycle,\n      hydration: { ...DEFAULT_HYDRATION_CONFIG, ...hydration },\n      security,\n      isolated,\n      performanceBudget,\n      strict,\n    };\n\n    managerRef.current = createVirtualModule(config);\n    securityRef.current = createSecuritySandbox(moduleId, security);\n\n    // Register with registry\n    system.registry.register(config);\n  }\n\n  // Create config object\n  const config = useMemo<ModuleBoundaryConfig>(\n    () => ({\n      id: moduleId,\n      name,\n      version,\n      slots,\n      lifecycle,\n      hydration: { ...DEFAULT_HYDRATION_CONFIG, ...hydration },\n      security,\n      isolated,\n      performanceBudget,\n      strict,\n    }),\n    [\n      moduleId,\n      name,\n      version,\n      slots,\n      lifecycle,\n      hydration,\n      security,\n      isolated,\n      performanceBudget,\n      strict,\n    ]\n  );\n\n  // Create security context\n  const securityContext = useMemo<SecurityContext>(() => {\n    const security = securityRef.current;\n    if (!security) {\n      throw new Error('Security not initialized');\n    }\n    return security.createContext();\n  }, []);\n\n  // Get parent context\n  const parentContext = useContext(ModuleContext);\n\n  // Action dispatcher\n  const dispatch = useCallback((action: ModuleAction) => {\n    switch (action.type) {\n      case 'SET_STATE':\n        setState((prev) => {\n          const newModuleState = new Map(prev.moduleState);\n          newModuleState.set(action.key, action.value);\n          return { ...prev, moduleState: newModuleState };\n        });\n        break;\n\n      case 'MERGE_STATE':\n        setState((prev) => {\n          const newModuleState = new Map(prev.moduleState);\n          for (const [key, value] of Object.entries(action.state)) {\n            newModuleState.set(key, value);\n          }\n          return { ...prev, moduleState: newModuleState };\n        });\n        break;\n\n      case 'RESET_STATE':\n        setState((prev) => ({\n          ...prev,\n          moduleState: new Map(),\n        }));\n        break;\n\n      case 'SET_SLOT':\n        setState((prev) => {\n          const newSlots = new Map(prev.slots);\n          newSlots.set(action.name, action.content);\n          return { ...prev, slots: newSlots };\n        });\n        break;\n\n      case 'CLEAR_SLOT':\n        setState((prev) => {\n          const newSlots = new Map(prev.slots);\n          newSlots.delete(action.name);\n          return { ...prev, slots: newSlots };\n        });\n        break;\n\n      case 'SET_VISIBILITY':\n        setState((prev) => ({\n          ...prev,\n          isVisible: action.isVisible,\n        }));\n        break;\n\n      case 'SET_ERROR':\n        setState((prev) => ({\n          ...prev,\n          error: action.error,\n          errorInfo: action.errorInfo ?? null,\n          lifecycleState: ModuleLifecycleState.ERROR,\n        }));\n        break;\n\n      case 'CLEAR_ERROR':\n        setState((prev) => ({\n          ...prev,\n          error: null,\n          errorInfo: null,\n        }));\n        break;\n\n      case 'TRANSITION_STATE':\n        setState((prev) => ({\n          ...prev,\n          lifecycleState: action.to,\n        }));\n        break;\n\n      case 'TRIGGER_HYDRATION':\n        // Handled by hydrate function\n        break;\n    }\n  }, []);\n\n  // Slot management\n  const getSlot = useCallback(\n    (slotName: string): ReactNode | null => {\n      return state.slots.get(slotName) ?? null;\n    },\n    [state.slots]\n  );\n\n  const setSlot = useCallback(\n    (slotName: string, content: ReactNode) => {\n      dispatch({ type: 'SET_SLOT', name: slotName, content });\n    },\n    [dispatch]\n  );\n\n  // Hydration trigger\n  const hydrate = useCallback(async () => {\n    if (state.hydrationState !== HydrationState.DEHYDRATED) {\n      return;\n    }\n\n    const startTime = performance.now();\n\n    setState((prev) => ({\n      ...prev,\n      hydrationState: HydrationState.HYDRATING,\n    }));\n\n    try {\n      // Simulate hydration delay for demonstration\n      await new Promise((resolve) => setTimeout(resolve, 10));\n\n      const hydrationTime = performance.now() - startTime;\n\n      setState((prev) => ({\n        ...prev,\n        hydrationState: HydrationState.HYDRATED,\n        metrics: {\n          ...prev.metrics,\n          hydrationTime,\n          lastMeasuredAt: Date.now(),\n        },\n      }));\n\n      onHydrated?.();\n    } catch (error) {\n      setState((prev) => ({\n        ...prev,\n        hydrationState: HydrationState.FAILED,\n        error: error instanceof Error ? error : new Error(String(error)),\n      }));\n    }\n  }, [state.hydrationState, onHydrated]);\n\n  // Lifecycle event subscription\n  const subscribe = useCallback((event: ModuleLifecycleEvent, handler: () => void) => {\n    const manager = managerRef.current;\n    if (!manager) {\n      return () => {};\n    }\n    return manager.subscribe(event, handler);\n  }, []);\n\n  // Create context value\n  const contextValue = useMemo<ModuleContextValue>(\n    () => ({\n      moduleId,\n      config,\n      state,\n      security: securityContext,\n      parent: parentContext,\n      dispatch,\n      getSlot,\n      setSlot,\n      hydrate,\n      subscribe,\n    }),\n    [\n      moduleId,\n      config,\n      state,\n      securityContext,\n      parentContext,\n      dispatch,\n      getSlot,\n      setSlot,\n      hydrate,\n      subscribe,\n    ]\n  );\n\n  // Initialize and mount\n  useEffect(() => {\n    const manager = managerRef.current;\n    if (!manager) {\n      return;\n    }\n\n    mountTimeRef.current = performance.now();\n\n    const initAndMount = async (): Promise<void> => {\n      try {\n        await manager.initialize();\n\n        setState((prev) => ({\n          ...prev,\n          lifecycleState: ModuleLifecycleState.INITIALIZED,\n          metrics: {\n            ...prev.metrics,\n            initTime: performance.now() - mountTimeRef.current,\n          },\n        }));\n\n        if (containerRef.current) {\n          await manager.mount(containerRef.current);\n\n          const mountTime = performance.now() - mountTimeRef.current;\n\n          setState((prev) => ({\n            ...prev,\n            lifecycleState: ModuleLifecycleState.MOUNTED,\n            isActive: true,\n            metrics: {\n              ...prev.metrics,\n              mountTime,\n              lastMeasuredAt: Date.now(),\n            },\n          }));\n\n          onMount?.();\n\n          // Report metrics\n          system.reportMetrics(moduleId, {\n            ...state.metrics,\n            mountTime,\n            lastMeasuredAt: Date.now(),\n          });\n\n          // Check performance budget\n          system.checkBudget(moduleId, {\n            ...state.metrics,\n            mountTime,\n          });\n        }\n\n        // Auto-hydrate based on configuration\n        const hydrationConfig = config.hydration;\n        if (hydrationConfig?.trigger === 'immediate') {\n          await hydrate();\n        }\n      } catch (error) {\n        const err = error instanceof Error ? error : new Error(String(error));\n        setState((prev) => ({\n          ...prev,\n          lifecycleState: ModuleLifecycleState.ERROR,\n          error: err,\n        }));\n        onError?.(err, { componentStack: '' } as ErrorInfo);\n      }\n    };\n\n    void initAndMount();\n\n    return (): void => {\n      const cleanup = async (): Promise<void> => {\n        await manager.unmount();\n        await manager.dispose();\n      };\n      void cleanup();\n      onUnmount?.();\n      system.registry.unregister(moduleId);\n    };\n  }, []);\n\n  // Visibility observation\n  useEffect(() => {\n    const container = containerRef.current;\n    if (!container) {\n      return;\n    }\n\n    const hydrationConfig = config.hydration;\n    if (hydrationConfig?.trigger !== 'visible') {\n      return;\n    }\n\n    const observer = new IntersectionObserver(\n      (entries) => {\n        for (const entry of entries) {\n          const isVisible = entry.isIntersecting;\n\n          dispatch({ type: 'SET_VISIBILITY', isVisible });\n\n          if (isVisible && state.hydrationState === HydrationState.DEHYDRATED) {\n            void hydrate();\n          }\n        }\n      },\n      {\n        rootMargin: hydrationConfig.rootMargin ?? '100px',\n        threshold: hydrationConfig.threshold ?? 0.1,\n      }\n    );\n\n    observer.observe(container);\n\n    return () => {\n      observer.disconnect();\n    };\n  }, [config.hydration, state.hydrationState, hydrate, dispatch]);\n\n  // Render count tracking\n  useEffect(() => {\n    setState((prev) => ({\n      ...prev,\n      metrics: {\n        ...prev.metrics,\n        renderCount: prev.metrics.renderCount + 1,\n        lastMeasuredAt: Date.now(),\n      },\n    }));\n  });\n\n  // Handle error state\n  const handleError = useCallback(\n    (error: Error, errorInfo: ErrorInfo) => {\n      dispatch({ type: 'SET_ERROR', error, errorInfo });\n      void managerRef.current?.handleError(error, errorInfo);\n      onError?.(error, errorInfo);\n    },\n    [dispatch, onError]\n  );\n\n  const handleReset = useCallback(() => {\n    dispatch({ type: 'CLEAR_ERROR' });\n    managerRef.current?.clearError();\n  }, [dispatch]);\n\n  // Loading state\n  if (\n    state.hydrationState === HydrationState.PENDING ||\n    state.hydrationState === HydrationState.HYDRATING\n  ) {\n    if (loading !== null && loading !== undefined) {\n      return <>{loading}</>;\n    }\n  }\n\n  return (\n    <ModuleContext.Provider value={contextValue}>\n      <ModuleHierarchyProvider moduleId={moduleId}>\n        <ModuleErrorBoundary fallback={fallback} onError={handleError} onReset={handleReset}>\n          <div\n            ref={containerRef}\n            data-module-id={moduleId}\n            data-module-name={name}\n            data-module-state={state.lifecycleState}\n            data-hydration-state={state.hydrationState}\n            style={isolated === true ? { contain: 'content' } : undefined}\n          >\n            {children}\n          </div>\n        </ModuleErrorBoundary>\n      </ModuleHierarchyProvider>\n    </ModuleContext.Provider>\n  );\n};\n\n/**\n * Module boundary component.\n * Defines module boundaries with state isolation, error handling, and lifecycle management.\n *\n * @example\n * ```tsx\n * <ModuleBoundary\n *   id=\"dashboard\"\n *   name=\"Dashboard Module\"\n *   version=\"1.0.0\"\n *   hydration={{ trigger: 'visible', priority: 2 }}\n *   fallback={(error, reset) => (\n *     <ErrorDisplay error={error} onRetry={reset} />\n *   )}\n *   onMount={() => analytics.track('module_mounted', { name: 'dashboard' })}\n * >\n *   <DashboardContent />\n * </ModuleBoundary>\n * ```\n */\nexport const ModuleBoundary: FC<ModuleBoundaryProps> = (props) => {\n  // Validate and create module ID\n  const moduleId = useMemo(() => createValidatedModuleId(props.id), [props.id]);\n\n  return <ModuleBoundaryInner {...props} moduleId={moduleId} />;\n};\n\nModuleBoundary.displayName = 'ModuleBoundary';\n\n// ============================================================================\n// Context Hook\n// ============================================================================\n\n/**\n * Hook to access the module boundary context.\n * @throws Error if used outside a ModuleBoundary\n * @returns Module context value\n */\nexport function useModuleContext(): ModuleContextValue {\n  const context = useContext(ModuleContext);\n  if (!context) {\n    throw new Error('useModuleContext must be used within a ModuleBoundary');\n  }\n  return context;\n}\n\n/**\n * Hook to optionally access the module context.\n * @returns Module context value or null\n */\nexport function useOptionalModuleContext(): ModuleContextValue | null {\n  return useContext(ModuleContext);\n}\n"],"names":["ModuleContext","createContext","ModuleErrorBoundary","Component","props","error","errorInfo","fallback","jsxs","jsx","ModuleBoundaryInner","moduleId","name","version","children","slots","lifecycle","hydration","security","isolated","performanceBudget","strict","loading","onMount","onUnmount","onError","onHydrated","system","useModuleSystem","containerRef","useRef","managerRef","securityRef","mountTimeRef","state","setState","useState","ModuleLifecycleState","HydrationState","config","DEFAULT_HYDRATION_CONFIG","createVirtualModule","createSecuritySandbox","useMemo","securityContext","parentContext","useContext","dispatch","useCallback","action","prev","newModuleState","key","value","newSlots","getSlot","slotName","setSlot","content","hydrate","startTime","resolve","hydrationTime","subscribe","event","handler","manager","contextValue","useEffect","mountTime","err","container","hydrationConfig","observer","entries","entry","isVisible","handleError","handleReset","ModuleHierarchyProvider","ModuleBoundary","createValidatedModuleId","useModuleContext","context","useOptionalModuleContext"],"mappings":"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"}