@memberjunction/react-runtime 2.100.3 → 2.102.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.
@@ -1,25 +1,25 @@
1
1
 
2
- > @memberjunction/react-runtime@2.100.3 build
2
+ > @memberjunction/react-runtime@2.102.0 build
3
3
  > npm run build:node && npm run build:umd
4
4
 
5
5
 
6
- > @memberjunction/react-runtime@2.100.3 build:node
6
+ > @memberjunction/react-runtime@2.102.0 build:node
7
7
  > tsc
8
8
 
9
9
 
10
- > @memberjunction/react-runtime@2.100.3 build:umd
10
+ > @memberjunction/react-runtime@2.102.0 build:umd
11
11
  > webpack --config webpack.umd.config.js
12
12
 
13
13
  [BABEL] Note: The code generator has deoptimised the styling of /home/runner/work/MJ/MJ/packages/MJCoreEntities/dist/generated/entity_subclasses.js as it exceeds the max of 500KB.
14
- asset runtime.umd.js 2.27 MiB [emitted] [minimized] [big] (name: main) 1 related asset
14
+ asset runtime.umd.js 2.32 MiB [emitted] [minimized] [big] (name: main) 1 related asset
15
15
  orphan modules 513 KiB [orphan] 123 modules
16
16
  runtime modules 1010 bytes 5 modules
17
- modules by path ../../ 4.61 MiB
17
+ modules by path ../../ 4.7 MiB
18
18
  modules by path ../../../node_modules/ 1.62 MiB 258 modules
19
19
  modules by path ../../MJGlobal/ 174 KiB 35 modules
20
20
  modules by path ../../MJCore/ 644 KiB 31 modules
21
21
  modules by path ../../GraphQLDataProvider/ 111 KiB 22 modules
22
- modules by path ../../MJCoreEntities/dist/ 2.05 MiB 21 modules
22
+ modules by path ../../MJCoreEntities/dist/ 2.14 MiB 21 modules
23
23
  modules by path ../../InteractiveComponents/dist/*.js 36.8 KiB 10 modules
24
- modules by path ./dist/ 470 KiB 28 modules
25
- webpack 5.92.1 compiled successfully in 141772 ms
24
+ modules by path ./dist/ 472 KiB 28 modules
25
+ webpack 5.92.1 compiled successfully in 139915 ms
package/CHANGELOG.md CHANGED
@@ -1,5 +1,31 @@
1
1
  # @memberjunction/react-runtime
2
2
 
3
+ ## 2.102.0
4
+
5
+ ### Patch Changes
6
+
7
+ - bd75336: ix: Improve React component system registry handling and chart
8
+ flexibility
9
+
10
+ - Enhanced component manager to optimize pre-registered component loading
11
+ by skipping redundant fetches
12
+ - Fixed SimpleChart component to accept any field for grouping, not just
13
+ numeric fields
14
+ - Removed backup metadata file to clean up repository
15
+ - Added support for components with pre-populated code in the registry
16
+ - Improved dependency resolution for local registry components
17
+ - Better logging for component loading optimization paths
18
+
19
+ - addf572: Bump all packages to 2.101.0
20
+ - Updated dependencies [bd75336]
21
+ - Updated dependencies [addf572]
22
+ - Updated dependencies [a38eec3]
23
+ - @memberjunction/core@2.102.0
24
+ - @memberjunction/interactive-component-types@2.102.0
25
+ - @memberjunction/graphql-dataprovider@2.102.0
26
+ - @memberjunction/core-entities@2.102.0
27
+ - @memberjunction/global@2.102.0
28
+
3
29
  ## 2.100.3
4
30
 
5
31
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"component-manager.d.ts","sourceRoot":"","sources":["../../src/component-manager/component-manager.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAA8B,MAAM,6CAA6C,CAAC;AAIxG,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,cAAc,EAAmB,MAAM,UAAU,CAAC;AAC3D,OAAO,EACL,WAAW,EACX,UAAU,EACV,eAAe,EACf,sBAAsB,EAGvB,MAAM,SAAS,CAAC;AAMjB,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,MAAM,CAAyB;IAGvC,OAAO,CAAC,UAAU,CAAsC;IACxD,OAAO,CAAC,qBAAqB,CAA0B;IACvD,OAAO,CAAC,eAAe,CAA+C;IAGtE,OAAO,CAAC,eAAe,CAAoC;IAC3D,OAAO,CAAC,aAAa,CAAa;gBAGhC,QAAQ,EAAE,iBAAiB,EAC3B,QAAQ,EAAE,iBAAiB,EAC3B,cAAc,EAAE,cAAc,EAC9B,MAAM,GAAE,sBAA2B;IAyB/B,aAAa,CACjB,IAAI,EAAE,aAAa,EACnB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,UAAU,CAAC;YAiCR,eAAe;IAsJvB,aAAa,CACjB,QAAQ,EAAE,aAAa,EACvB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,eAAe,CAAC;YAuFb,sBAAsB;YA+DtB,uBAAuB;IAoBrC,OAAO,CAAC,UAAU;YAUJ,kBAAkB;IAqFhC,OAAO,CAAC,mBAAmB;YA0Cb,gBAAgB;YAkDhB,2BAA2B;YAkC3B,uBAAuB;IAgBrC,OAAO,CAAC,YAAY;YAQN,aAAa;IAsB3B,OAAO,CAAC,eAAe;IAUvB,UAAU,IAAI,IAAI;IAUlB,aAAa,IAAI;QACf,cAAc,EAAE,MAAM,CAAC;QACvB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,YAAY,EAAE,MAAM,CAAC;KACtB;IAWD,OAAO,CAAC,GAAG;CAKZ"}
1
+ {"version":3,"file":"component-manager.d.ts","sourceRoot":"","sources":["../../src/component-manager/component-manager.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAA8B,MAAM,6CAA6C,CAAC;AAIxG,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,cAAc,EAAmB,MAAM,UAAU,CAAC;AAC3D,OAAO,EACL,WAAW,EACX,UAAU,EACV,eAAe,EACf,sBAAsB,EAGvB,MAAM,SAAS,CAAC;AAMjB,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,MAAM,CAAyB;IAGvC,OAAO,CAAC,UAAU,CAAsC;IACxD,OAAO,CAAC,qBAAqB,CAA0B;IACvD,OAAO,CAAC,eAAe,CAA+C;IAGtE,OAAO,CAAC,eAAe,CAAoC;IAC3D,OAAO,CAAC,aAAa,CAAa;gBAGhC,QAAQ,EAAE,iBAAiB,EAC3B,QAAQ,EAAE,iBAAiB,EAC3B,cAAc,EAAE,cAAc,EAC9B,MAAM,GAAE,sBAA2B;IAyB/B,aAAa,CACjB,IAAI,EAAE,aAAa,EACnB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,UAAU,CAAC;YAiCR,eAAe;IAuKvB,aAAa,CACjB,QAAQ,EAAE,aAAa,EACvB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,eAAe,CAAC;YAuFb,sBAAsB;YAkFtB,uBAAuB;IAoBrC,OAAO,CAAC,UAAU;YAeJ,kBAAkB;IA+FhC,OAAO,CAAC,mBAAmB;YA0Cb,gBAAgB;YAkDhB,2BAA2B;YAkC3B,uBAAuB;IAgBrC,OAAO,CAAC,YAAY;YAQN,aAAa;IAsB3B,OAAO,CAAC,eAAe;IAUvB,UAAU,IAAI,IAAI;IAUlB,aAAa,IAAI;QACf,cAAc,EAAE,MAAM,CAAC;QACvB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,YAAY,EAAE,MAAM,CAAC;KACtB;IAWD,OAAO,CAAC,GAAG;CAKZ"}
@@ -117,6 +117,22 @@ class ComponentManager {
117
117
  throw error;
118
118
  }
119
119
  }
120
+ else {
121
+ if (spec.location === 'registry' && spec.code) {
122
+ this.log(`Skipping fetch for registry component: ${spec.name} (code already provided)`, {
123
+ location: spec.location,
124
+ registry: spec.registry
125
+ });
126
+ }
127
+ if (spec.code && !this.fetchCache.has(componentKey)) {
128
+ this.fetchCache.set(componentKey, {
129
+ spec: fullSpec,
130
+ fetchedAt: new Date(),
131
+ hash: await this.calculateHash(fullSpec),
132
+ usageNotified: false
133
+ });
134
+ }
135
+ }
120
136
  if (options.trackUsage !== false) {
121
137
  await this.notifyRegistryUsageIfNeeded(fullSpec, componentKey);
122
138
  }
@@ -270,7 +286,15 @@ class ComponentManager {
270
286
  }
271
287
  if (result.spec?.dependencies) {
272
288
  for (const dep of result.spec.dependencies) {
273
- await this.loadComponentRecursive(dep, { ...options, isDependent: true }, loaded, errors, components, stats, visited);
289
+ const depSpec = { ...dep };
290
+ if (depSpec.code) {
291
+ this.log(`Dependency ${depSpec.name} already has code (from registry population), optimizing load`);
292
+ }
293
+ if (depSpec.location === 'registry' && !depSpec.registry) {
294
+ depSpec.registry = undefined;
295
+ this.log(`Dependency ${depSpec.name} is a local registry component (registry=undefined)`);
296
+ }
297
+ await this.loadComponentRecursive(depSpec, { ...options, isDependent: true }, loaded, errors, components, stats, visited);
274
298
  }
275
299
  }
276
300
  }
@@ -302,8 +326,13 @@ class ComponentManager {
302
326
  }
303
327
  if (!spec.registry) {
304
328
  this.log(`Fetching from local registry: ${spec.name}`);
305
- const localComponent = this.componentEngine.Components?.find((c) => c.Name === spec.name &&
306
- (!spec.namespace || c.Namespace === spec.namespace));
329
+ const localComponent = this.componentEngine.Components?.find((c) => {
330
+ const nameMatch = c.Name?.toLowerCase() === spec.name?.toLowerCase();
331
+ const namespaceMatch = !spec.namespace || c.Namespace?.toLowerCase() === spec.namespace?.toLowerCase();
332
+ if (nameMatch && !namespaceMatch) {
333
+ }
334
+ return nameMatch && namespaceMatch;
335
+ });
307
336
  if (!localComponent) {
308
337
  throw new Error(`Local component not found: ${spec.name}`);
309
338
  }
@@ -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 } 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 }\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 await this.loadComponentRecursive(\n dep,\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 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: any) => c.Name === spec.name && \n (!spec.namespace || c.Namespace === spec.namespace)\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/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}"]}