@memberjunction/react-runtime 5.33.0 โ 5.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +14 -14
- package/CHANGELOG.md +21 -0
- package/dist/324.runtime.umd.js +148 -103
- package/dist/component-manager/component-manager.d.ts.map +1 -1
- package/dist/component-manager/component-manager.js +16 -11
- package/dist/component-manager/component-manager.js.map +1 -1
- package/dist/registry/component-registry-service.d.ts.map +1 -1
- package/dist/registry/component-registry-service.js +5 -6
- package/dist/registry/component-registry-service.js.map +1 -1
- package/dist/registry/component-resolver.d.ts.map +1 -1
- package/dist/registry/component-resolver.js +3 -21
- package/dist/registry/component-resolver.js.map +1 -1
- package/dist/runtime.umd.js +4554 -2577
- package/package.json +6 -6
- package/src/component-manager/component-manager.ts +36 -41
- package/src/registry/component-registry-service.ts +14 -20
- package/src/registry/component-resolver.ts +11 -32
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-manager.d.ts","sourceRoot":"","sources":["../../src/component-manager/component-manager.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAA8B,MAAM,6CAA6C,CAAC;AAIxG,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,cAAc,EAAmB,MAAM,UAAU,CAAC;AAC3D,OAAO,EACL,WAAW,EACX,UAAU,EACV,eAAe,EACf,sBAAsB,EAGvB,MAAM,SAAS,CAAC;AAMjB,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,MAAM,CAAyB;IAGvC,OAAO,CAAC,UAAU,CAAsC;IACxD,OAAO,CAAC,qBAAqB,CAA0B;IACvD,OAAO,CAAC,eAAe,CAA+C;IAGtE,OAAO,CAAC,eAAe,CAAoC;IAC3D,OAAO,CAAC,aAAa,CAAa;gBAGhC,QAAQ,EAAE,iBAAiB,EAC3B,QAAQ,EAAE,iBAAiB,EAC3B,cAAc,EAAE,cAAc,EAC9B,MAAM,GAAE,sBAA2B;IAyB/B,aAAa,CACjB,IAAI,EAAE,aAAa,EACnB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,UAAU,CAAC;YAoDR,eAAe;IA6KvB,aAAa,CACjB,QAAQ,EAAE,aAAa,EACvB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,eAAe,CAAC;YAuFb,sBAAsB;YAuFtB,uBAAuB;IAoBrC,OAAO,CAAC,UAAU;YAeJ,kBAAkB;
|
|
1
|
+
{"version":3,"file":"component-manager.d.ts","sourceRoot":"","sources":["../../src/component-manager/component-manager.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAA8B,MAAM,6CAA6C,CAAC;AAIxG,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,cAAc,EAAmB,MAAM,UAAU,CAAC;AAC3D,OAAO,EACL,WAAW,EACX,UAAU,EACV,eAAe,EACf,sBAAsB,EAGvB,MAAM,SAAS,CAAC;AAMjB,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,MAAM,CAAyB;IAGvC,OAAO,CAAC,UAAU,CAAsC;IACxD,OAAO,CAAC,qBAAqB,CAA0B;IACvD,OAAO,CAAC,eAAe,CAA+C;IAGtE,OAAO,CAAC,eAAe,CAAoC;IAC3D,OAAO,CAAC,aAAa,CAAa;gBAGhC,QAAQ,EAAE,iBAAiB,EAC3B,QAAQ,EAAE,iBAAiB,EAC3B,cAAc,EAAE,cAAc,EAC9B,MAAM,GAAE,sBAA2B;IAyB/B,aAAa,CACjB,IAAI,EAAE,aAAa,EACnB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,UAAU,CAAC;YAoDR,eAAe;IA6KvB,aAAa,CACjB,QAAQ,EAAE,aAAa,EACvB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,eAAe,CAAC;YAuFb,sBAAsB;YAuFtB,uBAAuB;IAoBrC,OAAO,CAAC,UAAU;YAeJ,kBAAkB;IA0FhC,OAAO,CAAC,mBAAmB;YA0Cb,gBAAgB;YAkDhB,2BAA2B;YAkC3B,uBAAuB;IAgBrC,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,aAAa;IA0BrB,OAAO,CAAC,eAAe;IAWvB,UAAU,IAAI,IAAI;IAUlB,aAAa,IAAI;QACf,cAAc,EAAE,MAAM,CAAC;QACvB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,YAAY,EAAE,MAAM,CAAC;KACtB;IAWD,OAAO,CAAC,GAAG;CAKZ"}
|
|
@@ -314,14 +314,7 @@ export class ComponentManager {
|
|
|
314
314
|
return cached.spec;
|
|
315
315
|
}
|
|
316
316
|
if (!spec.registry) {
|
|
317
|
-
|
|
318
|
-
const localComponent = this.componentEngine.Components?.find((c) => {
|
|
319
|
-
const nameMatch = c.Name?.toLowerCase() === spec.name?.toLowerCase();
|
|
320
|
-
const namespaceMatch = !spec.namespace || c.Namespace?.toLowerCase() === spec.namespace?.toLowerCase();
|
|
321
|
-
if (nameMatch && !namespaceMatch) {
|
|
322
|
-
}
|
|
323
|
-
return nameMatch && namespaceMatch;
|
|
324
|
-
});
|
|
317
|
+
const localComponent = await this.componentEngine.FindComponent(spec.name, spec.namespace);
|
|
325
318
|
if (!localComponent) {
|
|
326
319
|
throw new Error(`Local component not found: ${spec.name}`);
|
|
327
320
|
}
|
|
@@ -343,19 +336,31 @@ export class ComponentManager {
|
|
|
343
336
|
throw new Error('GraphQL client not available for registry fetching');
|
|
344
337
|
}
|
|
345
338
|
this.log(`Fetching from external registry: ${spec.registry}/${spec.name}`);
|
|
346
|
-
const
|
|
339
|
+
const cachedHash = cached?.hash;
|
|
340
|
+
const response = await this.graphQLClient.GetRegistryComponentWithHash({
|
|
347
341
|
registryName: spec.registry,
|
|
348
342
|
namespace: spec.namespace || 'Global',
|
|
349
343
|
name: spec.name,
|
|
350
|
-
version: spec.version || 'latest'
|
|
344
|
+
version: spec.version || 'latest',
|
|
345
|
+
hash: cachedHash
|
|
351
346
|
});
|
|
352
|
-
if (
|
|
347
|
+
if (response.notModified && cached) {
|
|
348
|
+
this.log(`Registry returned 304 for ${spec.name}, reusing cached spec`);
|
|
349
|
+
this.fetchCache.set(cacheKey, {
|
|
350
|
+
...cached,
|
|
351
|
+
fetchedAt: new Date()
|
|
352
|
+
});
|
|
353
|
+
return cached.spec;
|
|
354
|
+
}
|
|
355
|
+
if (!response.specification) {
|
|
353
356
|
throw new Error(`Component not found in registry: ${spec.registry}/${spec.name}`);
|
|
354
357
|
}
|
|
358
|
+
const fullSpec = response.specification;
|
|
355
359
|
const processedSpec = this.applyResolutionMode(fullSpec, spec, options?.resolutionMode);
|
|
356
360
|
this.fetchCache.set(cacheKey, {
|
|
357
361
|
spec: processedSpec,
|
|
358
362
|
fetchedAt: new Date(),
|
|
363
|
+
hash: response.hash,
|
|
359
364
|
usageNotified: false
|
|
360
365
|
});
|
|
361
366
|
return processedSpec;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-manager.js","sourceRoot":"","sources":["../../src/component-manager/component-manager.ts"],"names":[],"mappings":"AAMA,OAAO,EAAY,QAAQ,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAuD,MAAM,+BAA+B,CAAC;AAkB7H,MAAM,OAAO,gBAAgB;IAe3B,YACE,QAA2B,EAC3B,QAA2B,EAC3B,cAA8B,EAC9B,SAAiC,EAAE;QAZ7B,eAAU,GAA4B,IAAI,GAAG,EAAE,CAAC;QAChD,0BAAqB,GAAgB,IAAI,GAAG,EAAE,CAAC;QAC/C,oBAAe,GAAqC,IAAI,GAAG,EAAE,CAAC;QAG9D,oBAAe,GAAG,uBAAuB,CAAC,QAAQ,CAAC;QACnD,kBAAa,GAAQ,IAAI,CAAC;QAQhC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,MAAM,GAAG;YACZ,KAAK,EAAE,KAAK;YACZ,YAAY,EAAE,GAAG;YACjB,QAAQ,EAAE,OAAO;YACjB,mBAAmB,EAAE,IAAI;YACzB,mBAAmB,EAAE,CAAC;YACtB,YAAY,EAAE,KAAK;YACnB,GAAG,MAAM;SACV,CAAC;QAEF,IAAI,CAAC,GAAG,CAAC,8BAA8B,EAAE;YACvC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;YACxB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;YAC9B,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,mBAAmB;SAC/C,CAAC,CAAC;IACL,CAAC;IAKD,KAAK,CAAC,aAAa,CACjB,IAAmB,EACnB,UAAuB,EAAE;QAEzB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAEzD,IAAI,CAAC,GAAG,CAAC,sBAAsB,IAAI,CAAC,IAAI,EAAE,EAAE;YAC1C,GAAG,EAAE,YAAY;YACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,YAAY,EAAE,OAAO,CAAC,YAAY;SACnC,CAAC,CAAC;QAGH,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC/D,IAAI,eAAe,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;YAM7C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,gBAAgB,IAAI,QAAQ,CAAC;YACzE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,cAAc,IAAI,QAAQ,CAAC;YACnE,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;YACjF,IAAI,UAAU,EAAE,CAAC;gBACf,IAAI,CAAC,GAAG,CAAC,2DAA2D,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBACjF,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,SAAS,EAAE,UAAU;oBACrB,IAAI;oBACJ,SAAS,EAAE,IAAI;iBAChB,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,8BAA8B,IAAI,CAAC,IAAI,cAAc,CAAC,CAAC;YAChE,OAAO,eAAe,CAAC;QACzB,CAAC;QAGD,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;QACjF,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;QAEpD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC;YACjC,OAAO,MAAM,CAAC;QAChB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAKO,KAAK,CAAC,eAAe,CAC3B,IAAmB,EACnB,OAAoB,EACpB,YAAoB,EACpB,SAAiB;QAEjB,MAAM,MAAM,GAAyB,EAAE,CAAC;QAExC,IAAI,CAAC;YAEH,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,gBAAgB,IAAI,QAAQ,CAAC;YACzE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,cAAc,IAAI,QAAQ,CAAC;YACnE,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAE7C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;YAC/E,IAAI,QAAQ,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;gBACjE,IAAI,CAAC,GAAG,CAAC,gCAAgC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBAGtD,IAAI,OAAO,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;oBACjC,MAAM,IAAI,CAAC,2BAA2B,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;gBAC7D,CAAC;gBAGD,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;gBAEtD,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,SAAS,EAAE,QAAQ;oBACnB,IAAI,EAAE,WAAW,EAAE,IAAI,IAAI,IAAI;oBAC/B,SAAS,EAAE,IAAI;iBAChB,CAAC;YACJ,CAAC;YAGD,IAAI,QAAQ,GAAG,IAAI,CAAC;YACpB,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1B,IAAI,CAAC,GAAG,CAAC,4BAA4B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBAClD,IAAI,CAAC;oBACH,QAAQ,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE;wBAClE,cAAc,EAAE,OAAO,CAAC,cAAc;qBACvC,CAAC,CAAC;oBAGH,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,EAAE;wBAChC,IAAI,EAAE,QAAQ;wBACd,SAAS,EAAE,IAAI,IAAI,EAAE;wBACrB,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;wBAClC,aAAa,EAAE,KAAK;qBACrB,CAAC,CAAC;gBACL,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,IAAI,CAAC;wBACV,OAAO,EAAE,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;wBAC/F,KAAK,EAAE,OAAO;wBACd,aAAa,EAAE,IAAI,CAAC,IAAI;qBACzB,CAAC,CAAC;oBACH,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;iBAAM,CAAC;gBAEN,IAAI,IAAI,CAAC,QAAQ,KAAK,UAAU,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;oBAC9C,IAAI,CAAC,GAAG,CAAC,0CAA0C,IAAI,CAAC,IAAI,0BAA0B,EAAE;wBACtF,QAAQ,EAAE,IAAI,CAAC,QAAQ;wBACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;qBACxB,CAAC,CAAC;gBACL,CAAC;gBAED,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;oBACpD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,EAAE;wBAChC,IAAI,EAAE,QAAQ;wBACd,SAAS,EAAE,IAAI,IAAI,EAAE;wBACrB,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;wBAClC,aAAa,EAAE,KAAK;qBACrB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAGD,IAAI,OAAO,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;gBACjC,MAAM,IAAI,CAAC,2BAA2B,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YACjE,CAAC;YAGD,IAAI,iBAAiB,GAAG,QAAQ,CAAC;YACjC,IAAI,CAAC,iBAAiB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;gBACjD,IAAI,CAAC,GAAG,CAAC,wBAAwB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC9C,IAAI,CAAC;oBACH,iBAAiB,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACrE,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,IAAI,CAAC;wBACV,OAAO,EAAE,gCAAgC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;wBACjG,KAAK,EAAE,SAAS;wBAChB,aAAa,EAAE,IAAI,CAAC,IAAI;qBACzB,CAAC,CAAC;oBACH,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;YAGD,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;gBAChE,IAAI,CAAC,GAAG,CAAC,0BAA0B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBAKhD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CACpB,QAAQ,CAAC,IAAI,EACb,iBAAiB,EACjB,SAAS,EACT,OAAO,EACP,WAAW,CACZ,CAAC;YACJ,CAAC;YAGD,MAAM,YAAY,GAAoC,EAAE,CAAC;YACzD,IAAI,QAAQ,CAAC,YAAY,IAAI,QAAQ,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9D,IAAI,CAAC,GAAG,CAAC,WAAW,QAAQ,CAAC,YAAY,CAAC,MAAM,qBAAqB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBAGlF,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,uBAAuB,CACnD,QAAQ,CAAC,YAAY,EACrB,EAAE,GAAG,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAClC,CAAC;gBAEF,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;oBAChC,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;wBACvC,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAC7C,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,CACrC,CAAC;wBACF,IAAI,OAAO,EAAE,CAAC;4BACZ,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC;wBAChD,CAAC;oBACH,CAAC;yBAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;wBACzB,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;oBAChC,CAAC;gBACH,CAAC;YACH,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACvC,IAAI,CAAC,GAAG,CAAC,kCAAkC,IAAI,CAAC,IAAI,KAAK,OAAO,KAAK,EAAE;gBACrE,SAAS,EAAE,KAAK;gBAChB,eAAe,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM;aAClD,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;gBAC5B,SAAS,EAAE,iBAAiB;gBAC5B,IAAI,EAAE,QAAQ;gBACd,SAAS,EAAE,KAAK;gBAChB,YAAY;gBACZ,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;aAC/C,CAAC;QAEJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACvC,IAAI,CAAC,GAAG,CAAC,6BAA6B,IAAI,CAAC,IAAI,KAAK,OAAO,KAAK,EAAE,KAAK,CAAC,CAAC;YAEzE,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,SAAS,EAAE,KAAK;gBAChB,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;wBACpC,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;wBAC/D,KAAK,EAAE,OAAO;wBACd,aAAa,EAAE,IAAI,CAAC,IAAI;qBACzB,CAAC;aACH,CAAC;QACJ,CAAC;IACH,CAAC;IAKD,KAAK,CAAC,aAAa,CACjB,QAAuB,EACvB,UAAuB,EAAE;QAEzB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,MAAM,GAA8B,EAAE,CAAC;QAC7C,MAAM,UAAU,GAAoC,EAAE,CAAC;QACvD,MAAM,KAAK,GAAG;YACZ,SAAS,EAAE,CAAC;YACZ,OAAO,EAAE,CAAC;YACV,QAAQ,EAAE,CAAC;YACX,SAAS,EAAE,CAAC;SACb,CAAC;QAEF,IAAI,CAAC,GAAG,CAAC,gCAAgC,QAAQ,CAAC,IAAI,EAAE,EAAE;YACxD,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;SAC5B,CAAC,CAAC;QAEH,IAAI,CAAC;YAEH,IAAI,IAAI,CAAC,eAAe,IAAI,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBAC9E,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;YAChE,CAAC;YAGD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAC9C,QAAQ,EACR,OAAO,EACP,MAAM,EACN,MAAM,EACN,UAAU,EACV,KAAK,EACL,IAAI,GAAG,EAAE,CACV,CAAC;YAEF,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAEzC,IAAI,CAAC,GAAG,CAAC,qBAAqB,QAAQ,CAAC,IAAI,EAAE,EAAE;gBAC7C,OAAO,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;gBAC5B,WAAW,EAAE,MAAM,CAAC,MAAM;gBAC1B,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,GAAG,KAAK;aACT,CAAC,CAAC;YAIH,MAAM,mBAAmB,GAAoC,EAAE,CAAC;YAChE,KAAK,MAAM,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;gBACjE,IAAI,eAAe,IAAI,OAAO,eAAe,KAAK,QAAQ,IAAI,WAAW,IAAI,eAAe,EAAE,CAAC;oBAE7F,mBAAmB,CAAC,IAAI,CAAC,GAAI,eAAuB,CAAC,SAAS,CAAC;gBACjE,CAAC;qBAAM,CAAC;oBAEN,mBAAmB,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC;gBAC9C,CAAC;YACH,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;gBAC5B,aAAa,EAAE,MAAM,CAAC,SAAS;gBAC/B,YAAY,EAAE,MAAM,CAAC,IAAI;gBACzB,gBAAgB,EAAE,MAAM;gBACxB,MAAM;gBACN,UAAU,EAAE,mBAAmB;gBAC/B,KAAK;aACN,CAAC;QAEJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAEzC,IAAI,CAAC,GAAG,CAAC,6BAA6B,QAAQ,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;YAE9D,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,gBAAgB,EAAE,MAAM;gBACxB,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE;wBAClB,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;wBAC/D,KAAK,EAAE,OAAO;wBACd,aAAa,EAAE,QAAQ,CAAC,IAAI;qBAC7B,CAAC;gBACF,KAAK;aACN,CAAC;QACJ,CAAC;IACH,CAAC;IAKO,KAAK,CAAC,sBAAsB,CAClC,IAAmB,EACnB,OAAoB,EACpB,MAAgB,EAChB,MAAiC,EACjC,UAA2C,EAC3C,KAA+B,EAC/B,OAAoB;QAEpB,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAGzD,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,GAAG,CAAC,iCAAiC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACvD,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;gBAChC,IAAI;gBACJ,SAAS,EAAE,IAAI;aAChB,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAG1B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAEvD,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACvC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC;YAGzC,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,MAAM,CAAC,SAAS;oBAAE,KAAK,CAAC,SAAS,EAAE,CAAC;qBACnC,CAAC;oBACJ,KAAK,CAAC,OAAO,EAAE,CAAC;oBAChB,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACnB,CAAC;YACH,CAAC;YAOD,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC;YACpE,IAAI,YAAY,EAAE,CAAC;gBACjB,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;oBAE/B,MAAM,OAAO,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC;oBAG3B,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;wBACjB,IAAI,CAAC,GAAG,CAAC,cAAc,OAAO,CAAC,IAAI,+DAA+D,CAAC,CAAC;oBACtG,CAAC;oBAKD,IAAI,OAAO,CAAC,QAAQ,KAAK,UAAU,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;wBAEzD,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;wBAG7B,IAAI,CAAC,GAAG,CAAC,cAAc,OAAO,CAAC,IAAI,qDAAqD,CAAC,CAAC;oBAC5F,CAAC;oBAED,MAAM,IAAI,CAAC,sBAAsB,CAC/B,OAAO,EACP,EAAE,GAAG,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,EACjC,MAAM,EACN,MAAM,EACN,UAAU,EACV,KAAK,EACL,OAAO,CACR,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAKO,KAAK,CAAC,uBAAuB,CACnC,YAA6B,EAC7B,OAAoB;QAEpB,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,mBAAmB,IAAI,CAAC,CAAC;QACvD,MAAM,OAAO,GAAiB,EAAE,CAAC;QAEjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;YACxD,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC;YACnD,MAAM,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;YACzE,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;QAChC,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAKO,UAAU,CAAC,IAAmB;QAIpC,OAAO,IAAI,CAAC,QAAQ,KAAK,UAAU,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IACpD,CAAC;IAUO,KAAK,CAAC,kBAAkB,CAC9B,IAAmB,EACnB,WAAsB,EACtB,OAA6C;QAG7C,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE7C,IAAI,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,GAAG,CAAC,0BAA0B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAChD,OAAO,MAAM,CAAC,IAAI,CAAC;QACrB,CAAC;QAGD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,GAAG,CAAC,iCAAiC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAGvD,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,IAAI,CAC1D,CAAC,CAA4B,EAAE,EAAE;gBAE/B,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC;gBAGrE,MAAM,cAAc,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC;gBAEvG,IAAI,SAAS,IAAI,CAAC,cAAc,EAAE,CAAC;gBACnC,CAAC;gBAED,OAAO,SAAS,IAAI,cAAc,CAAC;YACrC,CAAC,CACF,CAAC;YAEF,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAC7D,CAAC;YAGD,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC;gBAClC,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,CAAC,IAAI,uBAAuB,CAAC,CAAC;YACvE,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;YAG1D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE;gBAC5B,IAAI,EAAE,QAAQ;gBACd,SAAS,EAAE,IAAI,IAAI,EAAE;gBACrB,aAAa,EAAE,KAAK;aACrB,CAAC,CAAC;YAEH,OAAO,QAAQ,CAAC;QAClB,CAAC;QAID,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,MAAM,IAAI,CAAC,uBAAuB,EAAE,CAAC;QACvC,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACxE,CAAC;QAGD,IAAI,CAAC,GAAG,CAAC,oCAAoC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAE3E,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC;YAC7D,YAAY,EAAE,IAAI,CAAC,QAAQ;YAC3B,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,QAAQ;YACrC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,QAAQ;SAClC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,oCAAoC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACpF,CAAC;QAGD,MAAM,aAAa,GAAG,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;QAGxF,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE;YAC5B,IAAI,EAAE,aAAa;YACnB,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,aAAa,EAAE,KAAK;SACrB,CAAC,CAAC;QAEH,OAAO,aAAa,CAAC;IACvB,CAAC;IAKO,mBAAmB,CACzB,QAAuB,EACvB,YAA2B,EAC3B,cAA+B;QAE/B,IAAI,aAA4B,CAAC;QAEjC,IAAI,cAAc,KAAK,OAAO,EAAE,CAAC;YAE/B,aAAa,GAAG;gBACd,GAAG,QAAQ;gBACX,QAAQ,EAAE,UAAU;gBACpB,QAAQ,EAAE,SAAS;aAEpB,CAAC;QACJ,CAAC;aAAM,CAAC;YAGN,aAAa,GAAG;gBACd,GAAG,QAAQ;gBACX,QAAQ,EAAE,YAAY,CAAC,QAAQ;gBAC/B,QAAQ,EAAE,YAAY,CAAC,QAAQ;gBAC/B,SAAS,EAAE,YAAY,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAS;gBACvD,IAAI,EAAE,YAAY,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI;aACzC,CAAC;QACJ,CAAC;QAGD,IAAI,aAAa,CAAC,YAAY,IAAI,aAAa,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxE,aAAa,CAAC,YAAY,GAAG,aAAa,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;gBAGhE,OAAO,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC;YAC5D,CAAC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,aAAa,CAAC;IACvB,CAAC;IAKO,KAAK,CAAC,gBAAgB,CAC5B,IAAmB,EACnB,OAAoB;QAGpB,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC,eAAe,CAAC,kBAAkB,IAAI,EAAE,CAAC;QAG3F,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAClD,GAAG,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,cAAc;YACrC,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,GAAG,CAAC,cAAc,KAAK,WAAW,CAC7D,CAAC;QAGF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YACzC,aAAa,EAAE,IAAI,CAAC,IAAI;YACxB,aAAa,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;YAC9B,SAAS,EAAE,cAAc;YACzB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,YAAY;SACb,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,oBAAoB,CAAC,CAAC;QACjE,CAAC;QAGD,IAAI,MAAM,CAAC,eAAe,IAAI,MAAM,CAAC,eAAe,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YAC9D,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC;gBACnC,IAAI,CAAC,cAAc,CAAC,SAAS,GAAG,EAAE,CAAC;YACrC,CAAC;YACD,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;gBAC5C,IAAI,CAAC,cAAc,CAAC,SAAU,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YAC9C,CAAC,CAAC,CAAC;QACL,CAAC;QAGD,MAAM,eAAe,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAC9C,IAAI,CAAC,cAAc,EACnB,SAAS,EACT,EAAE,CACH,CAAC;QAEF,OAAO,eAAe,CAAC;IACzB,CAAC;IAMO,KAAK,CAAC,2BAA2B,CACvC,IAAmB,EACnB,YAAoB;QAEpB,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;YACvD,OAAO;QACT,CAAC;QAED,MAAM,eAAe,GAAG,GAAG,IAAI,CAAC,QAAQ,IAAI,YAAY,EAAE,CAAC;QAC3D,IAAI,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;YACpD,IAAI,CAAC,GAAG,CAAC,+BAA+B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACrD,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YAGH,IAAI,CAAC,GAAG,CAAC,iCAAiC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACvD,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YAGhD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YACjD,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC;YAC9B,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAEf,OAAO,CAAC,IAAI,CAAC,uCAAuC,YAAY,GAAG,EAAE,KAAK,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IAKO,KAAK,CAAC,uBAAuB;QACnC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,QAAQ,EAAE,QAAQ,CAAC;YACpC,IAAI,QAAQ,IAAK,QAAgB,CAAC,UAAU,EAAE,CAAC;gBAC7C,MAAM,EAAE,8BAA8B,EAAE,GAAG,MAAM,MAAM,CAAC,sCAAsC,CAAC,CAAC;gBAChG,IAAI,CAAC,aAAa,GAAG,IAAI,8BAA8B,CAAC,QAAe,CAAC,CAAC;gBACzE,IAAI,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,wCAAwC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC7G,CAAC;IACH,CAAC;IAKO,YAAY,CAAC,KAAiB;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QACnD,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,OAAO,CAAC,CAAC;IACjD,CAAC;IAUO,aAAa,CAAC,IAAmB;QAEvC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC;YAC7B,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAC;QAGH,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACnC,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;YACnC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;QACrB,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IASO,eAAe,CAAC,IAAmB,EAAE,OAAoB;QAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC;QAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,gBAAgB,IAAI,QAAQ,CAAC;QACzE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,cAAc,IAAI,QAAQ,CAAC;QACnE,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACtC,OAAO,GAAG,QAAQ,IAAI,SAAS,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;IACpE,CAAC;IAKD,UAAU;QACR,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACxB,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,CAAC;QACnC,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IACjC,CAAC;IAKD,aAAa;QAKX,OAAO;YACL,cAAc,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI;YACpC,kBAAkB,EAAE,IAAI,CAAC,qBAAqB,CAAC,IAAI;YACnD,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI;SACxC,CAAC;IACJ,CAAC;IAKO,GAAG,CAAC,OAAe,EAAE,IAAU;QACrC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,yBAAyB,OAAO,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;CACF","sourcesContent":["/**\n * @fileoverview Unified Component Manager implementation\n * Handles all component operations efficiently with proper caching and registry tracking\n */\n\nimport { ComponentSpec, ComponentLibraryDependency } from '@memberjunction/interactive-component-types';\nimport { UserInfo, Metadata, LogError } from '@memberjunction/core';\nimport { ComponentMetadataEngine, MJComponentLibraryEntity, MJComponentEntityExtended } from '@memberjunction/core-entities';\n\nimport { ComponentCompiler } from '../compiler';\nimport { ComponentRegistry } from '../registry';\nimport { RuntimeContext, ComponentObject } from '../types';\nimport {\n LoadOptions,\n LoadResult,\n HierarchyResult,\n ComponentManagerConfig,\n CacheEntry,\n ResolutionMode\n} from './types';\n\n/**\n * Unified component management system that handles all component operations\n * efficiently with proper caching and registry tracking.\n */\nexport class ComponentManager {\n private compiler: ComponentCompiler;\n private registry: ComponentRegistry;\n private runtimeContext: RuntimeContext;\n private config: ComponentManagerConfig;\n \n // Caching\n private fetchCache: Map<string, CacheEntry> = new Map();\n private registryNotifications: Set<string> = new Set();\n private loadingPromises: Map<string, Promise<LoadResult>> = new Map();\n \n // Metadata engine\n private componentEngine = ComponentMetadataEngine.Instance;\n private graphQLClient: any = null;\n \n constructor(\n compiler: ComponentCompiler,\n registry: ComponentRegistry,\n runtimeContext: RuntimeContext,\n config: ComponentManagerConfig = {}\n ) {\n this.compiler = compiler;\n this.registry = registry;\n this.runtimeContext = runtimeContext;\n this.config = {\n debug: false,\n maxCacheSize: 100,\n cacheTTL: 3600000, // 1 hour\n enableUsageTracking: true,\n dependencyBatchSize: 5,\n fetchTimeout: 30000,\n ...config\n };\n \n this.log('ComponentManager initialized', {\n debug: this.config.debug,\n cacheTTL: this.config.cacheTTL,\n usageTracking: this.config.enableUsageTracking\n });\n }\n \n /**\n * Main entry point - intelligently handles all component operations\n */\n async loadComponent(\n spec: ComponentSpec,\n options: LoadOptions = {}\n ): Promise<LoadResult> {\n const startTime = Date.now();\n const componentKey = this.getComponentKey(spec, options);\n \n this.log(`Loading component: ${spec.name}`, { \n key: componentKey, \n location: spec.location,\n registry: spec.registry,\n forceRefresh: options.forceRefresh \n });\n \n // Check if already loading to prevent duplicate work\n const existingPromise = this.loadingPromises.get(componentKey);\n if (existingPromise && !options.forceRefresh) {\n // Before returning the pending promise, check if the compiled component\n // is already in the registry. This prevents deadlock in circular dependency\n // chains: A's Step 6 loads B, B's Step 6 loads A again โ but A was already\n // compiled and registered (Step 5 runs before Step 6). Returning the pending\n // promise would deadlock because it's waiting on its own call chain.\n const namespace = spec.namespace || options.defaultNamespace || 'Global';\n const version = spec.version || options.defaultVersion || 'latest';\n const contentHash = this.calculateHash(spec);\n const registered = this.registry.get(spec.name, namespace, version, contentHash);\n if (registered) {\n this.log(`Component already registered (circular dep resolution): ${spec.name}`);\n return {\n success: true,\n component: registered,\n spec,\n fromCache: true\n };\n }\n\n this.log(`Component already loading: ${spec.name}, waiting...`);\n return existingPromise;\n }\n \n // Create loading promise\n const loadPromise = this.doLoadComponent(spec, options, componentKey, startTime);\n this.loadingPromises.set(componentKey, loadPromise);\n \n try {\n const result = await loadPromise;\n return result;\n } finally {\n this.loadingPromises.delete(componentKey);\n }\n }\n \n /**\n * Internal method that does the actual loading\n */\n private async doLoadComponent(\n spec: ComponentSpec,\n options: LoadOptions,\n componentKey: string,\n startTime: number\n ): Promise<LoadResult> {\n const errors: LoadResult['errors'] = [];\n \n try {\n // STEP 1: Check if already loaded in ComponentRegistry\n const namespace = spec.namespace || options.defaultNamespace || 'Global';\n const version = spec.version || options.defaultVersion || 'latest';\n const contentHash = this.calculateHash(spec);\n\n const existing = this.registry.get(spec.name, namespace, version, contentHash);\n if (existing && !options.forceRefresh && !options.forceRecompile) {\n this.log(`Component found in registry: ${spec.name}`);\n \n // Still need to notify registry for usage tracking\n if (options.trackUsage !== false) {\n await this.notifyRegistryUsageIfNeeded(spec, componentKey);\n }\n \n // Get cached spec if available\n const cachedEntry = this.fetchCache.get(componentKey);\n \n return {\n success: true,\n component: existing,\n spec: cachedEntry?.spec || spec,\n fromCache: true\n };\n }\n \n // STEP 2: Fetch full spec if needed\n let fullSpec = spec;\n if (this.needsFetch(spec)) {\n this.log(`Fetching component spec: ${spec.name}`);\n try {\n fullSpec = await this.fetchComponentSpec(spec, options.contextUser, {\n resolutionMode: options.resolutionMode\n });\n\n // Cache the fetched spec\n this.fetchCache.set(componentKey, {\n spec: fullSpec,\n fetchedAt: new Date(),\n hash: this.calculateHash(fullSpec),\n usageNotified: false\n });\n } catch (error) {\n errors.push({\n message: `Failed to fetch component: ${error instanceof Error ? error.message : String(error)}`,\n phase: 'fetch',\n componentName: spec.name\n });\n throw error;\n }\n } else {\n // Log when we skip fetching because code is already provided\n if (spec.location === 'registry' && spec.code) {\n this.log(`Skipping fetch for registry component: ${spec.name} (code already provided)`, {\n location: spec.location,\n registry: spec.registry\n });\n }\n // Also cache the spec if it has code to avoid re-fetching\n if (spec.code && !this.fetchCache.has(componentKey)) {\n this.fetchCache.set(componentKey, {\n spec: fullSpec,\n fetchedAt: new Date(),\n hash: this.calculateHash(fullSpec),\n usageNotified: false\n });\n }\n }\n \n // STEP 3: Notify registry of usage (exactly once per session)\n if (options.trackUsage !== false) {\n await this.notifyRegistryUsageIfNeeded(fullSpec, componentKey);\n }\n \n // STEP 4: Compile if needed\n let compiledComponent = existing;\n if (!compiledComponent || options.forceRecompile) {\n this.log(`Compiling component: ${spec.name}`);\n try {\n compiledComponent = await this.compileComponent(fullSpec, options);\n } catch (error) {\n errors.push({\n message: `Failed to compile component: ${error instanceof Error ? error.message : String(error)}`,\n phase: 'compile',\n componentName: spec.name\n });\n throw error;\n }\n }\n \n // STEP 5: Register in ComponentRegistry\n if (!existing || options.forceRefresh || options.forceRecompile) {\n this.log(`Registering component: ${spec.name}`);\n // Register under the INPUT spec's hash so callers passing the same\n // spec shape on subsequent loads hit the cache. If we keyed by the\n // post-fetch fullSpec hash instead, registry-stub callers would\n // never re-find the entry they just cached.\n this.registry.register(\n fullSpec.name,\n compiledComponent,\n namespace,\n version,\n contentHash\n );\n }\n \n // STEP 6: Process dependencies recursively\n const dependencies: Record<string, ComponentObject> = {};\n if (fullSpec.dependencies && fullSpec.dependencies.length > 0) {\n this.log(`Loading ${fullSpec.dependencies.length} dependencies for ${spec.name}`);\n \n // Load dependencies in batches for efficiency\n const depResults = await this.loadDependenciesBatched(\n fullSpec.dependencies,\n { ...options, isDependent: true }\n );\n \n for (const result of depResults) {\n if (result.success && result.component) {\n const depSpec = fullSpec.dependencies.find(d => \n d.name === (result.spec?.name || '')\n );\n if (depSpec) {\n dependencies[depSpec.name] = result.component;\n }\n } else if (result.errors) {\n errors.push(...result.errors);\n }\n }\n }\n \n const elapsed = Date.now() - startTime;\n this.log(`Component loaded successfully: ${spec.name} (${elapsed}ms)`, {\n fromCache: false,\n dependencyCount: Object.keys(dependencies).length\n });\n \n return {\n success: errors.length === 0,\n component: compiledComponent,\n spec: fullSpec,\n fromCache: false,\n dependencies,\n errors: errors.length > 0 ? errors : undefined\n };\n \n } catch (error) {\n const elapsed = Date.now() - startTime;\n this.log(`Failed to load component: ${spec.name} (${elapsed}ms)`, error);\n \n return {\n success: false,\n fromCache: false,\n errors: errors.length > 0 ? errors : [{\n message: error instanceof Error ? error.message : String(error),\n phase: 'fetch',\n componentName: spec.name\n }]\n };\n }\n }\n \n /**\n * Load a complete hierarchy efficiently\n */\n async loadHierarchy(\n rootSpec: ComponentSpec,\n options: LoadOptions = {}\n ): Promise<HierarchyResult> {\n const startTime = Date.now();\n const loaded: string[] = [];\n const errors: HierarchyResult['errors'] = [];\n const components: Record<string, ComponentObject> = {};\n const stats = {\n fromCache: 0,\n fetched: 0,\n compiled: 0,\n totalTime: 0\n };\n \n this.log(`Loading component hierarchy: ${rootSpec.name}`, {\n location: rootSpec.location,\n registry: rootSpec.registry\n });\n \n try {\n // Initialize component engine if needed (skip in browser context where it doesn't exist)\n if (this.componentEngine && typeof this.componentEngine.Config === 'function') {\n await this.componentEngine.Config(false, options.contextUser);\n }\n \n // Load the root component and all its dependencies\n const result = await this.loadComponentRecursive(\n rootSpec,\n options,\n loaded,\n errors,\n components,\n stats,\n new Set()\n );\n \n stats.totalTime = Date.now() - startTime;\n \n this.log(`Hierarchy loaded: ${rootSpec.name}`, {\n success: errors.length === 0,\n loadedCount: loaded.length,\n errors: errors.length,\n ...stats\n });\n \n // Unwrap components before returning\n // Components are ComponentObject wrappers, but consumers expect just the React components\n const unwrappedComponents: Record<string, ComponentObject> = {};\n for (const [name, componentObject] of Object.entries(components)) {\n if (componentObject && typeof componentObject === 'object' && 'component' in componentObject) {\n // Extract the actual React component function\n unwrappedComponents[name] = (componentObject as any).component;\n } else {\n // Already a function or something else - use as-is\n unwrappedComponents[name] = componentObject;\n }\n }\n \n return {\n success: errors.length === 0,\n rootComponent: result.component,\n resolvedSpec: result.spec,\n loadedComponents: loaded,\n errors,\n components: unwrappedComponents,\n stats\n };\n \n } catch (error) {\n stats.totalTime = Date.now() - startTime;\n \n this.log(`Failed to load hierarchy: ${rootSpec.name}`, error);\n \n return {\n success: false,\n loadedComponents: loaded,\n errors: [...errors, {\n message: error instanceof Error ? error.message : String(error),\n phase: 'fetch',\n componentName: rootSpec.name\n }],\n stats\n };\n }\n }\n \n /**\n * Recursively load a component and its dependencies\n */\n private async loadComponentRecursive(\n spec: ComponentSpec,\n options: LoadOptions,\n loaded: string[],\n errors: HierarchyResult['errors'],\n components: Record<string, ComponentObject>,\n stats: HierarchyResult['stats'],\n visited: Set<string>\n ): Promise<LoadResult> {\n const componentKey = this.getComponentKey(spec, options);\n \n // Prevent circular dependencies\n if (visited.has(componentKey)) {\n this.log(`Circular dependency detected: ${spec.name}`);\n return {\n success: true,\n component: components[spec.name],\n spec,\n fromCache: true\n };\n }\n visited.add(componentKey);\n \n // Load this component\n const result = await this.loadComponent(spec, options);\n \n if (result.success && result.component) {\n loaded.push(spec.name);\n components[spec.name] = result.component;\n \n // Update stats\n if (stats) {\n if (result.fromCache) stats.fromCache++;\n else {\n stats.fetched++;\n stats.compiled++;\n }\n }\n \n // Load dependencies\n // Prefer the input spec's dependencies over the cached result's dependencies.\n // When a parent component is served from cache, result.spec contains stale\n // dependency code. The input spec has the latest dependency code from the caller.\n // Each dependency still gets its own individual cache check via loadComponent.\n const dependencies = spec.dependencies || result.spec?.dependencies;\n if (dependencies) {\n for (const dep of dependencies) {\n // Normalize dependency spec for local registry lookup\n const depSpec = { ...dep };\n // OPTIMIZATION: If the dependency already has code (from registry population),\n // we can skip fetching and go straight to compilation\n if (depSpec.code) {\n this.log(`Dependency ${depSpec.name} already has code (from registry population), optimizing load`);\n }\n\n // If location is \"registry\" with undefined registry, ensure it's treated as local\n // This follows the convention that registry components with undefined registry\n // should be looked up in the local ComponentMetadataEngine\n if (depSpec.location === 'registry' && !depSpec.registry) {\n // Explicitly set to undefined for clarity (it may already be undefined)\n depSpec.registry = undefined;\n\n // Log for debugging\n this.log(`Dependency ${depSpec.name} is a local registry component (registry=undefined)`);\n }\n\n await this.loadComponentRecursive(\n depSpec,\n { ...options, isDependent: true },\n loaded,\n errors,\n components,\n stats,\n visited\n );\n }\n }\n } else if (result.errors) {\n errors.push(...result.errors);\n }\n \n return result;\n }\n \n /**\n * Load dependencies in batches for efficiency\n */\n private async loadDependenciesBatched(\n dependencies: ComponentSpec[],\n options: LoadOptions\n ): Promise<LoadResult[]> {\n const batchSize = this.config.dependencyBatchSize || 5;\n const results: LoadResult[] = [];\n \n for (let i = 0; i < dependencies.length; i += batchSize) {\n const batch = dependencies.slice(i, i + batchSize);\n const batchPromises = batch.map(dep => this.loadComponent(dep, options));\n const batchResults = await Promise.all(batchPromises);\n results.push(...batchResults);\n }\n \n return results;\n }\n \n /**\n * Check if a component needs to be fetched from a registry\n */\n private needsFetch(spec: ComponentSpec): boolean {\n // Need to fetch if:\n // 1. It's a registry component without code\n // 2. It's missing required fields\n return spec.location === 'registry' && !spec.code;\n }\n \n /**\n * Fetch a component specification from a registry (local or external)\n * \n * Convention: When location === 'registry' and registry === undefined,\n * the component is looked up in the local ComponentMetadataEngine.\n * This allows components to reference local registry components without\n * having to know if they're embedded or registry-based.\n */\n private async fetchComponentSpec(\n spec: ComponentSpec,\n contextUser?: UserInfo,\n options?: { resolutionMode?: ResolutionMode }\n ): Promise<ComponentSpec> {\n // Check cache first\n const cacheKey = this.getComponentKey(spec, {});\n const cached = this.fetchCache.get(cacheKey);\n \n if (cached && this.isCacheValid(cached)) {\n this.log(`Using cached spec for: ${spec.name}`);\n return cached.spec;\n }\n \n // Handle LOCAL registry components (registry is null/undefined)\n if (!spec.registry) {\n this.log(`Fetching from local registry: ${spec.name}`);\n \n // Find component in local ComponentMetadataEngine\n const localComponent = this.componentEngine.Components?.find(\n (c: MJComponentEntityExtended) => {\n // Match by name (case-insensitive for better compatibility)\n const nameMatch = c.Name?.toLowerCase() === spec.name?.toLowerCase();\n \n // Match by namespace if provided (handle different formats)\n const namespaceMatch = !spec.namespace || c.Namespace?.toLowerCase() === spec.namespace?.toLowerCase();\n\n if (nameMatch && !namespaceMatch) {\n }\n \n return nameMatch && namespaceMatch;\n }\n );\n \n if (!localComponent) {\n throw new Error(`Local component not found: ${spec.name}`);\n }\n \n // Parse specification from local component\n if (!localComponent.Specification) {\n throw new Error(`Local component ${spec.name} has no specification`);\n }\n \n const fullSpec = JSON.parse(localComponent.Specification);\n \n // Cache it\n this.fetchCache.set(cacheKey, {\n spec: fullSpec,\n fetchedAt: new Date(),\n usageNotified: false\n });\n \n return fullSpec;\n }\n \n // Handle EXTERNAL registry components (registry has a name)\n // Initialize GraphQL client if needed\n if (!this.graphQLClient) {\n await this.initializeGraphQLClient();\n }\n \n if (!this.graphQLClient) {\n throw new Error('GraphQL client not available for registry fetching');\n }\n \n // Fetch from external registry\n this.log(`Fetching from external registry: ${spec.registry}/${spec.name}`);\n \n const fullSpec = await this.graphQLClient.GetRegistryComponent({\n registryName: spec.registry,\n namespace: spec.namespace || 'Global',\n name: spec.name,\n version: spec.version || 'latest'\n });\n \n if (!fullSpec) {\n throw new Error(`Component not found in registry: ${spec.registry}/${spec.name}`);\n }\n \n // Apply resolution mode if specified\n const processedSpec = this.applyResolutionMode(fullSpec, spec, options?.resolutionMode);\n \n // Cache it\n this.fetchCache.set(cacheKey, {\n spec: processedSpec,\n fetchedAt: new Date(),\n usageNotified: false\n });\n \n return processedSpec;\n }\n \n /**\n * Apply resolution mode to a fetched spec (recursively including dependencies)\n */\n private applyResolutionMode(\n fullSpec: ComponentSpec,\n originalSpec: ComponentSpec,\n resolutionMode?: ResolutionMode\n ): ComponentSpec {\n let processedSpec: ComponentSpec;\n \n if (resolutionMode === 'embed') {\n // Convert to embedded format for test harness\n processedSpec = {\n ...fullSpec,\n location: 'embedded',\n registry: undefined,\n // namespace and name can stay for identification\n };\n } else {\n // Default: preserve-metadata mode\n // Keep original registry metadata but include fetched code\n processedSpec = {\n ...fullSpec,\n location: originalSpec.location,\n registry: originalSpec.registry,\n namespace: originalSpec.namespace || fullSpec.namespace,\n name: originalSpec.name || fullSpec.name\n };\n }\n \n // Recursively apply resolution mode to dependencies\n if (processedSpec.dependencies && processedSpec.dependencies.length > 0) {\n processedSpec.dependencies = processedSpec.dependencies.map(dep => {\n // For dependencies, use the dep itself as both full and original spec\n // since they've already been fetched and processed\n return this.applyResolutionMode(dep, dep, resolutionMode);\n });\n }\n \n return processedSpec;\n }\n\n /**\n * Compile a component specification\n */\n private async compileComponent(\n spec: ComponentSpec,\n options: LoadOptions\n ): Promise<ComponentObject> {\n // Get all available libraries - use passed libraries or fall back to ComponentMetadataEngine\n const allLibraries = options.allLibraries || this.componentEngine.ComponentLibraries || [];\n \n // Filter valid libraries\n const validLibraries = spec.libraries?.filter(lib => \n lib && lib.name && lib.globalVariable && \n lib.name !== 'unknown' && lib.globalVariable !== 'undefined'\n );\n \n // Compile the component\n const result = await this.compiler.compile({\n componentName: spec.name,\n componentCode: spec.code || '',\n libraries: validLibraries,\n dependencies: spec.dependencies,\n allLibraries\n });\n \n if (!result.success || !result.component) {\n throw new Error(result.error?.message || 'Compilation failed');\n }\n \n // Add loaded libraries to runtime context\n if (result.loadedLibraries && result.loadedLibraries.size > 0) {\n if (!this.runtimeContext.libraries) {\n this.runtimeContext.libraries = {};\n }\n result.loadedLibraries.forEach((value, key) => {\n this.runtimeContext.libraries![key] = value;\n });\n }\n \n // Get the component object from the factory\n const componentObject = result.component.factory(\n this.runtimeContext,\n undefined, // styles\n {} // components - will be injected by parent\n );\n \n return componentObject;\n }\n \n /**\n * Notify registry of component usage for licensing\n * Only happens once per component per session\n */\n private async notifyRegistryUsageIfNeeded(\n spec: ComponentSpec,\n componentKey: string\n ): Promise<void> {\n if (!spec.registry || !this.config.enableUsageTracking) {\n return; // Only for external registry components with tracking enabled\n }\n \n const notificationKey = `${spec.registry}:${componentKey}`;\n if (this.registryNotifications.has(notificationKey)) {\n this.log(`Usage already notified for: ${spec.name}`);\n return; // Already notified this session\n }\n \n try {\n // In the future, make lightweight usage notification call to registry\n // For now, the fetch itself serves as the notification\n this.log(`Notifying registry usage for: ${spec.name}`);\n this.registryNotifications.add(notificationKey);\n \n // Update cache entry\n const cached = this.fetchCache.get(componentKey);\n if (cached) {\n cached.usageNotified = true;\n }\n } catch (error) {\n // Log but don't fail - usage tracking shouldn't break component loading\n console.warn(`Failed to notify registry usage for ${componentKey}:`, error);\n }\n }\n \n /**\n * Initialize GraphQL client for registry operations\n */\n private async initializeGraphQLClient(): Promise<void> {\n try {\n const provider = Metadata?.Provider;\n if (provider && (provider as any).ExecuteGQL) {\n const { GraphQLComponentRegistryClient } = await import('@memberjunction/graphql-dataprovider');\n this.graphQLClient = new GraphQLComponentRegistryClient(provider as any);\n this.log('GraphQL client initialized');\n }\n } catch (error) {\n LogError(`Failed to initialize GraphQL client: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n \n /**\n * Check if a cache entry is still valid\n */\n private isCacheValid(entry: CacheEntry): boolean {\n const age = Date.now() - entry.fetchedAt.getTime();\n return age < (this.config.cacheTTL || 3600000);\n }\n \n /**\n * Calculate a content fingerprint for a component spec. Used both as a\n * cache-validation marker on `CacheEntry` and as part of the cache key so\n * specs that share `(registry, namespace, name, version)` but carry\n * different `code` (e.g. a registry-reference stub vs. an inline-code\n * Studio export of the same artifact) do not collide on a single cache\n * slot. Sync because callers use it to build keys in non-async paths.\n */\n private calculateHash(spec: ComponentSpec): string {\n // Simple hash based on spec content\n const content = JSON.stringify({\n name: spec.name,\n version: spec.version,\n code: spec.code,\n libraries: spec.libraries\n });\n\n // FNV-style 32-bit integer hash\n let hash = 0;\n for (let i = 0; i < content.length; i++) {\n const char = content.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash;\n }\n return hash.toString(16);\n }\n \n /**\n * Generate a unique key for a component. Includes a content fingerprint so\n * specs that share `(registry, namespace, name, version)` but carry\n * different `code` (e.g. a registry-reference stub vs. an inline-code\n * Studio export of the same artifact) are cached as separate entries\n * instead of clobbering each other on a single slot.\n */\n private getComponentKey(spec: ComponentSpec, options: LoadOptions): string {\n const registry = spec.registry || 'local';\n const namespace = spec.namespace || options.defaultNamespace || 'Global';\n const version = spec.version || options.defaultVersion || 'latest';\n const hash = this.calculateHash(spec);\n return `${registry}:${namespace}:${spec.name}:${version}#${hash}`;\n }\n \n /**\n * Clear all caches\n */\n clearCache(): void {\n this.fetchCache.clear();\n this.registryNotifications.clear();\n this.loadingPromises.clear();\n this.log('All caches cleared');\n }\n \n /**\n * Get cache statistics\n */\n getCacheStats(): {\n fetchCacheSize: number;\n notificationsCount: number;\n loadingCount: number;\n } {\n return {\n fetchCacheSize: this.fetchCache.size,\n notificationsCount: this.registryNotifications.size,\n loadingCount: this.loadingPromises.size\n };\n }\n \n /**\n * Log a message if debug is enabled\n */\n private log(message: string, data?: any): void {\n if (this.config.debug) {\n console.log(`๐ฏ [ComponentManager] ${message}`, data || '');\n }\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"component-manager.js","sourceRoot":"","sources":["../../src/component-manager/component-manager.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Unified Component Manager implementation\n * Handles all component operations efficiently with proper caching and registry tracking\n */\n\nimport { ComponentSpec, ComponentLibraryDependency } from '@memberjunction/interactive-component-types';\nimport { UserInfo, Metadata, LogError } from '@memberjunction/core';\nimport { ComponentMetadataEngine, MJComponentLibraryEntity } from '@memberjunction/core-entities';\n\nimport { ComponentCompiler } from '../compiler';\nimport { ComponentRegistry } from '../registry';\nimport { RuntimeContext, ComponentObject } from '../types';\nimport {\n LoadOptions,\n LoadResult,\n HierarchyResult,\n ComponentManagerConfig,\n CacheEntry,\n ResolutionMode\n} from './types';\n\n/**\n * Unified component management system that handles all component operations\n * efficiently with proper caching and registry tracking.\n */\nexport class ComponentManager {\n private compiler: ComponentCompiler;\n private registry: ComponentRegistry;\n private runtimeContext: RuntimeContext;\n private config: ComponentManagerConfig;\n \n // Caching\n private fetchCache: Map<string, CacheEntry> = new Map();\n private registryNotifications: Set<string> = new Set();\n private loadingPromises: Map<string, Promise<LoadResult>> = new Map();\n \n // Metadata engine\n private componentEngine = ComponentMetadataEngine.Instance;\n private graphQLClient: any = null;\n \n constructor(\n compiler: ComponentCompiler,\n registry: ComponentRegistry,\n runtimeContext: RuntimeContext,\n config: ComponentManagerConfig = {}\n ) {\n this.compiler = compiler;\n this.registry = registry;\n this.runtimeContext = runtimeContext;\n this.config = {\n debug: false,\n maxCacheSize: 100,\n cacheTTL: 3600000, // 1 hour\n enableUsageTracking: true,\n dependencyBatchSize: 5,\n fetchTimeout: 30000,\n ...config\n };\n \n this.log('ComponentManager initialized', {\n debug: this.config.debug,\n cacheTTL: this.config.cacheTTL,\n usageTracking: this.config.enableUsageTracking\n });\n }\n \n /**\n * Main entry point - intelligently handles all component operations\n */\n async loadComponent(\n spec: ComponentSpec,\n options: LoadOptions = {}\n ): Promise<LoadResult> {\n const startTime = Date.now();\n const componentKey = this.getComponentKey(spec, options);\n \n this.log(`Loading component: ${spec.name}`, { \n key: componentKey, \n location: spec.location,\n registry: spec.registry,\n forceRefresh: options.forceRefresh \n });\n \n // Check if already loading to prevent duplicate work\n const existingPromise = this.loadingPromises.get(componentKey);\n if (existingPromise && !options.forceRefresh) {\n // Before returning the pending promise, check if the compiled component\n // is already in the registry. This prevents deadlock in circular dependency\n // chains: A's Step 6 loads B, B's Step 6 loads A again โ but A was already\n // compiled and registered (Step 5 runs before Step 6). Returning the pending\n // promise would deadlock because it's waiting on its own call chain.\n const namespace = spec.namespace || options.defaultNamespace || 'Global';\n const version = spec.version || options.defaultVersion || 'latest';\n const contentHash = this.calculateHash(spec);\n const registered = this.registry.get(spec.name, namespace, version, contentHash);\n if (registered) {\n this.log(`Component already registered (circular dep resolution): ${spec.name}`);\n return {\n success: true,\n component: registered,\n spec,\n fromCache: true\n };\n }\n\n this.log(`Component already loading: ${spec.name}, waiting...`);\n return existingPromise;\n }\n \n // Create loading promise\n const loadPromise = this.doLoadComponent(spec, options, componentKey, startTime);\n this.loadingPromises.set(componentKey, loadPromise);\n \n try {\n const result = await loadPromise;\n return result;\n } finally {\n this.loadingPromises.delete(componentKey);\n }\n }\n \n /**\n * Internal method that does the actual loading\n */\n private async doLoadComponent(\n spec: ComponentSpec,\n options: LoadOptions,\n componentKey: string,\n startTime: number\n ): Promise<LoadResult> {\n const errors: LoadResult['errors'] = [];\n \n try {\n // STEP 1: Check if already loaded in ComponentRegistry\n const namespace = spec.namespace || options.defaultNamespace || 'Global';\n const version = spec.version || options.defaultVersion || 'latest';\n const contentHash = this.calculateHash(spec);\n\n const existing = this.registry.get(spec.name, namespace, version, contentHash);\n if (existing && !options.forceRefresh && !options.forceRecompile) {\n this.log(`Component found in registry: ${spec.name}`);\n \n // Still need to notify registry for usage tracking\n if (options.trackUsage !== false) {\n await this.notifyRegistryUsageIfNeeded(spec, componentKey);\n }\n \n // Get cached spec if available\n const cachedEntry = this.fetchCache.get(componentKey);\n \n return {\n success: true,\n component: existing,\n spec: cachedEntry?.spec || spec,\n fromCache: true\n };\n }\n \n // STEP 2: Fetch full spec if needed\n let fullSpec = spec;\n if (this.needsFetch(spec)) {\n this.log(`Fetching component spec: ${spec.name}`);\n try {\n fullSpec = await this.fetchComponentSpec(spec, options.contextUser, {\n resolutionMode: options.resolutionMode\n });\n\n // Cache the fetched spec\n this.fetchCache.set(componentKey, {\n spec: fullSpec,\n fetchedAt: new Date(),\n hash: this.calculateHash(fullSpec),\n usageNotified: false\n });\n } catch (error) {\n errors.push({\n message: `Failed to fetch component: ${error instanceof Error ? error.message : String(error)}`,\n phase: 'fetch',\n componentName: spec.name\n });\n throw error;\n }\n } else {\n // Log when we skip fetching because code is already provided\n if (spec.location === 'registry' && spec.code) {\n this.log(`Skipping fetch for registry component: ${spec.name} (code already provided)`, {\n location: spec.location,\n registry: spec.registry\n });\n }\n // Also cache the spec if it has code to avoid re-fetching\n if (spec.code && !this.fetchCache.has(componentKey)) {\n this.fetchCache.set(componentKey, {\n spec: fullSpec,\n fetchedAt: new Date(),\n hash: this.calculateHash(fullSpec),\n usageNotified: false\n });\n }\n }\n \n // STEP 3: Notify registry of usage (exactly once per session)\n if (options.trackUsage !== false) {\n await this.notifyRegistryUsageIfNeeded(fullSpec, componentKey);\n }\n \n // STEP 4: Compile if needed\n let compiledComponent = existing;\n if (!compiledComponent || options.forceRecompile) {\n this.log(`Compiling component: ${spec.name}`);\n try {\n compiledComponent = await this.compileComponent(fullSpec, options);\n } catch (error) {\n errors.push({\n message: `Failed to compile component: ${error instanceof Error ? error.message : String(error)}`,\n phase: 'compile',\n componentName: spec.name\n });\n throw error;\n }\n }\n \n // STEP 5: Register in ComponentRegistry\n if (!existing || options.forceRefresh || options.forceRecompile) {\n this.log(`Registering component: ${spec.name}`);\n // Register under the INPUT spec's hash so callers passing the same\n // spec shape on subsequent loads hit the cache. If we keyed by the\n // post-fetch fullSpec hash instead, registry-stub callers would\n // never re-find the entry they just cached.\n this.registry.register(\n fullSpec.name,\n compiledComponent,\n namespace,\n version,\n contentHash\n );\n }\n \n // STEP 6: Process dependencies recursively\n const dependencies: Record<string, ComponentObject> = {};\n if (fullSpec.dependencies && fullSpec.dependencies.length > 0) {\n this.log(`Loading ${fullSpec.dependencies.length} dependencies for ${spec.name}`);\n \n // Load dependencies in batches for efficiency\n const depResults = await this.loadDependenciesBatched(\n fullSpec.dependencies,\n { ...options, isDependent: true }\n );\n \n for (const result of depResults) {\n if (result.success && result.component) {\n const depSpec = fullSpec.dependencies.find(d => \n d.name === (result.spec?.name || '')\n );\n if (depSpec) {\n dependencies[depSpec.name] = result.component;\n }\n } else if (result.errors) {\n errors.push(...result.errors);\n }\n }\n }\n \n const elapsed = Date.now() - startTime;\n this.log(`Component loaded successfully: ${spec.name} (${elapsed}ms)`, {\n fromCache: false,\n dependencyCount: Object.keys(dependencies).length\n });\n \n return {\n success: errors.length === 0,\n component: compiledComponent,\n spec: fullSpec,\n fromCache: false,\n dependencies,\n errors: errors.length > 0 ? errors : undefined\n };\n \n } catch (error) {\n const elapsed = Date.now() - startTime;\n this.log(`Failed to load component: ${spec.name} (${elapsed}ms)`, error);\n \n return {\n success: false,\n fromCache: false,\n errors: errors.length > 0 ? errors : [{\n message: error instanceof Error ? error.message : String(error),\n phase: 'fetch',\n componentName: spec.name\n }]\n };\n }\n }\n \n /**\n * Load a complete hierarchy efficiently\n */\n async loadHierarchy(\n rootSpec: ComponentSpec,\n options: LoadOptions = {}\n ): Promise<HierarchyResult> {\n const startTime = Date.now();\n const loaded: string[] = [];\n const errors: HierarchyResult['errors'] = [];\n const components: Record<string, ComponentObject> = {};\n const stats = {\n fromCache: 0,\n fetched: 0,\n compiled: 0,\n totalTime: 0\n };\n \n this.log(`Loading component hierarchy: ${rootSpec.name}`, {\n location: rootSpec.location,\n registry: rootSpec.registry\n });\n \n try {\n // Initialize component engine if needed (skip in browser context where it doesn't exist)\n if (this.componentEngine && typeof this.componentEngine.Config === 'function') {\n await this.componentEngine.Config(false, options.contextUser);\n }\n \n // Load the root component and all its dependencies\n const result = await this.loadComponentRecursive(\n rootSpec,\n options,\n loaded,\n errors,\n components,\n stats,\n new Set()\n );\n \n stats.totalTime = Date.now() - startTime;\n \n this.log(`Hierarchy loaded: ${rootSpec.name}`, {\n success: errors.length === 0,\n loadedCount: loaded.length,\n errors: errors.length,\n ...stats\n });\n \n // Unwrap components before returning\n // Components are ComponentObject wrappers, but consumers expect just the React components\n const unwrappedComponents: Record<string, ComponentObject> = {};\n for (const [name, componentObject] of Object.entries(components)) {\n if (componentObject && typeof componentObject === 'object' && 'component' in componentObject) {\n // Extract the actual React component function\n unwrappedComponents[name] = (componentObject as any).component;\n } else {\n // Already a function or something else - use as-is\n unwrappedComponents[name] = componentObject;\n }\n }\n \n return {\n success: errors.length === 0,\n rootComponent: result.component,\n resolvedSpec: result.spec,\n loadedComponents: loaded,\n errors,\n components: unwrappedComponents,\n stats\n };\n \n } catch (error) {\n stats.totalTime = Date.now() - startTime;\n \n this.log(`Failed to load hierarchy: ${rootSpec.name}`, error);\n \n return {\n success: false,\n loadedComponents: loaded,\n errors: [...errors, {\n message: error instanceof Error ? error.message : String(error),\n phase: 'fetch',\n componentName: rootSpec.name\n }],\n stats\n };\n }\n }\n \n /**\n * Recursively load a component and its dependencies\n */\n private async loadComponentRecursive(\n spec: ComponentSpec,\n options: LoadOptions,\n loaded: string[],\n errors: HierarchyResult['errors'],\n components: Record<string, ComponentObject>,\n stats: HierarchyResult['stats'],\n visited: Set<string>\n ): Promise<LoadResult> {\n const componentKey = this.getComponentKey(spec, options);\n \n // Prevent circular dependencies\n if (visited.has(componentKey)) {\n this.log(`Circular dependency detected: ${spec.name}`);\n return {\n success: true,\n component: components[spec.name],\n spec,\n fromCache: true\n };\n }\n visited.add(componentKey);\n \n // Load this component\n const result = await this.loadComponent(spec, options);\n \n if (result.success && result.component) {\n loaded.push(spec.name);\n components[spec.name] = result.component;\n \n // Update stats\n if (stats) {\n if (result.fromCache) stats.fromCache++;\n else {\n stats.fetched++;\n stats.compiled++;\n }\n }\n \n // Load dependencies\n // Prefer the input spec's dependencies over the cached result's dependencies.\n // When a parent component is served from cache, result.spec contains stale\n // dependency code. The input spec has the latest dependency code from the caller.\n // Each dependency still gets its own individual cache check via loadComponent.\n const dependencies = spec.dependencies || result.spec?.dependencies;\n if (dependencies) {\n for (const dep of dependencies) {\n // Normalize dependency spec for local registry lookup\n const depSpec = { ...dep };\n // OPTIMIZATION: If the dependency already has code (from registry population),\n // we can skip fetching and go straight to compilation\n if (depSpec.code) {\n this.log(`Dependency ${depSpec.name} already has code (from registry population), optimizing load`);\n }\n\n // If location is \"registry\" with undefined registry, ensure it's treated as local\n // This follows the convention that registry components with undefined registry\n // should be looked up in the local ComponentMetadataEngine\n if (depSpec.location === 'registry' && !depSpec.registry) {\n // Explicitly set to undefined for clarity (it may already be undefined)\n depSpec.registry = undefined;\n\n // Log for debugging\n this.log(`Dependency ${depSpec.name} is a local registry component (registry=undefined)`);\n }\n\n await this.loadComponentRecursive(\n depSpec,\n { ...options, isDependent: true },\n loaded,\n errors,\n components,\n stats,\n visited\n );\n }\n }\n } else if (result.errors) {\n errors.push(...result.errors);\n }\n \n return result;\n }\n \n /**\n * Load dependencies in batches for efficiency\n */\n private async loadDependenciesBatched(\n dependencies: ComponentSpec[],\n options: LoadOptions\n ): Promise<LoadResult[]> {\n const batchSize = this.config.dependencyBatchSize || 5;\n const results: LoadResult[] = [];\n \n for (let i = 0; i < dependencies.length; i += batchSize) {\n const batch = dependencies.slice(i, i + batchSize);\n const batchPromises = batch.map(dep => this.loadComponent(dep, options));\n const batchResults = await Promise.all(batchPromises);\n results.push(...batchResults);\n }\n \n return results;\n }\n \n /**\n * Check if a component needs to be fetched from a registry\n */\n private needsFetch(spec: ComponentSpec): boolean {\n // Need to fetch if:\n // 1. It's a registry component without code\n // 2. It's missing required fields\n return spec.location === 'registry' && !spec.code;\n }\n \n /**\n * Fetch a component specification from a registry (local or external)\n * \n * Convention: When location === 'registry' and registry === undefined,\n * the component is looked up in the local ComponentMetadataEngine.\n * This allows components to reference local registry components without\n * having to know if they're embedded or registry-based.\n */\n private async fetchComponentSpec(\n spec: ComponentSpec,\n contextUser?: UserInfo,\n options?: { resolutionMode?: ResolutionMode }\n ): Promise<ComponentSpec> {\n // Check cache first\n const cacheKey = this.getComponentKey(spec, {});\n const cached = this.fetchCache.get(cacheKey);\n\n if (cached && this.isCacheValid(cached)) {\n this.log(`Using cached spec for: ${spec.name}`);\n return cached.spec;\n }\n\n // Handle LOCAL registry components (registry is null/undefined)\n if (!spec.registry) {\n const localComponent = await this.componentEngine.FindComponent(spec.name, spec.namespace);\n\n if (!localComponent) {\n throw new Error(`Local component not found: ${spec.name}`);\n }\n\n if (!localComponent.Specification) {\n throw new Error(`Local component ${spec.name} has no specification`);\n }\n\n const fullSpec = JSON.parse(localComponent.Specification);\n\n this.fetchCache.set(cacheKey, {\n spec: fullSpec,\n fetchedAt: new Date(),\n usageNotified: false\n });\n\n return fullSpec;\n }\n\n // Handle EXTERNAL registry components (registry has a name)\n if (!this.graphQLClient) {\n await this.initializeGraphQLClient();\n }\n\n if (!this.graphQLClient) {\n throw new Error('GraphQL client not available for registry fetching');\n }\n\n // Fetch from external registry, passing the cached hash (if any) so the\n // server can return 304 Not Modified when the spec hasn't changed\n this.log(`Fetching from external registry: ${spec.registry}/${spec.name}`);\n const cachedHash = cached?.hash;\n\n const response = await this.graphQLClient.GetRegistryComponentWithHash({\n registryName: spec.registry,\n namespace: spec.namespace || 'Global',\n name: spec.name,\n version: spec.version || 'latest',\n hash: cachedHash\n });\n\n // If not modified (304), reuse the cached spec and refresh the TTL\n if (response.notModified && cached) {\n this.log(`Registry returned 304 for ${spec.name}, reusing cached spec`);\n this.fetchCache.set(cacheKey, {\n ...cached,\n fetchedAt: new Date()\n });\n return cached.spec;\n }\n\n if (!response.specification) {\n throw new Error(`Component not found in registry: ${spec.registry}/${spec.name}`);\n }\n\n const fullSpec = response.specification as ComponentSpec;\n const processedSpec = this.applyResolutionMode(fullSpec, spec, options?.resolutionMode);\n\n // Cache it with the registry hash for future 304 checks\n this.fetchCache.set(cacheKey, {\n spec: processedSpec,\n fetchedAt: new Date(),\n hash: response.hash,\n usageNotified: false\n });\n\n return processedSpec;\n }\n \n /**\n * Apply resolution mode to a fetched spec (recursively including dependencies)\n */\n private applyResolutionMode(\n fullSpec: ComponentSpec,\n originalSpec: ComponentSpec,\n resolutionMode?: ResolutionMode\n ): ComponentSpec {\n let processedSpec: ComponentSpec;\n \n if (resolutionMode === 'embed') {\n // Convert to embedded format for test harness\n processedSpec = {\n ...fullSpec,\n location: 'embedded',\n registry: undefined,\n // namespace and name can stay for identification\n };\n } else {\n // Default: preserve-metadata mode\n // Keep original registry metadata but include fetched code\n processedSpec = {\n ...fullSpec,\n location: originalSpec.location,\n registry: originalSpec.registry,\n namespace: originalSpec.namespace || fullSpec.namespace,\n name: originalSpec.name || fullSpec.name\n };\n }\n \n // Recursively apply resolution mode to dependencies\n if (processedSpec.dependencies && processedSpec.dependencies.length > 0) {\n processedSpec.dependencies = processedSpec.dependencies.map(dep => {\n // For dependencies, use the dep itself as both full and original spec\n // since they've already been fetched and processed\n return this.applyResolutionMode(dep, dep, resolutionMode);\n });\n }\n \n return processedSpec;\n }\n\n /**\n * Compile a component specification\n */\n private async compileComponent(\n spec: ComponentSpec,\n options: LoadOptions\n ): Promise<ComponentObject> {\n // Get all available libraries - use passed libraries or fall back to ComponentMetadataEngine\n const allLibraries = options.allLibraries || this.componentEngine.ComponentLibraries || [];\n \n // Filter valid libraries\n const validLibraries = spec.libraries?.filter(lib => \n lib && lib.name && lib.globalVariable && \n lib.name !== 'unknown' && lib.globalVariable !== 'undefined'\n );\n \n // Compile the component\n const result = await this.compiler.compile({\n componentName: spec.name,\n componentCode: spec.code || '',\n libraries: validLibraries,\n dependencies: spec.dependencies,\n allLibraries\n });\n \n if (!result.success || !result.component) {\n throw new Error(result.error?.message || 'Compilation failed');\n }\n \n // Add loaded libraries to runtime context\n if (result.loadedLibraries && result.loadedLibraries.size > 0) {\n if (!this.runtimeContext.libraries) {\n this.runtimeContext.libraries = {};\n }\n result.loadedLibraries.forEach((value, key) => {\n this.runtimeContext.libraries![key] = value;\n });\n }\n \n // Get the component object from the factory\n const componentObject = result.component.factory(\n this.runtimeContext,\n undefined, // styles\n {} // components - will be injected by parent\n );\n \n return componentObject;\n }\n \n /**\n * Notify registry of component usage for licensing\n * Only happens once per component per session\n */\n private async notifyRegistryUsageIfNeeded(\n spec: ComponentSpec,\n componentKey: string\n ): Promise<void> {\n if (!spec.registry || !this.config.enableUsageTracking) {\n return; // Only for external registry components with tracking enabled\n }\n \n const notificationKey = `${spec.registry}:${componentKey}`;\n if (this.registryNotifications.has(notificationKey)) {\n this.log(`Usage already notified for: ${spec.name}`);\n return; // Already notified this session\n }\n \n try {\n // In the future, make lightweight usage notification call to registry\n // For now, the fetch itself serves as the notification\n this.log(`Notifying registry usage for: ${spec.name}`);\n this.registryNotifications.add(notificationKey);\n \n // Update cache entry\n const cached = this.fetchCache.get(componentKey);\n if (cached) {\n cached.usageNotified = true;\n }\n } catch (error) {\n // Log but don't fail - usage tracking shouldn't break component loading\n console.warn(`Failed to notify registry usage for ${componentKey}:`, error);\n }\n }\n \n /**\n * Initialize GraphQL client for registry operations\n */\n private async initializeGraphQLClient(): Promise<void> {\n try {\n const provider = Metadata?.Provider;\n if (provider && (provider as any).ExecuteGQL) {\n const { GraphQLComponentRegistryClient } = await import('@memberjunction/graphql-dataprovider');\n this.graphQLClient = new GraphQLComponentRegistryClient(provider as any);\n this.log('GraphQL client initialized');\n }\n } catch (error) {\n LogError(`Failed to initialize GraphQL client: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n \n /**\n * Check if a cache entry is still valid\n */\n private isCacheValid(entry: CacheEntry): boolean {\n const age = Date.now() - entry.fetchedAt.getTime();\n return age < (this.config.cacheTTL || 3600000);\n }\n \n /**\n * Calculate a content fingerprint for a component spec. Used both as a\n * cache-validation marker on `CacheEntry` and as part of the cache key so\n * specs that share `(registry, namespace, name, version)` but carry\n * different `code` (e.g. a registry-reference stub vs. an inline-code\n * Studio export of the same artifact) do not collide on a single cache\n * slot. Sync because callers use it to build keys in non-async paths.\n */\n private calculateHash(spec: ComponentSpec): string {\n // Simple hash based on spec content\n const content = JSON.stringify({\n name: spec.name,\n version: spec.version,\n code: spec.code,\n libraries: spec.libraries\n });\n\n // FNV-style 32-bit integer hash\n let hash = 0;\n for (let i = 0; i < content.length; i++) {\n const char = content.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash;\n }\n return hash.toString(16);\n }\n \n /**\n * Generate a unique key for a component. Includes a content fingerprint so\n * specs that share `(registry, namespace, name, version)` but carry\n * different `code` (e.g. a registry-reference stub vs. an inline-code\n * Studio export of the same artifact) are cached as separate entries\n * instead of clobbering each other on a single slot.\n */\n private getComponentKey(spec: ComponentSpec, options: LoadOptions): string {\n const registry = spec.registry || 'local';\n const namespace = spec.namespace || options.defaultNamespace || 'Global';\n const version = spec.version || options.defaultVersion || 'latest';\n const hash = this.calculateHash(spec);\n return `${registry}:${namespace}:${spec.name}:${version}#${hash}`;\n }\n \n /**\n * Clear all caches\n */\n clearCache(): void {\n this.fetchCache.clear();\n this.registryNotifications.clear();\n this.loadingPromises.clear();\n this.log('All caches cleared');\n }\n \n /**\n * Get cache statistics\n */\n getCacheStats(): {\n fetchCacheSize: number;\n notificationsCount: number;\n loadingCount: number;\n } {\n return {\n fetchCacheSize: this.fetchCache.size,\n notificationsCount: this.registryNotifications.size,\n loadingCount: this.loadingPromises.size\n };\n }\n \n /**\n * Log a message if debug is enabled\n */\n private log(message: string, data?: any): void {\n if (this.config.debug) {\n console.log(`๐ฏ [ComponentManager] ${message}`, data || '');\n }\n }\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-registry-service.d.ts","sourceRoot":"","sources":["../../src/registry/component-registry-service.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC7F,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAGL,uBAAuB,EACvB,cAAc,EAEf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAY,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAgC7E,MAAM,WAAW,wBAAwB;IACvC,oBAAoB,CAAC,MAAM,EAAE;QAC3B,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;CACnC;AAKD,qBAAa,wBAAwB;IACnC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAyC;IAGhE,OAAO,CAAC,sBAAsB,CAA8C;IAC5E,OAAO,CAAC,mBAAmB,CAAkC;IAG7D,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,eAAe,CAAoC;IAC3D,OAAO,CAAC,iBAAiB,CAAuC;IAChE,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,aAAa,CAAC,CAA2B;IACjD,OAAO,CAAC,SAAS,CAAkC;IAOnD,IAAW,QAAQ,IAAI,iBAAiB,CAEvC;IACD,IAAW,QAAQ,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,EAElD;IAED,OAAO;IAeP,MAAM,CAAC,WAAW,CAChB,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,EAAE,cAAc,EACvB,KAAK,GAAE,OAAe,EACtB,aAAa,CAAC,EAAE,wBAAwB,GACvC,wBAAwB;IAU3B,gBAAgB,CAAC,MAAM,EAAE,wBAAwB,GAAG,IAAI;IAUxD,OAAO,CAAC,oBAAoB,CAAyC;YAMvD,gBAAgB;IAyDxB,UAAU,CAAC,WAAW,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;YASzC,iBAAiB;IA2BzB,oBAAoB,CACxB,WAAW,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,MAAM,EACpB,WAAW,CAAC,EAAE,QAAQ,GACrB,OAAO,CAAC,eAAe,CAAC;IAuGrB,gCAAgC,CACpC,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,MAAM,EACpB,WAAW,CAAC,EAAE,QAAQ,GACrB,OAAO,CAAC,GAAG,CAAC;IA8IT,gBAAgB,CACpB,WAAW,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,QAAQ,GACrB,OAAO,CAAC,aAAa,CAAC;YA0EX,yBAAyB;YAkCzB,sBAAsB;IA0F9B,gBAAgB,CACpB,WAAW,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,QAAQ,GACrB,OAAO,CAAC,uBAAuB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"component-registry-service.d.ts","sourceRoot":"","sources":["../../src/registry/component-registry-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -100,7 +100,7 @@ export class ComponentRegistryService {
|
|
|
100
100
|
}
|
|
101
101
|
async getCompiledComponent(componentId, referenceId, contextUser) {
|
|
102
102
|
await this.initialize(contextUser);
|
|
103
|
-
const component = this.componentEngine.
|
|
103
|
+
const component = await this.componentEngine.FindComponentByID(componentId, contextUser);
|
|
104
104
|
if (!component) {
|
|
105
105
|
throw new Error(`Component not found: ${componentId}`);
|
|
106
106
|
}
|
|
@@ -267,7 +267,7 @@ export class ComponentRegistryService {
|
|
|
267
267
|
}
|
|
268
268
|
async getComponentSpec(componentId, contextUser) {
|
|
269
269
|
await this.initialize(contextUser);
|
|
270
|
-
const component = this.componentEngine.
|
|
270
|
+
const component = await this.componentEngine.FindComponentByID(componentId, contextUser);
|
|
271
271
|
if (!component) {
|
|
272
272
|
throw new Error(`Component not found: ${componentId}`);
|
|
273
273
|
}
|
|
@@ -391,7 +391,7 @@ export class ComponentRegistryService {
|
|
|
391
391
|
const dependencies = this.componentEngine.ComponentDependencies?.filter(d => UUIDsEqual(d.ComponentID, componentId)) || [];
|
|
392
392
|
const result = [];
|
|
393
393
|
for (const dep of dependencies) {
|
|
394
|
-
const depComponent = this.componentEngine.
|
|
394
|
+
const depComponent = await this.componentEngine.FindComponentByID(dep.DependencyComponentID, contextUser);
|
|
395
395
|
if (depComponent) {
|
|
396
396
|
result.push({
|
|
397
397
|
name: depComponent.Name,
|
|
@@ -414,15 +414,14 @@ export class ComponentRegistryService {
|
|
|
414
414
|
}
|
|
415
415
|
visited.add(componentId);
|
|
416
416
|
await this.initialize(contextUser);
|
|
417
|
-
const component = this.componentEngine.
|
|
417
|
+
const component = await this.componentEngine.FindComponentByID(componentId, contextUser);
|
|
418
418
|
if (!component) {
|
|
419
419
|
return { componentId, dependencies: [] };
|
|
420
420
|
}
|
|
421
421
|
const directDeps = await this.loadDependencies(componentId, contextUser);
|
|
422
422
|
const dependencies = [];
|
|
423
423
|
for (const dep of directDeps) {
|
|
424
|
-
const depComponent = this.componentEngine.
|
|
425
|
-
c.Namespace?.trim().toLowerCase() === dep.namespace?.trim().toLowerCase());
|
|
424
|
+
const depComponent = await this.componentEngine.FindComponent(dep.name, dep.namespace, undefined, contextUser);
|
|
426
425
|
if (depComponent) {
|
|
427
426
|
const subTree = await this.resolveDependencyTree(depComponent.ID, contextUser, visited);
|
|
428
427
|
dependencies.push(subTree);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-registry-service.js","sourceRoot":"","sources":["../../src/registry/component-registry-service.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Service for managing registry-based component loading with caching\n * @module @memberjunction/react-runtime/registry\n */\n\nimport { ComponentSpec, ComponentObject } from '@memberjunction/interactive-component-types';\nimport { ComponentCompiler } from '../compiler';\nimport { RuntimeContext } from '../types';\nimport { \n RegistryProvider, \n RegistryComponentResponse,\n ComponentDependencyInfo,\n DependencyTree, \n RegistryComponentMetadata\n} from './registry-provider';\nimport { UserInfo, Metadata, IMetadataProvider } from '@memberjunction/core';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { \n MJComponentEntity, \n MJComponentRegistryEntity,\n MJComponentDependencyEntity,\n MJComponentLibraryLinkEntity,\n ComponentMetadataEngine\n} from '@memberjunction/core-entities';\n\n// Type-only import for TypeScript - won't be included in UMD bundle\nimport type { GraphQLDataProvider } from '@memberjunction/graphql-dataprovider';\n\n// Dynamic import of GraphQLComponentRegistryClient to avoid breaking UMD build\nlet GraphQLComponentRegistryClient: any;\n\n\n/**\n * Cached compiled component with metadata\n */\ninterface CachedCompiledComponent {\n component: (context: RuntimeContext, styles?: any, components?: Record<string, any>) => ComponentObject;\n metadata: RegistryComponentResponse['metadata'];\n compiledAt: Date;\n lastUsed: Date;\n useCount: number;\n specHash?: string; // SHA-256 hash of the spec used for compilation\n}\n\n/**\n * GraphQL client interface for registry operations\n */\nexport interface IComponentRegistryClient {\n GetRegistryComponent(params: {\n registryName: string;\n namespace: string;\n name: string;\n version?: string;\n hash?: string;\n }): Promise<ComponentSpec | null>;\n}\n\n/**\n * Service for managing component loading from registries with compilation caching\n */\nexport class ComponentRegistryService {\n private static instance: ComponentRegistryService | null = null;\n \n // Caches\n private compiledComponentCache = new Map<string, CachedCompiledComponent>();\n private componentReferences = new Map<string, Set<string>>();\n \n // Dependencies\n private compiler: ComponentCompiler;\n private runtimeContext: RuntimeContext;\n private componentEngine = ComponentMetadataEngine.Instance;\n private registryProviders = new Map<string, RegistryProvider>();\n private debug: boolean = false;\n private graphQLClient?: IComponentRegistryClient;\n private _provider: IMetadataProvider | null = null;\n\n /**\n * Optional metadata provider override. Callers should set\n * `instance.Provider = providerToUse` before invoking registry methods\n * in multi-provider contexts. Falls back to the global default provider when unset.\n */\n public get Provider(): IMetadataProvider {\n return this._provider ?? (new Metadata() as unknown as IMetadataProvider);\n }\n public set Provider(value: IMetadataProvider | null) {\n this._provider = value;\n }\n \n private constructor(\n compiler: ComponentCompiler,\n runtimeContext: RuntimeContext,\n debug: boolean = false,\n graphQLClient?: IComponentRegistryClient\n ) {\n this.compiler = compiler;\n this.runtimeContext = runtimeContext;\n this.debug = debug;\n this.graphQLClient = graphQLClient;\n }\n \n /**\n * Get or create the singleton instance\n */\n static getInstance(\n compiler: ComponentCompiler, \n context: RuntimeContext,\n debug: boolean = false,\n graphQLClient?: IComponentRegistryClient\n ): ComponentRegistryService {\n if (!ComponentRegistryService.instance) {\n ComponentRegistryService.instance = new ComponentRegistryService(compiler, context, debug, graphQLClient);\n }\n return ComponentRegistryService.instance;\n }\n \n /**\n * Set the GraphQL client for registry operations\n */\n setGraphQLClient(client: IComponentRegistryClient): void {\n this.graphQLClient = client;\n if (this.debug) {\n console.log('โ
GraphQL client configured for component registry');\n }\n }\n \n /**\n * Cached GraphQL client instance created from Metadata.Provider\n */\n private cachedProviderClient: IComponentRegistryClient | null = null;\n \n /**\n * Get the GraphQL client, using the provided one or falling back to creating one with Metadata.Provider\n * @returns The GraphQL client if available\n */\n private async getGraphQLClient(): Promise<IComponentRegistryClient | null> {\n // If explicitly set, use that\n if (this.graphQLClient) {\n return this.graphQLClient;\n }\n \n // If we've already created one from the provider, reuse it\n if (this.cachedProviderClient) {\n return this.cachedProviderClient;\n }\n \n // Try to create GraphQLComponentRegistryClient with Metadata.Provider\n try {\n const provider = Metadata?.Provider;\n if (provider && (provider as any).ExecuteGQL !== undefined) {\n // Dynamically load GraphQLComponentRegistryClient if not already loaded\n if (!GraphQLComponentRegistryClient) {\n try {\n const graphqlModule = await import('@memberjunction/graphql-dataprovider');\n GraphQLComponentRegistryClient = graphqlModule.GraphQLComponentRegistryClient;\n } catch (importError) {\n if (this.debug) {\n console.log('โ ๏ธ [ComponentRegistryService] @memberjunction/graphql-dataprovider not available');\n }\n return null;\n }\n }\n \n // Create the client if we have the class\n if (GraphQLComponentRegistryClient) {\n try {\n const client = new GraphQLComponentRegistryClient(provider as GraphQLDataProvider);\n this.cachedProviderClient = client;\n if (this.debug) {\n console.log('๐ก [ComponentRegistryService] Created GraphQL client from active metadata provider');\n }\n return client;\n } catch (error) {\n if (this.debug) {\n console.log('โ ๏ธ [ComponentRegistryService] Failed to create GraphQL client:', error);\n }\n }\n }\n }\n } catch (error) {\n // Provider might not be available in all environments\n if (this.debug) {\n console.log('โ ๏ธ [ComponentRegistryService] Could not access metadata provider:', error);\n }\n }\n \n return null;\n }\n \n /**\n * Initialize the service with metadata\n */\n async initialize(contextUser?: UserInfo): Promise<void> {\n // Initialize metadata engine\n await this.componentEngine.Config(false, contextUser);\n }\n \n /**\n * Calculate SHA-256 hash of a component spec for cache comparison\n * Uses Web Crypto API which is available in modern browsers and Node.js 15+\n */\n private async calculateSpecHash(spec: ComponentSpec): Promise<string> {\n // Check for crypto.subtle availability\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n throw new Error(\n 'Web Crypto API not available. This typically happens when running in an insecure context. ' +\n 'Please use HTTPS or localhost for development. ' +\n 'Note: crypto.subtle is available in Node.js 15+ and all modern browsers on secure contexts.'\n );\n }\n \n const specString = JSON.stringify(spec);\n const encoder = new TextEncoder();\n const data = encoder.encode(specString);\n \n // Calculate SHA-256 hash using Web Crypto API\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n \n // Convert ArrayBuffer to hex string\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');\n \n return hashHex;\n }\n \n /**\n * Get a compiled component, using cache if available\n */\n async getCompiledComponent(\n componentId: string,\n referenceId?: string,\n contextUser?: UserInfo\n ): Promise<ComponentObject> {\n await this.initialize(contextUser);\n \n // Find component in metadata\n const component = this.componentEngine.Components.find((c: MJComponentEntity) => UUIDsEqual(c.ID, componentId));\n if (!component) {\n throw new Error(`Component not found: ${componentId}`);\n }\n\n const key = this.getComponentKey(component.Name, component.Namespace, component.Version, component.SourceRegistryID);\n \n // Check if already compiled and cached\n if (this.compiledComponentCache.has(key)) {\n const cached = this.compiledComponentCache.get(key)!;\n cached.lastUsed = new Date();\n cached.useCount++;\n \n // Track reference if provided\n if (referenceId) {\n this.addComponentReference(key, referenceId);\n }\n \n if (this.debug) {\n console.log(`โ
Reusing compiled component from cache: ${key} (use count: ${cached.useCount})`);\n }\n // Call the factory function to get the ComponentObject\n return cached.component(this.runtimeContext);\n }\n \n // Not in cache, need to load and compile\n if (this.debug) {\n console.log(`๐ Loading and compiling component: ${key}`);\n }\n \n // Get the component specification\n const spec = await this.getComponentSpec(componentId, contextUser);\n \n // Compile the component\n // Load all libraries from metadata engine\n const allLibraries = this.componentEngine.ComponentLibraries || [];\n \n let compilationResult;\n try {\n compilationResult = await this.compiler.compile({\n componentName: component.Name,\n componentCode: spec.code,\n libraries: spec.libraries,\n allLibraries\n });\n }\n catch (compileEx) {\n // log then throw\n console.error(`๐ด Error compiling component ${component.Name}`,compileEx);\n throw compileEx;\n }\n \n if (!compilationResult.success) {\n console.error(`๐ด Error compiling component ${component.Name}`, compilationResult, 'Code', spec.code);\n throw new Error(`Failed to compile component ${component.Name}: ${compilationResult.error}`);\n }\n \n // Cache the compiled component\n const metadata: RegistryComponentMetadata = {\n name: component.Name,\n namespace: component.Namespace || '',\n version: component.Version,\n description: component.Description || '',\n title: component.Title || undefined,\n type: component.Type || undefined,\n status: component.Status || undefined,\n properties: spec.properties,\n events: spec.events,\n libraries: spec.libraries,\n dependencies: spec.dependencies,\n sourceRegistryID: component.SourceRegistryID,\n isLocal: !component.SourceRegistryID\n };\n \n if (!compilationResult.component) {\n throw new Error(`Component compilation succeeded but no component returned`);\n }\n const compiledComponentFactory = compilationResult.component.factory;\n this.compiledComponentCache.set(key, {\n component: compiledComponentFactory,\n metadata,\n compiledAt: new Date(),\n lastUsed: new Date(),\n useCount: 1\n });\n \n // Track reference\n if (referenceId) {\n this.addComponentReference(key, referenceId);\n }\n \n // Call the factory function to get the ComponentObject\n return compiledComponentFactory(this.runtimeContext);\n }\n \n /**\n * Get compiled component from external registry by registry name\n * This is used when spec.registry field is populated\n */\n async getCompiledComponentFromRegistry(\n registryName: string,\n namespace: string,\n name: string,\n version: string,\n referenceId?: string,\n contextUser?: UserInfo\n ): Promise<any> {\n await this.initialize(contextUser);\n \n if (this.debug) {\n console.log(`๐ [ComponentRegistryService] Fetching from external registry: ${registryName}/${namespace}/${name}@${version}`);\n }\n \n // Find the registry by name in ComponentRegistries\n const registry = this.componentEngine.ComponentRegistries?.find(\n r => r.Name === registryName && r.Status === 'Active'\n );\n \n if (!registry) {\n throw new Error(`Registry not found or inactive: ${registryName}`);\n }\n \n if (this.debug) {\n console.log(`โ
[ComponentRegistryService] Found registry: ${registry.Name} (ID: ${registry.ID})`);\n }\n \n // Get GraphQL client - use provided one or fallback to Metadata.Provider\n const graphQLClient = await this.getGraphQLClient();\n if (!graphQLClient) {\n throw new Error('GraphQL client not available for external registry fetching. No client provided and the active metadata provider is not a GraphQLDataProvider.');\n }\n \n // Check if we have a cached version first\n const key = `external:${registryName}:${namespace}:${name}:${version}`;\n const cached = this.compiledComponentCache.get(key);\n \n try {\n // Fetch component spec from external registry via MJServer\n // Pass cached hash if available for efficient caching\n const spec = await graphQLClient.GetRegistryComponent({\n registryName: registry.Name, // Pass registry name, not ID\n namespace,\n name,\n version,\n hash: cached?.specHash // Pass cached hash if available\n });\n \n // If null returned, it means not modified (304)\n if (!spec && cached?.specHash) {\n if (this.debug) {\n console.log(`โป๏ธ [ComponentRegistryService] Component not modified, using cached: ${key}`);\n }\n cached.lastUsed = new Date();\n cached.useCount++;\n \n // Track reference\n if (referenceId) {\n this.addComponentReference(key, referenceId);\n }\n \n // Call the factory function to get the ComponentObject\n return cached.component(this.runtimeContext);\n }\n \n if (!spec) {\n throw new Error(`Component not found in registry ${registryName}: ${namespace}/${name}@${version}`);\n }\n \n if (this.debug) {\n console.log(`โ
[ComponentRegistryService] Fetched spec from external registry: ${spec.name}`);\n }\n \n // Calculate hash of the fetched spec\n const specHash = await this.calculateSpecHash(spec);\n \n // Check if hash matches cached version (shouldn't happen if server works correctly)\n if (cached && cached.specHash === specHash) {\n if (this.debug) {\n console.log(`โป๏ธ [ComponentRegistryService] Using cached compilation for: ${key} (hash match)`);\n }\n cached.lastUsed = new Date();\n cached.useCount++;\n \n // Track reference\n if (referenceId) {\n this.addComponentReference(key, referenceId);\n }\n \n // Call the factory function to get the ComponentObject\n return cached.component(this.runtimeContext);\n }\n \n // Spec has changed or is new, need to compile\n if (cached && this.debug) {\n console.log(`๐ [ComponentRegistryService] Spec changed for: ${key}, recompiling (old hash: ${cached.specHash?.substring(0, 8)}..., new hash: ${specHash.substring(0, 8)}...)`);\n }\n \n // Load all libraries from metadata engine\n const allLibraries = this.componentEngine.ComponentLibraries || [];\n \n // Compile the component\n const compilationResult = await this.compiler.compile({\n componentName: spec.name,\n componentCode: spec.code || '',\n allLibraries: allLibraries\n });\n \n if (!compilationResult.success || !compilationResult.component) {\n throw new Error(`Failed to compile component: ${compilationResult.error?.message || 'Unknown error'}`);\n }\n \n // Cache the compiled component with spec hash\n this.compiledComponentCache.set(key, {\n component: compilationResult.component.factory,\n metadata: {\n name: spec.name,\n namespace: spec.namespace || '',\n version: spec.version || '1.0.0',\n description: spec.description || '',\n type: spec.type,\n isLocal: false // This is from an external registry\n },\n compiledAt: new Date(),\n lastUsed: new Date(),\n useCount: 1,\n specHash: specHash // Store the hash for future comparison\n });\n \n // Track reference\n if (referenceId) {\n this.addComponentReference(key, referenceId);\n }\n \n if (this.debug) {\n console.log(`๐ฏ [ComponentRegistryService] Successfully compiled external component: ${spec.name}`);\n }\n \n // Call the factory function to get the ComponentObject\n return compilationResult.component.factory(this.runtimeContext);\n } catch (error) {\n console.error(`โ [ComponentRegistryService] Failed to fetch from external registry:`, error);\n throw error;\n }\n }\n \n /**\n * Get component specification from database or external registry\n */\n async getComponentSpec(\n componentId: string,\n contextUser?: UserInfo\n ): Promise<ComponentSpec> {\n await this.initialize(contextUser);\n \n const component = this.componentEngine.Components.find((c: MJComponentEntity) => UUIDsEqual(c.ID, componentId));\n if (!component) {\n throw new Error(`Component not found: ${componentId}`);\n }\n\n if (!component.SourceRegistryID) {\n // LOCAL: Use specification from database\n if (!component.Specification) {\n throw new Error(`Local component ${component.Name} has no specification`);\n }\n return JSON.parse(component.Specification);\n }\n \n // EXTERNAL: Check if we have a cached version\n if (component.Specification && component.LastSyncedAt) {\n // For now, always use cached version (no expiration)\n if (this.debug) {\n console.log(`Using cached external component: ${component.Name} (synced: ${component.LastSyncedAt})`);\n }\n return JSON.parse(component.Specification);\n }\n \n // Need to fetch from external registry\n const registry = this.componentEngine.ComponentRegistries?.find(\n r => UUIDsEqual(r.ID, component.SourceRegistryID)\n );\n \n if (!registry) {\n throw new Error(`Registry not found: ${component.SourceRegistryID}`);\n }\n \n // Try GraphQL client first if available\n let spec: ComponentSpec;\n \n if (this.graphQLClient) {\n if (this.debug) {\n console.log(`Fetching from registry via GraphQL: ${component.Name}`);\n }\n \n const result = await this.graphQLClient.GetRegistryComponent({\n registryName: registry.Name,\n namespace: component.Namespace || '',\n name: component.Name,\n version: component.Version\n });\n \n if (!result) {\n throw new Error(`Component not found in registry: ${component.Name}`);\n }\n \n spec = result;\n } else {\n // Fallback to direct HTTP if no GraphQL client\n spec = await this.fetchFromExternalRegistry(\n registry.URI || '',\n component.Name,\n component.Namespace || '',\n component.Version,\n this.getRegistryApiKey(registry.ID)\n );\n }\n \n // Store in local database for future use\n await this.cacheExternalComponent(componentId, spec, contextUser);\n \n return spec;\n }\n \n /**\n * Fetch component from external registry via HTTP\n */\n private async fetchFromExternalRegistry(\n uri: string,\n name: string,\n namespace: string,\n version: string,\n apiKey?: string\n ): Promise<ComponentSpec> {\n const url = `${uri}/components/${encodeURIComponent(namespace)}/${encodeURIComponent(name)}/${version}`;\n \n const headers: HeadersInit = {\n 'Accept': 'application/json'\n };\n \n if (apiKey) {\n headers['Authorization'] = `Bearer ${apiKey}`;\n }\n \n if (this.debug) {\n console.log(`Fetching from external registry: ${url}`);\n }\n \n const response = await fetch(url, { headers });\n \n if (!response.ok) {\n throw new Error(`Registry fetch failed: ${response.status} ${response.statusText}`);\n }\n \n const spec = await response.json() as ComponentSpec;\n return spec;\n }\n \n /**\n * Cache an external component in the local database\n */\n private async cacheExternalComponent(\n componentId: string,\n spec: ComponentSpec,\n contextUser?: UserInfo\n ): Promise<void> {\n // Get the actual entity object to save\n const md = this.Provider;\n const componentEntity = await md.GetEntityObject<MJComponentEntity>('MJ: Components', contextUser);\n \n // Load the existing component\n if (!await componentEntity.Load(componentId)) {\n throw new Error(`Failed to load component entity: ${componentId}`);\n }\n \n // Update with fetched specification and all fields from spec\n componentEntity.Specification = JSON.stringify(spec);\n componentEntity.LastSyncedAt = new Date();\n \n // Set ReplicatedAt only on first fetch\n if (!componentEntity.ReplicatedAt) {\n componentEntity.ReplicatedAt = new Date();\n }\n \n // Update all fields from the spec with strong typing\n if (spec.name) {\n componentEntity.Name = spec.name;\n }\n \n if (spec.namespace) {\n componentEntity.Namespace = spec.namespace;\n }\n \n if (spec.version) {\n componentEntity.Version = spec.version;\n }\n \n if (spec.title) {\n componentEntity.Title = spec.title;\n }\n \n if (spec.description) {\n componentEntity.Description = spec.description;\n }\n \n if (spec.type) {\n // Map spec type to entity type (entity has specific enum values)\n const typeMap: Record<string, MJComponentEntity['Type']> = {\n 'report': 'Report',\n 'dashboard': 'Dashboard',\n 'form': 'Form',\n 'table': 'Table',\n 'chart': 'Chart',\n 'navigation': 'Navigation',\n 'search': 'Search',\n 'widget': 'Widget',\n 'utility': 'Utility',\n 'other': 'Other'\n };\n \n const mappedType = typeMap[spec.type.toLowerCase()];\n if (mappedType) {\n componentEntity.Type = mappedType;\n }\n }\n \n if (spec.functionalRequirements) {\n componentEntity.FunctionalRequirements = spec.functionalRequirements;\n }\n \n if (spec.technicalDesign) {\n componentEntity.TechnicalDesign = spec.technicalDesign;\n }\n \n // Save back to database\n const result = await componentEntity.Save();\n if (!result) {\n throw new Error(`Failed to save cached component: ${componentEntity.Name}\\n${componentEntity.LatestResult?.CompleteMessage || 'Unknown error'}`);\n }\n \n if (this.debug) {\n console.log(`Cached external component: ${componentEntity.Name} at ${componentEntity.LastSyncedAt}`);\n }\n \n // Refresh metadata cache after saving\n await this.componentEngine.Config(true, contextUser);\n }\n \n /**\n * Load component dependencies from database\n */\n async loadDependencies(\n componentId: string,\n contextUser?: UserInfo\n ): Promise<ComponentDependencyInfo[]> {\n await this.initialize(contextUser);\n \n // Get dependencies from metadata cache\n const dependencies = this.componentEngine.ComponentDependencies?.filter(\n d => UUIDsEqual(d.ComponentID, componentId)\n ) || [];\n \n const result: ComponentDependencyInfo[] = [];\n \n for (const dep of dependencies) {\n // Find the dependency component\n const depComponent = this.componentEngine.Components.find(\n (c: MJComponentEntity) => UUIDsEqual(c.ID, dep.DependencyComponentID)\n );\n \n if (depComponent) {\n result.push({\n name: depComponent.Name,\n namespace: depComponent.Namespace || '',\n version: depComponent.Version, // Version comes from the linked Component record\n isRequired: true, // All dependencies are required in MemberJunction\n location: depComponent.SourceRegistryID ? 'registry' : 'embedded',\n sourceRegistryID: depComponent.SourceRegistryID\n });\n }\n }\n \n return result;\n }\n \n /**\n * Resolve full dependency tree for a component\n */\n async resolveDependencyTree(\n componentId: string,\n contextUser?: UserInfo,\n visited = new Set<string>()\n ): Promise<DependencyTree> {\n if (visited.has(componentId)) {\n return { \n componentId, \n circular: true \n };\n }\n visited.add(componentId);\n \n await this.initialize(contextUser);\n \n const component = this.componentEngine.Components.find((c: MJComponentEntity) => UUIDsEqual(c.ID, componentId));\n if (!component) {\n return { componentId, dependencies: [] };\n }\n \n // Get direct dependencies\n const directDeps = await this.loadDependencies(componentId, contextUser);\n \n // Recursively resolve each dependency\n const dependencies: DependencyTree[] = [];\n for (const dep of directDeps) {\n // Find the dependency component\n const depComponent = this.componentEngine.Components.find(\n c => c.Name.trim().toLowerCase() === dep.name.trim().toLowerCase() && \n c.Namespace?.trim().toLowerCase() === dep.namespace?.trim().toLowerCase()\n );\n \n if (depComponent) {\n const subTree = await this.resolveDependencyTree(\n depComponent.ID, \n contextUser, \n visited\n );\n dependencies.push(subTree);\n }\n }\n \n return {\n componentId,\n name: component.Name,\n namespace: component.Namespace || undefined,\n version: component.Version,\n dependencies,\n totalCount: dependencies.reduce((sum, d) => sum + (d.totalCount || 1), 1)\n };\n }\n \n /**\n * Get components to load in dependency order\n */\n async getComponentsToLoad(\n rootComponentId: string,\n contextUser?: UserInfo\n ): Promise<string[]> {\n const tree = await this.resolveDependencyTree(rootComponentId, contextUser);\n \n // Flatten tree in dependency order (depth-first)\n const ordered: string[] = [];\n const processNode = (node: DependencyTree) => {\n if (node.dependencies) {\n node.dependencies.forEach(processNode);\n }\n if (!ordered.includes(node.componentId)) {\n ordered.push(node.componentId);\n }\n };\n processNode(tree);\n \n return ordered;\n }\n \n /**\n * Add a reference to a component\n */\n private addComponentReference(componentKey: string, referenceId: string): void {\n if (!this.componentReferences.has(componentKey)) {\n this.componentReferences.set(componentKey, new Set());\n }\n this.componentReferences.get(componentKey)!.add(referenceId);\n }\n \n /**\n * Remove a reference to a component\n */\n removeComponentReference(componentKey: string, referenceId: string): void {\n const refs = this.componentReferences.get(componentKey);\n if (refs) {\n refs.delete(referenceId);\n \n // If no more references and cache cleanup is enabled\n if (refs.size === 0) {\n this.considerCacheEviction(componentKey);\n }\n }\n }\n \n /**\n * Consider evicting a component from cache\n */\n private considerCacheEviction(componentKey: string): void {\n const cached = this.compiledComponentCache.get(componentKey);\n if (cached) {\n const timeSinceLastUse = Date.now() - cached.lastUsed.getTime();\n const evictionThreshold = 5 * 60 * 1000; // 5 minutes\n \n if (timeSinceLastUse > evictionThreshold) {\n if (this.debug) {\n console.log(`๐๏ธ Evicting unused component from cache: ${componentKey}`);\n }\n this.compiledComponentCache.delete(componentKey);\n }\n }\n }\n \n /**\n * Get API key for a registry from secure configuration\n * @param registryId - Registry ID\n * @returns API key or undefined\n */\n private getRegistryApiKey(registryId: string): string | undefined {\n // API keys should be stored in environment variables or secure configuration\n // Format: REGISTRY_API_KEY_{registryId} or similar\n // This is a placeholder - actual implementation would depend on the security infrastructure\n const envKey = `REGISTRY_API_KEY_${registryId.replace(/-/g, '_').toUpperCase()}`;\n return process.env[envKey];\n }\n \n /**\n * Get cache statistics\n */\n getCacheStats(): {\n compiledComponents: number;\n totalUseCount: number;\n memoryEstimate: string;\n } {\n let totalUseCount = 0;\n this.compiledComponentCache.forEach(cached => {\n totalUseCount += cached.useCount;\n });\n \n return {\n compiledComponents: this.compiledComponentCache.size,\n totalUseCount,\n memoryEstimate: `~${(this.compiledComponentCache.size * 50)}KB` // Rough estimate\n };\n }\n \n /**\n * Clear all caches\n */\n clearCache(): void {\n if (this.debug) {\n console.log('๐งน Clearing all component caches');\n }\n this.compiledComponentCache.clear();\n this.componentReferences.clear();\n }\n\n /**\n * Force clear all compiled components\n * Used for Component Studio to ensure fresh loads\n */\n forceClearAll(): void {\n this.compiledComponentCache.clear();\n this.componentReferences.clear();\n console.log('๐งน Component cache force cleared');\n }\n\n /**\n * Reset the singleton instance\n * Forces new instance creation on next access\n */\n static reset(): void {\n if (ComponentRegistryService.instance) {\n ComponentRegistryService.instance.forceClearAll();\n ComponentRegistryService.instance = null;\n }\n }\n \n /**\n * Generate a cache key for a component\n */\n private getComponentKey(\n name: string, \n namespace: string | null | undefined, \n version: string, \n sourceRegistryId: string | null | undefined\n ): string {\n const registryPart = sourceRegistryId || 'local';\n const namespacePart = namespace || 'global';\n return `${registryPart}/${namespacePart}/${name}@${version}`;\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"component-registry-service.js","sourceRoot":"","sources":["../../src/registry/component-registry-service.ts"],"names":[],"mappings":"AAeA,OAAO,EAAY,QAAQ,EAAqB,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAKL,uBAAuB,EACxB,MAAM,+BAA+B,CAAC;AAMvC,IAAI,8BAAmC,CAAC;AA+BxC,MAAM,OAAO,wBAAwB;aACpB,aAAQ,GAAoC,IAAI,AAAxC,CAAyC;IAoBhE,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,SAAS,IAAK,IAAI,QAAQ,EAAmC,CAAC;IAC5E,CAAC;IACD,IAAW,QAAQ,CAAC,KAA+B;QACjD,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IACzB,CAAC;IAED,YACE,QAA2B,EAC3B,cAA8B,EAC9B,QAAiB,KAAK,EACtB,aAAwC;QA5BlC,2BAAsB,GAAG,IAAI,GAAG,EAAmC,CAAC;QACpE,wBAAmB,GAAG,IAAI,GAAG,EAAuB,CAAC;QAKrD,oBAAe,GAAG,uBAAuB,CAAC,QAAQ,CAAC;QACnD,sBAAiB,GAAG,IAAI,GAAG,EAA4B,CAAC;QACxD,UAAK,GAAY,KAAK,CAAC;QAEvB,cAAS,GAA6B,IAAI,CAAC;QAsD3C,yBAAoB,GAAoC,IAAI,CAAC;QAlCnE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;IAKD,MAAM,CAAC,WAAW,CAChB,QAA2B,EAC3B,OAAuB,EACvB,QAAiB,KAAK,EACtB,aAAwC;QAExC,IAAI,CAAC,wBAAwB,CAAC,QAAQ,EAAE,CAAC;YACvC,wBAAwB,CAAC,QAAQ,GAAG,IAAI,wBAAwB,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;QAC5G,CAAC;QACD,OAAO,wBAAwB,CAAC,QAAQ,CAAC;IAC3C,CAAC;IAKD,gBAAgB,CAAC,MAAgC;QAC/C,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;QAC5B,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAWO,KAAK,CAAC,gBAAgB;QAE5B,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC,aAAa,CAAC;QAC5B,CAAC;QAGD,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,oBAAoB,CAAC;QACnC,CAAC;QAGD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,QAAQ,EAAE,QAAQ,CAAC;YACpC,IAAI,QAAQ,IAAK,QAAgB,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;gBAE3D,IAAI,CAAC,8BAA8B,EAAE,CAAC;oBACpC,IAAI,CAAC;wBACH,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,sCAAsC,CAAC,CAAC;wBAC3E,8BAA8B,GAAG,aAAa,CAAC,8BAA8B,CAAC;oBAChF,CAAC;oBAAC,OAAO,WAAW,EAAE,CAAC;wBACrB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;4BACf,OAAO,CAAC,GAAG,CAAC,kFAAkF,CAAC,CAAC;wBAClG,CAAC;wBACD,OAAO,IAAI,CAAC;oBACd,CAAC;gBACH,CAAC;gBAGD,IAAI,8BAA8B,EAAE,CAAC;oBACnC,IAAI,CAAC;wBACH,MAAM,MAAM,GAAG,IAAI,8BAA8B,CAAC,QAA+B,CAAC,CAAC;wBACnF,IAAI,CAAC,oBAAoB,GAAG,MAAM,CAAC;wBACnC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;4BACf,OAAO,CAAC,GAAG,CAAC,oFAAoF,CAAC,CAAC;wBACpG,CAAC;wBACD,OAAO,MAAM,CAAC;oBAChB,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;4BACf,OAAO,CAAC,GAAG,CAAC,gEAAgE,EAAE,KAAK,CAAC,CAAC;wBACvF,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAEf,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,mEAAmE,EAAE,KAAK,CAAC,CAAC;YAC1F,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAKD,KAAK,CAAC,UAAU,CAAC,WAAsB;QAErC,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACxD,CAAC;IAMO,KAAK,CAAC,iBAAiB,CAAC,IAAmB;QAEjD,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CACb,4FAA4F;gBAC5F,iDAAiD;gBACjD,6FAA6F,CAC9F,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAGxC,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAG/D,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAE7E,OAAO,OAAO,CAAC;IACjB,CAAC;IAKD,KAAK,CAAC,oBAAoB,CACxB,WAAmB,EACnB,WAAoB,EACpB,WAAsB;QAEtB,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAGnC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QACzF,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,wBAAwB,WAAW,EAAE,CAAC,CAAC;QACzD,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAGrH,IAAI,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;YACrD,MAAM,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;YAC7B,MAAM,CAAC,QAAQ,EAAE,CAAC;YAGlB,IAAI,WAAW,EAAE,CAAC;gBAChB,IAAI,CAAC,qBAAqB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;YAC/C,CAAC;YAED,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,4CAA4C,GAAG,gBAAgB,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC;YACjG,CAAC;YAED,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC/C,CAAC;QAGD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,uCAAuC,GAAG,EAAE,CAAC,CAAC;QAC5D,CAAC;QAGD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAInE,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,kBAAkB,IAAI,EAAE,CAAC;QAEnE,IAAI,iBAAiB,CAAC;QACtB,IAAI,CAAC;YACH,iBAAiB,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAC9C,aAAa,EAAE,SAAS,CAAC,IAAI;gBAC7B,aAAa,EAAE,IAAI,CAAC,IAAI;gBACxB,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,YAAY;aACb,CAAC,CAAC;QACL,CAAC;QACD,OAAO,SAAS,EAAE,CAAC;YAEjB,OAAO,CAAC,KAAK,CAAC,gCAAgC,SAAS,CAAC,IAAI,EAAE,EAAC,SAAS,CAAC,CAAC;YAC1E,MAAM,SAAS,CAAC;QAClB,CAAC;QAED,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;YAC/B,OAAO,CAAC,KAAK,CAAC,gCAAgC,SAAS,CAAC,IAAI,EAAE,EAAE,iBAAiB,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACtG,MAAM,IAAI,KAAK,CAAC,+BAA+B,SAAS,CAAC,IAAI,KAAK,iBAAiB,CAAC,KAAK,EAAE,CAAC,CAAC;QAC/F,CAAC;QAGD,MAAM,QAAQ,GAA8B;YAC1C,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,SAAS,EAAE,SAAS,CAAC,SAAS,IAAI,EAAE;YACpC,OAAO,EAAE,SAAS,CAAC,OAAO;YAC1B,WAAW,EAAE,SAAS,CAAC,WAAW,IAAI,EAAE;YACxC,KAAK,EAAE,SAAS,CAAC,KAAK,IAAI,SAAS;YACnC,IAAI,EAAE,SAAS,CAAC,IAAI,IAAI,SAAS;YACjC,MAAM,EAAE,SAAS,CAAC,MAAM,IAAI,SAAS;YACrC,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,gBAAgB,EAAE,SAAS,CAAC,gBAAgB;YAC5C,OAAO,EAAE,CAAC,SAAS,CAAC,gBAAgB;SACrC,CAAC;QAEF,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC/E,CAAC;QACD,MAAM,wBAAwB,GAAG,iBAAiB,CAAC,SAAS,CAAC,OAAO,CAAC;QACrE,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,GAAG,EAAE;YACnC,SAAS,EAAE,wBAAwB;YACnC,QAAQ;YACR,UAAU,EAAE,IAAI,IAAI,EAAE;YACtB,QAAQ,EAAE,IAAI,IAAI,EAAE;YACpB,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC;QAGH,IAAI,WAAW,EAAE,CAAC;YAChB,IAAI,CAAC,qBAAqB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QAC/C,CAAC;QAGD,OAAO,wBAAwB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACvD,CAAC;IAMD,KAAK,CAAC,gCAAgC,CACpC,YAAoB,EACpB,SAAiB,EACjB,IAAY,EACZ,OAAe,EACf,WAAoB,EACpB,WAAsB;QAEtB,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAEnC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,kEAAkE,YAAY,IAAI,SAAS,IAAI,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC;QAChI,CAAC;QAGD,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,mBAAmB,EAAE,IAAI,CAC7D,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ,CACtD,CAAC;QAEF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,mCAAmC,YAAY,EAAE,CAAC,CAAC;QACrE,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,gDAAgD,QAAQ,CAAC,IAAI,SAAS,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC;QACpG,CAAC;QAGD,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACpD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,gJAAgJ,CAAC,CAAC;QACpK,CAAC;QAGD,MAAM,GAAG,GAAG,YAAY,YAAY,IAAI,SAAS,IAAI,IAAI,IAAI,OAAO,EAAE,CAAC;QACvE,MAAM,MAAM,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEpD,IAAI,CAAC;YAGH,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,oBAAoB,CAAC;gBACpD,YAAY,EAAE,QAAQ,CAAC,IAAI;gBAC3B,SAAS;gBACT,IAAI;gBACJ,OAAO;gBACP,IAAI,EAAE,MAAM,EAAE,QAAQ;aACvB,CAAC,CAAC;YAGH,IAAI,CAAC,IAAI,IAAI,MAAM,EAAE,QAAQ,EAAE,CAAC;gBAC9B,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,GAAG,CAAC,uEAAuE,GAAG,EAAE,CAAC,CAAC;gBAC5F,CAAC;gBACD,MAAM,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;gBAC7B,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAGlB,IAAI,WAAW,EAAE,CAAC;oBAChB,IAAI,CAAC,qBAAqB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;gBAC/C,CAAC;gBAGD,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC/C,CAAC;YAED,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,KAAK,CAAC,mCAAmC,YAAY,KAAK,SAAS,IAAI,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC;YACtG,CAAC;YAED,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,qEAAqE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAChG,CAAC;YAGD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAGpD,IAAI,MAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC3C,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,GAAG,CAAC,+DAA+D,GAAG,eAAe,CAAC,CAAC;gBACjG,CAAC;gBACD,MAAM,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;gBAC7B,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAGlB,IAAI,WAAW,EAAE,CAAC;oBAChB,IAAI,CAAC,qBAAqB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;gBAC/C,CAAC;gBAGD,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC/C,CAAC;YAGD,IAAI,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,mDAAmD,GAAG,4BAA4B,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,kBAAkB,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;YAClL,CAAC;YAGD,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,kBAAkB,IAAI,EAAE,CAAC;YAGnE,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;gBACpD,aAAa,EAAE,IAAI,CAAC,IAAI;gBACxB,aAAa,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;gBAC9B,YAAY,EAAE,YAAY;aAC3B,CAAC,CAAC;YAEH,IAAI,CAAC,iBAAiB,CAAC,OAAO,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,CAAC;gBAC/D,MAAM,IAAI,KAAK,CAAC,gCAAgC,iBAAiB,CAAC,KAAK,EAAE,OAAO,IAAI,eAAe,EAAE,CAAC,CAAC;YACzG,CAAC;YAGD,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,GAAG,EAAE;gBACnC,SAAS,EAAE,iBAAiB,CAAC,SAAS,CAAC,OAAO;gBAC9C,QAAQ,EAAE;oBACR,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE;oBAC/B,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,OAAO;oBAChC,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;oBACnC,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,OAAO,EAAE,KAAK;iBACf;gBACD,UAAU,EAAE,IAAI,IAAI,EAAE;gBACtB,QAAQ,EAAE,IAAI,IAAI,EAAE;gBACpB,QAAQ,EAAE,CAAC;gBACX,QAAQ,EAAE,QAAQ;aACnB,CAAC,CAAC;YAGH,IAAI,WAAW,EAAE,CAAC;gBAChB,IAAI,CAAC,qBAAqB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;YAC/C,CAAC;YAED,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,2EAA2E,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACtG,CAAC;YAGD,OAAO,iBAAiB,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAClE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,sEAAsE,EAAE,KAAK,CAAC,CAAC;YAC7F,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAKD,KAAK,CAAC,gBAAgB,CACpB,WAAmB,EACnB,WAAsB;QAEtB,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAEnC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QACzF,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,wBAAwB,WAAW,EAAE,CAAC,CAAC;QACzD,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE,CAAC;YAEhC,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC;gBAC7B,MAAM,IAAI,KAAK,CAAC,mBAAmB,SAAS,CAAC,IAAI,uBAAuB,CAAC,CAAC;YAC5E,CAAC;YACD,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAC7C,CAAC;QAGD,IAAI,SAAS,CAAC,aAAa,IAAI,SAAS,CAAC,YAAY,EAAE,CAAC;YAEtD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,oCAAoC,SAAS,CAAC,IAAI,aAAa,SAAS,CAAC,YAAY,GAAG,CAAC,CAAC;YACxG,CAAC;YACD,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAC7C,CAAC;QAGD,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,mBAAmB,EAAE,IAAI,CAC7D,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAClD,CAAC;QAEF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,uBAAuB,SAAS,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACvE,CAAC;QAGD,IAAI,IAAmB,CAAC;QAExB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,uCAAuC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;YACvE,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC;gBAC3D,YAAY,EAAE,QAAQ,CAAC,IAAI;gBAC3B,SAAS,EAAE,SAAS,CAAC,SAAS,IAAI,EAAE;gBACpC,IAAI,EAAE,SAAS,CAAC,IAAI;gBACpB,OAAO,EAAE,SAAS,CAAC,OAAO;aAC3B,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,oCAAoC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;YACxE,CAAC;YAED,IAAI,GAAG,MAAM,CAAC;QAChB,CAAC;aAAM,CAAC;YAEN,IAAI,GAAG,MAAM,IAAI,CAAC,yBAAyB,CACzC,QAAQ,CAAC,GAAG,IAAI,EAAE,EAClB,SAAS,CAAC,IAAI,EACd,SAAS,CAAC,SAAS,IAAI,EAAE,EACzB,SAAS,CAAC,OAAO,EACjB,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC,CACpC,CAAC;QACJ,CAAC;QAGD,MAAM,IAAI,CAAC,sBAAsB,CAAC,WAAW,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;QAElE,OAAO,IAAI,CAAC;IACd,CAAC;IAKO,KAAK,CAAC,yBAAyB,CACrC,GAAW,EACX,IAAY,EACZ,SAAiB,EACjB,OAAe,EACf,MAAe;QAEf,MAAM,GAAG,GAAG,GAAG,GAAG,eAAe,kBAAkB,CAAC,SAAS,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC;QAExG,MAAM,OAAO,GAAgB;YAC3B,QAAQ,EAAE,kBAAkB;SAC7B,CAAC;QAEF,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,MAAM,EAAE,CAAC;QAChD,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,oCAAoC,GAAG,EAAE,CAAC,CAAC;QACzD,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAE/C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACtF,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAmB,CAAC;QACpD,OAAO,IAAI,CAAC;IACd,CAAC;IAKO,KAAK,CAAC,sBAAsB,CAClC,WAAmB,EACnB,IAAmB,EACnB,WAAsB;QAGtB,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;QACzB,MAAM,eAAe,GAAG,MAAM,EAAE,CAAC,eAAe,CAAoB,gBAAgB,EAAE,WAAW,CAAC,CAAC;QAGnG,IAAI,CAAC,MAAM,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7C,MAAM,IAAI,KAAK,CAAC,oCAAoC,WAAW,EAAE,CAAC,CAAC;QACrE,CAAC;QAGD,eAAe,CAAC,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACrD,eAAe,CAAC,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC;QAG1C,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,CAAC;YAClC,eAAe,CAAC,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC;QAC5C,CAAC;QAGD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,eAAe,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACnC,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,eAAe,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAC7C,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,eAAe,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QACzC,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,eAAe,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACrC,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,eAAe,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACjD,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAEd,MAAM,OAAO,GAA8C;gBACzD,QAAQ,EAAE,QAAQ;gBAClB,WAAW,EAAE,WAAW;gBACxB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,OAAO;gBAChB,OAAO,EAAE,OAAO;gBAChB,YAAY,EAAE,YAAY;gBAC1B,QAAQ,EAAE,QAAQ;gBAClB,QAAQ,EAAE,QAAQ;gBAClB,SAAS,EAAE,SAAS;gBACpB,OAAO,EAAE,OAAO;aACjB,CAAC;YAEF,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YACpD,IAAI,UAAU,EAAE,CAAC;gBACf,eAAe,CAAC,IAAI,GAAG,UAAU,CAAC;YACpC,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAChC,eAAe,CAAC,sBAAsB,GAAG,IAAI,CAAC,sBAAsB,CAAC;QACvE,CAAC;QAED,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,eAAe,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;QACzD,CAAC;QAGD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,CAAC;QAC5C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,oCAAoC,eAAe,CAAC,IAAI,KAAK,eAAe,CAAC,YAAY,EAAE,eAAe,IAAI,eAAe,EAAE,CAAC,CAAC;QACnJ,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,8BAA8B,eAAe,CAAC,IAAI,OAAO,eAAe,CAAC,YAAY,EAAE,CAAC,CAAC;QACvG,CAAC;QAGD,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACvD,CAAC;IAKD,KAAK,CAAC,gBAAgB,CACpB,WAAmB,EACnB,WAAsB;QAEtB,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAGnC,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,qBAAqB,EAAE,MAAM,CACrE,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,CAC5C,IAAI,EAAE,CAAC;QAER,MAAM,MAAM,GAA8B,EAAE,CAAC;QAE7C,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAE/B,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,GAAG,CAAC,qBAAqB,EAAE,WAAW,CAAC,CAAC;YAE1G,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,YAAY,CAAC,IAAI;oBACvB,SAAS,EAAE,YAAY,CAAC,SAAS,IAAI,EAAE;oBACvC,OAAO,EAAE,YAAY,CAAC,OAAO;oBAC7B,UAAU,EAAE,IAAI;oBAChB,QAAQ,EAAE,YAAY,CAAC,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU;oBACjE,gBAAgB,EAAE,YAAY,CAAC,gBAAgB;iBAChD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAKD,KAAK,CAAC,qBAAqB,CACzB,WAAmB,EACnB,WAAsB,EACtB,UAAU,IAAI,GAAG,EAAU;QAE3B,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7B,OAAO;gBACL,WAAW;gBACX,QAAQ,EAAE,IAAI;aACf,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAEzB,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAEnC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QACzF,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;QAC3C,CAAC;QAGD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAGzE,MAAM,YAAY,GAAqB,EAAE,CAAC;QAC1C,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;YAE/G,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAC9C,YAAY,CAAC,EAAE,EACf,WAAW,EACX,OAAO,CACR,CAAC;gBACF,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,OAAO;YACL,WAAW;YACX,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,SAAS,EAAE,SAAS,CAAC,SAAS,IAAI,SAAS;YAC3C,OAAO,EAAE,SAAS,CAAC,OAAO;YAC1B,YAAY;YACZ,UAAU,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;SAC1E,CAAC;IACJ,CAAC;IAKD,KAAK,CAAC,mBAAmB,CACvB,eAAuB,EACvB,WAAsB;QAEtB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;QAG5E,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,MAAM,WAAW,GAAG,CAAC,IAAoB,EAAE,EAAE;YAC3C,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACtB,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YACzC,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;gBACxC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACjC,CAAC;QACH,CAAC,CAAC;QACF,WAAW,CAAC,IAAI,CAAC,CAAC;QAElB,OAAO,OAAO,CAAC;IACjB,CAAC;IAKO,qBAAqB,CAAC,YAAoB,EAAE,WAAmB;QACrE,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;YAChD,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,YAAY,CAAE,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC/D,CAAC;IAKD,wBAAwB,CAAC,YAAoB,EAAE,WAAmB;QAChE,MAAM,IAAI,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACxD,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAGzB,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACpB,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;IACH,CAAC;IAKO,qBAAqB,CAAC,YAAoB;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC7D,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YAChE,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YAExC,IAAI,gBAAgB,GAAG,iBAAiB,EAAE,CAAC;gBACzC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,GAAG,CAAC,6CAA6C,YAAY,EAAE,CAAC,CAAC;gBAC3E,CAAC;gBACD,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;IACH,CAAC;IAOO,iBAAiB,CAAC,UAAkB;QAI1C,MAAM,MAAM,GAAG,oBAAoB,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACjF,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAKD,aAAa;QAKX,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YAC3C,aAAa,IAAI,MAAM,CAAC,QAAQ,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,kBAAkB,EAAE,IAAI,CAAC,sBAAsB,CAAC,IAAI;YACpD,aAAa;YACb,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI;SAChE,CAAC;IACJ,CAAC;IAKD,UAAU;QACR,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,CAAC;QACpC,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;IACnC,CAAC;IAMD,aAAa;QACX,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,CAAC;QACpC,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAClD,CAAC;IAMD,MAAM,CAAC,KAAK;QACV,IAAI,wBAAwB,CAAC,QAAQ,EAAE,CAAC;YACtC,wBAAwB,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;YAClD,wBAAwB,CAAC,QAAQ,GAAG,IAAI,CAAC;QAC3C,CAAC;IACH,CAAC;IAKO,eAAe,CACrB,IAAY,EACZ,SAAoC,EACpC,OAAe,EACf,gBAA2C;QAE3C,MAAM,YAAY,GAAG,gBAAgB,IAAI,OAAO,CAAC;QACjD,MAAM,aAAa,GAAG,SAAS,IAAI,QAAQ,CAAC;QAC5C,OAAO,GAAG,YAAY,IAAI,aAAa,IAAI,IAAI,IAAI,OAAO,EAAE,CAAC;IAC/D,CAAC","sourcesContent":["/**\n * @fileoverview Service for managing registry-based component loading with caching\n * @module @memberjunction/react-runtime/registry\n */\n\nimport { ComponentSpec, ComponentObject } from '@memberjunction/interactive-component-types';\nimport { ComponentCompiler } from '../compiler';\nimport { RuntimeContext } from '../types';\nimport { \n RegistryProvider, \n RegistryComponentResponse,\n ComponentDependencyInfo,\n DependencyTree, \n RegistryComponentMetadata\n} from './registry-provider';\nimport { UserInfo, Metadata, IMetadataProvider } from '@memberjunction/core';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { \n MJComponentEntity, \n MJComponentRegistryEntity,\n MJComponentDependencyEntity,\n MJComponentLibraryLinkEntity,\n ComponentMetadataEngine\n} from '@memberjunction/core-entities';\n\n// Type-only import for TypeScript - won't be included in UMD bundle\nimport type { GraphQLDataProvider } from '@memberjunction/graphql-dataprovider';\n\n// Dynamic import of GraphQLComponentRegistryClient to avoid breaking UMD build\nlet GraphQLComponentRegistryClient: any;\n\n\n/**\n * Cached compiled component with metadata\n */\ninterface CachedCompiledComponent {\n component: (context: RuntimeContext, styles?: any, components?: Record<string, any>) => ComponentObject;\n metadata: RegistryComponentResponse['metadata'];\n compiledAt: Date;\n lastUsed: Date;\n useCount: number;\n specHash?: string; // SHA-256 hash of the spec used for compilation\n}\n\n/**\n * GraphQL client interface for registry operations\n */\nexport interface IComponentRegistryClient {\n GetRegistryComponent(params: {\n registryName: string;\n namespace: string;\n name: string;\n version?: string;\n hash?: string;\n }): Promise<ComponentSpec | null>;\n}\n\n/**\n * Service for managing component loading from registries with compilation caching\n */\nexport class ComponentRegistryService {\n private static instance: ComponentRegistryService | null = null;\n \n // Caches\n private compiledComponentCache = new Map<string, CachedCompiledComponent>();\n private componentReferences = new Map<string, Set<string>>();\n \n // Dependencies\n private compiler: ComponentCompiler;\n private runtimeContext: RuntimeContext;\n private componentEngine = ComponentMetadataEngine.Instance;\n private registryProviders = new Map<string, RegistryProvider>();\n private debug: boolean = false;\n private graphQLClient?: IComponentRegistryClient;\n private _provider: IMetadataProvider | null = null;\n\n /**\n * Optional metadata provider override. Callers should set\n * `instance.Provider = providerToUse` before invoking registry methods\n * in multi-provider contexts. Falls back to the global default provider when unset.\n */\n public get Provider(): IMetadataProvider {\n return this._provider ?? (new Metadata() as unknown as IMetadataProvider);\n }\n public set Provider(value: IMetadataProvider | null) {\n this._provider = value;\n }\n \n private constructor(\n compiler: ComponentCompiler,\n runtimeContext: RuntimeContext,\n debug: boolean = false,\n graphQLClient?: IComponentRegistryClient\n ) {\n this.compiler = compiler;\n this.runtimeContext = runtimeContext;\n this.debug = debug;\n this.graphQLClient = graphQLClient;\n }\n \n /**\n * Get or create the singleton instance\n */\n static getInstance(\n compiler: ComponentCompiler, \n context: RuntimeContext,\n debug: boolean = false,\n graphQLClient?: IComponentRegistryClient\n ): ComponentRegistryService {\n if (!ComponentRegistryService.instance) {\n ComponentRegistryService.instance = new ComponentRegistryService(compiler, context, debug, graphQLClient);\n }\n return ComponentRegistryService.instance;\n }\n \n /**\n * Set the GraphQL client for registry operations\n */\n setGraphQLClient(client: IComponentRegistryClient): void {\n this.graphQLClient = client;\n if (this.debug) {\n console.log('โ
GraphQL client configured for component registry');\n }\n }\n \n /**\n * Cached GraphQL client instance created from Metadata.Provider\n */\n private cachedProviderClient: IComponentRegistryClient | null = null;\n \n /**\n * Get the GraphQL client, using the provided one or falling back to creating one with Metadata.Provider\n * @returns The GraphQL client if available\n */\n private async getGraphQLClient(): Promise<IComponentRegistryClient | null> {\n // If explicitly set, use that\n if (this.graphQLClient) {\n return this.graphQLClient;\n }\n \n // If we've already created one from the provider, reuse it\n if (this.cachedProviderClient) {\n return this.cachedProviderClient;\n }\n \n // Try to create GraphQLComponentRegistryClient with Metadata.Provider\n try {\n const provider = Metadata?.Provider;\n if (provider && (provider as any).ExecuteGQL !== undefined) {\n // Dynamically load GraphQLComponentRegistryClient if not already loaded\n if (!GraphQLComponentRegistryClient) {\n try {\n const graphqlModule = await import('@memberjunction/graphql-dataprovider');\n GraphQLComponentRegistryClient = graphqlModule.GraphQLComponentRegistryClient;\n } catch (importError) {\n if (this.debug) {\n console.log('โ ๏ธ [ComponentRegistryService] @memberjunction/graphql-dataprovider not available');\n }\n return null;\n }\n }\n \n // Create the client if we have the class\n if (GraphQLComponentRegistryClient) {\n try {\n const client = new GraphQLComponentRegistryClient(provider as GraphQLDataProvider);\n this.cachedProviderClient = client;\n if (this.debug) {\n console.log('๐ก [ComponentRegistryService] Created GraphQL client from active metadata provider');\n }\n return client;\n } catch (error) {\n if (this.debug) {\n console.log('โ ๏ธ [ComponentRegistryService] Failed to create GraphQL client:', error);\n }\n }\n }\n }\n } catch (error) {\n // Provider might not be available in all environments\n if (this.debug) {\n console.log('โ ๏ธ [ComponentRegistryService] Could not access metadata provider:', error);\n }\n }\n \n return null;\n }\n \n /**\n * Initialize the service with metadata\n */\n async initialize(contextUser?: UserInfo): Promise<void> {\n // Initialize metadata engine\n await this.componentEngine.Config(false, contextUser);\n }\n \n /**\n * Calculate SHA-256 hash of a component spec for cache comparison\n * Uses Web Crypto API which is available in modern browsers and Node.js 15+\n */\n private async calculateSpecHash(spec: ComponentSpec): Promise<string> {\n // Check for crypto.subtle availability\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n throw new Error(\n 'Web Crypto API not available. This typically happens when running in an insecure context. ' +\n 'Please use HTTPS or localhost for development. ' +\n 'Note: crypto.subtle is available in Node.js 15+ and all modern browsers on secure contexts.'\n );\n }\n \n const specString = JSON.stringify(spec);\n const encoder = new TextEncoder();\n const data = encoder.encode(specString);\n \n // Calculate SHA-256 hash using Web Crypto API\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n \n // Convert ArrayBuffer to hex string\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');\n \n return hashHex;\n }\n \n /**\n * Get a compiled component, using cache if available\n */\n async getCompiledComponent(\n componentId: string,\n referenceId?: string,\n contextUser?: UserInfo\n ): Promise<ComponentObject> {\n await this.initialize(contextUser);\n \n // Find component in metadata via targeted query\n const component = await this.componentEngine.FindComponentByID(componentId, contextUser);\n if (!component) {\n throw new Error(`Component not found: ${componentId}`);\n }\n\n const key = this.getComponentKey(component.Name, component.Namespace, component.Version, component.SourceRegistryID);\n \n // Check if already compiled and cached\n if (this.compiledComponentCache.has(key)) {\n const cached = this.compiledComponentCache.get(key)!;\n cached.lastUsed = new Date();\n cached.useCount++;\n \n // Track reference if provided\n if (referenceId) {\n this.addComponentReference(key, referenceId);\n }\n \n if (this.debug) {\n console.log(`โ
Reusing compiled component from cache: ${key} (use count: ${cached.useCount})`);\n }\n // Call the factory function to get the ComponentObject\n return cached.component(this.runtimeContext);\n }\n \n // Not in cache, need to load and compile\n if (this.debug) {\n console.log(`๐ Loading and compiling component: ${key}`);\n }\n \n // Get the component specification\n const spec = await this.getComponentSpec(componentId, contextUser);\n \n // Compile the component\n // Load all libraries from metadata engine\n const allLibraries = this.componentEngine.ComponentLibraries || [];\n \n let compilationResult;\n try {\n compilationResult = await this.compiler.compile({\n componentName: component.Name,\n componentCode: spec.code,\n libraries: spec.libraries,\n allLibraries\n });\n }\n catch (compileEx) {\n // log then throw\n console.error(`๐ด Error compiling component ${component.Name}`,compileEx);\n throw compileEx;\n }\n \n if (!compilationResult.success) {\n console.error(`๐ด Error compiling component ${component.Name}`, compilationResult, 'Code', spec.code);\n throw new Error(`Failed to compile component ${component.Name}: ${compilationResult.error}`);\n }\n \n // Cache the compiled component\n const metadata: RegistryComponentMetadata = {\n name: component.Name,\n namespace: component.Namespace || '',\n version: component.Version,\n description: component.Description || '',\n title: component.Title || undefined,\n type: component.Type || undefined,\n status: component.Status || undefined,\n properties: spec.properties,\n events: spec.events,\n libraries: spec.libraries,\n dependencies: spec.dependencies,\n sourceRegistryID: component.SourceRegistryID,\n isLocal: !component.SourceRegistryID\n };\n \n if (!compilationResult.component) {\n throw new Error(`Component compilation succeeded but no component returned`);\n }\n const compiledComponentFactory = compilationResult.component.factory;\n this.compiledComponentCache.set(key, {\n component: compiledComponentFactory,\n metadata,\n compiledAt: new Date(),\n lastUsed: new Date(),\n useCount: 1\n });\n \n // Track reference\n if (referenceId) {\n this.addComponentReference(key, referenceId);\n }\n \n // Call the factory function to get the ComponentObject\n return compiledComponentFactory(this.runtimeContext);\n }\n \n /**\n * Get compiled component from external registry by registry name\n * This is used when spec.registry field is populated\n */\n async getCompiledComponentFromRegistry(\n registryName: string,\n namespace: string,\n name: string,\n version: string,\n referenceId?: string,\n contextUser?: UserInfo\n ): Promise<any> {\n await this.initialize(contextUser);\n \n if (this.debug) {\n console.log(`๐ [ComponentRegistryService] Fetching from external registry: ${registryName}/${namespace}/${name}@${version}`);\n }\n \n // Find the registry by name in ComponentRegistries\n const registry = this.componentEngine.ComponentRegistries?.find(\n r => r.Name === registryName && r.Status === 'Active'\n );\n \n if (!registry) {\n throw new Error(`Registry not found or inactive: ${registryName}`);\n }\n \n if (this.debug) {\n console.log(`โ
[ComponentRegistryService] Found registry: ${registry.Name} (ID: ${registry.ID})`);\n }\n \n // Get GraphQL client - use provided one or fallback to Metadata.Provider\n const graphQLClient = await this.getGraphQLClient();\n if (!graphQLClient) {\n throw new Error('GraphQL client not available for external registry fetching. No client provided and the active metadata provider is not a GraphQLDataProvider.');\n }\n \n // Check if we have a cached version first\n const key = `external:${registryName}:${namespace}:${name}:${version}`;\n const cached = this.compiledComponentCache.get(key);\n \n try {\n // Fetch component spec from external registry via MJServer\n // Pass cached hash if available for efficient caching\n const spec = await graphQLClient.GetRegistryComponent({\n registryName: registry.Name, // Pass registry name, not ID\n namespace,\n name,\n version,\n hash: cached?.specHash // Pass cached hash if available\n });\n \n // If null returned, it means not modified (304)\n if (!spec && cached?.specHash) {\n if (this.debug) {\n console.log(`โป๏ธ [ComponentRegistryService] Component not modified, using cached: ${key}`);\n }\n cached.lastUsed = new Date();\n cached.useCount++;\n \n // Track reference\n if (referenceId) {\n this.addComponentReference(key, referenceId);\n }\n \n // Call the factory function to get the ComponentObject\n return cached.component(this.runtimeContext);\n }\n \n if (!spec) {\n throw new Error(`Component not found in registry ${registryName}: ${namespace}/${name}@${version}`);\n }\n \n if (this.debug) {\n console.log(`โ
[ComponentRegistryService] Fetched spec from external registry: ${spec.name}`);\n }\n \n // Calculate hash of the fetched spec\n const specHash = await this.calculateSpecHash(spec);\n \n // Check if hash matches cached version (shouldn't happen if server works correctly)\n if (cached && cached.specHash === specHash) {\n if (this.debug) {\n console.log(`โป๏ธ [ComponentRegistryService] Using cached compilation for: ${key} (hash match)`);\n }\n cached.lastUsed = new Date();\n cached.useCount++;\n \n // Track reference\n if (referenceId) {\n this.addComponentReference(key, referenceId);\n }\n \n // Call the factory function to get the ComponentObject\n return cached.component(this.runtimeContext);\n }\n \n // Spec has changed or is new, need to compile\n if (cached && this.debug) {\n console.log(`๐ [ComponentRegistryService] Spec changed for: ${key}, recompiling (old hash: ${cached.specHash?.substring(0, 8)}..., new hash: ${specHash.substring(0, 8)}...)`);\n }\n \n // Load all libraries from metadata engine\n const allLibraries = this.componentEngine.ComponentLibraries || [];\n \n // Compile the component\n const compilationResult = await this.compiler.compile({\n componentName: spec.name,\n componentCode: spec.code || '',\n allLibraries: allLibraries\n });\n \n if (!compilationResult.success || !compilationResult.component) {\n throw new Error(`Failed to compile component: ${compilationResult.error?.message || 'Unknown error'}`);\n }\n \n // Cache the compiled component with spec hash\n this.compiledComponentCache.set(key, {\n component: compilationResult.component.factory,\n metadata: {\n name: spec.name,\n namespace: spec.namespace || '',\n version: spec.version || '1.0.0',\n description: spec.description || '',\n type: spec.type,\n isLocal: false // This is from an external registry\n },\n compiledAt: new Date(),\n lastUsed: new Date(),\n useCount: 1,\n specHash: specHash // Store the hash for future comparison\n });\n \n // Track reference\n if (referenceId) {\n this.addComponentReference(key, referenceId);\n }\n \n if (this.debug) {\n console.log(`๐ฏ [ComponentRegistryService] Successfully compiled external component: ${spec.name}`);\n }\n \n // Call the factory function to get the ComponentObject\n return compilationResult.component.factory(this.runtimeContext);\n } catch (error) {\n console.error(`โ [ComponentRegistryService] Failed to fetch from external registry:`, error);\n throw error;\n }\n }\n \n /**\n * Get component specification from database or external registry\n */\n async getComponentSpec(\n componentId: string,\n contextUser?: UserInfo\n ): Promise<ComponentSpec> {\n await this.initialize(contextUser);\n \n const component = await this.componentEngine.FindComponentByID(componentId, contextUser);\n if (!component) {\n throw new Error(`Component not found: ${componentId}`);\n }\n\n if (!component.SourceRegistryID) {\n // LOCAL: Use specification from database\n if (!component.Specification) {\n throw new Error(`Local component ${component.Name} has no specification`);\n }\n return JSON.parse(component.Specification);\n }\n \n // EXTERNAL: Check if we have a cached version\n if (component.Specification && component.LastSyncedAt) {\n // For now, always use cached version (no expiration)\n if (this.debug) {\n console.log(`Using cached external component: ${component.Name} (synced: ${component.LastSyncedAt})`);\n }\n return JSON.parse(component.Specification);\n }\n \n // Need to fetch from external registry\n const registry = this.componentEngine.ComponentRegistries?.find(\n r => UUIDsEqual(r.ID, component.SourceRegistryID)\n );\n \n if (!registry) {\n throw new Error(`Registry not found: ${component.SourceRegistryID}`);\n }\n \n // Try GraphQL client first if available\n let spec: ComponentSpec;\n \n if (this.graphQLClient) {\n if (this.debug) {\n console.log(`Fetching from registry via GraphQL: ${component.Name}`);\n }\n \n const result = await this.graphQLClient.GetRegistryComponent({\n registryName: registry.Name,\n namespace: component.Namespace || '',\n name: component.Name,\n version: component.Version\n });\n \n if (!result) {\n throw new Error(`Component not found in registry: ${component.Name}`);\n }\n \n spec = result;\n } else {\n // Fallback to direct HTTP if no GraphQL client\n spec = await this.fetchFromExternalRegistry(\n registry.URI || '',\n component.Name,\n component.Namespace || '',\n component.Version,\n this.getRegistryApiKey(registry.ID)\n );\n }\n \n // Store in local database for future use\n await this.cacheExternalComponent(componentId, spec, contextUser);\n \n return spec;\n }\n \n /**\n * Fetch component from external registry via HTTP\n */\n private async fetchFromExternalRegistry(\n uri: string,\n name: string,\n namespace: string,\n version: string,\n apiKey?: string\n ): Promise<ComponentSpec> {\n const url = `${uri}/components/${encodeURIComponent(namespace)}/${encodeURIComponent(name)}/${version}`;\n \n const headers: HeadersInit = {\n 'Accept': 'application/json'\n };\n \n if (apiKey) {\n headers['Authorization'] = `Bearer ${apiKey}`;\n }\n \n if (this.debug) {\n console.log(`Fetching from external registry: ${url}`);\n }\n \n const response = await fetch(url, { headers });\n \n if (!response.ok) {\n throw new Error(`Registry fetch failed: ${response.status} ${response.statusText}`);\n }\n \n const spec = await response.json() as ComponentSpec;\n return spec;\n }\n \n /**\n * Cache an external component in the local database\n */\n private async cacheExternalComponent(\n componentId: string,\n spec: ComponentSpec,\n contextUser?: UserInfo\n ): Promise<void> {\n // Get the actual entity object to save\n const md = this.Provider;\n const componentEntity = await md.GetEntityObject<MJComponentEntity>('MJ: Components', contextUser);\n \n // Load the existing component\n if (!await componentEntity.Load(componentId)) {\n throw new Error(`Failed to load component entity: ${componentId}`);\n }\n \n // Update with fetched specification and all fields from spec\n componentEntity.Specification = JSON.stringify(spec);\n componentEntity.LastSyncedAt = new Date();\n \n // Set ReplicatedAt only on first fetch\n if (!componentEntity.ReplicatedAt) {\n componentEntity.ReplicatedAt = new Date();\n }\n \n // Update all fields from the spec with strong typing\n if (spec.name) {\n componentEntity.Name = spec.name;\n }\n \n if (spec.namespace) {\n componentEntity.Namespace = spec.namespace;\n }\n \n if (spec.version) {\n componentEntity.Version = spec.version;\n }\n \n if (spec.title) {\n componentEntity.Title = spec.title;\n }\n \n if (spec.description) {\n componentEntity.Description = spec.description;\n }\n \n if (spec.type) {\n // Map spec type to entity type (entity has specific enum values)\n const typeMap: Record<string, MJComponentEntity['Type']> = {\n 'report': 'Report',\n 'dashboard': 'Dashboard',\n 'form': 'Form',\n 'table': 'Table',\n 'chart': 'Chart',\n 'navigation': 'Navigation',\n 'search': 'Search',\n 'widget': 'Widget',\n 'utility': 'Utility',\n 'other': 'Other'\n };\n \n const mappedType = typeMap[spec.type.toLowerCase()];\n if (mappedType) {\n componentEntity.Type = mappedType;\n }\n }\n \n if (spec.functionalRequirements) {\n componentEntity.FunctionalRequirements = spec.functionalRequirements;\n }\n \n if (spec.technicalDesign) {\n componentEntity.TechnicalDesign = spec.technicalDesign;\n }\n \n // Save back to database\n const result = await componentEntity.Save();\n if (!result) {\n throw new Error(`Failed to save cached component: ${componentEntity.Name}\\n${componentEntity.LatestResult?.CompleteMessage || 'Unknown error'}`);\n }\n \n if (this.debug) {\n console.log(`Cached external component: ${componentEntity.Name} at ${componentEntity.LastSyncedAt}`);\n }\n \n // Refresh metadata cache after saving\n await this.componentEngine.Config(true, contextUser);\n }\n \n /**\n * Load component dependencies from database\n */\n async loadDependencies(\n componentId: string,\n contextUser?: UserInfo\n ): Promise<ComponentDependencyInfo[]> {\n await this.initialize(contextUser);\n \n // Get dependencies from metadata cache\n const dependencies = this.componentEngine.ComponentDependencies?.filter(\n d => UUIDsEqual(d.ComponentID, componentId)\n ) || [];\n \n const result: ComponentDependencyInfo[] = [];\n \n for (const dep of dependencies) {\n // Find the dependency component\n const depComponent = await this.componentEngine.FindComponentByID(dep.DependencyComponentID, contextUser);\n\n if (depComponent) {\n result.push({\n name: depComponent.Name,\n namespace: depComponent.Namespace || '',\n version: depComponent.Version,\n isRequired: true,\n location: depComponent.SourceRegistryID ? 'registry' : 'embedded',\n sourceRegistryID: depComponent.SourceRegistryID\n });\n }\n }\n \n return result;\n }\n \n /**\n * Resolve full dependency tree for a component\n */\n async resolveDependencyTree(\n componentId: string,\n contextUser?: UserInfo,\n visited = new Set<string>()\n ): Promise<DependencyTree> {\n if (visited.has(componentId)) {\n return { \n componentId, \n circular: true \n };\n }\n visited.add(componentId);\n \n await this.initialize(contextUser);\n \n const component = await this.componentEngine.FindComponentByID(componentId, contextUser);\n if (!component) {\n return { componentId, dependencies: [] };\n }\n\n // Get direct dependencies\n const directDeps = await this.loadDependencies(componentId, contextUser);\n\n // Recursively resolve each dependency\n const dependencies: DependencyTree[] = [];\n for (const dep of directDeps) {\n const depComponent = await this.componentEngine.FindComponent(dep.name, dep.namespace, undefined, contextUser);\n\n if (depComponent) {\n const subTree = await this.resolveDependencyTree(\n depComponent.ID,\n contextUser,\n visited\n );\n dependencies.push(subTree);\n }\n }\n \n return {\n componentId,\n name: component.Name,\n namespace: component.Namespace || undefined,\n version: component.Version,\n dependencies,\n totalCount: dependencies.reduce((sum, d) => sum + (d.totalCount || 1), 1)\n };\n }\n \n /**\n * Get components to load in dependency order\n */\n async getComponentsToLoad(\n rootComponentId: string,\n contextUser?: UserInfo\n ): Promise<string[]> {\n const tree = await this.resolveDependencyTree(rootComponentId, contextUser);\n \n // Flatten tree in dependency order (depth-first)\n const ordered: string[] = [];\n const processNode = (node: DependencyTree) => {\n if (node.dependencies) {\n node.dependencies.forEach(processNode);\n }\n if (!ordered.includes(node.componentId)) {\n ordered.push(node.componentId);\n }\n };\n processNode(tree);\n \n return ordered;\n }\n \n /**\n * Add a reference to a component\n */\n private addComponentReference(componentKey: string, referenceId: string): void {\n if (!this.componentReferences.has(componentKey)) {\n this.componentReferences.set(componentKey, new Set());\n }\n this.componentReferences.get(componentKey)!.add(referenceId);\n }\n \n /**\n * Remove a reference to a component\n */\n removeComponentReference(componentKey: string, referenceId: string): void {\n const refs = this.componentReferences.get(componentKey);\n if (refs) {\n refs.delete(referenceId);\n \n // If no more references and cache cleanup is enabled\n if (refs.size === 0) {\n this.considerCacheEviction(componentKey);\n }\n }\n }\n \n /**\n * Consider evicting a component from cache\n */\n private considerCacheEviction(componentKey: string): void {\n const cached = this.compiledComponentCache.get(componentKey);\n if (cached) {\n const timeSinceLastUse = Date.now() - cached.lastUsed.getTime();\n const evictionThreshold = 5 * 60 * 1000; // 5 minutes\n \n if (timeSinceLastUse > evictionThreshold) {\n if (this.debug) {\n console.log(`๐๏ธ Evicting unused component from cache: ${componentKey}`);\n }\n this.compiledComponentCache.delete(componentKey);\n }\n }\n }\n \n /**\n * Get API key for a registry from secure configuration\n * @param registryId - Registry ID\n * @returns API key or undefined\n */\n private getRegistryApiKey(registryId: string): string | undefined {\n // API keys should be stored in environment variables or secure configuration\n // Format: REGISTRY_API_KEY_{registryId} or similar\n // This is a placeholder - actual implementation would depend on the security infrastructure\n const envKey = `REGISTRY_API_KEY_${registryId.replace(/-/g, '_').toUpperCase()}`;\n return process.env[envKey];\n }\n \n /**\n * Get cache statistics\n */\n getCacheStats(): {\n compiledComponents: number;\n totalUseCount: number;\n memoryEstimate: string;\n } {\n let totalUseCount = 0;\n this.compiledComponentCache.forEach(cached => {\n totalUseCount += cached.useCount;\n });\n \n return {\n compiledComponents: this.compiledComponentCache.size,\n totalUseCount,\n memoryEstimate: `~${(this.compiledComponentCache.size * 50)}KB` // Rough estimate\n };\n }\n \n /**\n * Clear all caches\n */\n clearCache(): void {\n if (this.debug) {\n console.log('๐งน Clearing all component caches');\n }\n this.compiledComponentCache.clear();\n this.componentReferences.clear();\n }\n\n /**\n * Force clear all compiled components\n * Used for Component Studio to ensure fresh loads\n */\n forceClearAll(): void {\n this.compiledComponentCache.clear();\n this.componentReferences.clear();\n console.log('๐งน Component cache force cleared');\n }\n\n /**\n * Reset the singleton instance\n * Forces new instance creation on next access\n */\n static reset(): void {\n if (ComponentRegistryService.instance) {\n ComponentRegistryService.instance.forceClearAll();\n ComponentRegistryService.instance = null;\n }\n }\n \n /**\n * Generate a cache key for a component\n */\n private getComponentKey(\n name: string, \n namespace: string | null | undefined, \n version: string, \n sourceRegistryId: string | null | undefined\n ): string {\n const registryPart = sourceRegistryId || 'local';\n const namespacePart = namespace || 'global';\n return `${registryPart}/${namespacePart}/${name}@${version}`;\n }\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-resolver.d.ts","sourceRoot":"","sources":["../../src/registry/component-resolver.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAMhD,MAAM,WAAW,kBAAkB;IACjC,CAAC,aAAa,EAAE,MAAM,GAAG,GAAG,CAAC;CAC9B;AAMD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,eAAe,CAAyC;IAChE,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,eAAe,CAAoC;IAC3D,OAAO,CAAC,KAAK,CAAkB;gBAU7B,QAAQ,EAAE,iBAAiB,EAC3B,QAAQ,CAAC,EAAE,iBAAiB,EAC5B,cAAc,CAAC,EAAE,cAAc,EAC/B,KAAK,GAAE,OAAe;IAoBlB,iBAAiB,CACrB,IAAI,EAAE,aAAa,EACnB,SAAS,GAAE,MAAiB,EAC5B,WAAW,CAAC,EAAE,QAAQ,GACrB,OAAO,CAAC,kBAAkB,CAAC;YA6FhB,yBAAyB;
|
|
1
|
+
{"version":3,"file":"component-resolver.d.ts","sourceRoot":"","sources":["../../src/registry/component-resolver.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAMhD,MAAM,WAAW,kBAAkB;IACjC,CAAC,aAAa,EAAE,MAAM,GAAG,GAAG,CAAC;CAC9B;AAMD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,eAAe,CAAyC;IAChE,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,eAAe,CAAoC;IAC3D,OAAO,CAAC,KAAK,CAAkB;gBAU7B,QAAQ,EAAE,iBAAiB,EAC3B,QAAQ,CAAC,EAAE,iBAAiB,EAC5B,cAAc,CAAC,EAAE,cAAc,EAC/B,KAAK,GAAE,OAAe;IAoBlB,iBAAiB,CACrB,IAAI,EAAE,aAAa,EACnB,SAAS,GAAE,MAAiB,EAC5B,WAAW,CAAC,EAAE,QAAQ,GACrB,OAAO,CAAC,kBAAkB,CAAC;YA6FhB,yBAAyB;IAyNvC,OAAO,IAAI,IAAI;IAiBf,oBAAoB,CAAC,IAAI,EAAE,aAAa,EAAE,SAAS,GAAE,MAAiB,GAAG,MAAM,EAAE;IAgBjF,OAAO,CAAC,iBAAiB;IA0BzB,kBAAkB,CAAC,IAAI,EAAE,aAAa,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAe9D,OAAO,CAAC,oBAAoB;IAwB5B,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,EAAE;IAuB3C,OAAO,CAAC,kBAAkB;IAwB1B,cAAc,CAAC,IAAI,EAAE,aAAa,EAAE,SAAS,GAAE,MAAiB,GAAG,KAAK,CAAC;QACvE,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,GAAG,CAAC;KAChB,CAAC;IAmBF,qBAAqB,CAAC,IAAI,EAAE,aAAa,GAAG,aAAa,EAAE;IAe3D,OAAO,CAAC,qBAAqB;CAe9B"}
|