{"version":3,"file":"provider-orchestrator.mjs","sources":["../../../src/lib/coordination/provider-orchestrator.tsx"],"sourcesContent":["/* eslint-disable react-refresh/only-export-components */\n/**\n * @file Provider Orchestrator\n * @module coordination/provider-orchestrator\n * @description PhD-level automated provider composition and nesting.\n *\n * Implements sophisticated provider orchestration with:\n * - Automatic dependency-based ordering\n * - Conditional provider inclusion\n * - Error boundary integration\n * - Loading state management\n * - Provider props injection\n * - Hot-swappable providers\n *\n * @author Agent 5 - PhD TypeScript Architect\n * @version 1.0.0\n */\n\nimport {\n  createElement,\n  Fragment,\n  Suspense,\n  useEffect,\n  type ReactNode,\n  type ComponentType,\n  type FC,\n} from 'react';\n\nimport type { ProviderDefinition, ProviderOrchestratorConfig } from './types';\n\n// Re-export for convenience\nexport { DefaultLoadingFallback, DefaultErrorFallback } from './default-components';\nexport type { LoadingFallbackProps, ErrorFallbackProps } from './default-components';\n\n// Import for internal use\nimport { DefaultLoadingFallback } from './default-components';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Provider registry entry with runtime state.\n */\ninterface ProviderEntry extends ProviderDefinition {\n  /** Resolved component */\n  resolvedComponent: ComponentType<{ children: ReactNode }>;\n  /** Whether provider is enabled */\n  isEnabled: boolean;\n  /** Resolution order */\n  order: number;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Topological sort for provider dependencies.\n */\nfunction sortProvidersByDependencies(providers: ProviderDefinition[]): ProviderDefinition[] {\n  const sorted: ProviderDefinition[] = [];\n  const visited = new Set<string>();\n  const visiting = new Set<string>();\n\n  const providerMap = new Map(providers.map((p) => [p.id, p]));\n\n  function visit(id: string): void {\n    if (visited.has(id)) return;\n    if (visiting.has(id)) {\n      console.warn(`[ProviderOrchestrator] Circular dependency detected: ${id}`);\n      return;\n    }\n\n    const provider = providerMap.get(id);\n    if (!provider) return;\n\n    visiting.add(id);\n\n    for (const dep of provider.dependencies) {\n      visit(dep);\n    }\n\n    visiting.delete(id);\n    visited.add(id);\n    sorted.push(provider);\n  }\n\n  for (const provider of providers) {\n    visit(provider.id);\n  }\n\n  return sorted;\n}\n\n/**\n * Creates the nested provider tree component.\n */\nfunction createProviderTree(\n  providers: ProviderEntry[],\n  errorBoundary?: ComponentType<{ children: ReactNode }>\n): ComponentType<{ children: ReactNode }> {\n  // Sort by order (outer providers have lower order)\n  const sortedProviders = [...providers].sort((a, b) => a.order - b.order);\n\n  // Build tree from inside out\n  const ProviderTree: FC<{ children: ReactNode }> = ({ children }) => {\n    let tree = children;\n\n    // Wrap from innermost to outermost\n    for (let i = sortedProviders.length - 1; i >= 0; i--) {\n      const provider = sortedProviders[i];\n      if (provider?.isEnabled !== true) continue;\n\n      const Component = provider.resolvedComponent;\n      const props = provider.props ?? {};\n\n      tree = createElement(Component, { ...props, children: tree } as { children: ReactNode });\n    }\n\n    // Wrap with error boundary if provided\n    if (errorBoundary) {\n      tree = createElement(errorBoundary, { children: tree } as { children: ReactNode });\n    }\n\n    return createElement(Fragment, {}, tree);\n  };\n\n  ProviderTree.displayName = 'OrchestratedProviderTree';\n\n  return ProviderTree;\n}\n\n// ============================================================================\n// Default Configuration\n// ============================================================================\n\nconst DEFAULT_CONFIG: ProviderOrchestratorConfig = {\n  providers: [],\n  strictOrdering: true,\n};\n\n// ============================================================================\n// ProviderOrchestratorImpl Class\n// ============================================================================\n\n/**\n * Implementation of the provider orchestrator.\n *\n * @example\n * ```tsx\n * const orchestrator = new ProviderOrchestratorImpl({\n *   providers: [\n *     {\n *       id: 'theme',\n *       Component: ThemeProvider,\n *       dependencies: [],\n *       props: { defaultTheme: 'light' },\n *     },\n *     {\n *       id: 'auth',\n *       Component: AuthProvider,\n *       dependencies: ['theme'],\n *     },\n *     {\n *       id: 'feature-flags',\n *       Component: FeatureFlagProvider,\n *       dependencies: ['auth'],\n *       condition: () => !isTestEnvironment(),\n *     },\n *   ],\n * });\n *\n * function App() {\n *   const ProviderTree = orchestrator.getProviderTree();\n *   return (\n *     <ProviderTree>\n *       <AppContent />\n *     </ProviderTree>\n *   );\n * }\n * ```\n */\nexport class ProviderOrchestratorImpl {\n  /** Configuration */\n  private readonly config: ProviderOrchestratorConfig;\n\n  /** Provider registry */\n  private readonly providers: Map<string, ProviderEntry> = new Map();\n\n  /** Cached provider tree */\n  private cachedTree: ComponentType<{ children: ReactNode }> | null = null;\n\n  /** Tree invalidation flag */\n  private isTreeInvalid = true;\n\n  /**\n   * Creates a new provider orchestrator.\n   * @param config - Configuration options\n   */\n  constructor(config: Partial<ProviderOrchestratorConfig> = {}) {\n    this.config = { ...DEFAULT_CONFIG, ...config };\n\n    // Register initial providers\n    for (const provider of this.config.providers) {\n      this.registerProvider(provider);\n    }\n  }\n\n  // ==========================================================================\n  // Provider Registration\n  // ==========================================================================\n\n  /**\n   * Registers a provider.\n   * @param definition - Provider definition\n   */\n  registerProvider(definition: ProviderDefinition): void {\n    const isEnabled = definition.condition?.() ?? true;\n\n    const entry: ProviderEntry = {\n      ...definition,\n      resolvedComponent: definition.Component,\n      isEnabled,\n      order: definition.order ?? this.providers.size,\n    };\n\n    this.providers.set(definition.id, entry);\n    this.isTreeInvalid = true;\n  }\n\n  /**\n   * Unregisters a provider.\n   * @param id - Provider ID\n   */\n  unregisterProvider(id: string): void {\n    this.providers.delete(id);\n    this.isTreeInvalid = true;\n  }\n\n  /**\n   * Updates a provider's props.\n   * @param id - Provider ID\n   * @param props - New props\n   */\n  updateProviderProps(id: string, props: Record<string, unknown>): void {\n    const entry = this.providers.get(id);\n    if (entry) {\n      entry.props = { ...entry.props, ...props };\n      this.isTreeInvalid = true;\n    }\n  }\n\n  /**\n   * Enables a provider.\n   * @param id - Provider ID\n   */\n  enableProvider(id: string): void {\n    const entry = this.providers.get(id);\n    if (entry && !entry.isEnabled) {\n      entry.isEnabled = true;\n      this.isTreeInvalid = true;\n    }\n  }\n\n  /**\n   * Disables a provider.\n   * @param id - Provider ID\n   */\n  disableProvider(id: string): void {\n    const entry = this.providers.get(id);\n    if (entry?.isEnabled === true) {\n      entry.isEnabled = false;\n      this.isTreeInvalid = true;\n    }\n  }\n\n  // ==========================================================================\n  // Tree Generation\n  // ==========================================================================\n\n  /**\n   * Gets the composed provider tree component.\n   * @returns Provider tree component\n   */\n  getProviderTree(): ComponentType<{ children: ReactNode }> {\n    if (!this.isTreeInvalid && this.cachedTree) {\n      return this.cachedTree;\n    }\n\n    // Get enabled providers\n    const enabledProviders = Array.from(this.providers.values()).filter((p) => p.isEnabled);\n\n    // Sort by dependencies\n    const sortedDefinitions = sortProvidersByDependencies(enabledProviders);\n\n    // Create entries with proper ordering\n    const entries: ProviderEntry[] = sortedDefinitions.map((def, index) => ({\n      ...def,\n      resolvedComponent: def.Component,\n      isEnabled: true,\n      order: index,\n    }));\n\n    // Create tree\n    this.cachedTree = createProviderTree(entries, this.config.errorBoundary);\n    this.isTreeInvalid = false;\n\n    return this.cachedTree;\n  }\n\n  /**\n   * Gets provider order (for debugging).\n   * @returns Array of provider IDs in order\n   */\n  getProviderOrder(): string[] {\n    const enabledProviders = Array.from(this.providers.values()).filter((p) => p.isEnabled);\n    const sorted = sortProvidersByDependencies(enabledProviders);\n    return sorted.map((p) => p.id);\n  }\n\n  /**\n   * Gets registered provider IDs.\n   * @returns Array of provider IDs\n   */\n  getProviderIds(): string[] {\n    return Array.from(this.providers.keys());\n  }\n\n  /**\n   * Checks if a provider is registered.\n   * @param id - Provider ID\n   */\n  hasProvider(id: string): boolean {\n    return this.providers.has(id);\n  }\n\n  /**\n   * Checks if a provider is enabled.\n   * @param id - Provider ID\n   */\n  isProviderEnabled(id: string): boolean {\n    return this.providers.get(id)?.isEnabled ?? false;\n  }\n}\n\n// ============================================================================\n// React Component\n// ============================================================================\n\n/**\n * Props for OrchestratedProviders component.\n */\nexport interface OrchestratedProvidersProps {\n  /** Provider definitions */\n  providers: ProviderDefinition[];\n  /** Error boundary component */\n  errorBoundary?: ComponentType<{ children: ReactNode }>;\n  /** Loading component */\n  loadingComponent?: ComponentType;\n  /** Children to render */\n  children: ReactNode;\n  /** Callback when all providers are ready */\n  onReady?: () => void;\n}\n\n/**\n * Component that orchestrates multiple providers.\n *\n * @example\n * ```tsx\n * function App() {\n *   return (\n *     <OrchestratedProviders\n *       providers={[\n *         { id: 'theme', Component: ThemeProvider, dependencies: [] },\n *         { id: 'auth', Component: AuthProvider, dependencies: ['theme'] },\n *         { id: 'data', Component: QueryProvider, dependencies: ['auth'] },\n *       ]}\n *       loadingComponent={AppLoading}\n *       onReady={() => console.log('All providers ready')}\n *     >\n *       <AppRoutes />\n *     </OrchestratedProviders>\n *   );\n * }\n * ```\n */\nexport const OrchestratedProviders: FC<OrchestratedProvidersProps> = ({\n  providers,\n  errorBoundary,\n  loadingComponent: LoadingComponent = DefaultLoadingFallback,\n  children,\n  onReady,\n}) => {\n  // Notify when ready - use useEffect for side effects\n  useEffect(() => {\n    onReady?.();\n  }, [onReady]);\n\n  // Build provider tree directly without refs\n  const orchestrator = new ProviderOrchestratorImpl({\n    providers,\n    errorBoundary,\n  });\n  const ProviderTree = orchestrator.getProviderTree();\n\n  return (\n    <Suspense fallback={<LoadingComponent />}>\n      {/* eslint-disable-next-line react-hooks/static-components */}\n      <ProviderTree>{children}</ProviderTree>\n    </Suspense>\n  );\n};\n\nOrchestratedProviders.displayName = 'OrchestratedProviders';\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\n/**\n * Global provider orchestrator instance.\n */\nlet globalOrchestrator: ProviderOrchestratorImpl | null = null;\n\n/**\n * Gets the global provider orchestrator.\n * @param config - Optional configuration\n */\nexport function getProviderOrchestrator(\n  config?: Partial<ProviderOrchestratorConfig>\n): ProviderOrchestratorImpl {\n  globalOrchestrator ??= new ProviderOrchestratorImpl(config);\n  return globalOrchestrator;\n}\n\n/**\n * Sets the global provider orchestrator.\n * @param orchestrator - Orchestrator instance\n */\nexport function setProviderOrchestrator(orchestrator: ProviderOrchestratorImpl): void {\n  globalOrchestrator = orchestrator;\n}\n\n/**\n * Resets the global provider orchestrator.\n */\nexport function resetProviderOrchestrator(): void {\n  globalOrchestrator = null;\n}\n\n// ============================================================================\n// Convenience Functions\n// ============================================================================\n\n/**\n * Registers a provider with the global orchestrator.\n */\nexport function registerProvider(definition: ProviderDefinition): void {\n  getProviderOrchestrator().registerProvider(definition);\n}\n\n/**\n * Gets the global provider tree component.\n */\nexport function getGlobalProviderTree(): ComponentType<{ children: ReactNode }> {\n  return getProviderOrchestrator().getProviderTree();\n}\n"],"names":["sortProvidersByDependencies","providers","sorted","visited","visiting","providerMap","p","visit","id","provider","dep","createProviderTree","errorBoundary","sortedProviders","a","b","ProviderTree","children","tree","i","Component","props","createElement","Fragment","DEFAULT_CONFIG","ProviderOrchestratorImpl","config","definition","isEnabled","entry","enabledProviders","entries","def","index","OrchestratedProviders","LoadingComponent","DefaultLoadingFallback","onReady","useEffect","jsx","Suspense","globalOrchestrator","getProviderOrchestrator","setProviderOrchestrator","orchestrator","resetProviderOrchestrator","registerProvider","getGlobalProviderTree"],"mappings":"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"}