@memberjunction/react-runtime 2.111.0 → 2.112.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 (43) hide show
  1. package/.turbo/turbo-build.log +10 -11
  2. package/CHANGELOG.md +6 -6
  3. package/dist/compiler/component-compiler.d.ts.map +1 -1
  4. package/dist/compiler/component-compiler.js +66 -56
  5. package/dist/compiler/component-compiler.js.map +1 -1
  6. package/dist/component-manager/component-manager.d.ts.map +1 -1
  7. package/dist/component-manager/component-manager.js +48 -42
  8. package/dist/component-manager/component-manager.js.map +1 -1
  9. package/dist/component-manager/types.d.ts +1 -1
  10. package/dist/component-manager/types.d.ts.map +1 -1
  11. package/dist/component-manager/types.js.map +1 -1
  12. package/dist/registry/component-registry-service.d.ts +1 -1
  13. package/dist/registry/component-registry-service.d.ts.map +1 -1
  14. package/dist/registry/component-registry-service.js +34 -34
  15. package/dist/registry/component-registry-service.js.map +1 -1
  16. package/dist/registry/component-resolver.d.ts +1 -1
  17. package/dist/registry/component-resolver.d.ts.map +1 -1
  18. package/dist/registry/component-resolver.js +10 -11
  19. package/dist/registry/component-resolver.js.map +1 -1
  20. package/dist/runtime/component-hierarchy.d.ts +1 -1
  21. package/dist/runtime/component-hierarchy.d.ts.map +1 -1
  22. package/dist/runtime/component-hierarchy.js +43 -43
  23. package/dist/runtime/component-hierarchy.js.map +1 -1
  24. package/dist/runtime/prop-builder.d.ts.map +1 -1
  25. package/dist/runtime/prop-builder.js +22 -24
  26. package/dist/runtime/prop-builder.js.map +1 -1
  27. package/dist/runtime.umd.js +494 -511
  28. package/dist/types/index.d.ts.map +1 -1
  29. package/dist/types/index.js.map +1 -1
  30. package/dist/utilities/library-registry.d.ts +1 -1
  31. package/dist/utilities/library-registry.d.ts.map +1 -1
  32. package/dist/utilities/library-registry.js +10 -10
  33. package/dist/utilities/library-registry.js.map +1 -1
  34. package/package.json +5 -6
  35. package/src/compiler/component-compiler.ts +186 -164
  36. package/src/component-manager/component-manager.ts +162 -216
  37. package/src/component-manager/types.ts +27 -27
  38. package/src/registry/component-registry-service.ts +190 -218
  39. package/src/registry/component-resolver.ts +87 -98
  40. package/src/runtime/component-hierarchy.ts +57 -94
  41. package/src/runtime/prop-builder.ts +28 -33
  42. package/src/types/index.ts +3 -4
  43. package/src/utilities/library-registry.ts +14 -19
@@ -1 +1 @@
1
- {"version":3,"file":"component-manager.js","sourceRoot":"","sources":["../../src/component-manager/component-manager.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Unified Component Manager implementation\n * Handles all component operations efficiently with proper caching and registry tracking\n */\n\nimport { ComponentSpec, ComponentLibraryDependency } from '@memberjunction/interactive-component-types';\nimport { UserInfo, Metadata, LogError } from '@memberjunction/core';\nimport { ComponentMetadataEngine, ComponentLibraryEntity, ComponentEntityExtended } from '@memberjunction/core-entities';\n\nimport { ComponentCompiler } from '../compiler';\nimport { ComponentRegistry } from '../registry';\nimport { RuntimeContext, ComponentObject } from '../types';\nimport {\n LoadOptions,\n LoadResult,\n HierarchyResult,\n ComponentManagerConfig,\n CacheEntry,\n ResolutionMode\n} from './types';\n\n/**\n * Unified component management system that handles all component operations\n * efficiently with proper caching and registry tracking.\n */\nexport class ComponentManager {\n private compiler: ComponentCompiler;\n private registry: ComponentRegistry;\n private runtimeContext: RuntimeContext;\n private config: ComponentManagerConfig;\n \n // Caching\n private fetchCache: Map<string, CacheEntry> = new Map();\n private registryNotifications: Set<string> = new Set();\n private loadingPromises: Map<string, Promise<LoadResult>> = new Map();\n \n // Metadata engine\n private componentEngine = ComponentMetadataEngine.Instance;\n private graphQLClient: any = null;\n \n constructor(\n compiler: ComponentCompiler,\n registry: ComponentRegistry,\n runtimeContext: RuntimeContext,\n config: ComponentManagerConfig = {}\n ) {\n this.compiler = compiler;\n this.registry = registry;\n this.runtimeContext = runtimeContext;\n this.config = {\n debug: false,\n maxCacheSize: 100,\n cacheTTL: 3600000, // 1 hour\n enableUsageTracking: true,\n dependencyBatchSize: 5,\n fetchTimeout: 30000,\n ...config\n };\n \n this.log('ComponentManager initialized', {\n debug: this.config.debug,\n cacheTTL: this.config.cacheTTL,\n usageTracking: this.config.enableUsageTracking\n });\n }\n \n /**\n * Main entry point - intelligently handles all component operations\n */\n async loadComponent(\n spec: ComponentSpec,\n options: LoadOptions = {}\n ): Promise<LoadResult> {\n const startTime = Date.now();\n const componentKey = this.getComponentKey(spec, options);\n \n this.log(`Loading component: ${spec.name}`, { \n key: componentKey, \n location: spec.location,\n registry: spec.registry,\n forceRefresh: options.forceRefresh \n });\n \n // Check if already loading to prevent duplicate work\n const existingPromise = this.loadingPromises.get(componentKey);\n if (existingPromise && !options.forceRefresh) {\n this.log(`Component already loading: ${spec.name}, waiting...`);\n return existingPromise;\n }\n \n // Create loading promise\n const loadPromise = this.doLoadComponent(spec, options, componentKey, startTime);\n this.loadingPromises.set(componentKey, loadPromise);\n \n try {\n const result = await loadPromise;\n return result;\n } finally {\n this.loadingPromises.delete(componentKey);\n }\n }\n \n /**\n * Internal method that does the actual loading\n */\n private async doLoadComponent(\n spec: ComponentSpec,\n options: LoadOptions,\n componentKey: string,\n startTime: number\n ): Promise<LoadResult> {\n const errors: LoadResult['errors'] = [];\n \n try {\n // STEP 1: Check if already loaded in ComponentRegistry\n const namespace = spec.namespace || options.defaultNamespace || 'Global';\n const version = spec.version || options.defaultVersion || 'latest';\n \n const existing = this.registry.get(spec.name, namespace, version);\n if (existing && !options.forceRefresh && !options.forceRecompile) {\n this.log(`Component found in registry: ${spec.name}`);\n \n // Still need to notify registry for usage tracking\n if (options.trackUsage !== false) {\n await this.notifyRegistryUsageIfNeeded(spec, componentKey);\n }\n \n // Get cached spec if available\n const cachedEntry = this.fetchCache.get(componentKey);\n \n return {\n success: true,\n component: existing,\n spec: cachedEntry?.spec || spec,\n fromCache: true\n };\n }\n \n // STEP 2: Fetch full spec if needed\n let fullSpec = spec;\n if (this.needsFetch(spec)) {\n this.log(`Fetching component spec: ${spec.name}`);\n try {\n fullSpec = await this.fetchComponentSpec(spec, options.contextUser, {\n resolutionMode: options.resolutionMode\n });\n\n // Cache the fetched spec\n this.fetchCache.set(componentKey, {\n spec: fullSpec,\n fetchedAt: new Date(),\n hash: await this.calculateHash(fullSpec),\n usageNotified: false\n });\n } catch (error) {\n errors.push({\n message: `Failed to fetch component: ${error instanceof Error ? error.message : String(error)}`,\n phase: 'fetch',\n componentName: spec.name\n });\n throw error;\n }\n } else {\n // Log when we skip fetching because code is already provided\n if (spec.location === 'registry' && spec.code) {\n this.log(`Skipping fetch for registry component: ${spec.name} (code already provided)`, {\n location: spec.location,\n registry: spec.registry\n });\n }\n // Also cache the spec if it has code to avoid re-fetching\n if (spec.code && !this.fetchCache.has(componentKey)) {\n this.fetchCache.set(componentKey, {\n spec: fullSpec,\n fetchedAt: new Date(),\n hash: await this.calculateHash(fullSpec),\n usageNotified: false\n });\n }\n }\n \n // STEP 3: Notify registry of usage (exactly once per session)\n if (options.trackUsage !== false) {\n await this.notifyRegistryUsageIfNeeded(fullSpec, componentKey);\n }\n \n // STEP 4: Compile if needed\n let compiledComponent = existing;\n if (!compiledComponent || options.forceRecompile) {\n this.log(`Compiling component: ${spec.name}`);\n try {\n compiledComponent = await this.compileComponent(fullSpec, options);\n } catch (error) {\n errors.push({\n message: `Failed to compile component: ${error instanceof Error ? error.message : String(error)}`,\n phase: 'compile',\n componentName: spec.name\n });\n throw error;\n }\n }\n \n // STEP 5: Register in ComponentRegistry\n if (!existing || options.forceRefresh || options.forceRecompile) {\n this.log(`Registering component: ${spec.name}`);\n this.registry.register(\n fullSpec.name,\n compiledComponent,\n namespace,\n version\n );\n }\n \n // STEP 6: Process dependencies recursively\n const dependencies: Record<string, ComponentObject> = {};\n if (fullSpec.dependencies && fullSpec.dependencies.length > 0) {\n this.log(`Loading ${fullSpec.dependencies.length} dependencies for ${spec.name}`);\n \n // Load dependencies in batches for efficiency\n const depResults = await this.loadDependenciesBatched(\n fullSpec.dependencies,\n { ...options, isDependent: true }\n );\n \n for (const result of depResults) {\n if (result.success && result.component) {\n const depSpec = fullSpec.dependencies.find(d => \n d.name === (result.spec?.name || '')\n );\n if (depSpec) {\n dependencies[depSpec.name] = result.component;\n }\n } else if (result.errors) {\n errors.push(...result.errors);\n }\n }\n }\n \n const elapsed = Date.now() - startTime;\n this.log(`Component loaded successfully: ${spec.name} (${elapsed}ms)`, {\n fromCache: false,\n dependencyCount: Object.keys(dependencies).length\n });\n \n return {\n success: errors.length === 0,\n component: compiledComponent,\n spec: fullSpec,\n fromCache: false,\n dependencies,\n errors: errors.length > 0 ? errors : undefined\n };\n \n } catch (error) {\n const elapsed = Date.now() - startTime;\n this.log(`Failed to load component: ${spec.name} (${elapsed}ms)`, error);\n \n return {\n success: false,\n fromCache: false,\n errors: errors.length > 0 ? errors : [{\n message: error instanceof Error ? error.message : String(error),\n phase: 'fetch',\n componentName: spec.name\n }]\n };\n }\n }\n \n /**\n * Load a complete hierarchy efficiently\n */\n async loadHierarchy(\n rootSpec: ComponentSpec,\n options: LoadOptions = {}\n ): Promise<HierarchyResult> {\n const startTime = Date.now();\n const loaded: string[] = [];\n const errors: HierarchyResult['errors'] = [];\n const components: Record<string, ComponentObject> = {};\n const stats = {\n fromCache: 0,\n fetched: 0,\n compiled: 0,\n totalTime: 0\n };\n \n this.log(`Loading component hierarchy: ${rootSpec.name}`, {\n location: rootSpec.location,\n registry: rootSpec.registry\n });\n \n try {\n // Initialize component engine if needed (skip in browser context where it doesn't exist)\n if (this.componentEngine && typeof this.componentEngine.Config === 'function') {\n await this.componentEngine.Config(false, options.contextUser);\n }\n \n // Load the root component and all its dependencies\n const result = await this.loadComponentRecursive(\n rootSpec,\n options,\n loaded,\n errors,\n components,\n stats,\n new Set()\n );\n \n stats.totalTime = Date.now() - startTime;\n \n this.log(`Hierarchy loaded: ${rootSpec.name}`, {\n success: errors.length === 0,\n loadedCount: loaded.length,\n errors: errors.length,\n ...stats\n });\n \n // Unwrap components before returning\n // Components are ComponentObject wrappers, but consumers expect just the React components\n const unwrappedComponents: Record<string, ComponentObject> = {};\n for (const [name, componentObject] of Object.entries(components)) {\n if (componentObject && typeof componentObject === 'object' && 'component' in componentObject) {\n // Extract the actual React component function\n unwrappedComponents[name] = (componentObject as any).component;\n } else {\n // Already a function or something else - use as-is\n unwrappedComponents[name] = componentObject;\n }\n }\n \n return {\n success: errors.length === 0,\n rootComponent: result.component,\n resolvedSpec: result.spec,\n loadedComponents: loaded,\n errors,\n components: unwrappedComponents,\n stats\n };\n \n } catch (error) {\n stats.totalTime = Date.now() - startTime;\n \n this.log(`Failed to load hierarchy: ${rootSpec.name}`, error);\n \n return {\n success: false,\n loadedComponents: loaded,\n errors: [...errors, {\n message: error instanceof Error ? error.message : String(error),\n phase: 'fetch',\n componentName: rootSpec.name\n }],\n stats\n };\n }\n }\n \n /**\n * Recursively load a component and its dependencies\n */\n private async loadComponentRecursive(\n spec: ComponentSpec,\n options: LoadOptions,\n loaded: string[],\n errors: HierarchyResult['errors'],\n components: Record<string, ComponentObject>,\n stats: HierarchyResult['stats'],\n visited: Set<string>\n ): Promise<LoadResult> {\n const componentKey = this.getComponentKey(spec, options);\n \n // Prevent circular dependencies\n if (visited.has(componentKey)) {\n this.log(`Circular dependency detected: ${spec.name}`);\n return {\n success: true,\n component: components[spec.name],\n spec,\n fromCache: true\n };\n }\n visited.add(componentKey);\n \n // Load this component\n const result = await this.loadComponent(spec, options);\n \n if (result.success && result.component) {\n loaded.push(spec.name);\n components[spec.name] = result.component;\n \n // Update stats\n if (stats) {\n if (result.fromCache) stats.fromCache++;\n else {\n stats.fetched++;\n stats.compiled++;\n }\n }\n \n // Load dependencies\n if (result.spec?.dependencies) {\n for (const dep of result.spec.dependencies) {\n // Normalize dependency spec for local registry lookup\n const depSpec = { ...dep };\n // OPTIMIZATION: If the dependency already has code (from registry population),\n // we can skip fetching and go straight to compilation\n if (depSpec.code) {\n this.log(`Dependency ${depSpec.name} already has code (from registry population), optimizing load`);\n }\n\n // If location is \"registry\" with undefined registry, ensure it's treated as local\n // This follows the convention that registry components with undefined registry\n // should be looked up in the local ComponentMetadataEngine\n if (depSpec.location === 'registry' && !depSpec.registry) {\n // Explicitly set to undefined for clarity (it may already be undefined)\n depSpec.registry = undefined;\n\n // Log for debugging\n this.log(`Dependency ${depSpec.name} is a local registry component (registry=undefined)`);\n }\n\n await this.loadComponentRecursive(\n depSpec,\n { ...options, isDependent: true },\n loaded,\n errors,\n components,\n stats,\n visited\n );\n }\n }\n } else if (result.errors) {\n errors.push(...result.errors);\n }\n \n return result;\n }\n \n /**\n * Load dependencies in batches for efficiency\n */\n private async loadDependenciesBatched(\n dependencies: ComponentSpec[],\n options: LoadOptions\n ): Promise<LoadResult[]> {\n const batchSize = this.config.dependencyBatchSize || 5;\n const results: LoadResult[] = [];\n \n for (let i = 0; i < dependencies.length; i += batchSize) {\n const batch = dependencies.slice(i, i + batchSize);\n const batchPromises = batch.map(dep => this.loadComponent(dep, options));\n const batchResults = await Promise.all(batchPromises);\n results.push(...batchResults);\n }\n \n return results;\n }\n \n /**\n * Check if a component needs to be fetched from a registry\n */\n private needsFetch(spec: ComponentSpec): boolean {\n // Need to fetch if:\n // 1. It's a registry component without code\n // 2. It's missing required fields\n return spec.location === 'registry' && !spec.code;\n }\n \n /**\n * Fetch a component specification from a registry (local or external)\n * \n * Convention: When location === 'registry' and registry === undefined,\n * the component is looked up in the local ComponentMetadataEngine.\n * This allows components to reference local registry components without\n * having to know if they're embedded or registry-based.\n */\n private async fetchComponentSpec(\n spec: ComponentSpec,\n contextUser?: UserInfo,\n options?: { resolutionMode?: ResolutionMode }\n ): Promise<ComponentSpec> {\n // Check cache first\n const cacheKey = this.getComponentKey(spec, {});\n const cached = this.fetchCache.get(cacheKey);\n \n if (cached && this.isCacheValid(cached)) {\n this.log(`Using cached spec for: ${spec.name}`);\n return cached.spec;\n }\n \n // Handle LOCAL registry components (registry is null/undefined)\n if (!spec.registry) {\n this.log(`Fetching from local registry: ${spec.name}`);\n \n // Find component in local ComponentMetadataEngine\n const localComponent = this.componentEngine.Components?.find(\n (c: ComponentEntityExtended) => {\n // Match by name (case-insensitive for better compatibility)\n const nameMatch = c.Name?.toLowerCase() === spec.name?.toLowerCase();\n \n // Match by namespace if provided (handle different formats)\n const namespaceMatch = !spec.namespace || c.Namespace?.toLowerCase() === spec.namespace?.toLowerCase();\n\n if (nameMatch && !namespaceMatch) {\n }\n \n return nameMatch && namespaceMatch;\n }\n );\n \n if (!localComponent) {\n throw new Error(`Local component not found: ${spec.name}`);\n }\n \n // Parse specification from local component\n if (!localComponent.Specification) {\n throw new Error(`Local component ${spec.name} has no specification`);\n }\n \n const fullSpec = JSON.parse(localComponent.Specification);\n \n // Cache it\n this.fetchCache.set(cacheKey, {\n spec: fullSpec,\n fetchedAt: new Date(),\n usageNotified: false\n });\n \n return fullSpec;\n }\n \n // Handle EXTERNAL registry components (registry has a name)\n // Initialize GraphQL client if needed\n if (!this.graphQLClient) {\n await this.initializeGraphQLClient();\n }\n \n if (!this.graphQLClient) {\n throw new Error('GraphQL client not available for registry fetching');\n }\n \n // Fetch from external registry\n this.log(`Fetching from external registry: ${spec.registry}/${spec.name}`);\n \n const fullSpec = await this.graphQLClient.GetRegistryComponent({\n registryName: spec.registry,\n namespace: spec.namespace || 'Global',\n name: spec.name,\n version: spec.version || 'latest'\n });\n \n if (!fullSpec) {\n throw new Error(`Component not found in registry: ${spec.registry}/${spec.name}`);\n }\n \n // Apply resolution mode if specified\n const processedSpec = this.applyResolutionMode(fullSpec, spec, options?.resolutionMode);\n \n // Cache it\n this.fetchCache.set(cacheKey, {\n spec: processedSpec,\n fetchedAt: new Date(),\n usageNotified: false\n });\n \n return processedSpec;\n }\n \n /**\n * Apply resolution mode to a fetched spec (recursively including dependencies)\n */\n private applyResolutionMode(\n fullSpec: ComponentSpec,\n originalSpec: ComponentSpec,\n resolutionMode?: ResolutionMode\n ): ComponentSpec {\n let processedSpec: ComponentSpec;\n \n if (resolutionMode === 'embed') {\n // Convert to embedded format for test harness\n processedSpec = {\n ...fullSpec,\n location: 'embedded',\n registry: undefined,\n // namespace and name can stay for identification\n };\n } else {\n // Default: preserve-metadata mode\n // Keep original registry metadata but include fetched code\n processedSpec = {\n ...fullSpec,\n location: originalSpec.location,\n registry: originalSpec.registry,\n namespace: originalSpec.namespace || fullSpec.namespace,\n name: originalSpec.name || fullSpec.name\n };\n }\n \n // Recursively apply resolution mode to dependencies\n if (processedSpec.dependencies && processedSpec.dependencies.length > 0) {\n processedSpec.dependencies = processedSpec.dependencies.map(dep => {\n // For dependencies, use the dep itself as both full and original spec\n // since they've already been fetched and processed\n return this.applyResolutionMode(dep, dep, resolutionMode);\n });\n }\n \n return processedSpec;\n }\n\n /**\n * Compile a component specification\n */\n private async compileComponent(\n spec: ComponentSpec,\n options: LoadOptions\n ): Promise<ComponentObject> {\n // Get all available libraries - use passed libraries or fall back to ComponentMetadataEngine\n const allLibraries = options.allLibraries || this.componentEngine.ComponentLibraries || [];\n \n // Filter valid libraries\n const validLibraries = spec.libraries?.filter(lib => \n lib && lib.name && lib.globalVariable && \n lib.name !== 'unknown' && lib.globalVariable !== 'undefined'\n );\n \n // Compile the component\n const result = await this.compiler.compile({\n componentName: spec.name,\n componentCode: spec.code || '',\n libraries: validLibraries,\n dependencies: spec.dependencies,\n allLibraries\n });\n \n if (!result.success || !result.component) {\n throw new Error(result.error?.message || 'Compilation failed');\n }\n \n // Add loaded libraries to runtime context\n if (result.loadedLibraries && result.loadedLibraries.size > 0) {\n if (!this.runtimeContext.libraries) {\n this.runtimeContext.libraries = {};\n }\n result.loadedLibraries.forEach((value, key) => {\n this.runtimeContext.libraries![key] = value;\n });\n }\n \n // Get the component object from the factory\n const componentObject = result.component.factory(\n this.runtimeContext,\n undefined, // styles\n {} // components - will be injected by parent\n );\n \n return componentObject;\n }\n \n /**\n * Notify registry of component usage for licensing\n * Only happens once per component per session\n */\n private async notifyRegistryUsageIfNeeded(\n spec: ComponentSpec,\n componentKey: string\n ): Promise<void> {\n if (!spec.registry || !this.config.enableUsageTracking) {\n return; // Only for external registry components with tracking enabled\n }\n \n const notificationKey = `${spec.registry}:${componentKey}`;\n if (this.registryNotifications.has(notificationKey)) {\n this.log(`Usage already notified for: ${spec.name}`);\n return; // Already notified this session\n }\n \n try {\n // In the future, make lightweight usage notification call to registry\n // For now, the fetch itself serves as the notification\n this.log(`Notifying registry usage for: ${spec.name}`);\n this.registryNotifications.add(notificationKey);\n \n // Update cache entry\n const cached = this.fetchCache.get(componentKey);\n if (cached) {\n cached.usageNotified = true;\n }\n } catch (error) {\n // Log but don't fail - usage tracking shouldn't break component loading\n console.warn(`Failed to notify registry usage for ${componentKey}:`, error);\n }\n }\n \n /**\n * Initialize GraphQL client for registry operations\n */\n private async initializeGraphQLClient(): Promise<void> {\n try {\n const provider = Metadata?.Provider;\n if (provider && (provider as any).ExecuteGQL) {\n const { GraphQLComponentRegistryClient } = await import('@memberjunction/graphql-dataprovider');\n this.graphQLClient = new GraphQLComponentRegistryClient(provider as any);\n this.log('GraphQL client initialized');\n }\n } catch (error) {\n LogError(`Failed to initialize GraphQL client: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n \n /**\n * Check if a cache entry is still valid\n */\n private isCacheValid(entry: CacheEntry): boolean {\n const age = Date.now() - entry.fetchedAt.getTime();\n return age < (this.config.cacheTTL || 3600000);\n }\n \n /**\n * Calculate a hash for a component spec (for cache validation)\n */\n private async calculateHash(spec: ComponentSpec): Promise<string> {\n // Simple hash based on spec content\n const content = JSON.stringify({\n name: spec.name,\n version: spec.version,\n code: spec.code,\n libraries: spec.libraries\n });\n \n // Simple hash function (in production, use crypto)\n let hash = 0;\n for (let i = 0; i < content.length; i++) {\n const char = content.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return hash.toString(16);\n }\n \n /**\n * Generate a unique key for a component\n */\n private getComponentKey(spec: ComponentSpec, options: LoadOptions): string {\n const registry = spec.registry || 'local';\n const namespace = spec.namespace || options.defaultNamespace || 'Global';\n const version = spec.version || options.defaultVersion || 'latest';\n return `${registry}:${namespace}:${spec.name}:${version}`;\n }\n \n /**\n * Clear all caches\n */\n clearCache(): void {\n this.fetchCache.clear();\n this.registryNotifications.clear();\n this.loadingPromises.clear();\n this.log('All caches cleared');\n }\n \n /**\n * Get cache statistics\n */\n getCacheStats(): {\n fetchCacheSize: number;\n notificationsCount: number;\n loadingCount: number;\n } {\n return {\n fetchCacheSize: this.fetchCache.size,\n notificationsCount: this.registryNotifications.size,\n loadingCount: this.loadingPromises.size\n };\n }\n \n /**\n * Log a message if debug is enabled\n */\n private log(message: string, data?: any): void {\n if (this.config.debug) {\n console.log(`🎯 [ComponentManager] ${message}`, data || '');\n }\n }\n}"]}
1
+ {"version":3,"file":"component-manager.js","sourceRoot":"","sources":["../../src/component-manager/component-manager.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Unified Component Manager implementation\n * Handles all component operations efficiently with proper caching and registry tracking\n */\n\nimport { ComponentSpec, ComponentLibraryDependency } from '@memberjunction/interactive-component-types';\nimport { UserInfo, Metadata, LogError } from '@memberjunction/global';\nimport { ComponentMetadataEngine, ComponentLibraryEntity, ComponentEntityExtended } from '@memberjunction/core-entities';\n\nimport { ComponentCompiler } from '../compiler';\nimport { ComponentRegistry } from '../registry';\nimport { RuntimeContext, ComponentObject } from '../types';\nimport { LoadOptions, LoadResult, HierarchyResult, ComponentManagerConfig, CacheEntry, ResolutionMode } from './types';\n\n/**\n * Unified component management system that handles all component operations\n * efficiently with proper caching and registry tracking.\n */\nexport class ComponentManager {\n private compiler: ComponentCompiler;\n private registry: ComponentRegistry;\n private runtimeContext: RuntimeContext;\n private config: ComponentManagerConfig;\n\n // Caching\n private fetchCache: Map<string, CacheEntry> = new Map();\n private registryNotifications: Set<string> = new Set();\n private loadingPromises: Map<string, Promise<LoadResult>> = new Map();\n\n // Metadata engine\n private componentEngine = ComponentMetadataEngine.Instance;\n private graphQLClient: any = null;\n\n constructor(\n compiler: ComponentCompiler,\n registry: ComponentRegistry,\n runtimeContext: RuntimeContext,\n config: ComponentManagerConfig = {}\n ) {\n this.compiler = compiler;\n this.registry = registry;\n this.runtimeContext = runtimeContext;\n this.config = {\n debug: false,\n maxCacheSize: 100,\n cacheTTL: 3600000, // 1 hour\n enableUsageTracking: true,\n dependencyBatchSize: 5,\n fetchTimeout: 30000,\n ...config,\n };\n\n this.log('ComponentManager initialized', {\n debug: this.config.debug,\n cacheTTL: this.config.cacheTTL,\n usageTracking: this.config.enableUsageTracking,\n });\n }\n\n /**\n * Main entry point - intelligently handles all component operations\n */\n async loadComponent(spec: ComponentSpec, options: LoadOptions = {}): Promise<LoadResult> {\n const startTime = Date.now();\n const componentKey = this.getComponentKey(spec, options);\n\n this.log(`Loading component: ${spec.name}`, {\n key: componentKey,\n location: spec.location,\n registry: spec.registry,\n forceRefresh: options.forceRefresh,\n });\n\n // Check if already loading to prevent duplicate work\n const existingPromise = this.loadingPromises.get(componentKey);\n if (existingPromise && !options.forceRefresh) {\n this.log(`Component already loading: ${spec.name}, waiting...`);\n return existingPromise;\n }\n\n // Create loading promise\n const loadPromise = this.doLoadComponent(spec, options, componentKey, startTime);\n this.loadingPromises.set(componentKey, loadPromise);\n\n try {\n const result = await loadPromise;\n return result;\n } finally {\n this.loadingPromises.delete(componentKey);\n }\n }\n\n /**\n * Internal method that does the actual loading\n */\n private async doLoadComponent(spec: ComponentSpec, options: LoadOptions, componentKey: string, startTime: number): Promise<LoadResult> {\n const errors: LoadResult['errors'] = [];\n\n try {\n // STEP 1: Check if already loaded in ComponentRegistry\n const namespace = spec.namespace || options.defaultNamespace || 'Global';\n const version = spec.version || options.defaultVersion || 'latest';\n\n const existing = this.registry.get(spec.name, namespace, version);\n if (existing && !options.forceRefresh && !options.forceRecompile) {\n this.log(`Component found in registry: ${spec.name}`);\n\n // Still need to notify registry for usage tracking\n if (options.trackUsage !== false) {\n await this.notifyRegistryUsageIfNeeded(spec, componentKey);\n }\n\n // Get cached spec if available\n const cachedEntry = this.fetchCache.get(componentKey);\n\n return {\n success: true,\n component: existing,\n spec: cachedEntry?.spec || spec,\n fromCache: true,\n };\n }\n\n // STEP 2: Fetch full spec if needed\n let fullSpec = spec;\n if (this.needsFetch(spec)) {\n this.log(`Fetching component spec: ${spec.name}`);\n try {\n fullSpec = await this.fetchComponentSpec(spec, options.contextUser, {\n resolutionMode: options.resolutionMode,\n });\n\n // Cache the fetched spec\n this.fetchCache.set(componentKey, {\n spec: fullSpec,\n fetchedAt: new Date(),\n hash: await this.calculateHash(fullSpec),\n usageNotified: false,\n });\n } catch (error) {\n errors.push({\n message: `Failed to fetch component: ${error instanceof Error ? error.message : String(error)}`,\n phase: 'fetch',\n componentName: spec.name,\n });\n throw error;\n }\n } else {\n // Log when we skip fetching because code is already provided\n if (spec.location === 'registry' && spec.code) {\n this.log(`Skipping fetch for registry component: ${spec.name} (code already provided)`, {\n location: spec.location,\n registry: spec.registry,\n });\n }\n // Also cache the spec if it has code to avoid re-fetching\n if (spec.code && !this.fetchCache.has(componentKey)) {\n this.fetchCache.set(componentKey, {\n spec: fullSpec,\n fetchedAt: new Date(),\n hash: await this.calculateHash(fullSpec),\n usageNotified: false,\n });\n }\n }\n\n // STEP 3: Notify registry of usage (exactly once per session)\n if (options.trackUsage !== false) {\n await this.notifyRegistryUsageIfNeeded(fullSpec, componentKey);\n }\n\n // STEP 4: Compile if needed\n let compiledComponent = existing;\n if (!compiledComponent || options.forceRecompile) {\n this.log(`Compiling component: ${spec.name}`);\n try {\n compiledComponent = await this.compileComponent(fullSpec, options);\n } catch (error) {\n errors.push({\n message: `Failed to compile component: ${error instanceof Error ? error.message : String(error)}`,\n phase: 'compile',\n componentName: spec.name,\n });\n throw error;\n }\n }\n\n // STEP 5: Register in ComponentRegistry\n if (!existing || options.forceRefresh || options.forceRecompile) {\n this.log(`Registering component: ${spec.name}`);\n this.registry.register(fullSpec.name, compiledComponent, namespace, version);\n }\n\n // STEP 6: Process dependencies recursively\n const dependencies: Record<string, ComponentObject> = {};\n if (fullSpec.dependencies && fullSpec.dependencies.length > 0) {\n this.log(`Loading ${fullSpec.dependencies.length} dependencies for ${spec.name}`);\n\n // Load dependencies in batches for efficiency\n const depResults = await this.loadDependenciesBatched(fullSpec.dependencies, { ...options, isDependent: true });\n\n for (const result of depResults) {\n if (result.success && result.component) {\n const depSpec = fullSpec.dependencies.find((d) => d.name === (result.spec?.name || ''));\n if (depSpec) {\n dependencies[depSpec.name] = result.component;\n }\n } else if (result.errors) {\n errors.push(...result.errors);\n }\n }\n }\n\n const elapsed = Date.now() - startTime;\n this.log(`Component loaded successfully: ${spec.name} (${elapsed}ms)`, {\n fromCache: false,\n dependencyCount: Object.keys(dependencies).length,\n });\n\n return {\n success: errors.length === 0,\n component: compiledComponent,\n spec: fullSpec,\n fromCache: false,\n dependencies,\n errors: errors.length > 0 ? errors : undefined,\n };\n } catch (error) {\n const elapsed = Date.now() - startTime;\n this.log(`Failed to load component: ${spec.name} (${elapsed}ms)`, error);\n\n return {\n success: false,\n fromCache: false,\n errors:\n errors.length > 0\n ? errors\n : [\n {\n message: error instanceof Error ? error.message : String(error),\n phase: 'fetch',\n componentName: spec.name,\n },\n ],\n };\n }\n }\n\n /**\n * Load a complete hierarchy efficiently\n */\n async loadHierarchy(rootSpec: ComponentSpec, options: LoadOptions = {}): Promise<HierarchyResult> {\n const startTime = Date.now();\n const loaded: string[] = [];\n const errors: HierarchyResult['errors'] = [];\n const components: Record<string, ComponentObject> = {};\n const stats = {\n fromCache: 0,\n fetched: 0,\n compiled: 0,\n totalTime: 0,\n };\n\n this.log(`Loading component hierarchy: ${rootSpec.name}`, {\n location: rootSpec.location,\n registry: rootSpec.registry,\n });\n\n try {\n // Initialize component engine if needed (skip in browser context where it doesn't exist)\n if (this.componentEngine && typeof this.componentEngine.Config === 'function') {\n await this.componentEngine.Config(false, options.contextUser);\n }\n\n // Load the root component and all its dependencies\n const result = await this.loadComponentRecursive(rootSpec, options, loaded, errors, components, stats, new Set());\n\n stats.totalTime = Date.now() - startTime;\n\n this.log(`Hierarchy loaded: ${rootSpec.name}`, {\n success: errors.length === 0,\n loadedCount: loaded.length,\n errors: errors.length,\n ...stats,\n });\n\n // Unwrap components before returning\n // Components are ComponentObject wrappers, but consumers expect just the React components\n const unwrappedComponents: Record<string, ComponentObject> = {};\n for (const [name, componentObject] of Object.entries(components)) {\n if (componentObject && typeof componentObject === 'object' && 'component' in componentObject) {\n // Extract the actual React component function\n unwrappedComponents[name] = (componentObject as any).component;\n } else {\n // Already a function or something else - use as-is\n unwrappedComponents[name] = componentObject;\n }\n }\n\n return {\n success: errors.length === 0,\n rootComponent: result.component,\n resolvedSpec: result.spec,\n loadedComponents: loaded,\n errors,\n components: unwrappedComponents,\n stats,\n };\n } catch (error) {\n stats.totalTime = Date.now() - startTime;\n\n this.log(`Failed to load hierarchy: ${rootSpec.name}`, error);\n\n return {\n success: false,\n loadedComponents: loaded,\n errors: [\n ...errors,\n {\n message: error instanceof Error ? error.message : String(error),\n phase: 'fetch',\n componentName: rootSpec.name,\n },\n ],\n stats,\n };\n }\n }\n\n /**\n * Recursively load a component and its dependencies\n */\n private async loadComponentRecursive(\n spec: ComponentSpec,\n options: LoadOptions,\n loaded: string[],\n errors: HierarchyResult['errors'],\n components: Record<string, ComponentObject>,\n stats: HierarchyResult['stats'],\n visited: Set<string>\n ): Promise<LoadResult> {\n const componentKey = this.getComponentKey(spec, options);\n\n // Prevent circular dependencies\n if (visited.has(componentKey)) {\n this.log(`Circular dependency detected: ${spec.name}`);\n return {\n success: true,\n component: components[spec.name],\n spec,\n fromCache: true,\n };\n }\n visited.add(componentKey);\n\n // Load this component\n const result = await this.loadComponent(spec, options);\n\n if (result.success && result.component) {\n loaded.push(spec.name);\n components[spec.name] = result.component;\n\n // Update stats\n if (stats) {\n if (result.fromCache) stats.fromCache++;\n else {\n stats.fetched++;\n stats.compiled++;\n }\n }\n\n // Load dependencies\n if (result.spec?.dependencies) {\n for (const dep of result.spec.dependencies) {\n // Normalize dependency spec for local registry lookup\n const depSpec = { ...dep };\n // OPTIMIZATION: If the dependency already has code (from registry population),\n // we can skip fetching and go straight to compilation\n if (depSpec.code) {\n this.log(`Dependency ${depSpec.name} already has code (from registry population), optimizing load`);\n }\n\n // If location is \"registry\" with undefined registry, ensure it's treated as local\n // This follows the convention that registry components with undefined registry\n // should be looked up in the local ComponentMetadataEngine\n if (depSpec.location === 'registry' && !depSpec.registry) {\n // Explicitly set to undefined for clarity (it may already be undefined)\n depSpec.registry = undefined;\n\n // Log for debugging\n this.log(`Dependency ${depSpec.name} is a local registry component (registry=undefined)`);\n }\n\n await this.loadComponentRecursive(depSpec, { ...options, isDependent: true }, loaded, errors, components, stats, visited);\n }\n }\n } else if (result.errors) {\n errors.push(...result.errors);\n }\n\n return result;\n }\n\n /**\n * Load dependencies in batches for efficiency\n */\n private async loadDependenciesBatched(dependencies: ComponentSpec[], options: LoadOptions): Promise<LoadResult[]> {\n const batchSize = this.config.dependencyBatchSize || 5;\n const results: LoadResult[] = [];\n\n for (let i = 0; i < dependencies.length; i += batchSize) {\n const batch = dependencies.slice(i, i + batchSize);\n const batchPromises = batch.map((dep) => this.loadComponent(dep, options));\n const batchResults = await Promise.all(batchPromises);\n results.push(...batchResults);\n }\n\n return results;\n }\n\n /**\n * Check if a component needs to be fetched from a registry\n */\n private needsFetch(spec: ComponentSpec): boolean {\n // Need to fetch if:\n // 1. It's a registry component without code\n // 2. It's missing required fields\n return spec.location === 'registry' && !spec.code;\n }\n\n /**\n * Fetch a component specification from a registry (local or external)\n *\n * Convention: When location === 'registry' and registry === undefined,\n * the component is looked up in the local ComponentMetadataEngine.\n * This allows components to reference local registry components without\n * having to know if they're embedded or registry-based.\n */\n private async fetchComponentSpec(\n spec: ComponentSpec,\n contextUser?: UserInfo,\n options?: { resolutionMode?: ResolutionMode }\n ): Promise<ComponentSpec> {\n // Check cache first\n const cacheKey = this.getComponentKey(spec, {});\n const cached = this.fetchCache.get(cacheKey);\n\n if (cached && this.isCacheValid(cached)) {\n this.log(`Using cached spec for: ${spec.name}`);\n return cached.spec;\n }\n\n // Handle LOCAL registry components (registry is null/undefined)\n if (!spec.registry) {\n this.log(`Fetching from local registry: ${spec.name}`);\n\n // Find component in local ComponentMetadataEngine\n const localComponent = this.componentEngine.Components?.find((c: ComponentEntityExtended) => {\n // Match by name (case-insensitive for better compatibility)\n const nameMatch = c.Name?.toLowerCase() === spec.name?.toLowerCase();\n\n // Match by namespace if provided (handle different formats)\n const namespaceMatch = !spec.namespace || c.Namespace?.toLowerCase() === spec.namespace?.toLowerCase();\n\n if (nameMatch && !namespaceMatch) {\n }\n\n return nameMatch && namespaceMatch;\n });\n\n if (!localComponent) {\n throw new Error(`Local component not found: ${spec.name}`);\n }\n\n // Parse specification from local component\n if (!localComponent.Specification) {\n throw new Error(`Local component ${spec.name} has no specification`);\n }\n\n const fullSpec = JSON.parse(localComponent.Specification);\n\n // Cache it\n this.fetchCache.set(cacheKey, {\n spec: fullSpec,\n fetchedAt: new Date(),\n usageNotified: false,\n });\n\n return fullSpec;\n }\n\n // Handle EXTERNAL registry components (registry has a name)\n // Initialize GraphQL client if needed\n if (!this.graphQLClient) {\n await this.initializeGraphQLClient();\n }\n\n if (!this.graphQLClient) {\n throw new Error('GraphQL client not available for registry fetching');\n }\n\n // Fetch from external registry\n this.log(`Fetching from external registry: ${spec.registry}/${spec.name}`);\n\n const fullSpec = await this.graphQLClient.GetRegistryComponent({\n registryName: spec.registry,\n namespace: spec.namespace || 'Global',\n name: spec.name,\n version: spec.version || 'latest',\n });\n\n if (!fullSpec) {\n throw new Error(`Component not found in registry: ${spec.registry}/${spec.name}`);\n }\n\n // Apply resolution mode if specified\n const processedSpec = this.applyResolutionMode(fullSpec, spec, options?.resolutionMode);\n\n // Cache it\n this.fetchCache.set(cacheKey, {\n spec: processedSpec,\n fetchedAt: new Date(),\n usageNotified: false,\n });\n\n return processedSpec;\n }\n\n /**\n * Apply resolution mode to a fetched spec (recursively including dependencies)\n */\n private applyResolutionMode(fullSpec: ComponentSpec, originalSpec: ComponentSpec, resolutionMode?: ResolutionMode): ComponentSpec {\n let processedSpec: ComponentSpec;\n\n if (resolutionMode === 'embed') {\n // Convert to embedded format for test harness\n processedSpec = {\n ...fullSpec,\n location: 'embedded',\n registry: undefined,\n // namespace and name can stay for identification\n };\n } else {\n // Default: preserve-metadata mode\n // Keep original registry metadata but include fetched code\n processedSpec = {\n ...fullSpec,\n location: originalSpec.location,\n registry: originalSpec.registry,\n namespace: originalSpec.namespace || fullSpec.namespace,\n name: originalSpec.name || fullSpec.name,\n };\n }\n\n // Recursively apply resolution mode to dependencies\n if (processedSpec.dependencies && processedSpec.dependencies.length > 0) {\n processedSpec.dependencies = processedSpec.dependencies.map((dep) => {\n // For dependencies, use the dep itself as both full and original spec\n // since they've already been fetched and processed\n return this.applyResolutionMode(dep, dep, resolutionMode);\n });\n }\n\n return processedSpec;\n }\n\n /**\n * Compile a component specification\n */\n private async compileComponent(spec: ComponentSpec, options: LoadOptions): Promise<ComponentObject> {\n // Get all available libraries - use passed libraries or fall back to ComponentMetadataEngine\n const allLibraries = options.allLibraries || this.componentEngine.ComponentLibraries || [];\n\n // Filter valid libraries\n const validLibraries = spec.libraries?.filter(\n (lib) => lib && lib.name && lib.globalVariable && lib.name !== 'unknown' && lib.globalVariable !== 'undefined'\n );\n\n // Compile the component\n const result = await this.compiler.compile({\n componentName: spec.name,\n componentCode: spec.code || '',\n libraries: validLibraries,\n dependencies: spec.dependencies,\n allLibraries,\n });\n\n if (!result.success || !result.component) {\n throw new Error(result.error?.message || 'Compilation failed');\n }\n\n // Add loaded libraries to runtime context\n if (result.loadedLibraries && result.loadedLibraries.size > 0) {\n if (!this.runtimeContext.libraries) {\n this.runtimeContext.libraries = {};\n }\n result.loadedLibraries.forEach((value, key) => {\n this.runtimeContext.libraries![key] = value;\n });\n }\n\n // Get the component object from the factory\n const componentObject = result.component.factory(\n this.runtimeContext,\n undefined, // styles\n {} // components - will be injected by parent\n );\n\n return componentObject;\n }\n\n /**\n * Notify registry of component usage for licensing\n * Only happens once per component per session\n */\n private async notifyRegistryUsageIfNeeded(spec: ComponentSpec, componentKey: string): Promise<void> {\n if (!spec.registry || !this.config.enableUsageTracking) {\n return; // Only for external registry components with tracking enabled\n }\n\n const notificationKey = `${spec.registry}:${componentKey}`;\n if (this.registryNotifications.has(notificationKey)) {\n this.log(`Usage already notified for: ${spec.name}`);\n return; // Already notified this session\n }\n\n try {\n // In the future, make lightweight usage notification call to registry\n // For now, the fetch itself serves as the notification\n this.log(`Notifying registry usage for: ${spec.name}`);\n this.registryNotifications.add(notificationKey);\n\n // Update cache entry\n const cached = this.fetchCache.get(componentKey);\n if (cached) {\n cached.usageNotified = true;\n }\n } catch (error) {\n // Log but don't fail - usage tracking shouldn't break component loading\n console.warn(`Failed to notify registry usage for ${componentKey}:`, error);\n }\n }\n\n /**\n * Initialize GraphQL client for registry operations\n */\n private async initializeGraphQLClient(): Promise<void> {\n try {\n const provider = Metadata?.Provider;\n if (provider && (provider as any).ExecuteGQL) {\n const { GraphQLComponentRegistryClient } = await import('@memberjunction/graphql-dataprovider');\n this.graphQLClient = new GraphQLComponentRegistryClient(provider as any);\n this.log('GraphQL client initialized');\n }\n } catch (error) {\n LogError(`Failed to initialize GraphQL client: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n /**\n * Check if a cache entry is still valid\n */\n private isCacheValid(entry: CacheEntry): boolean {\n const age = Date.now() - entry.fetchedAt.getTime();\n return age < (this.config.cacheTTL || 3600000);\n }\n\n /**\n * Calculate a hash for a component spec (for cache validation)\n */\n private async calculateHash(spec: ComponentSpec): Promise<string> {\n // Simple hash based on spec content\n const content = JSON.stringify({\n name: spec.name,\n version: spec.version,\n code: spec.code,\n libraries: spec.libraries,\n });\n\n // Simple hash function (in production, use crypto)\n let hash = 0;\n for (let i = 0; i < content.length; i++) {\n const char = content.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return hash.toString(16);\n }\n\n /**\n * Generate a unique key for a component\n */\n private getComponentKey(spec: ComponentSpec, options: LoadOptions): string {\n const registry = spec.registry || 'local';\n const namespace = spec.namespace || options.defaultNamespace || 'Global';\n const version = spec.version || options.defaultVersion || 'latest';\n return `${registry}:${namespace}:${spec.name}:${version}`;\n }\n\n /**\n * Clear all caches\n */\n clearCache(): void {\n this.fetchCache.clear();\n this.registryNotifications.clear();\n this.loadingPromises.clear();\n this.log('All caches cleared');\n }\n\n /**\n * Get cache statistics\n */\n getCacheStats(): {\n fetchCacheSize: number;\n notificationsCount: number;\n loadingCount: number;\n } {\n return {\n fetchCacheSize: this.fetchCache.size,\n notificationsCount: this.registryNotifications.size,\n loadingCount: this.loadingPromises.size,\n };\n }\n\n /**\n * Log a message if debug is enabled\n */\n private log(message: string, data?: any): void {\n if (this.config.debug) {\n console.log(`🎯 [ComponentManager] ${message}`, data || '');\n }\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { ComponentSpec } from '@memberjunction/interactive-component-types';
2
- import { UserInfo } from '@memberjunction/core';
2
+ import { UserInfo } from '@memberjunction/global';
3
3
  import { ComponentLibraryEntity } from '@memberjunction/core-entities';
4
4
  import { ComponentObject } from '../types';
5
5
  export type ResolutionMode = 'embed' | 'preserve-metadata';
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/component-manager/types.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAK3C,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,mBAAmB,CAAC;AAK3D,MAAM,WAAW,WAAW;IAI1B,WAAW,CAAC,EAAE,QAAQ,CAAC;IAKvB,YAAY,CAAC,EAAE,OAAO,CAAC;IAKvB,cAAc,CAAC,EAAE,OAAO,CAAC;IAKzB,WAAW,CAAC,EAAE,OAAO,CAAC;IAKtB,UAAU,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,MAAM,CAAC;IAK3C,UAAU,CAAC,EAAE,OAAO,CAAC;IAKrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAK1B,cAAc,CAAC,EAAE,MAAM,CAAC;IAQxB,cAAc,CAAC,EAAE,cAAc,CAAC;IAKhC,YAAY,CAAC,EAAE,sBAAsB,EAAE,CAAC;CACzC;AAKD,MAAM,WAAW,UAAU;IAIzB,OAAO,EAAE,OAAO,CAAC;IAKjB,SAAS,CAAC,EAAE,eAAe,CAAC;IAK5B,IAAI,CAAC,EAAE,aAAa,CAAC;IAKrB,SAAS,EAAE,OAAO,CAAC;IAKnB,MAAM,CAAC,EAAE,KAAK,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU,GAAG,YAAY,CAAC;QACvD,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC,CAAC;IAKH,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAChD;AAKD,MAAM,WAAW,eAAe;IAI9B,OAAO,EAAE,OAAO,CAAC;IAKjB,aAAa,CAAC,EAAE,eAAe,CAAC;IAKhC,YAAY,CAAC,EAAE,aAAa,CAAC;IAK7B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAK3B,MAAM,EAAE,KAAK,CAAC;QACZ,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU,GAAG,YAAY,CAAC;QACvD,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC,CAAC;IAKH,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAK7C,KAAK,CAAC,EAAE;QACN,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAKD,MAAM,WAAW,sBAAsB;IAIrC,KAAK,CAAC,EAAE,OAAO,CAAC;IAKhB,YAAY,CAAC,EAAE,MAAM,CAAC;IAKtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAKlB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAK9B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAK7B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAKD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,aAAa,CAAC;IACpB,SAAS,EAAE,IAAI,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,OAAO,CAAC;CACxB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/component-manager/types.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAK3C,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,mBAAmB,CAAC;AAK3D,MAAM,WAAW,WAAW;IAI1B,WAAW,CAAC,EAAE,QAAQ,CAAC;IAKvB,YAAY,CAAC,EAAE,OAAO,CAAC;IAKvB,cAAc,CAAC,EAAE,OAAO,CAAC;IAKzB,WAAW,CAAC,EAAE,OAAO,CAAC;IAKtB,UAAU,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,MAAM,CAAC;IAK3C,UAAU,CAAC,EAAE,OAAO,CAAC;IAKrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAK1B,cAAc,CAAC,EAAE,MAAM,CAAC;IAQxB,cAAc,CAAC,EAAE,cAAc,CAAC;IAKhC,YAAY,CAAC,EAAE,sBAAsB,EAAE,CAAC;CACzC;AAKD,MAAM,WAAW,UAAU;IAIzB,OAAO,EAAE,OAAO,CAAC;IAKjB,SAAS,CAAC,EAAE,eAAe,CAAC;IAK5B,IAAI,CAAC,EAAE,aAAa,CAAC;IAKrB,SAAS,EAAE,OAAO,CAAC;IAKnB,MAAM,CAAC,EAAE,KAAK,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU,GAAG,YAAY,CAAC;QACvD,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC,CAAC;IAKH,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAChD;AAKD,MAAM,WAAW,eAAe;IAI9B,OAAO,EAAE,OAAO,CAAC;IAKjB,aAAa,CAAC,EAAE,eAAe,CAAC;IAKhC,YAAY,CAAC,EAAE,aAAa,CAAC;IAK7B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAK3B,MAAM,EAAE,KAAK,CAAC;QACZ,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU,GAAG,YAAY,CAAC;QACvD,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC,CAAC;IAKH,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAK7C,KAAK,CAAC,EAAE;QACN,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAKD,MAAM,WAAW,sBAAsB;IAIrC,KAAK,CAAC,EAAE,OAAO,CAAC;IAKhB,YAAY,CAAC,EAAE,MAAM,CAAC;IAKtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAKlB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAK9B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAK7B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAKD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,aAAa,CAAC;IACpB,SAAS,EAAE,IAAI,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,OAAO,CAAC;CACxB"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/component-manager/types.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * @fileoverview Type definitions for the unified ComponentManager\n */\n\nimport { ComponentSpec } from '@memberjunction/interactive-component-types';\nimport { UserInfo } from '@memberjunction/core';\nimport { ComponentLibraryEntity } from '@memberjunction/core-entities';\nimport { ComponentObject } from '../types';\n\n/**\n * Resolution mode for specs\n */\nexport type ResolutionMode = 'embed' | 'preserve-metadata';\n\n/**\n * Options for loading a component\n */\nexport interface LoadOptions {\n /**\n * User context for database operations and registry fetching\n */\n contextUser?: UserInfo;\n \n /**\n * Force re-fetch from registry even if cached\n */\n forceRefresh?: boolean;\n \n /**\n * Force recompilation even if compiled version exists\n */\n forceRecompile?: boolean;\n \n /**\n * Whether this is a dependent component (for tracking)\n */\n isDependent?: boolean;\n \n /**\n * What to return from the load operation\n */\n returnType?: 'component' | 'spec' | 'both';\n \n /**\n * Enable registry usage tracking for licensing (default: true)\n */\n trackUsage?: boolean;\n \n /**\n * Namespace to use if not specified in spec\n */\n defaultNamespace?: string;\n \n /**\n * Version to use if not specified in spec\n */\n defaultVersion?: string;\n \n /**\n * How to format resolved specs:\n * - 'preserve-metadata': Keep registry/namespace/name intact (for UI display)\n * - 'embed': Convert to embedded format (for test harness)\n * @default 'preserve-metadata'\n */\n resolutionMode?: ResolutionMode;\n \n /**\n * All available component libraries (for browser context where ComponentMetadataEngine isn't available)\n */\n allLibraries?: ComponentLibraryEntity[];\n}\n\n/**\n * Result of loading a single component\n */\nexport interface LoadResult {\n /**\n * Whether the load operation succeeded\n */\n success: boolean;\n \n /**\n * The compiled component object\n */\n component?: ComponentObject;\n \n /**\n * The fully resolved component specification\n */\n spec?: ComponentSpec;\n \n /**\n * Whether the component was loaded from cache\n */\n fromCache: boolean;\n \n /**\n * Any errors that occurred during loading\n */\n errors?: Array<{\n message: string;\n phase: 'fetch' | 'compile' | 'register' | 'dependency';\n componentName?: string;\n }>;\n \n /**\n * Components that were loaded as dependencies\n */\n dependencies?: Record<string, ComponentObject>;\n}\n\n/**\n * Result of loading a component hierarchy\n */\nexport interface HierarchyResult {\n /**\n * Whether the entire hierarchy loaded successfully\n */\n success: boolean;\n \n /**\n * The root component object\n */\n rootComponent?: ComponentObject;\n \n /**\n * The fully resolved root specification\n */\n resolvedSpec?: ComponentSpec;\n \n /**\n * List of all component names that were loaded\n */\n loadedComponents: string[];\n \n /**\n * Any errors that occurred during loading\n */\n errors: Array<{\n message: string;\n phase: 'fetch' | 'compile' | 'register' | 'dependency';\n componentName?: string;\n }>;\n \n /**\n * Map of all loaded components by name\n */\n components?: Record<string, ComponentObject>;\n \n /**\n * Number of components loaded from cache vs fetched\n */\n stats?: {\n fromCache: number;\n fetched: number;\n compiled: number;\n totalTime: number;\n };\n}\n\n/**\n * Configuration for ComponentManager\n */\nexport interface ComponentManagerConfig {\n /**\n * Enable debug logging\n */\n debug?: boolean;\n \n /**\n * Maximum cache size for fetched specs\n */\n maxCacheSize?: number;\n \n /**\n * Cache TTL in milliseconds (default: 1 hour)\n */\n cacheTTL?: number;\n \n /**\n * Whether to track registry usage for licensing\n */\n enableUsageTracking?: boolean;\n \n /**\n * Batch size for parallel dependency loading\n */\n dependencyBatchSize?: number;\n \n /**\n * Timeout for registry fetch operations (ms)\n */\n fetchTimeout?: number;\n}\n\n/**\n * Internal cache entry for fetched specs\n */\nexport interface CacheEntry {\n spec: ComponentSpec;\n fetchedAt: Date;\n hash?: string;\n usageNotified: boolean;\n}"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/component-manager/types.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * @fileoverview Type definitions for the unified ComponentManager\n */\n\nimport { ComponentSpec } from '@memberjunction/interactive-component-types';\nimport { UserInfo } from '@memberjunction/global';\nimport { ComponentLibraryEntity } from '@memberjunction/core-entities';\nimport { ComponentObject } from '../types';\n\n/**\n * Resolution mode for specs\n */\nexport type ResolutionMode = 'embed' | 'preserve-metadata';\n\n/**\n * Options for loading a component\n */\nexport interface LoadOptions {\n /**\n * User context for database operations and registry fetching\n */\n contextUser?: UserInfo;\n\n /**\n * Force re-fetch from registry even if cached\n */\n forceRefresh?: boolean;\n\n /**\n * Force recompilation even if compiled version exists\n */\n forceRecompile?: boolean;\n\n /**\n * Whether this is a dependent component (for tracking)\n */\n isDependent?: boolean;\n\n /**\n * What to return from the load operation\n */\n returnType?: 'component' | 'spec' | 'both';\n\n /**\n * Enable registry usage tracking for licensing (default: true)\n */\n trackUsage?: boolean;\n\n /**\n * Namespace to use if not specified in spec\n */\n defaultNamespace?: string;\n\n /**\n * Version to use if not specified in spec\n */\n defaultVersion?: string;\n\n /**\n * How to format resolved specs:\n * - 'preserve-metadata': Keep registry/namespace/name intact (for UI display)\n * - 'embed': Convert to embedded format (for test harness)\n * @default 'preserve-metadata'\n */\n resolutionMode?: ResolutionMode;\n\n /**\n * All available component libraries (for browser context where ComponentMetadataEngine isn't available)\n */\n allLibraries?: ComponentLibraryEntity[];\n}\n\n/**\n * Result of loading a single component\n */\nexport interface LoadResult {\n /**\n * Whether the load operation succeeded\n */\n success: boolean;\n\n /**\n * The compiled component object\n */\n component?: ComponentObject;\n\n /**\n * The fully resolved component specification\n */\n spec?: ComponentSpec;\n\n /**\n * Whether the component was loaded from cache\n */\n fromCache: boolean;\n\n /**\n * Any errors that occurred during loading\n */\n errors?: Array<{\n message: string;\n phase: 'fetch' | 'compile' | 'register' | 'dependency';\n componentName?: string;\n }>;\n\n /**\n * Components that were loaded as dependencies\n */\n dependencies?: Record<string, ComponentObject>;\n}\n\n/**\n * Result of loading a component hierarchy\n */\nexport interface HierarchyResult {\n /**\n * Whether the entire hierarchy loaded successfully\n */\n success: boolean;\n\n /**\n * The root component object\n */\n rootComponent?: ComponentObject;\n\n /**\n * The fully resolved root specification\n */\n resolvedSpec?: ComponentSpec;\n\n /**\n * List of all component names that were loaded\n */\n loadedComponents: string[];\n\n /**\n * Any errors that occurred during loading\n */\n errors: Array<{\n message: string;\n phase: 'fetch' | 'compile' | 'register' | 'dependency';\n componentName?: string;\n }>;\n\n /**\n * Map of all loaded components by name\n */\n components?: Record<string, ComponentObject>;\n\n /**\n * Number of components loaded from cache vs fetched\n */\n stats?: {\n fromCache: number;\n fetched: number;\n compiled: number;\n totalTime: number;\n };\n}\n\n/**\n * Configuration for ComponentManager\n */\nexport interface ComponentManagerConfig {\n /**\n * Enable debug logging\n */\n debug?: boolean;\n\n /**\n * Maximum cache size for fetched specs\n */\n maxCacheSize?: number;\n\n /**\n * Cache TTL in milliseconds (default: 1 hour)\n */\n cacheTTL?: number;\n\n /**\n * Whether to track registry usage for licensing\n */\n enableUsageTracking?: boolean;\n\n /**\n * Batch size for parallel dependency loading\n */\n dependencyBatchSize?: number;\n\n /**\n * Timeout for registry fetch operations (ms)\n */\n fetchTimeout?: number;\n}\n\n/**\n * Internal cache entry for fetched specs\n */\nexport interface CacheEntry {\n spec: ComponentSpec;\n fetchedAt: Date;\n hash?: string;\n usageNotified: boolean;\n}\n"]}
@@ -2,7 +2,7 @@ import { ComponentSpec, ComponentObject } from '@memberjunction/interactive-comp
2
2
  import { ComponentCompiler } from '../compiler';
3
3
  import { RuntimeContext } from '../types';
4
4
  import { ComponentDependencyInfo, DependencyTree } from './registry-provider';
5
- import { UserInfo } from '@memberjunction/core';
5
+ import { UserInfo } from '@memberjunction/global';
6
6
  export interface IComponentRegistryClient {
7
7
  GetRegistryComponent(params: {
8
8
  registryName: string;
@@ -1 +1 @@
1
- {"version":3,"file":"component-registry-service.d.ts","sourceRoot":"","sources":["../../src/registry/component-registry-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"component-registry-service.d.ts","sourceRoot":"","sources":["../../src/registry/component-registry-service.ts"],"names":[],"mappings":"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"}
@@ -24,7 +24,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
26
  exports.ComponentRegistryService = void 0;
27
- const core_1 = require("@memberjunction/core");
27
+ const global_1 = require("@memberjunction/global");
28
28
  const core_entities_1 = require("@memberjunction/core-entities");
29
29
  let GraphQLComponentRegistryClient;
30
30
  class ComponentRegistryService {
@@ -60,7 +60,7 @@ class ComponentRegistryService {
60
60
  return this.cachedProviderClient;
61
61
  }
62
62
  try {
63
- const provider = core_1.Metadata?.Provider;
63
+ const provider = global_1.Metadata?.Provider;
64
64
  if (provider && provider.ExecuteGQL !== undefined) {
65
65
  if (!GraphQLComponentRegistryClient) {
66
66
  try {
@@ -112,7 +112,7 @@ class ComponentRegistryService {
112
112
  const data = encoder.encode(specString);
113
113
  const hashBuffer = await crypto.subtle.digest('SHA-256', data);
114
114
  const hashArray = Array.from(new Uint8Array(hashBuffer));
115
- const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
115
+ const hashHex = hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');
116
116
  return hashHex;
117
117
  }
118
118
  async getCompiledComponent(componentId, referenceId, contextUser) {
@@ -145,7 +145,7 @@ class ComponentRegistryService {
145
145
  componentName: component.Name,
146
146
  componentCode: spec.code,
147
147
  libraries: spec.libraries,
148
- allLibraries
148
+ allLibraries,
149
149
  });
150
150
  }
151
151
  catch (compileEx) {
@@ -169,7 +169,7 @@ class ComponentRegistryService {
169
169
  libraries: spec.libraries,
170
170
  dependencies: spec.dependencies,
171
171
  sourceRegistryID: component.SourceRegistryID,
172
- isLocal: !component.SourceRegistryID
172
+ isLocal: !component.SourceRegistryID,
173
173
  };
174
174
  if (!compilationResult.component) {
175
175
  throw new Error(`Component compilation succeeded but no component returned`);
@@ -180,7 +180,7 @@ class ComponentRegistryService {
180
180
  metadata,
181
181
  compiledAt: new Date(),
182
182
  lastUsed: new Date(),
183
- useCount: 1
183
+ useCount: 1,
184
184
  });
185
185
  if (referenceId) {
186
186
  this.addComponentReference(key, referenceId);
@@ -192,7 +192,7 @@ class ComponentRegistryService {
192
192
  if (this.debug) {
193
193
  console.log(`🌐 [ComponentRegistryService] Fetching from external registry: ${registryName}/${namespace}/${name}@${version}`);
194
194
  }
195
- const registry = this.componentEngine.ComponentRegistries?.find(r => r.Name === registryName && r.Status === 'Active');
195
+ const registry = this.componentEngine.ComponentRegistries?.find((r) => r.Name === registryName && r.Status === 'Active');
196
196
  if (!registry) {
197
197
  throw new Error(`Registry not found or inactive: ${registryName}`);
198
198
  }
@@ -211,7 +211,7 @@ class ComponentRegistryService {
211
211
  namespace,
212
212
  name,
213
213
  version,
214
- hash: cached?.specHash
214
+ hash: cached?.specHash,
215
215
  });
216
216
  if (!spec && cached?.specHash) {
217
217
  if (this.debug) {
@@ -249,7 +249,7 @@ class ComponentRegistryService {
249
249
  const compilationResult = await this.compiler.compile({
250
250
  componentName: spec.name,
251
251
  componentCode: spec.code || '',
252
- allLibraries: allLibraries
252
+ allLibraries: allLibraries,
253
253
  });
254
254
  if (!compilationResult.success || !compilationResult.component) {
255
255
  throw new Error(`Failed to compile component: ${compilationResult.error?.message || 'Unknown error'}`);
@@ -262,12 +262,12 @@ class ComponentRegistryService {
262
262
  version: spec.version || '1.0.0',
263
263
  description: spec.description || '',
264
264
  type: spec.type,
265
- isLocal: false
265
+ isLocal: false,
266
266
  },
267
267
  compiledAt: new Date(),
268
268
  lastUsed: new Date(),
269
269
  useCount: 1,
270
- specHash: specHash
270
+ specHash: specHash,
271
271
  });
272
272
  if (referenceId) {
273
273
  this.addComponentReference(key, referenceId);
@@ -300,7 +300,7 @@ class ComponentRegistryService {
300
300
  }
301
301
  return JSON.parse(component.Specification);
302
302
  }
303
- const registry = this.componentEngine.ComponentRegistries?.find(r => r.ID === component.SourceRegistryID);
303
+ const registry = this.componentEngine.ComponentRegistries?.find((r) => r.ID === component.SourceRegistryID);
304
304
  if (!registry) {
305
305
  throw new Error(`Registry not found: ${component.SourceRegistryID}`);
306
306
  }
@@ -313,7 +313,7 @@ class ComponentRegistryService {
313
313
  registryName: registry.Name,
314
314
  namespace: component.Namespace || '',
315
315
  name: component.Name,
316
- version: component.Version
316
+ version: component.Version,
317
317
  });
318
318
  if (!result) {
319
319
  throw new Error(`Component not found in registry: ${component.Name}`);
@@ -329,7 +329,7 @@ class ComponentRegistryService {
329
329
  async fetchFromExternalRegistry(uri, name, namespace, version, apiKey) {
330
330
  const url = `${uri}/components/${encodeURIComponent(namespace)}/${encodeURIComponent(name)}/${version}`;
331
331
  const headers = {
332
- 'Accept': 'application/json'
332
+ Accept: 'application/json',
333
333
  };
334
334
  if (apiKey) {
335
335
  headers['Authorization'] = `Bearer ${apiKey}`;
@@ -341,13 +341,13 @@ class ComponentRegistryService {
341
341
  if (!response.ok) {
342
342
  throw new Error(`Registry fetch failed: ${response.status} ${response.statusText}`);
343
343
  }
344
- const spec = await response.json();
344
+ const spec = (await response.json());
345
345
  return spec;
346
346
  }
347
347
  async cacheExternalComponent(componentId, spec, contextUser) {
348
- const md = new core_1.Metadata();
348
+ const md = new global_1.Metadata();
349
349
  const componentEntity = await md.GetEntityObject('MJ: Components', contextUser);
350
- if (!await componentEntity.Load(componentId)) {
350
+ if (!(await componentEntity.Load(componentId))) {
351
351
  throw new Error(`Failed to load component entity: ${componentId}`);
352
352
  }
353
353
  componentEntity.Specification = JSON.stringify(spec);
@@ -372,16 +372,16 @@ class ComponentRegistryService {
372
372
  }
373
373
  if (spec.type) {
374
374
  const typeMap = {
375
- 'report': 'Report',
376
- 'dashboard': 'Dashboard',
377
- 'form': 'Form',
378
- 'table': 'Table',
379
- 'chart': 'Chart',
380
- 'navigation': 'Navigation',
381
- 'search': 'Search',
382
- 'widget': 'Widget',
383
- 'utility': 'Utility',
384
- 'other': 'Other'
375
+ report: 'Report',
376
+ dashboard: 'Dashboard',
377
+ form: 'Form',
378
+ table: 'Table',
379
+ chart: 'Chart',
380
+ navigation: 'Navigation',
381
+ search: 'Search',
382
+ widget: 'Widget',
383
+ utility: 'Utility',
384
+ other: 'Other',
385
385
  };
386
386
  const mappedType = typeMap[spec.type.toLowerCase()];
387
387
  if (mappedType) {
@@ -405,7 +405,7 @@ class ComponentRegistryService {
405
405
  }
406
406
  async loadDependencies(componentId, contextUser) {
407
407
  await this.initialize(contextUser);
408
- const dependencies = this.componentEngine.ComponentDependencies?.filter(d => d.ComponentID === componentId) || [];
408
+ const dependencies = this.componentEngine.ComponentDependencies?.filter((d) => d.ComponentID === componentId) || [];
409
409
  const result = [];
410
410
  for (const dep of dependencies) {
411
411
  const depComponent = this.componentEngine.Components.find((c) => c.ID === dep.DependencyComponentID);
@@ -416,7 +416,7 @@ class ComponentRegistryService {
416
416
  version: depComponent.Version,
417
417
  isRequired: true,
418
418
  location: depComponent.SourceRegistryID ? 'registry' : 'embedded',
419
- sourceRegistryID: depComponent.SourceRegistryID
419
+ sourceRegistryID: depComponent.SourceRegistryID,
420
420
  });
421
421
  }
422
422
  }
@@ -426,7 +426,7 @@ class ComponentRegistryService {
426
426
  if (visited.has(componentId)) {
427
427
  return {
428
428
  componentId,
429
- circular: true
429
+ circular: true,
430
430
  };
431
431
  }
432
432
  visited.add(componentId);
@@ -438,7 +438,7 @@ class ComponentRegistryService {
438
438
  const directDeps = await this.loadDependencies(componentId, contextUser);
439
439
  const dependencies = [];
440
440
  for (const dep of directDeps) {
441
- const depComponent = this.componentEngine.Components.find(c => c.Name.trim().toLowerCase() === dep.name.trim().toLowerCase() &&
441
+ const depComponent = this.componentEngine.Components.find((c) => c.Name.trim().toLowerCase() === dep.name.trim().toLowerCase() &&
442
442
  c.Namespace?.trim().toLowerCase() === dep.namespace?.trim().toLowerCase());
443
443
  if (depComponent) {
444
444
  const subTree = await this.resolveDependencyTree(depComponent.ID, contextUser, visited);
@@ -451,7 +451,7 @@ class ComponentRegistryService {
451
451
  namespace: component.Namespace || undefined,
452
452
  version: component.Version,
453
453
  dependencies,
454
- totalCount: dependencies.reduce((sum, d) => sum + (d.totalCount || 1), 1)
454
+ totalCount: dependencies.reduce((sum, d) => sum + (d.totalCount || 1), 1),
455
455
  };
456
456
  }
457
457
  async getComponentsToLoad(rootComponentId, contextUser) {
@@ -502,13 +502,13 @@ class ComponentRegistryService {
502
502
  }
503
503
  getCacheStats() {
504
504
  let totalUseCount = 0;
505
- this.compiledComponentCache.forEach(cached => {
505
+ this.compiledComponentCache.forEach((cached) => {
506
506
  totalUseCount += cached.useCount;
507
507
  });
508
508
  return {
509
509
  compiledComponents: this.compiledComponentCache.size,
510
510
  totalUseCount,
511
- memoryEstimate: `~${(this.compiledComponentCache.size * 50)}KB`
511
+ memoryEstimate: `~${this.compiledComponentCache.size * 50}KB`,
512
512
  };
513
513
  }
514
514
  clearCache() {