@memberjunction/react-runtime 2.94.0 → 2.95.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +6 -6
- package/CHANGELOG.md +12 -0
- package/dist/compiler/component-compiler.d.ts +1 -0
- package/dist/compiler/component-compiler.d.ts.map +1 -1
- package/dist/compiler/component-compiler.js +67 -24
- package/dist/compiler/component-compiler.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/registry/component-registry-service.d.ts +2 -0
- package/dist/registry/component-registry-service.d.ts.map +1 -1
- package/dist/registry/component-registry-service.js +11 -0
- package/dist/registry/component-registry-service.js.map +1 -1
- package/dist/registry/component-registry.d.ts +2 -0
- package/dist/registry/component-registry.d.ts.map +1 -1
- package/dist/registry/component-registry.js +17 -0
- package/dist/registry/component-registry.js.map +1 -1
- package/dist/registry/component-resolver.d.ts.map +1 -1
- package/dist/registry/component-resolver.js +60 -5
- 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 +73 -17
- package/dist/runtime/component-hierarchy.js.map +1 -1
- package/dist/runtime.umd.js +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/utilities/library-dependency-resolver.d.ts.map +1 -1
- package/dist/utilities/library-dependency-resolver.js +17 -8
- package/dist/utilities/library-dependency-resolver.js.map +1 -1
- package/dist/utilities/library-loader.d.ts.map +1 -1
- package/dist/utilities/library-loader.js +23 -2
- package/dist/utilities/library-loader.js.map +1 -1
- package/package.json +5 -5
- package/src/compiler/component-compiler.ts +73 -25
- package/src/index.ts +2 -1
- package/src/registry/component-registry-service.ts +21 -0
- package/src/registry/component-registry.ts +28 -0
- package/src/registry/component-resolver.ts +82 -9
- package/src/runtime/component-hierarchy.ts +97 -31
- package/src/types/index.ts +1 -1
- package/src/utilities/library-dependency-resolver.ts +21 -11
- package/src/utilities/library-loader.ts +24 -2
|
@@ -18,19 +18,76 @@ class ComponentHierarchyRegistrar {
|
|
|
18
18
|
const registeredComponents = [];
|
|
19
19
|
const errors = [];
|
|
20
20
|
const warnings = [];
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
21
|
+
const compiledMap = new Map();
|
|
22
|
+
const specMap = new Map();
|
|
23
|
+
const compileOnly = async (spec) => {
|
|
24
|
+
if (!spec.code)
|
|
25
|
+
return { success: true };
|
|
26
|
+
try {
|
|
27
|
+
const compileOptions = {
|
|
28
|
+
componentName: spec.name,
|
|
29
|
+
componentCode: spec.code,
|
|
30
|
+
styles,
|
|
31
|
+
libraries: spec.libraries,
|
|
32
|
+
dependencies: spec.dependencies,
|
|
33
|
+
allLibraries: options.allLibraries
|
|
34
|
+
};
|
|
35
|
+
const result = await this.compiler.compile(compileOptions);
|
|
36
|
+
if (result.success && result.component) {
|
|
37
|
+
compiledMap.set(spec.name, result.component);
|
|
38
|
+
specMap.set(spec.name, spec);
|
|
39
|
+
return { success: true };
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
return {
|
|
43
|
+
success: false,
|
|
44
|
+
error: {
|
|
45
|
+
componentName: spec.name,
|
|
46
|
+
error: result.error?.message || 'Unknown compilation error',
|
|
47
|
+
phase: 'compilation'
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
return {
|
|
54
|
+
success: false,
|
|
55
|
+
error: {
|
|
56
|
+
componentName: spec.name,
|
|
57
|
+
error: error instanceof Error ? error.message : String(error),
|
|
58
|
+
phase: 'compilation'
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
const compileQueue = [rootSpec];
|
|
64
|
+
const visited = new Set();
|
|
65
|
+
while (compileQueue.length > 0) {
|
|
66
|
+
const spec = compileQueue.shift();
|
|
67
|
+
if (visited.has(spec.name))
|
|
68
|
+
continue;
|
|
69
|
+
visited.add(spec.name);
|
|
70
|
+
const result = await compileOnly(spec);
|
|
71
|
+
if (!result.success) {
|
|
72
|
+
errors.push(result.error);
|
|
73
|
+
if (!continueOnError) {
|
|
74
|
+
return { success: false, registeredComponents, errors, warnings };
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (spec.dependencies) {
|
|
78
|
+
compileQueue.push(...spec.dependencies);
|
|
29
79
|
}
|
|
30
80
|
}
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
const
|
|
81
|
+
for (const [name, compiled] of compiledMap) {
|
|
82
|
+
const spec = specMap.get(name);
|
|
83
|
+
const components = {};
|
|
84
|
+
for (const [depName, depCompiled] of compiledMap) {
|
|
85
|
+
const depObject = depCompiled.factory(this.runtimeContext, styles);
|
|
86
|
+
components[depName] = depObject.component;
|
|
87
|
+
}
|
|
88
|
+
const componentObject = compiled.factory(this.runtimeContext, styles, components);
|
|
89
|
+
this.registry.register(spec.name, componentObject, spec.namespace || namespace, version);
|
|
90
|
+
registeredComponents.push(spec.name);
|
|
34
91
|
}
|
|
35
92
|
return {
|
|
36
93
|
success: errors.length === 0,
|
|
@@ -82,13 +139,12 @@ class ComponentHierarchyRegistrar {
|
|
|
82
139
|
}
|
|
83
140
|
};
|
|
84
141
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
hasPrint: 'print' in componentObject,
|
|
90
|
-
hasRefresh: 'refresh' in componentObject
|
|
142
|
+
console.log(`🏭 Calling factory for ${spec.name} with runtime context:`, {
|
|
143
|
+
hasReact: !!this.runtimeContext.React,
|
|
144
|
+
hasReactDOM: !!this.runtimeContext.ReactDOM,
|
|
145
|
+
libraryKeys: Object.keys(this.runtimeContext.libraries || {})
|
|
91
146
|
});
|
|
147
|
+
const componentObject = compilationResult.component.factory(this.runtimeContext, styles);
|
|
92
148
|
this.registry.register(spec.name, componentObject, spec.namespace || namespace, version);
|
|
93
149
|
return { success: true };
|
|
94
150
|
}
|
|
@@ -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 // 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
|
+
{"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 CompiledComponent\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 // PHASE 1: Compile all components first (but defer factory execution)\n const compiledMap = new Map<string, CompiledComponent>();\n const specMap = new Map<string, ComponentSpec>();\n \n // Helper to compile a component without calling its factory\n const compileOnly = async (spec: ComponentSpec): Promise<{ success: boolean; error?: ComponentRegistrationError }> => {\n if (!spec.code) return { success: true };\n \n try {\n const compileOptions: CompileOptions = {\n componentName: spec.name,\n componentCode: spec.code,\n styles,\n libraries: spec.libraries,\n dependencies: spec.dependencies,\n allLibraries: options.allLibraries\n };\n \n const result = await this.compiler.compile(compileOptions);\n if (result.success && result.component) {\n compiledMap.set(spec.name, result.component);\n specMap.set(spec.name, spec);\n return { success: true };\n } else {\n return {\n success: false,\n error: {\n componentName: spec.name,\n error: result.error?.message || 'Unknown compilation error',\n phase: 'compilation'\n }\n };\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: 'compilation'\n }\n };\n }\n };\n \n // Compile all components in hierarchy\n const compileQueue = [rootSpec];\n const visited = new Set<string>();\n \n while (compileQueue.length > 0) {\n const spec = compileQueue.shift()!;\n if (visited.has(spec.name)) continue;\n visited.add(spec.name);\n \n const result = await compileOnly(spec);\n if (!result.success) {\n errors.push(result.error!);\n if (!continueOnError) {\n return { success: false, registeredComponents, errors, warnings };\n }\n }\n \n if (spec.dependencies) {\n compileQueue.push(...spec.dependencies);\n }\n }\n \n // PHASE 2: Execute all factories with components available\n for (const [name, compiled] of compiledMap) {\n const spec = specMap.get(name)!;\n \n // Build components object from all registered components\n const components: Record<string, any> = {};\n for (const [depName, depCompiled] of compiledMap) {\n // Call factory to get ComponentObject, then extract React component\n const depObject = depCompiled.factory(this.runtimeContext, styles);\n components[depName] = depObject.component;\n }\n \n // Now call factory with components available\n const componentObject = compiled.factory(this.runtimeContext, styles, components);\n \n // Register in registry\n this.registry.register(\n spec.name,\n componentObject,\n spec.namespace || namespace,\n version\n );\n \n registeredComponents.push(spec.name);\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 // IMPORTANT: We don't pass components here because child components may not be registered yet\n // Components are resolved later when the component is actually rendered\n console.log(`🏭 Calling factory for ${spec.name} with runtime context:`, {\n hasReact: !!this.runtimeContext.React,\n hasReactDOM: !!this.runtimeContext.ReactDOM,\n libraryKeys: Object.keys(this.runtimeContext.libraries || {})\n });\n const componentObject = compilationResult.component!.factory(this.runtimeContext, styles);\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}"]}
|