@memberjunction/react-runtime 6.2.0-edge.6 → 6.2.0-edge.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +14 -14
- package/CHANGELOG.md +61 -0
- package/dist/compiler/component-compiler.d.ts.map +1 -1
- package/dist/compiler/component-compiler.js +11 -3
- package/dist/compiler/component-compiler.js.map +1 -1
- package/dist/runtime.umd.js +160 -149
- package/dist/utilities/library-loader.d.ts +2 -0
- package/dist/utilities/library-loader.d.ts.map +1 -1
- package/dist/utilities/library-loader.js +51 -9
- package/dist/utilities/library-loader.js.map +1 -1
- package/dist/utilities/runtime-utilities.d.ts.map +1 -1
- package/dist/utilities/runtime-utilities.js +2 -1
- package/dist/utilities/runtime-utilities.js.map +1 -1
- package/package.json +7 -7
- package/src/__tests__/subresource-url-selector-security.test.ts +121 -0
- package/src/compiler/component-compiler.ts +22 -5
- package/src/utilities/library-loader.ts +71 -10
- package/src/utilities/runtime-utilities.ts +2 -1
|
@@ -2,6 +2,8 @@ import { StandardLibraries } from './standard-libraries.js';
|
|
|
2
2
|
import { LibraryConfiguration, ExternalLibraryConfig, LibraryLoadOptions as ConfigLoadOptions } from '../types/library-config.js';
|
|
3
3
|
import { MJComponentLibraryEntity } from '@memberjunction/core-entities';
|
|
4
4
|
import { LoadedLibraryState, DependencyResolutionOptions } from '../types/dependency-types.js';
|
|
5
|
+
export declare function IsAllowedSubresourceUrl(url: string | null | undefined): boolean;
|
|
6
|
+
export declare function FindDomSubresourceByUrl(tagName: 'script' | 'link', attrName: 'src' | 'href', url: string): HTMLScriptElement | HTMLLinkElement | null;
|
|
5
7
|
interface LoadedResource {
|
|
6
8
|
element: HTMLScriptElement | HTMLLinkElement;
|
|
7
9
|
promise: Promise<any>;
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"library-loader.d.ts","sourceRoot":"","sources":["../../src/utilities/library-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,38 @@ import { GetCoreRuntimeLibraries, IsCoreRuntimeLibrary } from './core-libraries.
|
|
|
3
3
|
import { resourceManager } from './resource-manager.js';
|
|
4
4
|
import { LibraryDependencyResolver } from './library-dependency-resolver.js';
|
|
5
5
|
const LIBRARY_LOADER_COMPONENT_ID = 'mj-react-runtime-library-loader-singleton';
|
|
6
|
+
export function IsAllowedSubresourceUrl(url) {
|
|
7
|
+
if (typeof url !== 'string') {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
const trimmed = url.trim();
|
|
11
|
+
if (!trimmed || trimmed.startsWith('//')) {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
try {
|
|
15
|
+
const baseOrigin = typeof window !== 'undefined' && window.location?.origin
|
|
16
|
+
? window.location.origin
|
|
17
|
+
: 'https://localhost';
|
|
18
|
+
const parsed = new URL(trimmed, baseOrigin);
|
|
19
|
+
return parsed.protocol === 'http:' || parsed.protocol === 'https:';
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export function FindDomSubresourceByUrl(tagName, attrName, url) {
|
|
26
|
+
if (typeof document === 'undefined' || typeof document.getElementsByTagName !== 'function') {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
const collection = document.getElementsByTagName(tagName);
|
|
30
|
+
for (let i = 0; i < collection.length; i++) {
|
|
31
|
+
const el = collection[i];
|
|
32
|
+
if (typeof el.getAttribute === 'function' && el.getAttribute(attrName) === url) {
|
|
33
|
+
return el;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
6
38
|
export class LibraryLoader {
|
|
7
39
|
static { this.loadedResources = new Map(); }
|
|
8
40
|
static { this.loadedLibraryStates = new Map(); }
|
|
@@ -13,8 +45,9 @@ export class LibraryLoader {
|
|
|
13
45
|
return;
|
|
14
46
|
const coreLibraries = GetCoreRuntimeLibraries(debug);
|
|
15
47
|
for (const lib of coreLibraries) {
|
|
16
|
-
if (
|
|
17
|
-
|
|
48
|
+
if (!IsAllowedSubresourceUrl(lib.cdnUrl) ||
|
|
49
|
+
FindDomSubresourceByUrl('link', 'href', lib.cdnUrl) ||
|
|
50
|
+
FindDomSubresourceByUrl('script', 'src', lib.cdnUrl)) {
|
|
18
51
|
continue;
|
|
19
52
|
}
|
|
20
53
|
const link = document.createElement('link');
|
|
@@ -189,18 +222,24 @@ export class LibraryLoader {
|
|
|
189
222
|
if (existing) {
|
|
190
223
|
return existing.promise;
|
|
191
224
|
}
|
|
225
|
+
let createdScript = null;
|
|
192
226
|
const promise = new Promise((resolve, reject) => {
|
|
227
|
+
if (!IsAllowedSubresourceUrl(url)) {
|
|
228
|
+
reject(new Error(`Refused to load script from non-http(s) URL: ${url}`));
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
193
231
|
const existingGlobal = window[globalName];
|
|
194
232
|
if (existingGlobal) {
|
|
195
233
|
resolve(existingGlobal);
|
|
196
234
|
return;
|
|
197
235
|
}
|
|
198
|
-
const existingScript =
|
|
236
|
+
const existingScript = FindDomSubresourceByUrl('script', 'src', url);
|
|
199
237
|
if (existingScript) {
|
|
200
238
|
this.waitForScriptLoad(existingScript, globalName, resolve, reject);
|
|
201
239
|
return;
|
|
202
240
|
}
|
|
203
241
|
const script = document.createElement('script');
|
|
242
|
+
createdScript = script;
|
|
204
243
|
script.src = url;
|
|
205
244
|
script.async = true;
|
|
206
245
|
const cleanup = () => {
|
|
@@ -254,10 +293,13 @@ export class LibraryLoader {
|
|
|
254
293
|
document.head.appendChild(script);
|
|
255
294
|
resourceManager.registerDOMElement(LIBRARY_LOADER_COMPONENT_ID, script);
|
|
256
295
|
});
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
296
|
+
const trackedElement = createdScript ?? FindDomSubresourceByUrl('script', 'src', url);
|
|
297
|
+
if (trackedElement) {
|
|
298
|
+
this.loadedResources.set(url, {
|
|
299
|
+
element: trackedElement,
|
|
300
|
+
promise
|
|
301
|
+
});
|
|
302
|
+
}
|
|
261
303
|
return promise;
|
|
262
304
|
}
|
|
263
305
|
static isLibraryReady(globalVariable) {
|
|
@@ -317,10 +359,10 @@ export class LibraryLoader {
|
|
|
317
359
|
throw new Error(`${globalName} not found after script load and ${totalDelay}ms delay`);
|
|
318
360
|
}
|
|
319
361
|
static loadCSS(url) {
|
|
320
|
-
if (this.loadedResources.has(url)) {
|
|
362
|
+
if (!IsAllowedSubresourceUrl(url) || this.loadedResources.has(url)) {
|
|
321
363
|
return;
|
|
322
364
|
}
|
|
323
|
-
const existingLink =
|
|
365
|
+
const existingLink = FindDomSubresourceByUrl('link', 'href', url);
|
|
324
366
|
if (existingLink) {
|
|
325
367
|
return;
|
|
326
368
|
}
|
|
@@ -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; // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply\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 /** @deprecated Use {@link PreloadCoreScripts}. */\n static preloadCoreScripts(debug: boolean = false): void {\n return this.PreloadCoreScripts(debug);\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 /** @deprecated Use {@link LoadAllLibraries}. */\n static async loadAllLibraries(\n config?: LibraryConfiguration, \n additionalLibraries?: ExternalLibraryConfig[],\n options?: { debug?: boolean }\n ): Promise<LibraryLoadResult> {\n return this.LoadAllLibraries(config, additionalLibraries, options);\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 /** @deprecated Use {@link LoadLibrariesFromConfig}. */\n static async loadLibrariesFromConfig(options?: ConfigLoadOptions, debug?: boolean): Promise<LibraryLoadResult> {\n return this.LoadLibrariesFromConfig(options, debug);\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 /** @deprecated Use {@link GetLoadedResources}. */\n static getLoadedResources(): Map<string, LoadedResource> {\n return this.GetLoadedResources();\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 /** @deprecated Use {@link ClearCache}. */\n static clearCache(): void {\n return this.ClearCache();\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 /** @deprecated Use {@link LoadLibraryWithDependencies}. */\n static async loadLibraryWithDependencies(\n libraryName: string,\n allLibraries: MJComponentLibraryEntity[],\n requestedBy: string = 'user',\n options?: DependencyResolutionOptions\n ): Promise<any> {\n return this.LoadLibraryWithDependencies(libraryName, allLibraries, requestedBy, options);\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 /** @deprecated Use {@link LoadLibrariesWithDependencies}. */\n static async loadLibrariesWithDependencies(\n libraryNames: string[],\n allLibraries: MJComponentLibraryEntity[],\n requestedBy: string = 'user',\n options?: DependencyResolutionOptions\n ): Promise<Map<string, any>> {\n return this.LoadLibrariesWithDependencies(libraryNames, allLibraries, requestedBy, options);\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 /** @deprecated Use {@link GetLoadedLibraryStates}. */\n static getLoadedLibraryStates(): Map<string, LoadedLibraryState> {\n return this.GetLoadedLibraryStates();\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 /** @deprecated Use {@link IsLibraryLoaded}. */\n static isLibraryLoaded(libraryName: string): boolean {\n return this.IsLibraryLoaded(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\n /** @deprecated Use {@link GetLoadedLibraryVersion}. */\n static getLoadedLibraryVersion(libraryName: string): string | undefined {\n return this.GetLoadedLibraryVersion(libraryName);\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 * Validates that a script or stylesheet subresource URL resolves to `http:` or `https:` and is not\n * a scheme-relative (`//...`) reference. Prevents dangerous schemes (`javascript:`, `data:`,\n * `blob:`, `vbscript:`) from reaching `<script src>` or `<link href>` DOM sinks.\n */\nexport function IsAllowedSubresourceUrl(url: string | null | undefined): boolean {\n if (typeof url !== 'string') {\n return false;\n }\n const trimmed = url.trim();\n if (!trimmed || trimmed.startsWith('//')) {\n return false;\n }\n try {\n const baseOrigin =\n typeof window !== 'undefined' && window.location?.origin\n ? window.location.origin\n : 'https://localhost';\n const parsed = new URL(trimmed, baseOrigin);\n return parsed.protocol === 'http:' || parsed.protocol === 'https:';\n } catch {\n return false;\n }\n}\n\n/**\n * Finds an existing `<script>` or `<link>` element by exact attribute comparison rather than\n * interpolating an untrusted URL into `document.querySelector('tag[attr=\"...\"]')`, where quotes or\n * brackets in a URL can break or redirect CSS selector matching.\n */\nexport function FindDomSubresourceByUrl(\n tagName: 'script' | 'link',\n attrName: 'src' | 'href',\n url: string,\n): HTMLScriptElement | HTMLLinkElement | null {\n if (typeof document === 'undefined' || typeof document.getElementsByTagName !== 'function') {\n return null;\n }\n const collection = document.getElementsByTagName(tagName);\n for (let i = 0; i < collection.length; i++) {\n const el = collection[i];\n if (typeof el.getAttribute === 'function' && el.getAttribute(attrName) === url) {\n return el;\n }\n }\n return null;\n}\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; // case-violation-ok-legacy-back-compat: object literals are assigned to this class, so an accessor stub changes what they must supply\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 (\n !IsAllowedSubresourceUrl(lib.cdnUrl) ||\n FindDomSubresourceByUrl('link', 'href', lib.cdnUrl) ||\n FindDomSubresourceByUrl('script', 'src', lib.cdnUrl)\n ) {\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 /** @deprecated Use {@link PreloadCoreScripts}. */\n static preloadCoreScripts(debug: boolean = false): void {\n return this.PreloadCoreScripts(debug);\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 /** @deprecated Use {@link LoadAllLibraries}. */\n static async loadAllLibraries(\n config?: LibraryConfiguration, \n additionalLibraries?: ExternalLibraryConfig[],\n options?: { debug?: boolean }\n ): Promise<LibraryLoadResult> {\n return this.LoadAllLibraries(config, additionalLibraries, options);\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 /** @deprecated Use {@link LoadLibrariesFromConfig}. */\n static async loadLibrariesFromConfig(options?: ConfigLoadOptions, debug?: boolean): Promise<LibraryLoadResult> {\n return this.LoadLibrariesFromConfig(options, debug);\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 let createdScript: HTMLScriptElement | null = null;\n const promise = new Promise((resolve, reject) => {\n if (!IsAllowedSubresourceUrl(url)) {\n reject(new Error(`Refused to load script from non-http(s) URL: ${url}`));\n return;\n }\n\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 via direct attribute comparison (no CSS selector interpolation)\n const existingScript = FindDomSubresourceByUrl('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 createdScript = 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 const trackedElement = createdScript ?? FindDomSubresourceByUrl('script', 'src', url);\n if (trackedElement) {\n this.loadedResources.set(url, {\n element: trackedElement,\n promise\n });\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 (!IsAllowedSubresourceUrl(url) || this.loadedResources.has(url)) {\n return;\n }\n\n const existingLink = FindDomSubresourceByUrl('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 /** @deprecated Use {@link GetLoadedResources}. */\n static getLoadedResources(): Map<string, LoadedResource> {\n return this.GetLoadedResources();\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 /** @deprecated Use {@link ClearCache}. */\n static clearCache(): void {\n return this.ClearCache();\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 /** @deprecated Use {@link LoadLibraryWithDependencies}. */\n static async loadLibraryWithDependencies(\n libraryName: string,\n allLibraries: MJComponentLibraryEntity[],\n requestedBy: string = 'user',\n options?: DependencyResolutionOptions\n ): Promise<any> {\n return this.LoadLibraryWithDependencies(libraryName, allLibraries, requestedBy, options);\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 /** @deprecated Use {@link LoadLibrariesWithDependencies}. */\n static async loadLibrariesWithDependencies(\n libraryNames: string[],\n allLibraries: MJComponentLibraryEntity[],\n requestedBy: string = 'user',\n options?: DependencyResolutionOptions\n ): Promise<Map<string, any>> {\n return this.LoadLibrariesWithDependencies(libraryNames, allLibraries, requestedBy, options);\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 /** @deprecated Use {@link GetLoadedLibraryStates}. */\n static getLoadedLibraryStates(): Map<string, LoadedLibraryState> {\n return this.GetLoadedLibraryStates();\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 /** @deprecated Use {@link IsLibraryLoaded}. */\n static isLibraryLoaded(libraryName: string): boolean {\n return this.IsLibraryLoaded(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\n /** @deprecated Use {@link GetLoadedLibraryVersion}. */\n static getLoadedLibraryVersion(libraryName: string): string | undefined {\n return this.GetLoadedLibraryVersion(libraryName);\n }\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-utilities.d.ts","sourceRoot":"","sources":["../../src/utilities/runtime-utilities.ts"],"names":[],"mappings":"AA+BA,OAAO,EASL,iBAAiB,EAGlB,MAAM,sBAAsB,CAAC;AAI9B,OAAO,EACL,kBAAkB,EAcnB,MAAM,6CAA6C,CAAC;AAcrD,qBACa,gBAAgB;IAC3B,OAAO,CAAC,KAAK,CAAkB;IAM/B,OAAO,CAAC,QAAQ,CAAqB;IAU9B,cAAc,CAAC,KAAK,GAAE,OAAe,EAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,kBAAkB;IAOxF,cAAc,CAAC,KAAK,GAAE,OAAe,EAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,kBAAkB;IAO/F,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,mBAAmB;
|
|
1
|
+
{"version":3,"file":"runtime-utilities.d.ts","sourceRoot":"","sources":["../../src/utilities/runtime-utilities.ts"],"names":[],"mappings":"AA+BA,OAAO,EASL,iBAAiB,EAGlB,MAAM,sBAAsB,CAAC;AAI9B,OAAO,EACL,kBAAkB,EAcnB,MAAM,6CAA6C,CAAC;AAcrD,qBACa,gBAAgB;IAC3B,OAAO,CAAC,KAAK,CAAkB;IAM/B,OAAO,CAAC,QAAQ,CAAqB;IAU9B,cAAc,CAAC,KAAK,GAAE,OAAe,EAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,kBAAkB;IAOxF,cAAc,CAAC,KAAK,GAAE,OAAe,EAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,kBAAkB;IAO/F,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,mBAAmB;IAqF3B,OAAO,CAAC,mBAAmB;YAwBb,YAAY;IA4B1B,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,cAAc;YAkBR,cAAc;IAwC5B,OAAO,CAAC,mBAAmB;IAgB3B,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,oBAAoB;IAS5B,OAAO,CAAC,yBAAyB;IAoBjC,OAAO,CAAC,oBAAoB;IAyB5B,OAAO,CAAC,mBAAmB;CA0C5B;AAOD,wBAAgB,sBAAsB,IAAI,gBAAgB,CAgBzD;AAGD,wBAAgB,sBAAsB,IAAI,gBAAgB,CAEzD"}
|
|
@@ -75,7 +75,8 @@ let RuntimeUtilities = class RuntimeUtilities {
|
|
|
75
75
|
try {
|
|
76
76
|
const result = await graphQLProvider.AI.EmbedText({
|
|
77
77
|
textToEmbed: params.textToEmbed,
|
|
78
|
-
modelSize: params.modelSize
|
|
78
|
+
modelSize: params.modelSize,
|
|
79
|
+
inputType: params.inputType
|
|
79
80
|
});
|
|
80
81
|
if (result.error) {
|
|
81
82
|
throw new Error(result.error || 'Failed to generate embeddings');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-utilities.js","sourceRoot":"","sources":["../../src/utilities/runtime-utilities.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview The `utilities` prop every interactive component receives — `md`, `rv`, `rq`, `ai`,\n * `geoDataEngine`, `ml` — built over MemberJunction core.\n * @module @memberjunction/react-runtime/utilities\n *\n * ## Why this is not in the Angular package\n *\n * It was, for its whole life, and it imports nothing from `@angular/*`: 450 lines of pure\n * TypeScript over `@memberjunction/core`, `core-entities` and `graphql-dataprovider`. That made it\n * unreachable from any non-Angular host, and `utilities` is not an Angular concept — it is the\n * data surface the component contract promises. A React Native host either reimplemented it or\n * passed `{}` and shipped components that could not read a row.\n *\n * It lives here, beside the compiler and prop-builder that the same components go through, so every\n * host builds the same `utilities` object from the same code. A second implementation would drift\n * the moment either side added a capability — and the components asking for `utilities.rv.RunView`\n * are authored once, for both.\n *\n * ## Overriding\n *\n * `createRuntimeUtilities` resolves through `MJGlobal.ClassFactory`, so a host that registers a\n * higher-priority subclass of {@link RuntimeUtilities} gets it — on every host, browser included.\n *\n * It did not always. The factory used to consult `ClassFactory` only when\n * `typeof window === 'undefined'`, which made the `@RegisterClass` registration below inert on\n * every browser and React Native host: the base class still worked, but nobody could substitute\n * one. Removing the guard changes nothing for an app that registers no subclass — with a null key\n * `CreateInstance` matches the base's own registration and constructs the same class the fallback\n * would have — and makes the documented extension point real for the ones that do.\n */\n\nimport {\n Metadata,\n RunView,\n RunQuery,\n RunViewParams,\n RunQueryParams,\n LogError,\n BaseEntity,\n IEntityDataProvider,\n IMetadataProvider,\n IRunQueryProvider,\n UserInfo\n} from '@memberjunction/core';\n\nimport { MJGlobal, RegisterClass } from '@memberjunction/global';\nimport { GeoDataEngine } from '@memberjunction/core-entities';\nimport {\n ComponentUtilities,\n SimpleAITools,\n SimpleGeoDataEngine,\n SimpleMetadata,\n SimpleMLTools,\n SimpleMLModelInfo,\n SimpleMLListModelsFilter,\n SimpleMLScoreResult,\n SimpleRunQuery,\n SimpleRunView,\n SimpleExecutePromptParams,\n SimpleExecutePromptResult,\n SimpleEmbedTextParams,\n SimpleEmbedTextResult\n} from '@memberjunction/interactive-component-types';\nimport { GraphQLDataProvider } from '@memberjunction/graphql-dataprovider';\nimport { SimpleVectorService } from '@memberjunction/ai-vectors-memory';\nimport {\n MJMLModelEntity,\n PredictiveStudioScoreRecordSetOperation,\n PredictiveStudioScoreRecordSetInput\n} from '@memberjunction/core-entities';\n\n/**\n * Base class for providing runtime utilities to React components in Angular.\n * This class can be extended and registered with MJ's ClassFactory\n * to provide custom implementations of data access methods.\n */\n@RegisterClass(RuntimeUtilities, 'RuntimeUtilities')\nexport class RuntimeUtilities {\n private debug: boolean = false;\n /**\n * The provider every read in the built utilities goes through. Always set by\n * {@link buildUtilities} before use — falls back to the global provider there\n * (`provider ?? Metadata.Provider`) when the host doesn't supply one.\n */\n private provider!: IMetadataProvider;\n\n /**\n * Builds the complete utilities object for React components\n * This is the main method that components will use\n *\n * @param provider the host's provider. A React component mounted under a non-default provider\n * passes its own `ProviderToUse`; omitting it falls back to the global default, named\n * explicitly rather than reached for via `new Metadata()`.\n */\n public BuildUtilities(debug: boolean = false, provider?: IMetadataProvider): ComponentUtilities {\n this.debug = debug;\n this.provider = provider ?? Metadata.Provider;\n return this.setupUtilities(this.provider);\n }\n\n /** @deprecated Use {@link BuildUtilities}. */\n public buildUtilities(debug: boolean = false, provider?: IMetadataProvider): ComponentUtilities {\n return this.BuildUtilities(debug, provider);\n }\n\n /**\n * Sets up the utilities object - copied from skip-chat implementation\n */\n private setupUtilities(md: IMetadataProvider): ComponentUtilities {\n const rv = RunView.FromMetadataProvider(md);\n const rq = new RunQuery(md as unknown as IRunQueryProvider);\n const u: ComponentUtilities = {\n md: this.createSimpleMetadata(md),\n rv: this.createSimpleRunView(rv),\n rq: this.createSimpleRunQuery(rq),\n ai: this.createSimpleAITools(),\n geoDataEngine: this.createSimpleGeoDataEngine(),\n ml: this.createSimpleMLTools()\n };\n return u;\n }\n\n private createSimpleAITools(): SimpleAITools {\n // Get the GraphQL provider - it's the same as the BaseEntity provider\n const provider = BaseEntity.Provider;\n \n // Check if it's a GraphQLDataProvider\n if (!(provider instanceof GraphQLDataProvider)) {\n throw new Error('Current data provider is not a GraphQLDataProvider. AI tools require GraphQL provider.');\n }\n\n const graphQLProvider = provider as GraphQLDataProvider;\n \n return {\n ExecutePrompt: async (params: SimpleExecutePromptParams): Promise<SimpleExecutePromptResult> => {\n try {\n // Use the AI client from GraphQLDataProvider to execute simple prompt\n const result = await graphQLProvider.AI.ExecuteSimplePrompt({\n systemPrompt: params.systemPrompt,\n messages: params.messages,\n preferredModels: params.preferredModels,\n modelPower: params.modelPower\n });\n\n console.log(`🤖 ExecutePrompt succeeded!`);\n if (this.debug) {\n console.log(' > params', params);\n console.log(' > result:', result);\n }\n\n return {\n success: result.success,\n result: result.result || '',\n resultObject: result.resultObject,\n modelName: result.modelName || ''\n };\n } catch (error) {\n LogError(error);\n return {\n success: false,\n result: 'Failed to execute prompt: ' + (error instanceof Error ? error.message : String(error)),\n modelName: ''\n };\n }\n },\n \n EmbedText: async (params: SimpleEmbedTextParams): Promise<SimpleEmbedTextResult> => {\n try {\n // Use the AI client from GraphQLDataProvider to generate embeddings\n const result = await graphQLProvider.AI.EmbedText({\n textToEmbed: params.textToEmbed,\n modelSize: params.modelSize\n });\n \n if (result.error) {\n throw new Error(result.error || 'Failed to generate embeddings');\n }\n\n const numEmbeddings: number = Array.isArray(params.textToEmbed) ? result.embeddings?.length : 1;\n console.log(`🤖 EmbedText succeeded! ${numEmbeddings} embeddings returned`);\n if (this.debug) {\n console.log(' > params', params);\n console.log(' > result:', result);\n }\n return {\n result: result.embeddings,\n modelName: result.modelName,\n vectorDimensions: result.vectorDimensions\n };\n } catch (error) {\n LogError(error);\n throw error; // Re-throw for embeddings as they're critical\n }\n },\n \n VectorService: new SimpleVectorService()\n };\n }\n\n /**\n * Creates the ML tools surface for components — listing trained models and scoring records.\n * `listModels` reads the `MJ: ML Models` catalog via RunView; `score` marshals the\n * `PredictiveStudio.ScoreRecordSet` Remote Operation over GraphQL to the server engine (the\n * Python sidecar lives server-side and cannot run in the browser). Returns `undefined` when no\n * GraphQL provider is available, so the `ml` capability degrades cleanly.\n */\n private createSimpleMLTools(): SimpleMLTools | undefined {\n const provider = BaseEntity.Provider;\n // Scoring requires a GraphQL provider to route the Remote Operation to the server engine.\n if (!(provider instanceof GraphQLDataProvider)) {\n return undefined;\n }\n const graphQLProvider = provider as GraphQLDataProvider;\n\n return {\n listModels: (filter?: SimpleMLListModelsFilter, contextUser?: UserInfo): Promise<SimpleMLModelInfo[]> =>\n this.listMLModels(filter, contextUser),\n\n score: (\n modelId: string,\n records: Array<Record<string, unknown> | string>,\n options?: { primaryKeyField?: string; contextUser?: UserInfo }\n ): Promise<SimpleMLScoreResult> => this.scoreMLRecords(graphQLProvider, modelId, records, options)\n };\n }\n\n /**\n * Loads the trained-model catalog from `MJ: ML Models`, newest version first, mapping each row\n * to a {@link SimpleMLModelInfo}. Resilient — logs and returns `[]` on any failure.\n */\n private async listMLModels(filter?: SimpleMLListModelsFilter, contextUser?: UserInfo): Promise<SimpleMLModelInfo[]> {\n try {\n const rv = RunView.FromMetadataProvider(this.provider);\n const result = await rv.RunView<MJMLModelEntity>(\n {\n EntityName: 'MJ: ML Models',\n ExtraFilter: this.buildMLModelsFilter(filter),\n OrderBy: 'Version DESC',\n MaxRows: filter?.maxResults,\n ResultType: 'entity_object'\n },\n contextUser\n );\n if (!result.Success) {\n console.error(`❌ listModels failed for MJ: ML Models: ${result.ErrorMessage}`);\n return [];\n }\n return result.Results.map((m) => this.mapMLModel(m));\n } catch (error) {\n LogError(error);\n return [];\n }\n }\n\n /**\n * Builds the ExtraFilter clause for {@link listMLModels}. Defaults to `Status='Published'` so\n * components only see promoted models unless the caller overrides the status.\n */\n private buildMLModelsFilter(filter?: SimpleMLListModelsFilter): string {\n const clauses: string[] = [];\n const status = filter?.status ?? 'Published';\n clauses.push(`Status='${this.escapeSqlLiteral(status)}'`);\n if (filter?.targetVariable) {\n clauses.push(`TargetVariable='${this.escapeSqlLiteral(filter.targetVariable)}'`);\n }\n return clauses.join(' AND ');\n }\n\n /** Maps a single `MJ: ML Models` row to the component-facing {@link SimpleMLModelInfo} shape. */\n private mapMLModel(m: MJMLModelEntity): SimpleMLModelInfo {\n return {\n id: m.ID,\n pipeline: m.Pipeline,\n version: m.Version,\n targetVariable: m.TargetVariable,\n problemType: m.ProblemType,\n status: m.Status,\n metrics: this.parseMLMetrics(m.Metrics),\n holdoutMetrics: this.parseMLMetrics(m.HoldoutMetrics)\n };\n }\n\n /** Defensively parses a JSON metrics blob; returns `undefined` for null/empty/invalid JSON. */\n private parseMLMetrics(raw: string | null): Record<string, unknown> | undefined {\n if (!raw) {\n return undefined;\n }\n try {\n const parsed = JSON.parse(raw);\n return parsed && typeof parsed === 'object' ? (parsed as Record<string, unknown>) : undefined;\n } catch {\n return undefined;\n }\n }\n\n /**\n * Scores records with a trained model by invoking the `PredictiveStudio.ScoreRecordSet` Remote\n * Operation. Normalizes `records` to primary-key strings, requests ephemeral predictions (no\n * write-back), and maps the result. Resilient — logs and returns a zeroed result with the input\n * records counted as failed on any error.\n */\n private async scoreMLRecords(\n provider: GraphQLDataProvider,\n modelId: string,\n records: Array<Record<string, unknown> | string>,\n options?: { primaryKeyField?: string; contextUser?: UserInfo }\n ): Promise<SimpleMLScoreResult> {\n const keys = this.normalizeRecordKeys(records, options?.primaryKeyField ?? 'ID');\n try {\n const input: PredictiveStudioScoreRecordSetInput = {\n modelId,\n scope: { records: keys }\n // No writeBack → predictions are returned ephemerally.\n };\n const op = new PredictiveStudioScoreRecordSetOperation();\n const result = await op.Execute(input, { provider, user: options?.contextUser });\n if (!result.Success || !result.Output) {\n console.error(`❌ score failed for model ${modelId}: ${result.ErrorMessage}`);\n return { scoredCount: 0, failedCount: keys.length, skippedCount: 0, predictions: [] };\n }\n const out = result.Output;\n return {\n scoredCount: out.scored,\n failedCount: out.failed,\n skippedCount: out.skipped,\n predictions: (out.predictions ?? []).map((p) => ({\n recordId: p.recordId,\n score: p.score,\n class: p.class\n }))\n };\n } catch (error) {\n LogError(error);\n return { scoredCount: 0, failedCount: keys.length, skippedCount: 0, predictions: [] };\n }\n }\n\n /**\n * Normalizes a mixed array of primary-key strings and row objects into an array of primary-key\n * strings, reading `primaryKeyField` from objects. Drops entries without a resolvable key.\n */\n private normalizeRecordKeys(records: Array<Record<string, unknown> | string>, primaryKeyField: string): string[] {\n const keys: string[] = [];\n for (const r of records) {\n if (typeof r === 'string') {\n keys.push(r);\n } else if (r != null) {\n const value = r[primaryKeyField];\n if (value != null) {\n keys.push(String(value));\n }\n }\n }\n return keys;\n }\n\n /** Escapes single quotes for safe inlining into a RunView ExtraFilter SQL string literal. */\n private escapeSqlLiteral(value: string): string {\n return value.replace(/'/g, \"''\");\n }\n\n private createSimpleMetadata(md: IMetadataProvider): SimpleMetadata {\n return {\n Entities: md.Entities,\n GetEntityObject: (entityName: string) => {\n return md.GetEntityObject(entityName)\n }\n }\n }\n\n private createSimpleGeoDataEngine(): SimpleGeoDataEngine | undefined {\n try {\n const geo = GeoDataEngine.Instance;\n if (!geo) return undefined;\n return {\n ResolvePointToLocation: (lat: number, lng: number) => {\n return geo.ResolvePointToLocation(lat, lng);\n },\n // GeoDataEngine is on-demand load — callers must await before ResolvePointToLocation works.\n EnsureLoaded: () => geo.EnsureLoaded(),\n get Loaded() {\n return geo.Loaded;\n }\n };\n } catch {\n // GeoDataEngine may not be configured yet — return undefined\n return undefined;\n }\n }\n\n private createSimpleRunQuery(rq: RunQuery): SimpleRunQuery {\n return {\n RunQuery: async (params: RunQueryParams) => {\n // Run a single query and return the results\n try {\n const result = await rq.RunQuery(params);\n if (result.Success) {\n console.log(`✅ RunQuery \"${params.QueryName}\" succeeded: ${result.RowCount} rows returned`);\n if (this.debug) {\n console.log(' > params', params);\n console.log(' > result:', result);\n }\n } else {\n console.error(`❌ RunQuery failed: ${result.ErrorMessage}`);\n }\n return result;\n } catch (error) {\n console.error(`❌ RunQuery threw exception:`, error);\n LogError(error);\n throw error; // Re-throw to handle it in the caller\n }\n }\n }\n }\n\n private createSimpleRunView(rv: RunView): SimpleRunView {\n return {\n RunView: async (params: RunViewParams) => {\n // Run a single view and return the results\n try {\n const result = await rv.RunView(params);\n if (result.Success) {\n console.log(`✅ RunView succeeded for ${params.EntityName}: ${result.TotalRowCount} rows returned`);\n if (this.debug) {\n console.log(' > params', params);\n console.log(' > result:', result);\n }\n } else {\n console.error(`❌ RunView failed for ${params.EntityName}: ${result.ErrorMessage}`);\n }\n return result;\n } catch (error) {\n console.error(`❌ RunView threw exception:`, error);\n LogError(error);\n throw error; // Re-throw to handle it in the caller\n }\n },\n RunViews: async (params: RunViewParams[]) => {\n // Runs multiple views and returns the results\n try {\n const results = await rv.RunViews(params);\n const entityNames = params.map(p => p.EntityName).join(', ');\n const totalRows = results.reduce((sum, r) => sum + (r.TotalRowCount || 0), 0);\n console.log(`✅ RunViews succeeded for [${entityNames}]: ${totalRows} total rows returned`);\n if (this.debug) {\n console.log(' > params', params);\n console.log(' > results:', results);\n }\n return results;\n } catch (error) {\n console.error(`❌ RunViews threw exception:`, error);\n LogError(error);\n throw error; // Re-throw to handle it in the caller\n }\n }\n }\n }\n}\n\n/**\n * Factory function to create RuntimeUtilities\n * In a Node.js environment, this will use MJ's ClassFactory for runtime substitution\n * In a browser environment, it will use the base class directly\n */\nexport function CreateRuntimeUtilities(): RuntimeUtilities {\n try {\n // Resolve through ClassFactory so a host that registers a higher-priority subclass gets it.\n // `CreateInstance` with a null key matches any registration for this root class, and the\n // decorator below registers the base itself, so an app with no override still gets a plain\n // `RuntimeUtilities` — the resolution is the same object either way.\n const obj = MJGlobal.Instance.ClassFactory.CreateInstance<RuntimeUtilities>(RuntimeUtilities);\n if (obj) {\n return obj;\n }\n } catch {\n // ClassFactory throws when a base is declared as unable to stand alone. That is not this\n // class — it is perfectly usable on its own — so fall through rather than fail the component.\n }\n\n return new RuntimeUtilities();\n}\n\n/** @deprecated Use {@link CreateRuntimeUtilities}. */\nexport function createRuntimeUtilities(): RuntimeUtilities {\n return CreateRuntimeUtilities();\n}"]}
|
|
1
|
+
{"version":3,"file":"runtime-utilities.js","sourceRoot":"","sources":["../../src/utilities/runtime-utilities.ts"],"names":[],"mappings":";;;;;;AA+BA,OAAO,EACL,QAAQ,EACR,OAAO,EACP,QAAQ,EAGR,QAAQ,EACR,UAAU,EAKX,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAiB9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAEL,uCAAuC,EAExC,MAAM,+BAA+B,CAAC;AAQhC,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAAtB;QACG,UAAK,GAAY,KAAK,CAAC;IA4XjC,CAAC;IA5WQ,cAAc,CAAC,QAAiB,KAAK,EAAE,QAA4B;QACxE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC;QAC9C,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAGM,cAAc,CAAC,QAAiB,KAAK,EAAE,QAA4B;QACxE,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAKO,cAAc,CAAC,EAAqB;QAC1C,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;QAC5C,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,EAAkC,CAAC,CAAC;QAC5D,MAAM,CAAC,GAAuB;YAC5B,EAAE,EAAE,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC;YACjC,EAAE,EAAE,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC;YAChC,EAAE,EAAE,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC;YACjC,EAAE,EAAE,IAAI,CAAC,mBAAmB,EAAE;YAC9B,aAAa,EAAE,IAAI,CAAC,yBAAyB,EAAE;YAC/C,EAAE,EAAE,IAAI,CAAC,mBAAmB,EAAE;SAC/B,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IAEO,mBAAmB;QAEzB,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC;QAGrC,IAAI,CAAC,CAAC,QAAQ,YAAY,mBAAmB,CAAC,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CAAC,wFAAwF,CAAC,CAAC;QAC5G,CAAC;QAED,MAAM,eAAe,GAAG,QAA+B,CAAC;QAExD,OAAO;YACL,aAAa,EAAE,KAAK,EAAE,MAAiC,EAAsC,EAAE;gBAC7F,IAAI,CAAC;oBAEH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,EAAE,CAAC,mBAAmB,CAAC;wBAC1D,YAAY,EAAE,MAAM,CAAC,YAAY;wBACjC,QAAQ,EAAE,MAAM,CAAC,QAAQ;wBACzB,eAAe,EAAE,MAAM,CAAC,eAAe;wBACvC,UAAU,EAAE,MAAM,CAAC,UAAU;qBAC9B,CAAC,CAAC;oBAEH,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;oBAC5C,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;wBACf,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;wBACrC,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;oBACxC,CAAC;oBAED,OAAO;wBACL,OAAO,EAAE,MAAM,CAAC,OAAO;wBACvB,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE;wBAC3B,YAAY,EAAE,MAAM,CAAC,YAAY;wBACjC,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,EAAE;qBAClC,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,QAAQ,CAAC,KAAK,CAAC,CAAC;oBAChB,OAAO;wBACL,OAAO,EAAE,KAAK;wBACd,MAAM,EAAE,4BAA4B,GAAG,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;wBAC/F,SAAS,EAAE,EAAE;qBACd,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,SAAS,EAAE,KAAK,EAAE,MAA6B,EAAkC,EAAE;gBACjF,IAAI,CAAC;oBAEH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,EAAE,CAAC,SAAS,CAAC;wBAChD,WAAW,EAAE,MAAM,CAAC,WAAW;wBAC/B,SAAS,EAAE,MAAM,CAAC,SAAS;wBAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;qBAC5B,CAAC,CAAC;oBAEH,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;wBACjB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,+BAA+B,CAAC,CAAC;oBACnE,CAAC;oBAED,MAAM,aAAa,GAAW,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;oBAChG,OAAO,CAAC,GAAG,CAAC,4BAA4B,aAAa,sBAAsB,CAAC,CAAC;oBAC7E,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;wBACf,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;wBACrC,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;oBACxC,CAAC;oBACD,OAAO;wBACL,MAAM,EAAE,MAAM,CAAC,UAAU;wBACzB,SAAS,EAAE,MAAM,CAAC,SAAS;wBAC3B,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;qBAC1C,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,QAAQ,CAAC,KAAK,CAAC,CAAC;oBAChB,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;YAED,aAAa,EAAE,IAAI,mBAAmB,EAAE;SACzC,CAAC;IACJ,CAAC;IASO,mBAAmB;QACzB,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC;QAErC,IAAI,CAAC,CAAC,QAAQ,YAAY,mBAAmB,CAAC,EAAE,CAAC;YAC/C,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,eAAe,GAAG,QAA+B,CAAC;QAExD,OAAO;YACL,UAAU,EAAE,CAAC,MAAiC,EAAE,WAAsB,EAAgC,EAAE,CACtG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,WAAW,CAAC;YAExC,KAAK,EAAE,CACL,OAAe,EACf,OAAgD,EAChD,OAA8D,EAChC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC;SACnG,CAAC;IACJ,CAAC;IAMO,KAAK,CAAC,YAAY,CAAC,MAAiC,EAAE,WAAsB;QAClF,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAC7B;gBACE,UAAU,EAAE,eAAe;gBAC3B,WAAW,EAAE,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC;gBAC7C,OAAO,EAAE,cAAc;gBACvB,OAAO,EAAE,MAAM,EAAE,UAAU;gBAC3B,UAAU,EAAE,eAAe;aAC5B,EACD,WAAW,CACZ,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,CAAC,KAAK,CAAC,0CAA0C,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;gBAC/E,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,KAAK,CAAC,CAAC;YAChB,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAMO,mBAAmB,CAAC,MAAiC;QAC3D,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,MAAM,EAAE,MAAM,IAAI,WAAW,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1D,IAAI,MAAM,EAAE,cAAc,EAAE,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QACnF,CAAC;QACD,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAGO,UAAU,CAAC,CAAkB;QACnC,OAAO;YACL,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,cAAc,EAAE,CAAC,CAAC,cAAc;YAChC,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC;YACvC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC;SACtD,CAAC;IACJ,CAAC;IAGO,cAAc,CAAC,GAAkB;QACvC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/B,OAAO,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAE,MAAkC,CAAC,CAAC,CAAC,SAAS,CAAC;QAChG,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAQO,KAAK,CAAC,cAAc,CAC1B,QAA6B,EAC7B,OAAe,EACf,OAAgD,EAChD,OAA8D;QAE9D,MAAM,IAAI,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,eAAe,IAAI,IAAI,CAAC,CAAC;QACjF,IAAI,CAAC;YACH,MAAM,KAAK,GAAwC;gBACjD,OAAO;gBACP,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;aAEzB,CAAC;YACF,MAAM,EAAE,GAAG,IAAI,uCAAuC,EAAE,CAAC;YACzD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;YACjF,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBACtC,OAAO,CAAC,KAAK,CAAC,4BAA4B,OAAO,KAAK,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;gBAC7E,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;YACxF,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC;YAC1B,OAAO;gBACL,WAAW,EAAE,GAAG,CAAC,MAAM;gBACvB,WAAW,EAAE,GAAG,CAAC,MAAM;gBACvB,YAAY,EAAE,GAAG,CAAC,OAAO;gBACzB,WAAW,EAAE,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC/C,QAAQ,EAAE,CAAC,CAAC,QAAQ;oBACpB,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,KAAK,EAAE,CAAC,CAAC,KAAK;iBACf,CAAC,CAAC;aACJ,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,KAAK,CAAC,CAAC;YAChB,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;QACxF,CAAC;IACH,CAAC;IAMO,mBAAmB,CAAC,OAAgD,EAAE,eAAuB;QACnG,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAC1B,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACf,CAAC;iBAAM,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;gBACrB,MAAM,KAAK,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC;gBACjC,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;oBAClB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC3B,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAGO,gBAAgB,CAAC,KAAa;QACpC,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC;IAEO,oBAAoB,CAAC,EAAqB;QAChD,OAAO;YACL,QAAQ,EAAE,EAAE,CAAC,QAAQ;YACrB,eAAe,EAAE,CAAC,UAAkB,EAAE,EAAE;gBACtC,OAAO,EAAE,CAAC,eAAe,CAAC,UAAU,CAAC,CAAA;YACvC,CAAC;SACF,CAAA;IACH,CAAC;IAEO,yBAAyB;QAC/B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,aAAa,CAAC,QAAQ,CAAC;YACnC,IAAI,CAAC,GAAG;gBAAE,OAAO,SAAS,CAAC;YAC3B,OAAO;gBACL,sBAAsB,EAAE,CAAC,GAAW,EAAE,GAAW,EAAE,EAAE;oBACnD,OAAO,GAAG,CAAC,sBAAsB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBAC9C,CAAC;gBAED,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,YAAY,EAAE;gBACtC,IAAI,MAAM;oBACR,OAAO,GAAG,CAAC,MAAM,CAAC;gBACpB,CAAC;aACF,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YAEP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAEO,oBAAoB,CAAC,EAAY;QACvC,OAAO;YACL,QAAQ,EAAE,KAAK,EAAE,MAAsB,EAAE,EAAE;gBAEzC,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;oBACzC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;wBACnB,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,SAAS,gBAAgB,MAAM,CAAC,QAAQ,gBAAgB,CAAC,CAAC;wBAC5F,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;4BACf,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;4BACrC,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;wBACxC,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,KAAK,CAAC,sBAAsB,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;oBAC7D,CAAC;oBACD,OAAO,MAAM,CAAC;gBAChB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;oBACpD,QAAQ,CAAC,KAAK,CAAC,CAAC;oBAChB,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;SACF,CAAA;IACH,CAAC;IAEO,mBAAmB,CAAC,EAAW;QACrC,OAAO;YACL,OAAO,EAAE,KAAK,EAAE,MAAqB,EAAE,EAAE;gBAEvC,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;oBACxC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;wBACnB,OAAO,CAAC,GAAG,CAAC,2BAA2B,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,aAAa,gBAAgB,CAAC,CAAC;wBACnG,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;4BACf,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;4BACrC,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;wBACxC,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,KAAK,CAAC,wBAAwB,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;oBACrF,CAAC;oBACD,OAAO,MAAM,CAAC;gBAChB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;oBACnD,QAAQ,CAAC,KAAK,CAAC,CAAC;oBAChB,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;YACD,QAAQ,EAAE,KAAK,EAAE,MAAuB,EAAE,EAAE;gBAE1C,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;oBAC1C,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC7D,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBAC9E,OAAO,CAAC,GAAG,CAAC,6BAA6B,WAAW,MAAM,SAAS,sBAAsB,CAAC,CAAC;oBAC3F,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;wBACf,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;wBACrC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;oBAC1C,CAAC;oBACD,OAAO,OAAO,CAAC;gBACjB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;oBACpD,QAAQ,CAAC,KAAK,CAAC,CAAC;oBAChB,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;SACF,CAAA;IACH,CAAC;CACF,CAAA;AA7XY,gBAAgB;IAD5B,aAAa,CAAC,gBAAgB,EAAE,kBAAkB,CAAC;GACvC,gBAAgB,CA6X5B;;AAOD,MAAM,UAAU,sBAAsB;IACpC,IAAI,CAAC;QAKH,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,cAAc,CAAmB,gBAAgB,CAAC,CAAC;QAC9F,IAAI,GAAG,EAAE,CAAC;YACR,OAAO,GAAG,CAAC;QACb,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;IAGT,CAAC;IAED,OAAO,IAAI,gBAAgB,EAAE,CAAC;AAChC,CAAC;AAGD,MAAM,UAAU,sBAAsB;IACpC,OAAO,sBAAsB,EAAE,CAAC;AAClC,CAAC","sourcesContent":["/**\n * @fileoverview The `utilities` prop every interactive component receives — `md`, `rv`, `rq`, `ai`,\n * `geoDataEngine`, `ml` — built over MemberJunction core.\n * @module @memberjunction/react-runtime/utilities\n *\n * ## Why this is not in the Angular package\n *\n * It was, for its whole life, and it imports nothing from `@angular/*`: 450 lines of pure\n * TypeScript over `@memberjunction/core`, `core-entities` and `graphql-dataprovider`. That made it\n * unreachable from any non-Angular host, and `utilities` is not an Angular concept — it is the\n * data surface the component contract promises. A React Native host either reimplemented it or\n * passed `{}` and shipped components that could not read a row.\n *\n * It lives here, beside the compiler and prop-builder that the same components go through, so every\n * host builds the same `utilities` object from the same code. A second implementation would drift\n * the moment either side added a capability — and the components asking for `utilities.rv.RunView`\n * are authored once, for both.\n *\n * ## Overriding\n *\n * `createRuntimeUtilities` resolves through `MJGlobal.ClassFactory`, so a host that registers a\n * higher-priority subclass of {@link RuntimeUtilities} gets it — on every host, browser included.\n *\n * It did not always. The factory used to consult `ClassFactory` only when\n * `typeof window === 'undefined'`, which made the `@RegisterClass` registration below inert on\n * every browser and React Native host: the base class still worked, but nobody could substitute\n * one. Removing the guard changes nothing for an app that registers no subclass — with a null key\n * `CreateInstance` matches the base's own registration and constructs the same class the fallback\n * would have — and makes the documented extension point real for the ones that do.\n */\n\nimport {\n Metadata,\n RunView,\n RunQuery,\n RunViewParams,\n RunQueryParams,\n LogError,\n BaseEntity,\n IEntityDataProvider,\n IMetadataProvider,\n IRunQueryProvider,\n UserInfo\n} from '@memberjunction/core';\n\nimport { MJGlobal, RegisterClass } from '@memberjunction/global';\nimport { GeoDataEngine } from '@memberjunction/core-entities';\nimport {\n ComponentUtilities,\n SimpleAITools,\n SimpleGeoDataEngine,\n SimpleMetadata,\n SimpleMLTools,\n SimpleMLModelInfo,\n SimpleMLListModelsFilter,\n SimpleMLScoreResult,\n SimpleRunQuery,\n SimpleRunView,\n SimpleExecutePromptParams,\n SimpleExecutePromptResult,\n SimpleEmbedTextParams,\n SimpleEmbedTextResult\n} from '@memberjunction/interactive-component-types';\nimport { GraphQLDataProvider } from '@memberjunction/graphql-dataprovider';\nimport { SimpleVectorService } from '@memberjunction/ai-vectors-memory';\nimport {\n MJMLModelEntity,\n PredictiveStudioScoreRecordSetOperation,\n PredictiveStudioScoreRecordSetInput\n} from '@memberjunction/core-entities';\n\n/**\n * Base class for providing runtime utilities to React components in Angular.\n * This class can be extended and registered with MJ's ClassFactory\n * to provide custom implementations of data access methods.\n */\n@RegisterClass(RuntimeUtilities, 'RuntimeUtilities')\nexport class RuntimeUtilities {\n private debug: boolean = false;\n /**\n * The provider every read in the built utilities goes through. Always set by\n * {@link buildUtilities} before use — falls back to the global provider there\n * (`provider ?? Metadata.Provider`) when the host doesn't supply one.\n */\n private provider!: IMetadataProvider;\n\n /**\n * Builds the complete utilities object for React components\n * This is the main method that components will use\n *\n * @param provider the host's provider. A React component mounted under a non-default provider\n * passes its own `ProviderToUse`; omitting it falls back to the global default, named\n * explicitly rather than reached for via `new Metadata()`.\n */\n public BuildUtilities(debug: boolean = false, provider?: IMetadataProvider): ComponentUtilities {\n this.debug = debug;\n this.provider = provider ?? Metadata.Provider;\n return this.setupUtilities(this.provider);\n }\n\n /** @deprecated Use {@link BuildUtilities}. */\n public buildUtilities(debug: boolean = false, provider?: IMetadataProvider): ComponentUtilities {\n return this.BuildUtilities(debug, provider);\n }\n\n /**\n * Sets up the utilities object - copied from skip-chat implementation\n */\n private setupUtilities(md: IMetadataProvider): ComponentUtilities {\n const rv = RunView.FromMetadataProvider(md);\n const rq = new RunQuery(md as unknown as IRunQueryProvider);\n const u: ComponentUtilities = {\n md: this.createSimpleMetadata(md),\n rv: this.createSimpleRunView(rv),\n rq: this.createSimpleRunQuery(rq),\n ai: this.createSimpleAITools(),\n geoDataEngine: this.createSimpleGeoDataEngine(),\n ml: this.createSimpleMLTools()\n };\n return u;\n }\n\n private createSimpleAITools(): SimpleAITools {\n // Get the GraphQL provider - it's the same as the BaseEntity provider\n const provider = BaseEntity.Provider;\n \n // Check if it's a GraphQLDataProvider\n if (!(provider instanceof GraphQLDataProvider)) {\n throw new Error('Current data provider is not a GraphQLDataProvider. AI tools require GraphQL provider.');\n }\n\n const graphQLProvider = provider as GraphQLDataProvider;\n \n return {\n ExecutePrompt: async (params: SimpleExecutePromptParams): Promise<SimpleExecutePromptResult> => {\n try {\n // Use the AI client from GraphQLDataProvider to execute simple prompt\n const result = await graphQLProvider.AI.ExecuteSimplePrompt({\n systemPrompt: params.systemPrompt,\n messages: params.messages,\n preferredModels: params.preferredModels,\n modelPower: params.modelPower\n });\n\n console.log(`🤖 ExecutePrompt succeeded!`);\n if (this.debug) {\n console.log(' > params', params);\n console.log(' > result:', result);\n }\n\n return {\n success: result.success,\n result: result.result || '',\n resultObject: result.resultObject,\n modelName: result.modelName || ''\n };\n } catch (error) {\n LogError(error);\n return {\n success: false,\n result: 'Failed to execute prompt: ' + (error instanceof Error ? error.message : String(error)),\n modelName: ''\n };\n }\n },\n \n EmbedText: async (params: SimpleEmbedTextParams): Promise<SimpleEmbedTextResult> => {\n try {\n // Use the AI client from GraphQLDataProvider to generate embeddings\n const result = await graphQLProvider.AI.EmbedText({\n textToEmbed: params.textToEmbed,\n modelSize: params.modelSize,\n inputType: params.inputType\n });\n \n if (result.error) {\n throw new Error(result.error || 'Failed to generate embeddings');\n }\n\n const numEmbeddings: number = Array.isArray(params.textToEmbed) ? result.embeddings?.length : 1;\n console.log(`🤖 EmbedText succeeded! ${numEmbeddings} embeddings returned`);\n if (this.debug) {\n console.log(' > params', params);\n console.log(' > result:', result);\n }\n return {\n result: result.embeddings,\n modelName: result.modelName,\n vectorDimensions: result.vectorDimensions\n };\n } catch (error) {\n LogError(error);\n throw error; // Re-throw for embeddings as they're critical\n }\n },\n \n VectorService: new SimpleVectorService()\n };\n }\n\n /**\n * Creates the ML tools surface for components — listing trained models and scoring records.\n * `listModels` reads the `MJ: ML Models` catalog via RunView; `score` marshals the\n * `PredictiveStudio.ScoreRecordSet` Remote Operation over GraphQL to the server engine (the\n * Python sidecar lives server-side and cannot run in the browser). Returns `undefined` when no\n * GraphQL provider is available, so the `ml` capability degrades cleanly.\n */\n private createSimpleMLTools(): SimpleMLTools | undefined {\n const provider = BaseEntity.Provider;\n // Scoring requires a GraphQL provider to route the Remote Operation to the server engine.\n if (!(provider instanceof GraphQLDataProvider)) {\n return undefined;\n }\n const graphQLProvider = provider as GraphQLDataProvider;\n\n return {\n listModels: (filter?: SimpleMLListModelsFilter, contextUser?: UserInfo): Promise<SimpleMLModelInfo[]> =>\n this.listMLModels(filter, contextUser),\n\n score: (\n modelId: string,\n records: Array<Record<string, unknown> | string>,\n options?: { primaryKeyField?: string; contextUser?: UserInfo }\n ): Promise<SimpleMLScoreResult> => this.scoreMLRecords(graphQLProvider, modelId, records, options)\n };\n }\n\n /**\n * Loads the trained-model catalog from `MJ: ML Models`, newest version first, mapping each row\n * to a {@link SimpleMLModelInfo}. Resilient — logs and returns `[]` on any failure.\n */\n private async listMLModels(filter?: SimpleMLListModelsFilter, contextUser?: UserInfo): Promise<SimpleMLModelInfo[]> {\n try {\n const rv = RunView.FromMetadataProvider(this.provider);\n const result = await rv.RunView<MJMLModelEntity>(\n {\n EntityName: 'MJ: ML Models',\n ExtraFilter: this.buildMLModelsFilter(filter),\n OrderBy: 'Version DESC',\n MaxRows: filter?.maxResults,\n ResultType: 'entity_object'\n },\n contextUser\n );\n if (!result.Success) {\n console.error(`❌ listModels failed for MJ: ML Models: ${result.ErrorMessage}`);\n return [];\n }\n return result.Results.map((m) => this.mapMLModel(m));\n } catch (error) {\n LogError(error);\n return [];\n }\n }\n\n /**\n * Builds the ExtraFilter clause for {@link listMLModels}. Defaults to `Status='Published'` so\n * components only see promoted models unless the caller overrides the status.\n */\n private buildMLModelsFilter(filter?: SimpleMLListModelsFilter): string {\n const clauses: string[] = [];\n const status = filter?.status ?? 'Published';\n clauses.push(`Status='${this.escapeSqlLiteral(status)}'`);\n if (filter?.targetVariable) {\n clauses.push(`TargetVariable='${this.escapeSqlLiteral(filter.targetVariable)}'`);\n }\n return clauses.join(' AND ');\n }\n\n /** Maps a single `MJ: ML Models` row to the component-facing {@link SimpleMLModelInfo} shape. */\n private mapMLModel(m: MJMLModelEntity): SimpleMLModelInfo {\n return {\n id: m.ID,\n pipeline: m.Pipeline,\n version: m.Version,\n targetVariable: m.TargetVariable,\n problemType: m.ProblemType,\n status: m.Status,\n metrics: this.parseMLMetrics(m.Metrics),\n holdoutMetrics: this.parseMLMetrics(m.HoldoutMetrics)\n };\n }\n\n /** Defensively parses a JSON metrics blob; returns `undefined` for null/empty/invalid JSON. */\n private parseMLMetrics(raw: string | null): Record<string, unknown> | undefined {\n if (!raw) {\n return undefined;\n }\n try {\n const parsed = JSON.parse(raw);\n return parsed && typeof parsed === 'object' ? (parsed as Record<string, unknown>) : undefined;\n } catch {\n return undefined;\n }\n }\n\n /**\n * Scores records with a trained model by invoking the `PredictiveStudio.ScoreRecordSet` Remote\n * Operation. Normalizes `records` to primary-key strings, requests ephemeral predictions (no\n * write-back), and maps the result. Resilient — logs and returns a zeroed result with the input\n * records counted as failed on any error.\n */\n private async scoreMLRecords(\n provider: GraphQLDataProvider,\n modelId: string,\n records: Array<Record<string, unknown> | string>,\n options?: { primaryKeyField?: string; contextUser?: UserInfo }\n ): Promise<SimpleMLScoreResult> {\n const keys = this.normalizeRecordKeys(records, options?.primaryKeyField ?? 'ID');\n try {\n const input: PredictiveStudioScoreRecordSetInput = {\n modelId,\n scope: { records: keys }\n // No writeBack → predictions are returned ephemerally.\n };\n const op = new PredictiveStudioScoreRecordSetOperation();\n const result = await op.Execute(input, { provider, user: options?.contextUser });\n if (!result.Success || !result.Output) {\n console.error(`❌ score failed for model ${modelId}: ${result.ErrorMessage}`);\n return { scoredCount: 0, failedCount: keys.length, skippedCount: 0, predictions: [] };\n }\n const out = result.Output;\n return {\n scoredCount: out.scored,\n failedCount: out.failed,\n skippedCount: out.skipped,\n predictions: (out.predictions ?? []).map((p) => ({\n recordId: p.recordId,\n score: p.score,\n class: p.class\n }))\n };\n } catch (error) {\n LogError(error);\n return { scoredCount: 0, failedCount: keys.length, skippedCount: 0, predictions: [] };\n }\n }\n\n /**\n * Normalizes a mixed array of primary-key strings and row objects into an array of primary-key\n * strings, reading `primaryKeyField` from objects. Drops entries without a resolvable key.\n */\n private normalizeRecordKeys(records: Array<Record<string, unknown> | string>, primaryKeyField: string): string[] {\n const keys: string[] = [];\n for (const r of records) {\n if (typeof r === 'string') {\n keys.push(r);\n } else if (r != null) {\n const value = r[primaryKeyField];\n if (value != null) {\n keys.push(String(value));\n }\n }\n }\n return keys;\n }\n\n /** Escapes single quotes for safe inlining into a RunView ExtraFilter SQL string literal. */\n private escapeSqlLiteral(value: string): string {\n return value.replace(/'/g, \"''\");\n }\n\n private createSimpleMetadata(md: IMetadataProvider): SimpleMetadata {\n return {\n Entities: md.Entities,\n GetEntityObject: (entityName: string) => {\n return md.GetEntityObject(entityName)\n }\n }\n }\n\n private createSimpleGeoDataEngine(): SimpleGeoDataEngine | undefined {\n try {\n const geo = GeoDataEngine.Instance;\n if (!geo) return undefined;\n return {\n ResolvePointToLocation: (lat: number, lng: number) => {\n return geo.ResolvePointToLocation(lat, lng);\n },\n // GeoDataEngine is on-demand load — callers must await before ResolvePointToLocation works.\n EnsureLoaded: () => geo.EnsureLoaded(),\n get Loaded() {\n return geo.Loaded;\n }\n };\n } catch {\n // GeoDataEngine may not be configured yet — return undefined\n return undefined;\n }\n }\n\n private createSimpleRunQuery(rq: RunQuery): SimpleRunQuery {\n return {\n RunQuery: async (params: RunQueryParams) => {\n // Run a single query and return the results\n try {\n const result = await rq.RunQuery(params);\n if (result.Success) {\n console.log(`✅ RunQuery \"${params.QueryName}\" succeeded: ${result.RowCount} rows returned`);\n if (this.debug) {\n console.log(' > params', params);\n console.log(' > result:', result);\n }\n } else {\n console.error(`❌ RunQuery failed: ${result.ErrorMessage}`);\n }\n return result;\n } catch (error) {\n console.error(`❌ RunQuery threw exception:`, error);\n LogError(error);\n throw error; // Re-throw to handle it in the caller\n }\n }\n }\n }\n\n private createSimpleRunView(rv: RunView): SimpleRunView {\n return {\n RunView: async (params: RunViewParams) => {\n // Run a single view and return the results\n try {\n const result = await rv.RunView(params);\n if (result.Success) {\n console.log(`✅ RunView succeeded for ${params.EntityName}: ${result.TotalRowCount} rows returned`);\n if (this.debug) {\n console.log(' > params', params);\n console.log(' > result:', result);\n }\n } else {\n console.error(`❌ RunView failed for ${params.EntityName}: ${result.ErrorMessage}`);\n }\n return result;\n } catch (error) {\n console.error(`❌ RunView threw exception:`, error);\n LogError(error);\n throw error; // Re-throw to handle it in the caller\n }\n },\n RunViews: async (params: RunViewParams[]) => {\n // Runs multiple views and returns the results\n try {\n const results = await rv.RunViews(params);\n const entityNames = params.map(p => p.EntityName).join(', ');\n const totalRows = results.reduce((sum, r) => sum + (r.TotalRowCount || 0), 0);\n console.log(`✅ RunViews succeeded for [${entityNames}]: ${totalRows} total rows returned`);\n if (this.debug) {\n console.log(' > params', params);\n console.log(' > results:', results);\n }\n return results;\n } catch (error) {\n console.error(`❌ RunViews threw exception:`, error);\n LogError(error);\n throw error; // Re-throw to handle it in the caller\n }\n }\n }\n }\n}\n\n/**\n * Factory function to create RuntimeUtilities\n * In a Node.js environment, this will use MJ's ClassFactory for runtime substitution\n * In a browser environment, it will use the base class directly\n */\nexport function CreateRuntimeUtilities(): RuntimeUtilities {\n try {\n // Resolve through ClassFactory so a host that registers a higher-priority subclass gets it.\n // `CreateInstance` with a null key matches any registration for this root class, and the\n // decorator below registers the base itself, so an app with no override still gets a plain\n // `RuntimeUtilities` — the resolution is the same object either way.\n const obj = MJGlobal.Instance.ClassFactory.CreateInstance<RuntimeUtilities>(RuntimeUtilities);\n if (obj) {\n return obj;\n }\n } catch {\n // ClassFactory throws when a base is declared as unable to stand alone. That is not this\n // class — it is perfectly usable on its own — so fall through rather than fail the component.\n }\n\n return new RuntimeUtilities();\n}\n\n/** @deprecated Use {@link CreateRuntimeUtilities}. */\nexport function createRuntimeUtilities(): RuntimeUtilities {\n return CreateRuntimeUtilities();\n}"]}
|