@memberjunction/ng-react 2.99.0 → 2.100.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.
@@ -47,6 +47,7 @@ export declare class MJReactComponent implements AfterViewInit, OnDestroy {
47
47
  * To control React builds, use ReactDebugConfig.setDebugMode() at app startup.
48
48
  */
49
49
  enableLogging: boolean;
50
+ useComponentManager: boolean;
50
51
  private _utilities;
51
52
  set utilities(value: any);
52
53
  get utilities(): any;
@@ -67,6 +68,7 @@ export declare class MJReactComponent implements AfterViewInit, OnDestroy {
67
68
  container: ElementRef<HTMLDivElement>;
68
69
  private reactRootId;
69
70
  private compiledComponent;
71
+ private loadedDependencies;
70
72
  private destroyed$;
71
73
  private currentCallbacks;
72
74
  isInitialized: boolean;
@@ -76,6 +78,13 @@ export declare class MJReactComponent implements AfterViewInit, OnDestroy {
76
78
  private componentId;
77
79
  private componentVersion;
78
80
  hasError: boolean;
81
+ /**
82
+ * Public property containing the fully resolved component specification.
83
+ * This includes all external code fetched from registries, allowing consumers
84
+ * to inspect the complete resolved specification including dependencies.
85
+ * Only populated after successful component initialization.
86
+ */
87
+ resolvedComponentSpec: ComponentSpec | null;
79
88
  constructor(reactBridge: ReactBridgeService, adapter: AngularAdapterService, cdr: ChangeDetectorRef);
80
89
  ngAfterViewInit(): Promise<void>;
81
90
  ngOnDestroy(): void;
@@ -92,10 +101,21 @@ export declare class MJReactComponent implements AfterViewInit, OnDestroy {
92
101
  * Resolve components using the runtime's resolver
93
102
  */
94
103
  private resolveComponentsWithVersion;
104
+ /**
105
+ * NEW: Load component using unified ComponentManager - MUCH SIMPLER!
106
+ */
107
+ private loadComponentWithManager;
95
108
  /**
96
109
  * Register all components in the hierarchy
110
+ * @deprecated Use loadComponentWithManager() instead
97
111
  */
98
112
  private registerComponentHierarchy;
113
+ /**
114
+ * Post-process resolved spec to ensure all components show their true registry source.
115
+ * This enriches the spec for UI display purposes to show where components actually came from.
116
+ * Applied to all resolved specs so any consumer of this wrapper benefits.
117
+ */
118
+ private enrichSpecWithRegistryInfo;
99
119
  /**
100
120
  * Render the React component
101
121
  */
@@ -198,5 +218,5 @@ export declare class MJReactComponent implements AfterViewInit, OnDestroy {
198
218
  */
199
219
  static forceClearRegistries(): void;
200
220
  static ɵfac: i0.ɵɵFactoryDeclaration<MJReactComponent, never>;
201
- static ɵcmp: i0.ɵɵComponentDeclaration<MJReactComponent, "mj-react-component", never, { "component": { "alias": "component"; "required": false; }; "enableLogging": { "alias": "enableLogging"; "required": false; }; "utilities": { "alias": "utilities"; "required": false; }; "styles": { "alias": "styles"; "required": false; }; "savedUserSettings": { "alias": "savedUserSettings"; "required": false; }; }, { "stateChange": "stateChange"; "componentEvent": "componentEvent"; "refreshData": "refreshData"; "openEntityRecord": "openEntityRecord"; "userSettingsChanged": "userSettingsChanged"; }, never, never, false, never>;
221
+ static ɵcmp: i0.ɵɵComponentDeclaration<MJReactComponent, "mj-react-component", never, { "component": { "alias": "component"; "required": false; }; "enableLogging": { "alias": "enableLogging"; "required": false; }; "useComponentManager": { "alias": "useComponentManager"; "required": false; }; "utilities": { "alias": "utilities"; "required": false; }; "styles": { "alias": "styles"; "required": false; }; "savedUserSettings": { "alias": "savedUserSettings"; "required": false; }; }, { "stateChange": "stateChange"; "componentEvent": "componentEvent"; "refreshData": "refreshData"; "openEntityRecord": "openEntityRecord"; "userSettingsChanged": "userSettingsChanged"; }, never, never, false, never>;
202
222
  }
@@ -77,6 +77,7 @@ export class MJReactComponent {
77
77
  * To control React builds, use ReactDebugConfig.setDebugMode() at app startup.
78
78
  */
79
79
  this.enableLogging = false;
80
+ this.useComponentManager = true; // NEW: Use unified ComponentManager by default
80
81
  this._savedUserSettings = {};
81
82
  this.stateChange = new EventEmitter();
82
83
  this.componentEvent = new EventEmitter();
@@ -85,6 +86,7 @@ export class MJReactComponent {
85
86
  this.userSettingsChanged = new EventEmitter();
86
87
  this.reactRootId = null;
87
88
  this.compiledComponent = null;
89
+ this.loadedDependencies = {};
88
90
  this.destroyed$ = new Subject();
89
91
  this.currentCallbacks = null;
90
92
  this.isInitialized = false;
@@ -93,10 +95,36 @@ export class MJReactComponent {
93
95
  this.isDestroying = false;
94
96
  this.componentVersion = ''; // Store the version for resolver
95
97
  this.hasError = false;
98
+ /**
99
+ * Public property containing the fully resolved component specification.
100
+ * This includes all external code fetched from registries, allowing consumers
101
+ * to inspect the complete resolved specification including dependencies.
102
+ * Only populated after successful component initialization.
103
+ */
104
+ this.resolvedComponentSpec = null;
96
105
  // Generate unique component ID for resource tracking
97
106
  this.componentId = `mj-react-component-${Date.now()}-${Math.random()}`;
98
107
  }
99
108
  async ngAfterViewInit() {
109
+ // Try to get registry size safely
110
+ let registrySize = 'N/A';
111
+ try {
112
+ if (this.adapter.isInitialized()) {
113
+ registrySize = this.adapter.getRegistry().size().toString();
114
+ }
115
+ else {
116
+ registrySize = 'Not initialized yet';
117
+ }
118
+ }
119
+ catch (e) {
120
+ registrySize = 'Not available';
121
+ }
122
+ console.log(`🎬 [ngAfterViewInit] Starting component initialization:`, {
123
+ componentId: this.componentId,
124
+ componentName: this.component?.name,
125
+ timestamp: new Date().toISOString(),
126
+ registrySize: registrySize
127
+ });
100
128
  // Trigger change detection to show loading state
101
129
  this.cdr.detectChanges();
102
130
  await this.initializeComponent();
@@ -115,31 +143,69 @@ export class MJReactComponent {
115
143
  */
116
144
  async initializeComponent() {
117
145
  try {
146
+ console.log(`🔄 [initializeComponent] Starting initialization for ${this.component?.name}:`, {
147
+ location: this.component?.location,
148
+ registry: this.component?.registry,
149
+ hasCode: !!this.component?.code,
150
+ browserRefreshed: performance.navigation.type === 1,
151
+ performanceType: performance.navigation.type
152
+ });
118
153
  // Ensure React is loaded
119
154
  await this.reactBridge.getReactContext();
120
155
  // Wait for React to be fully ready (handles first-load delay)
121
156
  await this.reactBridge.waitForReactReady();
122
- // Register component hierarchy (this compiles and registers all components)
123
- await this.registerComponentHierarchy();
124
- // Get the already-registered component from the registry
125
- const registry = this.adapter.getRegistry();
126
- const componentWrapper = registry.get(this.component.name, this.component.namespace || 'Global', this.componentVersion);
127
- if (!componentWrapper) {
128
- throw new Error(`Component ${this.component.name} was not found in registry after registration`);
129
- }
130
- // The registry now stores ComponentObjects directly
131
- // Validate it has the expected structure
132
- if (!componentWrapper || typeof componentWrapper !== 'object') {
133
- throw new Error(`Invalid component wrapper returned for ${this.component.name}: ${typeof componentWrapper}`);
134
- }
135
- if (!componentWrapper.component) {
136
- throw new Error(`Component wrapper missing 'component' property for ${this.component.name}`);
157
+ // NEW: Use ComponentManager if enabled (default: true)
158
+ if (this.useComponentManager) {
159
+ console.log(`🎯 [initializeComponent] Using NEW ComponentManager approach`);
160
+ await this.loadComponentWithManager();
161
+ // Component is already compiled and stored in this.compiledComponent
162
+ // No need to fetch from registry - it's already set
137
163
  }
138
- // Now that we use a regular HOC wrapper, components should always be functions
139
- if (typeof componentWrapper.component !== 'function') {
140
- throw new Error(`Component is not a function for ${this.component.name}: ${typeof componentWrapper.component}`);
141
- }
142
- this.compiledComponent = componentWrapper;
164
+ else {
165
+ console.log(`📦 [initializeComponent] Using legacy approach (will be deprecated)`);
166
+ // Register component hierarchy (this compiles and registers all components including from registries)
167
+ await this.registerComponentHierarchy();
168
+ // The resolved spec should now be available from the registration result
169
+ // No need to fetch again
170
+ // Get the already-registered component from the registry
171
+ const registry = this.adapter.getRegistry();
172
+ console.log(`🔍 [initializeComponent] Looking for component in registry:`, {
173
+ name: this.component.name,
174
+ namespace: this.component.namespace || 'Global',
175
+ version: this.componentVersion
176
+ });
177
+ // Let's also check what's actually in the registry
178
+ // Note: ComponentRegistry doesn't have a list() method, so we'll skip this for now
179
+ const componentWrapper = registry.get(this.component.name, this.component.namespace || 'Global', this.componentVersion);
180
+ console.log(`🔍 [initializeComponent] Registry.get result:`, {
181
+ found: !!componentWrapper,
182
+ type: componentWrapper ? typeof componentWrapper : 'undefined',
183
+ hasComponent: componentWrapper ? !!componentWrapper.component : false
184
+ });
185
+ if (!componentWrapper) {
186
+ const source = this.component.registry ? `external registry ${this.component.registry}` : 'local registry';
187
+ console.error(`❌ [initializeComponent] Component not found! Details:`, {
188
+ searchedName: this.component.name,
189
+ searchedNamespace: this.component.namespace || 'Global',
190
+ searchedVersion: this.componentVersion,
191
+ source: source
192
+ });
193
+ throw new Error(`Component ${this.component.name} was not found in registry after registration from ${source}`);
194
+ }
195
+ // The registry now stores ComponentObjects directly
196
+ // Validate it has the expected structure
197
+ if (!componentWrapper || typeof componentWrapper !== 'object') {
198
+ throw new Error(`Invalid component wrapper returned for ${this.component.name}: ${typeof componentWrapper}`);
199
+ }
200
+ if (!componentWrapper.component) {
201
+ throw new Error(`Component wrapper missing 'component' property for ${this.component.name}`);
202
+ }
203
+ // Now that we use a regular HOC wrapper, components should always be functions
204
+ if (typeof componentWrapper.component !== 'function') {
205
+ throw new Error(`Component is not a function for ${this.component.name}: ${typeof componentWrapper.component}`);
206
+ }
207
+ this.compiledComponent = componentWrapper;
208
+ } // End of else block for legacy approach
143
209
  // Create managed React root
144
210
  const reactContext = this.reactBridge.getCurrentContext();
145
211
  if (!reactContext) {
@@ -213,45 +279,221 @@ export class MJReactComponent {
213
279
  }
214
280
  return resolved;
215
281
  }
282
+ /**
283
+ * NEW: Load component using unified ComponentManager - MUCH SIMPLER!
284
+ */
285
+ async loadComponentWithManager() {
286
+ try {
287
+ const manager = this.adapter.getComponentManager();
288
+ console.log(`🚀 [ComponentManager] Loading component hierarchy: ${this.component.name}`);
289
+ // Load the entire hierarchy with one simple call
290
+ const result = await manager.loadHierarchy(this.component, {
291
+ contextUser: Metadata.Provider.CurrentUser,
292
+ defaultNamespace: 'Global',
293
+ defaultVersion: this.component.version || this.generateComponentHash(this.component),
294
+ returnType: 'both'
295
+ });
296
+ if (!result.success) {
297
+ const errorMessages = result.errors.map(e => `${e.componentName}: ${e.message}`).join(', ');
298
+ console.error(`❌ [ComponentManager] Failed to load hierarchy:`, errorMessages);
299
+ throw new Error(`Component loading failed: ${errorMessages}`);
300
+ }
301
+ // Store the results (handle undefined values)
302
+ this.resolvedComponentSpec = this.enrichSpecWithRegistryInfo(result.resolvedSpec || null);
303
+ this.compiledComponent = result.rootComponent || null;
304
+ this.componentVersion = result.resolvedSpec?.version || this.component.version || 'latest';
305
+ // IMPORTANT: Store the loaded dependencies for use in renderComponent
306
+ this.loadedDependencies = result.components || {};
307
+ console.log(`✅ [ComponentManager] Successfully loaded hierarchy:`, {
308
+ rootComponent: result.resolvedSpec?.name,
309
+ loadedCount: result.loadedComponents.length,
310
+ dependencies: Object.keys(this.loadedDependencies),
311
+ stats: result.stats
312
+ });
313
+ // Component is ready to render
314
+ return true;
315
+ }
316
+ catch (error) {
317
+ console.error(`❌ [ComponentManager] Error loading component:`, error);
318
+ throw error;
319
+ }
320
+ }
216
321
  /**
217
322
  * Register all components in the hierarchy
323
+ * @deprecated Use loadComponentWithManager() instead
218
324
  */
219
325
  async registerComponentHierarchy() {
220
326
  // Use semantic version from spec or generate hash-based version for uniqueness
221
327
  const version = this.component.version || this.generateComponentHash(this.component);
222
328
  this.componentVersion = version; // Store for use in resolver
223
- if (this.enableLogging) {
224
- console.log(`Registering ${this.component.name}@${version}`);
225
- }
329
+ console.log(`🔍 [registerComponentHierarchy] Starting registration for ${this.component.name}@${version}`, {
330
+ location: this.component.location,
331
+ registry: this.component.registry,
332
+ namespace: this.component.namespace,
333
+ hasCode: !!this.component.code,
334
+ codeLength: this.component.code?.length || 0
335
+ });
226
336
  // Check if already registered to avoid duplication
227
337
  const registry = this.adapter.getRegistry();
228
- const existingComponent = registry.get(this.component.name, this.component.namespace || 'Global', version);
338
+ const checkNamespace = this.component.namespace || 'Global';
339
+ console.log(`🔍 [registerComponentHierarchy] Checking registry for existing component:`, {
340
+ name: this.component.name,
341
+ namespace: checkNamespace,
342
+ version: version,
343
+ registrySize: registry.size(),
344
+ registryId: registry.registryId || 'unknown'
345
+ });
346
+ // Log registry state for debugging
347
+ console.log(`📦 [registerComponentHierarchy] Registry state:`, {
348
+ totalSize: registry.size(),
349
+ registryInstance: registry.registryId || 'unknown'
350
+ });
351
+ const existingComponent = registry.get(this.component.name, checkNamespace, version);
229
352
  if (existingComponent) {
230
- if (this.enableLogging) {
231
- console.log(`Component ${this.component.name}@${version} already registered`);
353
+ console.log(`⚠️ [registerComponentHierarchy] Component ${this.component.name}@${version} already registered!`, {
354
+ existingType: typeof existingComponent,
355
+ hasComponent: !!existingComponent.component,
356
+ registrationTime: existingComponent.registeredAt || 'unknown',
357
+ runtimeContextLibraries: Object.keys(this.adapter.getRuntimeContext().libraries || {})
358
+ });
359
+ // For registry components, we need to check the resolved spec's libraries, not the input spec
360
+ // The input spec from Angular doesn't have library information for registry components
361
+ if (this.component.location === 'registry' && this.component.registry) {
362
+ console.log(`📋 [registerComponentHierarchy] Component is from registry, need to fetch full spec to check libraries`);
363
+ // Continue to fetch the full spec below - don't return early
364
+ }
365
+ else {
366
+ // For local components, check using the input spec
367
+ const requiredLibraries = this.component.libraries || [];
368
+ const runtimeLibraries = this.adapter.getRuntimeContext().libraries || {};
369
+ const missingLibraries = requiredLibraries.filter(lib => !runtimeLibraries[lib.globalVariable]);
370
+ if (missingLibraries.length > 0) {
371
+ console.warn(`⚠️ [registerComponentHierarchy] Component registered but libraries missing:`, {
372
+ required: requiredLibraries.map(l => l.globalVariable),
373
+ loaded: Object.keys(runtimeLibraries),
374
+ missing: missingLibraries.map(l => l.globalVariable)
375
+ });
376
+ // Don't return early - continue to load libraries
377
+ }
378
+ else {
379
+ console.log(`✅ [registerComponentHierarchy] Component ${this.component.name}@${version} already registered with all libraries, skipping`);
380
+ return;
381
+ }
232
382
  }
233
- return;
383
+ }
384
+ else {
385
+ console.log(`🆕 [registerComponentHierarchy] Component not found in registry, proceeding with registration`);
234
386
  }
235
387
  // Initialize metadata engine
236
388
  await ComponentMetadataEngine.Instance.Config(false, Metadata.Provider.CurrentUser);
237
389
  // Use the runtime's hierarchy registrar
238
390
  const registrar = new ComponentHierarchyRegistrar(this.adapter.getCompiler(), this.adapter.getRegistry(), this.adapter.getRuntimeContext());
391
+ console.log(`📦 [registerComponentHierarchy] Calling registrar.registerHierarchy for ${this.component.name}`, {
392
+ hasStyles: !!this.styles,
393
+ namespace: this.component.namespace || 'Global',
394
+ version: version,
395
+ libraryCount: ComponentMetadataEngine.Instance.ComponentLibraries?.length || 0,
396
+ hasCode: !!this.component.code,
397
+ codeLength: this.component.code?.length || 0
398
+ });
239
399
  // Register with proper configuration
240
- const result = await registrar.registerHierarchy(this.component, {
400
+ // Pass the partial spec - the React runtime will handle fetching from registries
401
+ const result = await registrar.registerHierarchy(this.component, // Pass the original spec, not fetched
402
+ {
241
403
  styles: this.styles,
242
404
  namespace: this.component.namespace || 'Global',
243
405
  version: version,
244
406
  allowOverride: false, // Each version is unique
245
407
  allLibraries: ComponentMetadataEngine.Instance.ComponentLibraries,
246
- debug: true
408
+ debug: true,
409
+ contextUser: Metadata.Provider.CurrentUser
247
410
  });
248
411
  if (!result.success) {
249
412
  const errors = result.errors.map(e => e.error).join(', ');
413
+ console.error(`❌ [registerComponentHierarchy] Registration failed:`, errors);
250
414
  throw new Error(`Component registration failed: ${errors}`);
251
415
  }
252
- if (this.enableLogging) {
253
- console.log(`Registered ${result.registeredComponents.length} components`);
416
+ // Store the resolved spec from the registration result
417
+ if (result.resolvedSpec) {
418
+ this.resolvedComponentSpec = this.enrichSpecWithRegistryInfo(result.resolvedSpec || null);
419
+ console.log(`📋 [registerComponentHierarchy] Received resolved spec from runtime:`, {
420
+ name: result.resolvedSpec.name,
421
+ hasCode: !!result.resolvedSpec.code,
422
+ libraryCount: result.resolvedSpec.libraries?.length || 0,
423
+ dependencyCount: result.resolvedSpec.dependencies?.length || 0
424
+ });
254
425
  }
426
+ console.log(`✅ [registerComponentHierarchy] Successfully registered ${result.registeredComponents.length} components:`, result.registeredComponents);
427
+ // Verify the component is actually in the registry
428
+ const verifyComponent = registry.get(this.component.name, this.component.namespace || 'Global', version);
429
+ console.log(`🔍 [registerComponentHierarchy] Verification - component in registry after registration:`, {
430
+ found: !!verifyComponent,
431
+ name: this.component.name,
432
+ namespace: this.component.namespace || 'Global',
433
+ version: version,
434
+ componentType: verifyComponent ? typeof verifyComponent : 'not found'
435
+ });
436
+ }
437
+ /**
438
+ * Post-process resolved spec to ensure all components show their true registry source.
439
+ * This enriches the spec for UI display purposes to show where components actually came from.
440
+ * Applied to all resolved specs so any consumer of this wrapper benefits.
441
+ */
442
+ enrichSpecWithRegistryInfo(spec) {
443
+ if (!spec || !this.component)
444
+ return spec;
445
+ // Create a deep copy to avoid mutating the original
446
+ const enrichedSpec = JSON.parse(JSON.stringify(spec));
447
+ // Recursive function to process spec and all dependencies
448
+ // Takes the original spec at the same level to find registry info
449
+ const processSpec = (currentSpec, originalSpec) => {
450
+ // If this component has code but shows location as 'embedded',
451
+ // check the original spec to see where it came from
452
+ if (currentSpec.code && currentSpec.location === 'embedded' && currentSpec.name) {
453
+ // Try to find this component in the original spec at the same level
454
+ // First check if the original spec itself matches by name
455
+ if (originalSpec.name === currentSpec.name) {
456
+ // Use the original's registry info if it had any
457
+ if (originalSpec.location === 'registry' || originalSpec.registry) {
458
+ currentSpec.location = 'registry';
459
+ if (originalSpec.registry) {
460
+ currentSpec.registry = originalSpec.registry;
461
+ }
462
+ if (originalSpec.namespace) {
463
+ currentSpec.namespace = originalSpec.namespace;
464
+ }
465
+ }
466
+ }
467
+ // Also check in original's dependencies for a match
468
+ if (originalSpec.dependencies) {
469
+ const originalDep = originalSpec.dependencies.find(d => d.name === currentSpec.name);
470
+ if (originalDep && (originalDep.location === 'registry' || originalDep.registry)) {
471
+ currentSpec.location = 'registry';
472
+ if (originalDep.registry) {
473
+ currentSpec.registry = originalDep.registry;
474
+ }
475
+ if (originalDep.namespace) {
476
+ currentSpec.namespace = originalDep.namespace;
477
+ }
478
+ }
479
+ }
480
+ }
481
+ // Process all dependencies recursively
482
+ if (currentSpec.dependencies && Array.isArray(currentSpec.dependencies)) {
483
+ currentSpec.dependencies.forEach((dep, index) => {
484
+ // Find the corresponding original dependency by name or use the one at same index
485
+ let originalDep = originalSpec.dependencies?.find(d => d.name === dep.name);
486
+ if (!originalDep && originalSpec.dependencies && index < originalSpec.dependencies.length) {
487
+ originalDep = originalSpec.dependencies[index];
488
+ }
489
+ if (originalDep) {
490
+ processSpec(dep, originalDep);
491
+ }
492
+ });
493
+ }
494
+ };
495
+ processSpec(enrichedSpec, this.component);
496
+ return enrichedSpec;
255
497
  }
256
498
  /**
257
499
  * Render the React component
@@ -276,17 +518,30 @@ export class MJReactComponent {
276
518
  this.isRendering = true;
277
519
  const { React } = context;
278
520
  // Resolve components with the correct version using runtime's resolver
279
- const components = await this.resolveComponentsWithVersion(this.component, this.componentVersion);
521
+ // SKIP this if using ComponentManager - components are already loaded!
522
+ let components = {};
523
+ if (!this.useComponentManager) {
524
+ components = await this.resolveComponentsWithVersion(this.component, this.componentVersion);
525
+ }
526
+ else {
527
+ // Use the dependencies that were already loaded and unwrapped by ComponentManager
528
+ components = this.loadedDependencies;
529
+ console.log(`🎯 [renderComponent] Using dependencies from ComponentManager:`, Object.keys(components));
530
+ }
280
531
  // Create callbacks once per component instance
281
532
  if (!this.currentCallbacks) {
282
533
  this.currentCallbacks = this.createCallbacks();
283
534
  }
535
+ // Get libraries from runtime context
536
+ const runtimeContext = this.adapter.getRuntimeContext();
537
+ const libraries = runtimeContext.libraries || {};
284
538
  // Build props with savedUserSettings pattern
285
539
  const props = {
286
540
  utilities: this.utilities, // Now uses getter which auto-initializes if needed
287
541
  callbacks: this.currentCallbacks,
288
542
  components,
289
543
  styles: this.styles,
544
+ libraries, // Pass the loaded libraries to components
290
545
  savedUserSettings: this._savedUserSettings,
291
546
  onSaveUserSettings: this.handleSaveUserSettings.bind(this)
292
547
  };
@@ -592,7 +847,7 @@ export class MJReactComponent {
592
847
  } if (rf & 2) {
593
848
  let _t;
594
849
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.container = _t.first);
595
- } }, inputs: { component: "component", enableLogging: "enableLogging", utilities: "utilities", styles: "styles", savedUserSettings: "savedUserSettings" }, outputs: { stateChange: "stateChange", componentEvent: "componentEvent", refreshData: "refreshData", openEntityRecord: "openEntityRecord", userSettingsChanged: "userSettingsChanged" }, decls: 4, vars: 3, consts: [["container", ""], [1, "react-component-wrapper"], [1, "react-component-container"], [1, "loading-overlay"], [1, "loading-spinner"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "loading-text"]], template: function MJReactComponent_Template(rf, ctx) { if (rf & 1) {
850
+ } }, inputs: { component: "component", enableLogging: "enableLogging", useComponentManager: "useComponentManager", utilities: "utilities", styles: "styles", savedUserSettings: "savedUserSettings" }, outputs: { stateChange: "stateChange", componentEvent: "componentEvent", refreshData: "refreshData", openEntityRecord: "openEntityRecord", userSettingsChanged: "userSettingsChanged" }, decls: 4, vars: 3, consts: [["container", ""], [1, "react-component-wrapper"], [1, "react-component-container"], [1, "loading-overlay"], [1, "loading-spinner"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "loading-text"]], template: function MJReactComponent_Template(rf, ctx) { if (rf & 1) {
596
851
  i0.ɵɵelementStart(0, "div", 1);
597
852
  i0.ɵɵelement(1, "div", 2, 0);
598
853
  i0.ɵɵtemplate(3, MJReactComponent_Conditional_3_Template, 5, 0, "div", 3);
@@ -623,6 +878,8 @@ export class MJReactComponent {
623
878
  type: Input
624
879
  }], enableLogging: [{
625
880
  type: Input
881
+ }], useComponentManager: [{
882
+ type: Input
626
883
  }], utilities: [{
627
884
  type: Input
628
885
  }], styles: [{
@@ -1 +1 @@
1
- {"version":3,"file":"mj-react-component.component.js","sourceRoot":"","sources":["../../../src/lib/components/mj-react-component.component.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Angular component that hosts React components with proper memory management.\n * Provides a bridge between Angular and React ecosystems in MemberJunction applications.\n * @module @memberjunction/ng-react\n */\n\nimport {\n Component,\n Input,\n Output,\n EventEmitter,\n ViewChild,\n ElementRef,\n AfterViewInit,\n OnDestroy,\n ChangeDetectionStrategy,\n ChangeDetectorRef\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { ComponentSpec, ComponentCallbacks, ComponentStyles, ComponentObject } from '@memberjunction/interactive-component-types';\nimport { ReactBridgeService } from '../services/react-bridge.service';\nimport { AngularAdapterService } from '../services/angular-adapter.service';\nimport { \n createErrorBoundary,\n ComponentHierarchyRegistrar,\n resourceManager,\n reactRootManager,\n ResolvedComponents,\n SetupStyles,\n ComponentRegistryService\n} from '@memberjunction/react-runtime';\nimport { createRuntimeUtilities } from '../utilities/runtime-utilities';\nimport { LogError, CompositeKey, KeyValuePair, Metadata, RunView } from '@memberjunction/core';\nimport { ComponentMetadataEngine } from '@memberjunction/core-entities';\n\n/**\n * Event emitted by React components\n */\nexport interface ReactComponentEvent {\n type: string;\n payload: any;\n}\n\n/**\n * State change event emitted when component state updates\n */\nexport interface StateChangeEvent {\n path: string;\n value: any;\n}\n\n/**\n * User settings changed event emitted when component saves user preferences\n */\nexport interface UserSettingsChangedEvent {\n settings: Record<string, any>;\n componentName?: string;\n timestamp: Date;\n}\n\n/**\n * Angular component that hosts React components with proper memory management.\n * This component provides a bridge between Angular and React, allowing React components\n * to be used seamlessly within Angular applications.\n */\n@Component({\n selector: 'mj-react-component',\n template: `\n <div class=\"react-component-wrapper\">\n <div #container class=\"react-component-container\" [class.loading]=\"!isInitialized\"></div>\n @if (!isInitialized && !hasError) {\n <div class=\"loading-overlay\">\n <div class=\"loading-spinner\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n </div>\n <div class=\"loading-text\">Loading component...</div>\n </div>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n .react-component-wrapper {\n position: relative;\n width: 100%;\n height: 100%;\n }\n .react-component-container {\n width: 100%;\n height: 100%;\n transition: opacity 0.3s ease;\n }\n .react-component-container.loading {\n opacity: 0;\n }\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n background-color: rgba(255, 255, 255, 0.9);\n z-index: 1;\n }\n .loading-spinner {\n font-size: 48px;\n color: #5B4FE9;\n margin-bottom: 16px;\n }\n .loading-text {\n font-family: -apple-system, BlinkMacSystemFont, \"Inter\", \"Segoe UI\", Roboto, sans-serif;\n font-size: 14px;\n color: #64748B;\n margin-top: 8px;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class MJReactComponent implements AfterViewInit, OnDestroy {\n @Input() component!: ComponentSpec;\n /**\n * Controls verbose logging for component lifecycle and operations.\n * Note: This does NOT control which React build (dev/prod) is loaded.\n * To control React builds, use ReactDebugConfig.setDebugMode() at app startup.\n */\n @Input() enableLogging: boolean = false;\n \n // Auto-initialize utilities if not provided\n private _utilities: any;\n @Input()\n set utilities(value: any) {\n this._utilities = value;\n }\n get utilities(): any {\n // Lazy initialization - only create default utilities when needed\n if (!this._utilities) {\n const runtimeUtils = createRuntimeUtilities();\n this._utilities = runtimeUtils.buildUtilities(this.enableLogging);\n if (this.enableLogging) {\n console.log('MJReactComponent: Auto-initialized utilities using createRuntimeUtilities()');\n }\n }\n return this._utilities;\n }\n \n // Auto-initialize styles if not provided\n private _styles?: Partial<ComponentStyles>;\n @Input()\n set styles(value: Partial<ComponentStyles> | undefined) {\n this._styles = value;\n }\n get styles(): Partial<ComponentStyles> {\n // Lazy initialization - only create default styles when needed\n if (!this._styles) {\n this._styles = SetupStyles();\n if (this.enableLogging) {\n console.log('MJReactComponent: Auto-initialized styles using SetupStyles()');\n }\n }\n return this._styles;\n }\n \n private _savedUserSettings: any = {};\n @Input()\n set savedUserSettings(value: any) {\n this._savedUserSettings = value || {};\n // Re-render if component is initialized\n if (this.isInitialized) {\n this.renderComponent();\n }\n }\n get savedUserSettings(): any {\n return this._savedUserSettings;\n }\n \n @Output() stateChange = new EventEmitter<StateChangeEvent>();\n @Output() componentEvent = new EventEmitter<ReactComponentEvent>();\n @Output() refreshData = new EventEmitter<void>();\n @Output() openEntityRecord = new EventEmitter<{ entityName: string; key: CompositeKey }>();\n @Output() userSettingsChanged = new EventEmitter<UserSettingsChangedEvent>();\n \n @ViewChild('container', { read: ElementRef, static: true }) container!: ElementRef<HTMLDivElement>;\n \n private reactRootId: string | null = null;\n private compiledComponent: ComponentObject | null = null;\n private destroyed$ = new Subject<void>();\n private currentCallbacks: ComponentCallbacks | null = null;\n isInitialized = false;\n private isRendering = false;\n private pendingRender = false;\n private isDestroying = false;\n private componentId: string;\n private componentVersion: string = ''; // Store the version for resolver\n hasError = false;\n\n constructor(\n private reactBridge: ReactBridgeService,\n private adapter: AngularAdapterService,\n private cdr: ChangeDetectorRef\n ) {\n // Generate unique component ID for resource tracking\n this.componentId = `mj-react-component-${Date.now()}-${Math.random()}`;\n }\n\n async ngAfterViewInit() {\n // Trigger change detection to show loading state\n this.cdr.detectChanges();\n await this.initializeComponent();\n }\n\n ngOnDestroy() {\n // Set destroying flag immediately\n this.isDestroying = true;\n \n // Cancel any pending renders\n this.pendingRender = false;\n \n this.destroyed$.next();\n this.destroyed$.complete();\n this.cleanup();\n }\n\n\n /**\n * Initialize the React component\n */\n private async initializeComponent() {\n try {\n // Ensure React is loaded\n await this.reactBridge.getReactContext();\n \n // Wait for React to be fully ready (handles first-load delay)\n await this.reactBridge.waitForReactReady();\n \n // Register component hierarchy (this compiles and registers all components)\n await this.registerComponentHierarchy();\n \n // Get the already-registered component from the registry\n const registry = this.adapter.getRegistry();\n const componentWrapper = registry.get(\n this.component.name, \n this.component.namespace || 'Global', \n this.componentVersion\n );\n \n if (!componentWrapper) {\n throw new Error(`Component ${this.component.name} was not found in registry after registration`);\n }\n \n // The registry now stores ComponentObjects directly\n // Validate it has the expected structure\n if (!componentWrapper || typeof componentWrapper !== 'object') {\n throw new Error(`Invalid component wrapper returned for ${this.component.name}: ${typeof componentWrapper}`);\n }\n \n if (!componentWrapper.component) {\n throw new Error(`Component wrapper missing 'component' property for ${this.component.name}`);\n }\n \n // Now that we use a regular HOC wrapper, components should always be functions\n if (typeof componentWrapper.component !== 'function') {\n throw new Error(`Component is not a function for ${this.component.name}: ${typeof componentWrapper.component}`);\n }\n \n this.compiledComponent = componentWrapper;\n \n // Create managed React root\n const reactContext = this.reactBridge.getCurrentContext();\n if (!reactContext) {\n throw new Error('React context not available');\n }\n \n this.reactRootId = reactRootManager.createRoot(\n this.container.nativeElement,\n (container: HTMLElement) => reactContext.ReactDOM.createRoot(container),\n this.componentId\n );\n \n // Initial render\n this.renderComponent();\n this.isInitialized = true;\n \n // Trigger change detection since we're using OnPush\n this.cdr.detectChanges();\n \n } catch (error) {\n this.hasError = true;\n LogError(`Failed to initialize React component: ${error}`);\n this.componentEvent.emit({\n type: 'error',\n payload: {\n error: error instanceof Error ? error.message : String(error),\n source: 'initialization'\n }\n });\n // Trigger change detection to show error state\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Generate a hash from component code for versioning\n * Uses a simple hash function that's fast and sufficient for version differentiation\n */\n private generateComponentHash(spec: ComponentSpec): string {\n // Collect all code from the component hierarchy\n const codeStrings: string[] = [];\n \n const collectCode = (s: ComponentSpec) => {\n if (s.code) {\n codeStrings.push(s.code);\n }\n if (s.dependencies) {\n for (const dep of s.dependencies) {\n collectCode(dep);\n }\n }\n };\n \n collectCode(spec);\n \n // Generate hash from concatenated code\n const fullCode = codeStrings.join('|');\n let hash = 0;\n for (let i = 0; i < fullCode.length; i++) {\n const char = fullCode.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n \n // Convert to hex string and take first 8 characters for readability\n const hexHash = Math.abs(hash).toString(16).padStart(8, '0').substring(0, 8);\n return `v${hexHash}`;\n }\n\n /**\n * Resolve components using the runtime's resolver\n */\n private async resolveComponentsWithVersion(spec: ComponentSpec, version: string, namespace: string = 'Global'): Promise<ResolvedComponents> {\n const resolver = this.adapter.getResolver();\n \n // Debug: Log what dependencies we're trying to resolve\n if (this.enableLogging) {\n console.log(`Resolving components for ${spec.name}. Dependencies:`, spec.dependencies);\n }\n \n // Use the runtime's resolver which now handles registry-based components\n const resolved = await resolver.resolveComponents(\n spec, \n namespace,\n Metadata.Provider.CurrentUser // Pass current user context for database operations\n );\n \n if (this.enableLogging) {\n console.log(`Resolved ${Object.keys(resolved).length} components for version ${version}:`, Object.keys(resolved));\n }\n return resolved;\n }\n\n\n /**\n * Register all components in the hierarchy\n */\n private async registerComponentHierarchy() {\n // Use semantic version from spec or generate hash-based version for uniqueness\n const version = this.component.version || this.generateComponentHash(this.component);\n this.componentVersion = version; // Store for use in resolver\n \n if (this.enableLogging) {\n console.log(`Registering ${this.component.name}@${version}`);\n }\n \n // Check if already registered to avoid duplication\n const registry = this.adapter.getRegistry();\n const existingComponent = registry.get(this.component.name, this.component.namespace || 'Global', version);\n if (existingComponent) {\n if (this.enableLogging) {\n console.log(`Component ${this.component.name}@${version} already registered`);\n }\n return;\n }\n \n // Initialize metadata engine\n await ComponentMetadataEngine.Instance.Config(false, Metadata.Provider.CurrentUser);\n \n // Use the runtime's hierarchy registrar\n const registrar = new ComponentHierarchyRegistrar(\n this.adapter.getCompiler(),\n this.adapter.getRegistry(),\n this.adapter.getRuntimeContext()\n );\n \n // Register with proper configuration\n const result = await registrar.registerHierarchy(\n this.component,\n {\n styles: this.styles as ComponentStyles,\n namespace: this.component.namespace || 'Global',\n version: version,\n allowOverride: false, // Each version is unique\n allLibraries: ComponentMetadataEngine.Instance.ComponentLibraries,\n debug: true\n }\n );\n \n if (!result.success) {\n const errors = result.errors.map(e => e.error).join(', ');\n throw new Error(`Component registration failed: ${errors}`);\n }\n \n if (this.enableLogging) {\n console.log(`Registered ${result.registeredComponents.length} components`);\n }\n }\n\n /**\n * Render the React component\n */\n private async renderComponent() {\n // Don't render if component is being destroyed\n if (this.isDestroying) {\n return;\n }\n \n if (!this.compiledComponent || !this.reactRootId) {\n return;\n }\n\n // Prevent concurrent renders\n if (this.isRendering) {\n this.pendingRender = true;\n return;\n }\n\n const context = this.reactBridge.getCurrentContext();\n if (!context) {\n return;\n }\n\n this.isRendering = true;\n const { React } = context;\n \n // Resolve components with the correct version using runtime's resolver\n const components = await this.resolveComponentsWithVersion(this.component, this.componentVersion);\n \n // Create callbacks once per component instance\n if (!this.currentCallbacks) {\n this.currentCallbacks = this.createCallbacks();\n }\n \n // Build props with savedUserSettings pattern\n const props = {\n utilities: this.utilities, // Now uses getter which auto-initializes if needed\n callbacks: this.currentCallbacks,\n components,\n styles: this.styles as any,\n savedUserSettings: this._savedUserSettings,\n onSaveUserSettings: this.handleSaveUserSettings.bind(this)\n };\n\n // Validate component before creating element\n if (!this.compiledComponent.component) {\n LogError(`Component is undefined for ${this.component.name} during render`);\n return;\n }\n \n // Components should be functions after HOC wrapping\n if (typeof this.compiledComponent.component !== 'function') {\n LogError(`Component is not a function for ${this.component.name}: ${typeof this.compiledComponent.component}`);\n return;\n }\n\n // Create error boundary\n const ErrorBoundary = createErrorBoundary(React, {\n onError: this.handleReactError.bind(this),\n logErrors: true,\n recovery: 'retry'\n });\n\n // Create element with error boundary\n const element = React.createElement(\n ErrorBoundary,\n null,\n React.createElement(this.compiledComponent.component, props)\n );\n\n // Render with timeout protection using resource manager\n const timeoutId = resourceManager.setTimeout(\n this.componentId,\n () => {\n // Check if still rendering and not destroyed\n if (this.isRendering && !this.isDestroying) {\n this.componentEvent.emit({\n type: 'error',\n payload: {\n error: 'Component render timeout - possible infinite loop detected',\n source: 'render'\n }\n });\n }\n },\n 5000,\n { purpose: 'render-timeout-protection' }\n );\n\n // Use managed React root for rendering\n reactRootManager.render(\n this.reactRootId,\n element,\n () => {\n // Clear the timeout as render completed\n resourceManager.clearTimeout(this.componentId, timeoutId);\n \n // Don't update state if component is destroyed\n if (this.isDestroying) {\n return;\n }\n \n this.isRendering = false;\n \n // If there was a pending render request, execute it now\n if (this.pendingRender) {\n this.pendingRender = false;\n this.renderComponent();\n }\n }\n );\n }\n\n /**\n * Create callbacks for the React component\n */\n private createCallbacks(): ComponentCallbacks {\n return {\n RegisterMethod: (_methodName: string, _handler: any) => {\n // The component compiler wrapper will handle this internally\n // This is just a placeholder to satisfy the interface\n // The actual registration happens in the wrapper component\n },\n OpenEntityRecord: async (entityName: string, key: CompositeKey) => {\n let keyToUse: CompositeKey | null = null;\n if (key instanceof Array) {\n keyToUse = CompositeKey.FromKeyValuePairs(key);\n }\n else if (typeof key === 'object' && !!key.GetValueByFieldName) {\n keyToUse = key as CompositeKey;\n }\n else if (typeof key === 'object') {\n //} && !!key.FieldName && !!key.Value) {\n // possible that have an object that is a simple key/value pair with\n // FieldName and value properties\n const keyAny = key as any;\n if (keyAny.FieldName && keyAny.Value) {\n keyToUse = CompositeKey.FromKeyValuePairs([keyAny as KeyValuePair]);\n }\n }\n if (keyToUse) {\n // now in some cases we have key/value pairs that the component we are hosting\n // use, but are not the pkey, so if that is the case, we'll run a quick view to try\n // and get the pkey so that we can emit the openEntityRecord call with the pkey\n const md = new Metadata();\n const e = md.EntityByName(entityName);\n let shouldRunView = false;\n // now check each key in the keyToUse to see if it is a pkey\n for (const singleKey of keyToUse.KeyValuePairs) {\n const field = e.Fields.find(f => f.Name.trim().toLowerCase() === singleKey.FieldName.trim().toLowerCase());\n if (!field) {\n // if we get here this is a problem, the component has given us a non-matching field, this shouldn't ever happen\n // but if it doesn't log warning to console and exit\n console.warn(`Non-matching field found for key: ${JSON.stringify(keyToUse)}`);\n return;\n }\n else if (!field.IsPrimaryKey) {\n // if we get here that means we have a non-pkey so we'll want to do a lookup via a RunView\n // to get the actual pkey value\n shouldRunView = true;\n break;\n }\n }\n\n // if we get here and shouldRunView is true, we need to run a view using the info provided\n // by our contained component to get the pkey\n if (shouldRunView) {\n const rv = new RunView();\n const result = await rv.RunView({\n EntityName: entityName,\n ExtraFilter: keyToUse.ToWhereClause()\n })\n if (result && result.Success && result.Results.length > 0) {\n // we have a match, use the first row and update our keyToUse\n const kvPairs: KeyValuePair[] = [];\n e.PrimaryKeys.forEach(pk => {\n kvPairs.push(\n {\n FieldName: pk.Name,\n Value: result.Results[0][pk.Name]\n }\n )\n })\n keyToUse = CompositeKey.FromKeyValuePairs(kvPairs);\n }\n }\n\n this.openEntityRecord.emit({ entityName, key: keyToUse });\n } \n } \n };\n }\n\n /**\n * Handle React component errors\n */\n private handleReactError(error: any, errorInfo?: any) {\n LogError(`React component error: ${error?.toString() || 'Unknown error'}`, errorInfo);\n this.componentEvent.emit({\n type: 'error',\n payload: {\n error: error?.toString() || 'Unknown error',\n errorInfo,\n source: 'react'\n }\n });\n }\n\n /**\n * Handle onSaveUserSettings from components\n * This implements the SavedUserSettings pattern\n */\n private handleSaveUserSettings(newSettings: Record<string, any>) {\n // Just bubble the event up to parent containers for persistence\n // We don't need to store anything here\n this.userSettingsChanged.emit({\n settings: newSettings,\n componentName: this.component?.name,\n timestamp: new Date()\n });\n \n // DO NOT re-render the component!\n // The component already has the correct state - it's the one that told us about the change.\n // Re-rendering would cause unnecessary DOM updates and visual flashing.\n }\n\n /**\n * Clean up resources\n */\n private cleanup() {\n // Clean up all resources managed by resource manager\n resourceManager.cleanupComponent(this.componentId);\n \n // Clean up prop builder subscriptions\n if (this.currentCallbacks) {\n this.currentCallbacks = null;\n }\n \n // Unmount React root using managed unmount\n if (this.reactRootId) {\n // Force stop rendering flags\n this.isRendering = false;\n this.pendingRender = false;\n \n // This will handle waiting for render completion if needed\n reactRootManager.unmountRoot(this.reactRootId);\n this.reactRootId = null;\n }\n\n // Clear references\n this.compiledComponent = null;\n this.isInitialized = false;\n\n // Trigger registry cleanup\n this.adapter.getRegistry().cleanup();\n }\n\n /**\n * Public method to refresh the component\n * @deprecated Components manage their own state and data now\n */\n refresh() {\n // Check if the component has registered a refresh method\n if (this.compiledComponent?.refresh) {\n this.compiledComponent.refresh();\n } else {\n // Fallback: trigger a re-render if needed\n this.renderComponent();\n }\n }\n\n /**\n * Public method to update state programmatically\n * @param path - State path to update\n * @param value - New value\n * @deprecated Components manage their own state now\n */\n updateState(path: string, value: any) {\n // Just emit the event, don't manage state here\n this.stateChange.emit({ path, value });\n }\n\n // =================================================================\n // Standard Component Methods - Strongly Typed\n // =================================================================\n \n /**\n * Gets the current data state of the component\n * Used by AI agents to understand what data is currently displayed\n * @returns The current data state, or undefined if not implemented\n */\n getCurrentDataState(): any {\n return this.compiledComponent?.getCurrentDataState?.();\n }\n \n /**\n * Gets the history of data state changes in the component\n * @returns Array of timestamped state snapshots, or empty array if not implemented\n */\n getDataStateHistory(): Array<{ timestamp: Date; state: any }> {\n return this.compiledComponent?.getDataStateHistory?.() || [];\n }\n \n /**\n * Validates the current state of the component\n * @returns true if valid, false or validation errors otherwise\n */\n validate(): boolean | { valid: boolean; errors?: string[] } {\n return this.compiledComponent?.validate?.() || true;\n }\n \n /**\n * Checks if the component has unsaved changes\n * @returns true if dirty, false otherwise\n */\n isDirty(): boolean {\n return this.compiledComponent?.isDirty?.() || false;\n }\n \n /**\n * Resets the component to its initial state\n */\n reset(): void {\n this.compiledComponent?.reset?.();\n }\n \n /**\n * Scrolls to a specific element or position within the component\n * @param target - Element selector, element reference, or scroll options\n */\n scrollTo(target: string | HTMLElement | { top?: number; left?: number }): void {\n this.compiledComponent?.scrollTo?.(target);\n }\n \n /**\n * Sets focus to a specific element within the component\n * @param target - Element selector or element reference\n */\n focus(target?: string | HTMLElement): void {\n this.compiledComponent?.focus?.(target);\n }\n \n /**\n * Invokes a custom method on the component\n * @param methodName - Name of the method to invoke\n * @param args - Arguments to pass to the method\n * @returns The result of the method call, or undefined if method doesn't exist\n */\n invokeMethod(methodName: string, ...args: any[]): any {\n return this.compiledComponent?.invokeMethod?.(methodName, ...args);\n }\n \n /**\n * Checks if a method is available on the component\n * @param methodName - Name of the method to check\n * @returns true if the method exists\n */\n hasMethod(methodName: string): boolean {\n return this.compiledComponent?.hasMethod?.(methodName) || false;\n }\n \n /**\n * Print the component content\n * Uses component's print method if available, otherwise uses window.print()\n */\n print(): void {\n if (this.compiledComponent?.print) {\n this.compiledComponent.print();\n } else if (typeof window !== 'undefined' && window.print) {\n window.print();\n }\n }\n\n /**\n * Force clear component registries\n * Used by Component Studio for fresh loads\n * This is a static method that can be called without a component instance\n */\n public static forceClearRegistries(): void {\n // Clear React runtime's component registry service\n ComponentRegistryService.reset();\n \n // Clear any cached hierarchy registrar\n if (typeof window !== 'undefined' && (window as any).__MJ_COMPONENT_HIERARCHY_REGISTRAR__) {\n (window as any).__MJ_COMPONENT_HIERARCHY_REGISTRAR__ = null;\n }\n \n console.log('🧹 All component registries cleared for fresh load');\n }\n\n}"]}
1
+ {"version":3,"file":"mj-react-component.component.js","sourceRoot":"","sources":["../../../src/lib/components/mj-react-component.component.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Angular component that hosts React components with proper memory management.\n * Provides a bridge between Angular and React ecosystems in MemberJunction applications.\n * @module @memberjunction/ng-react\n */\n\nimport {\n Component,\n Input,\n Output,\n EventEmitter,\n ViewChild,\n ElementRef,\n AfterViewInit,\n OnDestroy,\n ChangeDetectionStrategy,\n ChangeDetectorRef\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { ComponentSpec, ComponentCallbacks, ComponentStyles, ComponentObject } from '@memberjunction/interactive-component-types';\nimport { ReactBridgeService } from '../services/react-bridge.service';\nimport { AngularAdapterService } from '../services/angular-adapter.service';\nimport { \n createErrorBoundary,\n ComponentHierarchyRegistrar,\n resourceManager,\n reactRootManager,\n ResolvedComponents,\n SetupStyles,\n ComponentRegistryService\n} from '@memberjunction/react-runtime';\nimport { createRuntimeUtilities } from '../utilities/runtime-utilities';\nimport { LogError, CompositeKey, KeyValuePair, Metadata, RunView } from '@memberjunction/core';\nimport { ComponentMetadataEngine } from '@memberjunction/core-entities';\n\n/**\n * Event emitted by React components\n */\nexport interface ReactComponentEvent {\n type: string;\n payload: any;\n}\n\n/**\n * State change event emitted when component state updates\n */\nexport interface StateChangeEvent {\n path: string;\n value: any;\n}\n\n/**\n * User settings changed event emitted when component saves user preferences\n */\nexport interface UserSettingsChangedEvent {\n settings: Record<string, any>;\n componentName?: string;\n timestamp: Date;\n}\n\n/**\n * Angular component that hosts React components with proper memory management.\n * This component provides a bridge between Angular and React, allowing React components\n * to be used seamlessly within Angular applications.\n */\n@Component({\n selector: 'mj-react-component',\n template: `\n <div class=\"react-component-wrapper\">\n <div #container class=\"react-component-container\" [class.loading]=\"!isInitialized\"></div>\n @if (!isInitialized && !hasError) {\n <div class=\"loading-overlay\">\n <div class=\"loading-spinner\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n </div>\n <div class=\"loading-text\">Loading component...</div>\n </div>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n .react-component-wrapper {\n position: relative;\n width: 100%;\n height: 100%;\n }\n .react-component-container {\n width: 100%;\n height: 100%;\n transition: opacity 0.3s ease;\n }\n .react-component-container.loading {\n opacity: 0;\n }\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n background-color: rgba(255, 255, 255, 0.9);\n z-index: 1;\n }\n .loading-spinner {\n font-size: 48px;\n color: #5B4FE9;\n margin-bottom: 16px;\n }\n .loading-text {\n font-family: -apple-system, BlinkMacSystemFont, \"Inter\", \"Segoe UI\", Roboto, sans-serif;\n font-size: 14px;\n color: #64748B;\n margin-top: 8px;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class MJReactComponent implements AfterViewInit, OnDestroy {\n @Input() component!: ComponentSpec;\n /**\n * Controls verbose logging for component lifecycle and operations.\n * Note: This does NOT control which React build (dev/prod) is loaded.\n * To control React builds, use ReactDebugConfig.setDebugMode() at app startup.\n */\n @Input() enableLogging: boolean = false;\n @Input() useComponentManager: boolean = true; // NEW: Use unified ComponentManager by default\n \n // Auto-initialize utilities if not provided\n private _utilities: any;\n @Input()\n set utilities(value: any) {\n this._utilities = value;\n }\n get utilities(): any {\n // Lazy initialization - only create default utilities when needed\n if (!this._utilities) {\n const runtimeUtils = createRuntimeUtilities();\n this._utilities = runtimeUtils.buildUtilities(this.enableLogging);\n if (this.enableLogging) {\n console.log('MJReactComponent: Auto-initialized utilities using createRuntimeUtilities()');\n }\n }\n return this._utilities;\n }\n \n // Auto-initialize styles if not provided\n private _styles?: Partial<ComponentStyles>;\n @Input()\n set styles(value: Partial<ComponentStyles> | undefined) {\n this._styles = value;\n }\n get styles(): Partial<ComponentStyles> {\n // Lazy initialization - only create default styles when needed\n if (!this._styles) {\n this._styles = SetupStyles();\n if (this.enableLogging) {\n console.log('MJReactComponent: Auto-initialized styles using SetupStyles()');\n }\n }\n return this._styles;\n }\n \n private _savedUserSettings: any = {};\n @Input()\n set savedUserSettings(value: any) {\n this._savedUserSettings = value || {};\n // Re-render if component is initialized\n if (this.isInitialized) {\n this.renderComponent();\n }\n }\n get savedUserSettings(): any {\n return this._savedUserSettings;\n }\n \n @Output() stateChange = new EventEmitter<StateChangeEvent>();\n @Output() componentEvent = new EventEmitter<ReactComponentEvent>();\n @Output() refreshData = new EventEmitter<void>();\n @Output() openEntityRecord = new EventEmitter<{ entityName: string; key: CompositeKey }>();\n @Output() userSettingsChanged = new EventEmitter<UserSettingsChangedEvent>();\n \n @ViewChild('container', { read: ElementRef, static: true }) container!: ElementRef<HTMLDivElement>;\n \n private reactRootId: string | null = null;\n private compiledComponent: ComponentObject | null = null;\n private loadedDependencies: Record<string, ComponentObject> = {};\n private destroyed$ = new Subject<void>();\n private currentCallbacks: ComponentCallbacks | null = null;\n isInitialized = false;\n private isRendering = false;\n private pendingRender = false;\n private isDestroying = false;\n private componentId: string;\n private componentVersion: string = ''; // Store the version for resolver\n hasError = false;\n \n /**\n * Public property containing the fully resolved component specification.\n * This includes all external code fetched from registries, allowing consumers\n * to inspect the complete resolved specification including dependencies.\n * Only populated after successful component initialization.\n */\n public resolvedComponentSpec: ComponentSpec | null = null;\n\n constructor(\n private reactBridge: ReactBridgeService,\n private adapter: AngularAdapterService,\n private cdr: ChangeDetectorRef\n ) {\n // Generate unique component ID for resource tracking\n this.componentId = `mj-react-component-${Date.now()}-${Math.random()}`;\n }\n\n async ngAfterViewInit() {\n // Try to get registry size safely\n let registrySize = 'N/A';\n try {\n if (this.adapter.isInitialized()) {\n registrySize = this.adapter.getRegistry().size().toString();\n } else {\n registrySize = 'Not initialized yet';\n }\n } catch (e) {\n registrySize = 'Not available';\n }\n \n console.log(`🎬 [ngAfterViewInit] Starting component initialization:`, {\n componentId: this.componentId,\n componentName: this.component?.name,\n timestamp: new Date().toISOString(),\n registrySize: registrySize\n });\n \n // Trigger change detection to show loading state\n this.cdr.detectChanges();\n await this.initializeComponent();\n }\n\n ngOnDestroy() {\n // Set destroying flag immediately\n this.isDestroying = true;\n \n // Cancel any pending renders\n this.pendingRender = false;\n \n this.destroyed$.next();\n this.destroyed$.complete();\n this.cleanup();\n }\n\n\n /**\n * Initialize the React component\n */\n private async initializeComponent() {\n try {\n console.log(`🔄 [initializeComponent] Starting initialization for ${this.component?.name}:`, {\n location: this.component?.location,\n registry: this.component?.registry,\n hasCode: !!this.component?.code,\n browserRefreshed: performance.navigation.type === 1,\n performanceType: performance.navigation.type\n });\n \n // Ensure React is loaded\n await this.reactBridge.getReactContext();\n \n // Wait for React to be fully ready (handles first-load delay)\n await this.reactBridge.waitForReactReady();\n \n // NEW: Use ComponentManager if enabled (default: true)\n if (this.useComponentManager) {\n console.log(`🎯 [initializeComponent] Using NEW ComponentManager approach`);\n await this.loadComponentWithManager();\n \n // Component is already compiled and stored in this.compiledComponent\n // No need to fetch from registry - it's already set\n } else {\n console.log(`📦 [initializeComponent] Using legacy approach (will be deprecated)`);\n // Register component hierarchy (this compiles and registers all components including from registries)\n await this.registerComponentHierarchy();\n \n // The resolved spec should now be available from the registration result\n // No need to fetch again\n \n // Get the already-registered component from the registry\n const registry = this.adapter.getRegistry();\n \n console.log(`🔍 [initializeComponent] Looking for component in registry:`, {\n name: this.component.name,\n namespace: this.component.namespace || 'Global',\n version: this.componentVersion\n });\n \n // Let's also check what's actually in the registry\n // Note: ComponentRegistry doesn't have a list() method, so we'll skip this for now\n \n const componentWrapper = registry.get(\n this.component.name, \n this.component.namespace || 'Global', \n this.componentVersion\n );\n \n console.log(`🔍 [initializeComponent] Registry.get result:`, {\n found: !!componentWrapper,\n type: componentWrapper ? typeof componentWrapper : 'undefined',\n hasComponent: componentWrapper ? !!componentWrapper.component : false\n });\n \n if (!componentWrapper) {\n const source = this.component.registry ? `external registry ${this.component.registry}` : 'local registry';\n console.error(`❌ [initializeComponent] Component not found! Details:`, {\n searchedName: this.component.name,\n searchedNamespace: this.component.namespace || 'Global',\n searchedVersion: this.componentVersion,\n source: source\n });\n throw new Error(`Component ${this.component.name} was not found in registry after registration from ${source}`);\n }\n \n // The registry now stores ComponentObjects directly\n // Validate it has the expected structure\n if (!componentWrapper || typeof componentWrapper !== 'object') {\n throw new Error(`Invalid component wrapper returned for ${this.component.name}: ${typeof componentWrapper}`);\n }\n \n if (!componentWrapper.component) {\n throw new Error(`Component wrapper missing 'component' property for ${this.component.name}`);\n }\n \n // Now that we use a regular HOC wrapper, components should always be functions\n if (typeof componentWrapper.component !== 'function') {\n throw new Error(`Component is not a function for ${this.component.name}: ${typeof componentWrapper.component}`);\n }\n \n this.compiledComponent = componentWrapper;\n } // End of else block for legacy approach\n \n // Create managed React root\n const reactContext = this.reactBridge.getCurrentContext();\n if (!reactContext) {\n throw new Error('React context not available');\n }\n \n this.reactRootId = reactRootManager.createRoot(\n this.container.nativeElement,\n (container: HTMLElement) => reactContext.ReactDOM.createRoot(container),\n this.componentId\n );\n \n // Initial render\n this.renderComponent();\n this.isInitialized = true;\n \n // Trigger change detection since we're using OnPush\n this.cdr.detectChanges();\n \n } catch (error) {\n this.hasError = true;\n LogError(`Failed to initialize React component: ${error}`);\n this.componentEvent.emit({\n type: 'error',\n payload: {\n error: error instanceof Error ? error.message : String(error),\n source: 'initialization'\n }\n });\n // Trigger change detection to show error state\n this.cdr.detectChanges();\n }\n }\n \n\n /**\n * Generate a hash from component code for versioning\n * Uses a simple hash function that's fast and sufficient for version differentiation\n */\n private generateComponentHash(spec: ComponentSpec): string {\n // Collect all code from the component hierarchy\n const codeStrings: string[] = [];\n \n const collectCode = (s: ComponentSpec) => {\n if (s.code) {\n codeStrings.push(s.code);\n }\n if (s.dependencies) {\n for (const dep of s.dependencies) {\n collectCode(dep);\n }\n }\n };\n \n collectCode(spec);\n \n // Generate hash from concatenated code\n const fullCode = codeStrings.join('|');\n let hash = 0;\n for (let i = 0; i < fullCode.length; i++) {\n const char = fullCode.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n \n // Convert to hex string and take first 8 characters for readability\n const hexHash = Math.abs(hash).toString(16).padStart(8, '0').substring(0, 8);\n return `v${hexHash}`;\n }\n\n /**\n * Resolve components using the runtime's resolver\n */\n private async resolveComponentsWithVersion(spec: ComponentSpec, version: string, namespace: string = 'Global'): Promise<ResolvedComponents> {\n const resolver = this.adapter.getResolver();\n \n // Debug: Log what dependencies we're trying to resolve\n if (this.enableLogging) {\n console.log(`Resolving components for ${spec.name}. Dependencies:`, spec.dependencies);\n }\n \n // Use the runtime's resolver which now handles registry-based components\n const resolved = await resolver.resolveComponents(\n spec, \n namespace,\n Metadata.Provider.CurrentUser // Pass current user context for database operations\n );\n \n if (this.enableLogging) {\n console.log(`Resolved ${Object.keys(resolved).length} components for version ${version}:`, Object.keys(resolved));\n }\n return resolved;\n }\n\n\n /**\n * NEW: Load component using unified ComponentManager - MUCH SIMPLER!\n */\n private async loadComponentWithManager() {\n try {\n const manager = this.adapter.getComponentManager();\n \n console.log(`🚀 [ComponentManager] Loading component hierarchy: ${this.component.name}`);\n \n // Load the entire hierarchy with one simple call\n const result = await manager.loadHierarchy(this.component, {\n contextUser: Metadata.Provider.CurrentUser,\n defaultNamespace: 'Global',\n defaultVersion: this.component.version || this.generateComponentHash(this.component),\n returnType: 'both'\n });\n \n if (!result.success) {\n const errorMessages = result.errors.map(e => `${e.componentName}: ${e.message}`).join(', ');\n console.error(`❌ [ComponentManager] Failed to load hierarchy:`, errorMessages);\n throw new Error(`Component loading failed: ${errorMessages}`);\n }\n \n // Store the results (handle undefined values)\n this.resolvedComponentSpec = this.enrichSpecWithRegistryInfo(result.resolvedSpec || null);\n this.compiledComponent = result.rootComponent || null;\n this.componentVersion = result.resolvedSpec?.version || this.component.version || 'latest';\n \n // IMPORTANT: Store the loaded dependencies for use in renderComponent\n this.loadedDependencies = result.components || {};\n \n console.log(`✅ [ComponentManager] Successfully loaded hierarchy:`, {\n rootComponent: result.resolvedSpec?.name,\n loadedCount: result.loadedComponents.length,\n dependencies: Object.keys(this.loadedDependencies),\n stats: result.stats\n });\n \n // Component is ready to render\n return true;\n \n } catch (error) {\n console.error(`❌ [ComponentManager] Error loading component:`, error);\n throw error;\n }\n }\n\n /**\n * Register all components in the hierarchy\n * @deprecated Use loadComponentWithManager() instead\n */\n private async registerComponentHierarchy() {\n // Use semantic version from spec or generate hash-based version for uniqueness\n const version = this.component.version || this.generateComponentHash(this.component);\n this.componentVersion = version; // Store for use in resolver\n \n console.log(`🔍 [registerComponentHierarchy] Starting registration for ${this.component.name}@${version}`, {\n location: this.component.location,\n registry: this.component.registry,\n namespace: this.component.namespace,\n hasCode: !!this.component.code,\n codeLength: this.component.code?.length || 0\n });\n \n // Check if already registered to avoid duplication\n const registry = this.adapter.getRegistry();\n const checkNamespace = this.component.namespace || 'Global';\n \n console.log(`🔍 [registerComponentHierarchy] Checking registry for existing component:`, {\n name: this.component.name,\n namespace: checkNamespace,\n version: version,\n registrySize: registry.size(),\n registryId: registry.registryId || 'unknown'\n });\n \n // Log registry state for debugging\n console.log(`📦 [registerComponentHierarchy] Registry state:`, {\n totalSize: registry.size(),\n registryInstance: registry.registryId || 'unknown'\n });\n \n const existingComponent = registry.get(this.component.name, checkNamespace, version);\n \n if (existingComponent) {\n console.log(`⚠️ [registerComponentHierarchy] Component ${this.component.name}@${version} already registered!`, {\n existingType: typeof existingComponent,\n hasComponent: !!(existingComponent as any).component,\n registrationTime: (existingComponent as any).registeredAt || 'unknown',\n runtimeContextLibraries: Object.keys(this.adapter.getRuntimeContext().libraries || {})\n });\n \n // For registry components, we need to check the resolved spec's libraries, not the input spec\n // The input spec from Angular doesn't have library information for registry components\n if (this.component.location === 'registry' && this.component.registry) {\n console.log(`📋 [registerComponentHierarchy] Component is from registry, need to fetch full spec to check libraries`);\n // Continue to fetch the full spec below - don't return early\n } else {\n // For local components, check using the input spec\n const requiredLibraries = this.component.libraries || [];\n const runtimeLibraries = this.adapter.getRuntimeContext().libraries || {};\n const missingLibraries = requiredLibraries.filter(lib => !runtimeLibraries[lib.globalVariable]);\n \n if (missingLibraries.length > 0) {\n console.warn(`⚠️ [registerComponentHierarchy] Component registered but libraries missing:`, {\n required: requiredLibraries.map(l => l.globalVariable),\n loaded: Object.keys(runtimeLibraries),\n missing: missingLibraries.map(l => l.globalVariable)\n });\n // Don't return early - continue to load libraries\n } else {\n console.log(`✅ [registerComponentHierarchy] Component ${this.component.name}@${version} already registered with all libraries, skipping`);\n return;\n }\n }\n } else {\n console.log(`🆕 [registerComponentHierarchy] Component not found in registry, proceeding with registration`);\n }\n \n // Initialize metadata engine\n await ComponentMetadataEngine.Instance.Config(false, Metadata.Provider.CurrentUser);\n \n // Use the runtime's hierarchy registrar\n const registrar = new ComponentHierarchyRegistrar(\n this.adapter.getCompiler(),\n this.adapter.getRegistry(),\n this.adapter.getRuntimeContext()\n );\n \n console.log(`📦 [registerComponentHierarchy] Calling registrar.registerHierarchy for ${this.component.name}`, {\n hasStyles: !!this.styles,\n namespace: this.component.namespace || 'Global',\n version: version,\n libraryCount: ComponentMetadataEngine.Instance.ComponentLibraries?.length || 0,\n hasCode: !!this.component.code,\n codeLength: this.component.code?.length || 0\n });\n \n // Register with proper configuration\n // Pass the partial spec - the React runtime will handle fetching from registries\n const result = await registrar.registerHierarchy(\n this.component, // Pass the original spec, not fetched\n {\n styles: this.styles as ComponentStyles,\n namespace: this.component.namespace || 'Global',\n version: version,\n allowOverride: false, // Each version is unique\n allLibraries: ComponentMetadataEngine.Instance.ComponentLibraries,\n debug: true,\n contextUser: Metadata.Provider.CurrentUser\n }\n );\n \n if (!result.success) {\n const errors = result.errors.map(e => e.error).join(', ');\n console.error(`❌ [registerComponentHierarchy] Registration failed:`, errors);\n throw new Error(`Component registration failed: ${errors}`);\n }\n \n // Store the resolved spec from the registration result\n if (result.resolvedSpec) {\n this.resolvedComponentSpec = this.enrichSpecWithRegistryInfo(result.resolvedSpec || null);\n console.log(`📋 [registerComponentHierarchy] Received resolved spec from runtime:`, {\n name: result.resolvedSpec.name,\n hasCode: !!result.resolvedSpec.code,\n libraryCount: result.resolvedSpec.libraries?.length || 0,\n dependencyCount: result.resolvedSpec.dependencies?.length || 0\n });\n }\n \n console.log(`✅ [registerComponentHierarchy] Successfully registered ${result.registeredComponents.length} components:`, result.registeredComponents);\n \n // Verify the component is actually in the registry\n const verifyComponent = registry.get(this.component.name, this.component.namespace || 'Global', version);\n console.log(`🔍 [registerComponentHierarchy] Verification - component in registry after registration:`, {\n found: !!verifyComponent,\n name: this.component.name,\n namespace: this.component.namespace || 'Global',\n version: version,\n componentType: verifyComponent ? typeof verifyComponent : 'not found'\n });\n }\n\n /**\n * Post-process resolved spec to ensure all components show their true registry source.\n * This enriches the spec for UI display purposes to show where components actually came from.\n * Applied to all resolved specs so any consumer of this wrapper benefits.\n */\n private enrichSpecWithRegistryInfo(spec: ComponentSpec | null): ComponentSpec | null {\n if (!spec || !this.component) return spec;\n \n // Create a deep copy to avoid mutating the original\n const enrichedSpec = JSON.parse(JSON.stringify(spec));\n \n // Recursive function to process spec and all dependencies\n // Takes the original spec at the same level to find registry info\n const processSpec = (currentSpec: ComponentSpec, originalSpec: ComponentSpec) => {\n // If this component has code but shows location as 'embedded', \n // check the original spec to see where it came from\n if (currentSpec.code && currentSpec.location === 'embedded' && currentSpec.name) {\n // Try to find this component in the original spec at the same level\n // First check if the original spec itself matches by name\n if (originalSpec.name === currentSpec.name) {\n // Use the original's registry info if it had any\n if (originalSpec.location === 'registry' || originalSpec.registry) {\n currentSpec.location = 'registry';\n if (originalSpec.registry) {\n currentSpec.registry = originalSpec.registry;\n }\n if (originalSpec.namespace) {\n currentSpec.namespace = originalSpec.namespace;\n }\n }\n }\n \n // Also check in original's dependencies for a match\n if (originalSpec.dependencies) {\n const originalDep = originalSpec.dependencies.find(d => d.name === currentSpec.name);\n if (originalDep && (originalDep.location === 'registry' || originalDep.registry)) {\n currentSpec.location = 'registry';\n if (originalDep.registry) {\n currentSpec.registry = originalDep.registry;\n }\n if (originalDep.namespace) {\n currentSpec.namespace = originalDep.namespace;\n }\n }\n }\n }\n \n // Process all dependencies recursively\n if (currentSpec.dependencies && Array.isArray(currentSpec.dependencies)) {\n currentSpec.dependencies.forEach((dep, index) => {\n // Find the corresponding original dependency by name or use the one at same index\n let originalDep = originalSpec.dependencies?.find(d => d.name === dep.name);\n if (!originalDep && originalSpec.dependencies && index < originalSpec.dependencies.length) {\n originalDep = originalSpec.dependencies[index];\n }\n if (originalDep) {\n processSpec(dep, originalDep);\n }\n });\n }\n };\n \n processSpec(enrichedSpec, this.component);\n return enrichedSpec;\n }\n\n /**\n * Render the React component\n */\n private async renderComponent() {\n // Don't render if component is being destroyed\n if (this.isDestroying) {\n return;\n }\n \n if (!this.compiledComponent || !this.reactRootId) {\n return;\n }\n\n // Prevent concurrent renders\n if (this.isRendering) {\n this.pendingRender = true;\n return;\n }\n\n const context = this.reactBridge.getCurrentContext();\n if (!context) {\n return;\n }\n\n this.isRendering = true;\n const { React } = context;\n \n // Resolve components with the correct version using runtime's resolver\n // SKIP this if using ComponentManager - components are already loaded!\n let components = {};\n if (!this.useComponentManager) {\n components = await this.resolveComponentsWithVersion(this.component, this.componentVersion);\n } else {\n // Use the dependencies that were already loaded and unwrapped by ComponentManager\n components = this.loadedDependencies;\n console.log(`🎯 [renderComponent] Using dependencies from ComponentManager:`, Object.keys(components));\n }\n \n // Create callbacks once per component instance\n if (!this.currentCallbacks) {\n this.currentCallbacks = this.createCallbacks();\n }\n \n // Get libraries from runtime context\n const runtimeContext = this.adapter.getRuntimeContext();\n const libraries = runtimeContext.libraries || {};\n \n // Build props with savedUserSettings pattern\n const props = {\n utilities: this.utilities, // Now uses getter which auto-initializes if needed\n callbacks: this.currentCallbacks,\n components,\n styles: this.styles as any,\n libraries, // Pass the loaded libraries to components\n savedUserSettings: this._savedUserSettings,\n onSaveUserSettings: this.handleSaveUserSettings.bind(this)\n };\n\n // Validate component before creating element\n if (!this.compiledComponent.component) {\n LogError(`Component is undefined for ${this.component.name} during render`);\n return;\n }\n \n // Components should be functions after HOC wrapping\n if (typeof this.compiledComponent.component !== 'function') {\n LogError(`Component is not a function for ${this.component.name}: ${typeof this.compiledComponent.component}`);\n return;\n }\n\n // Create error boundary\n const ErrorBoundary = createErrorBoundary(React, {\n onError: this.handleReactError.bind(this),\n logErrors: true,\n recovery: 'retry'\n });\n\n // Create element with error boundary\n const element = React.createElement(\n ErrorBoundary,\n null,\n React.createElement(this.compiledComponent.component, props)\n );\n\n // Render with timeout protection using resource manager\n const timeoutId = resourceManager.setTimeout(\n this.componentId,\n () => {\n // Check if still rendering and not destroyed\n if (this.isRendering && !this.isDestroying) {\n this.componentEvent.emit({\n type: 'error',\n payload: {\n error: 'Component render timeout - possible infinite loop detected',\n source: 'render'\n }\n });\n }\n },\n 5000,\n { purpose: 'render-timeout-protection' }\n );\n\n // Use managed React root for rendering\n reactRootManager.render(\n this.reactRootId,\n element,\n () => {\n // Clear the timeout as render completed\n resourceManager.clearTimeout(this.componentId, timeoutId);\n \n // Don't update state if component is destroyed\n if (this.isDestroying) {\n return;\n }\n \n this.isRendering = false;\n \n // If there was a pending render request, execute it now\n if (this.pendingRender) {\n this.pendingRender = false;\n this.renderComponent();\n }\n }\n );\n }\n\n /**\n * Create callbacks for the React component\n */\n private createCallbacks(): ComponentCallbacks {\n return {\n RegisterMethod: (_methodName: string, _handler: any) => {\n // The component compiler wrapper will handle this internally\n // This is just a placeholder to satisfy the interface\n // The actual registration happens in the wrapper component\n },\n OpenEntityRecord: async (entityName: string, key: CompositeKey) => {\n let keyToUse: CompositeKey | null = null;\n if (key instanceof Array) {\n keyToUse = CompositeKey.FromKeyValuePairs(key);\n }\n else if (typeof key === 'object' && !!key.GetValueByFieldName) {\n keyToUse = key as CompositeKey;\n }\n else if (typeof key === 'object') {\n //} && !!key.FieldName && !!key.Value) {\n // possible that have an object that is a simple key/value pair with\n // FieldName and value properties\n const keyAny = key as any;\n if (keyAny.FieldName && keyAny.Value) {\n keyToUse = CompositeKey.FromKeyValuePairs([keyAny as KeyValuePair]);\n }\n }\n if (keyToUse) {\n // now in some cases we have key/value pairs that the component we are hosting\n // use, but are not the pkey, so if that is the case, we'll run a quick view to try\n // and get the pkey so that we can emit the openEntityRecord call with the pkey\n const md = new Metadata();\n const e = md.EntityByName(entityName);\n let shouldRunView = false;\n // now check each key in the keyToUse to see if it is a pkey\n for (const singleKey of keyToUse.KeyValuePairs) {\n const field = e.Fields.find(f => f.Name.trim().toLowerCase() === singleKey.FieldName.trim().toLowerCase());\n if (!field) {\n // if we get here this is a problem, the component has given us a non-matching field, this shouldn't ever happen\n // but if it doesn't log warning to console and exit\n console.warn(`Non-matching field found for key: ${JSON.stringify(keyToUse)}`);\n return;\n }\n else if (!field.IsPrimaryKey) {\n // if we get here that means we have a non-pkey so we'll want to do a lookup via a RunView\n // to get the actual pkey value\n shouldRunView = true;\n break;\n }\n }\n\n // if we get here and shouldRunView is true, we need to run a view using the info provided\n // by our contained component to get the pkey\n if (shouldRunView) {\n const rv = new RunView();\n const result = await rv.RunView({\n EntityName: entityName,\n ExtraFilter: keyToUse.ToWhereClause()\n })\n if (result && result.Success && result.Results.length > 0) {\n // we have a match, use the first row and update our keyToUse\n const kvPairs: KeyValuePair[] = [];\n e.PrimaryKeys.forEach(pk => {\n kvPairs.push(\n {\n FieldName: pk.Name,\n Value: result.Results[0][pk.Name]\n }\n )\n })\n keyToUse = CompositeKey.FromKeyValuePairs(kvPairs);\n }\n }\n\n this.openEntityRecord.emit({ entityName, key: keyToUse });\n } \n } \n };\n }\n\n /**\n * Handle React component errors\n */\n private handleReactError(error: any, errorInfo?: any) {\n LogError(`React component error: ${error?.toString() || 'Unknown error'}`, errorInfo);\n this.componentEvent.emit({\n type: 'error',\n payload: {\n error: error?.toString() || 'Unknown error',\n errorInfo,\n source: 'react'\n }\n });\n }\n\n /**\n * Handle onSaveUserSettings from components\n * This implements the SavedUserSettings pattern\n */\n private handleSaveUserSettings(newSettings: Record<string, any>) {\n // Just bubble the event up to parent containers for persistence\n // We don't need to store anything here\n this.userSettingsChanged.emit({\n settings: newSettings,\n componentName: this.component?.name,\n timestamp: new Date()\n });\n \n // DO NOT re-render the component!\n // The component already has the correct state - it's the one that told us about the change.\n // Re-rendering would cause unnecessary DOM updates and visual flashing.\n }\n\n /**\n * Clean up resources\n */\n private cleanup() {\n // Clean up all resources managed by resource manager\n resourceManager.cleanupComponent(this.componentId);\n \n // Clean up prop builder subscriptions\n if (this.currentCallbacks) {\n this.currentCallbacks = null;\n }\n \n // Unmount React root using managed unmount\n if (this.reactRootId) {\n // Force stop rendering flags\n this.isRendering = false;\n this.pendingRender = false;\n \n // This will handle waiting for render completion if needed\n reactRootManager.unmountRoot(this.reactRootId);\n this.reactRootId = null;\n }\n\n // Clear references\n this.compiledComponent = null;\n this.isInitialized = false;\n\n // Trigger registry cleanup\n this.adapter.getRegistry().cleanup();\n }\n\n /**\n * Public method to refresh the component\n * @deprecated Components manage their own state and data now\n */\n refresh() {\n // Check if the component has registered a refresh method\n if (this.compiledComponent?.refresh) {\n this.compiledComponent.refresh();\n } else {\n // Fallback: trigger a re-render if needed\n this.renderComponent();\n }\n }\n\n /**\n * Public method to update state programmatically\n * @param path - State path to update\n * @param value - New value\n * @deprecated Components manage their own state now\n */\n updateState(path: string, value: any) {\n // Just emit the event, don't manage state here\n this.stateChange.emit({ path, value });\n }\n\n // =================================================================\n // Standard Component Methods - Strongly Typed\n // =================================================================\n \n /**\n * Gets the current data state of the component\n * Used by AI agents to understand what data is currently displayed\n * @returns The current data state, or undefined if not implemented\n */\n getCurrentDataState(): any {\n return this.compiledComponent?.getCurrentDataState?.();\n }\n \n /**\n * Gets the history of data state changes in the component\n * @returns Array of timestamped state snapshots, or empty array if not implemented\n */\n getDataStateHistory(): Array<{ timestamp: Date; state: any }> {\n return this.compiledComponent?.getDataStateHistory?.() || [];\n }\n \n /**\n * Validates the current state of the component\n * @returns true if valid, false or validation errors otherwise\n */\n validate(): boolean | { valid: boolean; errors?: string[] } {\n return this.compiledComponent?.validate?.() || true;\n }\n \n /**\n * Checks if the component has unsaved changes\n * @returns true if dirty, false otherwise\n */\n isDirty(): boolean {\n return this.compiledComponent?.isDirty?.() || false;\n }\n \n /**\n * Resets the component to its initial state\n */\n reset(): void {\n this.compiledComponent?.reset?.();\n }\n \n /**\n * Scrolls to a specific element or position within the component\n * @param target - Element selector, element reference, or scroll options\n */\n scrollTo(target: string | HTMLElement | { top?: number; left?: number }): void {\n this.compiledComponent?.scrollTo?.(target);\n }\n \n /**\n * Sets focus to a specific element within the component\n * @param target - Element selector or element reference\n */\n focus(target?: string | HTMLElement): void {\n this.compiledComponent?.focus?.(target);\n }\n \n /**\n * Invokes a custom method on the component\n * @param methodName - Name of the method to invoke\n * @param args - Arguments to pass to the method\n * @returns The result of the method call, or undefined if method doesn't exist\n */\n invokeMethod(methodName: string, ...args: any[]): any {\n return this.compiledComponent?.invokeMethod?.(methodName, ...args);\n }\n \n /**\n * Checks if a method is available on the component\n * @param methodName - Name of the method to check\n * @returns true if the method exists\n */\n hasMethod(methodName: string): boolean {\n return this.compiledComponent?.hasMethod?.(methodName) || false;\n }\n \n /**\n * Print the component content\n * Uses component's print method if available, otherwise uses window.print()\n */\n print(): void {\n if (this.compiledComponent?.print) {\n this.compiledComponent.print();\n } else if (typeof window !== 'undefined' && window.print) {\n window.print();\n }\n }\n\n /**\n * Force clear component registries\n * Used by Component Studio for fresh loads\n * This is a static method that can be called without a component instance\n */\n public static forceClearRegistries(): void {\n // Clear React runtime's component registry service\n ComponentRegistryService.reset();\n \n // Clear any cached hierarchy registrar\n if (typeof window !== 'undefined' && (window as any).__MJ_COMPONENT_HIERARCHY_REGISTRAR__) {\n (window as any).__MJ_COMPONENT_HIERARCHY_REGISTRAR__ = null;\n }\n \n console.log('🧹 All component registries cleared for fresh load');\n }\n\n}"]}
@@ -1,4 +1,4 @@
1
- import { ComponentCompiler, ComponentRegistry, ComponentResolver, CompileOptions, RuntimeContext, ExternalLibraryConfig, LibraryConfiguration } from '@memberjunction/react-runtime';
1
+ import { ComponentCompiler, ComponentRegistry, ComponentResolver, ComponentManager, CompileOptions, RuntimeContext, ExternalLibraryConfig, LibraryConfiguration } from '@memberjunction/react-runtime';
2
2
  import { ScriptLoaderService } from './script-loader.service';
3
3
  import * as i0 from "@angular/core";
4
4
  /**
@@ -42,6 +42,11 @@ export declare class AngularAdapterService {
42
42
  * @returns Runtime context with React and libraries
43
43
  */
44
44
  getRuntimeContext(): RuntimeContext;
45
+ /**
46
+ * Get the unified component manager
47
+ * @returns Component manager instance
48
+ */
49
+ getComponentManager(): ComponentManager;
45
50
  /**
46
51
  * Compile a component with Angular-specific defaults
47
52
  * @param options - Compilation options
@@ -110,6 +110,16 @@ export class AngularAdapterService {
110
110
  }
111
111
  return this.runtimeContext;
112
112
  }
113
+ /**
114
+ * Get the unified component manager
115
+ * @returns Component manager instance
116
+ */
117
+ getComponentManager() {
118
+ if (!this.runtime) {
119
+ throw new Error('React runtime not initialized. Call initialize() first.');
120
+ }
121
+ return this.runtime.manager;
122
+ }
113
123
  /**
114
124
  * Compile a component with Angular-specific defaults
115
125
  * @param options - Compilation options
@@ -1 +1 @@
1
- {"version":3,"file":"angular-adapter.service.js","sourceRoot":"","sources":["../../../src/lib/services/angular-adapter.service.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Angular adapter service that bridges the React runtime with Angular.\n * Provides Angular-specific functionality for the platform-agnostic React runtime.\n * @module @memberjunction/ng-react\n */\n\nimport { Injectable } from '@angular/core';\nimport { \n ComponentCompiler,\n ComponentRegistry,\n ComponentResolver,\n createReactRuntime,\n CompileOptions,\n RuntimeContext,\n ExternalLibraryConfig,\n LibraryConfiguration,\n SetupStyles\n} from '@memberjunction/react-runtime';\nimport { ScriptLoaderService } from './script-loader.service';\nimport { ComponentStyles } from '@memberjunction/interactive-component-types';\n\n/**\n * Angular-specific adapter for the React runtime.\n * Manages the integration between Angular services and the platform-agnostic React runtime.\n */\n@Injectable({ providedIn: 'root' })\nexport class AngularAdapterService {\n private runtime?: {\n compiler: ComponentCompiler;\n registry: ComponentRegistry;\n resolver: ComponentResolver;\n version: string;\n };\n private runtimeContext?: RuntimeContext;\n private initializationPromise: Promise<void> | undefined;\n\n constructor(private scriptLoader: ScriptLoaderService) {}\n\n /**\n * Initialize the React runtime with Angular-specific configuration\n * @param config Optional library configuration\n * @param additionalLibraries Optional additional libraries to merge\n * @param options Optional options including debug flag\n * @returns Promise resolving when runtime is ready\n */\n async initialize(\n config?: LibraryConfiguration,\n additionalLibraries?: ExternalLibraryConfig[],\n options?: { debug?: boolean }\n ): Promise<void> {\n if (this.runtime) {\n return; // Already initialized\n }\n if (this.initializationPromise) {\n return this.initializationPromise; // in progress\n }\n\n // Start initialization and store the promise immediately\n this.initializationPromise = this.doInitialize(config, additionalLibraries, options);\n\n try {\n await this.initializationPromise;\n } catch (error) {\n // Clear the promise on error so it can be retried\n this.initializationPromise = undefined;\n throw error;\n }\n\n return;\n }\n\n private async doInitialize(\n config?: LibraryConfiguration,\n additionalLibraries?: ExternalLibraryConfig[],\n options?: { debug?: boolean }\n ): Promise<void> {\n // Load React ecosystem with optional additional libraries\n const ecosystem = await this.scriptLoader.loadReactEcosystem(config, additionalLibraries, options);\n \n // Create runtime context\n this.runtimeContext = {\n React: ecosystem.React,\n ReactDOM: ecosystem.ReactDOM,\n libraries: ecosystem.libraries,\n utilities: {\n // Add any Angular-specific utilities here\n }\n };\n\n // Create the React runtime with runtime context for registry support\n this.runtime = createReactRuntime(ecosystem.Babel, {\n compiler: {\n cache: true,\n maxCacheSize: 100,\n debug: options?.debug\n },\n registry: {\n maxComponents: 1000,\n cleanupInterval: 60000,\n useLRU: true,\n enableNamespaces: true,\n debug: options?.debug\n }\n }, this.runtimeContext, options?.debug);\n }\n\n /**\n * Get the component compiler\n * @returns Component compiler instance\n */\n getCompiler(): ComponentCompiler {\n if (!this.runtime) {\n throw new Error('React runtime not initialized. Call initialize() first.');\n }\n return this.runtime.compiler;\n }\n\n /**\n * Get the component registry\n * @returns Component registry instance\n */\n getRegistry(): ComponentRegistry {\n if (!this.runtime) {\n throw new Error('React runtime not initialized. Call initialize() first.');\n }\n return this.runtime.registry;\n }\n\n /**\n * Get the component resolver\n * @returns Component resolver instance\n */\n getResolver(): ComponentResolver {\n if (!this.runtime) {\n throw new Error('React runtime not initialized. Call initialize() first.');\n }\n return this.runtime.resolver;\n }\n\n /**\n * Get the runtime context\n * @returns Runtime context with React and libraries\n */\n getRuntimeContext(): RuntimeContext {\n if (!this.runtimeContext) {\n throw new Error('React runtime not initialized. Call initialize() first.');\n }\n return this.runtimeContext;\n }\n\n\n /**\n * Compile a component with Angular-specific defaults\n * @param options - Compilation options\n * @returns Promise resolving to compilation result\n */\n async compileComponent(options: CompileOptions) {\n // Validate options before initialization\n if (!options) {\n throw new Error(\n 'Angular adapter error: No compilation options provided.\\n' +\n 'This usually means the component spec is null or undefined.\\n' +\n 'Please check that:\\n' +\n '1. Your component data is loaded properly\\n' +\n '2. The component spec has \"name\" and \"code\" properties\\n' +\n '3. The component input is not undefined'\n );\n }\n\n if (!options.componentName || options.componentName.trim() === '') {\n throw new Error(\n 'Angular adapter error: Component name is missing or empty.\\n' +\n `Received options: ${JSON.stringify(options, null, 2)}\\n` +\n 'Make sure your component spec includes a \"name\" property.'\n );\n }\n\n if (!options.componentCode || options.componentCode.trim() === '') {\n throw new Error(\n `Angular adapter error: Component code is missing or empty for component \"${options.componentName}\".\\n` +\n 'Make sure your component spec includes a \"code\" property with the React component source.'\n );\n }\n\n await this.initialize();\n \n // Apply default styles if not provided\n const optionsWithDefaults = {\n ...options,\n styles: options.styles || SetupStyles()\n };\n\n return this.runtime!.compiler.compile(optionsWithDefaults);\n }\n\n /**\n * Register a component in the registry\n * @param name - Component name\n * @param component - Compiled component\n * @param namespace - Component namespace\n * @param version - Component version\n * @returns Component metadata\n */\n registerComponent(\n name: string,\n component: any,\n namespace: string = 'Global',\n version: string = 'v1'\n ) {\n if (!this.runtime) {\n throw new Error('React runtime not initialized. Call initialize() first.');\n }\n return this.runtime.registry.register(name, component, namespace, version);\n }\n\n /**\n * Get a component from the registry\n * @param name - Component name\n * @param namespace - Component namespace\n * @param version - Component version\n * @returns Component if found\n */\n getComponent(name: string, namespace: string = 'Global', version?: string) {\n if (!this.runtime) {\n throw new Error('React runtime not initialized. Call initialize() first.');\n }\n return this.runtime.registry.get(name, namespace, version);\n }\n\n /**\n * Check if runtime is initialized\n * @returns true if initialized\n */\n isInitialized(): boolean {\n return !!this.runtime && !!this.runtimeContext;\n }\n\n /**\n * Get runtime version\n * @returns Runtime version string\n */\n getVersion(): string {\n return this.runtime?.version || 'unknown';\n }\n\n /**\n * Clean up resources\n */\n destroy(): void {\n if (this.runtime) {\n this.runtime.registry.destroy();\n this.runtime = undefined;\n this.runtimeContext = undefined;\n }\n }\n\n /**\n * Get Babel instance for direct use\n * @returns Babel instance\n */\n getBabel(): any {\n return this.runtimeContext?.libraries?.Babel || (window as any).Babel;\n }\n\n /**\n * Transpile JSX code directly\n * @param code - JSX code to transpile\n * @param filename - Optional filename for better error messages\n * @returns Transpiled JavaScript code\n */\n transpileJSX(code: string, filename?: string): string {\n const babel = this.getBabel();\n if (!babel) {\n throw new Error('Babel not loaded. Initialize the runtime first.');\n }\n\n try {\n const result = babel.transform(code, {\n presets: ['react'],\n filename: filename || 'component.jsx'\n });\n return result.code;\n } catch (error: any) {\n throw new Error(`Failed to transpile JSX: ${error.message}`);\n }\n }\n}"]}
1
+ {"version":3,"file":"angular-adapter.service.js","sourceRoot":"","sources":["../../../src/lib/services/angular-adapter.service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAKL,kBAAkB,EAKlB,WAAW,EACZ,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;;;AAG9D;;;GAGG;AAEH,MAAM,OAAO,qBAAqB;IAWhC,YAAoB,YAAiC;QAAjC,iBAAY,GAAZ,YAAY,CAAqB;IAAG,CAAC;IAEzD;;;;;;OAMG;IACH,KAAK,CAAC,UAAU,CACd,MAA6B,EAC7B,mBAA6C,EAC7C,OAA6B;QAE7B,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,CAAC,sBAAsB;QAChC,CAAC;QACD,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC,qBAAqB,CAAC,CAAC,cAAc;QACnD,CAAC;QAED,yDAAyD;QACzD,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,mBAAmB,EAAE,OAAO,CAAC,CAAC;QAErF,IAAI,CAAC;YACD,MAAM,IAAI,CAAC,qBAAqB,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,kDAAkD;YAClD,IAAI,CAAC,qBAAqB,GAAG,SAAS,CAAC;YACvC,MAAM,KAAK,CAAC;QAChB,CAAC;QAED,OAAO;IACT,CAAC;IAEO,KAAK,CAAC,YAAY,CACxB,MAA6B,EAC7B,mBAA6C,EAC7C,OAA6B;QAE7B,0DAA0D;QAC1D,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,EAAE,OAAO,CAAC,CAAC;QAEnG,yBAAyB;QACzB,IAAI,CAAC,cAAc,GAAG;YACpB,KAAK,EAAE,SAAS,CAAC,KAAK;YACtB,QAAQ,EAAE,SAAS,CAAC,QAAQ;YAC5B,SAAS,EAAE,SAAS,CAAC,SAAS;YAC9B,SAAS,EAAE;YACT,0CAA0C;aAC3C;SACF,CAAC;QAEF,qEAAqE;QACrE,IAAI,CAAC,OAAO,GAAG,kBAAkB,CAAC,SAAS,CAAC,KAAK,EAAE;YACjD,QAAQ,EAAE;gBACR,KAAK,EAAE,IAAI;gBACX,YAAY,EAAE,GAAG;gBACjB,KAAK,EAAE,OAAO,EAAE,KAAK;aACtB;YACD,QAAQ,EAAE;gBACR,aAAa,EAAE,IAAI;gBACnB,eAAe,EAAE,KAAK;gBACtB,MAAM,EAAE,IAAI;gBACZ,gBAAgB,EAAE,IAAI;gBACtB,KAAK,EAAE,OAAO,EAAE,KAAK;aACtB;SACF,EAAE,IAAI,CAAC,cAAc,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC;IAED;;;OAGG;IACH,WAAW;QACT,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACH,WAAW;QACT,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACH,WAAW;QACT,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACH,iBAAiB;QACf,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACH,mBAAmB;QACjB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;IAC9B,CAAC;IAGD;;;;OAIG;IACH,KAAK,CAAC,gBAAgB,CAAC,OAAuB;QAC5C,yCAAyC;QACzC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,2DAA2D;gBAC3D,+DAA+D;gBAC/D,sBAAsB;gBACtB,6CAA6C;gBAC7C,0DAA0D;gBAC1D,yCAAyC,CAC1C,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAClE,MAAM,IAAI,KAAK,CACb,8DAA8D;gBAC9D,qBAAqB,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI;gBACzD,2DAA2D,CAC5D,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAClE,MAAM,IAAI,KAAK,CACb,4EAA4E,OAAO,CAAC,aAAa,MAAM;gBACvG,2FAA2F,CAC5F,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAExB,uCAAuC;QACvC,MAAM,mBAAmB,GAAG;YAC1B,GAAG,OAAO;YACV,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,WAAW,EAAE;SACxC,CAAC;QAEF,OAAO,IAAI,CAAC,OAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC7D,CAAC;IAED;;;;;;;OAOG;IACH,iBAAiB,CACf,IAAY,EACZ,SAAc,EACd,YAAoB,QAAQ,EAC5B,UAAkB,IAAI;QAEtB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAC7E,CAAC;IAED;;;;;;OAMG;IACH,YAAY,CAAC,IAAY,EAAE,YAAoB,QAAQ,EAAE,OAAgB;QACvE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAC7D,CAAC;IAED;;;OAGG;IACH,aAAa;QACX,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;IACjD,CAAC;IAED;;;OAGG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,EAAE,OAAO,IAAI,SAAS,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,OAAO;QACL,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YAChC,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;YACzB,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;QAClC,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,cAAc,EAAE,SAAS,EAAE,KAAK,IAAK,MAAc,CAAC,KAAK,CAAC;IACxE,CAAC;IAED;;;;;OAKG;IACH,YAAY,CAAC,IAAY,EAAE,QAAiB;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACrE,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE;gBACnC,OAAO,EAAE,CAAC,OAAO,CAAC;gBAClB,QAAQ,EAAE,QAAQ,IAAI,eAAe;aACtC,CAAC,CAAC;YACH,OAAO,MAAM,CAAC,IAAI,CAAC;QACrB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,4BAA4B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;sFA/QU,qBAAqB;uEAArB,qBAAqB,WAArB,qBAAqB,mBADR,MAAM;;iFACnB,qBAAqB;cADjC,UAAU;eAAC,EAAE,UAAU,EAAE,MAAM,EAAE","sourcesContent":["/**\n * @fileoverview Angular adapter service that bridges the React runtime with Angular.\n * Provides Angular-specific functionality for the platform-agnostic React runtime.\n * @module @memberjunction/ng-react\n */\n\nimport { Injectable } from '@angular/core';\nimport { \n ComponentCompiler,\n ComponentRegistry,\n ComponentResolver,\n ComponentManager,\n createReactRuntime,\n CompileOptions,\n RuntimeContext,\n ExternalLibraryConfig,\n LibraryConfiguration,\n SetupStyles\n} from '@memberjunction/react-runtime';\nimport { ScriptLoaderService } from './script-loader.service';\nimport { ComponentStyles } from '@memberjunction/interactive-component-types';\n\n/**\n * Angular-specific adapter for the React runtime.\n * Manages the integration between Angular services and the platform-agnostic React runtime.\n */\n@Injectable({ providedIn: 'root' })\nexport class AngularAdapterService {\n private runtime?: {\n compiler: ComponentCompiler;\n registry: ComponentRegistry;\n resolver: ComponentResolver;\n manager: ComponentManager;\n version: string;\n };\n private runtimeContext?: RuntimeContext;\n private initializationPromise: Promise<void> | undefined;\n\n constructor(private scriptLoader: ScriptLoaderService) {}\n\n /**\n * Initialize the React runtime with Angular-specific configuration\n * @param config Optional library configuration\n * @param additionalLibraries Optional additional libraries to merge\n * @param options Optional options including debug flag\n * @returns Promise resolving when runtime is ready\n */\n async initialize(\n config?: LibraryConfiguration,\n additionalLibraries?: ExternalLibraryConfig[],\n options?: { debug?: boolean }\n ): Promise<void> {\n if (this.runtime) {\n return; // Already initialized\n }\n if (this.initializationPromise) {\n return this.initializationPromise; // in progress\n }\n\n // Start initialization and store the promise immediately\n this.initializationPromise = this.doInitialize(config, additionalLibraries, options);\n\n try {\n await this.initializationPromise;\n } catch (error) {\n // Clear the promise on error so it can be retried\n this.initializationPromise = undefined;\n throw error;\n }\n\n return;\n }\n\n private async doInitialize(\n config?: LibraryConfiguration,\n additionalLibraries?: ExternalLibraryConfig[],\n options?: { debug?: boolean }\n ): Promise<void> {\n // Load React ecosystem with optional additional libraries\n const ecosystem = await this.scriptLoader.loadReactEcosystem(config, additionalLibraries, options);\n \n // Create runtime context\n this.runtimeContext = {\n React: ecosystem.React,\n ReactDOM: ecosystem.ReactDOM,\n libraries: ecosystem.libraries,\n utilities: {\n // Add any Angular-specific utilities here\n }\n };\n\n // Create the React runtime with runtime context for registry support\n this.runtime = createReactRuntime(ecosystem.Babel, {\n compiler: {\n cache: true,\n maxCacheSize: 100,\n debug: options?.debug\n },\n registry: {\n maxComponents: 1000,\n cleanupInterval: 60000,\n useLRU: true,\n enableNamespaces: true,\n debug: options?.debug\n }\n }, this.runtimeContext, options?.debug);\n }\n\n /**\n * Get the component compiler\n * @returns Component compiler instance\n */\n getCompiler(): ComponentCompiler {\n if (!this.runtime) {\n throw new Error('React runtime not initialized. Call initialize() first.');\n }\n return this.runtime.compiler;\n }\n\n /**\n * Get the component registry\n * @returns Component registry instance\n */\n getRegistry(): ComponentRegistry {\n if (!this.runtime) {\n throw new Error('React runtime not initialized. Call initialize() first.');\n }\n return this.runtime.registry;\n }\n\n /**\n * Get the component resolver\n * @returns Component resolver instance\n */\n getResolver(): ComponentResolver {\n if (!this.runtime) {\n throw new Error('React runtime not initialized. Call initialize() first.');\n }\n return this.runtime.resolver;\n }\n\n /**\n * Get the runtime context\n * @returns Runtime context with React and libraries\n */\n getRuntimeContext(): RuntimeContext {\n if (!this.runtimeContext) {\n throw new Error('React runtime not initialized. Call initialize() first.');\n }\n return this.runtimeContext;\n }\n\n /**\n * Get the unified component manager\n * @returns Component manager instance\n */\n getComponentManager(): ComponentManager {\n if (!this.runtime) {\n throw new Error('React runtime not initialized. Call initialize() first.');\n }\n return this.runtime.manager;\n }\n\n\n /**\n * Compile a component with Angular-specific defaults\n * @param options - Compilation options\n * @returns Promise resolving to compilation result\n */\n async compileComponent(options: CompileOptions) {\n // Validate options before initialization\n if (!options) {\n throw new Error(\n 'Angular adapter error: No compilation options provided.\\n' +\n 'This usually means the component spec is null or undefined.\\n' +\n 'Please check that:\\n' +\n '1. Your component data is loaded properly\\n' +\n '2. The component spec has \"name\" and \"code\" properties\\n' +\n '3. The component input is not undefined'\n );\n }\n\n if (!options.componentName || options.componentName.trim() === '') {\n throw new Error(\n 'Angular adapter error: Component name is missing or empty.\\n' +\n `Received options: ${JSON.stringify(options, null, 2)}\\n` +\n 'Make sure your component spec includes a \"name\" property.'\n );\n }\n\n if (!options.componentCode || options.componentCode.trim() === '') {\n throw new Error(\n `Angular adapter error: Component code is missing or empty for component \"${options.componentName}\".\\n` +\n 'Make sure your component spec includes a \"code\" property with the React component source.'\n );\n }\n\n await this.initialize();\n \n // Apply default styles if not provided\n const optionsWithDefaults = {\n ...options,\n styles: options.styles || SetupStyles()\n };\n\n return this.runtime!.compiler.compile(optionsWithDefaults);\n }\n\n /**\n * Register a component in the registry\n * @param name - Component name\n * @param component - Compiled component\n * @param namespace - Component namespace\n * @param version - Component version\n * @returns Component metadata\n */\n registerComponent(\n name: string,\n component: any,\n namespace: string = 'Global',\n version: string = 'v1'\n ) {\n if (!this.runtime) {\n throw new Error('React runtime not initialized. Call initialize() first.');\n }\n return this.runtime.registry.register(name, component, namespace, version);\n }\n\n /**\n * Get a component from the registry\n * @param name - Component name\n * @param namespace - Component namespace\n * @param version - Component version\n * @returns Component if found\n */\n getComponent(name: string, namespace: string = 'Global', version?: string) {\n if (!this.runtime) {\n throw new Error('React runtime not initialized. Call initialize() first.');\n }\n return this.runtime.registry.get(name, namespace, version);\n }\n\n /**\n * Check if runtime is initialized\n * @returns true if initialized\n */\n isInitialized(): boolean {\n return !!this.runtime && !!this.runtimeContext;\n }\n\n /**\n * Get runtime version\n * @returns Runtime version string\n */\n getVersion(): string {\n return this.runtime?.version || 'unknown';\n }\n\n /**\n * Clean up resources\n */\n destroy(): void {\n if (this.runtime) {\n this.runtime.registry.destroy();\n this.runtime = undefined;\n this.runtimeContext = undefined;\n }\n }\n\n /**\n * Get Babel instance for direct use\n * @returns Babel instance\n */\n getBabel(): any {\n return this.runtimeContext?.libraries?.Babel || (window as any).Babel;\n }\n\n /**\n * Transpile JSX code directly\n * @param code - JSX code to transpile\n * @param filename - Optional filename for better error messages\n * @returns Transpiled JavaScript code\n */\n transpileJSX(code: string, filename?: string): string {\n const babel = this.getBabel();\n if (!babel) {\n throw new Error('Babel not loaded. Initialize the runtime first.');\n }\n\n try {\n const result = babel.transform(code, {\n presets: ['react'],\n filename: filename || 'component.jsx'\n });\n return result.code;\n } catch (error: any) {\n throw new Error(`Failed to transpile JSX: ${error.message}`);\n }\n }\n}"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/ng-react",
3
- "version": "2.99.0",
3
+ "version": "2.100.0",
4
4
  "description": "Angular components for hosting React components in MemberJunction applications",
5
5
  "scripts": {
6
6
  "build": "ngc -p tsconfig.json",
@@ -40,9 +40,9 @@
40
40
  "styles"
41
41
  ],
42
42
  "dependencies": {
43
- "@memberjunction/core": "2.99.0",
44
- "@memberjunction/react-runtime": "2.99.0",
45
- "@memberjunction/interactive-component-types": "^2.99.0",
43
+ "@memberjunction/core": "2.100.0",
44
+ "@memberjunction/react-runtime": "2.100.0",
45
+ "@memberjunction/interactive-component-types": "^2.100.0",
46
46
  "@angular/common": ">=18.0.0",
47
47
  "@angular/core": ">=18.0.0",
48
48
  "@angular/platform-browser": ">=18.0.0",