@memberjunction/global 4.4.0 → 5.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/DynamicPackageLoader.d.ts +61 -0
- package/dist/DynamicPackageLoader.d.ts.map +1 -0
- package/dist/DynamicPackageLoader.js +56 -0
- package/dist/DynamicPackageLoader.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/warningManager.d.ts +2 -2
- package/dist/warningManager.js +2 -2
- package/package.json +1 -1
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dynamic Package Loading
|
|
3
|
+
*
|
|
4
|
+
* Provides runtime dynamic import capabilities for MJ Open App packages.
|
|
5
|
+
* Used by MJAPI startup to load server-side app bootstrap packages that
|
|
6
|
+
* register their classes with the ClassFactory via @RegisterClass decorators.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Describes a package to be dynamically imported at runtime.
|
|
10
|
+
* Typically read from the `dynamicPackages.server` section of mj.config.cjs.
|
|
11
|
+
*/
|
|
12
|
+
export interface DynamicPackageLoad {
|
|
13
|
+
/** npm package name to dynamically import */
|
|
14
|
+
PackageName: string;
|
|
15
|
+
/** Named export to call after import (e.g., 'LoadAcmeCRMServer') */
|
|
16
|
+
StartupExport: string;
|
|
17
|
+
/** Open App name this package belongs to (for tracking) */
|
|
18
|
+
AppName: string;
|
|
19
|
+
/** Whether this package should be loaded. Allows disabling without removing. */
|
|
20
|
+
Enabled: boolean;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Result of attempting to dynamically load a single package.
|
|
24
|
+
*/
|
|
25
|
+
export interface DynamicLoadResult {
|
|
26
|
+
/** The package that was loaded (or failed to load) */
|
|
27
|
+
PackageName: string;
|
|
28
|
+
/** Whether the package was loaded and its startup export called successfully */
|
|
29
|
+
Success: boolean;
|
|
30
|
+
/** Error message if the load failed */
|
|
31
|
+
Error?: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Utility class for dynamically loading npm packages at runtime.
|
|
35
|
+
*
|
|
36
|
+
* Used during MJAPI startup to load Open App server-side bootstrap packages.
|
|
37
|
+
* Each package is loaded in isolation — a failure in one package does not
|
|
38
|
+
* prevent others from loading.
|
|
39
|
+
*/
|
|
40
|
+
export declare class DynamicPackageLoader {
|
|
41
|
+
/**
|
|
42
|
+
* Loads all enabled dynamic packages in parallel for better performance.
|
|
43
|
+
* For each package:
|
|
44
|
+
* 1. Skips if `Enabled` is false
|
|
45
|
+
* 2. Dynamically imports the package via `await import()`
|
|
46
|
+
* 3. Calls the named `StartupExport` function if it exists
|
|
47
|
+
* 4. Records success or failure
|
|
48
|
+
*
|
|
49
|
+
* Errors are isolated per-package — a broken package does not crash the server.
|
|
50
|
+
* All enabled packages are loaded concurrently using Promise.all().
|
|
51
|
+
*
|
|
52
|
+
* @param packages - Array of packages to load
|
|
53
|
+
* @returns Array of results indicating success/failure for each package
|
|
54
|
+
*/
|
|
55
|
+
static LoadPackages(packages: DynamicPackageLoad[]): Promise<DynamicLoadResult[]>;
|
|
56
|
+
/**
|
|
57
|
+
* Attempts to dynamically import a single package and call its startup export.
|
|
58
|
+
*/
|
|
59
|
+
private static LoadSinglePackage;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=DynamicPackageLoader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DynamicPackageLoader.d.ts","sourceRoot":"","sources":["../src/DynamicPackageLoader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IAC/B,6CAA6C;IAC7C,WAAW,EAAE,MAAM,CAAC;IAEpB,oEAAoE;IACpE,aAAa,EAAE,MAAM,CAAC;IAEtB,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAC;IAEhB,gFAAgF;IAChF,OAAO,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAC9B,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAC;IAEpB,gFAAgF;IAChF,OAAO,EAAE,OAAO,CAAC;IAEjB,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;GAMG;AACH,qBAAa,oBAAoB;IAC7B;;;;;;;;;;;;;OAaG;WACU,YAAY,CAAC,QAAQ,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAKvF;;OAEG;mBACkB,iBAAiB;CAqBzC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dynamic Package Loading
|
|
3
|
+
*
|
|
4
|
+
* Provides runtime dynamic import capabilities for MJ Open App packages.
|
|
5
|
+
* Used by MJAPI startup to load server-side app bootstrap packages that
|
|
6
|
+
* register their classes with the ClassFactory via @RegisterClass decorators.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Utility class for dynamically loading npm packages at runtime.
|
|
10
|
+
*
|
|
11
|
+
* Used during MJAPI startup to load Open App server-side bootstrap packages.
|
|
12
|
+
* Each package is loaded in isolation — a failure in one package does not
|
|
13
|
+
* prevent others from loading.
|
|
14
|
+
*/
|
|
15
|
+
export class DynamicPackageLoader {
|
|
16
|
+
/**
|
|
17
|
+
* Loads all enabled dynamic packages in parallel for better performance.
|
|
18
|
+
* For each package:
|
|
19
|
+
* 1. Skips if `Enabled` is false
|
|
20
|
+
* 2. Dynamically imports the package via `await import()`
|
|
21
|
+
* 3. Calls the named `StartupExport` function if it exists
|
|
22
|
+
* 4. Records success or failure
|
|
23
|
+
*
|
|
24
|
+
* Errors are isolated per-package — a broken package does not crash the server.
|
|
25
|
+
* All enabled packages are loaded concurrently using Promise.all().
|
|
26
|
+
*
|
|
27
|
+
* @param packages - Array of packages to load
|
|
28
|
+
* @returns Array of results indicating success/failure for each package
|
|
29
|
+
*/
|
|
30
|
+
static async LoadPackages(packages) {
|
|
31
|
+
const enabledPackages = packages.filter(p => p.Enabled);
|
|
32
|
+
return Promise.all(enabledPackages.map(pkg => DynamicPackageLoader.LoadSinglePackage(pkg)));
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Attempts to dynamically import a single package and call its startup export.
|
|
36
|
+
*/
|
|
37
|
+
static async LoadSinglePackage(pkg) {
|
|
38
|
+
try {
|
|
39
|
+
const module = await import(pkg.PackageName);
|
|
40
|
+
if (pkg.StartupExport && typeof module[pkg.StartupExport] === 'function') {
|
|
41
|
+
module[pkg.StartupExport]();
|
|
42
|
+
}
|
|
43
|
+
return { PackageName: pkg.PackageName, Success: true };
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
47
|
+
console.error(`Failed to load dynamic package ${pkg.PackageName}: ${errorMessage}`);
|
|
48
|
+
return {
|
|
49
|
+
PackageName: pkg.PackageName,
|
|
50
|
+
Success: false,
|
|
51
|
+
Error: errorMessage
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=DynamicPackageLoader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DynamicPackageLoader.js","sourceRoot":"","sources":["../src/DynamicPackageLoader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAkCH;;;;;;GAMG;AACH,MAAM,OAAO,oBAAoB;IAC7B;;;;;;;;;;;;;OAaG;IACH,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,QAA8B;QACpD,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACxD,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAChG,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,GAAuB;QAC1D,IAAI,CAAC;YACD,MAAM,MAAM,GAA4B,MAAM,MAAM,CAAC,GAAG,CAAC,WAAW,CAA4B,CAAC;YAEjG,IAAI,GAAG,CAAC,aAAa,IAAI,OAAO,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,UAAU,EAAE,CAAC;gBACtE,MAAM,CAAC,GAAG,CAAC,aAAa,CAAgB,EAAE,CAAC;YAChD,CAAC;YAED,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3D,CAAC;QACD,OAAO,KAAc,EAAE,CAAC;YACpB,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5E,OAAO,CAAC,KAAK,CAAC,kCAAkC,GAAG,CAAC,WAAW,KAAK,YAAY,EAAE,CAAC,CAAC;YAEpF,OAAO;gBACH,WAAW,EAAE,GAAG,CAAC,WAAW;gBAC5B,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,YAAY;aACtB,CAAC;QACN,CAAC;IACL,CAAC;CACJ"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAChE,cAAc,aAAa,CAAA;AAC3B,cAAc,QAAQ,CAAA;AACtB,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAA;AACjC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,2BAA2B,CAAA;AACzC,cAAc,0BAA0B,CAAA;AACxC,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AAMjC,cAAc,UAAU,CAAA;AACxB,cAAc,iBAAiB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAChE,cAAc,aAAa,CAAA;AAC3B,cAAc,QAAQ,CAAA;AACtB,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAA;AACjC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,2BAA2B,CAAA;AACzC,cAAc,0BAA0B,CAAA;AACxC,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AAMjC,cAAc,UAAU,CAAA;AACxB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,wBAAwB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -18,6 +18,7 @@ export * from './EncryptionUtils.js';
|
|
|
18
18
|
// Export the main classes
|
|
19
19
|
export * from './Global.js';
|
|
20
20
|
export * from './RegisterClass.js';
|
|
21
|
+
export * from './DynamicPackageLoader.js';
|
|
21
22
|
// NOTE: RegisterForStartup has moved to @memberjunction/core
|
|
22
23
|
// Import from there instead of here
|
|
23
24
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAChE,cAAc,aAAa,CAAA;AAC3B,cAAc,QAAQ,CAAA;AACtB,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAA;AACjC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,2BAA2B,CAAA;AACzC,cAAc,0BAA0B,CAAA;AACxC,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AAEjC,2DAA2D;AAC3D,oCAAoC;AAEpC,0BAA0B;AAC1B,cAAc,UAAU,CAAA;AACxB,cAAc,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAChE,cAAc,aAAa,CAAA;AAC3B,cAAc,QAAQ,CAAA;AACtB,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAA;AACjC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,2BAA2B,CAAA;AACzC,cAAc,0BAA0B,CAAA;AACxC,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AAEjC,2DAA2D;AAC3D,oCAAoC;AAEpC,0BAA0B;AAC1B,cAAc,UAAU,CAAA;AACxB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,wBAAwB,CAAA;AAEtC,6DAA6D;AAC7D,oCAAoC"}
|
package/dist/warningManager.d.ts
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* ```typescript
|
|
13
13
|
* const wm = WarningManager.Instance;
|
|
14
14
|
* wm.RecordEntityDeprecationWarning('User Preferences', 'BaseEntity::constructor');
|
|
15
|
-
* wm.RecordFieldDeprecationWarning('AI Prompts', 'OldField', '
|
|
15
|
+
* wm.RecordFieldDeprecationWarning('MJ: AI Prompts', 'OldField', 'MJAIPromptEntity::validate');
|
|
16
16
|
* wm.RecordFieldNotFoundWarning('Users', 'DeletedColumn', 'BaseEntity::SetMany');
|
|
17
17
|
* // Warnings will be flushed automatically after debounce period
|
|
18
18
|
* ```
|
|
@@ -86,7 +86,7 @@ export declare class WarningManager {
|
|
|
86
86
|
*
|
|
87
87
|
* @param entityName - The name of the entity containing the deprecated field
|
|
88
88
|
* @param fieldName - The name of the deprecated field
|
|
89
|
-
* @param callerName - The name of the caller (e.g., '
|
|
89
|
+
* @param callerName - The name of the caller (e.g., 'MJAIPromptEntity::validate')
|
|
90
90
|
* @returns true if this warning should be emitted immediately (when ShowAll is true)
|
|
91
91
|
*/
|
|
92
92
|
RecordFieldDeprecationWarning(entityName: string, fieldName: string, callerName: string): boolean;
|
package/dist/warningManager.js
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* ```typescript
|
|
13
13
|
* const wm = WarningManager.Instance;
|
|
14
14
|
* wm.RecordEntityDeprecationWarning('User Preferences', 'BaseEntity::constructor');
|
|
15
|
-
* wm.RecordFieldDeprecationWarning('AI Prompts', 'OldField', '
|
|
15
|
+
* wm.RecordFieldDeprecationWarning('MJ: AI Prompts', 'OldField', 'MJAIPromptEntity::validate');
|
|
16
16
|
* wm.RecordFieldNotFoundWarning('Users', 'DeletedColumn', 'BaseEntity::SetMany');
|
|
17
17
|
* // Warnings will be flushed automatically after debounce period
|
|
18
18
|
* ```
|
|
@@ -113,7 +113,7 @@ export class WarningManager {
|
|
|
113
113
|
*
|
|
114
114
|
* @param entityName - The name of the entity containing the deprecated field
|
|
115
115
|
* @param fieldName - The name of the deprecated field
|
|
116
|
-
* @param callerName - The name of the caller (e.g., '
|
|
116
|
+
* @param callerName - The name of the caller (e.g., 'MJAIPromptEntity::validate')
|
|
117
117
|
* @returns true if this warning should be emitted immediately (when ShowAll is true)
|
|
118
118
|
*/
|
|
119
119
|
RecordFieldDeprecationWarning(entityName, fieldName, callerName) {
|
package/package.json
CHANGED