@memberjunction/metadata-sync 5.51.2 → 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.
Files changed (67) hide show
  1. package/README.md +21 -0
  2. package/dist/index.d.ts +3 -0
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +3 -0
  5. package/dist/index.js.map +1 -1
  6. package/dist/lib/config-manager.d.ts +11 -0
  7. package/dist/lib/config-manager.d.ts.map +1 -1
  8. package/dist/lib/config-manager.js +23 -0
  9. package/dist/lib/config-manager.js.map +1 -1
  10. package/dist/lib/dynamic-packages/discover.d.ts +38 -0
  11. package/dist/lib/dynamic-packages/discover.d.ts.map +1 -0
  12. package/dist/lib/dynamic-packages/discover.js +178 -0
  13. package/dist/lib/dynamic-packages/discover.js.map +1 -0
  14. package/dist/lib/dynamic-packages/host-import.d.ts +43 -0
  15. package/dist/lib/dynamic-packages/host-import.d.ts.map +1 -0
  16. package/dist/lib/dynamic-packages/host-import.js +170 -0
  17. package/dist/lib/dynamic-packages/host-import.js.map +1 -0
  18. package/dist/lib/dynamic-packages/index.d.ts +42 -0
  19. package/dist/lib/dynamic-packages/index.d.ts.map +1 -0
  20. package/dist/lib/dynamic-packages/index.js +6 -0
  21. package/dist/lib/dynamic-packages/index.js.map +1 -0
  22. package/dist/lib/dynamic-packages/loader.d.ts +114 -0
  23. package/dist/lib/dynamic-packages/loader.d.ts.map +1 -0
  24. package/dist/lib/dynamic-packages/loader.js +404 -0
  25. package/dist/lib/dynamic-packages/loader.js.map +1 -0
  26. package/dist/lib/dynamic-packages/mode.d.ts +27 -0
  27. package/dist/lib/dynamic-packages/mode.d.ts.map +1 -0
  28. package/dist/lib/dynamic-packages/mode.js +60 -0
  29. package/dist/lib/dynamic-packages/mode.js.map +1 -0
  30. package/dist/lib/dynamic-packages/process-id.d.ts +54 -0
  31. package/dist/lib/dynamic-packages/process-id.d.ts.map +1 -0
  32. package/dist/lib/dynamic-packages/process-id.js +104 -0
  33. package/dist/lib/dynamic-packages/process-id.js.map +1 -0
  34. package/dist/lib/dynamic-packages/types.d.ts +153 -0
  35. package/dist/lib/dynamic-packages/types.d.ts.map +1 -0
  36. package/dist/lib/dynamic-packages/types.js +14 -0
  37. package/dist/lib/dynamic-packages/types.js.map +1 -0
  38. package/dist/lib/entity-subclass-guard.d.ts +13 -0
  39. package/dist/lib/entity-subclass-guard.d.ts.map +1 -0
  40. package/dist/lib/entity-subclass-guard.js +50 -0
  41. package/dist/lib/entity-subclass-guard.js.map +1 -0
  42. package/dist/lib/file-write-batch.d.ts +0 -4
  43. package/dist/lib/file-write-batch.d.ts.map +1 -1
  44. package/dist/lib/file-write-batch.js +10 -8
  45. package/dist/lib/file-write-batch.js.map +1 -1
  46. package/dist/lib/record-primary-key.d.ts +35 -0
  47. package/dist/lib/record-primary-key.d.ts.map +1 -0
  48. package/dist/lib/record-primary-key.js +44 -0
  49. package/dist/lib/record-primary-key.js.map +1 -0
  50. package/dist/lib/sync-dynamic-packages.d.ts +23 -0
  51. package/dist/lib/sync-dynamic-packages.d.ts.map +1 -0
  52. package/dist/lib/sync-dynamic-packages.js +64 -0
  53. package/dist/lib/sync-dynamic-packages.js.map +1 -0
  54. package/dist/lib/sync-engine.d.ts.map +1 -1
  55. package/dist/lib/sync-engine.js +7 -0
  56. package/dist/lib/sync-engine.js.map +1 -1
  57. package/dist/plugins/index.d.ts.map +1 -1
  58. package/dist/plugins/index.js +8 -2
  59. package/dist/plugins/index.js.map +1 -1
  60. package/dist/services/PullService.d.ts +0 -1
  61. package/dist/services/PullService.d.ts.map +1 -1
  62. package/dist/services/PullService.js +15 -19
  63. package/dist/services/PullService.js.map +1 -1
  64. package/dist/services/PushService.d.ts.map +1 -1
  65. package/dist/services/PushService.js +8 -0
  66. package/dist/services/PushService.js.map +1 -1
  67. 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
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
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;;IAM7B;;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;IAyClD;;;;OAIG;IACH,WAAW,IAAI,QAAQ,GAAG,IAAI;CAM/B;AAGD,eAAO,MAAM,aAAa,eAAyB,CAAC"}
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":"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"}
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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"}