@memberjunction/global 5.12.0 → 5.14.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/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/DynamicPackageLoader.d.ts +0 -85
- package/dist/DynamicPackageLoader.d.ts.map +0 -1
- package/dist/DynamicPackageLoader.js +0 -64
- package/dist/DynamicPackageLoader.js.map +0 -1
- package/dist/__tests__/DynamicPackageLoader.test.d.ts +0 -2
- package/dist/__tests__/DynamicPackageLoader.test.d.ts.map +0 -1
- package/dist/__tests__/DynamicPackageLoader.test.js +0 -122
- package/dist/__tests__/DynamicPackageLoader.test.js.map +0 -1
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,kBAAkB,CAAC;AACjC,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,kBAAkB,CAAC;AACjC,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"}
|
package/dist/index.js
CHANGED
|
@@ -19,7 +19,6 @@ export * from './EncryptionUtils.js';
|
|
|
19
19
|
// Export the main classes
|
|
20
20
|
export * from './Global.js';
|
|
21
21
|
export * from './RegisterClass.js';
|
|
22
|
-
export * from './DynamicPackageLoader.js';
|
|
23
22
|
// NOTE: RegisterForStartup has moved to @memberjunction/core
|
|
24
23
|
// Import from there instead of here
|
|
25
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,kBAAkB,CAAC;AACjC,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,kBAAkB,CAAC;AACjC,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"}
|
package/package.json
CHANGED
|
@@ -1,85 +0,0 @@
|
|
|
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
|
-
* 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>;
|
|
41
|
-
/**
|
|
42
|
-
* Result of attempting to dynamically load a single package.
|
|
43
|
-
*/
|
|
44
|
-
export interface DynamicLoadResult {
|
|
45
|
-
/** The package that was loaded (or failed to load) */
|
|
46
|
-
PackageName: string;
|
|
47
|
-
/** Whether the package was loaded and its startup export called successfully */
|
|
48
|
-
Success: boolean;
|
|
49
|
-
/** Error message if the load failed */
|
|
50
|
-
Error?: string;
|
|
51
|
-
/** Configuration returned by the startup function, if any */
|
|
52
|
-
Result?: DynamicPackageResult;
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Utility class for dynamically loading npm packages at runtime.
|
|
56
|
-
*
|
|
57
|
-
* Used during MJAPI startup to load Open App server-side bootstrap packages.
|
|
58
|
-
* Each package is loaded in isolation — a failure in one package does not
|
|
59
|
-
* prevent others from loading.
|
|
60
|
-
*/
|
|
61
|
-
export declare class DynamicPackageLoader {
|
|
62
|
-
/**
|
|
63
|
-
* Loads all enabled dynamic packages in parallel for better performance.
|
|
64
|
-
* For each package:
|
|
65
|
-
* 1. Skips if `Enabled` is false
|
|
66
|
-
* 2. Dynamically imports the package via `await import()`
|
|
67
|
-
* 3. Calls the named `StartupExport` function if it exists
|
|
68
|
-
* 4. Records success or failure (including any returned configuration)
|
|
69
|
-
*
|
|
70
|
-
* Errors are isolated per-package — a broken package does not crash the server.
|
|
71
|
-
* All enabled packages are loaded concurrently using Promise.all().
|
|
72
|
-
*
|
|
73
|
-
* @param packages - Array of packages to load
|
|
74
|
-
* @returns Array of results indicating success/failure for each package
|
|
75
|
-
*/
|
|
76
|
-
static LoadPackages(packages: DynamicPackageLoad[]): Promise<DynamicLoadResult[]>;
|
|
77
|
-
/**
|
|
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.
|
|
82
|
-
*/
|
|
83
|
-
private static LoadSinglePackage;
|
|
84
|
-
}
|
|
85
|
-
//# sourceMappingURL=DynamicPackageLoader.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1,64 +0,0 @@
|
|
|
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 (including any returned configuration)
|
|
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
|
-
* 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.
|
|
39
|
-
*/
|
|
40
|
-
static async LoadSinglePackage(pkg) {
|
|
41
|
-
try {
|
|
42
|
-
const module = await import(pkg.PackageName);
|
|
43
|
-
let result;
|
|
44
|
-
if (pkg.StartupExport && typeof module[pkg.StartupExport] === 'function') {
|
|
45
|
-
const startupFn = module[pkg.StartupExport];
|
|
46
|
-
const returnValue = await Promise.resolve(startupFn());
|
|
47
|
-
if (returnValue && typeof returnValue === 'object') {
|
|
48
|
-
result = returnValue;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
return { PackageName: pkg.PackageName, Success: true, Result: result };
|
|
52
|
-
}
|
|
53
|
-
catch (error) {
|
|
54
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
55
|
-
console.error(`Failed to load dynamic package ${pkg.PackageName}: ${errorMessage}`);
|
|
56
|
-
return {
|
|
57
|
-
PackageName: pkg.PackageName,
|
|
58
|
-
Success: false,
|
|
59
|
-
Error: errorMessage
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
//# sourceMappingURL=DynamicPackageLoader.js.map
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DynamicPackageLoader.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/DynamicPackageLoader.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,122 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DynamicPackageLoader.test.js","sourceRoot":"","sources":["../../src/__tests__/DynamicPackageLoader.test.ts"],"names":[],"mappings":"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"}
|