@memberjunction/global 5.7.0 → 5.9.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 +25 -1
- package/dist/DynamicPackageLoader.d.ts.map +1 -1
- package/dist/DynamicPackageLoader.js +11 -3
- package/dist/DynamicPackageLoader.js.map +1 -1
- package/dist/Global.d.ts +14 -0
- package/dist/Global.d.ts.map +1 -1
- package/dist/Global.js +20 -0
- package/dist/Global.js.map +1 -1
- package/dist/__tests__/DynamicPackageLoader.test.d.ts +2 -0
- package/dist/__tests__/DynamicPackageLoader.test.d.ts.map +1 -0
- package/dist/__tests__/DynamicPackageLoader.test.js +122 -0
- package/dist/__tests__/DynamicPackageLoader.test.js.map +1 -0
- package/dist/__tests__/ProcessUUID.test.d.ts +2 -0
- package/dist/__tests__/ProcessUUID.test.d.ts.map +1 -0
- package/dist/__tests__/ProcessUUID.test.js +53 -0
- package/dist/__tests__/ProcessUUID.test.js.map +1 -0
- package/dist/__tests__/UUIDCompliance.test.js +3 -2
- package/dist/__tests__/UUIDCompliance.test.js.map +1 -1
- package/package.json +1 -1
|
@@ -19,6 +19,25 @@ export interface DynamicPackageLoad {
|
|
|
19
19
|
/** Whether this package should be loaded. Allows disabling without removing. */
|
|
20
20
|
Enabled: boolean;
|
|
21
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* Configuration returned by a startup function to declaratively register
|
|
24
|
+
* middleware, hooks, and plugins with the server startup pipeline.
|
|
25
|
+
*
|
|
26
|
+
* This type is intentionally a loose `Record<string, unknown>` because
|
|
27
|
+
* `@memberjunction/global` has no dependency on Express or Apollo types.
|
|
28
|
+
* The consuming layer (`@memberjunction/server-bootstrap`) casts this to
|
|
29
|
+
* `Partial<ServerExtensibilityOptions>` when merging into server options.
|
|
30
|
+
*
|
|
31
|
+
* Expected keys (typed by the consumer):
|
|
32
|
+
* - `ExpressMiddlewareBefore` — Express middleware before auth
|
|
33
|
+
* - `ExpressMiddlewarePostAuth` — Express middleware after auth
|
|
34
|
+
* - `ExpressMiddlewareAfter` — Express middleware after routes
|
|
35
|
+
* - `PreRunViewHooks` — Provider-level pre-RunView hooks
|
|
36
|
+
* - `PostRunViewHooks` — Provider-level post-RunView hooks
|
|
37
|
+
* - `PreSaveHooks` — Provider-level pre-Save hooks
|
|
38
|
+
* - `ApolloPlugins` — Apollo Server plugins
|
|
39
|
+
*/
|
|
40
|
+
export type DynamicPackageResult = Record<string, unknown>;
|
|
22
41
|
/**
|
|
23
42
|
* Result of attempting to dynamically load a single package.
|
|
24
43
|
*/
|
|
@@ -29,6 +48,8 @@ export interface DynamicLoadResult {
|
|
|
29
48
|
Success: boolean;
|
|
30
49
|
/** Error message if the load failed */
|
|
31
50
|
Error?: string;
|
|
51
|
+
/** Configuration returned by the startup function, if any */
|
|
52
|
+
Result?: DynamicPackageResult;
|
|
32
53
|
}
|
|
33
54
|
/**
|
|
34
55
|
* Utility class for dynamically loading npm packages at runtime.
|
|
@@ -44,7 +65,7 @@ export declare class DynamicPackageLoader {
|
|
|
44
65
|
* 1. Skips if `Enabled` is false
|
|
45
66
|
* 2. Dynamically imports the package via `await import()`
|
|
46
67
|
* 3. Calls the named `StartupExport` function if it exists
|
|
47
|
-
* 4. Records success or failure
|
|
68
|
+
* 4. Records success or failure (including any returned configuration)
|
|
48
69
|
*
|
|
49
70
|
* Errors are isolated per-package — a broken package does not crash the server.
|
|
50
71
|
* All enabled packages are loaded concurrently using Promise.all().
|
|
@@ -55,6 +76,9 @@ export declare class DynamicPackageLoader {
|
|
|
55
76
|
static LoadPackages(packages: DynamicPackageLoad[]): Promise<DynamicLoadResult[]>;
|
|
56
77
|
/**
|
|
57
78
|
* Attempts to dynamically import a single package and call its startup export.
|
|
79
|
+
* If the startup function returns a value, it is captured as `Result` on the
|
|
80
|
+
* load result. This allows Open Apps to declaratively return middleware, hooks,
|
|
81
|
+
* and plugins that get merged into the server options.
|
|
58
82
|
*/
|
|
59
83
|
private static LoadSinglePackage;
|
|
60
84
|
}
|
|
@@ -1 +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;
|
|
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;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE3D;;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;IAEf,6DAA6D;IAC7D,MAAM,CAAC,EAAE,oBAAoB,CAAC;CACjC;AAED;;;;;;GAMG;AACH,qBAAa,oBAAoB;IAC7B;;;;;;;;;;;;;OAaG;WACU,YAAY,CAAC,QAAQ,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAKvF;;;;;OAKG;mBACkB,iBAAiB;CA2BzC"}
|
|
@@ -19,7 +19,7 @@ export class DynamicPackageLoader {
|
|
|
19
19
|
* 1. Skips if `Enabled` is false
|
|
20
20
|
* 2. Dynamically imports the package via `await import()`
|
|
21
21
|
* 3. Calls the named `StartupExport` function if it exists
|
|
22
|
-
* 4. Records success or failure
|
|
22
|
+
* 4. Records success or failure (including any returned configuration)
|
|
23
23
|
*
|
|
24
24
|
* Errors are isolated per-package — a broken package does not crash the server.
|
|
25
25
|
* All enabled packages are loaded concurrently using Promise.all().
|
|
@@ -33,14 +33,22 @@ export class DynamicPackageLoader {
|
|
|
33
33
|
}
|
|
34
34
|
/**
|
|
35
35
|
* Attempts to dynamically import a single package and call its startup export.
|
|
36
|
+
* If the startup function returns a value, it is captured as `Result` on the
|
|
37
|
+
* load result. This allows Open Apps to declaratively return middleware, hooks,
|
|
38
|
+
* and plugins that get merged into the server options.
|
|
36
39
|
*/
|
|
37
40
|
static async LoadSinglePackage(pkg) {
|
|
38
41
|
try {
|
|
39
42
|
const module = await import(pkg.PackageName);
|
|
43
|
+
let result;
|
|
40
44
|
if (pkg.StartupExport && typeof module[pkg.StartupExport] === 'function') {
|
|
41
|
-
module[pkg.StartupExport]
|
|
45
|
+
const startupFn = module[pkg.StartupExport];
|
|
46
|
+
const returnValue = await Promise.resolve(startupFn());
|
|
47
|
+
if (returnValue && typeof returnValue === 'object') {
|
|
48
|
+
result = returnValue;
|
|
49
|
+
}
|
|
42
50
|
}
|
|
43
|
-
return { PackageName: pkg.PackageName, Success: true };
|
|
51
|
+
return { PackageName: pkg.PackageName, Success: true, Result: result };
|
|
44
52
|
}
|
|
45
53
|
catch (error) {
|
|
46
54
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DynamicPackageLoader.js","sourceRoot":"","sources":["../src/DynamicPackageLoader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"DynamicPackageLoader.js","sourceRoot":"","sources":["../src/DynamicPackageLoader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAyDH;;;;;;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;;;;;OAKG;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,MAAwC,CAAC;YAE7C,IAAI,GAAG,CAAC,aAAa,IAAI,OAAO,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,UAAU,EAAE,CAAC;gBACvE,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,aAAa,CAA6E,CAAC;gBACxH,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;gBACvD,IAAI,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;oBACjD,MAAM,GAAG,WAAW,CAAC;gBACzB,CAAC;YACL,CAAC;YAED,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAC3E,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/Global.d.ts
CHANGED
|
@@ -14,10 +14,24 @@ export declare class MJGlobal extends BaseSingleton<MJGlobal> {
|
|
|
14
14
|
private _components;
|
|
15
15
|
private _classFactory;
|
|
16
16
|
private _properties;
|
|
17
|
+
private _processUUID;
|
|
17
18
|
/**
|
|
18
19
|
* Returns the global instance of the MJGlobal class. This is a singleton class, so there is only one instance of it in the application. Do not directly create new instances of MJGlobal, always use this method to get the instance.
|
|
19
20
|
*/
|
|
20
21
|
static get Instance(): MJGlobal;
|
|
22
|
+
/**
|
|
23
|
+
* A unique identifier for this process instance, generated once on first access
|
|
24
|
+
* using a v4 UUID. Used to distinguish this server from others in distributed
|
|
25
|
+
* cache invalidation scenarios (e.g., Redis pub/sub). The value persists for
|
|
26
|
+
* the lifetime of the process and is stable across multiple accesses.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* const serverId = MJGlobal.Instance.ProcessUUID;
|
|
31
|
+
* // e.g., "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
get ProcessUUID(): string;
|
|
21
35
|
RegisterComponent(component: MJ.IMJComponent): void;
|
|
22
36
|
/**
|
|
23
37
|
* Resets the class to its initial state. Use very carefully and sparingly.
|
package/dist/Global.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Global.d.ts","sourceRoot":"","sources":["../src/Global.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAA;AACjC,OAAO,EAA0B,UAAU,EAAE,MAAM,MAAM,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"Global.d.ts","sourceRoot":"","sources":["../src/Global.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAA;AACjC,OAAO,EAA0B,UAAU,EAAE,MAAM,MAAM,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD;;GAEG;AACH,qBAAa,QAAS,SAAQ,aAAa,CAAC,QAAQ,CAAC;IAEjD,OAAO,CAAC,cAAc,CAAsC;IAM5D,OAAO,CAAC,oBAAoB,CAA4D;IAGxF,OAAO,CAAC,QAAQ,CAA8D;IAC9E,OAAO,CAAC,cAAc,CAAoE;IAE1F,OAAO,CAAC,WAAW,CAAyB;IAE5C,OAAO,CAAC,aAAa,CAAoC;IAEzD,OAAO,CAAC,WAAW,CAA6B;IAEhD,OAAO,CAAC,YAAY,CAAuB;IAE3C;;OAEG;IACH,WAAkB,QAAQ,IAAI,QAAQ,CAErC;IAED;;;;;;;;;;;OAWG;IACH,IAAW,WAAW,IAAI,MAAM,CAK/B;IAEM,iBAAiB,CAAC,SAAS,EAAE,EAAE,CAAC,YAAY;IAInD;;OAEG;IACI,KAAK;IAWZ;;;OAGG;IACI,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO;IAKnC;;;;OAIG;IACI,gBAAgB,CAAC,UAAU,GAAE,OAAe,GAAG,UAAU,CAAC,EAAE,CAAC,OAAO,CAAC;IAI5E;;OAEG;IACH,IAAW,YAAY,IAAI,YAAY,CAEtC;IAED;;OAEG;IACH,IAAW,UAAU,IAAI,EAAE,CAAC,gBAAgB,EAAE,CAE7C;IAGD,OAAO,CAAC,YAAY,CAAkC;IACtD;;OAEG;IACH,IAAW,WAAW,IAAI,WAAW,CAEpC;CACJ"}
|
package/dist/Global.js
CHANGED
|
@@ -2,6 +2,7 @@ import { Subject, ReplaySubject } from 'rxjs';
|
|
|
2
2
|
import { ClassFactory } from './ClassFactory.js';
|
|
3
3
|
import { ObjectCache } from './ObjectCache.js';
|
|
4
4
|
import { BaseSingleton } from './BaseSingleton.js';
|
|
5
|
+
import { uuidv4 } from './util.js';
|
|
5
6
|
/**
|
|
6
7
|
* Global class used for coordinating events, creating class instances, and managing components across MemberJunction
|
|
7
8
|
*/
|
|
@@ -22,6 +23,7 @@ export class MJGlobal extends BaseSingleton {
|
|
|
22
23
|
this._components = [];
|
|
23
24
|
this._classFactory = new ClassFactory();
|
|
24
25
|
this._properties = [];
|
|
26
|
+
this._processUUID = null;
|
|
25
27
|
this._objectCache = new ObjectCache();
|
|
26
28
|
}
|
|
27
29
|
/**
|
|
@@ -30,6 +32,24 @@ export class MJGlobal extends BaseSingleton {
|
|
|
30
32
|
static get Instance() {
|
|
31
33
|
return super.getInstance();
|
|
32
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* A unique identifier for this process instance, generated once on first access
|
|
37
|
+
* using a v4 UUID. Used to distinguish this server from others in distributed
|
|
38
|
+
* cache invalidation scenarios (e.g., Redis pub/sub). The value persists for
|
|
39
|
+
* the lifetime of the process and is stable across multiple accesses.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```typescript
|
|
43
|
+
* const serverId = MJGlobal.Instance.ProcessUUID;
|
|
44
|
+
* // e.g., "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
get ProcessUUID() {
|
|
48
|
+
if (!this._processUUID) {
|
|
49
|
+
this._processUUID = uuidv4();
|
|
50
|
+
}
|
|
51
|
+
return this._processUUID;
|
|
52
|
+
}
|
|
33
53
|
RegisterComponent(component) {
|
|
34
54
|
this._components.push(component);
|
|
35
55
|
}
|
package/dist/Global.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Global.js","sourceRoot":"","sources":["../src/Global.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,aAAa,EAAc,MAAM,MAAM,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"Global.js","sourceRoot":"","sources":["../src/Global.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,aAAa,EAAc,MAAM,MAAM,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC;;GAEG;AACH,MAAM,OAAO,QAAS,SAAQ,aAAuB;IAArD;;QACI,8CAA8C;QACtC,mBAAc,GAAwB,IAAI,OAAO,EAAE,CAAC;QAC5D,sFAAsF;QACtF,uFAAuF;QACvF,4EAA4E;QAC5E,uFAAuF;QACvF,wFAAwF;QAChF,yBAAoB,GAA8B,IAAI,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAExF,sDAAsD;QAC9C,aAAQ,GAA2B,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC;QACtE,mBAAc,GAA2B,IAAI,CAAC,oBAAoB,CAAC,YAAY,EAAE,CAAC;QAElF,gBAAW,GAAsB,EAAE,CAAC;QAEpC,kBAAa,GAAiB,IAAI,YAAY,EAAE,CAAC;QAEjD,gBAAW,GAA0B,EAAE,CAAC;QAExC,iBAAY,GAAkB,IAAI,CAAC;QA+EnC,iBAAY,GAAgB,IAAI,WAAW,EAAE,CAAC;IAO1D,CAAC;IApFG;;OAEG;IACI,MAAM,KAAK,QAAQ;QACtB,OAAO,KAAK,CAAC,WAAW,EAAY,CAAC;IACzC,CAAC;IAED;;;;;;;;;;;OAWG;IACH,IAAW,WAAW;QAClB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACrB,IAAI,CAAC,YAAY,GAAG,MAAM,EAAE,CAAC;QACjC,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IAEM,iBAAiB,CAAC,SAA0B;QAC/C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACI,KAAK;QACR,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QAEtB,IAAI,CAAC,cAAc,GAAI,IAAI,OAAO,EAAE,CAAC;QACrC,IAAI,CAAC,oBAAoB,GAAG,IAAI,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAE1D,sDAAsD;QACtD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC;QACnD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,oBAAoB,CAAC,YAAY,EAAE,CAAC;IACnE,CAAC;IAED;;;OAGG;IACI,UAAU,CAAC,KAAiB;QAC/B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC;IAED;;;;OAIG;IACI,gBAAgB,CAAC,aAAsB,KAAK;QAC/C,OAAO,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,IAAW,UAAU;QACjB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IAID;;OAEG;IACH,IAAW,WAAW;QAClB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;CACJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DynamicPackageLoader.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/DynamicPackageLoader.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
+
import { DynamicPackageLoader } from '../DynamicPackageLoader.js';
|
|
3
|
+
describe('DynamicPackageLoader', () => {
|
|
4
|
+
beforeEach(() => {
|
|
5
|
+
vi.restoreAllMocks();
|
|
6
|
+
});
|
|
7
|
+
describe('LoadSinglePackage — startup function return values', () => {
|
|
8
|
+
it('should capture a DynamicPackageResult returned by the startup function', async () => {
|
|
9
|
+
const mockResult = {
|
|
10
|
+
ExpressMiddlewarePostAuth: [vi.fn()],
|
|
11
|
+
PreRunViewHooks: [vi.fn()],
|
|
12
|
+
};
|
|
13
|
+
vi.doMock('fake-saas-package', () => ({
|
|
14
|
+
LoadSaaSServer: () => mockResult,
|
|
15
|
+
}));
|
|
16
|
+
const pkg = {
|
|
17
|
+
PackageName: 'fake-saas-package',
|
|
18
|
+
StartupExport: 'LoadSaaSServer',
|
|
19
|
+
AppName: 'TestSaaS',
|
|
20
|
+
Enabled: true,
|
|
21
|
+
};
|
|
22
|
+
const results = await DynamicPackageLoader.LoadPackages([pkg]);
|
|
23
|
+
expect(results).toHaveLength(1);
|
|
24
|
+
expect(results[0].Success).toBe(true);
|
|
25
|
+
expect(results[0].Result).toBeDefined();
|
|
26
|
+
expect(results[0].Result).toEqual(mockResult);
|
|
27
|
+
});
|
|
28
|
+
it('should capture async DynamicPackageResult from startup function', async () => {
|
|
29
|
+
const mockResult = {
|
|
30
|
+
PreSaveHooks: [vi.fn()],
|
|
31
|
+
};
|
|
32
|
+
vi.doMock('fake-async-package', () => ({
|
|
33
|
+
LoadAsyncServer: async () => mockResult,
|
|
34
|
+
}));
|
|
35
|
+
const pkg = {
|
|
36
|
+
PackageName: 'fake-async-package',
|
|
37
|
+
StartupExport: 'LoadAsyncServer',
|
|
38
|
+
AppName: 'TestAsync',
|
|
39
|
+
Enabled: true,
|
|
40
|
+
};
|
|
41
|
+
const results = await DynamicPackageLoader.LoadPackages([pkg]);
|
|
42
|
+
expect(results).toHaveLength(1);
|
|
43
|
+
expect(results[0].Success).toBe(true);
|
|
44
|
+
expect(results[0].Result).toEqual(mockResult);
|
|
45
|
+
});
|
|
46
|
+
it('should set Result to undefined when startup function returns void', async () => {
|
|
47
|
+
vi.doMock('fake-void-package', () => ({
|
|
48
|
+
LoadVoidServer: () => { },
|
|
49
|
+
}));
|
|
50
|
+
const pkg = {
|
|
51
|
+
PackageName: 'fake-void-package',
|
|
52
|
+
StartupExport: 'LoadVoidServer',
|
|
53
|
+
AppName: 'TestVoid',
|
|
54
|
+
Enabled: true,
|
|
55
|
+
};
|
|
56
|
+
const results = await DynamicPackageLoader.LoadPackages([pkg]);
|
|
57
|
+
expect(results).toHaveLength(1);
|
|
58
|
+
expect(results[0].Success).toBe(true);
|
|
59
|
+
expect(results[0].Result).toBeUndefined();
|
|
60
|
+
});
|
|
61
|
+
it('should set Result to undefined when no StartupExport is specified', async () => {
|
|
62
|
+
vi.doMock('fake-no-export-package', () => ({
|
|
63
|
+
SomeExport: 'not a function',
|
|
64
|
+
}));
|
|
65
|
+
const pkg = {
|
|
66
|
+
PackageName: 'fake-no-export-package',
|
|
67
|
+
StartupExport: '',
|
|
68
|
+
AppName: 'TestNoExport',
|
|
69
|
+
Enabled: true,
|
|
70
|
+
};
|
|
71
|
+
const results = await DynamicPackageLoader.LoadPackages([pkg]);
|
|
72
|
+
expect(results).toHaveLength(1);
|
|
73
|
+
expect(results[0].Success).toBe(true);
|
|
74
|
+
expect(results[0].Result).toBeUndefined();
|
|
75
|
+
});
|
|
76
|
+
it('should skip disabled packages', async () => {
|
|
77
|
+
const pkg = {
|
|
78
|
+
PackageName: 'fake-disabled-package',
|
|
79
|
+
StartupExport: 'LoadServer',
|
|
80
|
+
AppName: 'TestDisabled',
|
|
81
|
+
Enabled: false,
|
|
82
|
+
};
|
|
83
|
+
const results = await DynamicPackageLoader.LoadPackages([pkg]);
|
|
84
|
+
expect(results).toHaveLength(0);
|
|
85
|
+
});
|
|
86
|
+
it('should handle import failure gracefully and return error', async () => {
|
|
87
|
+
const pkg = {
|
|
88
|
+
PackageName: 'non-existent-package-xyz',
|
|
89
|
+
StartupExport: 'LoadServer',
|
|
90
|
+
AppName: 'TestFailure',
|
|
91
|
+
Enabled: true,
|
|
92
|
+
};
|
|
93
|
+
// Suppress the console.error from the loader
|
|
94
|
+
const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
95
|
+
const results = await DynamicPackageLoader.LoadPackages([pkg]);
|
|
96
|
+
expect(results).toHaveLength(1);
|
|
97
|
+
expect(results[0].Success).toBe(false);
|
|
98
|
+
expect(results[0].Error).toBeDefined();
|
|
99
|
+
expect(results[0].Result).toBeUndefined();
|
|
100
|
+
consoleSpy.mockRestore();
|
|
101
|
+
});
|
|
102
|
+
it('should load multiple packages concurrently and collect all results', async () => {
|
|
103
|
+
const resultA = { PreRunViewHooks: [vi.fn()] };
|
|
104
|
+
const resultB = { PreSaveHooks: [vi.fn()] };
|
|
105
|
+
vi.doMock('fake-package-a', () => ({
|
|
106
|
+
LoadA: () => resultA,
|
|
107
|
+
}));
|
|
108
|
+
vi.doMock('fake-package-b', () => ({
|
|
109
|
+
LoadB: () => resultB,
|
|
110
|
+
}));
|
|
111
|
+
const packages = [
|
|
112
|
+
{ PackageName: 'fake-package-a', StartupExport: 'LoadA', AppName: 'A', Enabled: true },
|
|
113
|
+
{ PackageName: 'fake-package-b', StartupExport: 'LoadB', AppName: 'B', Enabled: true },
|
|
114
|
+
];
|
|
115
|
+
const results = await DynamicPackageLoader.LoadPackages(packages);
|
|
116
|
+
expect(results).toHaveLength(2);
|
|
117
|
+
expect(results[0].Result).toEqual(resultA);
|
|
118
|
+
expect(results[1].Result).toEqual(resultB);
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
//# sourceMappingURL=DynamicPackageLoader.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DynamicPackageLoader.test.js","sourceRoot":"","sources":["../../src/__tests__/DynamicPackageLoader.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProcessUUID.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/ProcessUUID.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach } from 'vitest';
|
|
2
|
+
import { MJGlobal } from '../Global.js';
|
|
3
|
+
import { GetGlobalObjectStore } from '../util.js';
|
|
4
|
+
/**
|
|
5
|
+
* Helper to clear the MJGlobal singleton from the global object store
|
|
6
|
+
* so each test starts with a clean slate.
|
|
7
|
+
*/
|
|
8
|
+
function clearMJGlobalSingleton() {
|
|
9
|
+
const g = GetGlobalObjectStore();
|
|
10
|
+
if (g) {
|
|
11
|
+
for (const key of Object.keys(g)) {
|
|
12
|
+
if (key.startsWith('___SINGLETON__')) {
|
|
13
|
+
delete g[key];
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
describe('MJGlobal.ProcessUUID', () => {
|
|
19
|
+
beforeEach(() => {
|
|
20
|
+
clearMJGlobalSingleton();
|
|
21
|
+
});
|
|
22
|
+
it('should return a string', () => {
|
|
23
|
+
const uuid = MJGlobal.Instance.ProcessUUID;
|
|
24
|
+
expect(typeof uuid).toBe('string');
|
|
25
|
+
});
|
|
26
|
+
it('should return a valid UUID v4 format', () => {
|
|
27
|
+
const uuid = MJGlobal.Instance.ProcessUUID;
|
|
28
|
+
// UUID v4 format: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx (y is 8, 9, a, or b)
|
|
29
|
+
const uuidV4Regex = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
30
|
+
expect(uuid).toMatch(uuidV4Regex);
|
|
31
|
+
});
|
|
32
|
+
it('should return the same UUID on repeated calls (stable within a process)', () => {
|
|
33
|
+
const uuid1 = MJGlobal.Instance.ProcessUUID;
|
|
34
|
+
const uuid2 = MJGlobal.Instance.ProcessUUID;
|
|
35
|
+
const uuid3 = MJGlobal.Instance.ProcessUUID;
|
|
36
|
+
expect(uuid1).toBe(uuid2);
|
|
37
|
+
expect(uuid2).toBe(uuid3);
|
|
38
|
+
});
|
|
39
|
+
it('should return a non-empty string', () => {
|
|
40
|
+
const uuid = MJGlobal.Instance.ProcessUUID;
|
|
41
|
+
expect(uuid.length).toBeGreaterThan(0);
|
|
42
|
+
expect(uuid.length).toBe(36); // Standard UUID length with hyphens
|
|
43
|
+
});
|
|
44
|
+
it('should generate a new UUID for a new MJGlobal instance', () => {
|
|
45
|
+
const uuid1 = MJGlobal.Instance.ProcessUUID;
|
|
46
|
+
// Clear and get a fresh singleton
|
|
47
|
+
clearMJGlobalSingleton();
|
|
48
|
+
const uuid2 = MJGlobal.Instance.ProcessUUID;
|
|
49
|
+
// Different singleton instances should get different UUIDs
|
|
50
|
+
expect(uuid1).not.toBe(uuid2);
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
//# sourceMappingURL=ProcessUUID.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProcessUUID.test.js","sourceRoot":"","sources":["../../src/__tests__/ProcessUUID.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAE/C;;;GAGG;AACH,SAAS,sBAAsB;IAC3B,MAAM,CAAC,GAAG,oBAAoB,EAAE,CAAC;IACjC,IAAI,CAAC,EAAE,CAAC;QACJ,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/B,IAAI,GAAG,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBACnC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC;YAClB,CAAC;QACL,CAAC;IACL,CAAC;AACL,CAAC;AAED,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IAClC,UAAU,CAAC,GAAG,EAAE;QACZ,sBAAsB,EAAE,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAC9B,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC;QAC3C,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC5C,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC;QAC3C,4EAA4E;QAC5E,MAAM,WAAW,GAAG,wEAAwE,CAAC;QAC7F,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QAC/E,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC;QAC5C,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC;QAC5C,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QACxC,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,oCAAoC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAC9D,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC;QAC5C,kCAAkC;QAClC,sBAAsB,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC;QAC5C,2DAA2D;QAC3D,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -39,8 +39,9 @@ const EXCLUDE_PATTERNS = [
|
|
|
39
39
|
];
|
|
40
40
|
/** Known exceptions — files where .ID === is comparing non-UUID values (e.g., numeric IDs, string enum values) */
|
|
41
41
|
const KNOWN_EXCEPTIONS = {
|
|
42
|
-
// Add file paths (relative to packages/) and the reason they're excepted
|
|
43
|
-
// Example: 'SomePackage/src/file.ts': ['Uses numeric IDs, not UUIDs'],
|
|
42
|
+
// Add file paths (relative to packages/) and the reason they're excepted
|
|
43
|
+
// Example: 'SomePackage/src/file.ts': ['Uses numeric IDs, not UUIDs'],
|
|
44
|
+
'Angular/Explorer/dashboards/src/Integration/components/mapping-workspace/mapping-workspace.component.ts': ['LocalID is a local string identifier (e.g. "pending-1"), not a UUID'],
|
|
44
45
|
};
|
|
45
46
|
function shouldScanFile(filePath) {
|
|
46
47
|
if (!filePath.endsWith('.ts'))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UUIDCompliance.test.js","sourceRoot":"","sources":["../../src/__tests__/UUIDCompliance.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,0EAA0E;AAC1E,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,YAAY;AAEzE,oEAAoE;AACpE,MAAM,aAAa,GAAG;IAClB,qDAAqD,EAAM,sDAAsD;IACjH,iBAAiB,EAA2C,qBAAqB;IACjF,qDAAqD,EAAM,kBAAkB;IAC7E,iBAAiB,EAA2C,qBAAqB;IACjF,yBAAyB,EAAoC,6CAA6C;CAC7G,CAAC;AAEF,iDAAiD;AACjD,MAAM,gBAAgB,GAAG;IACrB,cAAc;IACd,UAAU;IACV,eAAe;IACf,aAAa;IACb,aAAa;IACb,WAAW;IACX,gBAAgB,EAAY,qBAAqB;IACjD,OAAO,EAAqB,8BAA8B;IAC1D,UAAU,EAAkB,yBAAyB;IACrD,QAAQ,EAAoB,mBAAmB;IAC/C,qBAAqB;CACxB,CAAC;AAEF,kHAAkH;AAClH,MAAM,gBAAgB,GAA6B;
|
|
1
|
+
{"version":3,"file":"UUIDCompliance.test.js","sourceRoot":"","sources":["../../src/__tests__/UUIDCompliance.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED