@memberjunction/metadata-sync 5.51.1 → 5.51.3
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/README.md +21 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/config-manager.d.ts +11 -0
- package/dist/lib/config-manager.d.ts.map +1 -1
- package/dist/lib/config-manager.js +23 -0
- package/dist/lib/config-manager.js.map +1 -1
- package/dist/lib/dynamic-packages/discover.d.ts +38 -0
- package/dist/lib/dynamic-packages/discover.d.ts.map +1 -0
- package/dist/lib/dynamic-packages/discover.js +178 -0
- package/dist/lib/dynamic-packages/discover.js.map +1 -0
- package/dist/lib/dynamic-packages/host-import.d.ts +43 -0
- package/dist/lib/dynamic-packages/host-import.d.ts.map +1 -0
- package/dist/lib/dynamic-packages/host-import.js +170 -0
- package/dist/lib/dynamic-packages/host-import.js.map +1 -0
- package/dist/lib/dynamic-packages/index.d.ts +42 -0
- package/dist/lib/dynamic-packages/index.d.ts.map +1 -0
- package/dist/lib/dynamic-packages/index.js +6 -0
- package/dist/lib/dynamic-packages/index.js.map +1 -0
- package/dist/lib/dynamic-packages/loader.d.ts +114 -0
- package/dist/lib/dynamic-packages/loader.d.ts.map +1 -0
- package/dist/lib/dynamic-packages/loader.js +404 -0
- package/dist/lib/dynamic-packages/loader.js.map +1 -0
- package/dist/lib/dynamic-packages/mode.d.ts +27 -0
- package/dist/lib/dynamic-packages/mode.d.ts.map +1 -0
- package/dist/lib/dynamic-packages/mode.js +60 -0
- package/dist/lib/dynamic-packages/mode.js.map +1 -0
- package/dist/lib/dynamic-packages/process-id.d.ts +54 -0
- package/dist/lib/dynamic-packages/process-id.d.ts.map +1 -0
- package/dist/lib/dynamic-packages/process-id.js +104 -0
- package/dist/lib/dynamic-packages/process-id.js.map +1 -0
- package/dist/lib/dynamic-packages/types.d.ts +153 -0
- package/dist/lib/dynamic-packages/types.d.ts.map +1 -0
- package/dist/lib/dynamic-packages/types.js +14 -0
- package/dist/lib/dynamic-packages/types.js.map +1 -0
- package/dist/lib/entity-subclass-guard.d.ts +13 -0
- package/dist/lib/entity-subclass-guard.d.ts.map +1 -0
- package/dist/lib/entity-subclass-guard.js +50 -0
- package/dist/lib/entity-subclass-guard.js.map +1 -0
- package/dist/lib/file-write-batch.d.ts +0 -4
- package/dist/lib/file-write-batch.d.ts.map +1 -1
- package/dist/lib/file-write-batch.js +10 -8
- package/dist/lib/file-write-batch.js.map +1 -1
- package/dist/lib/record-primary-key.d.ts +35 -0
- package/dist/lib/record-primary-key.d.ts.map +1 -0
- package/dist/lib/record-primary-key.js +44 -0
- package/dist/lib/record-primary-key.js.map +1 -0
- package/dist/lib/sync-dynamic-packages.d.ts +23 -0
- package/dist/lib/sync-dynamic-packages.d.ts.map +1 -0
- package/dist/lib/sync-dynamic-packages.js +64 -0
- package/dist/lib/sync-dynamic-packages.js.map +1 -0
- package/dist/lib/sync-engine.d.ts.map +1 -1
- package/dist/lib/sync-engine.js +7 -0
- package/dist/lib/sync-engine.js.map +1 -1
- package/dist/plugins/index.d.ts.map +1 -1
- package/dist/plugins/index.js +8 -2
- package/dist/plugins/index.js.map +1 -1
- package/dist/services/PullService.d.ts +0 -1
- package/dist/services/PullService.d.ts.map +1 -1
- package/dist/services/PullService.js +15 -19
- package/dist/services/PullService.js.map +1 -1
- package/dist/services/PushService.d.ts.map +1 -1
- package/dist/services/PushService.js +8 -0
- package/dist/services/PushService.js.map +1 -1
- package/package.json +13 -13
package/README.md
CHANGED
|
@@ -1084,6 +1084,27 @@ The following improvements apply automatically with no flags required:
|
|
|
1084
1084
|
|
|
1085
1085
|
**Batched pull queries** -- Pull operations pre-fetch related entities with a single `IN` query per type, replacing the previous N+1 query pattern (one query per parent record per related type).
|
|
1086
1086
|
|
|
1087
|
+
## Which entity class does a sync use?
|
|
1088
|
+
|
|
1089
|
+
`mj sync push` writes through `BaseEntity.Save()` and `mj sync pull` reads through entity objects,
|
|
1090
|
+
so an entity's custom validation, `Save()` override, lifecycle hooks and computed properties apply
|
|
1091
|
+
**only if the class that carries them is registered in the CLI process**. MJ core's classes always
|
|
1092
|
+
are (the CLI imports the class-registration manifest). An installed Open App's classes and the
|
|
1093
|
+
host's own generated entities are loaded by `mj sync push` / `mj sync pull` from `mj.config.cjs`
|
|
1094
|
+
before the database provider opens — the same way MJAPI loads them at boot:
|
|
1095
|
+
|
|
1096
|
+
- `codeGeneration.packages.entities` / `.actions` — the host's generated packages
|
|
1097
|
+
- `dynamicPackages.server[]` — Open App server packages (written by `mj app install`)
|
|
1098
|
+
|
|
1099
|
+
Entries honour `Enabled`, and can be scoped with `Processes` / `ExcludeProcesses` (process IDs
|
|
1100
|
+
`cli:sync:push` and `cli:sync:pull`; `'cli:sync'` covers both — e.g. for a package the host's
|
|
1101
|
+
MJAPI already imports statically). `MJ_DYNAMIC_PACKAGES=none mj sync push` skips them
|
|
1102
|
+
deliberately (restoring a dump, bulk ingestion without side effects). Run with `--verbose` to see
|
|
1103
|
+
what was loaded.
|
|
1104
|
+
|
|
1105
|
+
When no subclass is registered for an entity, push and pull **warn once per entity** ("No entity
|
|
1106
|
+
subclass is registered for 'X' …"); the warning never changes the exit code.
|
|
1107
|
+
|
|
1087
1108
|
## Configuration
|
|
1088
1109
|
|
|
1089
1110
|
The tool uses the existing `mj.config.cjs` for database configuration and a hierarchical structure of `.mj-sync.json` and `.mj-folder.json` files for sync behavior.
|
package/dist/index.d.ts
CHANGED
|
@@ -40,5 +40,8 @@ export { ValidationService } from './services/ValidationService.js';
|
|
|
40
40
|
export { FormattingService } from './services/FormattingService.js';
|
|
41
41
|
export { loadMJConfig, loadSyncConfig, loadEntityConfig, loadFolderConfig, type EntityConfig, type FolderConfig, type RelatedEntityConfig } from './config.js';
|
|
42
42
|
export { initializeProvider, cleanupProvider, getSystemUser, findEntityDirectories, getDataProvider } from './lib/provider-utils.js';
|
|
43
|
+
export { loadSyncDynamicPackages } from './lib/sync-dynamic-packages.js';
|
|
44
|
+
export type { LoadSyncDynamicPackagesOptions } from './lib/sync-dynamic-packages.js';
|
|
45
|
+
export { describeMissingEntitySubclass } from './lib/entity-subclass-guard.js';
|
|
43
46
|
export type { ValidationResult, ValidationError, ValidationWarning, EntityDependency, FileValidationResult, ValidationOptions, ReferenceType, ParsedReference } from './types/validation.js';
|
|
44
47
|
//# sourceMappingURL=index.d.ts.map
|
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,8DAA8D,CAAC;AAGtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,YAAY,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,YAAY,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,YAAY,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAG1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AACrH,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,YAAY,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,YAAY,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,YAAY,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAG1E,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEzE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAErF,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAErF,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7F,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,YAAY,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAEzG,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEzF,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAGjE,OAAO,EACL,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACzB,MAAM,UAAU,CAAC;AAGlB,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,qBAAqB,EACrB,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAG9B,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,EACjB,aAAa,EACb,eAAe,EAChB,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -32,4 +32,7 @@ export { FormattingService } from './services/FormattingService.js';
|
|
|
32
32
|
export { loadMJConfig, loadSyncConfig, loadEntityConfig, loadFolderConfig } from './config.js';
|
|
33
33
|
// Provider utilities
|
|
34
34
|
export { initializeProvider, cleanupProvider, getSystemUser, findEntityDirectories, getDataProvider } from './lib/provider-utils.js';
|
|
35
|
+
// Open App / generated-package loading for `mj sync` (5.x port of @memberjunction/dynamic-packages)
|
|
36
|
+
export { loadSyncDynamicPackages } from './lib/sync-dynamic-packages.js';
|
|
37
|
+
export { describeMissingEntitySubclass } from './lib/entity-subclass-guard.js';
|
|
35
38
|
//# 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,2FAA2F;AAC3F,OAAO,8DAA8D,CAAC;AAEtE,uBAAuB;AACvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAEhE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAG5D,yBAAyB;AACzB,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAE5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAEzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAE5E,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAE1E,kBAAkB;AAClB,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAGrD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAGrD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAGrD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAGzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAG/D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAGvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEjE,sBAAsB;AACtB,OAAO,EACL,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAIjB,MAAM,UAAU,CAAC;AAElB,qBAAqB;AACrB,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,qBAAqB,EACrB,eAAe,EAChB,MAAM,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAC3F,OAAO,8DAA8D,CAAC;AAEtE,uBAAuB;AACvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAEhE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAG5D,yBAAyB;AACzB,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAE5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAEzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAE5E,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAE1E,kBAAkB;AAClB,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAGrD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAGrD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAGrD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAGzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAG/D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAGvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEjE,sBAAsB;AACtB,OAAO,EACL,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAIjB,MAAM,UAAU,CAAC;AAElB,qBAAqB;AACrB,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,qBAAqB,EACrB,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAE9B,oGAAoG;AACpG,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAEtE,OAAO,EAAE,6BAA6B,EAAE,MAAM,6BAA6B,CAAC"}
|
|
@@ -19,6 +19,10 @@ export declare class ConfigManager extends BaseSingleton<ConfigManager> {
|
|
|
19
19
|
private originalCwd;
|
|
20
20
|
private mjConfig;
|
|
21
21
|
private configLoaded;
|
|
22
|
+
/** The mj.config.cjs object as the file exports it — before defaults are merged in. */
|
|
23
|
+
private rawMJConfig;
|
|
24
|
+
/** Absolute path of the mj.config.cjs that was loaded, when one was found. */
|
|
25
|
+
private mjConfigFilePath;
|
|
22
26
|
constructor();
|
|
23
27
|
/**
|
|
24
28
|
* Get the singleton instance of ConfigManager
|
|
@@ -54,6 +58,13 @@ export declare class ConfigManager extends BaseSingleton<ConfigManager> {
|
|
|
54
58
|
* Result is cached for subsequent calls; pass `forceReload=true` to invalidate.
|
|
55
59
|
*/
|
|
56
60
|
loadMJConfig(forceReload?: boolean): MJConfig | null;
|
|
61
|
+
/**
|
|
62
|
+
* The loaded mj.config.cjs exactly as the file exports it (no defaults merged), or `null` when
|
|
63
|
+
* none was loaded. The dynamic-package loader reads `dynamicPackages` / `codeGeneration` from it.
|
|
64
|
+
*/
|
|
65
|
+
getRawMJConfig(): Record<string, unknown> | null;
|
|
66
|
+
/** Absolute path of the loaded mj.config.cjs — the anchor dynamic packages resolve from. */
|
|
67
|
+
getMJConfigFilePath(): string | undefined;
|
|
57
68
|
/**
|
|
58
69
|
* Get the cached MJ configuration
|
|
59
70
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../src/lib/config-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAoCrC;;;;;;GAMG;AACH,qBAAa,aAAc,SAAQ,aAAa,CAAC,aAAa,CAAC;IAC7D,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,YAAY,CAAS;;
|
|
1
|
+
{"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../src/lib/config-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAoCrC;;;;;;GAMG;AACH,qBAAa,aAAc,SAAQ,aAAa,CAAC,aAAa,CAAC;IAC7D,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,YAAY,CAAS;IAC7B,uFAAuF;IACvF,OAAO,CAAC,WAAW,CAAwC;IAC3D,8EAA8E;IAC9E,OAAO,CAAC,gBAAgB,CAAqB;;IAM7C;;OAEG;IACH,WAAkB,QAAQ,IAAI,aAAa,CAE1C;IAED;;;;OAIG;IACH,cAAc,IAAI,MAAM;IAQxB;;;;OAIG;IACH,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIjC;;;;;;;;;;;;;;;;OAgBG;IACH,YAAY,CAAC,WAAW,UAAQ,GAAG,QAAQ,GAAG,IAAI;IA6ClD;;;OAGG;IACH,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAOhD,4FAA4F;IAC5F,mBAAmB,IAAI,MAAM,GAAG,SAAS;IAOzC;;;;OAIG;IACH,WAAW,IAAI,QAAQ,GAAG,IAAI;CAM/B;AAGD,eAAO,MAAM,aAAa,eAAyB,CAAC"}
|
|
@@ -55,6 +55,8 @@ export class ConfigManager extends BaseSingleton {
|
|
|
55
55
|
this.originalCwd = null;
|
|
56
56
|
this.mjConfig = null;
|
|
57
57
|
this.configLoaded = false;
|
|
58
|
+
/** The mj.config.cjs object as the file exports it — before defaults are merged in. */
|
|
59
|
+
this.rawMJConfig = null;
|
|
58
60
|
}
|
|
59
61
|
/**
|
|
60
62
|
* Get the singleton instance of ConfigManager
|
|
@@ -128,6 +130,8 @@ export class ConfigManager extends BaseSingleton {
|
|
|
128
130
|
// This ensures environment variables are used for database settings
|
|
129
131
|
// when not explicitly set in the config file
|
|
130
132
|
const userConfig = result?.config ?? {};
|
|
133
|
+
this.rawMJConfig = userConfig;
|
|
134
|
+
this.mjConfigFilePath = result?.filepath;
|
|
131
135
|
this.mjConfig = mergeConfigs(DEFAULT_SYNC_CONFIG, userConfig);
|
|
132
136
|
this.configLoaded = true;
|
|
133
137
|
return this.mjConfig;
|
|
@@ -135,10 +139,29 @@ export class ConfigManager extends BaseSingleton {
|
|
|
135
139
|
catch (error) {
|
|
136
140
|
console.error('Error loading MJ config:', error);
|
|
137
141
|
this.mjConfig = null;
|
|
142
|
+
this.rawMJConfig = null;
|
|
143
|
+
this.mjConfigFilePath = undefined;
|
|
138
144
|
this.configLoaded = true;
|
|
139
145
|
return null;
|
|
140
146
|
}
|
|
141
147
|
}
|
|
148
|
+
/**
|
|
149
|
+
* The loaded mj.config.cjs exactly as the file exports it (no defaults merged), or `null` when
|
|
150
|
+
* none was loaded. The dynamic-package loader reads `dynamicPackages` / `codeGeneration` from it.
|
|
151
|
+
*/
|
|
152
|
+
getRawMJConfig() {
|
|
153
|
+
if (!this.configLoaded) {
|
|
154
|
+
this.loadMJConfig();
|
|
155
|
+
}
|
|
156
|
+
return this.rawMJConfig;
|
|
157
|
+
}
|
|
158
|
+
/** Absolute path of the loaded mj.config.cjs — the anchor dynamic packages resolve from. */
|
|
159
|
+
getMJConfigFilePath() {
|
|
160
|
+
if (!this.configLoaded) {
|
|
161
|
+
this.loadMJConfig();
|
|
162
|
+
}
|
|
163
|
+
return this.mjConfigFilePath;
|
|
164
|
+
}
|
|
142
165
|
/**
|
|
143
166
|
* Get the cached MJ configuration
|
|
144
167
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../src/lib/config-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAC;AAErF,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,MAAM,eAAe,GAAG,wBAAwB,EAAE,CAAC;AAEnD;;;;;;;;;;GAUG;AACH,MAAM,mBAAmB,GAAsB;IAC7C,kEAAkE;IAClE,UAAU,EAAE,eAAe,IAAI,WAAW;IAC1C,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,WAAW;IAC1C,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO;QACzB,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;QACnC,CAAC,CAAC,CAAC,eAAe,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACpD,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW;IACnC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW;IACnC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW;IACnC,wBAAwB,EAAE,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;IAC9F,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,SAAS;IAC9C,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB;IAC5C,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,MAAM;IAClD,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,4BAA4B;QACxD,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,EAAE,CAAC;QACxD,CAAC,CAAC,SAAS;CACd,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,OAAO,aAAc,SAAQ,aAA4B;
|
|
1
|
+
{"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../src/lib/config-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { DiscoveredDynamicPackage, DynamicPackageTier, DynamicPackagesConfig } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* `codeGeneration.packages.<type>.name` keys that make sense for each tier. `angularForms` is
|
|
4
|
+
* a browser library and must never be imported into a Node process; `graphqlResolvers` has no
|
|
5
|
+
* meaning in a browser bundle.
|
|
6
|
+
*/
|
|
7
|
+
export declare const GENERATED_PACKAGE_TYPES_BY_TIER: Record<DynamicPackageTier, readonly string[]>;
|
|
8
|
+
/** The manifest file every Open App repository carries at its root. */
|
|
9
|
+
export declare const APP_MANIFEST_FILE_NAME = "mj-app.json";
|
|
10
|
+
/** Reads the `dynamicPackages` section off a raw config object, tolerating any shape. */
|
|
11
|
+
export declare function ReadDynamicPackagesConfig(config: Record<string, unknown> | null | undefined): DynamicPackagesConfig;
|
|
12
|
+
/** Entries for the host's own generated packages (`codeGeneration.packages`). */
|
|
13
|
+
export declare function DiscoverGeneratedPackages(config: Record<string, unknown> | null | undefined, tier: DynamicPackageTier): DiscoveredDynamicPackage[];
|
|
14
|
+
export interface AppManifestDiscovery {
|
|
15
|
+
/** Directory the manifest was read from. */
|
|
16
|
+
RepoDir: string;
|
|
17
|
+
/** `mj-app.json` `name`. */
|
|
18
|
+
AppName: string;
|
|
19
|
+
/** Directory under the repo that holds the app's workspace packages (`code.sourceDirectory`, default `packages`). */
|
|
20
|
+
SourceDirectory: string;
|
|
21
|
+
Entries: DiscoveredDynamicPackage[];
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Reads `mj-app.json` from `repoDir` and returns the packages a process of `tier` should
|
|
25
|
+
* load: `shared` libraries first (entities/actions register on import), then the tier's own
|
|
26
|
+
* packages, with each `startupExport` carried through. Returns `null` when there is no
|
|
27
|
+
* manifest, and throws only when a manifest exists but is not valid JSON — a corrupt file is
|
|
28
|
+
* a problem the operator must see, an absent one is the common case.
|
|
29
|
+
*/
|
|
30
|
+
export declare function DiscoverAppManifestPackages(repoDir: string, tier: DynamicPackageTier): AppManifestDiscovery | null;
|
|
31
|
+
/**
|
|
32
|
+
* Locates a workspace package by name under an app repo's source directory (one level deep,
|
|
33
|
+
* matching `code.sourceDirectory`), returning its directory. Used when the process runs inside
|
|
34
|
+
* the app's own repository: the package is a workspace member there, but under pnpm's strict
|
|
35
|
+
* layout nothing at the repo root can `require.resolve` it, so we find it on disk instead.
|
|
36
|
+
*/
|
|
37
|
+
export declare function FindWorkspacePackageDir(repoDir: string, sourceDirectory: string, packageName: string): string | null;
|
|
38
|
+
//# sourceMappingURL=discover.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../../src/lib/dynamic-packages/discover.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,wBAAwB,EAAuB,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAE3H;;;;GAIG;AACH,eAAO,MAAM,+BAA+B,EAAE,MAAM,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAGzF,CAAC;AAEF,uEAAuE;AACvE,eAAO,MAAM,sBAAsB,gBAAgB,CAAC;AAEpD,yFAAyF;AACzF,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GAAG,qBAAqB,CAWnH;AAkDD,iFAAiF;AACjF,wBAAgB,yBAAyB,CACrC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,EAClD,IAAI,EAAE,kBAAkB,GACzB,wBAAwB,EAAE,CAc5B;AAcD,MAAM,WAAW,oBAAoB;IACjC,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,qHAAqH;IACrH,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,wBAAwB,EAAE,CAAC;CACvC;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,GAAG,oBAAoB,GAAG,IAAI,CAwClH;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA0BpH"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Discovery — turns configuration into an ordered list of candidate entries, each tagged with
|
|
3
|
+
* where it came from. Order matters: the ClassFactory's load-order priority means a later
|
|
4
|
+
* registration wins, so the host's generated packages go first, then installed Open Apps
|
|
5
|
+
* (from `dynamicPackages`), then the app whose repository we are standing in (from
|
|
6
|
+
* `mj-app.json`), so the most local definition overrides the most generic one.
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync, readdirSync, readFileSync } from 'node:fs';
|
|
9
|
+
import path from 'node:path';
|
|
10
|
+
/**
|
|
11
|
+
* `codeGeneration.packages.<type>.name` keys that make sense for each tier. `angularForms` is
|
|
12
|
+
* a browser library and must never be imported into a Node process; `graphqlResolvers` has no
|
|
13
|
+
* meaning in a browser bundle.
|
|
14
|
+
*/
|
|
15
|
+
export const GENERATED_PACKAGE_TYPES_BY_TIER = {
|
|
16
|
+
server: ['entities', 'actions', 'graphqlResolvers'],
|
|
17
|
+
client: ['entities', 'actions', 'angularForms'],
|
|
18
|
+
};
|
|
19
|
+
/** The manifest file every Open App repository carries at its root. */
|
|
20
|
+
export const APP_MANIFEST_FILE_NAME = 'mj-app.json';
|
|
21
|
+
/** Reads the `dynamicPackages` section off a raw config object, tolerating any shape. */
|
|
22
|
+
export function ReadDynamicPackagesConfig(config) {
|
|
23
|
+
const raw = config?.dynamicPackages;
|
|
24
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {
|
|
25
|
+
return {};
|
|
26
|
+
}
|
|
27
|
+
const section = raw;
|
|
28
|
+
return {
|
|
29
|
+
server: sanitizeEntries(section.server),
|
|
30
|
+
client: sanitizeEntries(section.client),
|
|
31
|
+
policy: sanitizePolicy(section.policy),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function sanitizeEntries(raw) {
|
|
35
|
+
if (!Array.isArray(raw)) {
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
const entries = [];
|
|
39
|
+
for (const item of raw) {
|
|
40
|
+
if (!item || typeof item !== 'object') {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
const rec = item;
|
|
44
|
+
const name = typeof rec.PackageName === 'string' ? rec.PackageName.trim() : '';
|
|
45
|
+
if (!name) {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
entries.push({
|
|
49
|
+
PackageName: name,
|
|
50
|
+
StartupExport: typeof rec.StartupExport === 'string' && rec.StartupExport.trim() ? rec.StartupExport.trim() : undefined,
|
|
51
|
+
AppName: typeof rec.AppName === 'string' ? rec.AppName : undefined,
|
|
52
|
+
Enabled: rec.Enabled === false ? false : true,
|
|
53
|
+
Processes: stringList(rec.Processes),
|
|
54
|
+
ExcludeProcesses: stringList(rec.ExcludeProcesses),
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
return entries;
|
|
58
|
+
}
|
|
59
|
+
function stringList(raw) {
|
|
60
|
+
if (!Array.isArray(raw)) {
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
const list = raw.filter((v) => typeof v === 'string' && v.trim().length > 0);
|
|
64
|
+
return list.length > 0 ? list : undefined;
|
|
65
|
+
}
|
|
66
|
+
function sanitizePolicy(raw) {
|
|
67
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
const policy = {};
|
|
71
|
+
for (const [key, value] of Object.entries(raw)) {
|
|
72
|
+
if (typeof value === 'string') {
|
|
73
|
+
// Kept as-is (typed loosely); mode parsing decides validity and reports it.
|
|
74
|
+
policy[key] = value;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return Object.keys(policy).length > 0 ? policy : undefined;
|
|
78
|
+
}
|
|
79
|
+
/** Entries for the host's own generated packages (`codeGeneration.packages`). */
|
|
80
|
+
export function DiscoverGeneratedPackages(config, tier) {
|
|
81
|
+
const codeGeneration = config?.codeGeneration;
|
|
82
|
+
const packages = codeGeneration?.packages;
|
|
83
|
+
if (!packages || typeof packages !== 'object') {
|
|
84
|
+
return [];
|
|
85
|
+
}
|
|
86
|
+
const found = [];
|
|
87
|
+
for (const type of GENERATED_PACKAGE_TYPES_BY_TIER[tier]) {
|
|
88
|
+
const name = packages[type]?.name;
|
|
89
|
+
if (typeof name === 'string' && name.trim().length > 0) {
|
|
90
|
+
found.push({ Source: 'generated', Entry: { PackageName: name.trim(), Enabled: true } });
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return found;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Reads `mj-app.json` from `repoDir` and returns the packages a process of `tier` should
|
|
97
|
+
* load: `shared` libraries first (entities/actions register on import), then the tier's own
|
|
98
|
+
* packages, with each `startupExport` carried through. Returns `null` when there is no
|
|
99
|
+
* manifest, and throws only when a manifest exists but is not valid JSON — a corrupt file is
|
|
100
|
+
* a problem the operator must see, an absent one is the common case.
|
|
101
|
+
*/
|
|
102
|
+
export function DiscoverAppManifestPackages(repoDir, tier) {
|
|
103
|
+
const manifestPath = path.join(repoDir, APP_MANIFEST_FILE_NAME);
|
|
104
|
+
if (!existsSync(manifestPath)) {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
let manifest;
|
|
108
|
+
try {
|
|
109
|
+
manifest = JSON.parse(readFileSync(manifestPath, 'utf8'));
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
throw new Error(`Could not parse ${manifestPath}: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
|
|
113
|
+
}
|
|
114
|
+
const appName = typeof manifest.name === 'string' ? manifest.name : path.basename(repoDir);
|
|
115
|
+
const sourceDirectory = typeof manifest.code?.sourceDirectory === 'string' && manifest.code.sourceDirectory.trim()
|
|
116
|
+
? manifest.code.sourceDirectory.trim()
|
|
117
|
+
: 'packages';
|
|
118
|
+
const entries = [];
|
|
119
|
+
const push = (pkg) => {
|
|
120
|
+
const name = typeof pkg?.name === 'string' ? pkg.name.trim() : '';
|
|
121
|
+
if (!name) {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
entries.push({
|
|
125
|
+
Source: 'manifest',
|
|
126
|
+
WorkspaceHome: { RepoDir: repoDir, SourceDirectory: sourceDirectory },
|
|
127
|
+
Entry: {
|
|
128
|
+
PackageName: name,
|
|
129
|
+
StartupExport: typeof pkg.startupExport === 'string' && pkg.startupExport.trim() ? pkg.startupExport.trim() : undefined,
|
|
130
|
+
AppName: appName,
|
|
131
|
+
Enabled: true,
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
};
|
|
135
|
+
for (const pkg of manifest.packages?.shared ?? []) {
|
|
136
|
+
push(pkg);
|
|
137
|
+
}
|
|
138
|
+
for (const pkg of manifest.packages?.[tier] ?? []) {
|
|
139
|
+
push(pkg);
|
|
140
|
+
}
|
|
141
|
+
return { RepoDir: repoDir, AppName: appName, SourceDirectory: sourceDirectory, Entries: entries };
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Locates a workspace package by name under an app repo's source directory (one level deep,
|
|
145
|
+
* matching `code.sourceDirectory`), returning its directory. Used when the process runs inside
|
|
146
|
+
* the app's own repository: the package is a workspace member there, but under pnpm's strict
|
|
147
|
+
* layout nothing at the repo root can `require.resolve` it, so we find it on disk instead.
|
|
148
|
+
*/
|
|
149
|
+
export function FindWorkspacePackageDir(repoDir, sourceDirectory, packageName) {
|
|
150
|
+
const root = path.resolve(repoDir, sourceDirectory);
|
|
151
|
+
if (!existsSync(root)) {
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
let children;
|
|
155
|
+
try {
|
|
156
|
+
children = readdirSync(root);
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
for (const child of children) {
|
|
162
|
+
const pkgJsonPath = path.join(root, child, 'package.json');
|
|
163
|
+
if (!existsSync(pkgJsonPath)) {
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
try {
|
|
167
|
+
const pkgJson = JSON.parse(readFileSync(pkgJsonPath, 'utf8'));
|
|
168
|
+
if (pkgJson.name === packageName) {
|
|
169
|
+
return path.join(root, child);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
// unreadable package.json — not the one we want
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=discover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../../src/lib/dynamic-packages/discover.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* True when the error is a module-RESOLUTION failure (the module could not be found or
|
|
3
|
+
* reached), as opposed to a module that was found but threw while loading — the latter is
|
|
4
|
+
* a real error that must surface. ESM raises ERR_MODULE_NOT_FOUND, CommonJS resolution
|
|
5
|
+
* (createRequire) raises MODULE_NOT_FOUND, and an exports-map mismatch raises
|
|
6
|
+
* ERR_PACKAGE_PATH_NOT_EXPORTED. Some ESM loader shims (ts-node's, notably — the loader
|
|
7
|
+
* MJAPI runs under) throw resolution failures as PLAIN Errors with no code at all, so
|
|
8
|
+
* when there is no code, recognize Node's own resolver message instead.
|
|
9
|
+
*
|
|
10
|
+
* ⚠ Under ts-node's shim the coded branch never fires (the shim strips custom error
|
|
11
|
+
* properties crossing the module-hooks thread), so the message branch is LOAD-BEARING
|
|
12
|
+
* there: if a future Node rewords its resolver messages, this predicate must be updated
|
|
13
|
+
* or the pnpm fallback silently stops working under ts-node hosts.
|
|
14
|
+
*
|
|
15
|
+
* Keep in sync with `IsModuleResolutionFailure` in @memberjunction/open-app-engine's
|
|
16
|
+
* `src/install/migration-runner.ts` — same heuristic, duplicated because the engine
|
|
17
|
+
* cannot depend on this package and cross-package re-exports are disallowed.
|
|
18
|
+
*/
|
|
19
|
+
export declare function isResolutionFailure(error: unknown): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Resolves the on-disk `package.json` of a host-visible package so callers can
|
|
22
|
+
* introspect `memberjunction.serverExtensions` without relying on an exports map.
|
|
23
|
+
* Returns `null` when no host anchor can see the package.
|
|
24
|
+
*/
|
|
25
|
+
export declare function resolvePackageJsonFromHost(pkgName: string, configFilePath?: string): string | null;
|
|
26
|
+
/**
|
|
27
|
+
* Imports a runtime-configured package from the HOST application's context.
|
|
28
|
+
*
|
|
29
|
+
* Resolution and evaluation are handled separately on the fallback path: an anchor that
|
|
30
|
+
* cannot SEE the package means "try the next anchor", but once an anchor resolves it,
|
|
31
|
+
* any failure from loading the module (a missing transitive dependency, a throw in its
|
|
32
|
+
* top-level code) is the module's own problem and is surfaced as-is — never masked by
|
|
33
|
+
* the original "cannot find package" error.
|
|
34
|
+
*
|
|
35
|
+
* Note on the resolver: `createRequire().resolve` runs under CommonJS conditions, so a
|
|
36
|
+
* package whose exports map declares ONLY an `"import"` condition cannot be resolved by
|
|
37
|
+
* the fallback (surfaced with an actionable error). On a dual CJS/ESM package it selects
|
|
38
|
+
* the CJS entry, so `import()` of that file would load a second physical module instance
|
|
39
|
+
* alongside any ESM copy already in the process — fine for MJ-shaped single-condition
|
|
40
|
+
* packages, but keep it in mind before widening this mechanism.
|
|
41
|
+
*/
|
|
42
|
+
export declare function importFromHost(pkgName: string, configFilePath?: string): Promise<Record<string, unknown>>;
|
|
43
|
+
//# sourceMappingURL=host-import.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-import.d.ts","sourceRoot":"","sources":["../../../src/lib/dynamic-packages/host-import.ts"],"names":[],"mappings":"AAkBA;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAM3D;AAuCD;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAyBlG;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAyC/G"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Host-anchored dynamic import for runtime-configured packages.
|
|
3
|
+
*
|
|
4
|
+
* A bare `import(pkgName)` resolves from THIS package (dynamic-packages), which cannot
|
|
5
|
+
* declare packages whose names are only known at runtime — mj.config.cjs supplies them.
|
|
6
|
+
* npm's hoisted node_modules let that bare import resolve by accident; pnpm's strict
|
|
7
|
+
* per-package layout does not, because the packages are declared by (and linked into) the
|
|
8
|
+
* HOST application, e.g. MJAPI. `importFromHost` tries the bare import first (identical
|
|
9
|
+
* behavior to before on npm layouts) and, when the package cannot be resolved, retries
|
|
10
|
+
* from each host anchor — the working directory, the mj.config.cjs that named the
|
|
11
|
+
* package, and the process entrypoint. (Dynamic import is justified here as runtime
|
|
12
|
+
* plugin discovery: the names come from configuration, not code.)
|
|
13
|
+
*/
|
|
14
|
+
import { createRequire } from 'node:module';
|
|
15
|
+
import { readFileSync } from 'node:fs';
|
|
16
|
+
import { pathToFileURL } from 'node:url';
|
|
17
|
+
import path from 'node:path';
|
|
18
|
+
/**
|
|
19
|
+
* True when the error is a module-RESOLUTION failure (the module could not be found or
|
|
20
|
+
* reached), as opposed to a module that was found but threw while loading — the latter is
|
|
21
|
+
* a real error that must surface. ESM raises ERR_MODULE_NOT_FOUND, CommonJS resolution
|
|
22
|
+
* (createRequire) raises MODULE_NOT_FOUND, and an exports-map mismatch raises
|
|
23
|
+
* ERR_PACKAGE_PATH_NOT_EXPORTED. Some ESM loader shims (ts-node's, notably — the loader
|
|
24
|
+
* MJAPI runs under) throw resolution failures as PLAIN Errors with no code at all, so
|
|
25
|
+
* when there is no code, recognize Node's own resolver message instead.
|
|
26
|
+
*
|
|
27
|
+
* ⚠ Under ts-node's shim the coded branch never fires (the shim strips custom error
|
|
28
|
+
* properties crossing the module-hooks thread), so the message branch is LOAD-BEARING
|
|
29
|
+
* there: if a future Node rewords its resolver messages, this predicate must be updated
|
|
30
|
+
* or the pnpm fallback silently stops working under ts-node hosts.
|
|
31
|
+
*
|
|
32
|
+
* Keep in sync with `IsModuleResolutionFailure` in @memberjunction/open-app-engine's
|
|
33
|
+
* `src/install/migration-runner.ts` — same heuristic, duplicated because the engine
|
|
34
|
+
* cannot depend on this package and cross-package re-exports are disallowed.
|
|
35
|
+
*/
|
|
36
|
+
export function isResolutionFailure(error) {
|
|
37
|
+
const { code, message } = error ?? {};
|
|
38
|
+
if (code === 'ERR_MODULE_NOT_FOUND' || code === 'MODULE_NOT_FOUND' || code === 'ERR_PACKAGE_PATH_NOT_EXPORTED') {
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
return code === undefined && typeof message === 'string' && /^Cannot find (package|module) /.test(message);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Host anchors used to resolve runtime-configured packages. The mj.config.cjs that
|
|
45
|
+
* named the package is first — cwd can be a different checkout.
|
|
46
|
+
*/
|
|
47
|
+
function hostAnchors(configFilePath) {
|
|
48
|
+
return [
|
|
49
|
+
configFilePath,
|
|
50
|
+
path.join(process.cwd(), 'package.json'),
|
|
51
|
+
process.argv[1],
|
|
52
|
+
].filter((anchor) => typeof anchor === 'string' && anchor.length > 0);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Walks up from a resolved file looking for a `package.json` whose `name` matches.
|
|
56
|
+
* Used when the package's exports map does not expose `./package.json`.
|
|
57
|
+
*/
|
|
58
|
+
function findPackageJsonWithName(fromFile, pkgName) {
|
|
59
|
+
let dir = path.dirname(fromFile);
|
|
60
|
+
for (let i = 0; i < 8; i++) {
|
|
61
|
+
const candidate = path.join(dir, 'package.json');
|
|
62
|
+
try {
|
|
63
|
+
const json = JSON.parse(readFileSync(candidate, 'utf8'));
|
|
64
|
+
if (json.name === pkgName) {
|
|
65
|
+
return candidate;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// missing or unreadable — keep walking
|
|
70
|
+
}
|
|
71
|
+
const parent = path.dirname(dir);
|
|
72
|
+
if (parent === dir) {
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
dir = parent;
|
|
76
|
+
}
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Resolves the on-disk `package.json` of a host-visible package so callers can
|
|
81
|
+
* introspect `memberjunction.serverExtensions` without relying on an exports map.
|
|
82
|
+
* Returns `null` when no host anchor can see the package.
|
|
83
|
+
*/
|
|
84
|
+
export function resolvePackageJsonFromHost(pkgName, configFilePath) {
|
|
85
|
+
for (const anchor of hostAnchors(configFilePath)) {
|
|
86
|
+
const req = createRequire(anchor);
|
|
87
|
+
try {
|
|
88
|
+
return req.resolve(`${pkgName}/package.json`);
|
|
89
|
+
}
|
|
90
|
+
catch (resolveError) {
|
|
91
|
+
if (resolveError?.code === 'ERR_PACKAGE_PATH_NOT_EXPORTED') {
|
|
92
|
+
// exports map omits package.json — resolve the main entry and walk up.
|
|
93
|
+
}
|
|
94
|
+
else if (!isResolutionFailure(resolveError)) {
|
|
95
|
+
throw resolveError;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
try {
|
|
99
|
+
const main = req.resolve(pkgName);
|
|
100
|
+
const found = findPackageJsonWithName(main, pkgName);
|
|
101
|
+
if (found) {
|
|
102
|
+
return found;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
catch (mainError) {
|
|
106
|
+
if (!isResolutionFailure(mainError) && mainError?.code !== 'ERR_PACKAGE_PATH_NOT_EXPORTED') {
|
|
107
|
+
throw mainError;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Imports a runtime-configured package from the HOST application's context.
|
|
115
|
+
*
|
|
116
|
+
* Resolution and evaluation are handled separately on the fallback path: an anchor that
|
|
117
|
+
* cannot SEE the package means "try the next anchor", but once an anchor resolves it,
|
|
118
|
+
* any failure from loading the module (a missing transitive dependency, a throw in its
|
|
119
|
+
* top-level code) is the module's own problem and is surfaced as-is — never masked by
|
|
120
|
+
* the original "cannot find package" error.
|
|
121
|
+
*
|
|
122
|
+
* Note on the resolver: `createRequire().resolve` runs under CommonJS conditions, so a
|
|
123
|
+
* package whose exports map declares ONLY an `"import"` condition cannot be resolved by
|
|
124
|
+
* the fallback (surfaced with an actionable error). On a dual CJS/ESM package it selects
|
|
125
|
+
* the CJS entry, so `import()` of that file would load a second physical module instance
|
|
126
|
+
* alongside any ESM copy already in the process — fine for MJ-shaped single-condition
|
|
127
|
+
* packages, but keep it in mind before widening this mechanism.
|
|
128
|
+
*/
|
|
129
|
+
export async function importFromHost(pkgName, configFilePath) {
|
|
130
|
+
try {
|
|
131
|
+
return (await import(pkgName));
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
if (!isResolutionFailure(error)) {
|
|
135
|
+
throw error;
|
|
136
|
+
}
|
|
137
|
+
// Anchor priority: the mj.config.cjs that NAMED the package is the authoritative host,
|
|
138
|
+
// so it is consulted first — cwd can be a different checkout entirely (an operator
|
|
139
|
+
// launching instance A's server from instance B's directory would otherwise silently
|
|
140
|
+
// load B's copy). cwd and the process entrypoint are fallbacks for hosts whose config
|
|
141
|
+
// lives outside the tree that carries the packages (e.g. a workspace-root config with
|
|
142
|
+
// the packages linked into the app directory).
|
|
143
|
+
const anchors = hostAnchors(configFilePath);
|
|
144
|
+
let sawExportsMapMismatch = false;
|
|
145
|
+
for (const anchor of anchors) {
|
|
146
|
+
let resolved;
|
|
147
|
+
try {
|
|
148
|
+
resolved = createRequire(anchor).resolve(pkgName);
|
|
149
|
+
}
|
|
150
|
+
catch (resolveError) {
|
|
151
|
+
if (resolveError?.code === 'ERR_PACKAGE_PATH_NOT_EXPORTED') {
|
|
152
|
+
sawExportsMapMismatch = true;
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
if (!isResolutionFailure(resolveError)) {
|
|
156
|
+
throw resolveError;
|
|
157
|
+
}
|
|
158
|
+
continue; // this anchor can't see the package — try the next
|
|
159
|
+
}
|
|
160
|
+
// Resolved. Anything that fails from here is the module's own problem — surface it.
|
|
161
|
+
return (await import(pathToFileURL(resolved).href));
|
|
162
|
+
}
|
|
163
|
+
if (sawExportsMapMismatch) {
|
|
164
|
+
throw new Error(`Package '${pkgName}' is reachable from the host, but its exports map has no CJS-resolvable condition ` +
|
|
165
|
+
`(add a "default" or "require" condition to its package.json exports), so the host-anchored fallback cannot load it.`, { cause: error });
|
|
166
|
+
}
|
|
167
|
+
throw error; // no anchor resolved it — surface the original bare-import failure
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=host-import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-import.js","sourceRoot":"","sources":["../../../src/lib/dynamic-packages/host-import.ts"],"names":[],"mappings":"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"}
|