@memberjunction/react-runtime 2.93.0 → 2.94.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.
- package/.turbo/turbo-build.log +6 -6
- package/CHANGELOG.md +16 -0
- package/README.md +180 -2
- package/dist/compiler/component-compiler.d.ts.map +1 -1
- package/dist/compiler/component-compiler.js +206 -57
- package/dist/compiler/component-compiler.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -4
- package/dist/index.js.map +1 -1
- package/dist/registry/component-registry-service.d.ts +4 -3
- package/dist/registry/component-registry-service.d.ts.map +1 -1
- package/dist/registry/component-registry-service.js +27 -11
- package/dist/registry/component-registry-service.js.map +1 -1
- package/dist/registry/component-registry.d.ts +4 -3
- package/dist/registry/component-registry.d.ts.map +1 -1
- package/dist/registry/component-registry.js.map +1 -1
- package/dist/registry/component-resolver.d.ts +2 -1
- package/dist/registry/component-resolver.d.ts.map +1 -1
- package/dist/registry/component-resolver.js +42 -10
- package/dist/registry/component-resolver.js.map +1 -1
- package/dist/runtime/component-hierarchy.d.ts.map +1 -1
- package/dist/runtime/component-hierarchy.js +8 -2
- package/dist/runtime/component-hierarchy.js.map +1 -1
- package/dist/runtime/prop-builder.d.ts +2 -2
- package/dist/runtime/prop-builder.d.ts.map +1 -1
- package/dist/runtime/prop-builder.js +32 -14
- package/dist/runtime/prop-builder.js.map +1 -1
- package/dist/runtime.umd.js +1 -1
- package/dist/types/dependency-types.d.ts +62 -0
- package/dist/types/dependency-types.d.ts.map +1 -0
- package/dist/types/dependency-types.js +3 -0
- package/dist/types/dependency-types.js.map +1 -0
- package/dist/types/index.d.ts +8 -10
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/utilities/index.d.ts +1 -0
- package/dist/utilities/index.d.ts.map +1 -1
- package/dist/utilities/index.js +1 -0
- package/dist/utilities/index.js.map +1 -1
- package/dist/utilities/library-dependency-resolver.d.ts +19 -0
- package/dist/utilities/library-dependency-resolver.d.ts.map +1 -0
- package/dist/utilities/library-dependency-resolver.js +410 -0
- package/dist/utilities/library-dependency-resolver.js.map +1 -0
- package/dist/utilities/library-loader.d.ts +9 -0
- package/dist/utilities/library-loader.d.ts.map +1 -1
- package/dist/utilities/library-loader.js +143 -0
- package/dist/utilities/library-loader.js.map +1 -1
- package/package.json +5 -5
- package/src/compiler/component-compiler.ts +227 -77
- package/src/index.ts +18 -4
- package/src/registry/component-registry-service.ts +32 -14
- package/src/registry/component-registry.ts +8 -7
- package/src/registry/component-resolver.ts +51 -10
- package/src/runtime/component-hierarchy.ts +12 -4
- package/src/runtime/prop-builder.ts +38 -18
- package/src/types/dependency-types.ts +110 -0
- package/src/types/index.ts +17 -21
- package/src/utilities/index.ts +1 -0
- package/src/utilities/library-dependency-resolver.ts +603 -0
- package/src/utilities/library-loader.ts +252 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-registry.js","sourceRoot":"","sources":["../../src/registry/component-registry.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Platform-agnostic component registry for managing compiled React components.\n * Provides storage, retrieval, and lifecycle management for components with namespace support.\n * @module @memberjunction/react-runtime/registry\n */\n\nimport { \n RegistryEntry, \n ComponentMetadata, \n RegistryConfig \n} from '../types';\nimport { resourceManager } from '../utilities/resource-manager';\n\n/**\n * Default registry configuration\n */\nconst DEFAULT_REGISTRY_CONFIG: RegistryConfig = {\n maxComponents: 1000,\n cleanupInterval: 60000, // 1 minute\n useLRU: true,\n enableNamespaces: true\n};\n\n/**\n * Platform-agnostic component registry.\n * Manages compiled React components with namespace isolation and lifecycle management.\n */\nexport class ComponentRegistry {\n private registry: Map<string, RegistryEntry>;\n private config: RegistryConfig;\n private cleanupTimer?: NodeJS.Timeout | number;\n private registryId: string;\n \n /**\n * Creates a new ComponentRegistry instance\n * @param config - Optional registry configuration\n */\n constructor(config?: Partial<RegistryConfig>) {\n this.config = { ...DEFAULT_REGISTRY_CONFIG, ...config };\n this.registry = new Map();\n this.registryId = `component-registry-${Date.now()}`;\n \n // Start cleanup timer if configured\n if (this.config.cleanupInterval > 0) {\n this.startCleanupTimer();\n }\n }\n\n /**\n * Registers a compiled component\n * @param name - Component name\n * @param component - Compiled component\n * @param namespace - Component namespace (default: 'Global')\n * @param version - Component version (default: 'v1')\n * @param tags - Optional tags for categorization\n * @returns The registered component's metadata\n */\n register(\n name: string,\n component: any,\n namespace: string = 'Global',\n version: string = 'v1',\n tags?: string[]\n ): ComponentMetadata {\n const id = this.generateRegistryKey(name, namespace, version);\n \n // Create metadata\n const metadata: ComponentMetadata = {\n id,\n name,\n version,\n namespace,\n registeredAt: new Date(),\n tags\n };\n\n // Create registry entry\n const entry: RegistryEntry = {\n component,\n metadata,\n lastAccessed: new Date(),\n refCount: 0\n };\n\n // Check capacity\n if (this.registry.size >= this.config.maxComponents && this.config.useLRU) {\n this.evictLRU();\n }\n\n // Store in registry\n this.registry.set(id, entry);\n\n return metadata;\n }\n\n /**\n * Gets a component from the registry\n * @param name - Component name\n * @param namespace - Component namespace\n * @param version - Component version\n * @returns The component if found, undefined otherwise\n */\n get(name: string, namespace: string = 'Global', version?: string): any {\n const id = version \n ? this.generateRegistryKey(name, namespace, version)\n : this.findLatestVersion(name, namespace);\n\n if (!id) return undefined;\n\n const entry = this.registry.get(id);\n if (entry) {\n // Update access time and increment ref count\n entry.lastAccessed = new Date();\n entry.refCount++;\n return entry.component;\n }\n\n return undefined;\n }\n\n /**\n * Checks if a component exists in the registry\n * @param name - Component name\n * @param namespace - Component namespace\n * @param version - Component version\n * @returns true if the component exists\n */\n has(name: string, namespace: string = 'Global', version?: string): boolean {\n const id = version \n ? this.generateRegistryKey(name, namespace, version)\n : this.findLatestVersion(name, namespace);\n\n return id ? this.registry.has(id) : false;\n }\n\n /**\n * Removes a component from the registry\n * @param name - Component name\n * @param namespace - Component namespace\n * @param version - Component version\n * @returns true if the component was removed\n */\n unregister(name: string, namespace: string = 'Global', version?: string): boolean {\n const id = version \n ? this.generateRegistryKey(name, namespace, version)\n : this.findLatestVersion(name, namespace);\n\n if (!id) return false;\n\n return this.registry.delete(id);\n }\n\n /**\n * Gets all components in a namespace\n * @param namespace - Namespace to query\n * @returns Array of components in the namespace\n */\n getNamespace(namespace: string): ComponentMetadata[] {\n const components: ComponentMetadata[] = [];\n \n for (const entry of this.registry.values()) {\n if (entry.metadata.namespace === namespace) {\n components.push(entry.metadata);\n }\n }\n\n return components;\n }\n\n /**\n * Gets all components in a namespace and version as a map\n * @param namespace - Namespace to query (default: 'Global')\n * @param version - Version to query (default: 'v1')\n * @returns Object mapping component names to components\n */\n getAll(namespace: string = 'Global', version: string = 'v1'): Record<string, any> {\n const components: Record<string, any> = {};\n \n for (const entry of this.registry.values()) {\n if (entry.metadata.namespace === namespace && entry.metadata.version === version) {\n components[entry.metadata.name] = entry.component;\n }\n }\n\n return components;\n }\n\n /**\n * Gets all registered namespaces\n * @returns Array of unique namespace names\n */\n getNamespaces(): string[] {\n const namespaces = new Set<string>();\n \n for (const entry of this.registry.values()) {\n namespaces.add(entry.metadata.namespace);\n }\n\n return Array.from(namespaces);\n }\n\n /**\n * Gets components by tags\n * @param tags - Tags to search for\n * @returns Array of components matching any of the tags\n */\n getByTags(tags: string[]): ComponentMetadata[] {\n const components: ComponentMetadata[] = [];\n \n for (const entry of this.registry.values()) {\n if (entry.metadata.tags?.some(tag => tags.includes(tag))) {\n components.push(entry.metadata);\n }\n }\n\n return components;\n }\n\n /**\n * Decrements reference count for a component\n * @param name - Component name\n * @param namespace - Component namespace\n * @param version - Component version\n */\n release(name: string, namespace: string = 'Global', version?: string): void {\n const id = version \n ? this.generateRegistryKey(name, namespace, version)\n : this.findLatestVersion(name, namespace);\n\n if (!id) return;\n\n const entry = this.registry.get(id);\n if (entry && entry.refCount > 0) {\n entry.refCount--;\n }\n }\n\n /**\n * Clears all components from the registry\n */\n clear(): void {\n this.registry.clear();\n }\n\n /**\n * Gets the current size of the registry\n * @returns Number of registered components\n */\n size(): number {\n return this.registry.size;\n }\n\n /**\n * Performs cleanup of unused components\n * @param force - Force cleanup regardless of reference count\n * @returns Number of components removed\n */\n cleanup(force: boolean = false): number {\n const toRemove: string[] = [];\n const now = Date.now();\n\n for (const [id, entry] of this.registry) {\n // Remove if no references and hasn't been accessed recently\n const timeSinceAccess = now - entry.lastAccessed.getTime();\n const isUnused = entry.refCount === 0 && timeSinceAccess > this.config.cleanupInterval;\n\n if (force || isUnused) {\n toRemove.push(id);\n }\n }\n\n for (const id of toRemove) {\n this.registry.delete(id);\n }\n\n return toRemove.length;\n }\n\n /**\n * Gets registry statistics\n * @returns Object containing registry stats\n */\n getStats(): {\n totalComponents: number;\n namespaces: number;\n totalRefCount: number;\n oldestComponent?: Date;\n newestComponent?: Date;\n } {\n let totalRefCount = 0;\n let oldest: Date | undefined;\n let newest: Date | undefined;\n\n for (const entry of this.registry.values()) {\n totalRefCount += entry.refCount;\n \n if (!oldest || entry.metadata.registeredAt < oldest) {\n oldest = entry.metadata.registeredAt;\n }\n \n if (!newest || entry.metadata.registeredAt > newest) {\n newest = entry.metadata.registeredAt;\n }\n }\n\n return {\n totalComponents: this.registry.size,\n namespaces: this.getNamespaces().length,\n totalRefCount,\n oldestComponent: oldest,\n newestComponent: newest\n };\n }\n\n /**\n * Destroys the registry and cleans up resources\n */\n destroy(): void {\n this.stopCleanupTimer();\n this.clear();\n // Clean up any resources associated with this registry\n resourceManager.cleanupComponent(this.registryId);\n }\n\n /**\n * Generates a unique registry key\n * @param name - Component name\n * @param namespace - Component namespace\n * @param version - Component version\n * @returns Registry key\n */\n private generateRegistryKey(name: string, namespace: string, version: string): string {\n if (this.config.enableNamespaces) {\n return `${namespace}::${name}@${version}`;\n }\n return `${name}@${version}`;\n }\n\n /**\n * Finds the latest version of a component\n * @param name - Component name\n * @param namespace - Component namespace\n * @returns Registry key of latest version or undefined\n */\n private findLatestVersion(name: string, namespace: string): string | undefined {\n let latestKey: string | undefined;\n let latestDate: Date | undefined;\n\n for (const [key, entry] of this.registry) {\n if (entry.metadata.name === name && \n entry.metadata.namespace === namespace) {\n if (!latestDate || entry.metadata.registeredAt > latestDate) {\n latestDate = entry.metadata.registeredAt;\n latestKey = key;\n }\n }\n }\n\n return latestKey;\n }\n\n /**\n * Evicts the least recently used component\n */\n private evictLRU(): void {\n let lruKey: string | undefined;\n let lruTime: Date | undefined;\n\n for (const [key, entry] of this.registry) {\n // Skip components with active references\n if (entry.refCount > 0) continue;\n\n if (!lruTime || entry.lastAccessed < lruTime) {\n lruTime = entry.lastAccessed;\n lruKey = key;\n }\n }\n\n if (lruKey) {\n this.registry.delete(lruKey);\n }\n }\n\n /**\n * Starts the automatic cleanup timer\n */\n private startCleanupTimer(): void {\n this.cleanupTimer = resourceManager.setInterval(\n this.registryId,\n () => {\n this.cleanup();\n },\n this.config.cleanupInterval,\n { purpose: 'component-registry-cleanup' }\n );\n }\n\n /**\n * Stops the automatic cleanup timer\n */\n private stopCleanupTimer(): void {\n if (this.cleanupTimer) {\n resourceManager.clearInterval(this.registryId, this.cleanupTimer as number);\n this.cleanupTimer = undefined;\n }\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"component-registry.js","sourceRoot":"","sources":["../../src/registry/component-registry.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Platform-agnostic component registry for managing compiled React components.\n * Provides storage, retrieval, and lifecycle management for components with namespace support.\n * @module @memberjunction/react-runtime/registry\n */\n\nimport { \n RegistryEntry, \n ComponentMetadata, \n RegistryConfig \n} from '../types';\nimport { ComponentObject } from '@memberjunction/interactive-component-types';\nimport { resourceManager } from '../utilities/resource-manager';\n\n/**\n * Default registry configuration\n */\nconst DEFAULT_REGISTRY_CONFIG: RegistryConfig = {\n maxComponents: 1000,\n cleanupInterval: 60000, // 1 minute\n useLRU: true,\n enableNamespaces: true\n};\n\n/**\n * Platform-agnostic component registry.\n * Manages compiled React components with namespace isolation and lifecycle management.\n */\nexport class ComponentRegistry {\n private registry: Map<string, RegistryEntry>;\n private config: RegistryConfig;\n private cleanupTimer?: NodeJS.Timeout | number;\n private registryId: string;\n \n /**\n * Creates a new ComponentRegistry instance\n * @param config - Optional registry configuration\n */\n constructor(config?: Partial<RegistryConfig>) {\n this.config = { ...DEFAULT_REGISTRY_CONFIG, ...config };\n this.registry = new Map();\n this.registryId = `component-registry-${Date.now()}`;\n \n // Start cleanup timer if configured\n if (this.config.cleanupInterval > 0) {\n this.startCleanupTimer();\n }\n }\n\n /**\n * Registers a compiled component\n * @param name - Component name\n * @param component - Compiled component object\n * @param namespace - Component namespace (default: 'Global')\n * @param version - Component version (default: 'v1')\n * @param tags - Optional tags for categorization\n * @returns The registered component's metadata\n */\n register(\n name: string,\n component: ComponentObject,\n namespace: string = 'Global',\n version: string = 'v1',\n tags?: string[]\n ): ComponentMetadata {\n const id = this.generateRegistryKey(name, namespace, version);\n \n // Create metadata\n const metadata: ComponentMetadata = {\n id,\n name,\n version,\n namespace,\n registeredAt: new Date(),\n tags\n };\n\n // Create registry entry\n const entry: RegistryEntry = {\n component,\n metadata,\n lastAccessed: new Date(),\n refCount: 0\n };\n\n // Check capacity\n if (this.registry.size >= this.config.maxComponents && this.config.useLRU) {\n this.evictLRU();\n }\n\n // Store in registry\n this.registry.set(id, entry);\n\n return metadata;\n }\n\n /**\n * Gets a component from the registry\n * @param name - Component name\n * @param namespace - Component namespace\n * @param version - Component version\n * @returns The component object if found, undefined otherwise\n */\n get(name: string, namespace: string = 'Global', version?: string): ComponentObject | undefined {\n const id = version \n ? this.generateRegistryKey(name, namespace, version)\n : this.findLatestVersion(name, namespace);\n\n if (!id) return undefined;\n\n const entry = this.registry.get(id);\n if (entry) {\n // Update access time and increment ref count\n entry.lastAccessed = new Date();\n entry.refCount++;\n return entry.component;\n }\n\n return undefined;\n }\n\n /**\n * Checks if a component exists in the registry\n * @param name - Component name\n * @param namespace - Component namespace\n * @param version - Component version\n * @returns true if the component exists\n */\n has(name: string, namespace: string = 'Global', version?: string): boolean {\n const id = version \n ? this.generateRegistryKey(name, namespace, version)\n : this.findLatestVersion(name, namespace);\n\n return id ? this.registry.has(id) : false;\n }\n\n /**\n * Removes a component from the registry\n * @param name - Component name\n * @param namespace - Component namespace\n * @param version - Component version\n * @returns true if the component was removed\n */\n unregister(name: string, namespace: string = 'Global', version?: string): boolean {\n const id = version \n ? this.generateRegistryKey(name, namespace, version)\n : this.findLatestVersion(name, namespace);\n\n if (!id) return false;\n\n return this.registry.delete(id);\n }\n\n /**\n * Gets all components in a namespace\n * @param namespace - Namespace to query\n * @returns Array of components in the namespace\n */\n getNamespace(namespace: string): ComponentMetadata[] {\n const components: ComponentMetadata[] = [];\n \n for (const entry of this.registry.values()) {\n if (entry.metadata.namespace === namespace) {\n components.push(entry.metadata);\n }\n }\n\n return components;\n }\n\n /**\n * Gets all components in a namespace and version as a map\n * @param namespace - Namespace to query (default: 'Global')\n * @param version - Version to query (default: 'v1')\n * @returns Object mapping component names to component objects\n */\n getAll(namespace: string = 'Global', version: string = 'v1'): Record<string, ComponentObject> {\n const components: Record<string, ComponentObject> = {};\n \n for (const entry of this.registry.values()) {\n if (entry.metadata.namespace === namespace && entry.metadata.version === version) {\n components[entry.metadata.name] = entry.component;\n }\n }\n\n return components;\n }\n\n /**\n * Gets all registered namespaces\n * @returns Array of unique namespace names\n */\n getNamespaces(): string[] {\n const namespaces = new Set<string>();\n \n for (const entry of this.registry.values()) {\n namespaces.add(entry.metadata.namespace);\n }\n\n return Array.from(namespaces);\n }\n\n /**\n * Gets components by tags\n * @param tags - Tags to search for\n * @returns Array of components matching any of the tags\n */\n getByTags(tags: string[]): ComponentMetadata[] {\n const components: ComponentMetadata[] = [];\n \n for (const entry of this.registry.values()) {\n if (entry.metadata.tags?.some(tag => tags.includes(tag))) {\n components.push(entry.metadata);\n }\n }\n\n return components;\n }\n\n /**\n * Decrements reference count for a component\n * @param name - Component name\n * @param namespace - Component namespace\n * @param version - Component version\n */\n release(name: string, namespace: string = 'Global', version?: string): void {\n const id = version \n ? this.generateRegistryKey(name, namespace, version)\n : this.findLatestVersion(name, namespace);\n\n if (!id) return;\n\n const entry = this.registry.get(id);\n if (entry && entry.refCount > 0) {\n entry.refCount--;\n }\n }\n\n /**\n * Clears all components from the registry\n */\n clear(): void {\n this.registry.clear();\n }\n\n /**\n * Gets the current size of the registry\n * @returns Number of registered components\n */\n size(): number {\n return this.registry.size;\n }\n\n /**\n * Performs cleanup of unused components\n * @param force - Force cleanup regardless of reference count\n * @returns Number of components removed\n */\n cleanup(force: boolean = false): number {\n const toRemove: string[] = [];\n const now = Date.now();\n\n for (const [id, entry] of this.registry) {\n // Remove if no references and hasn't been accessed recently\n const timeSinceAccess = now - entry.lastAccessed.getTime();\n const isUnused = entry.refCount === 0 && timeSinceAccess > this.config.cleanupInterval;\n\n if (force || isUnused) {\n toRemove.push(id);\n }\n }\n\n for (const id of toRemove) {\n this.registry.delete(id);\n }\n\n return toRemove.length;\n }\n\n /**\n * Gets registry statistics\n * @returns Object containing registry stats\n */\n getStats(): {\n totalComponents: number;\n namespaces: number;\n totalRefCount: number;\n oldestComponent?: Date;\n newestComponent?: Date;\n } {\n let totalRefCount = 0;\n let oldest: Date | undefined;\n let newest: Date | undefined;\n\n for (const entry of this.registry.values()) {\n totalRefCount += entry.refCount;\n \n if (!oldest || entry.metadata.registeredAt < oldest) {\n oldest = entry.metadata.registeredAt;\n }\n \n if (!newest || entry.metadata.registeredAt > newest) {\n newest = entry.metadata.registeredAt;\n }\n }\n\n return {\n totalComponents: this.registry.size,\n namespaces: this.getNamespaces().length,\n totalRefCount,\n oldestComponent: oldest,\n newestComponent: newest\n };\n }\n\n /**\n * Destroys the registry and cleans up resources\n */\n destroy(): void {\n this.stopCleanupTimer();\n this.clear();\n // Clean up any resources associated with this registry\n resourceManager.cleanupComponent(this.registryId);\n }\n\n /**\n * Generates a unique registry key\n * @param name - Component name\n * @param namespace - Component namespace\n * @param version - Component version\n * @returns Registry key\n */\n private generateRegistryKey(name: string, namespace: string, version: string): string {\n if (this.config.enableNamespaces) {\n return `${namespace}::${name}@${version}`;\n }\n return `${name}@${version}`;\n }\n\n /**\n * Finds the latest version of a component\n * @param name - Component name\n * @param namespace - Component namespace\n * @returns Registry key of latest version or undefined\n */\n private findLatestVersion(name: string, namespace: string): string | undefined {\n let latestKey: string | undefined;\n let latestDate: Date | undefined;\n\n for (const [key, entry] of this.registry) {\n if (entry.metadata.name === name && \n entry.metadata.namespace === namespace) {\n if (!latestDate || entry.metadata.registeredAt > latestDate) {\n latestDate = entry.metadata.registeredAt;\n latestKey = key;\n }\n }\n }\n\n return latestKey;\n }\n\n /**\n * Evicts the least recently used component\n */\n private evictLRU(): void {\n let lruKey: string | undefined;\n let lruTime: Date | undefined;\n\n for (const [key, entry] of this.registry) {\n // Skip components with active references\n if (entry.refCount > 0) continue;\n\n if (!lruTime || entry.lastAccessed < lruTime) {\n lruTime = entry.lastAccessed;\n lruKey = key;\n }\n }\n\n if (lruKey) {\n this.registry.delete(lruKey);\n }\n }\n\n /**\n * Starts the automatic cleanup timer\n */\n private startCleanupTimer(): void {\n this.cleanupTimer = resourceManager.setInterval(\n this.registryId,\n () => {\n this.cleanup();\n },\n this.config.cleanupInterval,\n { purpose: 'component-registry-cleanup' }\n );\n }\n\n /**\n * Stops the automatic cleanup timer\n */\n private stopCleanupTimer(): void {\n if (this.cleanupTimer) {\n resourceManager.clearInterval(this.registryId, this.cleanupTimer as number);\n this.cleanupTimer = undefined;\n }\n }\n}"]}
|
|
@@ -13,7 +13,8 @@ export declare class ComponentResolver {
|
|
|
13
13
|
private compiler;
|
|
14
14
|
private runtimeContext;
|
|
15
15
|
private componentEngine;
|
|
16
|
-
|
|
16
|
+
private debug;
|
|
17
|
+
constructor(registry: ComponentRegistry, compiler?: ComponentCompiler, runtimeContext?: RuntimeContext, debug?: boolean);
|
|
17
18
|
resolveComponents(spec: ComponentSpec, namespace?: string, contextUser?: UserInfo): Promise<ResolvedComponents>;
|
|
18
19
|
private resolveComponentHierarchy;
|
|
19
20
|
cleanup(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-resolver.d.ts","sourceRoot":"","sources":["../../src/registry/component-resolver.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAMhD,MAAM,WAAW,kBAAkB;IACjC,CAAC,aAAa,EAAE,MAAM,GAAG,GAAG,CAAC;CAC9B;AAMD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,eAAe,CAAyC;IAChE,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,eAAe,CAAoC;
|
|
1
|
+
{"version":3,"file":"component-resolver.d.ts","sourceRoot":"","sources":["../../src/registry/component-resolver.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAMhD,MAAM,WAAW,kBAAkB;IACjC,CAAC,aAAa,EAAE,MAAM,GAAG,GAAG,CAAC;CAC9B;AAMD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,eAAe,CAAyC;IAChE,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,eAAe,CAAoC;IAC3D,OAAO,CAAC,KAAK,CAAkB;gBAU7B,QAAQ,EAAE,iBAAiB,EAC3B,QAAQ,CAAC,EAAE,iBAAiB,EAC5B,cAAc,CAAC,EAAE,cAAc,EAC/B,KAAK,GAAE,OAAe;IAoBlB,iBAAiB,CACrB,IAAI,EAAE,aAAa,EACnB,SAAS,GAAE,MAAiB,EAC5B,WAAW,CAAC,EAAE,QAAQ,GACrB,OAAO,CAAC,kBAAkB,CAAC;YA0ChB,yBAAyB;IAuFvC,OAAO,IAAI,IAAI;IAiBf,oBAAoB,CAAC,IAAI,EAAE,aAAa,EAAE,SAAS,GAAE,MAAiB,GAAG,MAAM,EAAE;IAgBjF,OAAO,CAAC,iBAAiB;IA0BzB,kBAAkB,CAAC,IAAI,EAAE,aAAa,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAe9D,OAAO,CAAC,oBAAoB;IAwB5B,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,EAAE;IAuB3C,OAAO,CAAC,kBAAkB;IAwB1B,cAAc,CAAC,IAAI,EAAE,aAAa,EAAE,SAAS,GAAE,MAAiB,GAAG,KAAK,CAAC;QACvE,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,GAAG,CAAC;KAChB,CAAC;IAmBF,qBAAqB,CAAC,IAAI,EAAE,aAAa,GAAG,aAAa,EAAE;IAe3D,OAAO,CAAC,qBAAqB;CAe9B"}
|
|
@@ -4,17 +4,19 @@ exports.ComponentResolver = void 0;
|
|
|
4
4
|
const component_registry_service_1 = require("./component-registry-service");
|
|
5
5
|
const core_entities_1 = require("@memberjunction/core-entities");
|
|
6
6
|
class ComponentResolver {
|
|
7
|
-
constructor(registry, compiler, runtimeContext) {
|
|
7
|
+
constructor(registry, compiler, runtimeContext, debug = false) {
|
|
8
8
|
this.registryService = null;
|
|
9
9
|
this.compiler = null;
|
|
10
10
|
this.runtimeContext = null;
|
|
11
11
|
this.componentEngine = core_entities_1.ComponentMetadataEngine.Instance;
|
|
12
|
+
this.debug = false;
|
|
12
13
|
this.registry = registry;
|
|
13
14
|
this.resolverInstanceId = `resolver-${Date.now()}-${Math.random()}`;
|
|
15
|
+
this.debug = debug;
|
|
14
16
|
if (compiler && runtimeContext) {
|
|
15
17
|
this.compiler = compiler;
|
|
16
18
|
this.runtimeContext = runtimeContext;
|
|
17
|
-
this.registryService = component_registry_service_1.ComponentRegistryService.getInstance(compiler, runtimeContext);
|
|
19
|
+
this.registryService = component_registry_service_1.ComponentRegistryService.getInstance(compiler, runtimeContext, debug);
|
|
18
20
|
}
|
|
19
21
|
}
|
|
20
22
|
async resolveComponents(spec, namespace = 'Global', contextUser) {
|
|
@@ -23,12 +25,29 @@ class ComponentResolver {
|
|
|
23
25
|
await this.componentEngine.Config(false, contextUser);
|
|
24
26
|
}
|
|
25
27
|
await this.resolveComponentHierarchy(spec, resolved, namespace, new Set(), contextUser);
|
|
26
|
-
|
|
28
|
+
const unwrapped = {};
|
|
29
|
+
for (const [name, value] of Object.entries(resolved)) {
|
|
30
|
+
if (value && typeof value === 'object' && 'component' in value) {
|
|
31
|
+
if (typeof value.component === 'function') {
|
|
32
|
+
unwrapped[name] = value.component;
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
console.error(`Component ${name} has invalid component property:`, typeof value.component, value);
|
|
36
|
+
unwrapped[name] = value;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
unwrapped[name] = value;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return unwrapped;
|
|
27
44
|
}
|
|
28
45
|
async resolveComponentHierarchy(spec, resolved, namespace, visited = new Set(), contextUser) {
|
|
29
46
|
const componentId = `${spec.namespace || namespace}/${spec.name}@${spec.version || 'latest'}`;
|
|
30
47
|
if (visited.has(componentId)) {
|
|
31
|
-
|
|
48
|
+
if (this.debug) {
|
|
49
|
+
console.warn(`Circular dependency detected for component: ${componentId}`);
|
|
50
|
+
}
|
|
32
51
|
return;
|
|
33
52
|
}
|
|
34
53
|
visited.add(componentId);
|
|
@@ -39,14 +58,20 @@ class ComponentResolver {
|
|
|
39
58
|
if (component) {
|
|
40
59
|
const compiledComponent = await this.registryService.getCompiledComponent(component.ID, this.resolverInstanceId, contextUser);
|
|
41
60
|
resolved[spec.name] = compiledComponent;
|
|
42
|
-
|
|
61
|
+
if (this.debug) {
|
|
62
|
+
console.log(`📦 Resolved registry component: ${spec.name} from ${componentId}`);
|
|
63
|
+
}
|
|
43
64
|
}
|
|
44
65
|
else {
|
|
45
|
-
|
|
66
|
+
if (this.debug) {
|
|
67
|
+
console.warn(`Registry component not found in database: ${spec.name}`);
|
|
68
|
+
}
|
|
46
69
|
}
|
|
47
70
|
}
|
|
48
71
|
catch (error) {
|
|
49
|
-
|
|
72
|
+
if (this.debug) {
|
|
73
|
+
console.error(`Failed to load registry component ${spec.name}:`, error);
|
|
74
|
+
}
|
|
50
75
|
}
|
|
51
76
|
}
|
|
52
77
|
else {
|
|
@@ -54,16 +79,21 @@ class ComponentResolver {
|
|
|
54
79
|
const component = this.registry.get(spec.name, componentNamespace);
|
|
55
80
|
if (component) {
|
|
56
81
|
resolved[spec.name] = component;
|
|
57
|
-
|
|
82
|
+
if (this.debug) {
|
|
83
|
+
console.log(`📄 Resolved embedded component: ${spec.name} from namespace ${componentNamespace}, type:`, typeof component);
|
|
84
|
+
}
|
|
58
85
|
}
|
|
59
86
|
else {
|
|
60
87
|
const fallbackComponent = this.registry.get(spec.name, namespace);
|
|
61
88
|
if (fallbackComponent) {
|
|
62
89
|
resolved[spec.name] = fallbackComponent;
|
|
63
|
-
|
|
90
|
+
if (this.debug) {
|
|
91
|
+
console.log(`📄 Resolved embedded component: ${spec.name} from fallback namespace ${namespace}, type:`, typeof fallbackComponent);
|
|
92
|
+
}
|
|
64
93
|
}
|
|
65
94
|
else {
|
|
66
95
|
console.warn(`⚠️ Could not resolve embedded component: ${spec.name} in namespace ${componentNamespace} or ${namespace}`);
|
|
96
|
+
resolved[spec.name] = undefined;
|
|
67
97
|
}
|
|
68
98
|
}
|
|
69
99
|
}
|
|
@@ -74,7 +104,9 @@ class ComponentResolver {
|
|
|
74
104
|
}
|
|
75
105
|
cleanup() {
|
|
76
106
|
if (this.registryService) {
|
|
77
|
-
|
|
107
|
+
if (this.debug) {
|
|
108
|
+
console.log(`Cleaning up resolver: ${this.resolverInstanceId}`);
|
|
109
|
+
}
|
|
78
110
|
}
|
|
79
111
|
}
|
|
80
112
|
validateDependencies(spec, namespace = 'Global') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-resolver.js","sourceRoot":"","sources":["../../src/registry/component-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Component dependency resolver for managing component relationships.\n * Handles resolution of child components and dependency graphs.\n * @module @memberjunction/react-runtime/registry\n */\n\nimport { ComponentRegistry } from './component-registry';\nimport { ComponentRegistryService } from './component-registry-service';\nimport { ComponentSpec } from '@memberjunction/interactive-component-types';\nimport { ComponentCompiler } from '../compiler';\nimport { RuntimeContext } from '../types';\nimport { UserInfo } from '@memberjunction/core';\nimport { ComponentMetadataEngine } from '@memberjunction/core-entities';\n\n/**\n * Resolved component map for passing to React components\n */\nexport interface ResolvedComponents {\n [componentName: string]: any;\n}\n\n/**\n * Component dependency resolver.\n * Resolves component hierarchies and manages dependencies between components.\n */\nexport class ComponentResolver {\n private registry: ComponentRegistry;\n private registryService: ComponentRegistryService | null = null;\n private resolverInstanceId: string;\n private compiler: ComponentCompiler | null = null;\n private runtimeContext: RuntimeContext | null = null;\n private componentEngine = ComponentMetadataEngine.Instance;\n\n /**\n * Creates a new ComponentResolver instance\n * @param registry - Component registry to use for resolution\n * @param compiler - Optional compiler for registry-based components\n * @param runtimeContext - Optional runtime context for registry-based components\n */\n constructor(\n registry: ComponentRegistry,\n compiler?: ComponentCompiler,\n runtimeContext?: RuntimeContext\n ) {\n this.registry = registry;\n this.resolverInstanceId = `resolver-${Date.now()}-${Math.random()}`;\n \n if (compiler && runtimeContext) {\n this.compiler = compiler;\n this.runtimeContext = runtimeContext;\n this.registryService = ComponentRegistryService.getInstance(compiler, runtimeContext);\n }\n }\n\n /**\n * Resolves all components for a given component specification\n * @param spec - Root component specification\n * @param namespace - Namespace for component resolution\n * @param contextUser - Optional user context for database operations\n * @returns Map of component names to resolved components\n */\n async resolveComponents(\n spec: ComponentSpec, \n namespace: string = 'Global',\n contextUser?: UserInfo\n ): Promise<ResolvedComponents> {\n const resolved: ResolvedComponents = {};\n \n // Initialize component engine if we have registry service\n if (this.registryService) {\n await this.componentEngine.Config(false, contextUser);\n }\n \n // Resolve the component hierarchy\n await this.resolveComponentHierarchy(spec, resolved, namespace, new Set(), contextUser);\n \n return resolved;\n }\n\n /**\n * Recursively resolves a component hierarchy\n * @param spec - Component specification\n * @param resolved - Map to store resolved components\n * @param namespace - Namespace for resolution\n * @param visited - Set of visited component names to prevent cycles\n * @param contextUser - Optional user context for database operations\n */\n private async resolveComponentHierarchy(\n spec: ComponentSpec,\n resolved: ResolvedComponents,\n namespace: string,\n visited: Set<string> = new Set(),\n contextUser?: UserInfo\n ): Promise<void> {\n // Create a unique identifier for this component\n const componentId = `${spec.namespace || namespace}/${spec.name}@${spec.version || 'latest'}`;\n \n // Prevent circular dependencies\n if (visited.has(componentId)) {\n console.warn(`Circular dependency detected for component: ${componentId}`);\n return;\n }\n visited.add(componentId);\n\n // Handle based on location\n if (spec.location === 'registry' && this.registryService) {\n // Registry component - need to load from database or external source\n try {\n // First, try to find the component in the metadata engine\n const component = this.componentEngine.Components?.find(\n (c: any) => c.Name === spec.name && \n c.Namespace === (spec.namespace || namespace)\n );\n \n if (component) {\n // Get compiled component from registry service\n const compiledComponent = await this.registryService.getCompiledComponent(\n component.ID,\n this.resolverInstanceId,\n contextUser\n );\n resolved[spec.name] = compiledComponent;\n console.log(`📦 Resolved registry component: ${spec.name} from ${componentId}`);\n } else {\n console.warn(`Registry component not found in database: ${spec.name}`);\n }\n } catch (error) {\n console.error(`Failed to load registry component ${spec.name}:`, error);\n }\n } else {\n // Embedded component - get from local registry\n // Use the component's specified namespace if it has one, otherwise use parent's namespace\n const componentNamespace = spec.namespace || namespace;\n const component = this.registry.get(spec.name, componentNamespace);\n if (component) {\n resolved[spec.name] = component;\n console.log(`📄 Resolved embedded component: ${spec.name} from namespace ${componentNamespace}`);\n } else {\n // If not found with specified namespace, try the parent namespace as fallback\n const fallbackComponent = this.registry.get(spec.name, namespace);\n if (fallbackComponent) {\n resolved[spec.name] = fallbackComponent;\n console.log(`📄 Resolved embedded component: ${spec.name} from fallback namespace ${namespace}`);\n } else {\n console.warn(`⚠️ Could not resolve embedded component: ${spec.name} in namespace ${componentNamespace} or ${namespace}`);\n }\n }\n }\n\n // Process child components recursively\n const children = spec.dependencies || [];\n for (const child of children) {\n await this.resolveComponentHierarchy(child, resolved, namespace, visited, contextUser);\n }\n }\n\n /**\n * Cleanup resolver resources\n */\n cleanup(): void {\n // Remove our references when resolver is destroyed\n if (this.registryService) {\n // This would allow the registry service to clean up unused components\n // Implementation would track which components this resolver referenced\n console.log(`Cleaning up resolver: ${this.resolverInstanceId}`);\n }\n }\n\n /**\n * Validates that all required components are available\n * @param spec - Component specification to validate\n * @param namespace - Namespace for validation\n * @returns Array of missing component names\n */\n validateDependencies(spec: ComponentSpec, namespace: string = 'Global'): string[] {\n const missing: string[] = [];\n const checked = new Set<string>();\n \n this.checkDependencies(spec, namespace, missing, checked);\n \n return missing;\n }\n\n /**\n * Recursively checks for missing dependencies\n * @param spec - Component specification\n * @param namespace - Namespace for checking\n * @param missing - Array to collect missing components\n * @param checked - Set of already checked components\n */\n private checkDependencies(\n spec: ComponentSpec,\n namespace: string,\n missing: string[],\n checked: Set<string>\n ): void {\n if (checked.has(spec.name)) return;\n checked.add(spec.name);\n\n // Check if component exists in registry\n if (!this.registry.has(spec.name, namespace)) {\n missing.push(spec.name);\n }\n\n // Check children\n const children = spec.dependencies || [];\n for (const child of children) {\n this.checkDependencies(child, namespace, missing, checked);\n }\n }\n\n /**\n * Gets the dependency graph for a component specification\n * @param spec - Component specification\n * @returns Dependency graph as adjacency list\n */\n getDependencyGraph(spec: ComponentSpec): Map<string, string[]> {\n const graph = new Map<string, string[]>();\n const visited = new Set<string>();\n \n this.buildDependencyGraph(spec, graph, visited);\n \n return graph;\n }\n\n /**\n * Recursively builds the dependency graph\n * @param spec - Component specification\n * @param graph - Graph to build\n * @param visited - Set of visited components\n */\n private buildDependencyGraph(\n spec: ComponentSpec,\n graph: Map<string, string[]>,\n visited: Set<string>\n ): void {\n if (visited.has(spec.name)) return;\n visited.add(spec.name);\n\n const children = spec.dependencies || [];\n const dependencies = children.map(child => child.name);\n \n graph.set(spec.name, dependencies);\n\n // Recursively process children\n for (const child of children) {\n this.buildDependencyGraph(child, graph, visited);\n }\n }\n\n /**\n * Performs topological sort on component dependencies\n * @param spec - Root component specification\n * @returns Array of component names in dependency order\n */\n getLoadOrder(spec: ComponentSpec): string[] {\n const graph = this.getDependencyGraph(spec);\n const visited = new Set<string>();\n const stack: string[] = [];\n\n // Perform DFS on all nodes\n for (const node of graph.keys()) {\n if (!visited.has(node)) {\n this.topologicalSortDFS(node, graph, visited, stack);\n }\n }\n\n // Reverse to get correct load order\n return stack.reverse();\n }\n\n /**\n * DFS helper for topological sort\n * @param node - Current node\n * @param graph - Dependency graph\n * @param visited - Set of visited nodes\n * @param stack - Result stack\n */\n private topologicalSortDFS(\n node: string,\n graph: Map<string, string[]>,\n visited: Set<string>,\n stack: string[]\n ): void {\n visited.add(node);\n\n const dependencies = graph.get(node) || [];\n for (const dep of dependencies) {\n if (!visited.has(dep)) {\n this.topologicalSortDFS(dep, graph, visited, stack);\n }\n }\n\n stack.push(node);\n }\n\n /**\n * Resolves components in the correct dependency order\n * @param spec - Root component specification\n * @param namespace - Namespace for resolution\n * @returns Ordered array of resolved components\n */\n resolveInOrder(spec: ComponentSpec, namespace: string = 'Global'): Array<{\n name: string;\n component: any;\n }> {\n const loadOrder = this.getLoadOrder(spec);\n const resolved: Array<{ name: string; component: any }> = [];\n\n for (const name of loadOrder) {\n const component = this.registry.get(name, namespace);\n if (component) {\n resolved.push({ name, component });\n }\n }\n\n return resolved;\n }\n\n /**\n * Creates a flattened list of all component specifications\n * @param spec - Root component specification\n * @returns Array of all component specs in the hierarchy\n */\n flattenComponentSpecs(spec: ComponentSpec): ComponentSpec[] {\n const flattened: ComponentSpec[] = [];\n const visited = new Set<string>();\n\n this.collectComponentSpecs(spec, flattened, visited);\n\n return flattened;\n }\n\n /**\n * Recursively collects component specifications\n * @param spec - Current component specification\n * @param collected - Array to collect specs\n * @param visited - Set of visited component names\n */\n private collectComponentSpecs(\n spec: ComponentSpec,\n collected: ComponentSpec[],\n visited: Set<string>\n ): void {\n if (visited.has(spec.name)) return;\n visited.add(spec.name);\n\n collected.push(spec);\n\n const children = spec.dependencies || [];\n for (const child of children) {\n this.collectComponentSpecs(child, collected, visited);\n }\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"component-resolver.js","sourceRoot":"","sources":["../../src/registry/component-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Component dependency resolver for managing component relationships.\n * Handles resolution of child components and dependency graphs.\n * @module @memberjunction/react-runtime/registry\n */\n\nimport { ComponentRegistry } from './component-registry';\nimport { ComponentRegistryService } from './component-registry-service';\nimport { ComponentSpec } from '@memberjunction/interactive-component-types';\nimport { ComponentCompiler } from '../compiler';\nimport { RuntimeContext } from '../types';\nimport { UserInfo } from '@memberjunction/core';\nimport { ComponentMetadataEngine } from '@memberjunction/core-entities';\n\n/**\n * Resolved component map for passing to React components\n */\nexport interface ResolvedComponents {\n [componentName: string]: any;\n}\n\n/**\n * Component dependency resolver.\n * Resolves component hierarchies and manages dependencies between components.\n */\nexport class ComponentResolver {\n private registry: ComponentRegistry;\n private registryService: ComponentRegistryService | null = null;\n private resolverInstanceId: string;\n private compiler: ComponentCompiler | null = null;\n private runtimeContext: RuntimeContext | null = null;\n private componentEngine = ComponentMetadataEngine.Instance;\n private debug: boolean = false;\n\n /**\n * Creates a new ComponentResolver instance\n * @param registry - Component registry to use for resolution\n * @param compiler - Optional compiler for registry-based components\n * @param runtimeContext - Optional runtime context for registry-based components\n * @param debug - Enable debug logging (defaults to false)\n */\n constructor(\n registry: ComponentRegistry,\n compiler?: ComponentCompiler,\n runtimeContext?: RuntimeContext,\n debug: boolean = false\n ) {\n this.registry = registry;\n this.resolverInstanceId = `resolver-${Date.now()}-${Math.random()}`;\n this.debug = debug;\n \n if (compiler && runtimeContext) {\n this.compiler = compiler;\n this.runtimeContext = runtimeContext;\n this.registryService = ComponentRegistryService.getInstance(compiler, runtimeContext, debug);\n }\n }\n\n /**\n * Resolves all components for a given component specification\n * @param spec - Root component specification\n * @param namespace - Namespace for component resolution\n * @param contextUser - Optional user context for database operations\n * @returns Map of component names to resolved components\n */\n async resolveComponents(\n spec: ComponentSpec, \n namespace: string = 'Global',\n contextUser?: UserInfo\n ): Promise<ResolvedComponents> {\n const resolved: ResolvedComponents = {};\n \n // Initialize component engine if we have registry service\n if (this.registryService) {\n await this.componentEngine.Config(false, contextUser);\n }\n \n // Resolve the component hierarchy\n await this.resolveComponentHierarchy(spec, resolved, namespace, new Set(), contextUser);\n \n // Unwrap component wrappers before returning\n // Components from the registry come as objects with component/print/refresh properties\n // We need to extract just the component function for use in child components\n const unwrapped: ResolvedComponents = {};\n for (const [name, value] of Object.entries(resolved)) {\n if (value && typeof value === 'object' && 'component' in value) {\n if (typeof value.component === 'function') {\n // This is a wrapped component - extract the actual React component function\n unwrapped[name] = value.component;\n } else {\n // ComponentObject has a component property but it's not a function\n console.error(`Component ${name} has invalid component property:`, typeof value.component, value);\n unwrapped[name] = value; // Pass through the problematic value so we can see the error\n }\n } else {\n // This is already a plain component function or something else\n unwrapped[name] = value;\n }\n }\n \n return unwrapped;\n }\n\n /**\n * Recursively resolves a component hierarchy\n * @param spec - Component specification\n * @param resolved - Map to store resolved components\n * @param namespace - Namespace for resolution\n * @param visited - Set of visited component names to prevent cycles\n * @param contextUser - Optional user context for database operations\n */\n private async resolveComponentHierarchy(\n spec: ComponentSpec,\n resolved: ResolvedComponents,\n namespace: string,\n visited: Set<string> = new Set(),\n contextUser?: UserInfo\n ): Promise<void> {\n // Create a unique identifier for this component\n const componentId = `${spec.namespace || namespace}/${spec.name}@${spec.version || 'latest'}`;\n \n // Prevent circular dependencies\n if (visited.has(componentId)) {\n if (this.debug) {\n console.warn(`Circular dependency detected for component: ${componentId}`);\n }\n return;\n }\n visited.add(componentId);\n\n // Handle based on location\n if (spec.location === 'registry' && this.registryService) {\n // Registry component - need to load from database or external source\n try {\n // First, try to find the component in the metadata engine\n const component = this.componentEngine.Components?.find(\n (c: any) => c.Name === spec.name && \n c.Namespace === (spec.namespace || namespace)\n );\n \n if (component) {\n // Get compiled component from registry service\n const compiledComponent = await this.registryService.getCompiledComponent(\n component.ID,\n this.resolverInstanceId,\n contextUser\n );\n resolved[spec.name] = compiledComponent;\n if (this.debug) {\n console.log(`📦 Resolved registry component: ${spec.name} from ${componentId}`);\n }\n } else {\n if (this.debug) {\n console.warn(`Registry component not found in database: ${spec.name}`);\n }\n }\n } catch (error) {\n if (this.debug) {\n console.error(`Failed to load registry component ${spec.name}:`, error);\n }\n }\n } else {\n // Embedded component - get from local registry\n // Use the component's specified namespace if it has one, otherwise use parent's namespace\n const componentNamespace = spec.namespace || namespace;\n const component = this.registry.get(spec.name, componentNamespace);\n if (component) {\n resolved[spec.name] = component;\n if (this.debug) {\n console.log(`📄 Resolved embedded component: ${spec.name} from namespace ${componentNamespace}, type:`, typeof component);\n }\n } else {\n // If not found with specified namespace, try the parent namespace as fallback\n const fallbackComponent = this.registry.get(spec.name, namespace);\n if (fallbackComponent) {\n resolved[spec.name] = fallbackComponent;\n if (this.debug) {\n console.log(`📄 Resolved embedded component: ${spec.name} from fallback namespace ${namespace}, type:`, typeof fallbackComponent);\n }\n } else {\n // Component not found - this might cause issues later\n console.warn(`⚠️ Could not resolve embedded component: ${spec.name} in namespace ${componentNamespace} or ${namespace}`);\n // Store undefined explicitly so we know it failed to resolve\n resolved[spec.name] = undefined;\n }\n }\n }\n\n // Process child components recursively\n const children = spec.dependencies || [];\n for (const child of children) {\n await this.resolveComponentHierarchy(child, resolved, namespace, visited, contextUser);\n }\n }\n\n /**\n * Cleanup resolver resources\n */\n cleanup(): void {\n // Remove our references when resolver is destroyed\n if (this.registryService) {\n // This would allow the registry service to clean up unused components\n // Implementation would track which components this resolver referenced\n if (this.debug) {\n console.log(`Cleaning up resolver: ${this.resolverInstanceId}`);\n }\n }\n }\n\n /**\n * Validates that all required components are available\n * @param spec - Component specification to validate\n * @param namespace - Namespace for validation\n * @returns Array of missing component names\n */\n validateDependencies(spec: ComponentSpec, namespace: string = 'Global'): string[] {\n const missing: string[] = [];\n const checked = new Set<string>();\n \n this.checkDependencies(spec, namespace, missing, checked);\n \n return missing;\n }\n\n /**\n * Recursively checks for missing dependencies\n * @param spec - Component specification\n * @param namespace - Namespace for checking\n * @param missing - Array to collect missing components\n * @param checked - Set of already checked components\n */\n private checkDependencies(\n spec: ComponentSpec,\n namespace: string,\n missing: string[],\n checked: Set<string>\n ): void {\n if (checked.has(spec.name)) return;\n checked.add(spec.name);\n\n // Check if component exists in registry\n if (!this.registry.has(spec.name, namespace)) {\n missing.push(spec.name);\n }\n\n // Check children\n const children = spec.dependencies || [];\n for (const child of children) {\n this.checkDependencies(child, namespace, missing, checked);\n }\n }\n\n /**\n * Gets the dependency graph for a component specification\n * @param spec - Component specification\n * @returns Dependency graph as adjacency list\n */\n getDependencyGraph(spec: ComponentSpec): Map<string, string[]> {\n const graph = new Map<string, string[]>();\n const visited = new Set<string>();\n \n this.buildDependencyGraph(spec, graph, visited);\n \n return graph;\n }\n\n /**\n * Recursively builds the dependency graph\n * @param spec - Component specification\n * @param graph - Graph to build\n * @param visited - Set of visited components\n */\n private buildDependencyGraph(\n spec: ComponentSpec,\n graph: Map<string, string[]>,\n visited: Set<string>\n ): void {\n if (visited.has(spec.name)) return;\n visited.add(spec.name);\n\n const children = spec.dependencies || [];\n const dependencies = children.map(child => child.name);\n \n graph.set(spec.name, dependencies);\n\n // Recursively process children\n for (const child of children) {\n this.buildDependencyGraph(child, graph, visited);\n }\n }\n\n /**\n * Performs topological sort on component dependencies\n * @param spec - Root component specification\n * @returns Array of component names in dependency order\n */\n getLoadOrder(spec: ComponentSpec): string[] {\n const graph = this.getDependencyGraph(spec);\n const visited = new Set<string>();\n const stack: string[] = [];\n\n // Perform DFS on all nodes\n for (const node of graph.keys()) {\n if (!visited.has(node)) {\n this.topologicalSortDFS(node, graph, visited, stack);\n }\n }\n\n // Reverse to get correct load order\n return stack.reverse();\n }\n\n /**\n * DFS helper for topological sort\n * @param node - Current node\n * @param graph - Dependency graph\n * @param visited - Set of visited nodes\n * @param stack - Result stack\n */\n private topologicalSortDFS(\n node: string,\n graph: Map<string, string[]>,\n visited: Set<string>,\n stack: string[]\n ): void {\n visited.add(node);\n\n const dependencies = graph.get(node) || [];\n for (const dep of dependencies) {\n if (!visited.has(dep)) {\n this.topologicalSortDFS(dep, graph, visited, stack);\n }\n }\n\n stack.push(node);\n }\n\n /**\n * Resolves components in the correct dependency order\n * @param spec - Root component specification\n * @param namespace - Namespace for resolution\n * @returns Ordered array of resolved components\n */\n resolveInOrder(spec: ComponentSpec, namespace: string = 'Global'): Array<{\n name: string;\n component: any;\n }> {\n const loadOrder = this.getLoadOrder(spec);\n const resolved: Array<{ name: string; component: any }> = [];\n\n for (const name of loadOrder) {\n const component = this.registry.get(name, namespace);\n if (component) {\n resolved.push({ name, component });\n }\n }\n\n return resolved;\n }\n\n /**\n * Creates a flattened list of all component specifications\n * @param spec - Root component specification\n * @returns Array of all component specs in the hierarchy\n */\n flattenComponentSpecs(spec: ComponentSpec): ComponentSpec[] {\n const flattened: ComponentSpec[] = [];\n const visited = new Set<string>();\n\n this.collectComponentSpecs(spec, flattened, visited);\n\n return flattened;\n }\n\n /**\n * Recursively collects component specifications\n * @param spec - Current component specification\n * @param collected - Array to collect specs\n * @param visited - Set of visited component names\n */\n private collectComponentSpecs(\n spec: ComponentSpec,\n collected: ComponentSpec[],\n visited: Set<string>\n ): void {\n if (visited.has(spec.name)) return;\n visited.add(spec.name);\n\n collected.push(spec);\n\n const children = spec.dependencies || [];\n for (const child of children) {\n this.collectComponentSpecs(child, collected, visited);\n }\n }\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-hierarchy.d.ts","sourceRoot":"","sources":["../../src/runtime/component-hierarchy.ts"],"names":[],"mappings":"AAMA,OAAO,EAGL,cAAc,EACf,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAE7F,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAKvE,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,MAAM,EAAE,0BAA0B,EAAE,CAAC;IACrC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAKD,MAAM,WAAW,0BAA0B;IACzC,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,aAAa,GAAG,cAAc,GAAG,YAAY,CAAC;CACtD;AAKD,MAAM,WAAW,4BAA4B;IAE3C,MAAM,CAAC,EAAE,eAAe,CAAC;IAEzB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,aAAa,CAAC,EAAE,OAAO,CAAC;IAIxB,YAAY,EAAE,sBAAsB,EAAE,CAAC;CACxC;AAKD,qBAAa,2BAA2B;IAEpC,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,cAAc;gBAFd,QAAQ,EAAE,iBAAiB,EAC3B,QAAQ,EAAE,iBAAiB,EAC3B,cAAc,EAAE,cAAc;IASlC,iBAAiB,CACrB,QAAQ,EAAE,aAAa,EACvB,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,2BAA2B,CAAC;IA6DjC,uBAAuB,CAC3B,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE;QACP,MAAM,CAAC,EAAE,eAAe,CAAC;QACzB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,YAAY,EAAE,sBAAsB,EAAE,CAAC;KACxC,GACA,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,0BAA0B,CAAA;KAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"component-hierarchy.d.ts","sourceRoot":"","sources":["../../src/runtime/component-hierarchy.ts"],"names":[],"mappings":"AAMA,OAAO,EAGL,cAAc,EACf,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAE7F,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAKvE,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,MAAM,EAAE,0BAA0B,EAAE,CAAC;IACrC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAKD,MAAM,WAAW,0BAA0B;IACzC,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,aAAa,GAAG,cAAc,GAAG,YAAY,CAAC;CACtD;AAKD,MAAM,WAAW,4BAA4B;IAE3C,MAAM,CAAC,EAAE,eAAe,CAAC;IAEzB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,aAAa,CAAC,EAAE,OAAO,CAAC;IAIxB,YAAY,EAAE,sBAAsB,EAAE,CAAC;CACxC;AAKD,qBAAa,2BAA2B;IAEpC,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,cAAc;gBAFd,QAAQ,EAAE,iBAAiB,EAC3B,QAAQ,EAAE,iBAAiB,EAC3B,cAAc,EAAE,cAAc;IASlC,iBAAiB,CACrB,QAAQ,EAAE,aAAa,EACvB,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,2BAA2B,CAAC;IA6DjC,uBAAuB,CAC3B,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE;QACP,MAAM,CAAC,EAAE,eAAe,CAAC;QACzB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,YAAY,EAAE,sBAAsB,EAAE,CAAC;KACxC,GACA,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,0BAA0B,CAAA;KAAE,CAAC;YA8FtD,uBAAuB;CAyCtC;AAWD,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,aAAa,EACvB,QAAQ,EAAE,iBAAiB,EAC3B,QAAQ,EAAE,iBAAiB,EAC3B,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,2BAA2B,CAAC,CAGtC;AAOD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,EAAE,CA2BnE;AAOD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,aAAa,GAAG,aAAa,EAAE,CASlF;AAQD,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,aAAa,EACvB,YAAY,GAAE,OAAe,GAC5B,MAAM,CAaR"}
|
|
@@ -82,8 +82,14 @@ class ComponentHierarchyRegistrar {
|
|
|
82
82
|
}
|
|
83
83
|
};
|
|
84
84
|
}
|
|
85
|
-
const
|
|
86
|
-
|
|
85
|
+
const componentObject = compilationResult.component.factory(this.runtimeContext, styles);
|
|
86
|
+
console.log(`📦 Registering ComponentObject for ${spec.name}:`, {
|
|
87
|
+
hasComponent: 'component' in componentObject,
|
|
88
|
+
componentType: typeof componentObject.component,
|
|
89
|
+
hasPrint: 'print' in componentObject,
|
|
90
|
+
hasRefresh: 'refresh' in componentObject
|
|
91
|
+
});
|
|
92
|
+
this.registry.register(spec.name, componentObject, spec.namespace || namespace, version);
|
|
87
93
|
return { success: true };
|
|
88
94
|
}
|
|
89
95
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-hierarchy.js","sourceRoot":"","sources":["../../src/runtime/component-hierarchy.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Component hierarchy registration utilities for MemberJunction React Runtime.\n * Provides functionality to register a hierarchy of components from Skip component specifications.\n * @module @memberjunction/react-runtime/hierarchy\n */\n\nimport { \n CompilationResult,\n CompileOptions,\n RuntimeContext\n} from '../types';\nimport { ComponentCompiler } from '../compiler';\nimport { ComponentRegistry } from '../registry';\n\nimport { ComponentSpec, ComponentStyles } from '@memberjunction/interactive-component-types';\nimport { UserInfo } from '@memberjunction/core';\nimport { ComponentLibraryEntity } from '@memberjunction/core-entities';\n\n/**\n * Result of a hierarchy registration operation\n */\nexport interface HierarchyRegistrationResult {\n success: boolean;\n registeredComponents: string[];\n errors: ComponentRegistrationError[];\n warnings: string[];\n}\n\n/**\n * Error information for component registration\n */\nexport interface ComponentRegistrationError {\n componentName: string;\n error: string;\n phase: 'compilation' | 'registration' | 'validation';\n}\n\n/**\n * Options for hierarchy registration\n */\nexport interface HierarchyRegistrationOptions {\n /** Component styles to apply to all components */\n styles?: ComponentStyles;\n /** Namespace for component registration */\n namespace?: string;\n /** Version for component registration */\n version?: string;\n /** Whether to continue on errors */\n continueOnError?: boolean;\n /** Whether to override existing components */\n allowOverride?: boolean;\n /**\n * Required, metadata for all possible libraries allowed by the system\n */\n allLibraries: ComponentLibraryEntity[];\n}\n\n/**\n * Utility class for registering component hierarchies\n */\nexport class ComponentHierarchyRegistrar {\n constructor(\n private compiler: ComponentCompiler,\n private registry: ComponentRegistry,\n private runtimeContext: RuntimeContext\n ) {}\n\n /**\n * Registers a complete component hierarchy from a root specification\n * @param rootSpec - The root component specification\n * @param options - Registration options\n * @returns Registration result with details about success/failures\n */\n async registerHierarchy(\n rootSpec: ComponentSpec,\n options: HierarchyRegistrationOptions\n ): Promise<HierarchyRegistrationResult> {\n const {\n styles,\n namespace = 'Global',\n version = 'v1',\n continueOnError = true,\n allowOverride = true\n } = options;\n\n console.log('🌳 ComponentHierarchyRegistrar.registerHierarchy:', {\n rootComponent: rootSpec.name,\n hasLibraries: !!(rootSpec.libraries && rootSpec.libraries.length > 0),\n libraryCount: rootSpec.libraries?.length || 0,\n libraries: rootSpec.libraries?.map(l => l.name)\n });\n\n const registeredComponents: string[] = [];\n const errors: ComponentRegistrationError[] = [];\n const warnings: string[] = [];\n\n // Register the root component\n const rootResult = await this.registerSingleComponent(\n rootSpec,\n { styles, namespace, version, allowOverride, allLibraries: options.allLibraries }\n );\n\n if (rootResult.success) {\n registeredComponents.push(rootSpec.name);\n } else {\n errors.push(rootResult.error!);\n if (!continueOnError) {\n return { success: false, registeredComponents, errors, warnings };\n }\n }\n\n // Register child components recursively\n const childComponents = rootSpec.dependencies || [];\n if (childComponents.length > 0) {\n const childResult = await this.registerChildComponents(\n childComponents,\n { styles, namespace, version, continueOnError, allowOverride, allLibraries: options.allLibraries },\n registeredComponents,\n errors,\n warnings\n );\n }\n\n return {\n success: errors.length === 0,\n registeredComponents,\n errors,\n warnings\n };\n }\n\n /**\n * Registers a single component from a specification\n * @param spec - Component specification\n * @param options - Registration options\n * @returns Registration result for this component\n */\n async registerSingleComponent(\n spec: ComponentSpec,\n options: {\n styles?: ComponentStyles;\n namespace?: string;\n version?: string;\n allowOverride?: boolean;\n allLibraries: ComponentLibraryEntity[];\n }\n ): Promise<{ success: boolean; error?: ComponentRegistrationError }> {\n const { styles, namespace = 'Global', version = 'v1', allowOverride = true } = options;\n\n try {\n // Skip if no component code\n if (!spec.code) {\n return {\n success: true,\n error: undefined\n };\n }\n\n // Check if component already exists\n const existingComponent = this.registry.get(spec.name, namespace, version);\n if (existingComponent && !allowOverride) {\n return {\n success: false,\n error: {\n componentName: spec.name,\n error: `Component already registered in ${namespace}/${version}`,\n phase: 'registration'\n }\n };\n }\n\n // Compile the component\n const compileOptions: CompileOptions = {\n componentName: spec.name,\n componentCode: spec.code,\n styles,\n libraries: spec.libraries, // Pass along library dependencies from the spec\n dependencies: spec.dependencies, // Pass along child component dependencies\n allLibraries: options.allLibraries\n };\n\n console.log(`🔧 Compiling component ${spec.name} with libraries:`, {\n libraryCount: spec.libraries?.length || 0,\n libraries: spec.libraries?.map(l => ({ name: l.name, globalVariable: l.globalVariable }))\n });\n\n const compilationResult = await this.compiler.compile(compileOptions);\n\n if (!compilationResult.success) {\n return {\n success: false,\n error: {\n componentName: spec.name,\n error: compilationResult.error?.message || 'Unknown compilation error',\n phase: 'compilation'\n }\n };\n }\n\n // Create component factory\n const componentFactory = compilationResult.component!.component(this.runtimeContext, styles);\n\n // Register the component\n this.registry.register(\n spec.name,\n componentFactory.component,\n spec.namespace || namespace,\n version\n );\n\n return { success: true };\n\n } catch (error) {\n return {\n success: false,\n error: {\n componentName: spec.name,\n error: error instanceof Error ? error.message : String(error),\n phase: 'registration'\n }\n };\n }\n }\n\n /**\n * Recursively registers child components\n * @param children - Array of child component specifications\n * @param options - Registration options\n * @param registeredComponents - Array to track registered components\n * @param errors - Array to collect errors\n * @param warnings - Array to collect warnings\n */\n private async registerChildComponents(\n children: ComponentSpec[],\n options: HierarchyRegistrationOptions,\n registeredComponents: string[],\n errors: ComponentRegistrationError[],\n warnings: string[]\n ): Promise<void> {\n for (const child of children) {\n // Register this child\n const childResult = await this.registerSingleComponent(child, {\n styles: options.styles,\n namespace: options.namespace,\n version: options.version,\n allowOverride: options.allowOverride,\n allLibraries: options.allLibraries\n });\n\n if (childResult.success) {\n if (child.code) {\n registeredComponents.push(child.name);\n }\n } else {\n errors.push(childResult.error!);\n if (!options.continueOnError) {\n return;\n }\n }\n\n // Register nested children recursively\n const nestedChildren = child.dependencies || [];\n if (nestedChildren.length > 0) {\n await this.registerChildComponents(\n nestedChildren,\n options,\n registeredComponents,\n errors,\n warnings\n );\n }\n }\n }\n}\n\n/**\n * Convenience function to register a component hierarchy\n * @param rootSpec - The root component specification\n * @param compiler - Component compiler instance\n * @param registry - Component registry instance\n * @param runtimeContext - Runtime context with React and other libraries\n * @param options - Registration options\n * @returns Registration result\n */\nexport async function registerComponentHierarchy(\n rootSpec: ComponentSpec,\n compiler: ComponentCompiler,\n registry: ComponentRegistry,\n runtimeContext: RuntimeContext,\n options: HierarchyRegistrationOptions\n): Promise<HierarchyRegistrationResult> {\n const registrar = new ComponentHierarchyRegistrar(compiler, registry, runtimeContext);\n return registrar.registerHierarchy(rootSpec, options);\n}\n\n/**\n * Validates a component specification before registration\n * @param spec - Component specification to validate\n * @returns Array of validation errors (empty if valid)\n */\nexport function validateComponentSpec(spec: ComponentSpec): string[] {\n const errors: string[] = [];\n\n if (!spec.name) {\n errors.push('Component specification must have a name');\n }\n\n // If componentCode is provided, do basic validation\n if (spec.code) {\n if (typeof spec.code !== 'string') {\n errors.push(`Component code for ${spec.name} must be a string`);\n }\n if (spec.code.trim().length === 0) {\n errors.push(`Component code for ${spec.name} cannot be empty`);\n }\n }\n\n // Validate child components recursively\n const children = spec.dependencies || [];\n children.forEach((child, index) => {\n const childErrors = validateComponentSpec(child);\n childErrors.forEach(error => {\n errors.push(`Child ${index} (${child.name || 'unnamed'}): ${error}`);\n });\n });\n\n return errors;\n}\n\n/**\n * Flattens a component hierarchy into a list of all components\n * @param rootSpec - The root component specification\n * @returns Array of all component specifications in the hierarchy\n */\nexport function flattenComponentHierarchy(rootSpec: ComponentSpec): ComponentSpec[] {\n const components: ComponentSpec[] = [rootSpec];\n \n const children = rootSpec.dependencies || [];\n children.forEach(child => {\n components.push(...flattenComponentHierarchy(child));\n });\n\n return components;\n}\n\n/**\n * Counts the total number of components in a hierarchy\n * @param rootSpec - The root component specification\n * @param includeEmpty - Whether to include components without code\n * @returns Total component count\n */\nexport function countComponentsInHierarchy(\n rootSpec: ComponentSpec,\n includeEmpty: boolean = false\n): number {\n let count = 0;\n \n if (includeEmpty || rootSpec.code) {\n count = 1;\n }\n\n const children = rootSpec.dependencies || [];\n children.forEach(child => {\n count += countComponentsInHierarchy(child, includeEmpty);\n });\n\n return count;\n}"]}
|
|
1
|
+
{"version":3,"file":"component-hierarchy.js","sourceRoot":"","sources":["../../src/runtime/component-hierarchy.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Component hierarchy registration utilities for MemberJunction React Runtime.\n * Provides functionality to register a hierarchy of components from Skip component specifications.\n * @module @memberjunction/react-runtime/hierarchy\n */\n\nimport { \n CompilationResult,\n CompileOptions,\n RuntimeContext\n} from '../types';\nimport { ComponentCompiler } from '../compiler';\nimport { ComponentRegistry } from '../registry';\n\nimport { ComponentSpec, ComponentStyles } from '@memberjunction/interactive-component-types';\nimport { UserInfo } from '@memberjunction/core';\nimport { ComponentLibraryEntity } from '@memberjunction/core-entities';\n\n/**\n * Result of a hierarchy registration operation\n */\nexport interface HierarchyRegistrationResult {\n success: boolean;\n registeredComponents: string[];\n errors: ComponentRegistrationError[];\n warnings: string[];\n}\n\n/**\n * Error information for component registration\n */\nexport interface ComponentRegistrationError {\n componentName: string;\n error: string;\n phase: 'compilation' | 'registration' | 'validation';\n}\n\n/**\n * Options for hierarchy registration\n */\nexport interface HierarchyRegistrationOptions {\n /** Component styles to apply to all components */\n styles?: ComponentStyles;\n /** Namespace for component registration */\n namespace?: string;\n /** Version for component registration */\n version?: string;\n /** Whether to continue on errors */\n continueOnError?: boolean;\n /** Whether to override existing components */\n allowOverride?: boolean;\n /**\n * Required, metadata for all possible libraries allowed by the system\n */\n allLibraries: ComponentLibraryEntity[];\n}\n\n/**\n * Utility class for registering component hierarchies\n */\nexport class ComponentHierarchyRegistrar {\n constructor(\n private compiler: ComponentCompiler,\n private registry: ComponentRegistry,\n private runtimeContext: RuntimeContext\n ) {}\n\n /**\n * Registers a complete component hierarchy from a root specification\n * @param rootSpec - The root component specification\n * @param options - Registration options\n * @returns Registration result with details about success/failures\n */\n async registerHierarchy(\n rootSpec: ComponentSpec,\n options: HierarchyRegistrationOptions\n ): Promise<HierarchyRegistrationResult> {\n const {\n styles,\n namespace = 'Global',\n version = 'v1',\n continueOnError = true,\n allowOverride = true\n } = options;\n\n console.log('🌳 ComponentHierarchyRegistrar.registerHierarchy:', {\n rootComponent: rootSpec.name,\n hasLibraries: !!(rootSpec.libraries && rootSpec.libraries.length > 0),\n libraryCount: rootSpec.libraries?.length || 0,\n libraries: rootSpec.libraries?.map(l => l.name)\n });\n\n const registeredComponents: string[] = [];\n const errors: ComponentRegistrationError[] = [];\n const warnings: string[] = [];\n\n // Register the root component\n const rootResult = await this.registerSingleComponent(\n rootSpec,\n { styles, namespace, version, allowOverride, allLibraries: options.allLibraries }\n );\n\n if (rootResult.success) {\n registeredComponents.push(rootSpec.name);\n } else {\n errors.push(rootResult.error!);\n if (!continueOnError) {\n return { success: false, registeredComponents, errors, warnings };\n }\n }\n\n // Register child components recursively\n const childComponents = rootSpec.dependencies || [];\n if (childComponents.length > 0) {\n const childResult = await this.registerChildComponents(\n childComponents,\n { styles, namespace, version, continueOnError, allowOverride, allLibraries: options.allLibraries },\n registeredComponents,\n errors,\n warnings\n );\n }\n\n return {\n success: errors.length === 0,\n registeredComponents,\n errors,\n warnings\n };\n }\n\n /**\n * Registers a single component from a specification\n * @param spec - Component specification\n * @param options - Registration options\n * @returns Registration result for this component\n */\n async registerSingleComponent(\n spec: ComponentSpec,\n options: {\n styles?: ComponentStyles;\n namespace?: string;\n version?: string;\n allowOverride?: boolean;\n allLibraries: ComponentLibraryEntity[];\n }\n ): Promise<{ success: boolean; error?: ComponentRegistrationError }> {\n const { styles, namespace = 'Global', version = 'v1', allowOverride = true } = options;\n\n try {\n // Skip if no component code\n if (!spec.code) {\n return {\n success: true,\n error: undefined\n };\n }\n\n // Check if component already exists\n const existingComponent = this.registry.get(spec.name, namespace, version);\n if (existingComponent && !allowOverride) {\n return {\n success: false,\n error: {\n componentName: spec.name,\n error: `Component already registered in ${namespace}/${version}`,\n phase: 'registration'\n }\n };\n }\n\n // Compile the component\n const compileOptions: CompileOptions = {\n componentName: spec.name,\n componentCode: spec.code,\n styles,\n libraries: spec.libraries, // Pass along library dependencies from the spec\n dependencies: spec.dependencies, // Pass along child component dependencies\n allLibraries: options.allLibraries\n };\n\n console.log(`🔧 Compiling component ${spec.name} with libraries:`, {\n libraryCount: spec.libraries?.length || 0,\n libraries: spec.libraries?.map(l => ({ name: l.name, globalVariable: l.globalVariable }))\n });\n\n const compilationResult = await this.compiler.compile(compileOptions);\n\n if (!compilationResult.success) {\n return {\n success: false,\n error: {\n componentName: spec.name,\n error: compilationResult.error?.message || 'Unknown compilation error',\n phase: 'compilation'\n }\n };\n }\n\n // Call the factory to create the ComponentObject\n const componentObject = compilationResult.component!.factory(this.runtimeContext, styles);\n\n // Debug logging to verify ComponentObject structure\n console.log(`📦 Registering ComponentObject for ${spec.name}:`, {\n hasComponent: 'component' in componentObject,\n componentType: typeof componentObject.component,\n hasPrint: 'print' in componentObject,\n hasRefresh: 'refresh' in componentObject\n });\n\n // Register the full ComponentObject (not just the React component)\n this.registry.register(\n spec.name,\n componentObject,\n spec.namespace || namespace,\n version\n );\n\n return { success: true };\n\n } catch (error) {\n return {\n success: false,\n error: {\n componentName: spec.name,\n error: error instanceof Error ? error.message : String(error),\n phase: 'registration'\n }\n };\n }\n }\n\n /**\n * Recursively registers child components\n * @param children - Array of child component specifications\n * @param options - Registration options\n * @param registeredComponents - Array to track registered components\n * @param errors - Array to collect errors\n * @param warnings - Array to collect warnings\n */\n private async registerChildComponents(\n children: ComponentSpec[],\n options: HierarchyRegistrationOptions,\n registeredComponents: string[],\n errors: ComponentRegistrationError[],\n warnings: string[]\n ): Promise<void> {\n for (const child of children) {\n // Register this child\n const childResult = await this.registerSingleComponent(child, {\n styles: options.styles,\n namespace: options.namespace,\n version: options.version,\n allowOverride: options.allowOverride,\n allLibraries: options.allLibraries\n });\n\n if (childResult.success) {\n if (child.code) {\n registeredComponents.push(child.name);\n }\n } else {\n errors.push(childResult.error!);\n if (!options.continueOnError) {\n return;\n }\n }\n\n // Register nested children recursively\n const nestedChildren = child.dependencies || [];\n if (nestedChildren.length > 0) {\n await this.registerChildComponents(\n nestedChildren,\n options,\n registeredComponents,\n errors,\n warnings\n );\n }\n }\n }\n}\n\n/**\n * Convenience function to register a component hierarchy\n * @param rootSpec - The root component specification\n * @param compiler - Component compiler instance\n * @param registry - Component registry instance\n * @param runtimeContext - Runtime context with React and other libraries\n * @param options - Registration options\n * @returns Registration result\n */\nexport async function registerComponentHierarchy(\n rootSpec: ComponentSpec,\n compiler: ComponentCompiler,\n registry: ComponentRegistry,\n runtimeContext: RuntimeContext,\n options: HierarchyRegistrationOptions\n): Promise<HierarchyRegistrationResult> {\n const registrar = new ComponentHierarchyRegistrar(compiler, registry, runtimeContext);\n return registrar.registerHierarchy(rootSpec, options);\n}\n\n/**\n * Validates a component specification before registration\n * @param spec - Component specification to validate\n * @returns Array of validation errors (empty if valid)\n */\nexport function validateComponentSpec(spec: ComponentSpec): string[] {\n const errors: string[] = [];\n\n if (!spec.name) {\n errors.push('Component specification must have a name');\n }\n\n // If componentCode is provided, do basic validation\n if (spec.code) {\n if (typeof spec.code !== 'string') {\n errors.push(`Component code for ${spec.name} must be a string`);\n }\n if (spec.code.trim().length === 0) {\n errors.push(`Component code for ${spec.name} cannot be empty`);\n }\n }\n\n // Validate child components recursively\n const children = spec.dependencies || [];\n children.forEach((child, index) => {\n const childErrors = validateComponentSpec(child);\n childErrors.forEach(error => {\n errors.push(`Child ${index} (${child.name || 'unnamed'}): ${error}`);\n });\n });\n\n return errors;\n}\n\n/**\n * Flattens a component hierarchy into a list of all components\n * @param rootSpec - The root component specification\n * @returns Array of all component specifications in the hierarchy\n */\nexport function flattenComponentHierarchy(rootSpec: ComponentSpec): ComponentSpec[] {\n const components: ComponentSpec[] = [rootSpec];\n \n const children = rootSpec.dependencies || [];\n children.forEach(child => {\n components.push(...flattenComponentHierarchy(child));\n });\n\n return components;\n}\n\n/**\n * Counts the total number of components in a hierarchy\n * @param rootSpec - The root component specification\n * @param includeEmpty - Whether to include components without code\n * @returns Total component count\n */\nexport function countComponentsInHierarchy(\n rootSpec: ComponentSpec,\n includeEmpty: boolean = false\n): number {\n let count = 0;\n \n if (includeEmpty || rootSpec.code) {\n count = 1;\n }\n\n const children = rootSpec.dependencies || [];\n children.forEach(child => {\n count += countComponentsInHierarchy(child, includeEmpty);\n });\n\n return count;\n}"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ComponentStyles } from '@memberjunction/interactive-component-types';
|
|
2
|
-
import { ComponentProps
|
|
1
|
+
import { ComponentStyles, ComponentCallbacks } from '@memberjunction/interactive-component-types';
|
|
2
|
+
import { ComponentProps } from '../types';
|
|
3
3
|
export interface PropBuilderOptions {
|
|
4
4
|
validate?: boolean;
|
|
5
5
|
merge?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prop-builder.d.ts","sourceRoot":"","sources":["../../src/runtime/prop-builder.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;
|
|
1
|
+
{"version":3,"file":"prop-builder.d.ts","sourceRoot":"","sources":["../../src/runtime/prop-builder.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,6CAA6C,CAAC;AAClG,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAM1C,MAAM,WAAW,kBAAkB;IAEjC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,GAAG,CAAC;IAEnC,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,GAAG,CAAC;IAErC,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC;AAaD,wBAAgB,mBAAmB,CACjC,IAAI,GAAE,GAAQ,EACd,SAAS,GAAE,GAAQ,EACnB,SAAS,GAAE,GAAQ,EACnB,SAAS,GAAE,kBAGV,EACD,UAAU,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,EACpC,MAAM,CAAC,EAAE,eAAe,EACxB,OAAO,GAAE,kBAAuB,EAChC,cAAc,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,GAC1D,cAAc,CA6BhB;AA0CD,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,GAAG,EAAE,UAAU,GAAE,MAAa,GAAG,kBAAkB,CAiBhG;AAOD,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,GAAG,CAKjD;AAOD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CA2BlE;AAOD,wBAAgB,UAAU,CAAC,GAAG,SAAS,EAAE,OAAO,CAAC,cAAc,CAAC,EAAE,GAAG,cAAc,CAqClF;AAOD,wBAAgB,sBAAsB,CACpC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,GAAG,CAAC,GACnD,CAAC,KAAK,EAAE,cAAc,KAAK,cAAc,CAyB3C;AAQD,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,kBAAkB,EAC7B,aAAa,EAAE,MAAM,GACpB,kBAAkB,CA+BpB;AAOD,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE,CAmBhE"}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.extractPropPaths = exports.wrapCallbacksWithLogging = exports.createPropsTransformer = exports.mergeProps = exports.validateComponentProps = exports.normalizeStyles = exports.normalizeCallbacks = exports.buildComponentProps = void 0;
|
|
4
|
-
function buildComponentProps(data = {}, userState = {}, utilities = {}, callbacks = {
|
|
4
|
+
function buildComponentProps(data = {}, userState = {}, utilities = {}, callbacks = {
|
|
5
|
+
OpenEntityRecord: () => { },
|
|
6
|
+
RegisterMethod: () => { }
|
|
7
|
+
}, components = {}, styles, options = {}, onStateChanged) {
|
|
5
8
|
const { validate = true, transformData, transformState, debounceUpdateUserState = 3000 } = options;
|
|
6
9
|
const transformedData = transformData ? transformData(data) : data;
|
|
7
10
|
const transformedState = transformState ? transformState(userState) : userState;
|
|
@@ -43,12 +46,16 @@ function deepEqual(obj1, obj2) {
|
|
|
43
46
|
return true;
|
|
44
47
|
}
|
|
45
48
|
function normalizeCallbacks(callbacks, debounceMs = 3000) {
|
|
46
|
-
const normalized = {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
}
|
|
50
|
-
if (callbacks
|
|
51
|
-
|
|
49
|
+
const normalized = {
|
|
50
|
+
OpenEntityRecord: callbacks?.OpenEntityRecord || (() => { }),
|
|
51
|
+
RegisterMethod: callbacks?.RegisterMethod || (() => { })
|
|
52
|
+
};
|
|
53
|
+
if (callbacks) {
|
|
54
|
+
Object.keys(callbacks).forEach(key => {
|
|
55
|
+
if (typeof callbacks[key] === 'function' && !normalized.hasOwnProperty(key)) {
|
|
56
|
+
normalized[key] = callbacks[key];
|
|
57
|
+
}
|
|
58
|
+
});
|
|
52
59
|
}
|
|
53
60
|
return normalized;
|
|
54
61
|
}
|
|
@@ -131,19 +138,30 @@ function createPropsTransformer(transformations) {
|
|
|
131
138
|
}
|
|
132
139
|
exports.createPropsTransformer = createPropsTransformer;
|
|
133
140
|
function wrapCallbacksWithLogging(callbacks, componentName) {
|
|
134
|
-
const wrapped = {
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
+
const wrapped = {
|
|
142
|
+
OpenEntityRecord: callbacks?.OpenEntityRecord || (() => { }),
|
|
143
|
+
RegisterMethod: callbacks?.RegisterMethod || (() => { })
|
|
144
|
+
};
|
|
145
|
+
Object.keys(callbacks).forEach(key => {
|
|
146
|
+
if (key !== 'OpenEntityRecord' && key !== 'RegisterMethod' && typeof callbacks[key] === 'function') {
|
|
147
|
+
wrapped[key] = (...args) => {
|
|
148
|
+
console.log(`[${componentName}] ${key} called with args:`, args);
|
|
149
|
+
return callbacks[key](...args);
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
});
|
|
141
153
|
if (callbacks.OpenEntityRecord) {
|
|
142
154
|
wrapped.OpenEntityRecord = (entityName, key) => {
|
|
143
155
|
console.log(`[${componentName}] OpenEntityRecord called:`, { entityName, key });
|
|
144
156
|
callbacks.OpenEntityRecord(entityName, key);
|
|
145
157
|
};
|
|
146
158
|
}
|
|
159
|
+
if (callbacks.RegisterMethod) {
|
|
160
|
+
wrapped.RegisterMethod = (methodName, handler) => {
|
|
161
|
+
console.log(`[${componentName}] RegisterMethod called for:`, methodName);
|
|
162
|
+
callbacks.RegisterMethod(methodName, handler);
|
|
163
|
+
};
|
|
164
|
+
}
|
|
147
165
|
return wrapped;
|
|
148
166
|
}
|
|
149
167
|
exports.wrapCallbacksWithLogging = wrapCallbacksWithLogging;
|