@memberjunction/react-runtime 2.94.0 → 2.95.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/.turbo/turbo-build.log +6 -6
  2. package/CHANGELOG.md +12 -0
  3. package/dist/compiler/component-compiler.d.ts +1 -0
  4. package/dist/compiler/component-compiler.d.ts.map +1 -1
  5. package/dist/compiler/component-compiler.js +67 -24
  6. package/dist/compiler/component-compiler.js.map +1 -1
  7. package/dist/index.d.ts +1 -1
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +2 -1
  10. package/dist/index.js.map +1 -1
  11. package/dist/registry/component-registry-service.d.ts +2 -0
  12. package/dist/registry/component-registry-service.d.ts.map +1 -1
  13. package/dist/registry/component-registry-service.js +11 -0
  14. package/dist/registry/component-registry-service.js.map +1 -1
  15. package/dist/registry/component-registry.d.ts +2 -0
  16. package/dist/registry/component-registry.d.ts.map +1 -1
  17. package/dist/registry/component-registry.js +17 -0
  18. package/dist/registry/component-registry.js.map +1 -1
  19. package/dist/registry/component-resolver.d.ts.map +1 -1
  20. package/dist/registry/component-resolver.js +60 -5
  21. package/dist/registry/component-resolver.js.map +1 -1
  22. package/dist/runtime/component-hierarchy.d.ts.map +1 -1
  23. package/dist/runtime/component-hierarchy.js +73 -17
  24. package/dist/runtime/component-hierarchy.js.map +1 -1
  25. package/dist/runtime.umd.js +1 -1
  26. package/dist/types/index.d.ts +1 -1
  27. package/dist/types/index.d.ts.map +1 -1
  28. package/dist/types/index.js.map +1 -1
  29. package/dist/utilities/library-dependency-resolver.d.ts.map +1 -1
  30. package/dist/utilities/library-dependency-resolver.js +17 -8
  31. package/dist/utilities/library-dependency-resolver.js.map +1 -1
  32. package/dist/utilities/library-loader.d.ts.map +1 -1
  33. package/dist/utilities/library-loader.js +23 -2
  34. package/dist/utilities/library-loader.js.map +1 -1
  35. package/package.json +5 -5
  36. package/src/compiler/component-compiler.ts +73 -25
  37. package/src/index.ts +2 -1
  38. package/src/registry/component-registry-service.ts +21 -0
  39. package/src/registry/component-registry.ts +28 -0
  40. package/src/registry/component-resolver.ts +82 -9
  41. package/src/runtime/component-hierarchy.ts +97 -31
  42. package/src/types/index.ts +1 -1
  43. package/src/utilities/library-dependency-resolver.ts +21 -11
  44. package/src/utilities/library-loader.ts +24 -2
@@ -1 +1 @@
1
- {"version":3,"file":"component-registry-service.js","sourceRoot":"","sources":["../../src/registry/component-registry-service.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Service for managing registry-based component loading with caching\n * @module @memberjunction/react-runtime/registry\n */\n\nimport { ComponentSpec, ComponentObject } from '@memberjunction/interactive-component-types';\nimport { ComponentCompiler } from '../compiler';\nimport { RuntimeContext } from '../types';\nimport { \n RegistryProvider, \n RegistryComponentResponse,\n ComponentDependencyInfo,\n DependencyTree, \n RegistryComponentMetadata\n} from './registry-provider';\nimport { UserInfo, Metadata } from '@memberjunction/core';\nimport { \n ComponentEntity, \n ComponentRegistryEntity,\n ComponentDependencyEntity,\n ComponentLibraryLinkEntity,\n ComponentMetadataEngine\n} from '@memberjunction/core-entities';\n\n/**\n * Cached compiled component with metadata\n */\ninterface CachedCompiledComponent {\n component: ComponentObject;\n metadata: RegistryComponentResponse['metadata'];\n compiledAt: Date;\n lastUsed: Date;\n useCount: number;\n}\n\n/**\n * Service for managing component loading from registries with compilation caching\n */\nexport class ComponentRegistryService {\n private static instance: ComponentRegistryService | null = null;\n \n // Caches\n private compiledComponentCache = new Map<string, CachedCompiledComponent>();\n private componentReferences = new Map<string, Set<string>>();\n \n // Dependencies\n private compiler: ComponentCompiler;\n private runtimeContext: RuntimeContext;\n private componentEngine = ComponentMetadataEngine.Instance;\n private registryProviders = new Map<string, RegistryProvider>();\n private debug: boolean = false;\n \n private constructor(\n compiler: ComponentCompiler,\n runtimeContext: RuntimeContext,\n debug: boolean = false\n ) {\n this.compiler = compiler;\n this.runtimeContext = runtimeContext;\n this.debug = debug;\n }\n \n /**\n * Get or create the singleton instance\n */\n static getInstance(\n compiler: ComponentCompiler, \n context: RuntimeContext,\n debug: boolean = false\n ): ComponentRegistryService {\n if (!ComponentRegistryService.instance) {\n ComponentRegistryService.instance = new ComponentRegistryService(compiler, context, debug);\n }\n return ComponentRegistryService.instance;\n }\n \n /**\n * Initialize the service with metadata\n */\n async initialize(contextUser?: UserInfo): Promise<void> {\n // Initialize metadata engine\n await this.componentEngine.Config(false, contextUser);\n }\n \n /**\n * Get a compiled component, using cache if available\n */\n async getCompiledComponent(\n componentId: string,\n referenceId?: string,\n contextUser?: UserInfo\n ): Promise<ComponentObject> {\n await this.initialize(contextUser);\n \n // Find component in metadata\n const component = this.componentEngine.Components.find((c: ComponentEntity) => c.ID === componentId);\n if (!component) {\n throw new Error(`Component not found: ${componentId}`);\n }\n \n const key = this.getComponentKey(component.Name, component.Namespace, component.Version, component.SourceRegistryID);\n \n // Check if already compiled and cached\n if (this.compiledComponentCache.has(key)) {\n const cached = this.compiledComponentCache.get(key)!;\n cached.lastUsed = new Date();\n cached.useCount++;\n \n // Track reference if provided\n if (referenceId) {\n this.addComponentReference(key, referenceId);\n }\n \n if (this.debug) {\n console.log(`✅ Reusing compiled component from cache: ${key} (use count: ${cached.useCount})`);\n }\n return cached.component;\n }\n \n // Not in cache, need to load and compile\n if (this.debug) {\n console.log(`🔄 Loading and compiling component: ${key}`);\n }\n \n // Get the component specification\n const spec = await this.getComponentSpec(componentId, contextUser);\n \n // Compile the component\n // Load all libraries from metadata engine\n const allLibraries = this.componentEngine.ComponentLibraries || [];\n \n const compilationResult = await this.compiler.compile({\n componentName: component.Name,\n componentCode: spec.code,\n libraries: spec.libraries,\n allLibraries\n });\n \n if (!compilationResult.success) {\n throw new Error(`Failed to compile component ${component.Name}: ${compilationResult.error}`);\n }\n \n // Cache the compiled component\n const metadata: RegistryComponentMetadata = {\n name: component.Name,\n namespace: component.Namespace || '',\n version: component.Version,\n description: component.Description || '',\n title: component.Title || undefined,\n type: component.Type || undefined,\n status: component.Status || undefined,\n properties: spec.properties,\n events: spec.events,\n libraries: spec.libraries,\n dependencies: spec.dependencies,\n sourceRegistryID: component.SourceRegistryID,\n isLocal: !component.SourceRegistryID\n };\n \n if (!compilationResult.component) {\n throw new Error(`Component compilation succeeded but no component returned`);\n }\n const compiledComponent = compilationResult.component.factory(this.runtimeContext);\n this.compiledComponentCache.set(key, {\n component: compiledComponent,\n metadata,\n compiledAt: new Date(),\n lastUsed: new Date(),\n useCount: 1\n });\n \n // Track reference\n if (referenceId) {\n this.addComponentReference(key, referenceId);\n }\n \n return compiledComponent;\n }\n \n /**\n * Get component specification from database or external registry\n */\n async getComponentSpec(\n componentId: string,\n contextUser?: UserInfo\n ): Promise<ComponentSpec> {\n await this.initialize(contextUser);\n \n const component = this.componentEngine.Components.find((c: ComponentEntity) => c.ID === componentId);\n if (!component) {\n throw new Error(`Component not found: ${componentId}`);\n }\n \n if (!component.SourceRegistryID) {\n // LOCAL: Use specification from database\n if (!component.Specification) {\n throw new Error(`Local component ${component.Name} has no specification`);\n }\n return JSON.parse(component.Specification);\n }\n \n // EXTERNAL: Check if we have a cached version\n if (component.Specification && component.LastSyncedAt) {\n // For now, always use cached version (no expiration)\n if (this.debug) {\n console.log(`Using cached external component: ${component.Name} (synced: ${component.LastSyncedAt})`);\n }\n return JSON.parse(component.Specification);\n }\n \n // Need to fetch from external registry\n const registry = this.componentEngine.ComponentRegistries?.find(\n r => r.ID === component.SourceRegistryID\n );\n \n if (!registry) {\n throw new Error(`Registry not found: ${component.SourceRegistryID}`);\n }\n \n if (!registry) {\n throw new Error(`Registry not found: ${component.SourceRegistryID}`);\n }\n \n const spec = await this.fetchFromExternalRegistry(\n registry.URI || '',\n component.Name,\n component.Namespace || '',\n component.Version,\n this.getRegistryApiKey(registry.ID) // API keys stored in env vars or secure config\n );\n \n // Store in local database for future use\n await this.cacheExternalComponent(componentId, spec, contextUser);\n \n return spec;\n }\n \n /**\n * Fetch component from external registry via HTTP\n */\n private async fetchFromExternalRegistry(\n uri: string,\n name: string,\n namespace: string,\n version: string,\n apiKey?: string\n ): Promise<ComponentSpec> {\n const url = `${uri}/components/${encodeURIComponent(namespace)}/${encodeURIComponent(name)}/${version}`;\n \n const headers: HeadersInit = {\n 'Accept': 'application/json'\n };\n \n if (apiKey) {\n headers['Authorization'] = `Bearer ${apiKey}`;\n }\n \n if (this.debug) {\n console.log(`Fetching from external registry: ${url}`);\n }\n \n const response = await fetch(url, { headers });\n \n if (!response.ok) {\n throw new Error(`Registry fetch failed: ${response.status} ${response.statusText}`);\n }\n \n const spec = await response.json() as ComponentSpec;\n return spec;\n }\n \n /**\n * Cache an external component in the local database\n */\n private async cacheExternalComponent(\n componentId: string,\n spec: ComponentSpec,\n contextUser?: UserInfo\n ): Promise<void> {\n // Get the actual entity object to save\n const md = new Metadata();\n const componentEntity = await md.GetEntityObject<ComponentEntity>('MJ: Components', contextUser);\n \n // Load the existing component\n if (!await componentEntity.Load(componentId)) {\n throw new Error(`Failed to load component entity: ${componentId}`);\n }\n \n // Update with fetched specification and all fields from spec\n componentEntity.Specification = JSON.stringify(spec);\n componentEntity.LastSyncedAt = new Date();\n \n // Set ReplicatedAt only on first fetch\n if (!componentEntity.ReplicatedAt) {\n componentEntity.ReplicatedAt = new Date();\n }\n \n // Update all fields from the spec with strong typing\n if (spec.name) {\n componentEntity.Name = spec.name;\n }\n \n if (spec.namespace) {\n componentEntity.Namespace = spec.namespace;\n }\n \n if (spec.version) {\n componentEntity.Version = spec.version;\n }\n \n if (spec.title) {\n componentEntity.Title = spec.title;\n }\n \n if (spec.description) {\n componentEntity.Description = spec.description;\n }\n \n if (spec.type) {\n // Map spec type to entity type (entity has specific enum values)\n const typeMap: Record<string, ComponentEntity['Type']> = {\n 'report': 'Report',\n 'dashboard': 'Dashboard',\n 'form': 'Form',\n 'table': 'Table',\n 'chart': 'Chart',\n 'navigation': 'Navigation',\n 'search': 'Search',\n 'widget': 'Widget',\n 'utility': 'Utility',\n 'other': 'Other'\n };\n \n const mappedType = typeMap[spec.type.toLowerCase()];\n if (mappedType) {\n componentEntity.Type = mappedType;\n }\n }\n \n if (spec.functionalRequirements) {\n componentEntity.FunctionalRequirements = spec.functionalRequirements;\n }\n \n if (spec.technicalDesign) {\n componentEntity.TechnicalDesign = spec.technicalDesign;\n }\n \n // Save back to database\n const result = await componentEntity.Save();\n if (!result) {\n throw new Error(`Failed to save cached component: ${componentEntity.Name}\\n${componentEntity.LatestResult.Message || componentEntity.LatestResult.Error || componentEntity.LatestResult.Errors?.join(',')}`);\n }\n \n if (this.debug) {\n console.log(`Cached external component: ${componentEntity.Name} at ${componentEntity.LastSyncedAt}`);\n }\n \n // Refresh metadata cache after saving\n await this.componentEngine.Config(true, contextUser);\n }\n \n /**\n * Load component dependencies from database\n */\n async loadDependencies(\n componentId: string,\n contextUser?: UserInfo\n ): Promise<ComponentDependencyInfo[]> {\n await this.initialize(contextUser);\n \n // Get dependencies from metadata cache\n const dependencies = this.componentEngine.ComponentDependencies?.filter(\n d => d.ComponentID === componentId\n ) || [];\n \n const result: ComponentDependencyInfo[] = [];\n \n for (const dep of dependencies) {\n // Find the dependency component\n const depComponent = this.componentEngine.Components.find(\n (c: ComponentEntity) => c.ID === dep.DependencyComponentID\n );\n \n if (depComponent) {\n result.push({\n name: depComponent.Name,\n namespace: depComponent.Namespace || '',\n version: depComponent.Version, // Version comes from the linked Component record\n isRequired: true, // All dependencies are required in MemberJunction\n location: depComponent.SourceRegistryID ? 'registry' : 'embedded',\n sourceRegistryID: depComponent.SourceRegistryID\n });\n }\n }\n \n return result;\n }\n \n /**\n * Resolve full dependency tree for a component\n */\n async resolveDependencyTree(\n componentId: string,\n contextUser?: UserInfo,\n visited = new Set<string>()\n ): Promise<DependencyTree> {\n if (visited.has(componentId)) {\n return { \n componentId, \n circular: true \n };\n }\n visited.add(componentId);\n \n await this.initialize(contextUser);\n \n const component = this.componentEngine.Components.find((c: ComponentEntity) => c.ID === componentId);\n if (!component) {\n return { componentId, dependencies: [] };\n }\n \n // Get direct dependencies\n const directDeps = await this.loadDependencies(componentId, contextUser);\n \n // Recursively resolve each dependency\n const dependencies: DependencyTree[] = [];\n for (const dep of directDeps) {\n // Find the dependency component\n const depComponent = this.componentEngine.Components.find(\n c => c.Name.trim().toLowerCase() === dep.name.trim().toLowerCase() && \n c.Namespace?.trim().toLowerCase() === dep.namespace?.trim().toLowerCase()\n );\n \n if (depComponent) {\n const subTree = await this.resolveDependencyTree(\n depComponent.ID, \n contextUser, \n visited\n );\n dependencies.push(subTree);\n }\n }\n \n return {\n componentId,\n name: component.Name,\n namespace: component.Namespace || undefined,\n version: component.Version,\n dependencies,\n totalCount: dependencies.reduce((sum, d) => sum + (d.totalCount || 1), 1)\n };\n }\n \n /**\n * Get components to load in dependency order\n */\n async getComponentsToLoad(\n rootComponentId: string,\n contextUser?: UserInfo\n ): Promise<string[]> {\n const tree = await this.resolveDependencyTree(rootComponentId, contextUser);\n \n // Flatten tree in dependency order (depth-first)\n const ordered: string[] = [];\n const processNode = (node: DependencyTree) => {\n if (node.dependencies) {\n node.dependencies.forEach(processNode);\n }\n if (!ordered.includes(node.componentId)) {\n ordered.push(node.componentId);\n }\n };\n processNode(tree);\n \n return ordered;\n }\n \n /**\n * Add a reference to a component\n */\n private addComponentReference(componentKey: string, referenceId: string): void {\n if (!this.componentReferences.has(componentKey)) {\n this.componentReferences.set(componentKey, new Set());\n }\n this.componentReferences.get(componentKey)!.add(referenceId);\n }\n \n /**\n * Remove a reference to a component\n */\n removeComponentReference(componentKey: string, referenceId: string): void {\n const refs = this.componentReferences.get(componentKey);\n if (refs) {\n refs.delete(referenceId);\n \n // If no more references and cache cleanup is enabled\n if (refs.size === 0) {\n this.considerCacheEviction(componentKey);\n }\n }\n }\n \n /**\n * Consider evicting a component from cache\n */\n private considerCacheEviction(componentKey: string): void {\n const cached = this.compiledComponentCache.get(componentKey);\n if (cached) {\n const timeSinceLastUse = Date.now() - cached.lastUsed.getTime();\n const evictionThreshold = 5 * 60 * 1000; // 5 minutes\n \n if (timeSinceLastUse > evictionThreshold) {\n if (this.debug) {\n console.log(`🗑️ Evicting unused component from cache: ${componentKey}`);\n }\n this.compiledComponentCache.delete(componentKey);\n }\n }\n }\n \n /**\n * Get API key for a registry from secure configuration\n * @param registryId - Registry ID\n * @returns API key or undefined\n */\n private getRegistryApiKey(registryId: string): string | undefined {\n // API keys should be stored in environment variables or secure configuration\n // Format: REGISTRY_API_KEY_{registryId} or similar\n // This is a placeholder - actual implementation would depend on the security infrastructure\n const envKey = `REGISTRY_API_KEY_${registryId.replace(/-/g, '_').toUpperCase()}`;\n return process.env[envKey];\n }\n \n /**\n * Get cache statistics\n */\n getCacheStats(): {\n compiledComponents: number;\n totalUseCount: number;\n memoryEstimate: string;\n } {\n let totalUseCount = 0;\n this.compiledComponentCache.forEach(cached => {\n totalUseCount += cached.useCount;\n });\n \n return {\n compiledComponents: this.compiledComponentCache.size,\n totalUseCount,\n memoryEstimate: `~${(this.compiledComponentCache.size * 50)}KB` // Rough estimate\n };\n }\n \n /**\n * Clear all caches\n */\n clearCache(): void {\n if (this.debug) {\n console.log('🧹 Clearing all component caches');\n }\n this.compiledComponentCache.clear();\n this.componentReferences.clear();\n }\n \n /**\n * Generate a cache key for a component\n */\n private getComponentKey(\n name: string, \n namespace: string | null | undefined, \n version: string, \n sourceRegistryId: string | null | undefined\n ): string {\n const registryPart = sourceRegistryId || 'local';\n const namespacePart = namespace || 'global';\n return `${registryPart}/${namespacePart}/${name}@${version}`;\n }\n}"]}
1
+ {"version":3,"file":"component-registry-service.js","sourceRoot":"","sources":["../../src/registry/component-registry-service.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Service for managing registry-based component loading with caching\n * @module @memberjunction/react-runtime/registry\n */\n\nimport { ComponentSpec, ComponentObject } from '@memberjunction/interactive-component-types';\nimport { ComponentCompiler } from '../compiler';\nimport { RuntimeContext } from '../types';\nimport { \n RegistryProvider, \n RegistryComponentResponse,\n ComponentDependencyInfo,\n DependencyTree, \n RegistryComponentMetadata\n} from './registry-provider';\nimport { UserInfo, Metadata } from '@memberjunction/core';\nimport { \n ComponentEntity, \n ComponentRegistryEntity,\n ComponentDependencyEntity,\n ComponentLibraryLinkEntity,\n ComponentMetadataEngine\n} from '@memberjunction/core-entities';\n\n/**\n * Cached compiled component with metadata\n */\ninterface CachedCompiledComponent {\n component: ComponentObject;\n metadata: RegistryComponentResponse['metadata'];\n compiledAt: Date;\n lastUsed: Date;\n useCount: number;\n}\n\n/**\n * Service for managing component loading from registries with compilation caching\n */\nexport class ComponentRegistryService {\n private static instance: ComponentRegistryService | null = null;\n \n // Caches\n private compiledComponentCache = new Map<string, CachedCompiledComponent>();\n private componentReferences = new Map<string, Set<string>>();\n \n // Dependencies\n private compiler: ComponentCompiler;\n private runtimeContext: RuntimeContext;\n private componentEngine = ComponentMetadataEngine.Instance;\n private registryProviders = new Map<string, RegistryProvider>();\n private debug: boolean = false;\n \n private constructor(\n compiler: ComponentCompiler,\n runtimeContext: RuntimeContext,\n debug: boolean = false\n ) {\n this.compiler = compiler;\n this.runtimeContext = runtimeContext;\n this.debug = debug;\n }\n \n /**\n * Get or create the singleton instance\n */\n static getInstance(\n compiler: ComponentCompiler, \n context: RuntimeContext,\n debug: boolean = false\n ): ComponentRegistryService {\n if (!ComponentRegistryService.instance) {\n ComponentRegistryService.instance = new ComponentRegistryService(compiler, context, debug);\n }\n return ComponentRegistryService.instance;\n }\n \n /**\n * Initialize the service with metadata\n */\n async initialize(contextUser?: UserInfo): Promise<void> {\n // Initialize metadata engine\n await this.componentEngine.Config(false, contextUser);\n }\n \n /**\n * Get a compiled component, using cache if available\n */\n async getCompiledComponent(\n componentId: string,\n referenceId?: string,\n contextUser?: UserInfo\n ): Promise<ComponentObject> {\n await this.initialize(contextUser);\n \n // Find component in metadata\n const component = this.componentEngine.Components.find((c: ComponentEntity) => c.ID === componentId);\n if (!component) {\n throw new Error(`Component not found: ${componentId}`);\n }\n \n const key = this.getComponentKey(component.Name, component.Namespace, component.Version, component.SourceRegistryID);\n \n // Check if already compiled and cached\n if (this.compiledComponentCache.has(key)) {\n const cached = this.compiledComponentCache.get(key)!;\n cached.lastUsed = new Date();\n cached.useCount++;\n \n // Track reference if provided\n if (referenceId) {\n this.addComponentReference(key, referenceId);\n }\n \n if (this.debug) {\n console.log(`✅ Reusing compiled component from cache: ${key} (use count: ${cached.useCount})`);\n }\n return cached.component;\n }\n \n // Not in cache, need to load and compile\n if (this.debug) {\n console.log(`🔄 Loading and compiling component: ${key}`);\n }\n \n // Get the component specification\n const spec = await this.getComponentSpec(componentId, contextUser);\n \n // Compile the component\n // Load all libraries from metadata engine\n const allLibraries = this.componentEngine.ComponentLibraries || [];\n \n const compilationResult = await this.compiler.compile({\n componentName: component.Name,\n componentCode: spec.code,\n libraries: spec.libraries,\n allLibraries\n });\n \n if (!compilationResult.success) {\n throw new Error(`Failed to compile component ${component.Name}: ${compilationResult.error}`);\n }\n \n // Cache the compiled component\n const metadata: RegistryComponentMetadata = {\n name: component.Name,\n namespace: component.Namespace || '',\n version: component.Version,\n description: component.Description || '',\n title: component.Title || undefined,\n type: component.Type || undefined,\n status: component.Status || undefined,\n properties: spec.properties,\n events: spec.events,\n libraries: spec.libraries,\n dependencies: spec.dependencies,\n sourceRegistryID: component.SourceRegistryID,\n isLocal: !component.SourceRegistryID\n };\n \n if (!compilationResult.component) {\n throw new Error(`Component compilation succeeded but no component returned`);\n }\n const compiledComponent = compilationResult.component.factory(this.runtimeContext);\n this.compiledComponentCache.set(key, {\n component: compiledComponent,\n metadata,\n compiledAt: new Date(),\n lastUsed: new Date(),\n useCount: 1\n });\n \n // Track reference\n if (referenceId) {\n this.addComponentReference(key, referenceId);\n }\n \n return compiledComponent;\n }\n \n /**\n * Get component specification from database or external registry\n */\n async getComponentSpec(\n componentId: string,\n contextUser?: UserInfo\n ): Promise<ComponentSpec> {\n await this.initialize(contextUser);\n \n const component = this.componentEngine.Components.find((c: ComponentEntity) => c.ID === componentId);\n if (!component) {\n throw new Error(`Component not found: ${componentId}`);\n }\n \n if (!component.SourceRegistryID) {\n // LOCAL: Use specification from database\n if (!component.Specification) {\n throw new Error(`Local component ${component.Name} has no specification`);\n }\n return JSON.parse(component.Specification);\n }\n \n // EXTERNAL: Check if we have a cached version\n if (component.Specification && component.LastSyncedAt) {\n // For now, always use cached version (no expiration)\n if (this.debug) {\n console.log(`Using cached external component: ${component.Name} (synced: ${component.LastSyncedAt})`);\n }\n return JSON.parse(component.Specification);\n }\n \n // Need to fetch from external registry\n const registry = this.componentEngine.ComponentRegistries?.find(\n r => r.ID === component.SourceRegistryID\n );\n \n if (!registry) {\n throw new Error(`Registry not found: ${component.SourceRegistryID}`);\n }\n \n if (!registry) {\n throw new Error(`Registry not found: ${component.SourceRegistryID}`);\n }\n \n const spec = await this.fetchFromExternalRegistry(\n registry.URI || '',\n component.Name,\n component.Namespace || '',\n component.Version,\n this.getRegistryApiKey(registry.ID) // API keys stored in env vars or secure config\n );\n \n // Store in local database for future use\n await this.cacheExternalComponent(componentId, spec, contextUser);\n \n return spec;\n }\n \n /**\n * Fetch component from external registry via HTTP\n */\n private async fetchFromExternalRegistry(\n uri: string,\n name: string,\n namespace: string,\n version: string,\n apiKey?: string\n ): Promise<ComponentSpec> {\n const url = `${uri}/components/${encodeURIComponent(namespace)}/${encodeURIComponent(name)}/${version}`;\n \n const headers: HeadersInit = {\n 'Accept': 'application/json'\n };\n \n if (apiKey) {\n headers['Authorization'] = `Bearer ${apiKey}`;\n }\n \n if (this.debug) {\n console.log(`Fetching from external registry: ${url}`);\n }\n \n const response = await fetch(url, { headers });\n \n if (!response.ok) {\n throw new Error(`Registry fetch failed: ${response.status} ${response.statusText}`);\n }\n \n const spec = await response.json() as ComponentSpec;\n return spec;\n }\n \n /**\n * Cache an external component in the local database\n */\n private async cacheExternalComponent(\n componentId: string,\n spec: ComponentSpec,\n contextUser?: UserInfo\n ): Promise<void> {\n // Get the actual entity object to save\n const md = new Metadata();\n const componentEntity = await md.GetEntityObject<ComponentEntity>('MJ: Components', contextUser);\n \n // Load the existing component\n if (!await componentEntity.Load(componentId)) {\n throw new Error(`Failed to load component entity: ${componentId}`);\n }\n \n // Update with fetched specification and all fields from spec\n componentEntity.Specification = JSON.stringify(spec);\n componentEntity.LastSyncedAt = new Date();\n \n // Set ReplicatedAt only on first fetch\n if (!componentEntity.ReplicatedAt) {\n componentEntity.ReplicatedAt = new Date();\n }\n \n // Update all fields from the spec with strong typing\n if (spec.name) {\n componentEntity.Name = spec.name;\n }\n \n if (spec.namespace) {\n componentEntity.Namespace = spec.namespace;\n }\n \n if (spec.version) {\n componentEntity.Version = spec.version;\n }\n \n if (spec.title) {\n componentEntity.Title = spec.title;\n }\n \n if (spec.description) {\n componentEntity.Description = spec.description;\n }\n \n if (spec.type) {\n // Map spec type to entity type (entity has specific enum values)\n const typeMap: Record<string, ComponentEntity['Type']> = {\n 'report': 'Report',\n 'dashboard': 'Dashboard',\n 'form': 'Form',\n 'table': 'Table',\n 'chart': 'Chart',\n 'navigation': 'Navigation',\n 'search': 'Search',\n 'widget': 'Widget',\n 'utility': 'Utility',\n 'other': 'Other'\n };\n \n const mappedType = typeMap[spec.type.toLowerCase()];\n if (mappedType) {\n componentEntity.Type = mappedType;\n }\n }\n \n if (spec.functionalRequirements) {\n componentEntity.FunctionalRequirements = spec.functionalRequirements;\n }\n \n if (spec.technicalDesign) {\n componentEntity.TechnicalDesign = spec.technicalDesign;\n }\n \n // Save back to database\n const result = await componentEntity.Save();\n if (!result) {\n throw new Error(`Failed to save cached component: ${componentEntity.Name}\\n${componentEntity.LatestResult.Message || componentEntity.LatestResult.Error || componentEntity.LatestResult.Errors?.join(',')}`);\n }\n \n if (this.debug) {\n console.log(`Cached external component: ${componentEntity.Name} at ${componentEntity.LastSyncedAt}`);\n }\n \n // Refresh metadata cache after saving\n await this.componentEngine.Config(true, contextUser);\n }\n \n /**\n * Load component dependencies from database\n */\n async loadDependencies(\n componentId: string,\n contextUser?: UserInfo\n ): Promise<ComponentDependencyInfo[]> {\n await this.initialize(contextUser);\n \n // Get dependencies from metadata cache\n const dependencies = this.componentEngine.ComponentDependencies?.filter(\n d => d.ComponentID === componentId\n ) || [];\n \n const result: ComponentDependencyInfo[] = [];\n \n for (const dep of dependencies) {\n // Find the dependency component\n const depComponent = this.componentEngine.Components.find(\n (c: ComponentEntity) => c.ID === dep.DependencyComponentID\n );\n \n if (depComponent) {\n result.push({\n name: depComponent.Name,\n namespace: depComponent.Namespace || '',\n version: depComponent.Version, // Version comes from the linked Component record\n isRequired: true, // All dependencies are required in MemberJunction\n location: depComponent.SourceRegistryID ? 'registry' : 'embedded',\n sourceRegistryID: depComponent.SourceRegistryID\n });\n }\n }\n \n return result;\n }\n \n /**\n * Resolve full dependency tree for a component\n */\n async resolveDependencyTree(\n componentId: string,\n contextUser?: UserInfo,\n visited = new Set<string>()\n ): Promise<DependencyTree> {\n if (visited.has(componentId)) {\n return { \n componentId, \n circular: true \n };\n }\n visited.add(componentId);\n \n await this.initialize(contextUser);\n \n const component = this.componentEngine.Components.find((c: ComponentEntity) => c.ID === componentId);\n if (!component) {\n return { componentId, dependencies: [] };\n }\n \n // Get direct dependencies\n const directDeps = await this.loadDependencies(componentId, contextUser);\n \n // Recursively resolve each dependency\n const dependencies: DependencyTree[] = [];\n for (const dep of directDeps) {\n // Find the dependency component\n const depComponent = this.componentEngine.Components.find(\n c => c.Name.trim().toLowerCase() === dep.name.trim().toLowerCase() && \n c.Namespace?.trim().toLowerCase() === dep.namespace?.trim().toLowerCase()\n );\n \n if (depComponent) {\n const subTree = await this.resolveDependencyTree(\n depComponent.ID, \n contextUser, \n visited\n );\n dependencies.push(subTree);\n }\n }\n \n return {\n componentId,\n name: component.Name,\n namespace: component.Namespace || undefined,\n version: component.Version,\n dependencies,\n totalCount: dependencies.reduce((sum, d) => sum + (d.totalCount || 1), 1)\n };\n }\n \n /**\n * Get components to load in dependency order\n */\n async getComponentsToLoad(\n rootComponentId: string,\n contextUser?: UserInfo\n ): Promise<string[]> {\n const tree = await this.resolveDependencyTree(rootComponentId, contextUser);\n \n // Flatten tree in dependency order (depth-first)\n const ordered: string[] = [];\n const processNode = (node: DependencyTree) => {\n if (node.dependencies) {\n node.dependencies.forEach(processNode);\n }\n if (!ordered.includes(node.componentId)) {\n ordered.push(node.componentId);\n }\n };\n processNode(tree);\n \n return ordered;\n }\n \n /**\n * Add a reference to a component\n */\n private addComponentReference(componentKey: string, referenceId: string): void {\n if (!this.componentReferences.has(componentKey)) {\n this.componentReferences.set(componentKey, new Set());\n }\n this.componentReferences.get(componentKey)!.add(referenceId);\n }\n \n /**\n * Remove a reference to a component\n */\n removeComponentReference(componentKey: string, referenceId: string): void {\n const refs = this.componentReferences.get(componentKey);\n if (refs) {\n refs.delete(referenceId);\n \n // If no more references and cache cleanup is enabled\n if (refs.size === 0) {\n this.considerCacheEviction(componentKey);\n }\n }\n }\n \n /**\n * Consider evicting a component from cache\n */\n private considerCacheEviction(componentKey: string): void {\n const cached = this.compiledComponentCache.get(componentKey);\n if (cached) {\n const timeSinceLastUse = Date.now() - cached.lastUsed.getTime();\n const evictionThreshold = 5 * 60 * 1000; // 5 minutes\n \n if (timeSinceLastUse > evictionThreshold) {\n if (this.debug) {\n console.log(`🗑️ Evicting unused component from cache: ${componentKey}`);\n }\n this.compiledComponentCache.delete(componentKey);\n }\n }\n }\n \n /**\n * Get API key for a registry from secure configuration\n * @param registryId - Registry ID\n * @returns API key or undefined\n */\n private getRegistryApiKey(registryId: string): string | undefined {\n // API keys should be stored in environment variables or secure configuration\n // Format: REGISTRY_API_KEY_{registryId} or similar\n // This is a placeholder - actual implementation would depend on the security infrastructure\n const envKey = `REGISTRY_API_KEY_${registryId.replace(/-/g, '_').toUpperCase()}`;\n return process.env[envKey];\n }\n \n /**\n * Get cache statistics\n */\n getCacheStats(): {\n compiledComponents: number;\n totalUseCount: number;\n memoryEstimate: string;\n } {\n let totalUseCount = 0;\n this.compiledComponentCache.forEach(cached => {\n totalUseCount += cached.useCount;\n });\n \n return {\n compiledComponents: this.compiledComponentCache.size,\n totalUseCount,\n memoryEstimate: `~${(this.compiledComponentCache.size * 50)}KB` // Rough estimate\n };\n }\n \n /**\n * Clear all caches\n */\n clearCache(): void {\n if (this.debug) {\n console.log('🧹 Clearing all component caches');\n }\n this.compiledComponentCache.clear();\n this.componentReferences.clear();\n }\n\n /**\n * Force clear all compiled components\n * Used for Component Studio to ensure fresh loads\n */\n forceClearAll(): void {\n this.compiledComponentCache.clear();\n this.componentReferences.clear();\n console.log('🧹 Component cache force cleared');\n }\n\n /**\n * Reset the singleton instance\n * Forces new instance creation on next access\n */\n static reset(): void {\n if (ComponentRegistryService.instance) {\n ComponentRegistryService.instance.forceClearAll();\n ComponentRegistryService.instance = null;\n }\n }\n \n /**\n * Generate a cache key for a component\n */\n private getComponentKey(\n name: string, \n namespace: string | null | undefined, \n version: string, \n sourceRegistryId: string | null | undefined\n ): string {\n const registryPart = sourceRegistryId || 'local';\n const namespacePart = namespace || 'global';\n return `${registryPart}/${namespacePart}/${name}@${version}`;\n }\n}"]}
@@ -16,6 +16,8 @@ export declare class ComponentRegistry {
16
16
  getByTags(tags: string[]): ComponentMetadata[];
17
17
  release(name: string, namespace?: string, version?: string): void;
18
18
  clear(): void;
19
+ clearNamespace(namespace?: string): number;
20
+ forceClear(): void;
19
21
  size(): number;
20
22
  cleanup(force?: boolean): number;
21
23
  getStats(): {
@@ -1 +1 @@
1
- {"version":3,"file":"component-registry.d.ts","sourceRoot":"","sources":["../../src/registry/component-registry.ts"],"names":[],"mappings":"AAMA,OAAO,EAEL,iBAAiB,EACjB,cAAc,EACf,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAiB9E,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,YAAY,CAAC,CAA0B;IAC/C,OAAO,CAAC,UAAU,CAAS;gBAMf,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC;IAoB5C,QAAQ,CACN,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,eAAe,EAC1B,SAAS,GAAE,MAAiB,EAC5B,OAAO,GAAE,MAAa,EACtB,IAAI,CAAC,EAAE,MAAM,EAAE,GACd,iBAAiB;IAuCpB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,MAAiB,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAyB9F,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,MAAiB,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO;IAe1E,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,MAAiB,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO;IAejF,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,EAAE;IAkBpD,MAAM,CAAC,SAAS,GAAE,MAAiB,EAAE,OAAO,GAAE,MAAa,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC;IAgB7F,aAAa,IAAI,MAAM,EAAE;IAezB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,iBAAiB,EAAE;IAkB9C,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,MAAiB,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAgB3E,KAAK,IAAI,IAAI;IAQb,IAAI,IAAI,MAAM;IASd,OAAO,CAAC,KAAK,GAAE,OAAe,GAAG,MAAM;IAyBvC,QAAQ,IAAI;QACV,eAAe,EAAE,MAAM,CAAC;QACxB,UAAU,EAAE,MAAM,CAAC;QACnB,aAAa,EAAE,MAAM,CAAC;QACtB,eAAe,CAAC,EAAE,IAAI,CAAC;QACvB,eAAe,CAAC,EAAE,IAAI,CAAC;KACxB;IA6BD,OAAO,IAAI,IAAI;IAcf,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,iBAAiB;IAoBzB,OAAO,CAAC,QAAQ;IAsBhB,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,gBAAgB;CAMzB"}
1
+ {"version":3,"file":"component-registry.d.ts","sourceRoot":"","sources":["../../src/registry/component-registry.ts"],"names":[],"mappings":"AAMA,OAAO,EAEL,iBAAiB,EACjB,cAAc,EACf,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAiB9E,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,YAAY,CAAC,CAA0B;IAC/C,OAAO,CAAC,UAAU,CAAS;gBAMf,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC;IAoB5C,QAAQ,CACN,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,eAAe,EAC1B,SAAS,GAAE,MAAiB,EAC5B,OAAO,GAAE,MAAa,EACtB,IAAI,CAAC,EAAE,MAAM,EAAE,GACd,iBAAiB;IAuCpB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,MAAiB,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAyB9F,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,MAAiB,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO;IAe1E,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,MAAiB,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO;IAejF,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,EAAE;IAkBpD,MAAM,CAAC,SAAS,GAAE,MAAiB,EAAE,OAAO,GAAE,MAAa,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC;IAgB7F,aAAa,IAAI,MAAM,EAAE;IAezB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,iBAAiB,EAAE;IAkB9C,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,MAAiB,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAgB3E,KAAK,IAAI,IAAI;IASb,cAAc,CAAC,SAAS,GAAE,MAAiB,GAAG,MAAM;IAiBpD,UAAU,IAAI,IAAI;IAUlB,IAAI,IAAI,MAAM;IASd,OAAO,CAAC,KAAK,GAAE,OAAe,GAAG,MAAM;IAyBvC,QAAQ,IAAI;QACV,eAAe,EAAE,MAAM,CAAC;QACxB,UAAU,EAAE,MAAM,CAAC;QACnB,aAAa,EAAE,MAAM,CAAC;QACtB,eAAe,CAAC,EAAE,IAAI,CAAC;QACvB,eAAe,CAAC,EAAE,IAAI,CAAC;KACxB;IA6BD,OAAO,IAAI,IAAI;IAcf,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,iBAAiB;IAoBzB,OAAO,CAAC,QAAQ;IAsBhB,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,gBAAgB;CAMzB"}
@@ -115,6 +115,23 @@ class ComponentRegistry {
115
115
  clear() {
116
116
  this.registry.clear();
117
117
  }
118
+ clearNamespace(namespace = 'Global') {
119
+ const toRemove = [];
120
+ for (const [key, entry] of this.registry) {
121
+ if (entry.metadata.namespace === namespace) {
122
+ toRemove.push(key);
123
+ }
124
+ }
125
+ for (const key of toRemove) {
126
+ this.registry.delete(key);
127
+ }
128
+ return toRemove.length;
129
+ }
130
+ forceClear() {
131
+ this.stopCleanupTimer();
132
+ this.registry.clear();
133
+ console.log('🧹 Registry force cleared - all components removed');
134
+ }
118
135
  size() {
119
136
  return this.registry.size;
120
137
  }
@@ -1 +1 @@
1
- {"version":3,"file":"component-registry.js","sourceRoot":"","sources":["../../src/registry/component-registry.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Platform-agnostic component registry for managing compiled React components.\n * Provides storage, retrieval, and lifecycle management for components with namespace support.\n * @module @memberjunction/react-runtime/registry\n */\n\nimport { \n RegistryEntry, \n ComponentMetadata, \n RegistryConfig \n} from '../types';\nimport { ComponentObject } from '@memberjunction/interactive-component-types';\nimport { resourceManager } from '../utilities/resource-manager';\n\n/**\n * Default registry configuration\n */\nconst DEFAULT_REGISTRY_CONFIG: RegistryConfig = {\n maxComponents: 1000,\n cleanupInterval: 60000, // 1 minute\n useLRU: true,\n enableNamespaces: true\n};\n\n/**\n * Platform-agnostic component registry.\n * Manages compiled React components with namespace isolation and lifecycle management.\n */\nexport class ComponentRegistry {\n private registry: Map<string, RegistryEntry>;\n private config: RegistryConfig;\n private cleanupTimer?: NodeJS.Timeout | number;\n private registryId: string;\n \n /**\n * Creates a new ComponentRegistry instance\n * @param config - Optional registry configuration\n */\n constructor(config?: Partial<RegistryConfig>) {\n this.config = { ...DEFAULT_REGISTRY_CONFIG, ...config };\n this.registry = new Map();\n this.registryId = `component-registry-${Date.now()}`;\n \n // Start cleanup timer if configured\n if (this.config.cleanupInterval > 0) {\n this.startCleanupTimer();\n }\n }\n\n /**\n * Registers a compiled component\n * @param name - Component name\n * @param component - Compiled component object\n * @param namespace - Component namespace (default: 'Global')\n * @param version - Component version (default: 'v1')\n * @param tags - Optional tags for categorization\n * @returns The registered component's metadata\n */\n register(\n name: string,\n component: ComponentObject,\n namespace: string = 'Global',\n version: string = 'v1',\n tags?: string[]\n ): ComponentMetadata {\n const id = this.generateRegistryKey(name, namespace, version);\n \n // Create metadata\n const metadata: ComponentMetadata = {\n id,\n name,\n version,\n namespace,\n registeredAt: new Date(),\n tags\n };\n\n // Create registry entry\n const entry: RegistryEntry = {\n component,\n metadata,\n lastAccessed: new Date(),\n refCount: 0\n };\n\n // Check capacity\n if (this.registry.size >= this.config.maxComponents && this.config.useLRU) {\n this.evictLRU();\n }\n\n // Store in registry\n this.registry.set(id, entry);\n\n return metadata;\n }\n\n /**\n * Gets a component from the registry\n * @param name - Component name\n * @param namespace - Component namespace\n * @param version - Component version\n * @returns The component object if found, undefined otherwise\n */\n get(name: string, namespace: string = 'Global', version?: string): ComponentObject | undefined {\n const id = version \n ? this.generateRegistryKey(name, namespace, version)\n : this.findLatestVersion(name, namespace);\n\n if (!id) return undefined;\n\n const entry = this.registry.get(id);\n if (entry) {\n // Update access time and increment ref count\n entry.lastAccessed = new Date();\n entry.refCount++;\n return entry.component;\n }\n\n return undefined;\n }\n\n /**\n * Checks if a component exists in the registry\n * @param name - Component name\n * @param namespace - Component namespace\n * @param version - Component version\n * @returns true if the component exists\n */\n has(name: string, namespace: string = 'Global', version?: string): boolean {\n const id = version \n ? this.generateRegistryKey(name, namespace, version)\n : this.findLatestVersion(name, namespace);\n\n return id ? this.registry.has(id) : false;\n }\n\n /**\n * Removes a component from the registry\n * @param name - Component name\n * @param namespace - Component namespace\n * @param version - Component version\n * @returns true if the component was removed\n */\n unregister(name: string, namespace: string = 'Global', version?: string): boolean {\n const id = version \n ? this.generateRegistryKey(name, namespace, version)\n : this.findLatestVersion(name, namespace);\n\n if (!id) return false;\n\n return this.registry.delete(id);\n }\n\n /**\n * Gets all components in a namespace\n * @param namespace - Namespace to query\n * @returns Array of components in the namespace\n */\n getNamespace(namespace: string): ComponentMetadata[] {\n const components: ComponentMetadata[] = [];\n \n for (const entry of this.registry.values()) {\n if (entry.metadata.namespace === namespace) {\n components.push(entry.metadata);\n }\n }\n\n return components;\n }\n\n /**\n * Gets all components in a namespace and version as a map\n * @param namespace - Namespace to query (default: 'Global')\n * @param version - Version to query (default: 'v1')\n * @returns Object mapping component names to component objects\n */\n getAll(namespace: string = 'Global', version: string = 'v1'): Record<string, ComponentObject> {\n const components: Record<string, ComponentObject> = {};\n \n for (const entry of this.registry.values()) {\n if (entry.metadata.namespace === namespace && entry.metadata.version === version) {\n components[entry.metadata.name] = entry.component;\n }\n }\n\n return components;\n }\n\n /**\n * Gets all registered namespaces\n * @returns Array of unique namespace names\n */\n getNamespaces(): string[] {\n const namespaces = new Set<string>();\n \n for (const entry of this.registry.values()) {\n namespaces.add(entry.metadata.namespace);\n }\n\n return Array.from(namespaces);\n }\n\n /**\n * Gets components by tags\n * @param tags - Tags to search for\n * @returns Array of components matching any of the tags\n */\n getByTags(tags: string[]): ComponentMetadata[] {\n const components: ComponentMetadata[] = [];\n \n for (const entry of this.registry.values()) {\n if (entry.metadata.tags?.some(tag => tags.includes(tag))) {\n components.push(entry.metadata);\n }\n }\n\n return components;\n }\n\n /**\n * Decrements reference count for a component\n * @param name - Component name\n * @param namespace - Component namespace\n * @param version - Component version\n */\n release(name: string, namespace: string = 'Global', version?: string): void {\n const id = version \n ? this.generateRegistryKey(name, namespace, version)\n : this.findLatestVersion(name, namespace);\n\n if (!id) return;\n\n const entry = this.registry.get(id);\n if (entry && entry.refCount > 0) {\n entry.refCount--;\n }\n }\n\n /**\n * Clears all components from the registry\n */\n clear(): void {\n this.registry.clear();\n }\n\n /**\n * Gets the current size of the registry\n * @returns Number of registered components\n */\n size(): number {\n return this.registry.size;\n }\n\n /**\n * Performs cleanup of unused components\n * @param force - Force cleanup regardless of reference count\n * @returns Number of components removed\n */\n cleanup(force: boolean = false): number {\n const toRemove: string[] = [];\n const now = Date.now();\n\n for (const [id, entry] of this.registry) {\n // Remove if no references and hasn't been accessed recently\n const timeSinceAccess = now - entry.lastAccessed.getTime();\n const isUnused = entry.refCount === 0 && timeSinceAccess > this.config.cleanupInterval;\n\n if (force || isUnused) {\n toRemove.push(id);\n }\n }\n\n for (const id of toRemove) {\n this.registry.delete(id);\n }\n\n return toRemove.length;\n }\n\n /**\n * Gets registry statistics\n * @returns Object containing registry stats\n */\n getStats(): {\n totalComponents: number;\n namespaces: number;\n totalRefCount: number;\n oldestComponent?: Date;\n newestComponent?: Date;\n } {\n let totalRefCount = 0;\n let oldest: Date | undefined;\n let newest: Date | undefined;\n\n for (const entry of this.registry.values()) {\n totalRefCount += entry.refCount;\n \n if (!oldest || entry.metadata.registeredAt < oldest) {\n oldest = entry.metadata.registeredAt;\n }\n \n if (!newest || entry.metadata.registeredAt > newest) {\n newest = entry.metadata.registeredAt;\n }\n }\n\n return {\n totalComponents: this.registry.size,\n namespaces: this.getNamespaces().length,\n totalRefCount,\n oldestComponent: oldest,\n newestComponent: newest\n };\n }\n\n /**\n * Destroys the registry and cleans up resources\n */\n destroy(): void {\n this.stopCleanupTimer();\n this.clear();\n // Clean up any resources associated with this registry\n resourceManager.cleanupComponent(this.registryId);\n }\n\n /**\n * Generates a unique registry key\n * @param name - Component name\n * @param namespace - Component namespace\n * @param version - Component version\n * @returns Registry key\n */\n private generateRegistryKey(name: string, namespace: string, version: string): string {\n if (this.config.enableNamespaces) {\n return `${namespace}::${name}@${version}`;\n }\n return `${name}@${version}`;\n }\n\n /**\n * Finds the latest version of a component\n * @param name - Component name\n * @param namespace - Component namespace\n * @returns Registry key of latest version or undefined\n */\n private findLatestVersion(name: string, namespace: string): string | undefined {\n let latestKey: string | undefined;\n let latestDate: Date | undefined;\n\n for (const [key, entry] of this.registry) {\n if (entry.metadata.name === name && \n entry.metadata.namespace === namespace) {\n if (!latestDate || entry.metadata.registeredAt > latestDate) {\n latestDate = entry.metadata.registeredAt;\n latestKey = key;\n }\n }\n }\n\n return latestKey;\n }\n\n /**\n * Evicts the least recently used component\n */\n private evictLRU(): void {\n let lruKey: string | undefined;\n let lruTime: Date | undefined;\n\n for (const [key, entry] of this.registry) {\n // Skip components with active references\n if (entry.refCount > 0) continue;\n\n if (!lruTime || entry.lastAccessed < lruTime) {\n lruTime = entry.lastAccessed;\n lruKey = key;\n }\n }\n\n if (lruKey) {\n this.registry.delete(lruKey);\n }\n }\n\n /**\n * Starts the automatic cleanup timer\n */\n private startCleanupTimer(): void {\n this.cleanupTimer = resourceManager.setInterval(\n this.registryId,\n () => {\n this.cleanup();\n },\n this.config.cleanupInterval,\n { purpose: 'component-registry-cleanup' }\n );\n }\n\n /**\n * Stops the automatic cleanup timer\n */\n private stopCleanupTimer(): void {\n if (this.cleanupTimer) {\n resourceManager.clearInterval(this.registryId, this.cleanupTimer as number);\n this.cleanupTimer = undefined;\n }\n }\n}"]}
1
+ {"version":3,"file":"component-registry.js","sourceRoot":"","sources":["../../src/registry/component-registry.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Platform-agnostic component registry for managing compiled React components.\n * Provides storage, retrieval, and lifecycle management for components with namespace support.\n * @module @memberjunction/react-runtime/registry\n */\n\nimport { \n RegistryEntry, \n ComponentMetadata, \n RegistryConfig \n} from '../types';\nimport { ComponentObject } from '@memberjunction/interactive-component-types';\nimport { resourceManager } from '../utilities/resource-manager';\n\n/**\n * Default registry configuration\n */\nconst DEFAULT_REGISTRY_CONFIG: RegistryConfig = {\n maxComponents: 1000,\n cleanupInterval: 60000, // 1 minute\n useLRU: true,\n enableNamespaces: true\n};\n\n/**\n * Platform-agnostic component registry.\n * Manages compiled React components with namespace isolation and lifecycle management.\n */\nexport class ComponentRegistry {\n private registry: Map<string, RegistryEntry>;\n private config: RegistryConfig;\n private cleanupTimer?: NodeJS.Timeout | number;\n private registryId: string;\n \n /**\n * Creates a new ComponentRegistry instance\n * @param config - Optional registry configuration\n */\n constructor(config?: Partial<RegistryConfig>) {\n this.config = { ...DEFAULT_REGISTRY_CONFIG, ...config };\n this.registry = new Map();\n this.registryId = `component-registry-${Date.now()}`;\n \n // Start cleanup timer if configured\n if (this.config.cleanupInterval > 0) {\n this.startCleanupTimer();\n }\n }\n\n /**\n * Registers a compiled component\n * @param name - Component name\n * @param component - Compiled component object\n * @param namespace - Component namespace (default: 'Global')\n * @param version - Component version (default: 'v1')\n * @param tags - Optional tags for categorization\n * @returns The registered component's metadata\n */\n register(\n name: string,\n component: ComponentObject,\n namespace: string = 'Global',\n version: string = 'v1',\n tags?: string[]\n ): ComponentMetadata {\n const id = this.generateRegistryKey(name, namespace, version);\n \n // Create metadata\n const metadata: ComponentMetadata = {\n id,\n name,\n version,\n namespace,\n registeredAt: new Date(),\n tags\n };\n\n // Create registry entry\n const entry: RegistryEntry = {\n component,\n metadata,\n lastAccessed: new Date(),\n refCount: 0\n };\n\n // Check capacity\n if (this.registry.size >= this.config.maxComponents && this.config.useLRU) {\n this.evictLRU();\n }\n\n // Store in registry\n this.registry.set(id, entry);\n\n return metadata;\n }\n\n /**\n * Gets a component from the registry\n * @param name - Component name\n * @param namespace - Component namespace\n * @param version - Component version\n * @returns The component object if found, undefined otherwise\n */\n get(name: string, namespace: string = 'Global', version?: string): ComponentObject | undefined {\n const id = version \n ? this.generateRegistryKey(name, namespace, version)\n : this.findLatestVersion(name, namespace);\n\n if (!id) return undefined;\n\n const entry = this.registry.get(id);\n if (entry) {\n // Update access time and increment ref count\n entry.lastAccessed = new Date();\n entry.refCount++;\n return entry.component;\n }\n\n return undefined;\n }\n\n /**\n * Checks if a component exists in the registry\n * @param name - Component name\n * @param namespace - Component namespace\n * @param version - Component version\n * @returns true if the component exists\n */\n has(name: string, namespace: string = 'Global', version?: string): boolean {\n const id = version \n ? this.generateRegistryKey(name, namespace, version)\n : this.findLatestVersion(name, namespace);\n\n return id ? this.registry.has(id) : false;\n }\n\n /**\n * Removes a component from the registry\n * @param name - Component name\n * @param namespace - Component namespace\n * @param version - Component version\n * @returns true if the component was removed\n */\n unregister(name: string, namespace: string = 'Global', version?: string): boolean {\n const id = version \n ? this.generateRegistryKey(name, namespace, version)\n : this.findLatestVersion(name, namespace);\n\n if (!id) return false;\n\n return this.registry.delete(id);\n }\n\n /**\n * Gets all components in a namespace\n * @param namespace - Namespace to query\n * @returns Array of components in the namespace\n */\n getNamespace(namespace: string): ComponentMetadata[] {\n const components: ComponentMetadata[] = [];\n \n for (const entry of this.registry.values()) {\n if (entry.metadata.namespace === namespace) {\n components.push(entry.metadata);\n }\n }\n\n return components;\n }\n\n /**\n * Gets all components in a namespace and version as a map\n * @param namespace - Namespace to query (default: 'Global')\n * @param version - Version to query (default: 'v1')\n * @returns Object mapping component names to component objects\n */\n getAll(namespace: string = 'Global', version: string = 'v1'): Record<string, ComponentObject> {\n const components: Record<string, ComponentObject> = {};\n \n for (const entry of this.registry.values()) {\n if (entry.metadata.namespace === namespace && entry.metadata.version === version) {\n components[entry.metadata.name] = entry.component;\n }\n }\n\n return components;\n }\n\n /**\n * Gets all registered namespaces\n * @returns Array of unique namespace names\n */\n getNamespaces(): string[] {\n const namespaces = new Set<string>();\n \n for (const entry of this.registry.values()) {\n namespaces.add(entry.metadata.namespace);\n }\n\n return Array.from(namespaces);\n }\n\n /**\n * Gets components by tags\n * @param tags - Tags to search for\n * @returns Array of components matching any of the tags\n */\n getByTags(tags: string[]): ComponentMetadata[] {\n const components: ComponentMetadata[] = [];\n \n for (const entry of this.registry.values()) {\n if (entry.metadata.tags?.some(tag => tags.includes(tag))) {\n components.push(entry.metadata);\n }\n }\n\n return components;\n }\n\n /**\n * Decrements reference count for a component\n * @param name - Component name\n * @param namespace - Component namespace\n * @param version - Component version\n */\n release(name: string, namespace: string = 'Global', version?: string): void {\n const id = version \n ? this.generateRegistryKey(name, namespace, version)\n : this.findLatestVersion(name, namespace);\n\n if (!id) return;\n\n const entry = this.registry.get(id);\n if (entry && entry.refCount > 0) {\n entry.refCount--;\n }\n }\n\n /**\n * Clears all components from the registry\n */\n clear(): void {\n this.registry.clear();\n }\n\n /**\n * Clear all components in a specific namespace\n * @param namespace - Namespace to clear (default: 'Global')\n * @returns Number of components removed\n */\n clearNamespace(namespace: string = 'Global'): number {\n const toRemove: string[] = [];\n for (const [key, entry] of this.registry) {\n if (entry.metadata.namespace === namespace) {\n toRemove.push(key);\n }\n }\n for (const key of toRemove) {\n this.registry.delete(key);\n }\n return toRemove.length;\n }\n\n /**\n * Force clear all components and reset registry\n * Used for development/testing scenarios\n */\n forceClear(): void {\n this.stopCleanupTimer();\n this.registry.clear();\n console.log('🧹 Registry force cleared - all components removed');\n }\n\n /**\n * Gets the current size of the registry\n * @returns Number of registered components\n */\n size(): number {\n return this.registry.size;\n }\n\n /**\n * Performs cleanup of unused components\n * @param force - Force cleanup regardless of reference count\n * @returns Number of components removed\n */\n cleanup(force: boolean = false): number {\n const toRemove: string[] = [];\n const now = Date.now();\n\n for (const [id, entry] of this.registry) {\n // Remove if no references and hasn't been accessed recently\n const timeSinceAccess = now - entry.lastAccessed.getTime();\n const isUnused = entry.refCount === 0 && timeSinceAccess > this.config.cleanupInterval;\n\n if (force || isUnused) {\n toRemove.push(id);\n }\n }\n\n for (const id of toRemove) {\n this.registry.delete(id);\n }\n\n return toRemove.length;\n }\n\n /**\n * Gets registry statistics\n * @returns Object containing registry stats\n */\n getStats(): {\n totalComponents: number;\n namespaces: number;\n totalRefCount: number;\n oldestComponent?: Date;\n newestComponent?: Date;\n } {\n let totalRefCount = 0;\n let oldest: Date | undefined;\n let newest: Date | undefined;\n\n for (const entry of this.registry.values()) {\n totalRefCount += entry.refCount;\n \n if (!oldest || entry.metadata.registeredAt < oldest) {\n oldest = entry.metadata.registeredAt;\n }\n \n if (!newest || entry.metadata.registeredAt > newest) {\n newest = entry.metadata.registeredAt;\n }\n }\n\n return {\n totalComponents: this.registry.size,\n namespaces: this.getNamespaces().length,\n totalRefCount,\n oldestComponent: oldest,\n newestComponent: newest\n };\n }\n\n /**\n * Destroys the registry and cleans up resources\n */\n destroy(): void {\n this.stopCleanupTimer();\n this.clear();\n // Clean up any resources associated with this registry\n resourceManager.cleanupComponent(this.registryId);\n }\n\n /**\n * Generates a unique registry key\n * @param name - Component name\n * @param namespace - Component namespace\n * @param version - Component version\n * @returns Registry key\n */\n private generateRegistryKey(name: string, namespace: string, version: string): string {\n if (this.config.enableNamespaces) {\n return `${namespace}::${name}@${version}`;\n }\n return `${name}@${version}`;\n }\n\n /**\n * Finds the latest version of a component\n * @param name - Component name\n * @param namespace - Component namespace\n * @returns Registry key of latest version or undefined\n */\n private findLatestVersion(name: string, namespace: string): string | undefined {\n let latestKey: string | undefined;\n let latestDate: Date | undefined;\n\n for (const [key, entry] of this.registry) {\n if (entry.metadata.name === name && \n entry.metadata.namespace === namespace) {\n if (!latestDate || entry.metadata.registeredAt > latestDate) {\n latestDate = entry.metadata.registeredAt;\n latestKey = key;\n }\n }\n }\n\n return latestKey;\n }\n\n /**\n * Evicts the least recently used component\n */\n private evictLRU(): void {\n let lruKey: string | undefined;\n let lruTime: Date | undefined;\n\n for (const [key, entry] of this.registry) {\n // Skip components with active references\n if (entry.refCount > 0) continue;\n\n if (!lruTime || entry.lastAccessed < lruTime) {\n lruTime = entry.lastAccessed;\n lruKey = key;\n }\n }\n\n if (lruKey) {\n this.registry.delete(lruKey);\n }\n }\n\n /**\n * Starts the automatic cleanup timer\n */\n private startCleanupTimer(): void {\n this.cleanupTimer = resourceManager.setInterval(\n this.registryId,\n () => {\n this.cleanup();\n },\n this.config.cleanupInterval,\n { purpose: 'component-registry-cleanup' }\n );\n }\n\n /**\n * Stops the automatic cleanup timer\n */\n private stopCleanupTimer(): void {\n if (this.cleanupTimer) {\n resourceManager.clearInterval(this.registryId, this.cleanupTimer as number);\n this.cleanupTimer = undefined;\n }\n }\n}"]}
@@ -1 +1 @@
1
- {"version":3,"file":"component-resolver.d.ts","sourceRoot":"","sources":["../../src/registry/component-resolver.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAMhD,MAAM,WAAW,kBAAkB;IACjC,CAAC,aAAa,EAAE,MAAM,GAAG,GAAG,CAAC;CAC9B;AAMD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,eAAe,CAAyC;IAChE,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,eAAe,CAAoC;IAC3D,OAAO,CAAC,KAAK,CAAkB;gBAU7B,QAAQ,EAAE,iBAAiB,EAC3B,QAAQ,CAAC,EAAE,iBAAiB,EAC5B,cAAc,CAAC,EAAE,cAAc,EAC/B,KAAK,GAAE,OAAe;IAoBlB,iBAAiB,CACrB,IAAI,EAAE,aAAa,EACnB,SAAS,GAAE,MAAiB,EAC5B,WAAW,CAAC,EAAE,QAAQ,GACrB,OAAO,CAAC,kBAAkB,CAAC;YA0ChB,yBAAyB;IAuFvC,OAAO,IAAI,IAAI;IAiBf,oBAAoB,CAAC,IAAI,EAAE,aAAa,EAAE,SAAS,GAAE,MAAiB,GAAG,MAAM,EAAE;IAgBjF,OAAO,CAAC,iBAAiB;IA0BzB,kBAAkB,CAAC,IAAI,EAAE,aAAa,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAe9D,OAAO,CAAC,oBAAoB;IAwB5B,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,EAAE;IAuB3C,OAAO,CAAC,kBAAkB;IAwB1B,cAAc,CAAC,IAAI,EAAE,aAAa,EAAE,SAAS,GAAE,MAAiB,GAAG,KAAK,CAAC;QACvE,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,GAAG,CAAC;KAChB,CAAC;IAmBF,qBAAqB,CAAC,IAAI,EAAE,aAAa,GAAG,aAAa,EAAE;IAe3D,OAAO,CAAC,qBAAqB;CAe9B"}
1
+ {"version":3,"file":"component-resolver.d.ts","sourceRoot":"","sources":["../../src/registry/component-resolver.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAMhD,MAAM,WAAW,kBAAkB;IACjC,CAAC,aAAa,EAAE,MAAM,GAAG,GAAG,CAAC;CAC9B;AAMD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,eAAe,CAAyC;IAChE,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,eAAe,CAAoC;IAC3D,OAAO,CAAC,KAAK,CAAkB;gBAU7B,QAAQ,EAAE,iBAAiB,EAC3B,QAAQ,CAAC,EAAE,iBAAiB,EAC5B,cAAc,CAAC,EAAE,cAAc,EAC/B,KAAK,GAAE,OAAe;IAoBlB,iBAAiB,CACrB,IAAI,EAAE,aAAa,EACnB,SAAS,GAAE,MAAiB,EAC5B,WAAW,CAAC,EAAE,QAAQ,GACrB,OAAO,CAAC,kBAAkB,CAAC;YAiEhB,yBAAyB;IAyIvC,OAAO,IAAI,IAAI;IAiBf,oBAAoB,CAAC,IAAI,EAAE,aAAa,EAAE,SAAS,GAAE,MAAiB,GAAG,MAAM,EAAE;IAgBjF,OAAO,CAAC,iBAAiB;IA0BzB,kBAAkB,CAAC,IAAI,EAAE,aAAa,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAe9D,OAAO,CAAC,oBAAoB;IAwB5B,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,EAAE;IAuB3C,OAAO,CAAC,kBAAkB;IAwB1B,cAAc,CAAC,IAAI,EAAE,aAAa,EAAE,SAAS,GAAE,MAAiB,GAAG,KAAK,CAAC;QACvE,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,GAAG,CAAC;KAChB,CAAC;IAmBF,qBAAqB,CAAC,IAAI,EAAE,aAAa,GAAG,aAAa,EAAE;IAe3D,OAAO,CAAC,qBAAqB;CAe9B"}
@@ -20,30 +20,54 @@ class ComponentResolver {
20
20
  }
21
21
  }
22
22
  async resolveComponents(spec, namespace = 'Global', contextUser) {
23
+ console.log(`🚀 [ComponentResolver] Starting component resolution for: ${spec.name}`);
24
+ console.log(`📋 [ComponentResolver] Dependencies to resolve:`, (spec.dependencies || []).map(d => ({
25
+ name: d.name,
26
+ location: d.location,
27
+ namespace: d.namespace
28
+ })));
23
29
  const resolved = {};
24
30
  if (this.registryService) {
31
+ console.log(`🔄 [ComponentResolver] Initializing component engine...`);
25
32
  await this.componentEngine.Config(false, contextUser);
33
+ console.log(`✅ [ComponentResolver] Component engine initialized with ${this.componentEngine.Components?.length || 0} components`);
26
34
  }
27
35
  await this.resolveComponentHierarchy(spec, resolved, namespace, new Set(), contextUser);
36
+ console.log(`📊 [ComponentResolver] Resolved components before unwrapping:`, Object.keys(resolved));
28
37
  const unwrapped = {};
29
38
  for (const [name, value] of Object.entries(resolved)) {
30
39
  if (value && typeof value === 'object' && 'component' in value) {
31
40
  if (typeof value.component === 'function') {
32
41
  unwrapped[name] = value.component;
42
+ console.log(`✅ [ComponentResolver] Unwrapped component: ${name} (was object with .component)`);
33
43
  }
34
44
  else {
35
- console.error(`Component ${name} has invalid component property:`, typeof value.component, value);
45
+ console.error(`❌ [ComponentResolver] Component ${name} has invalid component property:`, typeof value.component, value);
36
46
  unwrapped[name] = value;
37
47
  }
38
48
  }
49
+ else if (typeof value === 'function') {
50
+ unwrapped[name] = value;
51
+ console.log(`✅ [ComponentResolver] Component already a function: ${name}`);
52
+ }
39
53
  else {
54
+ console.warn(`⚠️ [ComponentResolver] Component ${name} is not a function or wrapped component:`, typeof value, value);
40
55
  unwrapped[name] = value;
41
56
  }
42
57
  }
58
+ console.log(`🎯 [ComponentResolver] Final resolved components:`, Object.keys(unwrapped).map(name => ({
59
+ name,
60
+ type: typeof unwrapped[name],
61
+ isUndefined: unwrapped[name] === undefined
62
+ })));
43
63
  return unwrapped;
44
64
  }
45
65
  async resolveComponentHierarchy(spec, resolved, namespace, visited = new Set(), contextUser) {
46
66
  const componentId = `${spec.namespace || namespace}/${spec.name}@${spec.version || 'latest'}`;
67
+ if (resolved[spec.name]) {
68
+ console.log(`⏭️ [ComponentResolver] Component already resolved: ${spec.name}`);
69
+ return;
70
+ }
47
71
  if (visited.has(componentId)) {
48
72
  if (this.debug) {
49
73
  console.warn(`Circular dependency detected for component: ${componentId}`);
@@ -51,18 +75,48 @@ class ComponentResolver {
51
75
  return;
52
76
  }
53
77
  visited.add(componentId);
78
+ console.log(`🔄 [ComponentResolver] Resolving dependencies for ${spec.name} BEFORE resolving itself`);
79
+ const children = spec.dependencies || [];
80
+ for (const child of children) {
81
+ console.log(` ↳ [ComponentResolver] Resolving dependency: ${child.name} for parent ${spec.name}`);
82
+ await this.resolveComponentHierarchy(child, resolved, namespace, visited, contextUser);
83
+ }
84
+ if (children.length > 0) {
85
+ console.log(`✅ [ComponentResolver] All ${children.length} dependencies resolved for ${spec.name}, now resolving itself`);
86
+ }
54
87
  if (spec.location === 'registry' && this.registryService) {
88
+ console.log(`🔍 [ComponentResolver] Looking for registry component: ${spec.name} in namespace: ${spec.namespace || namespace}`);
55
89
  try {
90
+ const allComponents = this.componentEngine.Components || [];
91
+ console.log(`📊 [ComponentResolver] Total components in engine: ${allComponents.length}`);
92
+ const matchingNames = allComponents.filter((c) => c.Name === spec.name);
93
+ if (matchingNames.length > 0) {
94
+ console.log(`🔎 [ComponentResolver] Found ${matchingNames.length} components with name "${spec.name}":`, matchingNames.map((c) => ({
95
+ ID: c.ID,
96
+ Name: c.Name,
97
+ Namespace: c.Namespace,
98
+ Version: c.Version,
99
+ Status: c.Status
100
+ })));
101
+ }
56
102
  const component = this.componentEngine.Components?.find((c) => c.Name === spec.name &&
57
103
  c.Namespace === (spec.namespace || namespace));
58
104
  if (component) {
105
+ console.log(`✅ [ComponentResolver] Found component in DB:`, {
106
+ ID: component.ID,
107
+ Name: component.Name,
108
+ Namespace: component.Namespace,
109
+ Version: component.Version
110
+ });
59
111
  const compiledComponent = await this.registryService.getCompiledComponent(component.ID, this.resolverInstanceId, contextUser);
60
112
  resolved[spec.name] = compiledComponent;
113
+ console.log(`📦 [ComponentResolver] Successfully compiled and resolved: ${spec.name}, type: ${typeof compiledComponent}`);
61
114
  if (this.debug) {
62
115
  console.log(`📦 Resolved registry component: ${spec.name} from ${componentId}`);
63
116
  }
64
117
  }
65
118
  else {
119
+ console.error(`❌❌❌❌❌ [ComponentResolver] Registry component NOT found in database: ${spec.name} with namespace: ${spec.namespace || namespace} ❌❌❌❌`);
66
120
  if (this.debug) {
67
121
  console.warn(`Registry component not found in database: ${spec.name}`);
68
122
  }
@@ -76,31 +130,32 @@ class ComponentResolver {
76
130
  }
77
131
  else {
78
132
  const componentNamespace = spec.namespace || namespace;
133
+ console.log(`🔍 [ComponentResolver] Looking for embedded component: ${spec.name} in namespace: ${componentNamespace}`);
79
134
  const component = this.registry.get(spec.name, componentNamespace);
80
135
  if (component) {
81
136
  resolved[spec.name] = component;
137
+ console.log(`✅ [ComponentResolver] Found embedded component: ${spec.name}, type: ${typeof component}`);
82
138
  if (this.debug) {
83
139
  console.log(`📄 Resolved embedded component: ${spec.name} from namespace ${componentNamespace}, type:`, typeof component);
84
140
  }
85
141
  }
86
142
  else {
143
+ console.log(`⚠️ [ComponentResolver] Not found in namespace ${componentNamespace}, trying fallback namespace: ${namespace}`);
87
144
  const fallbackComponent = this.registry.get(spec.name, namespace);
88
145
  if (fallbackComponent) {
89
146
  resolved[spec.name] = fallbackComponent;
147
+ console.log(`✅ [ComponentResolver] Found embedded component in fallback namespace: ${spec.name}, type: ${typeof fallbackComponent}`);
90
148
  if (this.debug) {
91
149
  console.log(`📄 Resolved embedded component: ${spec.name} from fallback namespace ${namespace}, type:`, typeof fallbackComponent);
92
150
  }
93
151
  }
94
152
  else {
153
+ console.error(`❌ [ComponentResolver] Could not resolve embedded component: ${spec.name} in namespace ${componentNamespace} or ${namespace}`);
95
154
  console.warn(`⚠️ Could not resolve embedded component: ${spec.name} in namespace ${componentNamespace} or ${namespace}`);
96
155
  resolved[spec.name] = undefined;
97
156
  }
98
157
  }
99
158
  }
100
- const children = spec.dependencies || [];
101
- for (const child of children) {
102
- await this.resolveComponentHierarchy(child, resolved, namespace, visited, contextUser);
103
- }
104
159
  }
105
160
  cleanup() {
106
161
  if (this.registryService) {
@@ -1 +1 @@
1
- {"version":3,"file":"component-resolver.js","sourceRoot":"","sources":["../../src/registry/component-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Component dependency resolver for managing component relationships.\n * Handles resolution of child components and dependency graphs.\n * @module @memberjunction/react-runtime/registry\n */\n\nimport { ComponentRegistry } from './component-registry';\nimport { ComponentRegistryService } from './component-registry-service';\nimport { ComponentSpec } from '@memberjunction/interactive-component-types';\nimport { ComponentCompiler } from '../compiler';\nimport { RuntimeContext } from '../types';\nimport { UserInfo } from '@memberjunction/core';\nimport { ComponentMetadataEngine } from '@memberjunction/core-entities';\n\n/**\n * Resolved component map for passing to React components\n */\nexport interface ResolvedComponents {\n [componentName: string]: any;\n}\n\n/**\n * Component dependency resolver.\n * Resolves component hierarchies and manages dependencies between components.\n */\nexport class ComponentResolver {\n private registry: ComponentRegistry;\n private registryService: ComponentRegistryService | null = null;\n private resolverInstanceId: string;\n private compiler: ComponentCompiler | null = null;\n private runtimeContext: RuntimeContext | null = null;\n private componentEngine = ComponentMetadataEngine.Instance;\n private debug: boolean = false;\n\n /**\n * Creates a new ComponentResolver instance\n * @param registry - Component registry to use for resolution\n * @param compiler - Optional compiler for registry-based components\n * @param runtimeContext - Optional runtime context for registry-based components\n * @param debug - Enable debug logging (defaults to false)\n */\n constructor(\n registry: ComponentRegistry,\n compiler?: ComponentCompiler,\n runtimeContext?: RuntimeContext,\n debug: boolean = false\n ) {\n this.registry = registry;\n this.resolverInstanceId = `resolver-${Date.now()}-${Math.random()}`;\n this.debug = debug;\n \n if (compiler && runtimeContext) {\n this.compiler = compiler;\n this.runtimeContext = runtimeContext;\n this.registryService = ComponentRegistryService.getInstance(compiler, runtimeContext, debug);\n }\n }\n\n /**\n * Resolves all components for a given component specification\n * @param spec - Root component specification\n * @param namespace - Namespace for component resolution\n * @param contextUser - Optional user context for database operations\n * @returns Map of component names to resolved components\n */\n async resolveComponents(\n spec: ComponentSpec, \n namespace: string = 'Global',\n contextUser?: UserInfo\n ): Promise<ResolvedComponents> {\n const resolved: ResolvedComponents = {};\n \n // Initialize component engine if we have registry service\n if (this.registryService) {\n await this.componentEngine.Config(false, contextUser);\n }\n \n // Resolve the component hierarchy\n await this.resolveComponentHierarchy(spec, resolved, namespace, new Set(), contextUser);\n \n // Unwrap component wrappers before returning\n // Components from the registry come as objects with component/print/refresh properties\n // We need to extract just the component function for use in child components\n const unwrapped: ResolvedComponents = {};\n for (const [name, value] of Object.entries(resolved)) {\n if (value && typeof value === 'object' && 'component' in value) {\n if (typeof value.component === 'function') {\n // This is a wrapped component - extract the actual React component function\n unwrapped[name] = value.component;\n } else {\n // ComponentObject has a component property but it's not a function\n console.error(`Component ${name} has invalid component property:`, typeof value.component, value);\n unwrapped[name] = value; // Pass through the problematic value so we can see the error\n }\n } else {\n // This is already a plain component function or something else\n unwrapped[name] = value;\n }\n }\n \n return unwrapped;\n }\n\n /**\n * Recursively resolves a component hierarchy\n * @param spec - Component specification\n * @param resolved - Map to store resolved components\n * @param namespace - Namespace for resolution\n * @param visited - Set of visited component names to prevent cycles\n * @param contextUser - Optional user context for database operations\n */\n private async resolveComponentHierarchy(\n spec: ComponentSpec,\n resolved: ResolvedComponents,\n namespace: string,\n visited: Set<string> = new Set(),\n contextUser?: UserInfo\n ): Promise<void> {\n // Create a unique identifier for this component\n const componentId = `${spec.namespace || namespace}/${spec.name}@${spec.version || 'latest'}`;\n \n // Prevent circular dependencies\n if (visited.has(componentId)) {\n if (this.debug) {\n console.warn(`Circular dependency detected for component: ${componentId}`);\n }\n return;\n }\n visited.add(componentId);\n\n // Handle based on location\n if (spec.location === 'registry' && this.registryService) {\n // Registry component - need to load from database or external source\n try {\n // First, try to find the component in the metadata engine\n const component = this.componentEngine.Components?.find(\n (c: any) => c.Name === spec.name && \n c.Namespace === (spec.namespace || namespace)\n );\n \n if (component) {\n // Get compiled component from registry service\n const compiledComponent = await this.registryService.getCompiledComponent(\n component.ID,\n this.resolverInstanceId,\n contextUser\n );\n resolved[spec.name] = compiledComponent;\n if (this.debug) {\n console.log(`📦 Resolved registry component: ${spec.name} from ${componentId}`);\n }\n } else {\n if (this.debug) {\n console.warn(`Registry component not found in database: ${spec.name}`);\n }\n }\n } catch (error) {\n if (this.debug) {\n console.error(`Failed to load registry component ${spec.name}:`, error);\n }\n }\n } else {\n // Embedded component - get from local registry\n // Use the component's specified namespace if it has one, otherwise use parent's namespace\n const componentNamespace = spec.namespace || namespace;\n const component = this.registry.get(spec.name, componentNamespace);\n if (component) {\n resolved[spec.name] = component;\n if (this.debug) {\n console.log(`📄 Resolved embedded component: ${spec.name} from namespace ${componentNamespace}, type:`, typeof component);\n }\n } else {\n // If not found with specified namespace, try the parent namespace as fallback\n const fallbackComponent = this.registry.get(spec.name, namespace);\n if (fallbackComponent) {\n resolved[spec.name] = fallbackComponent;\n if (this.debug) {\n console.log(`📄 Resolved embedded component: ${spec.name} from fallback namespace ${namespace}, type:`, typeof fallbackComponent);\n }\n } else {\n // Component not found - this might cause issues later\n console.warn(`⚠️ Could not resolve embedded component: ${spec.name} in namespace ${componentNamespace} or ${namespace}`);\n // Store undefined explicitly so we know it failed to resolve\n resolved[spec.name] = undefined;\n }\n }\n }\n\n // Process child components recursively\n const children = spec.dependencies || [];\n for (const child of children) {\n await this.resolveComponentHierarchy(child, resolved, namespace, visited, contextUser);\n }\n }\n\n /**\n * Cleanup resolver resources\n */\n cleanup(): void {\n // Remove our references when resolver is destroyed\n if (this.registryService) {\n // This would allow the registry service to clean up unused components\n // Implementation would track which components this resolver referenced\n if (this.debug) {\n console.log(`Cleaning up resolver: ${this.resolverInstanceId}`);\n }\n }\n }\n\n /**\n * Validates that all required components are available\n * @param spec - Component specification to validate\n * @param namespace - Namespace for validation\n * @returns Array of missing component names\n */\n validateDependencies(spec: ComponentSpec, namespace: string = 'Global'): string[] {\n const missing: string[] = [];\n const checked = new Set<string>();\n \n this.checkDependencies(spec, namespace, missing, checked);\n \n return missing;\n }\n\n /**\n * Recursively checks for missing dependencies\n * @param spec - Component specification\n * @param namespace - Namespace for checking\n * @param missing - Array to collect missing components\n * @param checked - Set of already checked components\n */\n private checkDependencies(\n spec: ComponentSpec,\n namespace: string,\n missing: string[],\n checked: Set<string>\n ): void {\n if (checked.has(spec.name)) return;\n checked.add(spec.name);\n\n // Check if component exists in registry\n if (!this.registry.has(spec.name, namespace)) {\n missing.push(spec.name);\n }\n\n // Check children\n const children = spec.dependencies || [];\n for (const child of children) {\n this.checkDependencies(child, namespace, missing, checked);\n }\n }\n\n /**\n * Gets the dependency graph for a component specification\n * @param spec - Component specification\n * @returns Dependency graph as adjacency list\n */\n getDependencyGraph(spec: ComponentSpec): Map<string, string[]> {\n const graph = new Map<string, string[]>();\n const visited = new Set<string>();\n \n this.buildDependencyGraph(spec, graph, visited);\n \n return graph;\n }\n\n /**\n * Recursively builds the dependency graph\n * @param spec - Component specification\n * @param graph - Graph to build\n * @param visited - Set of visited components\n */\n private buildDependencyGraph(\n spec: ComponentSpec,\n graph: Map<string, string[]>,\n visited: Set<string>\n ): void {\n if (visited.has(spec.name)) return;\n visited.add(spec.name);\n\n const children = spec.dependencies || [];\n const dependencies = children.map(child => child.name);\n \n graph.set(spec.name, dependencies);\n\n // Recursively process children\n for (const child of children) {\n this.buildDependencyGraph(child, graph, visited);\n }\n }\n\n /**\n * Performs topological sort on component dependencies\n * @param spec - Root component specification\n * @returns Array of component names in dependency order\n */\n getLoadOrder(spec: ComponentSpec): string[] {\n const graph = this.getDependencyGraph(spec);\n const visited = new Set<string>();\n const stack: string[] = [];\n\n // Perform DFS on all nodes\n for (const node of graph.keys()) {\n if (!visited.has(node)) {\n this.topologicalSortDFS(node, graph, visited, stack);\n }\n }\n\n // Reverse to get correct load order\n return stack.reverse();\n }\n\n /**\n * DFS helper for topological sort\n * @param node - Current node\n * @param graph - Dependency graph\n * @param visited - Set of visited nodes\n * @param stack - Result stack\n */\n private topologicalSortDFS(\n node: string,\n graph: Map<string, string[]>,\n visited: Set<string>,\n stack: string[]\n ): void {\n visited.add(node);\n\n const dependencies = graph.get(node) || [];\n for (const dep of dependencies) {\n if (!visited.has(dep)) {\n this.topologicalSortDFS(dep, graph, visited, stack);\n }\n }\n\n stack.push(node);\n }\n\n /**\n * Resolves components in the correct dependency order\n * @param spec - Root component specification\n * @param namespace - Namespace for resolution\n * @returns Ordered array of resolved components\n */\n resolveInOrder(spec: ComponentSpec, namespace: string = 'Global'): Array<{\n name: string;\n component: any;\n }> {\n const loadOrder = this.getLoadOrder(spec);\n const resolved: Array<{ name: string; component: any }> = [];\n\n for (const name of loadOrder) {\n const component = this.registry.get(name, namespace);\n if (component) {\n resolved.push({ name, component });\n }\n }\n\n return resolved;\n }\n\n /**\n * Creates a flattened list of all component specifications\n * @param spec - Root component specification\n * @returns Array of all component specs in the hierarchy\n */\n flattenComponentSpecs(spec: ComponentSpec): ComponentSpec[] {\n const flattened: ComponentSpec[] = [];\n const visited = new Set<string>();\n\n this.collectComponentSpecs(spec, flattened, visited);\n\n return flattened;\n }\n\n /**\n * Recursively collects component specifications\n * @param spec - Current component specification\n * @param collected - Array to collect specs\n * @param visited - Set of visited component names\n */\n private collectComponentSpecs(\n spec: ComponentSpec,\n collected: ComponentSpec[],\n visited: Set<string>\n ): void {\n if (visited.has(spec.name)) return;\n visited.add(spec.name);\n\n collected.push(spec);\n\n const children = spec.dependencies || [];\n for (const child of children) {\n this.collectComponentSpecs(child, collected, visited);\n }\n }\n}"]}
1
+ {"version":3,"file":"component-resolver.js","sourceRoot":"","sources":["../../src/registry/component-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Component dependency resolver for managing component relationships.\n * Handles resolution of child components and dependency graphs.\n * @module @memberjunction/react-runtime/registry\n */\n\nimport { ComponentRegistry } from './component-registry';\nimport { ComponentRegistryService } from './component-registry-service';\nimport { ComponentSpec } from '@memberjunction/interactive-component-types';\nimport { ComponentCompiler } from '../compiler';\nimport { RuntimeContext } from '../types';\nimport { UserInfo } from '@memberjunction/core';\nimport { ComponentMetadataEngine } from '@memberjunction/core-entities';\n\n/**\n * Resolved component map for passing to React components\n */\nexport interface ResolvedComponents {\n [componentName: string]: any;\n}\n\n/**\n * Component dependency resolver.\n * Resolves component hierarchies and manages dependencies between components.\n */\nexport class ComponentResolver {\n private registry: ComponentRegistry;\n private registryService: ComponentRegistryService | null = null;\n private resolverInstanceId: string;\n private compiler: ComponentCompiler | null = null;\n private runtimeContext: RuntimeContext | null = null;\n private componentEngine = ComponentMetadataEngine.Instance;\n private debug: boolean = false;\n\n /**\n * Creates a new ComponentResolver instance\n * @param registry - Component registry to use for resolution\n * @param compiler - Optional compiler for registry-based components\n * @param runtimeContext - Optional runtime context for registry-based components\n * @param debug - Enable debug logging (defaults to false)\n */\n constructor(\n registry: ComponentRegistry,\n compiler?: ComponentCompiler,\n runtimeContext?: RuntimeContext,\n debug: boolean = false\n ) {\n this.registry = registry;\n this.resolverInstanceId = `resolver-${Date.now()}-${Math.random()}`;\n this.debug = debug;\n \n if (compiler && runtimeContext) {\n this.compiler = compiler;\n this.runtimeContext = runtimeContext;\n this.registryService = ComponentRegistryService.getInstance(compiler, runtimeContext, debug);\n }\n }\n\n /**\n * Resolves all components for a given component specification\n * @param spec - Root component specification\n * @param namespace - Namespace for component resolution\n * @param contextUser - Optional user context for database operations\n * @returns Map of component names to resolved components\n */\n async resolveComponents(\n spec: ComponentSpec, \n namespace: string = 'Global',\n contextUser?: UserInfo\n ): Promise<ResolvedComponents> {\n console.log(`🚀 [ComponentResolver] Starting component resolution for: ${spec.name}`);\n console.log(`📋 [ComponentResolver] Dependencies to resolve:`, (spec.dependencies || []).map(d => ({\n name: d.name,\n location: d.location,\n namespace: d.namespace\n })));\n \n const resolved: ResolvedComponents = {};\n \n // Initialize component engine if we have registry service\n if (this.registryService) {\n console.log(`🔄 [ComponentResolver] Initializing component engine...`);\n await this.componentEngine.Config(false, contextUser);\n console.log(`✅ [ComponentResolver] Component engine initialized with ${this.componentEngine.Components?.length || 0} components`);\n }\n \n // Resolve the component hierarchy\n await this.resolveComponentHierarchy(spec, resolved, namespace, new Set(), contextUser);\n \n console.log(`📊 [ComponentResolver] Resolved components before unwrapping:`, Object.keys(resolved));\n \n // Unwrap component wrappers before returning\n // Components from the registry come as objects with component/print/refresh properties\n // We need to extract just the component function for use in child components\n const unwrapped: ResolvedComponents = {};\n for (const [name, value] of Object.entries(resolved)) {\n if (value && typeof value === 'object' && 'component' in value) {\n if (typeof value.component === 'function') {\n // This is a wrapped component - extract the actual React component function\n unwrapped[name] = value.component;\n console.log(`✅ [ComponentResolver] Unwrapped component: ${name} (was object with .component)`);\n } else {\n // ComponentObject has a component property but it's not a function\n console.error(`❌ [ComponentResolver] Component ${name} has invalid component property:`, typeof value.component, value);\n unwrapped[name] = value; // Pass through the problematic value so we can see the error\n }\n } else if (typeof value === 'function') {\n // Already a function - use as is\n unwrapped[name] = value;\n console.log(`✅ [ComponentResolver] Component already a function: ${name}`);\n } else {\n // Something else - could be undefined or an error\n console.warn(`⚠️ [ComponentResolver] Component ${name} is not a function or wrapped component:`, typeof value, value);\n unwrapped[name] = value; // Pass through for debugging\n }\n }\n \n console.log(`🎯 [ComponentResolver] Final resolved components:`, Object.keys(unwrapped).map(name => ({\n name,\n type: typeof unwrapped[name],\n isUndefined: unwrapped[name] === undefined\n })));\n \n return unwrapped;\n }\n\n /**\n * Recursively resolves a component hierarchy\n * @param spec - Component specification\n * @param resolved - Map to store resolved components\n * @param namespace - Namespace for resolution\n * @param visited - Set of visited component names to prevent cycles\n * @param contextUser - Optional user context for database operations\n */\n private async resolveComponentHierarchy(\n spec: ComponentSpec,\n resolved: ResolvedComponents,\n namespace: string,\n visited: Set<string> = new Set(),\n contextUser?: UserInfo\n ): Promise<void> {\n // Create a unique identifier for this component\n const componentId = `${spec.namespace || namespace}/${spec.name}@${spec.version || 'latest'}`;\n \n // Check if already resolved (not just visited)\n if (resolved[spec.name]) {\n console.log(`⏭️ [ComponentResolver] Component already resolved: ${spec.name}`);\n return;\n }\n \n // Prevent circular dependencies\n if (visited.has(componentId)) {\n if (this.debug) {\n console.warn(`Circular dependency detected for component: ${componentId}`);\n }\n return;\n }\n visited.add(componentId);\n\n // *** CRITICAL: Process child components FIRST (depth-first, post-order) ***\n console.log(`🔄 [ComponentResolver] Resolving dependencies for ${spec.name} BEFORE resolving itself`);\n const children = spec.dependencies || [];\n for (const child of children) {\n console.log(` ↳ [ComponentResolver] Resolving dependency: ${child.name} for parent ${spec.name}`);\n await this.resolveComponentHierarchy(child, resolved, namespace, visited, contextUser);\n }\n if (children.length > 0) {\n console.log(`✅ [ComponentResolver] All ${children.length} dependencies resolved for ${spec.name}, now resolving itself`);\n }\n\n // NOW resolve the current component (it can access its dependencies)\n // Handle based on location\n if (spec.location === 'registry' && this.registryService) {\n // Registry component - need to load from database or external source\n console.log(`🔍 [ComponentResolver] Looking for registry component: ${spec.name} in namespace: ${spec.namespace || namespace}`);\n \n try {\n // First, try to find the component in the metadata engine\n const allComponents = this.componentEngine.Components || [];\n console.log(`📊 [ComponentResolver] Total components in engine: ${allComponents.length}`);\n \n // Log all matching names to see duplicates\n const matchingNames = allComponents.filter((c: any) => c.Name === spec.name);\n if (matchingNames.length > 0) {\n console.log(`🔎 [ComponentResolver] Found ${matchingNames.length} components with name \"${spec.name}\":`, \n matchingNames.map((c: any) => ({\n ID: c.ID,\n Name: c.Name,\n Namespace: c.Namespace,\n Version: c.Version,\n Status: c.Status\n }))\n );\n }\n \n const component = this.componentEngine.Components?.find(\n (c: any) => c.Name === spec.name && \n c.Namespace === (spec.namespace || namespace)\n );\n \n if (component) {\n console.log(`✅ [ComponentResolver] Found component in DB:`, {\n ID: component.ID,\n Name: component.Name,\n Namespace: component.Namespace,\n Version: component.Version\n });\n \n // Get compiled component from registry service\n const compiledComponent = await this.registryService.getCompiledComponent(\n component.ID,\n this.resolverInstanceId,\n contextUser\n );\n resolved[spec.name] = compiledComponent;\n console.log(`📦 [ComponentResolver] Successfully compiled and resolved: ${spec.name}, type: ${typeof compiledComponent}`);\n \n if (this.debug) {\n console.log(`📦 Resolved registry component: ${spec.name} from ${componentId}`);\n }\n } else {\n console.error(`❌❌❌❌❌ [ComponentResolver] Registry component NOT found in database: ${spec.name} with namespace: ${spec.namespace || namespace} ❌❌❌❌`);\n if (this.debug) {\n console.warn(`Registry component not found in database: ${spec.name}`);\n }\n }\n } catch (error) {\n if (this.debug) {\n console.error(`Failed to load registry component ${spec.name}:`, error);\n }\n }\n } else {\n // Embedded component - get from local registry\n // Use the component's specified namespace if it has one, otherwise use parent's namespace\n const componentNamespace = spec.namespace || namespace;\n console.log(`🔍 [ComponentResolver] Looking for embedded component: ${spec.name} in namespace: ${componentNamespace}`);\n \n const component = this.registry.get(spec.name, componentNamespace);\n if (component) {\n resolved[spec.name] = component;\n console.log(`✅ [ComponentResolver] Found embedded component: ${spec.name}, type: ${typeof component}`);\n if (this.debug) {\n console.log(`📄 Resolved embedded component: ${spec.name} from namespace ${componentNamespace}, type:`, typeof component);\n }\n } else {\n // If not found with specified namespace, try the parent namespace as fallback\n console.log(`⚠️ [ComponentResolver] Not found in namespace ${componentNamespace}, trying fallback namespace: ${namespace}`);\n const fallbackComponent = this.registry.get(spec.name, namespace);\n if (fallbackComponent) {\n resolved[spec.name] = fallbackComponent;\n console.log(`✅ [ComponentResolver] Found embedded component in fallback namespace: ${spec.name}, type: ${typeof fallbackComponent}`);\n if (this.debug) {\n console.log(`📄 Resolved embedded component: ${spec.name} from fallback namespace ${namespace}, type:`, typeof fallbackComponent);\n }\n } else {\n // Component not found - this might cause issues later\n console.error(`❌ [ComponentResolver] Could not resolve embedded component: ${spec.name} in namespace ${componentNamespace} or ${namespace}`);\n console.warn(`⚠️ Could not resolve embedded component: ${spec.name} in namespace ${componentNamespace} or ${namespace}`);\n // Store undefined explicitly so we know it failed to resolve\n resolved[spec.name] = undefined;\n }\n }\n }\n \n // Child components have already been processed at the beginning of this method\n // No need to process them again - we're using depth-first, post-order traversal\n }\n\n /**\n * Cleanup resolver resources\n */\n cleanup(): void {\n // Remove our references when resolver is destroyed\n if (this.registryService) {\n // This would allow the registry service to clean up unused components\n // Implementation would track which components this resolver referenced\n if (this.debug) {\n console.log(`Cleaning up resolver: ${this.resolverInstanceId}`);\n }\n }\n }\n\n /**\n * Validates that all required components are available\n * @param spec - Component specification to validate\n * @param namespace - Namespace for validation\n * @returns Array of missing component names\n */\n validateDependencies(spec: ComponentSpec, namespace: string = 'Global'): string[] {\n const missing: string[] = [];\n const checked = new Set<string>();\n \n this.checkDependencies(spec, namespace, missing, checked);\n \n return missing;\n }\n\n /**\n * Recursively checks for missing dependencies\n * @param spec - Component specification\n * @param namespace - Namespace for checking\n * @param missing - Array to collect missing components\n * @param checked - Set of already checked components\n */\n private checkDependencies(\n spec: ComponentSpec,\n namespace: string,\n missing: string[],\n checked: Set<string>\n ): void {\n if (checked.has(spec.name)) return;\n checked.add(spec.name);\n\n // Check if component exists in registry\n if (!this.registry.has(spec.name, namespace)) {\n missing.push(spec.name);\n }\n\n // Check children\n const children = spec.dependencies || [];\n for (const child of children) {\n this.checkDependencies(child, namespace, missing, checked);\n }\n }\n\n /**\n * Gets the dependency graph for a component specification\n * @param spec - Component specification\n * @returns Dependency graph as adjacency list\n */\n getDependencyGraph(spec: ComponentSpec): Map<string, string[]> {\n const graph = new Map<string, string[]>();\n const visited = new Set<string>();\n \n this.buildDependencyGraph(spec, graph, visited);\n \n return graph;\n }\n\n /**\n * Recursively builds the dependency graph\n * @param spec - Component specification\n * @param graph - Graph to build\n * @param visited - Set of visited components\n */\n private buildDependencyGraph(\n spec: ComponentSpec,\n graph: Map<string, string[]>,\n visited: Set<string>\n ): void {\n if (visited.has(spec.name)) return;\n visited.add(spec.name);\n\n const children = spec.dependencies || [];\n const dependencies = children.map(child => child.name);\n \n graph.set(spec.name, dependencies);\n\n // Recursively process children\n for (const child of children) {\n this.buildDependencyGraph(child, graph, visited);\n }\n }\n\n /**\n * Performs topological sort on component dependencies\n * @param spec - Root component specification\n * @returns Array of component names in dependency order\n */\n getLoadOrder(spec: ComponentSpec): string[] {\n const graph = this.getDependencyGraph(spec);\n const visited = new Set<string>();\n const stack: string[] = [];\n\n // Perform DFS on all nodes\n for (const node of graph.keys()) {\n if (!visited.has(node)) {\n this.topologicalSortDFS(node, graph, visited, stack);\n }\n }\n\n // Reverse to get correct load order\n return stack.reverse();\n }\n\n /**\n * DFS helper for topological sort\n * @param node - Current node\n * @param graph - Dependency graph\n * @param visited - Set of visited nodes\n * @param stack - Result stack\n */\n private topologicalSortDFS(\n node: string,\n graph: Map<string, string[]>,\n visited: Set<string>,\n stack: string[]\n ): void {\n visited.add(node);\n\n const dependencies = graph.get(node) || [];\n for (const dep of dependencies) {\n if (!visited.has(dep)) {\n this.topologicalSortDFS(dep, graph, visited, stack);\n }\n }\n\n stack.push(node);\n }\n\n /**\n * Resolves components in the correct dependency order\n * @param spec - Root component specification\n * @param namespace - Namespace for resolution\n * @returns Ordered array of resolved components\n */\n resolveInOrder(spec: ComponentSpec, namespace: string = 'Global'): Array<{\n name: string;\n component: any;\n }> {\n const loadOrder = this.getLoadOrder(spec);\n const resolved: Array<{ name: string; component: any }> = [];\n\n for (const name of loadOrder) {\n const component = this.registry.get(name, namespace);\n if (component) {\n resolved.push({ name, component });\n }\n }\n\n return resolved;\n }\n\n /**\n * Creates a flattened list of all component specifications\n * @param spec - Root component specification\n * @returns Array of all component specs in the hierarchy\n */\n flattenComponentSpecs(spec: ComponentSpec): ComponentSpec[] {\n const flattened: ComponentSpec[] = [];\n const visited = new Set<string>();\n\n this.collectComponentSpecs(spec, flattened, visited);\n\n return flattened;\n }\n\n /**\n * Recursively collects component specifications\n * @param spec - Current component specification\n * @param collected - Array to collect specs\n * @param visited - Set of visited component names\n */\n private collectComponentSpecs(\n spec: ComponentSpec,\n collected: ComponentSpec[],\n visited: Set<string>\n ): void {\n if (visited.has(spec.name)) return;\n visited.add(spec.name);\n\n collected.push(spec);\n\n const children = spec.dependencies || [];\n for (const child of children) {\n this.collectComponentSpecs(child, collected, visited);\n }\n }\n}"]}
@@ -1 +1 @@
1
- {"version":3,"file":"component-hierarchy.d.ts","sourceRoot":"","sources":["../../src/runtime/component-hierarchy.ts"],"names":[],"mappings":"AAMA,OAAO,EAGL,cAAc,EACf,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAE7F,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAKvE,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,MAAM,EAAE,0BAA0B,EAAE,CAAC;IACrC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAKD,MAAM,WAAW,0BAA0B;IACzC,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,aAAa,GAAG,cAAc,GAAG,YAAY,CAAC;CACtD;AAKD,MAAM,WAAW,4BAA4B;IAE3C,MAAM,CAAC,EAAE,eAAe,CAAC;IAEzB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,aAAa,CAAC,EAAE,OAAO,CAAC;IAIxB,YAAY,EAAE,sBAAsB,EAAE,CAAC;CACxC;AAKD,qBAAa,2BAA2B;IAEpC,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,cAAc;gBAFd,QAAQ,EAAE,iBAAiB,EAC3B,QAAQ,EAAE,iBAAiB,EAC3B,cAAc,EAAE,cAAc;IASlC,iBAAiB,CACrB,QAAQ,EAAE,aAAa,EACvB,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,2BAA2B,CAAC;IA6DjC,uBAAuB,CAC3B,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE;QACP,MAAM,CAAC,EAAE,eAAe,CAAC;QACzB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,YAAY,EAAE,sBAAsB,EAAE,CAAC;KACxC,GACA,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,0BAA0B,CAAA;KAAE,CAAC;YA8FtD,uBAAuB;CAyCtC;AAWD,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,aAAa,EACvB,QAAQ,EAAE,iBAAiB,EAC3B,QAAQ,EAAE,iBAAiB,EAC3B,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,2BAA2B,CAAC,CAGtC;AAOD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,EAAE,CA2BnE;AAOD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,aAAa,GAAG,aAAa,EAAE,CASlF;AAQD,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,aAAa,EACvB,YAAY,GAAE,OAAe,GAC5B,MAAM,CAaR"}
1
+ {"version":3,"file":"component-hierarchy.d.ts","sourceRoot":"","sources":["../../src/runtime/component-hierarchy.ts"],"names":[],"mappings":"AAMA,OAAO,EAGL,cAAc,EAEf,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAE7F,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAKvE,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,MAAM,EAAE,0BAA0B,EAAE,CAAC;IACrC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAKD,MAAM,WAAW,0BAA0B;IACzC,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,aAAa,GAAG,cAAc,GAAG,YAAY,CAAC;CACtD;AAKD,MAAM,WAAW,4BAA4B;IAE3C,MAAM,CAAC,EAAE,eAAe,CAAC;IAEzB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,aAAa,CAAC,EAAE,OAAO,CAAC;IAIxB,YAAY,EAAE,sBAAsB,EAAE,CAAC;CACxC;AAKD,qBAAa,2BAA2B;IAEpC,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,cAAc;gBAFd,QAAQ,EAAE,iBAAiB,EAC3B,QAAQ,EAAE,iBAAiB,EAC3B,cAAc,EAAE,cAAc;IASlC,iBAAiB,CACrB,QAAQ,EAAE,aAAa,EACvB,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,2BAA2B,CAAC;IA+HjC,uBAAuB,CAC3B,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE;QACP,MAAM,CAAC,EAAE,eAAe,CAAC;QACzB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,YAAY,EAAE,sBAAsB,EAAE,CAAC;KACxC,GACA,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,0BAA0B,CAAA;KAAE,CAAC;YA6FtD,uBAAuB;CAyCtC;AAWD,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,aAAa,EACvB,QAAQ,EAAE,iBAAiB,EAC3B,QAAQ,EAAE,iBAAiB,EAC3B,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,2BAA2B,CAAC,CAGtC;AAOD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,EAAE,CA2BnE;AAOD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,aAAa,GAAG,aAAa,EAAE,CASlF;AAQD,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,aAAa,EACvB,YAAY,GAAE,OAAe,GAC5B,MAAM,CAaR"}