@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.
@@ -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
@@ -14,4 +14,5 @@ export * from './warningManager.js';
14
14
  export * from './EncryptionUtils.js';
15
15
  export * from './Global.js';
16
16
  export * from './RegisterClass.js';
17
+ export * from './DynamicPackageLoader.js';
17
18
  //# sourceMappingURL=index.d.ts.map
@@ -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;AAE/B,6DAA6D;AAC7D,oCAAoC"}
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"}
@@ -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', 'AIPromptEntity::validate');
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., 'AIPromptEntity::validate')
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;
@@ -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', 'AIPromptEntity::validate');
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., 'AIPromptEntity::validate')
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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@memberjunction/global",
3
3
  "type": "module",
4
- "version": "4.4.0",
4
+ "version": "5.1.0",
5
5
  "description": "MemberJunction: Global Object - Needed for ALL other MJ components",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",