@memberjunction/react-runtime 5.50.0 → 5.51.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 +5 -5
- package/CHANGELOG.md +15 -0
- package/dist/324.runtime.umd.js +1 -1
- package/dist/runtime.umd.js +97 -60
- package/dist/utilities/library-loader.d.ts.map +1 -1
- package/dist/utilities/library-loader.js +20 -5
- package/dist/utilities/library-loader.js.map +1 -1
- package/package.json +6 -6
- package/src/__tests__/library-loader-load-order.test.ts +367 -0
- package/src/utilities/library-loader.ts +32 -9
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
|
|
2
|
-
> @memberjunction/react-runtime@5.
|
|
2
|
+
> @memberjunction/react-runtime@5.51.0 build
|
|
3
3
|
> npm run build:node && npm run build:umd
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
> @memberjunction/react-runtime@5.
|
|
6
|
+
> @memberjunction/react-runtime@5.51.0 build:node
|
|
7
7
|
> tsc && tsc-alias -f
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
> @memberjunction/react-runtime@5.
|
|
10
|
+
> @memberjunction/react-runtime@5.51.0 build:umd
|
|
11
11
|
> webpack --config webpack.umd.config.cjs
|
|
12
12
|
|
|
13
13
|
Browserslist: browsers data (caniuse-lite) is 6 months old. Please run:
|
|
@@ -27,8 +27,8 @@ cacheable modules 8.91 MiB
|
|
|
27
27
|
modules by path [1m../../MJCoreEntities/dist/[39m[22m 5.43 MiB
|
|
28
28
|
[1m../../MJCoreEntities/dist/index.js + 66 modules[39m[22m 5.41 MiB [1m[33m[built][39m[22m [1m[33m[code generated][39m[22m
|
|
29
29
|
[1m../../MJCoreEntities/dist/engines/UserViewEngine.js[39m[22m 19.6 KiB [1m[33m[built][39m[22m [1m[33m[code generated][39m[22m
|
|
30
|
-
[1m./dist/index.js + 29 modules[39m[22m
|
|
30
|
+
[1m./dist/index.js + 29 modules[39m[22m 440 KiB [1m[33m[built][39m[22m [1m[33m[code generated][39m[22m
|
|
31
31
|
[1m../../MJCore/dist/index.js + 88 modules[39m[22m 1.8 MiB [1m[33m[built][39m[22m [1m[33m[code generated][39m[22m
|
|
32
32
|
[1m../../MJGlobal/dist/index.js + 24 modules[39m[22m 312 KiB [1m[33m[built][39m[22m [1m[33m[code generated][39m[22m
|
|
33
33
|
[1m../../GraphQLDataProvider/dist/index.mjs[39m[22m 194 KiB [1m[33m[built][39m[22m [1m[33m[code generated][39m[22m
|
|
34
|
-
webpack 5.105.0 compiled [1m[32msuccessfully[39m[22m in
|
|
34
|
+
webpack 5.105.0 compiled [1m[32msuccessfully[39m[22m in 70217 ms
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# @memberjunction/react-runtime
|
|
2
2
|
|
|
3
|
+
## 5.51.0
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- a8fc549: - Fix BaseEngine cache callback fingerprint mismatch that broke cross-server invalidation via Redis pub/sub by extracting a shared BuildRunViewParamsForConfig method to ensure consistent RunViewParams across LoadSingleEntityConfig, LoadMultipleEntityConfigs, and RegisterCacheChangeCallbacks
|
|
8
|
+
- Eliminate React CDN script execution order race condition in library-loader by enforcing sequential script loading
|
|
9
|
+
- Make ChangeDetectorRef optional in BaseResourceComponent to prevent NG0201 injection errors
|
|
10
|
+
- Regenerate spDeleteAIPrompt and spDeleteAIConfiguration stored procedures to remove stale AIPromptRun.AgentRunID cascade references
|
|
11
|
+
- Updated dependencies [a8fc549]
|
|
12
|
+
- @memberjunction/core@5.51.0
|
|
13
|
+
- @memberjunction/graphql-dataprovider@5.51.0
|
|
14
|
+
- @memberjunction/interactive-component-types@5.51.0
|
|
15
|
+
- @memberjunction/core-entities@5.51.0
|
|
16
|
+
- @memberjunction/global@5.51.0
|
|
17
|
+
|
|
3
18
|
## 5.50.0
|
|
4
19
|
|
|
5
20
|
### Patch Changes
|
package/dist/324.runtime.umd.js
CHANGED
|
@@ -361,7 +361,7 @@ var se=Object.defineProperty;var d=(g,e)=>se(g,"name",{value:e,configurable:!0})
|
|
|
361
361
|
}
|
|
362
362
|
}
|
|
363
363
|
}
|
|
364
|
-
`,r={entityDocumentID:e.entityDocumentID};e.maxRecords!==void 0&&(r.maxRecords=e.maxRecords),e.filter!==void 0&&(r.filter=e.filter);const s=await this._dataProvider.ExecuteGQL(t,r);if(!s?.FetchEntityVectors)throw new Error("Invalid response from server");return s.FetchEntityVectors}catch(t){const r=t;return (0,_memberjunction_core__WEBPACK_IMPORTED_MODULE_1__/* .LogError */ .ZI8)("GraphQLAIClient.FetchEntityVectors failed",void 0,r),{Success:!1,Results:[],TotalCount:0,ElapsedMs:0,ErrorMessage:r.message||"Unknown error"}}}}const F="5.
|
|
364
|
+
`,r={entityDocumentID:e.entityDocumentID};e.maxRecords!==void 0&&(r.maxRecords=e.maxRecords),e.filter!==void 0&&(r.filter=e.filter);const s=await this._dataProvider.ExecuteGQL(t,r);if(!s?.FetchEntityVectors)throw new Error("Invalid response from server");return s.FetchEntityVectors}catch(t){const r=t;return (0,_memberjunction_core__WEBPACK_IMPORTED_MODULE_1__/* .LogError */ .ZI8)("GraphQLAIClient.FetchEntityVectors failed",void 0,r),{Success:!1,Results:[],TotalCount:0,ElapsedMs:0,ErrorMessage:r.message||"Unknown error"}}}}const F="5.51.0",$="default";class X{static{d(this,"BrowserStorageProviderBase")}constructor(){this._storage=new Map}getCategoryMap(e){const t=e||$;let r=this._storage.get(t);return r||(r=new Map,this._storage.set(t,r)),r}async GetItem(e,t){const s=this.getCategoryMap(t||$).get(e);return s===void 0?null:s}async GetItems(e,t){const r=new Map;if(e.length===0)return r;const s=this.getCategoryMap(t||$);for(const n of new Set(e)){const a=s.get(n);r.set(n,a===void 0?null:a)}return r}async SetItem(e,t,r){this.getCategoryMap(r||$).set(e,t)}async Remove(e,t){this.getCategoryMap(t||$).delete(e)}async ClearCategory(e){const t=e||$;this._storage.delete(t)}async GetCategoryKeys(e){const t=this._storage.get(e||$);return t?Array.from(t.keys()):[]}}const $e="MJ_Metadata",Pe=0;function Me(){try{const g=F.split("."),e=parseInt(g[0],10),t=parseInt(g[1],10);if(!Number.isFinite(e)||!Number.isFinite(t))throw new Error(`Could not parse major.minor from version "${F}"`);return e*1e3+t+Pe}catch(g){return (0,_memberjunction_core__WEBPACK_IMPORTED_MODULE_1__/* .LogErrorEx */ .Q1A)({error:g,message:"Failed to derive IDB version from PACKAGE_VERSION; using fallback 99999"}),99999}}d(Me,"computeIdbVersion");const Ae=Me(),Y=["mj:default","mj:Metadata","mj:RunViewCache","mj:RunQueryCache","mj:DatasetCache"];class Z extends X{static{d(this,"BrowserIndexedDBStorageProvider")}constructor(){super(),this._dbReady=!1,this.dbPromise=(0,_tempfix_idb__WEBPACK_IMPORTED_MODULE_10__/* .openDB */ .P2)($e,Ae,{upgrade:d((e,t,r)=>{try{(0,_memberjunction_core__WEBPACK_IMPORTED_MODULE_1__/* .LogStatus */ .b09)(`[IDBCache] Upgrading IndexedDB schema v${t} \u2192 v${r} (package ${F}). Dropping all stores; caches will repopulate on first use.`);for(const s of Array.from(e.objectStoreNames))e.deleteObjectStore(s);for(const s of Y)e.objectStoreNames.contains(s)||e.createObjectStore(s)}catch(s){(0,_memberjunction_core__WEBPACK_IMPORTED_MODULE_1__/* .LogErrorEx */ .Q1A)({error:s,message:s?.message})}},"upgrade"),blocked:d((e,t)=>{(0,_memberjunction_core__WEBPACK_IMPORTED_MODULE_1__/* .LogStatus */ .b09)(`[IDBCache] Upgrade from v${e} to v${t} blocked by another tab. Close other tabs to allow the upgrade to proceed.`)},"blocked")}),this.dbPromise.then(e=>{this._dbReady=!0,e.onversionchange=()=>{(0,_memberjunction_core__WEBPACK_IMPORTED_MODULE_1__/* .LogStatus */ .b09)("[IDBCache] DB schema upgraded in another tab \u2014 closing local connection."),e.close(),this._dbReady=!1}}).catch(e=>{(0,_memberjunction_core__WEBPACK_IMPORTED_MODULE_1__/* .LogErrorEx */ .Q1A)({error:e,message:"IndexedDB initialization failed: "+e?.message})})}get IsReady(){return this._dbReady}isKnownCategory(e){const t=`mj:${e}`;return Y.includes(t)}getStoreName(e){const t=e||$;return this.isKnownCategory(t)?`mj:${t}`:"mj:default"}getStoreKey(e,t){const r=t||$;return this.isKnownCategory(r)?e:`[${r}]:${e}`}async SetItem(e,t,r){try{const s=await this.dbPromise,n=this.getStoreName(r),a=this.getStoreKey(e,r),i=s.transaction(n,"readwrite");await i.objectStore(n).put(t,a),await i.done}catch(s){(0,_memberjunction_core__WEBPACK_IMPORTED_MODULE_1__/* .LogErrorEx */ .Q1A)({error:s,message:s?.message})}}async GetItem(e,t){try{const r=await this.dbPromise,s=this.getStoreName(t),n=this.getStoreKey(e,t),a=await r.transaction(s).objectStore(s).get(n);return a===void 0?null:a}catch(r){return (0,_memberjunction_core__WEBPACK_IMPORTED_MODULE_1__/* .LogErrorEx */ .Q1A)({error:r,message:r?.message}),null}}async GetItems(e,t){const r=new Map;if(e.length===0)return r;try{const s=await this.dbPromise,n=this.getStoreName(t),a=Array.from(new Set(e)),i=a.map(f=>this.getStoreKey(f,t)),o=s.transaction(n,"readonly"),m=o.objectStore(n),u=i.map(f=>m.get(f)),h=await Promise.all(u);await o.done;for(let f=0;f<a.length;f++){const y=h[f];r.set(a[f],y===void 0?null:y)}return r}catch(s){(0,_memberjunction_core__WEBPACK_IMPORTED_MODULE_1__/* .LogErrorEx */ .Q1A)({error:s,message:s?.message});for(const n of new Set(e))r.set(n,null);return r}}async Remove(e,t){try{const r=await this.dbPromise,s=this.getStoreName(t),n=this.getStoreKey(e,t),a=r.transaction(s,"readwrite");await a.objectStore(s).delete(n),await a.done}catch(r){(0,_memberjunction_core__WEBPACK_IMPORTED_MODULE_1__/* .LogErrorEx */ .Q1A)({error:r,message:r?.message})}}async ClearCategory(e){try{const t=await this.dbPromise,r=e||$,s=this.getStoreName(e);if(this.isKnownCategory(r)){const n=t.transaction(s,"readwrite");await n.objectStore(s).clear(),await n.done}else{const n=`[${r}]:`,a=t.transaction("mj:default","readwrite"),i=a.objectStore("mj:default"),o=await i.getAllKeys();for(const m of o)typeof m=="string"&&m.startsWith(n)&&await i.delete(m);await a.done}}catch(t){(0,_memberjunction_core__WEBPACK_IMPORTED_MODULE_1__/* .LogErrorEx */ .Q1A)({error:t,message:t?.message})}}async GetCategoryKeys(e){try{const t=await this.dbPromise,r=e||$,s=this.getStoreName(e),i=await t.transaction(s,"readonly").objectStore(s).getAllKeys();if(this.isKnownCategory(r))return i.map(m=>String(m));const o=`[${r}]:`;return i.map(m=>String(m)).filter(m=>m.startsWith(o)).map(m=>m.slice(o.length))}catch(t){return (0,_memberjunction_core__WEBPACK_IMPORTED_MODULE_1__/* .LogErrorEx */ .Q1A)({error:t,message:t?.message}),[]}}}const b=new A,Ne=(0,graphql_request__WEBPACK_IMPORTED_MODULE_0__/* .gql */ .J1)`subscription RemoteOperationProgress($channelId: ID!) {
|
|
365
365
|
RemoteOperationProgress(channelId: $channelId) {
|
|
366
366
|
ChannelId
|
|
367
367
|
ProgressJSON
|
package/dist/runtime.umd.js
CHANGED
|
@@ -31730,6 +31730,36 @@ var BaseEntity = /*#__PURE__*/function () {
|
|
|
31730
31730
|
* Debounces multiple calls so that if Save() is called again while a save is in progress,
|
|
31731
31731
|
* the second call will simply receive the same result as the first.
|
|
31732
31732
|
*
|
|
31733
|
+
* ## IS-A entities: one Save() writes the whole chain
|
|
31734
|
+
*
|
|
31735
|
+
* For a Table-Per-Type child, this saves EVERY level — root first, then down to this entity —
|
|
31736
|
+
* inside one transaction, with a single primary key shared across all of them. Set fields
|
|
31737
|
+
* belonging to any ancestor directly on this object; {@link Set} routes each one to the entity
|
|
31738
|
+
* that owns it. There is no depth limit.
|
|
31739
|
+
*
|
|
31740
|
+
* ```typescript
|
|
31741
|
+
* // Webinar IS-A Meeting IS-A Product
|
|
31742
|
+
* const webinar = await md.GetEntityObject<WebinarEntity>('Webinars', contextUser);
|
|
31743
|
+
* webinar.NewRecord();
|
|
31744
|
+
* webinar.RecordingURL = '...'; // Webinar's own
|
|
31745
|
+
* webinar.StartTime = start; // Meeting's
|
|
31746
|
+
* webinar.Name = 'Q1'; // Product's — set on the SAME object
|
|
31747
|
+
* await webinar.Save(); // writes Product, Meeting, Webinar
|
|
31748
|
+
* ```
|
|
31749
|
+
*
|
|
31750
|
+
* Do NOT create the parent separately and then try to attach a child to it — `NewRecord()`
|
|
31751
|
+
* starts a new chain rather than adopting an existing parent row, so that produces a second
|
|
31752
|
+
* parent and a primary-key conflict.
|
|
31753
|
+
*
|
|
31754
|
+
* If a PARENT level fails validation, this returns false and the failure is reported on THIS
|
|
31755
|
+
* entity's result as `Failed to save parent entity '<Name>': <detail>`. The commonest cause is a
|
|
31756
|
+
* NOT NULL column on an ancestor table that was never set — the child looks complete and the
|
|
31757
|
+
* save still fails. (Before v5.50.0 that result was recorded only on the parent object, so the
|
|
31758
|
+
* caller saw `false` with a null `LatestResult` and an empty `ResultHistory`.)
|
|
31759
|
+
*
|
|
31760
|
+
* @see {@link ISAParent} to inspect the parent instance directly
|
|
31761
|
+
* @see packages/MJCore/docs/isa-relationships.md — "Creating a Child Record"
|
|
31762
|
+
*
|
|
31733
31763
|
* @param options
|
|
31734
31764
|
* @returns Promise<boolean>
|
|
31735
31765
|
*/
|
|
@@ -50874,7 +50904,7 @@ var BaseEngine = /*#__PURE__*/function (_BaseSingleton) {
|
|
|
50874
50904
|
key: "syncLocalCacheForConfig",
|
|
50875
50905
|
value: (function () {
|
|
50876
50906
|
var _syncLocalCacheForConfig = baseEngine_asyncToGenerator(/*#__PURE__*/baseEngine_regenerator().m(function _callee16(config, event) {
|
|
50877
|
-
var entity, provider, connectionString,
|
|
50907
|
+
var entity, provider, connectionString, fingerprint, key, rawUpdatedAt, updatedAt, entityData;
|
|
50878
50908
|
return baseEngine_regenerator().w(function (_context17) {
|
|
50879
50909
|
while (1) switch (_context17.n) {
|
|
50880
50910
|
case 0:
|
|
@@ -50890,16 +50920,9 @@ var BaseEngine = /*#__PURE__*/function (_BaseSingleton) {
|
|
|
50890
50920
|
if (provider && 'InstanceConnectionString' in provider) {
|
|
50891
50921
|
connectionString = provider.InstanceConnectionString;
|
|
50892
50922
|
}
|
|
50893
|
-
//
|
|
50894
|
-
|
|
50895
|
-
|
|
50896
|
-
ExtraFilter: config.Filter || '',
|
|
50897
|
-
OrderBy: config.OrderBy || '',
|
|
50898
|
-
ResultType: 'entity_object',
|
|
50899
|
-
MaxRows: -1,
|
|
50900
|
-
StartRow: 0
|
|
50901
|
-
};
|
|
50902
|
-
fingerprint = LocalCacheManager.Instance.GenerateRunViewFingerprint(params, connectionString); // Build CompositeKey from the entity's primary key fields
|
|
50923
|
+
// Use the shared builder so the fingerprint matches what LoadSingleEntityConfig
|
|
50924
|
+
// and RegisterCacheChangeCallbacks produce — prevents silent cache-slot mismatches
|
|
50925
|
+
fingerprint = LocalCacheManager.Instance.GenerateRunViewFingerprint(this.BuildRunViewParamsForConfig(config), connectionString); // Build CompositeKey from the entity's primary key fields
|
|
50903
50926
|
key = entity.PrimaryKey;
|
|
50904
50927
|
if (!(!key || key.KeyValuePairs.length === 0 || key.KeyValuePairs.some(function (kv) {
|
|
50905
50928
|
return kv.Value == null;
|
|
@@ -51173,6 +51196,31 @@ var BaseEngine = /*#__PURE__*/function (_BaseSingleton) {
|
|
|
51173
51196
|
value: function isLatestConfigRefresh(propertyName, generation) {
|
|
51174
51197
|
return this._configRefreshGeneration.get(propertyName) === generation;
|
|
51175
51198
|
}
|
|
51199
|
+
/**
|
|
51200
|
+
* Builds the RunViewParams for an engine config. Used by LoadSingleEntityConfig,
|
|
51201
|
+
* LoadMultipleEntityConfigs, RegisterCacheChangeCallbacks, and syncLocalCacheForConfig
|
|
51202
|
+
* to ensure the fingerprint-affecting params (EntityName, ExtraFilter, OrderBy,
|
|
51203
|
+
* IgnoreMaxRows) are always consistent — preventing cache key mismatches that break
|
|
51204
|
+
* cross-server invalidation via Redis pub/sub and local cache upsert/remove operations.
|
|
51205
|
+
*/
|
|
51206
|
+
}, {
|
|
51207
|
+
key: "BuildRunViewParamsForConfig",
|
|
51208
|
+
value: function BuildRunViewParamsForConfig(config) {
|
|
51209
|
+
var bypassCache = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
51210
|
+
return {
|
|
51211
|
+
EntityName: config.EntityName,
|
|
51212
|
+
ResultType: config.ResultType || this.EngineDefaultResultType,
|
|
51213
|
+
ExtraFilter: config.Filter,
|
|
51214
|
+
OrderBy: config.OrderBy,
|
|
51215
|
+
IgnoreMaxRows: true,
|
|
51216
|
+
// Engines always need ALL data — bypass entity-level UserViewMaxRows caps
|
|
51217
|
+
_fromEngine: true,
|
|
51218
|
+
// Mark as engine-initiated to avoid false positive telemetry warnings
|
|
51219
|
+
CacheLocal: config.CacheLocal,
|
|
51220
|
+
CacheLocalTTL: config.CacheLocalTTL,
|
|
51221
|
+
BypassCache: bypassCache
|
|
51222
|
+
};
|
|
51223
|
+
}
|
|
51176
51224
|
/**
|
|
51177
51225
|
* Handles the process of loading a single config of type 'entity'.
|
|
51178
51226
|
* @param config
|
|
@@ -51202,19 +51250,7 @@ var BaseEngine = /*#__PURE__*/function (_BaseSingleton) {
|
|
|
51202
51250
|
p = this.RunViewProviderToUse;
|
|
51203
51251
|
rv = new RunView(p);
|
|
51204
51252
|
_context20.n = 1;
|
|
51205
|
-
return rv.RunView(
|
|
51206
|
-
EntityName: config.EntityName,
|
|
51207
|
-
ResultType: config.ResultType || this.EngineDefaultResultType,
|
|
51208
|
-
ExtraFilter: config.Filter,
|
|
51209
|
-
OrderBy: config.OrderBy,
|
|
51210
|
-
IgnoreMaxRows: true,
|
|
51211
|
-
// Engines always need ALL data — bypass entity-level UserViewMaxRows caps
|
|
51212
|
-
_fromEngine: true,
|
|
51213
|
-
// Mark as engine-initiated to avoid false positive telemetry warnings
|
|
51214
|
-
CacheLocal: config.CacheLocal,
|
|
51215
|
-
CacheLocalTTL: config.CacheLocalTTL,
|
|
51216
|
-
BypassCache: bypassCache
|
|
51217
|
-
}, contextUser);
|
|
51253
|
+
return rv.RunView(this.BuildRunViewParamsForConfig(config, bypassCache), contextUser);
|
|
51218
51254
|
case 1:
|
|
51219
51255
|
result = _context20.v;
|
|
51220
51256
|
if (this.isLatestConfigRefresh(config.PropertyName, generation)) {
|
|
@@ -51367,19 +51403,7 @@ var BaseEngine = /*#__PURE__*/function (_BaseSingleton) {
|
|
|
51367
51403
|
p = this.RunViewProviderToUse;
|
|
51368
51404
|
rv = new RunView(p);
|
|
51369
51405
|
viewConfigs = configs.map(function (c) {
|
|
51370
|
-
return
|
|
51371
|
-
EntityName: c.EntityName,
|
|
51372
|
-
ResultType: c.ResultType || _this1.EngineDefaultResultType,
|
|
51373
|
-
ExtraFilter: c.Filter,
|
|
51374
|
-
OrderBy: c.OrderBy,
|
|
51375
|
-
IgnoreMaxRows: true,
|
|
51376
|
-
// Engines always need ALL data — bypass entity-level UserViewMaxRows caps
|
|
51377
|
-
_fromEngine: true,
|
|
51378
|
-
// Mark as engine-initiated to avoid false positive telemetry warnings
|
|
51379
|
-
CacheLocal: c.CacheLocal,
|
|
51380
|
-
CacheLocalTTL: c.CacheLocalTTL,
|
|
51381
|
-
BypassCache: bypassCache
|
|
51382
|
-
};
|
|
51406
|
+
return _this1.BuildRunViewParamsForConfig(c, bypassCache);
|
|
51383
51407
|
});
|
|
51384
51408
|
_context21.n = 1;
|
|
51385
51409
|
return rv.RunViews(viewConfigs, contextUser);
|
|
@@ -51643,12 +51667,7 @@ var BaseEngine = /*#__PURE__*/function (_BaseSingleton) {
|
|
|
51643
51667
|
try {
|
|
51644
51668
|
var _loop2 = function _loop2() {
|
|
51645
51669
|
var config = _step11.value;
|
|
51646
|
-
var fingerprint = LocalCacheManager.Instance.GenerateRunViewFingerprint(
|
|
51647
|
-
EntityName: config.EntityName,
|
|
51648
|
-
ExtraFilter: config.Filter,
|
|
51649
|
-
OrderBy: config.OrderBy,
|
|
51650
|
-
ResultType: 'entity_object'
|
|
51651
|
-
}, connectionPrefix);
|
|
51670
|
+
var fingerprint = LocalCacheManager.Instance.GenerateRunViewFingerprint(_this10.BuildRunViewParamsForConfig(config), connectionPrefix);
|
|
51652
51671
|
var unsubscribe = LocalCacheManager.Instance.RegisterChangeCallback(fingerprint, function (event) {
|
|
51653
51672
|
return _this10.OnExternalCacheChange(config, event);
|
|
51654
51673
|
});
|
|
@@ -132643,27 +132662,45 @@ var LibraryLoader = /*#__PURE__*/function () {
|
|
|
132643
132662
|
value: function () {
|
|
132644
132663
|
var _loadLibrariesFromConfig = library_loader_asyncToGenerator(/*#__PURE__*/library_loader_regenerator().m(function _callee2(options, debug) {
|
|
132645
132664
|
var _this = this;
|
|
132646
|
-
var coreLibraries,
|
|
132665
|
+
var coreLibraries, reactLib, reactDOMLib, babelLib, React, phase2Promises, phase2Labels, phase2Results, ReactDOM, Babel, config, enabledLibraries, pluginLibraries, pluginPromises, pluginResults, libraries;
|
|
132647
132666
|
return library_loader_regenerator().w(function (_context2) {
|
|
132648
132667
|
while (1) switch (_context2.n) {
|
|
132649
132668
|
case 0:
|
|
132650
132669
|
coreLibraries = getCoreRuntimeLibraries(debug);
|
|
132651
|
-
|
|
132652
|
-
return
|
|
132670
|
+
reactLib = coreLibraries.find(function (lib) {
|
|
132671
|
+
return lib.globalVariable === 'React';
|
|
132653
132672
|
});
|
|
132654
|
-
|
|
132655
|
-
|
|
132656
|
-
case 1:
|
|
132657
|
-
coreResults = _context2.v;
|
|
132658
|
-
React = coreResults.find(function (_, i) {
|
|
132659
|
-
return coreLibraries[i].globalVariable === 'React';
|
|
132673
|
+
reactDOMLib = coreLibraries.find(function (lib) {
|
|
132674
|
+
return lib.globalVariable === 'ReactDOM';
|
|
132660
132675
|
});
|
|
132661
|
-
|
|
132662
|
-
return
|
|
132663
|
-
});
|
|
132664
|
-
Babel = coreResults.find(function (_, i) {
|
|
132665
|
-
return coreLibraries[i].globalVariable === 'Babel';
|
|
132676
|
+
babelLib = coreLibraries.find(function (lib) {
|
|
132677
|
+
return lib.globalVariable === 'Babel';
|
|
132666
132678
|
});
|
|
132679
|
+
if (!reactLib) {
|
|
132680
|
+
_context2.n = 2;
|
|
132681
|
+
break;
|
|
132682
|
+
}
|
|
132683
|
+
_context2.n = 1;
|
|
132684
|
+
return this.loadScript(reactLib.cdnUrl, reactLib.globalVariable, debug, reactLib.fallbackCdnUrls);
|
|
132685
|
+
case 1:
|
|
132686
|
+
React = _context2.v;
|
|
132687
|
+
case 2:
|
|
132688
|
+
phase2Promises = [];
|
|
132689
|
+
phase2Labels = [];
|
|
132690
|
+
if (reactDOMLib) {
|
|
132691
|
+
phase2Promises.push(this.loadScript(reactDOMLib.cdnUrl, reactDOMLib.globalVariable, debug, reactDOMLib.fallbackCdnUrls));
|
|
132692
|
+
phase2Labels.push('ReactDOM');
|
|
132693
|
+
}
|
|
132694
|
+
if (babelLib) {
|
|
132695
|
+
phase2Promises.push(this.loadScript(babelLib.cdnUrl, babelLib.globalVariable, debug, babelLib.fallbackCdnUrls));
|
|
132696
|
+
phase2Labels.push('Babel');
|
|
132697
|
+
}
|
|
132698
|
+
_context2.n = 3;
|
|
132699
|
+
return Promise.all(phase2Promises);
|
|
132700
|
+
case 3:
|
|
132701
|
+
phase2Results = _context2.v;
|
|
132702
|
+
ReactDOM = phase2Labels.indexOf('ReactDOM') >= 0 ? phase2Results[phase2Labels.indexOf('ReactDOM')] : undefined;
|
|
132703
|
+
Babel = phase2Labels.indexOf('Babel') >= 0 ? phase2Results[phase2Labels.indexOf('Babel')] : undefined;
|
|
132667
132704
|
if (typeof window !== 'undefined') {
|
|
132668
132705
|
if (React && !window.React) {
|
|
132669
132706
|
window.React = React;
|
|
@@ -132700,9 +132737,9 @@ var LibraryLoader = /*#__PURE__*/function () {
|
|
|
132700
132737
|
pluginPromises = pluginLibraries.map(function (lib) {
|
|
132701
132738
|
return _this.loadScript(lib.cdnUrl, lib.globalVariable, debug, lib.fallbackCdnUrls);
|
|
132702
132739
|
});
|
|
132703
|
-
_context2.n =
|
|
132740
|
+
_context2.n = 4;
|
|
132704
132741
|
return Promise.all(pluginPromises);
|
|
132705
|
-
case
|
|
132742
|
+
case 4:
|
|
132706
132743
|
pluginResults = _context2.v;
|
|
132707
132744
|
libraries = {};
|
|
132708
132745
|
pluginLibraries.forEach(function (lib, index) {
|
|
@@ -132715,7 +132752,7 @@ var LibraryLoader = /*#__PURE__*/function () {
|
|
|
132715
132752
|
libraries: libraries
|
|
132716
132753
|
});
|
|
132717
132754
|
}
|
|
132718
|
-
}, _callee2);
|
|
132755
|
+
}, _callee2, this);
|
|
132719
132756
|
}));
|
|
132720
132757
|
function loadLibrariesFromConfig(_x4, _x5) {
|
|
132721
132758
|
return _loadLibrariesFromConfig.apply(this, arguments);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"library-loader.d.ts","sourceRoot":"","sources":["../../src/utilities/library-loader.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,iBAAiB,EAElB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,kBAAkB,IAAI,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAG/H,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,OAAO,EAAE,kBAAkB,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAS5F,UAAU,cAAc;IACtB,OAAO,EAAE,iBAAiB,GAAG,eAAe,CAAC;IAC7C,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;CACvB;AAMD,MAAM,WAAW,kBAAkB;IAEjC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,eAAe,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACzD;AAKD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,GAAG,CAAC;IACX,QAAQ,EAAE,GAAG,CAAC;IACd,KAAK,EAAE,GAAG,CAAC;IACX,SAAS,EAAE,iBAAiB,CAAC;CAC9B;AAKD,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAC,eAAe,CAAqC;IACnE,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAyC;IAC3E,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAmD;IAKpF,OAAc,sBAAsB,EAAE,OAAO,CAAS;IActD,MAAM,CAAC,kBAAkB,CAAC,KAAK,GAAE,OAAe,GAAG,IAAI;WA2B1C,gBAAgB,CAC3B,MAAM,CAAC,EAAE,oBAAoB,EAC7B,mBAAmB,CAAC,EAAE,qBAAqB,EAAE,EAC7C,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAC5B,OAAO,CAAC,iBAAiB,CAAC;WAwBhB,uBAAuB,CAAC,OAAO,CAAC,EAAE,iBAAiB,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"library-loader.d.ts","sourceRoot":"","sources":["../../src/utilities/library-loader.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,iBAAiB,EAElB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,kBAAkB,IAAI,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAG/H,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,OAAO,EAAE,kBAAkB,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAS5F,UAAU,cAAc;IACtB,OAAO,EAAE,iBAAiB,GAAG,eAAe,CAAC;IAC7C,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;CACvB;AAMD,MAAM,WAAW,kBAAkB;IAEjC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,eAAe,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACzD;AAKD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,GAAG,CAAC;IACX,QAAQ,EAAE,GAAG,CAAC;IACd,KAAK,EAAE,GAAG,CAAC;IACX,SAAS,EAAE,iBAAiB,CAAC;CAC9B;AAKD,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAC,eAAe,CAAqC;IACnE,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAyC;IAC3E,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAmD;IAKpF,OAAc,sBAAsB,EAAE,OAAO,CAAS;IActD,MAAM,CAAC,kBAAkB,CAAC,KAAK,GAAE,OAAe,GAAG,IAAI;WA2B1C,gBAAgB,CAC3B,MAAM,CAAC,EAAE,oBAAoB,EAC7B,mBAAmB,CAAC,EAAE,qBAAqB,EAAE,EAC7C,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAC5B,OAAO,CAAC,iBAAiB,CAAC;WAwBhB,uBAAuB,CAAC,OAAO,CAAC,EAAE,iBAAiB,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,iBAAiB,CAAC;WAyGjG,aAAa,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;mBAwC9D,UAAU;IAkE/B,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAYlC,OAAO,CAAC,MAAM,CAAC,iBAAiB;IA4GhC,OAAO,CAAC,MAAM,CAAC,cAAc;mBAgCR,qBAAqB;IA6D1C,OAAO,CAAC,MAAM,CAAC,OAAO;IA2BtB,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAmDhC,MAAM,CAAC,kBAAkB,IAAI,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC;IAOxD,MAAM,CAAC,UAAU,IAAI,IAAI;WAuBZ,2BAA2B,CACtC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,wBAAwB,EAAE,EACxC,WAAW,GAAE,MAAe,EAC5B,OAAO,CAAC,EAAE,2BAA2B,GACpC,OAAO,CAAC,GAAG,CAAC;WAwHF,6BAA6B,CACxC,YAAY,EAAE,MAAM,EAAE,EACtB,YAAY,EAAE,wBAAwB,EAAE,EACxC,WAAW,GAAE,MAAe,EAC5B,OAAO,CAAC,EAAE,2BAA2B,GACpC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAgI5B,MAAM,CAAC,sBAAsB,IAAI,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC;IAShE,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IASpD,MAAM,CAAC,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;CAGxE"}
|
|
@@ -43,11 +43,26 @@ export class LibraryLoader {
|
|
|
43
43
|
}
|
|
44
44
|
static async loadLibrariesFromConfig(options, debug) {
|
|
45
45
|
const coreLibraries = getCoreRuntimeLibraries(debug);
|
|
46
|
-
const
|
|
47
|
-
const
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
|
|
46
|
+
const reactLib = coreLibraries.find(lib => lib.globalVariable === 'React');
|
|
47
|
+
const reactDOMLib = coreLibraries.find(lib => lib.globalVariable === 'ReactDOM');
|
|
48
|
+
const babelLib = coreLibraries.find(lib => lib.globalVariable === 'Babel');
|
|
49
|
+
let React;
|
|
50
|
+
if (reactLib) {
|
|
51
|
+
React = await this.loadScript(reactLib.cdnUrl, reactLib.globalVariable, debug, reactLib.fallbackCdnUrls);
|
|
52
|
+
}
|
|
53
|
+
const phase2Promises = [];
|
|
54
|
+
const phase2Labels = [];
|
|
55
|
+
if (reactDOMLib) {
|
|
56
|
+
phase2Promises.push(this.loadScript(reactDOMLib.cdnUrl, reactDOMLib.globalVariable, debug, reactDOMLib.fallbackCdnUrls));
|
|
57
|
+
phase2Labels.push('ReactDOM');
|
|
58
|
+
}
|
|
59
|
+
if (babelLib) {
|
|
60
|
+
phase2Promises.push(this.loadScript(babelLib.cdnUrl, babelLib.globalVariable, debug, babelLib.fallbackCdnUrls));
|
|
61
|
+
phase2Labels.push('Babel');
|
|
62
|
+
}
|
|
63
|
+
const phase2Results = await Promise.all(phase2Promises);
|
|
64
|
+
const ReactDOM = phase2Labels.indexOf('ReactDOM') >= 0 ? phase2Results[phase2Labels.indexOf('ReactDOM')] : undefined;
|
|
65
|
+
const Babel = phase2Labels.indexOf('Babel') >= 0 ? phase2Results[phase2Labels.indexOf('Babel')] : undefined;
|
|
51
66
|
if (typeof window !== 'undefined') {
|
|
52
67
|
if (React && !window.React) {
|
|
53
68
|
window.React = React;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"library-loader.js","sourceRoot":"","sources":["../../src/utilities/library-loader.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Library loading utilities for React runtime\n * Provides methods to load and manage external JavaScript libraries and CSS\n * @module @memberjunction/react-runtime/utilities\n */\n\nimport { \n StandardLibraries,\n StandardLibraryManager\n} from './standard-libraries';\nimport { LibraryConfiguration, ExternalLibraryConfig, LibraryLoadOptions as ConfigLoadOptions } from '../types/library-config';\nimport { getCoreRuntimeLibraries, isCoreRuntimeLibrary } from './core-libraries';\nimport { resourceManager } from './resource-manager';\nimport { MJComponentLibraryEntity } from '@memberjunction/core-entities';\nimport { LibraryDependencyResolver } from './library-dependency-resolver';\nimport { LoadedLibraryState, DependencyResolutionOptions } from '../types/dependency-types';\nimport { LibraryRegistry } from './library-registry';\n\n// Unique component ID for resource tracking\nconst LIBRARY_LOADER_COMPONENT_ID = 'mj-react-runtime-library-loader-singleton';\n\n/**\n * Represents a loaded script or CSS resource\n */\ninterface LoadedResource {\n element: HTMLScriptElement | HTMLLinkElement;\n promise: Promise<any>;\n}\n\n/**\n * Options for loading libraries\n * @deprecated Use LibraryLoadOptions from library-config instead\n */\nexport interface LibraryLoadOptions {\n /** Load core libraries (lodash, d3, Chart.js, dayjs) */\n loadCore?: boolean;\n /** Load UI libraries (antd, React Bootstrap) */\n loadUI?: boolean;\n /** Load CSS files for UI libraries */\n loadCSS?: boolean;\n /** Custom library URLs to load */\n customLibraries?: { url: string; globalName: string }[];\n}\n\n/**\n * Result of loading libraries\n */\nexport interface LibraryLoadResult {\n React: any;\n ReactDOM: any;\n Babel: any;\n libraries: StandardLibraries;\n}\n\n/**\n * Library loader class for managing external script loading\n */\nexport class LibraryLoader {\n private static loadedResources = new Map<string, LoadedResource>();\n private static loadedLibraryStates = new Map<string, LoadedLibraryState>();\n private static dependencyResolver = new LibraryDependencyResolver({ debug: false });\n \n /**\n * Enable progressive delay for library initialization (useful for test harness)\n */\n public static enableProgressiveDelay: boolean = false;\n\n /**\n * Inject `<link rel=\"preload\" as=\"script\">` tags for core runtime libraries\n * (React, ReactDOM, Babel) so the browser starts downloading them immediately.\n * Call this as early as possible (e.g., in index.html or APP_INITIALIZER).\n *\n * This is purely a hint — if the scripts are already cached or loaded,\n * the browser ignores the hint. The actual `loadAllLibraries()` call still\n * creates `<script>` tags and waits for execution; preload just ensures the\n * bytes are in the HTTP cache by the time that happens.\n *\n * @param debug Whether to preload development builds (default: false = production)\n */\n static preloadCoreScripts(debug: boolean = false): void {\n if (typeof document === 'undefined') return; // SSR guard\n\n const coreLibraries = getCoreRuntimeLibraries(debug);\n for (const lib of coreLibraries) {\n // Skip if already preloaded or loaded\n if (document.querySelector(`link[href=\"${lib.cdnUrl}\"]`) ||\n document.querySelector(`script[src=\"${lib.cdnUrl}\"]`)) {\n continue;\n }\n const link = document.createElement('link');\n link.rel = 'preload';\n link.as = 'script';\n link.href = lib.cdnUrl;\n // crossorigin is intentionally omitted to match the <script> tags\n // which also omit crossOrigin (see loadScriptFromUrl comment)\n document.head.appendChild(link);\n }\n }\n\n /**\n * Load all standard libraries (core + UI + CSS)\n * This is the main method that should be used by test harness and Angular wrapper\n * @param config Optional full library configuration to replace the default\n * @param additionalLibraries Optional additional libraries to merge with the configuration\n * @param options Optional options including debug mode flag\n */\n static async loadAllLibraries(\n config?: LibraryConfiguration, \n additionalLibraries?: ExternalLibraryConfig[],\n options?: { debug?: boolean }\n ): Promise<LibraryLoadResult> {\n if (config) {\n StandardLibraryManager.setConfiguration(config);\n }\n \n // If additional libraries are provided, merge them with the current configuration\n if (additionalLibraries && additionalLibraries.length > 0) {\n const currentConfig = StandardLibraryManager.getConfiguration();\n const mergedConfig: LibraryConfiguration = {\n libraries: [...currentConfig.libraries, ...additionalLibraries],\n metadata: {\n ...currentConfig.metadata,\n lastUpdated: new Date().toISOString()\n }\n };\n StandardLibraryManager.setConfiguration(mergedConfig);\n }\n \n return this.loadLibrariesFromConfig(undefined, options?.debug);\n }\n\n /**\n * Load libraries based on the current configuration\n */\n static async loadLibrariesFromConfig(options?: ConfigLoadOptions, debug?: boolean): Promise<LibraryLoadResult> {\n // Always load core runtime libraries first\n const coreLibraries = getCoreRuntimeLibraries(debug);\n const corePromises = coreLibraries.map(lib =>\n this.loadScript(lib.cdnUrl, lib.globalVariable, debug, lib.fallbackCdnUrls)\n );\n \n const coreResults = await Promise.all(corePromises);\n const React = coreResults.find((_, i) => coreLibraries[i].globalVariable === 'React');\n const ReactDOM = coreResults.find((_, i) => coreLibraries[i].globalVariable === 'ReactDOM');\n const Babel = coreResults.find((_, i) => coreLibraries[i].globalVariable === 'Babel');\n \n // Expose React and ReactDOM as globals for UMD libraries that expect them\n // Many React component libraries (Recharts, Victory, etc.) expect these as globals\n if (typeof window !== 'undefined') {\n if (React && !(window as any).React) {\n (window as any).React = React;\n //console.log('✓ Exposed React as window.React for UMD compatibility');\n }\n if (ReactDOM && !(window as any).ReactDOM) {\n (window as any).ReactDOM = ReactDOM;\n //console.log('✓ Exposed ReactDOM as window.ReactDOM for UMD compatibility');\n }\n // Also expose PropTypes as empty object if not present (for older libraries)\n if (!(window as any).PropTypes) {\n (window as any).PropTypes = {};\n //console.log('✓ Exposed empty PropTypes as window.PropTypes for UMD compatibility');\n }\n }\n \n // Now load plugin libraries from configuration\n const config = StandardLibraryManager.getConfiguration();\n const enabledLibraries = StandardLibraryManager.getEnabledLibraries();\n \n // Filter out any core runtime libraries from plugin configuration\n let pluginLibraries = enabledLibraries.filter(lib => !isCoreRuntimeLibrary(lib.id));\n \n // Apply options filters if provided\n if (options) {\n if (options.categories) {\n pluginLibraries = pluginLibraries.filter(lib => \n options.categories!.includes(lib.category)\n );\n }\n if (options.excludeRuntimeOnly) {\n pluginLibraries = pluginLibraries.filter(lib => !lib.isRuntimeOnly);\n }\n }\n \n // Load CSS files for plugin libraries (non-blocking)\n pluginLibraries.forEach(lib => {\n if (lib.cdnCssUrl) {\n this.loadCSS(lib.cdnCssUrl);\n }\n });\n \n // Load plugin libraries\n const pluginPromises = pluginLibraries.map(lib =>\n this.loadScript(lib.cdnUrl, lib.globalVariable, debug, lib.fallbackCdnUrls)\n );\n \n const pluginResults = await Promise.all(pluginPromises);\n \n // Build libraries object (only contains plugin libraries)\n const libraries: StandardLibraries = {};\n \n pluginLibraries.forEach((lib, index) => {\n libraries[lib.globalVariable] = pluginResults[index];\n });\n \n return {\n React: React || (window as any).React,\n ReactDOM: ReactDOM || (window as any).ReactDOM,\n Babel: Babel || (window as any).Babel,\n libraries\n };\n }\n\n /**\n * Load libraries with specific options (backward compatibility)\n * @deprecated Use loadLibrariesFromConfig instead\n */\n static async loadLibraries(options: LibraryLoadOptions): Promise<LibraryLoadResult> {\n const {\n loadCore = true,\n loadUI = true,\n loadCSS = true,\n customLibraries = []\n } = options;\n\n // Map old options to new configuration approach\n const categoriesToLoad: Array<ExternalLibraryConfig['category']> = ['runtime'];\n if (loadCore) {\n categoriesToLoad.push('utility', 'charting');\n }\n if (loadUI) {\n categoriesToLoad.push('ui');\n }\n \n const result = await this.loadLibrariesFromConfig({\n categories: categoriesToLoad\n });\n \n // Load custom libraries if provided\n if (customLibraries.length > 0) {\n const customPromises = customLibraries.map(({ url, globalName }) =>\n this.loadScript(url, globalName)\n );\n \n const customResults = await Promise.all(customPromises);\n customLibraries.forEach(({ globalName }, index) => {\n result.libraries[globalName] = customResults[index];\n });\n }\n \n return result;\n }\n\n /**\n * Load a script from URL, with optional fallback CDN URLs.\n * Tries the primary URL first, then each fallback in order until one succeeds.\n */\n private static async loadScript(\n url: string,\n globalName: string,\n debug: boolean = false,\n fallbackUrls?: string[]\n ): Promise<any> {\n // Check if the global is already available (loaded by any URL)\n const existingGlobal = typeof window !== 'undefined' ? (window as any)[globalName] : undefined;\n if (existingGlobal) {\n if (debug) {\n console.log(`✅ Library '${globalName}' already available globally`);\n }\n return existingGlobal;\n }\n\n // Check if already loaded from this URL\n const existing = this.loadedResources.get(url);\n if (existing) {\n if (debug) {\n console.log(`✅ Library '${globalName}' already loaded (cached)`);\n }\n return existing.promise;\n }\n\n // Try the primary URL first\n try {\n return await this.loadScriptFromUrl(url, globalName, debug);\n } catch (primaryError) {\n // If no fallbacks, rethrow immediately\n if (!fallbackUrls || fallbackUrls.length === 0) {\n throw primaryError;\n }\n\n // Clean up the failed primary entry so fallbacks can try fresh\n this.cleanupFailedScript(url);\n\n if (debug) {\n console.warn(`⚠️ Primary CDN failed for '${globalName}', trying fallback CDNs...`);\n }\n\n // Try each fallback URL in order\n for (let i = 0; i < fallbackUrls.length; i++) {\n const fallbackUrl = fallbackUrls[i];\n try {\n const result = await this.loadScriptFromUrl(fallbackUrl, globalName, debug);\n console.log(`✅ Library '${globalName}' loaded from fallback CDN: ${fallbackUrl}`);\n return result;\n } catch (fallbackError) {\n this.cleanupFailedScript(fallbackUrl);\n if (debug) {\n console.warn(`⚠️ Fallback CDN ${i + 1}/${fallbackUrls.length} failed for '${globalName}'`);\n }\n }\n }\n\n // All URLs failed\n const allUrls = [url, ...fallbackUrls];\n throw new Error(\n `Failed to load '${globalName}' from all CDN sources: ${allUrls.join(', ')}`\n );\n }\n }\n\n /**\n * Remove a failed script from the cache and DOM so a fallback URL can be tried.\n */\n private static cleanupFailedScript(url: string): void {\n const failed = this.loadedResources.get(url);\n if (failed?.element?.parentNode) {\n failed.element.parentNode.removeChild(failed.element);\n }\n this.loadedResources.delete(url);\n }\n\n /**\n * Load a single script from a specific URL. This is the low-level loader\n * that handles DOM script element creation and global variable detection.\n */\n private static loadScriptFromUrl(url: string, globalName: string, debug: boolean = false): Promise<any> {\n // Check if already cached for this URL\n const existing = this.loadedResources.get(url);\n if (existing) {\n return existing.promise;\n }\n\n const promise = new Promise((resolve, reject) => {\n // Check if global already exists\n const existingGlobal = (window as any)[globalName];\n if (existingGlobal) {\n resolve(existingGlobal);\n return;\n }\n\n // Check if script tag exists\n const existingScript = document.querySelector(`script[src=\"${url}\"]`);\n if (existingScript) {\n this.waitForScriptLoad(existingScript as HTMLScriptElement, globalName, resolve, reject);\n return;\n }\n\n // Create new script — no crossOrigin attribute so the browser uses standard\n // \"no-cors\" mode, which avoids CORS failures when CDN headers are missing\n // or browser tracking prevention interferes with the response.\n const script = document.createElement('script');\n script.src = url;\n script.async = true;\n\n const cleanup = () => {\n script.removeEventListener('load', onLoad);\n script.removeEventListener('error', onError);\n };\n\n const onLoad = async () => {\n cleanup();\n\n // Use progressive delay if enabled, otherwise use original behavior\n if (LibraryLoader.enableProgressiveDelay) {\n try {\n const global = await LibraryLoader.waitForGlobalVariable(globalName, url, debug);\n resolve(global);\n } catch (error) {\n reject(error);\n }\n } else {\n // Original behavior\n const global = (window as any)[globalName];\n if (global) {\n if (debug) {\n console.log(`✅ Library '${globalName}' loaded successfully from ${url}`);\n }\n resolve(global);\n } else {\n // Some libraries may take a moment to initialize\n resourceManager.setTimeout(\n LIBRARY_LOADER_COMPONENT_ID,\n () => {\n const delayedGlobal = (window as any)[globalName];\n if (delayedGlobal) {\n if (debug) {\n console.log(`✅ Library '${globalName}' loaded successfully (delayed initialization)`);\n }\n resolve(delayedGlobal);\n } else {\n reject(new Error(`${globalName} not found after script load`));\n }\n },\n 100,\n { url, globalName }\n );\n }\n }\n };\n\n const onError = () => {\n cleanup();\n reject(new Error(`Failed to load script: ${url}`));\n };\n\n script.addEventListener('load', onLoad);\n script.addEventListener('error', onError);\n\n if (debug) {\n console.log(`📦 Loading library '${globalName}' from ${url}...`);\n }\n\n // Note: Browser may show \"Could not read source map\" warnings for external libraries.\n // These are harmless and expected when loading minified libraries from CDNs\n // that reference source maps which aren't available. This doesn't affect functionality.\n document.head.appendChild(script);\n\n // Register the script element for cleanup\n resourceManager.registerDOMElement(LIBRARY_LOADER_COMPONENT_ID, script);\n });\n\n this.loadedResources.set(url, {\n element: document.querySelector(`script[src=\"${url}\"]`)!,\n promise\n });\n\n return promise;\n }\n\n /**\n * Check if a library global variable is properly initialized\n * Generic check that works for any library\n */\n private static isLibraryReady(globalVariable: any): boolean {\n if (!globalVariable) {\n return false;\n }\n \n // For functions, they're ready immediately\n if (typeof globalVariable === 'function') {\n return true;\n }\n \n // For objects, check if they have properties (not an empty object)\n if (typeof globalVariable === 'object') {\n // Check for non-empty object with enumerable properties\n const keys = Object.keys(globalVariable);\n // Some libraries might have only non-enumerable properties, \n // so also check for common indicators of initialization\n return keys.length > 0 || \n Object.getOwnPropertyNames(globalVariable).length > 1 || // > 1 to exclude just constructor\n globalVariable.constructor !== Object; // Has a custom constructor\n }\n \n // For other types (string, number, etc.), consider them ready\n return true;\n }\n\n /**\n * Wait for a global variable to be available with progressive delays\n * @param globalName The name of the global variable to wait for\n * @param url The URL of the script (for debugging)\n * @param debug Whether to log debug information\n * @returns The global variable once it's available\n */\n private static async waitForGlobalVariable(\n globalName: string, \n url: string, \n debug: boolean = false\n ): Promise<any> {\n const delays = [0, 100, 200, 300, 400]; // Total: 1000ms max delay\n const maxAttempts = delays.length;\n let totalDelay = 0;\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n // Wait for the specified delay (0ms on first attempt)\n if (attempt > 0) {\n const delay = delays[attempt];\n if (debug) {\n console.log(`⏳ Waiting ${delay}ms for ${globalName} to initialize (attempt ${attempt + 1}/${maxAttempts})...`);\n }\n await new Promise(resolve => {\n resourceManager.setTimeout(\n LIBRARY_LOADER_COMPONENT_ID,\n () => resolve(undefined),\n delay,\n { globalName, attempt }\n );\n });\n totalDelay += delay;\n }\n\n // Check if the global variable exists\n const global = (window as any)[globalName];\n if (global) {\n // Use generic library readiness check\n const isReady = this.isLibraryReady(global);\n\n if (isReady) {\n if (debug) {\n if (totalDelay > 0) {\n console.log(`✅ ${globalName} ready after ${totalDelay}ms delay`);\n } else {\n console.log(`✅ Library '${globalName}' loaded successfully from ${url}`);\n }\n }\n return global;\n } else if (debug && attempt < maxAttempts - 1) {\n console.log(`🔄 ${globalName} exists but not fully initialized, will retry...`);\n }\n }\n }\n\n // Final check after all attempts\n const finalGlobal = (window as any)[globalName];\n if (finalGlobal) {\n console.warn(`⚠️ ${globalName} loaded but may not be fully initialized after ${totalDelay}ms`);\n return finalGlobal;\n }\n\n throw new Error(`${globalName} not found after script load and ${totalDelay}ms delay`);\n }\n\n /**\n * Load CSS from URL\n */\n private static loadCSS(url: string): void {\n if (this.loadedResources.has(url)) {\n return;\n }\n\n const existingLink = document.querySelector(`link[href=\"${url}\"]`);\n if (existingLink) {\n return;\n }\n\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = url;\n document.head.appendChild(link);\n \n // Register the link element for cleanup\n resourceManager.registerDOMElement(LIBRARY_LOADER_COMPONENT_ID, link);\n\n this.loadedResources.set(url, {\n element: link,\n promise: Promise.resolve()\n });\n }\n\n /**\n * Wait for existing script to load\n */\n private static waitForScriptLoad(\n script: HTMLScriptElement,\n globalName: string,\n resolve: (value: any) => void,\n reject: (reason: any) => void\n ): void {\n const checkGlobal = () => {\n const global = (window as any)[globalName];\n if (global) {\n resolve(global);\n } else {\n // Retry after a short delay\n resourceManager.setTimeout(\n LIBRARY_LOADER_COMPONENT_ID,\n () => {\n const delayedGlobal = (window as any)[globalName];\n if (delayedGlobal) {\n resolve(delayedGlobal);\n } else {\n reject(new Error(`${globalName} not found after script load`));\n }\n },\n 100,\n { context: 'waitForScriptLoad', globalName }\n );\n }\n };\n\n // Check if already loaded\n if ((script as any).complete || (script as any).readyState === 'complete') {\n checkGlobal();\n return;\n }\n\n // Wait for load\n const loadHandler = () => {\n checkGlobal();\n };\n resourceManager.addEventListener(\n LIBRARY_LOADER_COMPONENT_ID,\n script,\n 'load',\n loadHandler,\n { once: true }\n );\n }\n\n\n /**\n * Get all loaded resources (for cleanup)\n */\n static getLoadedResources(): Map<string, LoadedResource> {\n return this.loadedResources;\n }\n\n /**\n * Clear loaded resources cache and cleanup DOM elements\n */\n static clearCache(): void {\n // Remove all script and link elements we added\n this.loadedResources.forEach((resource, url) => {\n if (resource.element && resource.element.parentNode) {\n resource.element.parentNode.removeChild(resource.element);\n }\n });\n \n this.loadedResources.clear();\n this.loadedLibraryStates.clear();\n \n // Clean up any resources managed by resource manager\n resourceManager.cleanupComponent(LIBRARY_LOADER_COMPONENT_ID);\n }\n\n /**\n * Load a library with its dependencies\n * @param libraryName - Name of the library to load\n * @param allLibraries - All available libraries for dependency resolution\n * @param requestedBy - Name of the component/library requesting this load\n * @param options - Dependency resolution options\n * @returns Promise resolving to the loaded library global object\n */\n static async loadLibraryWithDependencies(\n libraryName: string,\n allLibraries: MJComponentLibraryEntity[],\n requestedBy: string = 'user',\n options?: DependencyResolutionOptions\n ): Promise<any> {\n const debug = options?.debug || false;\n \n if (debug) {\n console.log(`📚 Loading library '${libraryName}' with dependencies`);\n }\n\n // Check if already loaded\n const existingState = this.loadedLibraryStates.get(libraryName);\n if (existingState) {\n if (debug) {\n console.log(`✅ Library '${libraryName}' already loaded (version: ${existingState.version})`);\n }\n // Track who requested it\n if (!existingState.requestedBy.includes(requestedBy)) {\n existingState.requestedBy.push(requestedBy);\n }\n return (window as any)[existingState.globalVariable];\n }\n\n // Get load order including dependencies\n const loadOrderResult = this.dependencyResolver.getLoadOrder(\n [libraryName],\n allLibraries,\n options\n );\n\n if (!loadOrderResult.success) {\n const errors = loadOrderResult.errors?.join(', ') || 'Unknown error';\n throw new Error(`Failed to resolve dependencies for '${libraryName}': ${errors}`);\n }\n\n if (loadOrderResult.warnings && debug) {\n console.warn(`⚠️ Warnings for '${libraryName}':`, loadOrderResult.warnings);\n }\n\n const loadOrder = loadOrderResult.order || [];\n if (debug) {\n console.log(`📋 Load order for '${libraryName}':`, loadOrder.map(lib => `${lib.Name}@${lib.Version}`));\n }\n\n // Load libraries in order\n for (const library of loadOrder) {\n // Skip if already loaded\n if (this.loadedLibraryStates.has(library.Name)) {\n if (debug) {\n console.log(`⏭️ Skipping '${library.Name}' (already loaded)`);\n }\n continue;\n }\n\n // Check library status\n if (library.Status) {\n if (library.Status === 'Disabled') {\n console.error(`🚫 ERROR: Library '${library.Name}' is DISABLED and should not be used`);\n // Continue loading anyway per requirements\n } else if (library.Status === 'Deprecated') {\n console.warn(`⚠️ WARNING: Library '${library.Name}' is DEPRECATED. Consider using an alternative.`);\n }\n // Active status is fine, no message needed\n }\n\n if (debug) {\n console.log(`📥 Loading '${library.Name}@${library.Version}'`);\n }\n\n // Load the library\n if (!library.CDNUrl || !library.GlobalVariable) {\n throw new Error(`Library '${library.Name}' missing CDN URL or global variable`);\n }\n\n // Load CSS if available\n if (library.CDNCssUrl) {\n const cssUrls = library.CDNCssUrl.split(',').map(url => url.trim());\n for (const cssUrl of cssUrls) {\n if (cssUrl) {\n this.loadCSS(cssUrl);\n }\n }\n }\n\n // Load the script\n const loadedGlobal = await this.loadScript(library.CDNUrl, library.GlobalVariable, debug);\n\n // Track the loaded state\n const dependencies = Array.from(\n this.dependencyResolver.getDirectDependencies(library).keys()\n );\n\n this.loadedLibraryStates.set(library.Name, {\n name: library.Name,\n version: library.Version || 'unknown',\n globalVariable: library.GlobalVariable,\n loadedAt: new Date(),\n requestedBy: library.Name === libraryName ? [requestedBy] : [],\n dependencies\n });\n\n if (debug) {\n console.log(`✅ Loaded '${library.Name}@${library.Version}'`);\n }\n }\n\n // Return the originally requested library's global\n const targetLibrary = loadOrder.find(lib => lib.Name === libraryName);\n if (!targetLibrary || !targetLibrary.GlobalVariable) {\n throw new Error(`Failed to load library '${libraryName}'`);\n }\n\n return (window as any)[targetLibrary.GlobalVariable];\n }\n\n /**\n * Load multiple libraries with dependency resolution\n * @param libraryNames - Names of libraries to load\n * @param allLibraries - All available libraries for dependency resolution\n * @param requestedBy - Name of the component requesting these libraries\n * @param options - Dependency resolution options\n * @returns Map of library names to their loaded global objects\n */\n static async loadLibrariesWithDependencies(\n libraryNames: string[],\n allLibraries: MJComponentLibraryEntity[],\n requestedBy: string = 'user',\n options?: DependencyResolutionOptions\n ): Promise<Map<string, any>> {\n const debug = options?.debug || false;\n const result = new Map<string, any>();\n \n if (debug) {\n console.log(`📚 Loading libraries with dependencies:`, libraryNames);\n console.log(` 📦 Total available libraries: ${allLibraries.length}`);\n }\n\n // Get combined load order for all requested libraries\n const loadOrderResult = this.dependencyResolver.getLoadOrder(\n libraryNames,\n allLibraries,\n options\n );\n\n if (!loadOrderResult.success) {\n const errors = loadOrderResult.errors?.join(', ') || 'Unknown error';\n throw new Error(`Failed to resolve dependencies: ${errors}`);\n }\n\n if (debug) {\n console.log(` 📊 Dependency resolution result:`, {\n success: loadOrderResult.success,\n errors: loadOrderResult.errors || [],\n warnings: loadOrderResult.warnings || []\n });\n \n if (loadOrderResult.order) {\n console.log(` 🔄 Resolved dependencies for each library:`);\n loadOrderResult.order.forEach(lib => {\n const deps = this.dependencyResolver.parseDependencies(lib.Dependencies);\n if (deps.size > 0) {\n console.log(` • ${lib.Name}@${lib.Version} requires:`, Array.from(deps.entries()));\n } else {\n console.log(` • ${lib.Name}@${lib.Version} (no dependencies)`);\n }\n });\n }\n }\n\n if (loadOrderResult.warnings && debug) {\n console.warn(` ⚠️ Warnings:`, loadOrderResult.warnings);\n }\n\n const loadOrder = loadOrderResult.order || [];\n if (debug) {\n console.log(` 📋 Final load order:`, loadOrder.map(lib => `${lib.Name}@${lib.Version}`));\n }\n\n // Load all libraries in order\n for (const library of loadOrder) {\n // Skip if already loaded\n if (this.loadedLibraryStates.has(library.Name)) {\n if (debug) {\n console.log(`⏭️ Skipping '${library.Name}' (already loaded)`);\n }\n const state = this.loadedLibraryStates.get(library.Name)!;\n if (libraryNames.includes(library.Name)) {\n result.set(library.Name, (window as any)[state.globalVariable]);\n }\n continue;\n }\n\n // Check library status\n if (library.Status) {\n if (library.Status === 'Disabled') {\n console.error(`🚫 ERROR: Library '${library.Name}' is DISABLED and should not be used`);\n // Continue loading anyway per requirements\n } else if (library.Status === 'Deprecated') {\n console.warn(`⚠️ WARNING: Library '${library.Name}' is DEPRECATED. Consider using an alternative.`);\n }\n // Active status is fine, no message needed\n }\n\n if (debug) {\n console.log(`📥 Loading '${library.Name}@${library.Version}'`);\n }\n\n // Load the library\n if (!library.CDNUrl || !library.GlobalVariable) {\n throw new Error(`Library '${library.Name}' missing CDN URL or global variable`);\n }\n\n // Load CSS if available\n if (library.CDNCssUrl) {\n const cssUrls = library.CDNCssUrl.split(',').map(url => url.trim());\n for (const cssUrl of cssUrls) {\n if (cssUrl) {\n this.loadCSS(cssUrl);\n }\n }\n }\n\n // Load the script\n const loadedGlobal = await this.loadScript(library.CDNUrl, library.GlobalVariable, debug);\n\n // Track the loaded state\n const dependencies = Array.from(\n this.dependencyResolver.getDirectDependencies(library).keys()\n );\n\n this.loadedLibraryStates.set(library.Name, {\n name: library.Name,\n version: library.Version || 'unknown',\n globalVariable: library.GlobalVariable,\n loadedAt: new Date(),\n requestedBy: libraryNames.includes(library.Name) ? [requestedBy] : [],\n dependencies\n });\n\n // Add to result if it was directly requested\n if (libraryNames.includes(library.Name)) {\n result.set(library.Name, loadedGlobal);\n }\n\n if (debug) {\n console.log(`✅ Loaded '${library.Name}@${library.Version}'`);\n }\n }\n\n return result;\n }\n\n /**\n * Get information about loaded libraries\n * @returns Map of loaded library states\n */\n static getLoadedLibraryStates(): Map<string, LoadedLibraryState> {\n return new Map(this.loadedLibraryStates);\n }\n\n /**\n * Check if a library is loaded\n * @param libraryName - Name of the library\n * @returns True if the library is loaded\n */\n static isLibraryLoaded(libraryName: string): boolean {\n return this.loadedLibraryStates.has(libraryName);\n }\n\n /**\n * Get the version of a loaded library\n * @param libraryName - Name of the library\n * @returns Version string or undefined if not loaded\n */\n static getLoadedLibraryVersion(libraryName: string): string | undefined {\n return this.loadedLibraryStates.get(libraryName)?.version;\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"library-loader.js","sourceRoot":"","sources":["../../src/utilities/library-loader.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Library loading utilities for React runtime\n * Provides methods to load and manage external JavaScript libraries and CSS\n * @module @memberjunction/react-runtime/utilities\n */\n\nimport { \n StandardLibraries,\n StandardLibraryManager\n} from './standard-libraries';\nimport { LibraryConfiguration, ExternalLibraryConfig, LibraryLoadOptions as ConfigLoadOptions } from '../types/library-config';\nimport { getCoreRuntimeLibraries, isCoreRuntimeLibrary } from './core-libraries';\nimport { resourceManager } from './resource-manager';\nimport { MJComponentLibraryEntity } from '@memberjunction/core-entities';\nimport { LibraryDependencyResolver } from './library-dependency-resolver';\nimport { LoadedLibraryState, DependencyResolutionOptions } from '../types/dependency-types';\nimport { LibraryRegistry } from './library-registry';\n\n// Unique component ID for resource tracking\nconst LIBRARY_LOADER_COMPONENT_ID = 'mj-react-runtime-library-loader-singleton';\n\n/**\n * Represents a loaded script or CSS resource\n */\ninterface LoadedResource {\n element: HTMLScriptElement | HTMLLinkElement;\n promise: Promise<any>;\n}\n\n/**\n * Options for loading libraries\n * @deprecated Use LibraryLoadOptions from library-config instead\n */\nexport interface LibraryLoadOptions {\n /** Load core libraries (lodash, d3, Chart.js, dayjs) */\n loadCore?: boolean;\n /** Load UI libraries (antd, React Bootstrap) */\n loadUI?: boolean;\n /** Load CSS files for UI libraries */\n loadCSS?: boolean;\n /** Custom library URLs to load */\n customLibraries?: { url: string; globalName: string }[];\n}\n\n/**\n * Result of loading libraries\n */\nexport interface LibraryLoadResult {\n React: any;\n ReactDOM: any;\n Babel: any;\n libraries: StandardLibraries;\n}\n\n/**\n * Library loader class for managing external script loading\n */\nexport class LibraryLoader {\n private static loadedResources = new Map<string, LoadedResource>();\n private static loadedLibraryStates = new Map<string, LoadedLibraryState>();\n private static dependencyResolver = new LibraryDependencyResolver({ debug: false });\n \n /**\n * Enable progressive delay for library initialization (useful for test harness)\n */\n public static enableProgressiveDelay: boolean = false;\n\n /**\n * Inject `<link rel=\"preload\" as=\"script\">` tags for core runtime libraries\n * (React, ReactDOM, Babel) so the browser starts downloading them immediately.\n * Call this as early as possible (e.g., in index.html or APP_INITIALIZER).\n *\n * This is purely a hint — if the scripts are already cached or loaded,\n * the browser ignores the hint. The actual `loadAllLibraries()` call still\n * creates `<script>` tags and waits for execution; preload just ensures the\n * bytes are in the HTTP cache by the time that happens.\n *\n * @param debug Whether to preload development builds (default: false = production)\n */\n static preloadCoreScripts(debug: boolean = false): void {\n if (typeof document === 'undefined') return; // SSR guard\n\n const coreLibraries = getCoreRuntimeLibraries(debug);\n for (const lib of coreLibraries) {\n // Skip if already preloaded or loaded\n if (document.querySelector(`link[href=\"${lib.cdnUrl}\"]`) ||\n document.querySelector(`script[src=\"${lib.cdnUrl}\"]`)) {\n continue;\n }\n const link = document.createElement('link');\n link.rel = 'preload';\n link.as = 'script';\n link.href = lib.cdnUrl;\n // crossorigin is intentionally omitted to match the <script> tags\n // which also omit crossOrigin (see loadScriptFromUrl comment)\n document.head.appendChild(link);\n }\n }\n\n /**\n * Load all standard libraries (core + UI + CSS)\n * This is the main method that should be used by test harness and Angular wrapper\n * @param config Optional full library configuration to replace the default\n * @param additionalLibraries Optional additional libraries to merge with the configuration\n * @param options Optional options including debug mode flag\n */\n static async loadAllLibraries(\n config?: LibraryConfiguration, \n additionalLibraries?: ExternalLibraryConfig[],\n options?: { debug?: boolean }\n ): Promise<LibraryLoadResult> {\n if (config) {\n StandardLibraryManager.setConfiguration(config);\n }\n \n // If additional libraries are provided, merge them with the current configuration\n if (additionalLibraries && additionalLibraries.length > 0) {\n const currentConfig = StandardLibraryManager.getConfiguration();\n const mergedConfig: LibraryConfiguration = {\n libraries: [...currentConfig.libraries, ...additionalLibraries],\n metadata: {\n ...currentConfig.metadata,\n lastUpdated: new Date().toISOString()\n }\n };\n StandardLibraryManager.setConfiguration(mergedConfig);\n }\n \n return this.loadLibrariesFromConfig(undefined, options?.debug);\n }\n\n /**\n * Load libraries based on the current configuration\n */\n static async loadLibrariesFromConfig(options?: ConfigLoadOptions, debug?: boolean): Promise<LibraryLoadResult> {\n // Load core runtime libraries in dependency order.\n // ReactDOM's UMD factory captures `window.React` at execution time,\n // so React MUST execute before ReactDOM. Loading them in parallel with\n // async scripts causes an intermittent race condition where ReactDOM\n // executes first and gets `undefined` for React, permanently breaking\n // `createRoot` on that object instance.\n const coreLibraries = getCoreRuntimeLibraries(debug);\n const reactLib = coreLibraries.find(lib => lib.globalVariable === 'React');\n const reactDOMLib = coreLibraries.find(lib => lib.globalVariable === 'ReactDOM');\n const babelLib = coreLibraries.find(lib => lib.globalVariable === 'Babel');\n\n // Phase 1: React must load first (ReactDOM depends on it)\n let React: unknown;\n if (reactLib) {\n React = await this.loadScript(reactLib.cdnUrl, reactLib.globalVariable, debug, reactLib.fallbackCdnUrls);\n }\n\n // Phase 2: ReactDOM and Babel can load in parallel (both only depend on React)\n const phase2Promises: Promise<unknown>[] = [];\n const phase2Labels: string[] = [];\n\n if (reactDOMLib) {\n phase2Promises.push(this.loadScript(reactDOMLib.cdnUrl, reactDOMLib.globalVariable, debug, reactDOMLib.fallbackCdnUrls));\n phase2Labels.push('ReactDOM');\n }\n if (babelLib) {\n phase2Promises.push(this.loadScript(babelLib.cdnUrl, babelLib.globalVariable, debug, babelLib.fallbackCdnUrls));\n phase2Labels.push('Babel');\n }\n\n const phase2Results = await Promise.all(phase2Promises);\n const ReactDOM = phase2Labels.indexOf('ReactDOM') >= 0 ? phase2Results[phase2Labels.indexOf('ReactDOM')] : undefined;\n const Babel = phase2Labels.indexOf('Babel') >= 0 ? phase2Results[phase2Labels.indexOf('Babel')] : undefined;\n \n // Expose React and ReactDOM as globals for UMD libraries that expect them\n // Many React component libraries (Recharts, Victory, etc.) expect these as globals\n if (typeof window !== 'undefined') {\n if (React && !(window as any).React) {\n (window as any).React = React;\n //console.log('✓ Exposed React as window.React for UMD compatibility');\n }\n if (ReactDOM && !(window as any).ReactDOM) {\n (window as any).ReactDOM = ReactDOM;\n //console.log('✓ Exposed ReactDOM as window.ReactDOM for UMD compatibility');\n }\n // Also expose PropTypes as empty object if not present (for older libraries)\n if (!(window as any).PropTypes) {\n (window as any).PropTypes = {};\n //console.log('✓ Exposed empty PropTypes as window.PropTypes for UMD compatibility');\n }\n }\n \n // Now load plugin libraries from configuration\n const config = StandardLibraryManager.getConfiguration();\n const enabledLibraries = StandardLibraryManager.getEnabledLibraries();\n \n // Filter out any core runtime libraries from plugin configuration\n let pluginLibraries = enabledLibraries.filter(lib => !isCoreRuntimeLibrary(lib.id));\n \n // Apply options filters if provided\n if (options) {\n if (options.categories) {\n pluginLibraries = pluginLibraries.filter(lib => \n options.categories!.includes(lib.category)\n );\n }\n if (options.excludeRuntimeOnly) {\n pluginLibraries = pluginLibraries.filter(lib => !lib.isRuntimeOnly);\n }\n }\n \n // Load CSS files for plugin libraries (non-blocking)\n pluginLibraries.forEach(lib => {\n if (lib.cdnCssUrl) {\n this.loadCSS(lib.cdnCssUrl);\n }\n });\n \n // Load plugin libraries\n const pluginPromises = pluginLibraries.map(lib =>\n this.loadScript(lib.cdnUrl, lib.globalVariable, debug, lib.fallbackCdnUrls)\n );\n \n const pluginResults = await Promise.all(pluginPromises);\n \n // Build libraries object (only contains plugin libraries)\n const libraries: StandardLibraries = {};\n \n pluginLibraries.forEach((lib, index) => {\n libraries[lib.globalVariable] = pluginResults[index];\n });\n \n return {\n React: React || (window as any).React,\n ReactDOM: ReactDOM || (window as any).ReactDOM,\n Babel: Babel || (window as any).Babel,\n libraries\n };\n }\n\n /**\n * Load libraries with specific options (backward compatibility)\n * @deprecated Use loadLibrariesFromConfig instead\n */\n static async loadLibraries(options: LibraryLoadOptions): Promise<LibraryLoadResult> {\n const {\n loadCore = true,\n loadUI = true,\n loadCSS = true,\n customLibraries = []\n } = options;\n\n // Map old options to new configuration approach\n const categoriesToLoad: Array<ExternalLibraryConfig['category']> = ['runtime'];\n if (loadCore) {\n categoriesToLoad.push('utility', 'charting');\n }\n if (loadUI) {\n categoriesToLoad.push('ui');\n }\n \n const result = await this.loadLibrariesFromConfig({\n categories: categoriesToLoad\n });\n \n // Load custom libraries if provided\n if (customLibraries.length > 0) {\n const customPromises = customLibraries.map(({ url, globalName }) =>\n this.loadScript(url, globalName)\n );\n \n const customResults = await Promise.all(customPromises);\n customLibraries.forEach(({ globalName }, index) => {\n result.libraries[globalName] = customResults[index];\n });\n }\n \n return result;\n }\n\n /**\n * Load a script from URL, with optional fallback CDN URLs.\n * Tries the primary URL first, then each fallback in order until one succeeds.\n */\n private static async loadScript(\n url: string,\n globalName: string,\n debug: boolean = false,\n fallbackUrls?: string[]\n ): Promise<any> {\n // Check if the global is already available (loaded by any URL)\n const existingGlobal = typeof window !== 'undefined' ? (window as any)[globalName] : undefined;\n if (existingGlobal) {\n if (debug) {\n console.log(`✅ Library '${globalName}' already available globally`);\n }\n return existingGlobal;\n }\n\n // Check if already loaded from this URL\n const existing = this.loadedResources.get(url);\n if (existing) {\n if (debug) {\n console.log(`✅ Library '${globalName}' already loaded (cached)`);\n }\n return existing.promise;\n }\n\n // Try the primary URL first\n try {\n return await this.loadScriptFromUrl(url, globalName, debug);\n } catch (primaryError) {\n // If no fallbacks, rethrow immediately\n if (!fallbackUrls || fallbackUrls.length === 0) {\n throw primaryError;\n }\n\n // Clean up the failed primary entry so fallbacks can try fresh\n this.cleanupFailedScript(url);\n\n if (debug) {\n console.warn(`⚠️ Primary CDN failed for '${globalName}', trying fallback CDNs...`);\n }\n\n // Try each fallback URL in order\n for (let i = 0; i < fallbackUrls.length; i++) {\n const fallbackUrl = fallbackUrls[i];\n try {\n const result = await this.loadScriptFromUrl(fallbackUrl, globalName, debug);\n console.log(`✅ Library '${globalName}' loaded from fallback CDN: ${fallbackUrl}`);\n return result;\n } catch (fallbackError) {\n this.cleanupFailedScript(fallbackUrl);\n if (debug) {\n console.warn(`⚠️ Fallback CDN ${i + 1}/${fallbackUrls.length} failed for '${globalName}'`);\n }\n }\n }\n\n // All URLs failed\n const allUrls = [url, ...fallbackUrls];\n throw new Error(\n `Failed to load '${globalName}' from all CDN sources: ${allUrls.join(', ')}`\n );\n }\n }\n\n /**\n * Remove a failed script from the cache and DOM so a fallback URL can be tried.\n */\n private static cleanupFailedScript(url: string): void {\n const failed = this.loadedResources.get(url);\n if (failed?.element?.parentNode) {\n failed.element.parentNode.removeChild(failed.element);\n }\n this.loadedResources.delete(url);\n }\n\n /**\n * Load a single script from a specific URL. This is the low-level loader\n * that handles DOM script element creation and global variable detection.\n */\n private static loadScriptFromUrl(url: string, globalName: string, debug: boolean = false): Promise<any> {\n // Check if already cached for this URL\n const existing = this.loadedResources.get(url);\n if (existing) {\n return existing.promise;\n }\n\n const promise = new Promise((resolve, reject) => {\n // Check if global already exists\n const existingGlobal = (window as any)[globalName];\n if (existingGlobal) {\n resolve(existingGlobal);\n return;\n }\n\n // Check if script tag exists\n const existingScript = document.querySelector(`script[src=\"${url}\"]`);\n if (existingScript) {\n this.waitForScriptLoad(existingScript as HTMLScriptElement, globalName, resolve, reject);\n return;\n }\n\n // Create new script — no crossOrigin attribute so the browser uses standard\n // \"no-cors\" mode, which avoids CORS failures when CDN headers are missing\n // or browser tracking prevention interferes with the response.\n const script = document.createElement('script');\n script.src = url;\n script.async = true;\n\n const cleanup = () => {\n script.removeEventListener('load', onLoad);\n script.removeEventListener('error', onError);\n };\n\n const onLoad = async () => {\n cleanup();\n\n // Use progressive delay if enabled, otherwise use original behavior\n if (LibraryLoader.enableProgressiveDelay) {\n try {\n const global = await LibraryLoader.waitForGlobalVariable(globalName, url, debug);\n resolve(global);\n } catch (error) {\n reject(error);\n }\n } else {\n // Original behavior\n const global = (window as any)[globalName];\n if (global) {\n if (debug) {\n console.log(`✅ Library '${globalName}' loaded successfully from ${url}`);\n }\n resolve(global);\n } else {\n // Some libraries may take a moment to initialize\n resourceManager.setTimeout(\n LIBRARY_LOADER_COMPONENT_ID,\n () => {\n const delayedGlobal = (window as any)[globalName];\n if (delayedGlobal) {\n if (debug) {\n console.log(`✅ Library '${globalName}' loaded successfully (delayed initialization)`);\n }\n resolve(delayedGlobal);\n } else {\n reject(new Error(`${globalName} not found after script load`));\n }\n },\n 100,\n { url, globalName }\n );\n }\n }\n };\n\n const onError = () => {\n cleanup();\n reject(new Error(`Failed to load script: ${url}`));\n };\n\n script.addEventListener('load', onLoad);\n script.addEventListener('error', onError);\n\n if (debug) {\n console.log(`📦 Loading library '${globalName}' from ${url}...`);\n }\n\n // Note: Browser may show \"Could not read source map\" warnings for external libraries.\n // These are harmless and expected when loading minified libraries from CDNs\n // that reference source maps which aren't available. This doesn't affect functionality.\n document.head.appendChild(script);\n\n // Register the script element for cleanup\n resourceManager.registerDOMElement(LIBRARY_LOADER_COMPONENT_ID, script);\n });\n\n this.loadedResources.set(url, {\n element: document.querySelector(`script[src=\"${url}\"]`)!,\n promise\n });\n\n return promise;\n }\n\n /**\n * Check if a library global variable is properly initialized\n * Generic check that works for any library\n */\n private static isLibraryReady(globalVariable: any): boolean {\n if (!globalVariable) {\n return false;\n }\n \n // For functions, they're ready immediately\n if (typeof globalVariable === 'function') {\n return true;\n }\n \n // For objects, check if they have properties (not an empty object)\n if (typeof globalVariable === 'object') {\n // Check for non-empty object with enumerable properties\n const keys = Object.keys(globalVariable);\n // Some libraries might have only non-enumerable properties, \n // so also check for common indicators of initialization\n return keys.length > 0 || \n Object.getOwnPropertyNames(globalVariable).length > 1 || // > 1 to exclude just constructor\n globalVariable.constructor !== Object; // Has a custom constructor\n }\n \n // For other types (string, number, etc.), consider them ready\n return true;\n }\n\n /**\n * Wait for a global variable to be available with progressive delays\n * @param globalName The name of the global variable to wait for\n * @param url The URL of the script (for debugging)\n * @param debug Whether to log debug information\n * @returns The global variable once it's available\n */\n private static async waitForGlobalVariable(\n globalName: string, \n url: string, \n debug: boolean = false\n ): Promise<any> {\n const delays = [0, 100, 200, 300, 400]; // Total: 1000ms max delay\n const maxAttempts = delays.length;\n let totalDelay = 0;\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n // Wait for the specified delay (0ms on first attempt)\n if (attempt > 0) {\n const delay = delays[attempt];\n if (debug) {\n console.log(`⏳ Waiting ${delay}ms for ${globalName} to initialize (attempt ${attempt + 1}/${maxAttempts})...`);\n }\n await new Promise(resolve => {\n resourceManager.setTimeout(\n LIBRARY_LOADER_COMPONENT_ID,\n () => resolve(undefined),\n delay,\n { globalName, attempt }\n );\n });\n totalDelay += delay;\n }\n\n // Check if the global variable exists\n const global = (window as any)[globalName];\n if (global) {\n // Use generic library readiness check\n const isReady = this.isLibraryReady(global);\n\n if (isReady) {\n if (debug) {\n if (totalDelay > 0) {\n console.log(`✅ ${globalName} ready after ${totalDelay}ms delay`);\n } else {\n console.log(`✅ Library '${globalName}' loaded successfully from ${url}`);\n }\n }\n return global;\n } else if (debug && attempt < maxAttempts - 1) {\n console.log(`🔄 ${globalName} exists but not fully initialized, will retry...`);\n }\n }\n }\n\n // Final check after all attempts\n const finalGlobal = (window as any)[globalName];\n if (finalGlobal) {\n console.warn(`⚠️ ${globalName} loaded but may not be fully initialized after ${totalDelay}ms`);\n return finalGlobal;\n }\n\n throw new Error(`${globalName} not found after script load and ${totalDelay}ms delay`);\n }\n\n /**\n * Load CSS from URL\n */\n private static loadCSS(url: string): void {\n if (this.loadedResources.has(url)) {\n return;\n }\n\n const existingLink = document.querySelector(`link[href=\"${url}\"]`);\n if (existingLink) {\n return;\n }\n\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = url;\n document.head.appendChild(link);\n \n // Register the link element for cleanup\n resourceManager.registerDOMElement(LIBRARY_LOADER_COMPONENT_ID, link);\n\n this.loadedResources.set(url, {\n element: link,\n promise: Promise.resolve()\n });\n }\n\n /**\n * Wait for existing script to load\n */\n private static waitForScriptLoad(\n script: HTMLScriptElement,\n globalName: string,\n resolve: (value: any) => void,\n reject: (reason: any) => void\n ): void {\n const checkGlobal = () => {\n const global = (window as any)[globalName];\n if (global) {\n resolve(global);\n } else {\n // Retry after a short delay\n resourceManager.setTimeout(\n LIBRARY_LOADER_COMPONENT_ID,\n () => {\n const delayedGlobal = (window as any)[globalName];\n if (delayedGlobal) {\n resolve(delayedGlobal);\n } else {\n reject(new Error(`${globalName} not found after script load`));\n }\n },\n 100,\n { context: 'waitForScriptLoad', globalName }\n );\n }\n };\n\n // Check if already loaded\n if ((script as any).complete || (script as any).readyState === 'complete') {\n checkGlobal();\n return;\n }\n\n // Wait for load\n const loadHandler = () => {\n checkGlobal();\n };\n resourceManager.addEventListener(\n LIBRARY_LOADER_COMPONENT_ID,\n script,\n 'load',\n loadHandler,\n { once: true }\n );\n }\n\n\n /**\n * Get all loaded resources (for cleanup)\n */\n static getLoadedResources(): Map<string, LoadedResource> {\n return this.loadedResources;\n }\n\n /**\n * Clear loaded resources cache and cleanup DOM elements\n */\n static clearCache(): void {\n // Remove all script and link elements we added\n this.loadedResources.forEach((resource, url) => {\n if (resource.element && resource.element.parentNode) {\n resource.element.parentNode.removeChild(resource.element);\n }\n });\n \n this.loadedResources.clear();\n this.loadedLibraryStates.clear();\n \n // Clean up any resources managed by resource manager\n resourceManager.cleanupComponent(LIBRARY_LOADER_COMPONENT_ID);\n }\n\n /**\n * Load a library with its dependencies\n * @param libraryName - Name of the library to load\n * @param allLibraries - All available libraries for dependency resolution\n * @param requestedBy - Name of the component/library requesting this load\n * @param options - Dependency resolution options\n * @returns Promise resolving to the loaded library global object\n */\n static async loadLibraryWithDependencies(\n libraryName: string,\n allLibraries: MJComponentLibraryEntity[],\n requestedBy: string = 'user',\n options?: DependencyResolutionOptions\n ): Promise<any> {\n const debug = options?.debug || false;\n \n if (debug) {\n console.log(`📚 Loading library '${libraryName}' with dependencies`);\n }\n\n // Check if already loaded\n const existingState = this.loadedLibraryStates.get(libraryName);\n if (existingState) {\n if (debug) {\n console.log(`✅ Library '${libraryName}' already loaded (version: ${existingState.version})`);\n }\n // Track who requested it\n if (!existingState.requestedBy.includes(requestedBy)) {\n existingState.requestedBy.push(requestedBy);\n }\n return (window as any)[existingState.globalVariable];\n }\n\n // Get load order including dependencies\n const loadOrderResult = this.dependencyResolver.getLoadOrder(\n [libraryName],\n allLibraries,\n options\n );\n\n if (!loadOrderResult.success) {\n const errors = loadOrderResult.errors?.join(', ') || 'Unknown error';\n throw new Error(`Failed to resolve dependencies for '${libraryName}': ${errors}`);\n }\n\n if (loadOrderResult.warnings && debug) {\n console.warn(`⚠️ Warnings for '${libraryName}':`, loadOrderResult.warnings);\n }\n\n const loadOrder = loadOrderResult.order || [];\n if (debug) {\n console.log(`📋 Load order for '${libraryName}':`, loadOrder.map(lib => `${lib.Name}@${lib.Version}`));\n }\n\n // Load libraries in order\n for (const library of loadOrder) {\n // Skip if already loaded\n if (this.loadedLibraryStates.has(library.Name)) {\n if (debug) {\n console.log(`⏭️ Skipping '${library.Name}' (already loaded)`);\n }\n continue;\n }\n\n // Check library status\n if (library.Status) {\n if (library.Status === 'Disabled') {\n console.error(`🚫 ERROR: Library '${library.Name}' is DISABLED and should not be used`);\n // Continue loading anyway per requirements\n } else if (library.Status === 'Deprecated') {\n console.warn(`⚠️ WARNING: Library '${library.Name}' is DEPRECATED. Consider using an alternative.`);\n }\n // Active status is fine, no message needed\n }\n\n if (debug) {\n console.log(`📥 Loading '${library.Name}@${library.Version}'`);\n }\n\n // Load the library\n if (!library.CDNUrl || !library.GlobalVariable) {\n throw new Error(`Library '${library.Name}' missing CDN URL or global variable`);\n }\n\n // Load CSS if available\n if (library.CDNCssUrl) {\n const cssUrls = library.CDNCssUrl.split(',').map(url => url.trim());\n for (const cssUrl of cssUrls) {\n if (cssUrl) {\n this.loadCSS(cssUrl);\n }\n }\n }\n\n // Load the script\n const loadedGlobal = await this.loadScript(library.CDNUrl, library.GlobalVariable, debug);\n\n // Track the loaded state\n const dependencies = Array.from(\n this.dependencyResolver.getDirectDependencies(library).keys()\n );\n\n this.loadedLibraryStates.set(library.Name, {\n name: library.Name,\n version: library.Version || 'unknown',\n globalVariable: library.GlobalVariable,\n loadedAt: new Date(),\n requestedBy: library.Name === libraryName ? [requestedBy] : [],\n dependencies\n });\n\n if (debug) {\n console.log(`✅ Loaded '${library.Name}@${library.Version}'`);\n }\n }\n\n // Return the originally requested library's global\n const targetLibrary = loadOrder.find(lib => lib.Name === libraryName);\n if (!targetLibrary || !targetLibrary.GlobalVariable) {\n throw new Error(`Failed to load library '${libraryName}'`);\n }\n\n return (window as any)[targetLibrary.GlobalVariable];\n }\n\n /**\n * Load multiple libraries with dependency resolution\n * @param libraryNames - Names of libraries to load\n * @param allLibraries - All available libraries for dependency resolution\n * @param requestedBy - Name of the component requesting these libraries\n * @param options - Dependency resolution options\n * @returns Map of library names to their loaded global objects\n */\n static async loadLibrariesWithDependencies(\n libraryNames: string[],\n allLibraries: MJComponentLibraryEntity[],\n requestedBy: string = 'user',\n options?: DependencyResolutionOptions\n ): Promise<Map<string, any>> {\n const debug = options?.debug || false;\n const result = new Map<string, any>();\n \n if (debug) {\n console.log(`📚 Loading libraries with dependencies:`, libraryNames);\n console.log(` 📦 Total available libraries: ${allLibraries.length}`);\n }\n\n // Get combined load order for all requested libraries\n const loadOrderResult = this.dependencyResolver.getLoadOrder(\n libraryNames,\n allLibraries,\n options\n );\n\n if (!loadOrderResult.success) {\n const errors = loadOrderResult.errors?.join(', ') || 'Unknown error';\n throw new Error(`Failed to resolve dependencies: ${errors}`);\n }\n\n if (debug) {\n console.log(` 📊 Dependency resolution result:`, {\n success: loadOrderResult.success,\n errors: loadOrderResult.errors || [],\n warnings: loadOrderResult.warnings || []\n });\n \n if (loadOrderResult.order) {\n console.log(` 🔄 Resolved dependencies for each library:`);\n loadOrderResult.order.forEach(lib => {\n const deps = this.dependencyResolver.parseDependencies(lib.Dependencies);\n if (deps.size > 0) {\n console.log(` • ${lib.Name}@${lib.Version} requires:`, Array.from(deps.entries()));\n } else {\n console.log(` • ${lib.Name}@${lib.Version} (no dependencies)`);\n }\n });\n }\n }\n\n if (loadOrderResult.warnings && debug) {\n console.warn(` ⚠️ Warnings:`, loadOrderResult.warnings);\n }\n\n const loadOrder = loadOrderResult.order || [];\n if (debug) {\n console.log(` 📋 Final load order:`, loadOrder.map(lib => `${lib.Name}@${lib.Version}`));\n }\n\n // Load all libraries in order\n for (const library of loadOrder) {\n // Skip if already loaded\n if (this.loadedLibraryStates.has(library.Name)) {\n if (debug) {\n console.log(`⏭️ Skipping '${library.Name}' (already loaded)`);\n }\n const state = this.loadedLibraryStates.get(library.Name)!;\n if (libraryNames.includes(library.Name)) {\n result.set(library.Name, (window as any)[state.globalVariable]);\n }\n continue;\n }\n\n // Check library status\n if (library.Status) {\n if (library.Status === 'Disabled') {\n console.error(`🚫 ERROR: Library '${library.Name}' is DISABLED and should not be used`);\n // Continue loading anyway per requirements\n } else if (library.Status === 'Deprecated') {\n console.warn(`⚠️ WARNING: Library '${library.Name}' is DEPRECATED. Consider using an alternative.`);\n }\n // Active status is fine, no message needed\n }\n\n if (debug) {\n console.log(`📥 Loading '${library.Name}@${library.Version}'`);\n }\n\n // Load the library\n if (!library.CDNUrl || !library.GlobalVariable) {\n throw new Error(`Library '${library.Name}' missing CDN URL or global variable`);\n }\n\n // Load CSS if available\n if (library.CDNCssUrl) {\n const cssUrls = library.CDNCssUrl.split(',').map(url => url.trim());\n for (const cssUrl of cssUrls) {\n if (cssUrl) {\n this.loadCSS(cssUrl);\n }\n }\n }\n\n // Load the script\n const loadedGlobal = await this.loadScript(library.CDNUrl, library.GlobalVariable, debug);\n\n // Track the loaded state\n const dependencies = Array.from(\n this.dependencyResolver.getDirectDependencies(library).keys()\n );\n\n this.loadedLibraryStates.set(library.Name, {\n name: library.Name,\n version: library.Version || 'unknown',\n globalVariable: library.GlobalVariable,\n loadedAt: new Date(),\n requestedBy: libraryNames.includes(library.Name) ? [requestedBy] : [],\n dependencies\n });\n\n // Add to result if it was directly requested\n if (libraryNames.includes(library.Name)) {\n result.set(library.Name, loadedGlobal);\n }\n\n if (debug) {\n console.log(`✅ Loaded '${library.Name}@${library.Version}'`);\n }\n }\n\n return result;\n }\n\n /**\n * Get information about loaded libraries\n * @returns Map of loaded library states\n */\n static getLoadedLibraryStates(): Map<string, LoadedLibraryState> {\n return new Map(this.loadedLibraryStates);\n }\n\n /**\n * Check if a library is loaded\n * @param libraryName - Name of the library\n * @returns True if the library is loaded\n */\n static isLibraryLoaded(libraryName: string): boolean {\n return this.loadedLibraryStates.has(libraryName);\n }\n\n /**\n * Get the version of a loaded library\n * @param libraryName - Name of the library\n * @returns Version string or undefined if not loaded\n */\n static getLoadedLibraryVersion(libraryName: string): string | undefined {\n return this.loadedLibraryStates.get(libraryName)?.version;\n }\n}"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/react-runtime",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.51.0",
|
|
4
4
|
"description": "Platform-agnostic React component runtime for MemberJunction. Provides core compilation, registry, and execution capabilities for React components in any JavaScript environment.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -29,11 +29,11 @@
|
|
|
29
29
|
},
|
|
30
30
|
"homepage": "https://github.com/MemberJunction/MJ#readme",
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@memberjunction/core": "5.
|
|
33
|
-
"@memberjunction/global": "5.
|
|
34
|
-
"@memberjunction/interactive-component-types": "5.
|
|
35
|
-
"@memberjunction/core-entities": "5.
|
|
36
|
-
"@memberjunction/graphql-dataprovider": "5.
|
|
32
|
+
"@memberjunction/core": "5.51.0",
|
|
33
|
+
"@memberjunction/global": "5.51.0",
|
|
34
|
+
"@memberjunction/interactive-component-types": "5.51.0",
|
|
35
|
+
"@memberjunction/core-entities": "5.51.0",
|
|
36
|
+
"@memberjunction/graphql-dataprovider": "5.51.0",
|
|
37
37
|
"@babel/standalone": "^7.29.1",
|
|
38
38
|
"rxjs": "^7.8.2"
|
|
39
39
|
},
|
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Tests for library load-order guarantees in LibraryLoader.
|
|
3
|
+
*
|
|
4
|
+
* The critical invariant: React MUST execute before ReactDOM because ReactDOM's
|
|
5
|
+
* UMD factory captures `window.React` at execution time. If ReactDOM executes
|
|
6
|
+
* first, it gets `undefined` for React and `createRoot` is permanently broken.
|
|
7
|
+
*
|
|
8
|
+
* These tests mock the script-loading layer to:
|
|
9
|
+
* 1. Prove the current (fixed) code always loads React before ReactDOM.
|
|
10
|
+
* 2. Simulate the old parallel-loading race condition and show it can fail.
|
|
11
|
+
* 3. Validate that post-load assertions catch broken ReactDOM objects.
|
|
12
|
+
*/
|
|
13
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
14
|
+
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Window / document stubs (we're in a Node environment)
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
const fakeWindow: Record<string, unknown> = {};
|
|
19
|
+
|
|
20
|
+
vi.stubGlobal('window', fakeWindow);
|
|
21
|
+
vi.stubGlobal('document', {
|
|
22
|
+
createElement: vi.fn().mockReturnValue({
|
|
23
|
+
addEventListener: vi.fn(),
|
|
24
|
+
removeEventListener: vi.fn(),
|
|
25
|
+
parentNode: null,
|
|
26
|
+
}),
|
|
27
|
+
head: {
|
|
28
|
+
appendChild: vi.fn(),
|
|
29
|
+
},
|
|
30
|
+
querySelector: vi.fn().mockReturnValue(null),
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
// Mock dependencies that LibraryLoader imports
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
vi.mock('@memberjunction/core-entities', () => ({
|
|
37
|
+
MJComponentLibraryEntity: class {},
|
|
38
|
+
}));
|
|
39
|
+
|
|
40
|
+
vi.mock('../utilities/resource-manager', () => ({
|
|
41
|
+
resourceManager: {
|
|
42
|
+
setTimeout: vi.fn((_id: string, fn: () => void, _ms: number) => { fn(); return 1; }),
|
|
43
|
+
registerDOMElement: vi.fn(),
|
|
44
|
+
addEventListener: vi.fn(),
|
|
45
|
+
cleanupComponent: vi.fn(),
|
|
46
|
+
},
|
|
47
|
+
}));
|
|
48
|
+
|
|
49
|
+
vi.mock('../utilities/standard-libraries', () => ({
|
|
50
|
+
StandardLibraryManager: {
|
|
51
|
+
setConfiguration: vi.fn(),
|
|
52
|
+
getConfiguration: vi.fn().mockReturnValue({ libraries: [], metadata: {} }),
|
|
53
|
+
getEnabledLibraries: vi.fn().mockReturnValue([]),
|
|
54
|
+
},
|
|
55
|
+
// Re-export the type so the import doesn't break
|
|
56
|
+
}));
|
|
57
|
+
|
|
58
|
+
vi.mock('../utilities/library-registry', () => ({
|
|
59
|
+
LibraryRegistry: class {},
|
|
60
|
+
}));
|
|
61
|
+
|
|
62
|
+
// ---------------------------------------------------------------------------
|
|
63
|
+
// Helpers
|
|
64
|
+
// ---------------------------------------------------------------------------
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Tracks the order in which "scripts" resolve, simulating async CDN downloads.
|
|
68
|
+
* Each call to `createResolver(name)` returns a promise + a `resolve` function
|
|
69
|
+
* the test can call to simulate the script finishing download and execution.
|
|
70
|
+
*/
|
|
71
|
+
function createLoadOrderTracker() {
|
|
72
|
+
const order: string[] = [];
|
|
73
|
+
const resolvers = new Map<string, () => void>();
|
|
74
|
+
|
|
75
|
+
function createResolver(name: string): Promise<Record<string, unknown>> {
|
|
76
|
+
return new Promise<Record<string, unknown>>(resolve => {
|
|
77
|
+
resolvers.set(name, () => {
|
|
78
|
+
order.push(name);
|
|
79
|
+
const fakeGlobal: Record<string, unknown> = { __name: name };
|
|
80
|
+
if (name === 'ReactDOM') {
|
|
81
|
+
// Simulate UMD behavior: createRoot only works if React was loaded first
|
|
82
|
+
if (fakeWindow.React) {
|
|
83
|
+
fakeGlobal.createRoot = function mockCreateRoot() {
|
|
84
|
+
return { unmount: vi.fn() };
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
// If React isn't on window yet, createRoot is missing — the real bug
|
|
88
|
+
}
|
|
89
|
+
fakeWindow[name] = fakeGlobal;
|
|
90
|
+
resolve(fakeGlobal);
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return { order, resolvers, createResolver };
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// ---------------------------------------------------------------------------
|
|
99
|
+
// Import the module under test AFTER mocks are set up
|
|
100
|
+
// ---------------------------------------------------------------------------
|
|
101
|
+
import { LibraryLoader } from '../utilities/library-loader';
|
|
102
|
+
|
|
103
|
+
describe('LibraryLoader — load order guarantees', () => {
|
|
104
|
+
beforeEach(() => {
|
|
105
|
+
// Clean globals between tests
|
|
106
|
+
delete fakeWindow.React;
|
|
107
|
+
delete fakeWindow.ReactDOM;
|
|
108
|
+
delete fakeWindow.Babel;
|
|
109
|
+
delete fakeWindow.PropTypes;
|
|
110
|
+
|
|
111
|
+
// Reset the static loadedResources cache so each test starts clean
|
|
112
|
+
LibraryLoader.getLoadedResources().clear();
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
afterEach(() => {
|
|
116
|
+
vi.restoreAllMocks();
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
// -----------------------------------------------------------------------
|
|
120
|
+
// Test 1: React resolves before ReactDOM in the fixed code
|
|
121
|
+
// -----------------------------------------------------------------------
|
|
122
|
+
it('should load React before ReactDOM (sequential phase 1 → phase 2)', async () => {
|
|
123
|
+
const tracker = createLoadOrderTracker();
|
|
124
|
+
|
|
125
|
+
// Spy on the private static loadScript to intercept calls and control
|
|
126
|
+
// resolution order. We use `spyOn` + `mockImplementation` so we can
|
|
127
|
+
// see WHEN each library's loadScript is first called.
|
|
128
|
+
const callOrder: string[] = [];
|
|
129
|
+
|
|
130
|
+
const loadScriptSpy = vi.spyOn(LibraryLoader as unknown as { loadScript: (...args: unknown[]) => Promise<unknown> }, 'loadScript' as never)
|
|
131
|
+
.mockImplementation((_url: unknown, globalName: unknown) => {
|
|
132
|
+
const name = globalName as string;
|
|
133
|
+
callOrder.push(name);
|
|
134
|
+
const p = tracker.createResolver(name);
|
|
135
|
+
// Simulate immediate resolution (CDN is fast) in call order.
|
|
136
|
+
// The key assertion is about WHEN loadScript is called, not when
|
|
137
|
+
// it resolves — if React's loadScript is awaited before ReactDOM's
|
|
138
|
+
// loadScript is even called, the ordering is guaranteed.
|
|
139
|
+
tracker.resolvers.get(name)!();
|
|
140
|
+
return p;
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
await LibraryLoader.loadLibrariesFromConfig(undefined, false);
|
|
144
|
+
|
|
145
|
+
// React must be the FIRST loadScript call
|
|
146
|
+
expect(callOrder[0]).toBe('React');
|
|
147
|
+
|
|
148
|
+
// ReactDOM must come AFTER React
|
|
149
|
+
const reactIndex = callOrder.indexOf('React');
|
|
150
|
+
const reactDOMIndex = callOrder.indexOf('ReactDOM');
|
|
151
|
+
expect(reactIndex).toBeLessThan(reactDOMIndex);
|
|
152
|
+
|
|
153
|
+
// Execution order (tracker.order) must also have React first
|
|
154
|
+
expect(tracker.order[0]).toBe('React');
|
|
155
|
+
const reactExecIdx = tracker.order.indexOf('React');
|
|
156
|
+
const reactDOMExecIdx = tracker.order.indexOf('ReactDOM');
|
|
157
|
+
expect(reactExecIdx).toBeLessThan(reactDOMExecIdx);
|
|
158
|
+
|
|
159
|
+
loadScriptSpy.mockRestore();
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
// -----------------------------------------------------------------------
|
|
163
|
+
// Test 2: ReactDOM gets a working createRoot when React loads first
|
|
164
|
+
// -----------------------------------------------------------------------
|
|
165
|
+
it('should produce a ReactDOM with createRoot when load order is correct', async () => {
|
|
166
|
+
const tracker = createLoadOrderTracker();
|
|
167
|
+
|
|
168
|
+
vi.spyOn(LibraryLoader as unknown as { loadScript: (...args: unknown[]) => Promise<unknown> }, 'loadScript' as never)
|
|
169
|
+
.mockImplementation((_url: unknown, globalName: unknown) => {
|
|
170
|
+
const name = globalName as string;
|
|
171
|
+
const p = tracker.createResolver(name);
|
|
172
|
+
// Resolve immediately — React first because of sequential await
|
|
173
|
+
tracker.resolvers.get(name)!();
|
|
174
|
+
return p;
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
const result = await LibraryLoader.loadLibrariesFromConfig(undefined, false);
|
|
178
|
+
|
|
179
|
+
// ReactDOM should have createRoot because React was available when it "executed"
|
|
180
|
+
expect(result.ReactDOM).toBeDefined();
|
|
181
|
+
expect((result.ReactDOM as Record<string, unknown>).createRoot).toBeDefined();
|
|
182
|
+
expect(typeof (result.ReactDOM as Record<string, unknown>).createRoot).toBe('function');
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
// -----------------------------------------------------------------------
|
|
186
|
+
// Test 3: Simulating the OLD race condition — ReactDOM executes first
|
|
187
|
+
// -----------------------------------------------------------------------
|
|
188
|
+
it('should demonstrate that ReactDOM lacks createRoot when it executes before React', async () => {
|
|
189
|
+
// This test does NOT use loadLibrariesFromConfig — it directly simulates
|
|
190
|
+
// the broken parallel behavior to prove the race condition is real.
|
|
191
|
+
const tracker = createLoadOrderTracker();
|
|
192
|
+
|
|
193
|
+
// Create promises for both
|
|
194
|
+
const reactPromise = tracker.createResolver('React');
|
|
195
|
+
const reactDOMPromise = tracker.createResolver('ReactDOM');
|
|
196
|
+
|
|
197
|
+
// Simulate the race: resolve ReactDOM FIRST (before React)
|
|
198
|
+
tracker.resolvers.get('ReactDOM')!();
|
|
199
|
+
tracker.resolvers.get('React')!();
|
|
200
|
+
|
|
201
|
+
const [, reactDOM] = await Promise.all([reactPromise, reactDOMPromise]);
|
|
202
|
+
|
|
203
|
+
// ReactDOM executed before React, so createRoot should be MISSING
|
|
204
|
+
expect((reactDOM as Record<string, unknown>).createRoot).toBeUndefined();
|
|
205
|
+
|
|
206
|
+
// Execution order confirms ReactDOM came first
|
|
207
|
+
expect(tracker.order[0]).toBe('ReactDOM');
|
|
208
|
+
expect(tracker.order[1]).toBe('React');
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
// -----------------------------------------------------------------------
|
|
212
|
+
// Test 4: Simulating correct order — ReactDOM executes after React
|
|
213
|
+
// -----------------------------------------------------------------------
|
|
214
|
+
it('should demonstrate that ReactDOM has createRoot when it executes after React', async () => {
|
|
215
|
+
const tracker = createLoadOrderTracker();
|
|
216
|
+
|
|
217
|
+
const reactPromise = tracker.createResolver('React');
|
|
218
|
+
const reactDOMPromise = tracker.createResolver('ReactDOM');
|
|
219
|
+
|
|
220
|
+
// Correct order: React first, then ReactDOM
|
|
221
|
+
tracker.resolvers.get('React')!();
|
|
222
|
+
tracker.resolvers.get('ReactDOM')!();
|
|
223
|
+
|
|
224
|
+
const [, reactDOM] = await Promise.all([reactPromise, reactDOMPromise]);
|
|
225
|
+
|
|
226
|
+
// ReactDOM executed after React, so createRoot should be present
|
|
227
|
+
expect((reactDOM as Record<string, unknown>).createRoot).toBeDefined();
|
|
228
|
+
expect(typeof (reactDOM as Record<string, unknown>).createRoot).toBe('function');
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
// -----------------------------------------------------------------------
|
|
232
|
+
// Test 5: ReactDOM and Babel load in parallel (phase 2), both after React
|
|
233
|
+
// -----------------------------------------------------------------------
|
|
234
|
+
it('should load ReactDOM and Babel in parallel after React completes', async () => {
|
|
235
|
+
const callTimestamps: { name: string; time: number }[] = [];
|
|
236
|
+
const startTime = Date.now();
|
|
237
|
+
|
|
238
|
+
vi.spyOn(LibraryLoader as unknown as { loadScript: (...args: unknown[]) => Promise<unknown> }, 'loadScript' as never)
|
|
239
|
+
.mockImplementation((_url: unknown, globalName: unknown) => {
|
|
240
|
+
const name = globalName as string;
|
|
241
|
+
callTimestamps.push({ name, time: Date.now() - startTime });
|
|
242
|
+
|
|
243
|
+
// Simulate globals
|
|
244
|
+
const fakeGlobal: Record<string, unknown> = { __name: name };
|
|
245
|
+
if (name === 'ReactDOM') {
|
|
246
|
+
fakeGlobal.createRoot = vi.fn();
|
|
247
|
+
}
|
|
248
|
+
fakeWindow[name] = fakeGlobal;
|
|
249
|
+
return Promise.resolve(fakeGlobal);
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
await LibraryLoader.loadLibrariesFromConfig(undefined, false);
|
|
253
|
+
|
|
254
|
+
// React is called first
|
|
255
|
+
expect(callTimestamps[0].name).toBe('React');
|
|
256
|
+
|
|
257
|
+
// ReactDOM and Babel are both called after React, and they can be in either order
|
|
258
|
+
const phase2Names = callTimestamps.slice(1).map(t => t.name);
|
|
259
|
+
expect(phase2Names).toContain('ReactDOM');
|
|
260
|
+
expect(phase2Names).toContain('Babel');
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
// -----------------------------------------------------------------------
|
|
264
|
+
// Test 6: Post-load validation catches missing createRoot
|
|
265
|
+
// -----------------------------------------------------------------------
|
|
266
|
+
it('should detect when ReactDOM.createRoot is missing (validation check)', () => {
|
|
267
|
+
// Simulate a broken ReactDOM object (loaded before React)
|
|
268
|
+
const brokenReactDOM = { __name: 'ReactDOM' }; // no createRoot
|
|
269
|
+
|
|
270
|
+
// The validation check used by ReactBridgeService
|
|
271
|
+
const hasCreateRoot = brokenReactDOM != null &&
|
|
272
|
+
'createRoot' in brokenReactDOM &&
|
|
273
|
+
typeof (brokenReactDOM as Record<string, unknown>).createRoot === 'function';
|
|
274
|
+
|
|
275
|
+
expect(hasCreateRoot).toBe(false);
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
it('should detect when ReactDOM.createRoot is present (validation check)', () => {
|
|
279
|
+
// Simulate a working ReactDOM object (loaded after React)
|
|
280
|
+
const workingReactDOM = {
|
|
281
|
+
__name: 'ReactDOM',
|
|
282
|
+
createRoot: function mockCreateRoot() { return { unmount: vi.fn() }; }
|
|
283
|
+
};
|
|
284
|
+
|
|
285
|
+
const hasCreateRoot = workingReactDOM != null &&
|
|
286
|
+
'createRoot' in workingReactDOM &&
|
|
287
|
+
typeof (workingReactDOM as Record<string, unknown>).createRoot === 'function';
|
|
288
|
+
|
|
289
|
+
expect(hasCreateRoot).toBe(true);
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
// -----------------------------------------------------------------------
|
|
293
|
+
// Test 7: Retry after destroy resets adapter properly
|
|
294
|
+
// -----------------------------------------------------------------------
|
|
295
|
+
it('should demonstrate that clearing initializationPromise allows re-initialization', async () => {
|
|
296
|
+
// Simulates the AngularAdapterService pattern
|
|
297
|
+
let initCount = 0;
|
|
298
|
+
let initPromise: Promise<void> | undefined;
|
|
299
|
+
let runtime: { version: string } | undefined;
|
|
300
|
+
|
|
301
|
+
async function doInit(): Promise<void> {
|
|
302
|
+
initCount++;
|
|
303
|
+
runtime = { version: `v${initCount}` };
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
async function initialize(): Promise<void> {
|
|
307
|
+
if (runtime) return;
|
|
308
|
+
if (initPromise) return initPromise;
|
|
309
|
+
initPromise = doInit();
|
|
310
|
+
await initPromise;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
function destroy(): void {
|
|
314
|
+
runtime = undefined;
|
|
315
|
+
initPromise = undefined; // THE FIX — without this, re-init doesn't run
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
// First init
|
|
319
|
+
await initialize();
|
|
320
|
+
expect(initCount).toBe(1);
|
|
321
|
+
expect(runtime?.version).toBe('v1');
|
|
322
|
+
|
|
323
|
+
// Destroy
|
|
324
|
+
destroy();
|
|
325
|
+
expect(runtime).toBeUndefined();
|
|
326
|
+
|
|
327
|
+
// Re-init should actually run doInit again
|
|
328
|
+
await initialize();
|
|
329
|
+
expect(initCount).toBe(2);
|
|
330
|
+
expect(runtime?.version).toBe('v2');
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
it('should demonstrate the BUG when initializationPromise is NOT cleared', async () => {
|
|
334
|
+
let initCount = 0;
|
|
335
|
+
let initPromise: Promise<void> | undefined;
|
|
336
|
+
let runtime: { version: string } | undefined;
|
|
337
|
+
|
|
338
|
+
async function doInit(): Promise<void> {
|
|
339
|
+
initCount++;
|
|
340
|
+
runtime = { version: `v${initCount}` };
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
async function initialize(): Promise<void> {
|
|
344
|
+
if (runtime) return;
|
|
345
|
+
if (initPromise) return initPromise; // BUG: returns stale resolved promise
|
|
346
|
+
initPromise = doInit();
|
|
347
|
+
await initPromise;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
function destroyBuggy(): void {
|
|
351
|
+
runtime = undefined;
|
|
352
|
+
// BUG: initPromise is NOT cleared
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
// First init
|
|
356
|
+
await initialize();
|
|
357
|
+
expect(initCount).toBe(1);
|
|
358
|
+
|
|
359
|
+
// Destroy (buggy version)
|
|
360
|
+
destroyBuggy();
|
|
361
|
+
|
|
362
|
+
// Re-init — this silently does nothing because initPromise is still set
|
|
363
|
+
await initialize();
|
|
364
|
+
expect(initCount).toBe(1); // Still 1! doInit never ran again
|
|
365
|
+
expect(runtime).toBeUndefined(); // runtime is still undefined — broken state
|
|
366
|
+
});
|
|
367
|
+
});
|
|
@@ -133,16 +133,39 @@ export class LibraryLoader {
|
|
|
133
133
|
* Load libraries based on the current configuration
|
|
134
134
|
*/
|
|
135
135
|
static async loadLibrariesFromConfig(options?: ConfigLoadOptions, debug?: boolean): Promise<LibraryLoadResult> {
|
|
136
|
-
//
|
|
136
|
+
// Load core runtime libraries in dependency order.
|
|
137
|
+
// ReactDOM's UMD factory captures `window.React` at execution time,
|
|
138
|
+
// so React MUST execute before ReactDOM. Loading them in parallel with
|
|
139
|
+
// async scripts causes an intermittent race condition where ReactDOM
|
|
140
|
+
// executes first and gets `undefined` for React, permanently breaking
|
|
141
|
+
// `createRoot` on that object instance.
|
|
137
142
|
const coreLibraries = getCoreRuntimeLibraries(debug);
|
|
138
|
-
const
|
|
139
|
-
|
|
140
|
-
);
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
143
|
+
const reactLib = coreLibraries.find(lib => lib.globalVariable === 'React');
|
|
144
|
+
const reactDOMLib = coreLibraries.find(lib => lib.globalVariable === 'ReactDOM');
|
|
145
|
+
const babelLib = coreLibraries.find(lib => lib.globalVariable === 'Babel');
|
|
146
|
+
|
|
147
|
+
// Phase 1: React must load first (ReactDOM depends on it)
|
|
148
|
+
let React: unknown;
|
|
149
|
+
if (reactLib) {
|
|
150
|
+
React = await this.loadScript(reactLib.cdnUrl, reactLib.globalVariable, debug, reactLib.fallbackCdnUrls);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Phase 2: ReactDOM and Babel can load in parallel (both only depend on React)
|
|
154
|
+
const phase2Promises: Promise<unknown>[] = [];
|
|
155
|
+
const phase2Labels: string[] = [];
|
|
156
|
+
|
|
157
|
+
if (reactDOMLib) {
|
|
158
|
+
phase2Promises.push(this.loadScript(reactDOMLib.cdnUrl, reactDOMLib.globalVariable, debug, reactDOMLib.fallbackCdnUrls));
|
|
159
|
+
phase2Labels.push('ReactDOM');
|
|
160
|
+
}
|
|
161
|
+
if (babelLib) {
|
|
162
|
+
phase2Promises.push(this.loadScript(babelLib.cdnUrl, babelLib.globalVariable, debug, babelLib.fallbackCdnUrls));
|
|
163
|
+
phase2Labels.push('Babel');
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
const phase2Results = await Promise.all(phase2Promises);
|
|
167
|
+
const ReactDOM = phase2Labels.indexOf('ReactDOM') >= 0 ? phase2Results[phase2Labels.indexOf('ReactDOM')] : undefined;
|
|
168
|
+
const Babel = phase2Labels.indexOf('Babel') >= 0 ? phase2Results[phase2Labels.indexOf('Babel')] : undefined;
|
|
146
169
|
|
|
147
170
|
// Expose React and ReactDOM as globals for UMD libraries that expect them
|
|
148
171
|
// Many React component libraries (Recharts, Victory, etc.) expect these as globals
|