@memberjunction/metadata-sync 6.1.0-edge.5 → 6.1.0-edge.7

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 (75) hide show
  1. package/README.md +48 -3
  2. package/dist/config.d.ts +32 -0
  3. package/dist/config.d.ts.map +1 -1
  4. package/dist/config.js.map +1 -1
  5. package/dist/constants/metadata-keywords.d.ts +13 -2
  6. package/dist/constants/metadata-keywords.d.ts.map +1 -1
  7. package/dist/constants/metadata-keywords.js +12 -0
  8. package/dist/constants/metadata-keywords.js.map +1 -1
  9. package/dist/index.d.ts +2 -0
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +1 -0
  12. package/dist/index.js.map +1 -1
  13. package/dist/lib/RecordProcessor.d.ts +12 -0
  14. package/dist/lib/RecordProcessor.d.ts.map +1 -1
  15. package/dist/lib/RecordProcessor.js +163 -10
  16. package/dist/lib/RecordProcessor.js.map +1 -1
  17. package/dist/lib/batch-context-index.js +1 -1
  18. package/dist/lib/batch-context-index.js.map +1 -1
  19. package/dist/lib/collection-resolver.d.ts +24 -0
  20. package/dist/lib/collection-resolver.d.ts.map +1 -0
  21. package/dist/lib/collection-resolver.js +117 -0
  22. package/dist/lib/collection-resolver.js.map +1 -0
  23. package/dist/lib/database-reference-scanner.js +5 -5
  24. package/dist/lib/database-reference-scanner.js.map +1 -1
  25. package/dist/lib/deletion-auditor.d.ts.map +1 -1
  26. package/dist/lib/deletion-auditor.js +1 -0
  27. package/dist/lib/deletion-auditor.js.map +1 -1
  28. package/dist/lib/entity-subclass-guard.d.ts +10 -0
  29. package/dist/lib/entity-subclass-guard.d.ts.map +1 -0
  30. package/dist/lib/entity-subclass-guard.js +38 -0
  31. package/dist/lib/entity-subclass-guard.js.map +1 -0
  32. package/dist/lib/graph-provider-pool.d.ts +67 -0
  33. package/dist/lib/graph-provider-pool.d.ts.map +1 -0
  34. package/dist/lib/graph-provider-pool.js +149 -0
  35. package/dist/lib/graph-provider-pool.js.map +1 -0
  36. package/dist/lib/json-write-helper.d.ts +12 -8
  37. package/dist/lib/json-write-helper.d.ts.map +1 -1
  38. package/dist/lib/json-write-helper.js +54 -24
  39. package/dist/lib/json-write-helper.js.map +1 -1
  40. package/dist/lib/record-dependency-analyzer.d.ts +8 -0
  41. package/dist/lib/record-dependency-analyzer.d.ts.map +1 -1
  42. package/dist/lib/record-dependency-analyzer.js +20 -5
  43. package/dist/lib/record-dependency-analyzer.js.map +1 -1
  44. package/dist/lib/reference-parser.d.ts.map +1 -1
  45. package/dist/lib/reference-parser.js +1 -0
  46. package/dist/lib/reference-parser.js.map +1 -1
  47. package/dist/lib/sync-engine.d.ts +27 -4
  48. package/dist/lib/sync-engine.d.ts.map +1 -1
  49. package/dist/lib/sync-engine.js +94 -45
  50. package/dist/lib/sync-engine.js.map +1 -1
  51. package/dist/lib/sync-metadata-engine.d.ts +44 -1
  52. package/dist/lib/sync-metadata-engine.d.ts.map +1 -1
  53. package/dist/lib/sync-metadata-engine.js +152 -4
  54. package/dist/lib/sync-metadata-engine.js.map +1 -1
  55. package/dist/lib/transaction-manager.d.ts +2 -1
  56. package/dist/lib/transaction-manager.d.ts.map +1 -1
  57. package/dist/lib/transaction-manager.js +4 -1
  58. package/dist/lib/transaction-manager.js.map +1 -1
  59. package/dist/plugins/index.js +3 -3
  60. package/dist/plugins/index.js.map +1 -1
  61. package/dist/services/FormattingService.d.ts +8 -0
  62. package/dist/services/FormattingService.d.ts.map +1 -1
  63. package/dist/services/FormattingService.js +18 -0
  64. package/dist/services/FormattingService.js.map +1 -1
  65. package/dist/services/PullService.js +1 -1
  66. package/dist/services/PullService.js.map +1 -1
  67. package/dist/services/PushService.d.ts +53 -3
  68. package/dist/services/PushService.d.ts.map +1 -1
  69. package/dist/services/PushService.js +455 -143
  70. package/dist/services/PushService.js.map +1 -1
  71. package/dist/services/ValidationService.d.ts +26 -0
  72. package/dist/services/ValidationService.d.ts.map +1 -1
  73. package/dist/services/ValidationService.js +454 -14
  74. package/dist/services/ValidationService.js.map +1 -1
  75. package/package.json +14 -14
package/README.md CHANGED
@@ -658,11 +658,23 @@ Reference fields from the root entity in nested structures:
658
658
  - `@root:CategoryID` -- Get the root's CategoryID
659
659
  - Useful for deeply nested relationships
660
660
 
661
+ ### @owner: References
662
+ Reference fields synchronously in-memory from the owner record for children nested inside collections, embeds, or extensions:
663
+ - `@owner:ShipToPersonID` -- Copies the owner's `ShipToPersonID` value into a nested child or subtype extension field without database queries.
664
+ - Cannot be used at root level; valid only within child collections, embeds, or extensions where an enclosing owner entity exists.
665
+
661
666
  ### @env: References
662
667
  Support environment-specific values:
663
668
  - `@env:VARIABLE_NAME`
664
669
  - Useful for different environments (dev/staging/prod)
665
670
 
671
+ ### First-Class Composition Axes (`collections`, `embeds`, `extension`)
672
+ MetadataSync natively supports three composition axes directly within `RecordData`, persisted in a single `Save()` call on the root entity graph:
673
+ - **`collections`**: Declared `RelatedRecordCollection` sets (e.g. `Lines`, `AgendaItems`). Supports `upsert` mode (default: match by PK, leaves unmentioned items intact) and `authoritative` mode (configured in `.mj-sync.json`: computes deletion set, enforced with a 20% max implied delete safety rail unless `--allow-bulk-delete` is passed).
674
+ - **`embeds`**: 1:1 peer record embeds keyed by foreign key field name (e.g. `ShipToAddressID`). Peer records are ensured and assigned before parent entity save.
675
+ - **`extension`**: 1:1 IsA subtype extensions (e.g. `Event Order Lines` extending `Order Lines`). Leaf fields only (parent fields in leaf extensions are rejected during validation). Resolved automatically via prospective subtype resolution (`EnsureISAChild()`).
676
+
677
+
666
678
  ### Primary Key Handling
667
679
  The tool automatically detects primary key fields from entity metadata:
668
680
  - **Single primary keys**: Most common, stored as `{"ID": "value"}` or `{"CustomKeyName": "value"}`
@@ -989,6 +1001,24 @@ The inheritance works as follows:
989
1001
 
990
1002
  The `__mj_sync_notes` key uses a double underscore prefix (`__`) to clearly indicate it is system-managed. Do not manually edit this section -- it is regenerated on each push when `emitSyncNotes` is enabled.
991
1003
 
1004
+ ## Which entity class does a push use?
1005
+
1006
+ `mj sync push` writes through `BaseEntity.Save()`, so an entity's custom validation, `Save()`
1007
+ override and lifecycle hooks run **only if the class that carries them is registered in the CLI
1008
+ process**. MJ core's server subclasses always are (the CLI imports the lite manifest). An Open App's
1009
+ classes, and a host's own generated entities, are loaded by the `mj` prerun hook through
1010
+ `@memberjunction/dynamic-packages` from `mj.config.cjs` (`dynamicPackages.server[]`,
1011
+ `codeGeneration.packages`) and from an `mj-app.json` beside the config — before the push opens the
1012
+ database provider.
1013
+
1014
+ When no subclass is registered for an entity being pushed, the push **warns once per entity**
1015
+ ("No entity subclass is registered for 'X' … records will be written with the generic BaseEntity")
1016
+ on both the directory-push path and the lookup auto-create path; the warning lands in the result
1017
+ envelope's `warnings` and never changes the exit code. `--no-app-packages` (or
1018
+ `MJ_DYNAMIC_PACKAGES=none`) skips the app packages deliberately — restoring a dump, bulk ingestion
1019
+ without side effects. Details and troubleshooting:
1020
+ [`guides/DYNAMIC_PACKAGE_LOADING_GUIDE.md`](../../guides/DYNAMIC_PACKAGE_LOADING_GUIDE.md).
1021
+
992
1022
  ## CLI Commands
993
1023
 
994
1024
  All MetadataSync functionality is accessed through the MemberJunction CLI (`mj`) under the `sync` namespace:
@@ -1331,10 +1361,17 @@ The pull command supports smart update capabilities with extensive configuration
1331
1361
  },
1332
1362
  "ignoreNullFields": false,
1333
1363
  "ignoreVirtualFields": false
1364
+ },
1365
+ "push": {
1366
+ "skipGeoCoding": true
1334
1367
  }
1335
1368
  }
1336
1369
  ```
1337
1370
 
1371
+ `push.skipGeoCoding` maps to `EntitySaveOptions.SkipGeoCoding` for this entity only. Use it on display-only geo entities (People/Organizations whose coords are virtual `PrimaryAddressLatitude`). Do **not** use a global CLI `--skip-geocode` as the only control. Addresses with native lat/lng already set do not call the provider even without this flag.
1372
+
1373
+ Parallel `--parallel-batch-size` defaults to **10**. Isolation is **per JSON-root graph**, not per flattened row: an Action and its nested Action Params share one `CreateIndependentInstance()` (shared pool, own transaction stack), the same pattern MJAPI uses per request. Durable AfterCreate actions without a queue submitter fire after that instance's transaction depth is 0 — they must not nest in the caller's `EntityTransactionScope`.
1374
+
1338
1375
  ### Pull Configuration Options
1339
1376
 
1340
1377
  | Option | Type | Default | Description |
@@ -1504,10 +1541,18 @@ Records are automatically grouped into dependency levels:
1504
1541
  - **Level 1**: Records that depend only on Level 0 records
1505
1542
  - **Level 2**: Records that depend on Level 0 or Level 1 records
1506
1543
 
1507
- Records within the same dependency level can be safely processed in parallel.
1544
+ Records are grouped into **JSON-root graphs** (an Action and its nested Action Params share one graph). Each graph gets one `CreateIndependentInstance()`. After each parallel batch the pool releases a graph when it will not appear at a later level, **or** when `TransactionDepth` is already 0 (`Save()` settled, so a fresh instance at the next level is safe). Graphs with leftover depth stay live until their last level. Peak live independent instances is therefore bounded by `--parallel-batch-size`, plus any still-open leftover-depth graphs — not "always equal to the file's root count", and not "always equal to the batch size" if leftover depth is holding graphs across levels.
1545
+
1546
+ Every DB read and write for a graph — `GetEntityObject`, `Save`, `Load`, `RunView`, lookups, RecordGeoCode — must use that same provider. That is an **ORM** invariant (`BaseEntity.BindProvider`); mixing the host connection with a graph instance in one tree is a deadlock: the child FK waits on an uncommitted parent on another pooled connection. `BaseEntity.Save()` still opens and settles its own `EntityTransactionScope` per record; leftover depth (a subclass `BeginTransaction`, a nested entity action) is committed at drain on success and rolled back on failure. If the **first** `CreateIndependentInstance` in a file fails, **all** graphs in that file use the host (inside the push transaction). If it fails *after* independent instances already exist, the file is aborted — never a mix.
1547
+
1548
+ The first thrown record error **fails the file** (fail-fast). A record that returns `status: 'error'` without throwing (e.g. missing primaryKey with `autoCreateMissingRecords=false`) also prevents that graph's leftover depth from being committed.
1549
+
1550
+ **Sibling graphs** at the same dependency level run in parallel. The default `--parallel-batch-size` is **10**, not 1. Defaulting to 1 was a wrong workaround for mixed-provider hangs; pass `1` only when you want to serialize graphs for debugging. `--parallel-batch-size 1` does **not** mean one global provider — it only serializes graphs.
1551
+
1552
+ Releasing settled graphs between levels bounds peak live instances at the batch size. The cost is more `CreateIndependentInstance` calls (one per graph per level when `Save()` settles, so L×N instead of N, each doing a `Config()` / metadata round trip). That is the chosen tradeoff for a CLI. If a large push is slow, this is the first place to look.
1508
1553
 
1509
1554
  ```bash
1510
- # Default processing
1555
+ # Default processing (batch size 10, isolated providers)
1511
1556
  mj sync push
1512
1557
 
1513
1558
  # Process 20 records in parallel
@@ -1516,7 +1561,7 @@ mj sync push --parallel-batch-size=20
1516
1561
  # Maximum parallelism (50 records)
1517
1562
  mj sync push --parallel-batch-size=50
1518
1563
 
1519
- # Conservative approach for debugging
1564
+ # Serialize graphs for debugging — not the default
1520
1565
  mj sync push --parallel-batch-size=1
1521
1566
  ```
1522
1567
 
package/dist/config.d.ts CHANGED
@@ -224,6 +224,19 @@ export interface EntityConfig {
224
224
  * Examples: ["output", "examples", "temp"]
225
225
  */
226
226
  ignoreDirectories?: string[];
227
+ /**
228
+ * Declarative collection configuration for composition axes.
229
+ * Key is collection property name (e.g. "Lines", "Payments").
230
+ */
231
+ collections?: Record<string, {
232
+ /** Membership mode: 'upsert' (default) or 'authoritative' (opt-in) */
233
+ mode?: 'upsert' | 'authoritative';
234
+ /**
235
+ * Maximum percentage of loaded collection rows that can be implied-deleted
236
+ * under authoritative mode before push refuses (default: 20%).
237
+ */
238
+ maxImpliedDeletePercent?: number;
239
+ }>;
227
240
  /** Pull command specific configuration */
228
241
  pull?: {
229
242
  /** Glob pattern for finding existing files to update (defaults to filePattern) */
@@ -283,6 +296,25 @@ export interface EntityConfig {
283
296
  /** Whether to ignore virtual fields during pull (defaults to false) */
284
297
  ignoreVirtualFields?: boolean;
285
298
  };
299
+ /**
300
+ * Push-specific options for this entity directory. Applied only on `mj sync push`
301
+ * (not pull). Add new per-save / per-entity push knobs here rather than as global
302
+ * CLI flags so each entity can opt in independently.
303
+ */
304
+ push?: {
305
+ /**
306
+ * Maps to `EntitySaveOptions.SkipGeoCoding` so sample data with pre-filled
307
+ * lat/lng (or display-only geo entities) does not call the geocoding provider.
308
+ * Per-entity, not a global CLI kill switch.
309
+ */
310
+ skipGeoCoding?: boolean;
311
+ /**
312
+ * When false, skips creating or updating sync metadata blocks (`record.sync`)
313
+ * on records pushed from this directory. Used by decision metadata directories
314
+ * so decision files never carry sync blocks. Defaults to true.
315
+ */
316
+ writeSyncMetadata?: boolean;
317
+ };
286
318
  /**
287
319
  * Whether to emit __mj_sync_notes in record files during push operations.
288
320
  * When enabled, resolution information for @lookup and @parent references is written to files.
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AA0SrD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,aAAa,CAAC,YAAY,EAAE,CAAC;AACtC,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAW;IAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IAEnD,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;YACnD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAW;IAChD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IAEnD,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAC7C,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClB,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAW;IAChD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;IAErD,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;YACrD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AA0UrD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,aAAa,CAAC,YAAY,EAAE,CAAC;AACtC,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAW;IAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IAEnD,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;YACnD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAW;IAChD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IAEnD,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAC7C,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClB,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAW;IAChD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;IAErD,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;YACrD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -109,6 +109,17 @@ export declare const METADATA_KEYWORDS: {
109
109
  * "@template:templates/standard-ai-models.json"
110
110
  */
111
111
  readonly TEMPLATE: "@template:";
112
+ /**
113
+ * @owner: - References a field from the in-memory owner record
114
+ *
115
+ * In composition axes (collections, extensions), accesses a field value from the
116
+ * in-memory owner entity instance before save.
117
+ *
118
+ * @example
119
+ * "@owner:ShipToPersonID"
120
+ * "@owner:ID"
121
+ */
122
+ readonly OWNER: "@owner:";
112
123
  /**
113
124
  * @include or @include.* - Includes content from another file
114
125
  *
@@ -129,7 +140,7 @@ export type MetadataKeyword = typeof METADATA_KEYWORDS[keyof typeof METADATA_KEY
129
140
  /**
130
141
  * Type representing metadata keyword types (without the colon for keywords that have it).
131
142
  */
132
- export type MetadataKeywordType = 'file' | 'lookup' | 'parent' | 'root' | 'env' | 'url' | 'template' | 'include';
143
+ export type MetadataKeywordType = 'file' | 'lookup' | 'parent' | 'root' | 'owner' | 'env' | 'url' | 'template' | 'include';
133
144
  /**
134
145
  * Array of all metadata keyword prefixes for iteration.
135
146
  * This array maintains the order of keywords for consistent processing.
@@ -226,7 +237,7 @@ export declare function extractKeywordValue(value: string): string | null;
226
237
  * These keywords cannot be used at the top level of metadata - they only work
227
238
  * in nested/related entities where a parent record exists.
228
239
  */
229
- export declare const CONTEXT_DEPENDENT_KEYWORDS: readonly ["@parent:", "@root:"];
240
+ export declare const CONTEXT_DEPENDENT_KEYWORDS: readonly ["@parent:", "@root:", "@owner:"];
230
241
  /**
231
242
  * List of metadata keywords that reference external resources.
232
243
  * These keywords load content from files, URLs, or other external sources.
@@ -1 +1 @@
1
- {"version":3,"file":"metadata-keywords.d.ts","sourceRoot":"","sources":["../../src/constants/metadata-keywords.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH;;;GAGG;AACH,eAAO,MAAM,iBAAiB;IAC5B;;;;;;;;;;OAUG;;IAGH;;;;;;;;;;;OAWG;;IAGH;;;;;;;;;;OAUG;;IAGH;;;;;;;;;OASG;;IAGH;;;;;;;;;OASG;;IAGH;;;;;;;;;OASG;;IAGH;;;;;;;;OAQG;;IAGH;;;;;;;;;;OAUG;;CAEK,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,OAAO,iBAAiB,CAAC,MAAM,OAAO,iBAAiB,CAAC,CAAC;AAEvF;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,UAAU,GAAG,SAAS,CAAC;AAEjH;;;GAGG;AACH,eAAO,MAAM,yBAAyB,EAAE,aAAa,CAAC,MAAM,CAAoC,CAAC;AAEjG;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAMjE;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAoBhF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAElE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAI5D;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA6BhE;AAED;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,iCAG7B,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,2BAA2B,4CAI9B,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,eAAe,uBAElB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,gBAAgB,oBAEnB,CAAC;AAEX;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAElE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEnE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAavF"}
1
+ {"version":3,"file":"metadata-keywords.d.ts","sourceRoot":"","sources":["../../src/constants/metadata-keywords.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH;;;GAGG;AACH,eAAO,MAAM,iBAAiB;IAC5B;;;;;;;;;;OAUG;;IAGH;;;;;;;;;;;OAWG;;IAGH;;;;;;;;;;OAUG;;IAGH;;;;;;;;;OASG;;IAGH;;;;;;;;;OASG;;IAGH;;;;;;;;;OASG;;IAGH;;;;;;;;OAQG;;IAGH;;;;;;;;;OASG;;IAGH;;;;;;;;;;OAUG;;CAEK,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,OAAO,iBAAiB,CAAC,MAAM,OAAO,iBAAiB,CAAC,CAAC;AAEvF;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,GAAG,UAAU,GAAG,SAAS,CAAC;AAE3H;;;GAGG;AACH,eAAO,MAAM,yBAAyB,EAAE,aAAa,CAAC,MAAM,CAAoC,CAAC;AAEjG;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAMjE;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAoBhF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAElE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAI5D;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA6BhE;AAED;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,4CAI7B,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,2BAA2B,4CAI9B,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,eAAe,uBAElB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,gBAAgB,oBAEnB,CAAC;AAEX;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAElE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEnE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAavF"}
@@ -109,6 +109,17 @@ export const METADATA_KEYWORDS = {
109
109
  * "@template:templates/standard-ai-models.json"
110
110
  */
111
111
  TEMPLATE: '@template:',
112
+ /**
113
+ * @owner: - References a field from the in-memory owner record
114
+ *
115
+ * In composition axes (collections, extensions), accesses a field value from the
116
+ * in-memory owner entity instance before save.
117
+ *
118
+ * @example
119
+ * "@owner:ShipToPersonID"
120
+ * "@owner:ID"
121
+ */
122
+ OWNER: '@owner:',
112
123
  /**
113
124
  * @include or @include.* - Includes content from another file
114
125
  *
@@ -274,6 +285,7 @@ export function extractKeywordValue(value) {
274
285
  export const CONTEXT_DEPENDENT_KEYWORDS = [
275
286
  METADATA_KEYWORDS.PARENT,
276
287
  METADATA_KEYWORDS.ROOT,
288
+ METADATA_KEYWORDS.OWNER,
277
289
  ];
278
290
  /**
279
291
  * List of metadata keywords that reference external resources.
@@ -1 +1 @@
1
- {"version":3,"file":"metadata-keywords.js","sourceRoot":"","sources":["../../src/constants/metadata-keywords.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"metadata-keywords.js","sourceRoot":"","sources":["../../src/constants/metadata-keywords.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -16,6 +16,8 @@ export type { IncludeDirective } from './lib/json-preprocessor.js';
16
16
  export { SyncStateManager } from './lib/sync-state-manager.js';
17
17
  export type { SyncState } from './lib/sync-state-manager.js';
18
18
  export { parseMetadataReference } from './lib/reference-parser.js';
19
+ export { resolveCollectionRelationship } from './lib/collection-resolver.js';
20
+ export type { ResolvedCollectionInfo } from './lib/collection-resolver.js';
19
21
  export { RecordDependencyAnalyzer } from './lib/record-dependency-analyzer.js';
20
22
  export type { FlattenedRecord, ReverseDependency, DependencyAnalysisResult } from './lib/record-dependency-analyzer.js';
21
23
  export { EntityForeignKeyHelper } from './lib/entity-foreign-key-helper.js';
@@ -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
@@ -14,6 +14,7 @@ export { FileWriteBatch } from './lib/file-write-batch.js';
14
14
  export { JsonPreprocessor } from './lib/json-preprocessor.js';
15
15
  export { SyncStateManager } from './lib/sync-state-manager.js';
16
16
  export { parseMetadataReference } from './lib/reference-parser.js';
17
+ export { resolveCollectionRelationship } from './lib/collection-resolver.js';
17
18
  // Deletion audit exports
18
19
  export { RecordDependencyAnalyzer } from './lib/record-dependency-analyzer.js';
19
20
  export { EntityForeignKeyHelper } from './lib/entity-foreign-key-helper.js';
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;AAE5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,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;AAE5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,6BAA6B,EAAE,MAAM,2BAA2B,CAAC;AAG1E,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"}
@@ -81,6 +81,18 @@ export declare class RecordProcessor {
81
81
  * Calculates sync metadata including checksum and last modified timestamp
82
82
  */
83
83
  private calculateSyncMetadata;
84
+ /**
85
+ * Processes first-class collections on pull (§6)
86
+ */
87
+ private processCollections;
88
+ /**
89
+ * Processes first-class extension on pull (§6)
90
+ */
91
+ private processExtension;
92
+ /**
93
+ * Processes first-class embeds on pull (§6)
94
+ */
95
+ private processEmbeds;
84
96
  /**
85
97
  * Checks if the record has externalized fields
86
98
  */
@@ -1 +1 @@
1
- {"version":3,"file":"RecordProcessor.d.ts","sourceRoot":"","sources":["../../src/lib/RecordProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAW,QAAQ,EAAc,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAMzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAEhD;;GAEG;AACH,qBAAa,eAAe;IAMxB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,WAAW;IANrB,OAAO,CAAC,iBAAiB,CAA0B;IACnD,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,oBAAoB,CAAuB;gBAGzC,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,QAAQ;IAO/B;;;OAGG;IACG,4BAA4B,CAChC,iBAAiB,EAAE,MAAM,EAAE,EAC3B,cAAc,EAAE,mBAAmB,EACnC,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;IAIrC;;OAEG;IACG,aAAa,CACjB,MAAM,EAAE,UAAU,EAClB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC/B,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,YAAY,EAC1B,OAAO,CAAC,EAAE,OAAO,EACjB,WAAW,GAAE,OAAc,EAC3B,kBAAkB,CAAC,EAAE,UAAU,EAC/B,YAAY,GAAE,MAAU,EACxB,YAAY,GAAE,GAAG,CAAC,MAAM,CAAa,EACrC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACpC,kBAAkB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,GAC1D,OAAO,CAAC,UAAU,CAAC;IAoCtB;;OAEG;YACW,iBAAiB;IAyC/B;;OAEG;YACW,aAAa;IA8B3B;;OAEG;IACH,OAAO,CAAC,eAAe;IAmCvB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAa9B;;OAEG;YACW,iBAAiB;IAuC/B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAW1B;;OAEG;YACW,0BAA0B;IAqBxC;;OAEG;IACH,OAAO,CAAC,eAAe;IAIvB;;OAEG;YACW,yBAAyB;IAwCvC;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAWjC;;OAEG;IACH,OAAO,CAAC,8BAA8B;IAoBtC;;OAEG;IACH,OAAO,CAAC,+BAA+B;IAYvC;;OAEG;IACH,OAAO,CAAC,kCAAkC;IAI1C;;OAEG;YACW,sBAAsB;IA0DpC;;OAEG;YACW,qBAAqB;IAgDnC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAO7B;;OAEG;YACW,mBAAmB;CAsClC"}
1
+ {"version":3,"file":"RecordProcessor.d.ts","sourceRoot":"","sources":["../../src/lib/RecordProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAA+C,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEzG,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAMzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAEhD;;GAEG;AACH,qBAAa,eAAe;IAMxB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,WAAW;IANrB,OAAO,CAAC,iBAAiB,CAA0B;IACnD,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,oBAAoB,CAAuB;gBAGzC,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,QAAQ;IAO/B;;;OAGG;IACG,4BAA4B,CAChC,iBAAiB,EAAE,MAAM,EAAE,EAC3B,cAAc,EAAE,mBAAmB,EACnC,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;IAIrC;;OAEG;IACG,aAAa,CACjB,MAAM,EAAE,UAAU,EAClB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC/B,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,YAAY,EAC1B,OAAO,CAAC,EAAE,OAAO,EACjB,WAAW,GAAE,OAAc,EAC3B,kBAAkB,CAAC,EAAE,UAAU,EAC/B,YAAY,GAAE,MAAU,EACxB,YAAY,GAAE,GAAG,CAAC,MAAM,CAAa,EACrC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACpC,kBAAkB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,GAC1D,OAAO,CAAC,UAAU,CAAC;IA0CtB;;OAEG;YACW,iBAAiB;IAsF/B;;OAEG;YACW,aAAa;IA8B3B;;OAEG;IACH,OAAO,CAAC,eAAe;IAmCvB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAa9B;;OAEG;YACW,iBAAiB;IAuC/B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAW1B;;OAEG;YACW,0BAA0B;IAqBxC;;OAEG;IACH,OAAO,CAAC,eAAe;IAIvB;;OAEG;YACW,yBAAyB;IAwCvC;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAWjC;;OAEG;IACH,OAAO,CAAC,8BAA8B;IAoBtC;;OAEG;IACH,OAAO,CAAC,+BAA+B;IAYvC;;OAEG;IACH,OAAO,CAAC,kCAAkC;IAI1C;;OAEG;YACW,sBAAsB;IA0DpC;;OAEG;YACW,qBAAqB;IA0DnC;;OAEG;YACW,kBAAkB;IA+FhC;;OAEG;YACW,gBAAgB;IAqC9B;;OAEG;YACW,aAAa;IAmC3B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAO7B;;OAEG;YACW,mBAAmB;CAwClC"}
@@ -1,4 +1,5 @@
1
- import { RunView } from '@memberjunction/core';
1
+ import { CompositeKey, Metadata, RunView } from '@memberjunction/core';
2
+ import { ordinalCompare, UUIDsEqual } from '@memberjunction/global';
2
3
  import { JsonWriteHelper } from './json-write-helper.js';
3
4
  import { EntityPropertyExtractor } from './EntityPropertyExtractor.js';
4
5
  import { FieldExternalizer } from './FieldExternalizer.js';
@@ -28,24 +29,38 @@ export class RecordProcessor {
28
29
  async processRecord(record, primaryKey, targetDir, entityConfig, verbose, isNewRecord = true, existingRecordData, currentDepth = 0, ancestryPath = new Set(), fieldOverrides, batchedRelatedData) {
29
30
  // Extract all properties from the entity
30
31
  const allProperties = this.propertyExtractor.extractAllProperties(record, fieldOverrides);
31
- // Process fields and related entities
32
- const { fields, relatedEntities } = await this.processEntityData(allProperties, record, primaryKey, targetDir, entityConfig, existingRecordData, currentDepth, ancestryPath, verbose, batchedRelatedData);
32
+ // Process fields, collections, embeds, extension, and related entities (§6)
33
+ const { fields, collections, embeds, extension, relatedEntities } = await this.processEntityData(allProperties, record, primaryKey, targetDir, entityConfig, existingRecordData, currentDepth, ancestryPath, verbose, batchedRelatedData);
33
34
  // Calculate checksum and sync metadata
34
- const syncData = await this.calculateSyncMetadata(fields, targetDir, entityConfig, existingRecordData, verbose);
35
+ const syncData = await this.calculateSyncMetadata(fields, targetDir, entityConfig, existingRecordData, verbose, collections, embeds, extension);
35
36
  // Build the final record data with proper ordering
36
- return JsonWriteHelper.createOrderedRecordData(fields, relatedEntities, primaryKey, syncData);
37
+ return JsonWriteHelper.createOrderedRecordData(fields, relatedEntities, primaryKey, syncData, collections, embeds, extension);
37
38
  }
38
39
  /**
39
40
  * Processes entity data into fields and related entities
40
41
  */
41
42
  async processEntityData(allProperties, record, primaryKey, targetDir, entityConfig, existingRecordData, currentDepth, ancestryPath, verbose, batchedRelatedData) {
42
43
  const fields = {};
44
+ const collections = {};
45
+ const embeds = {};
43
46
  const relatedEntities = {};
44
47
  // Process individual fields
45
48
  await this.processFields(allProperties, primaryKey, targetDir, entityConfig, existingRecordData, fields, verbose);
49
+ // Process collections if declared (§6)
50
+ await this.processCollections(record, targetDir, entityConfig, collections, currentDepth, ancestryPath, verbose);
51
+ // Process extension if present (§6)
52
+ const extension = await this.processExtension(record, primaryKey, targetDir, entityConfig, verbose);
53
+ // Process embeds if present (§6)
54
+ await this.processEmbeds(record, targetDir, entityConfig, embeds, currentDepth, ancestryPath, verbose);
46
55
  // Process related entities if configured
47
56
  await this.processRelatedEntities(record, entityConfig, existingRecordData, currentDepth, ancestryPath, relatedEntities, verbose, batchedRelatedData);
48
- return { fields, relatedEntities };
57
+ return {
58
+ fields,
59
+ ...(Object.keys(collections).length > 0 ? { collections } : {}),
60
+ ...(Object.keys(embeds).length > 0 ? { embeds } : {}),
61
+ ...(extension ? { extension } : {}),
62
+ relatedEntities,
63
+ };
49
64
  }
50
65
  /**
51
66
  * Processes individual fields from the entity
@@ -255,12 +270,18 @@ export class RecordProcessor {
255
270
  /**
256
271
  * Calculates sync metadata including checksum and last modified timestamp
257
272
  */
258
- async calculateSyncMetadata(fields, targetDir, entityConfig, existingRecordData, verbose) {
273
+ async calculateSyncMetadata(fields, targetDir, entityConfig, existingRecordData, verbose, collections, embeds, extension) {
259
274
  // Determine if we should include external file content in checksum
260
275
  const hasExternalizedFields = this.hasExternalizedFields(fields, entityConfig);
276
+ const checksumPayload = {
277
+ fields,
278
+ ...(collections && Object.keys(collections).length > 0 ? { collections } : {}),
279
+ ...(embeds && Object.keys(embeds).length > 0 ? { embeds } : {}),
280
+ ...(extension && Object.keys(extension).length > 0 ? { extension } : {}),
281
+ };
261
282
  const checksum = hasExternalizedFields
262
- ? await this.syncEngine.calculateChecksumWithFileContent(fields, targetDir)
263
- : this.syncEngine.calculateChecksum(fields);
283
+ ? await this.syncEngine.calculateChecksumWithFileContent(checksumPayload, targetDir)
284
+ : this.syncEngine.calculateChecksum(checksumPayload);
264
285
  if (verbose && hasExternalizedFields) {
265
286
  console.log(`Calculated checksum including external file content for record`);
266
287
  }
@@ -294,6 +315,136 @@ export class RecordProcessor {
294
315
  };
295
316
  }
296
317
  }
318
+ /**
319
+ * Processes first-class collections on pull (§6)
320
+ */
321
+ async processCollections(record, targetDir, entityConfig, collections, currentDepth, ancestryPath, verbose) {
322
+ if (!record.EntityInfo?.RelatedEntities)
323
+ return;
324
+ for (const rel of record.EntityInfo.RelatedEntities) {
325
+ if (!rel.RelatedRecordCollection)
326
+ continue;
327
+ let colName = rel.RelatedEntity;
328
+ try {
329
+ const parsed = JSON.parse(rel.RelatedRecordCollection);
330
+ if (parsed.Name)
331
+ colName = parsed.Name;
332
+ }
333
+ catch { }
334
+ // Look up companion on record
335
+ let companion = record.GetCompanion(colName);
336
+ if (!companion) {
337
+ const entityRecord = record;
338
+ if (entityRecord[colName] && typeof entityRecord[colName].Items !== 'undefined') {
339
+ companion = entityRecord[colName];
340
+ }
341
+ }
342
+ if (!companion)
343
+ continue;
344
+ const col = companion;
345
+ // Rider 4 / §6: Load: 'never' collection must be skipped with a stated reason on pull, never emitted as []
346
+ if (col.LoadMode === 'never') {
347
+ console.log(`Skipping Load: 'never' collection '${colName}' on ${record.EntityInfo.Name}`);
348
+ continue;
349
+ }
350
+ if (!col.IsLoaded) {
351
+ try {
352
+ await col.Load();
353
+ }
354
+ catch (loadErr) {
355
+ console.warn(`Failed to load collection '${colName}' on ${record.EntityInfo.Name}: ${loadErr instanceof Error ? loadErr.message : String(loadErr)}`);
356
+ continue;
357
+ }
358
+ }
359
+ const rawItems = col.Items ?? [];
360
+ if (rawItems.length > 0) {
361
+ collections[colName] = [];
362
+ const childEntityInfo = rawItems[0].EntityInfo;
363
+ const childConfig = {
364
+ entity: childEntityInfo.Name,
365
+ };
366
+ // Deterministically sort collection items by primary key(s)
367
+ const items = [...rawItems].sort((a, b) => {
368
+ for (const pk of childEntityInfo.PrimaryKeys) {
369
+ const aVal = String(a.Get(pk.Name) ?? '');
370
+ const bVal = String(b.Get(pk.Name) ?? '');
371
+ const cmp = ordinalCompare(aVal, bVal);
372
+ if (cmp !== 0)
373
+ return cmp;
374
+ }
375
+ return 0;
376
+ });
377
+ for (const child of items) {
378
+ const childPK = {};
379
+ for (const pk of childEntityInfo.PrimaryKeys) {
380
+ childPK[pk.Name] = child.Get(pk.Name);
381
+ }
382
+ const childData = await this.processRecord(child, childPK, targetDir, childConfig, verbose, false, undefined, currentDepth + 1, new Set([...(ancestryPath ?? []), `${record.EntityInfo.Name}:${JSON.stringify(record.PrimaryKey)}`]));
383
+ collections[colName].push(childData);
384
+ }
385
+ }
386
+ }
387
+ }
388
+ /**
389
+ * Processes first-class extension on pull (§6)
390
+ */
391
+ async processExtension(record, primaryKey, targetDir, entityConfig, verbose) {
392
+ const child = record.ISAChild;
393
+ if (!child)
394
+ return undefined;
395
+ // Leaf fields only: fields present on child but NOT on parent
396
+ const parentFieldNames = new Set(record.EntityInfo.Fields.map((f) => f.Name.toLowerCase()));
397
+ const childProperties = this.propertyExtractor.extractAllProperties(child);
398
+ const leafFields = {};
399
+ for (const [fName, fVal] of Object.entries(childProperties)) {
400
+ if (parentFieldNames.has(fName.toLowerCase()))
401
+ continue;
402
+ if (fName.startsWith('__mj_'))
403
+ continue;
404
+ if (primaryKey[fName] !== undefined)
405
+ continue;
406
+ leafFields[fName] = fVal;
407
+ }
408
+ // Determine if child type is ambiguous (more than one subtype exists in metadata)
409
+ const provider = Metadata.Provider; // global-provider-ok: MetadataSync is a single-provider CLI process
410
+ const childSubtypes = provider?.Entities
411
+ ? provider.Entities.filter((e) => UUIDsEqual(e.ParentID, record.EntityInfo.ID) || UUIDsEqual(e.ParentEntityInfo?.ID, record.EntityInfo.ID))
412
+ : [];
413
+ const needsEntityName = childSubtypes.length > 1 || record.EntityInfo.AllowMultipleSubtypes;
414
+ return {
415
+ ...(needsEntityName ? { entity: child.EntityInfo.Name } : {}),
416
+ fields: leafFields,
417
+ };
418
+ }
419
+ /**
420
+ * Processes first-class embeds on pull (§6)
421
+ */
422
+ async processEmbeds(record, targetDir, entityConfig, embeds, currentDepth, ancestryPath, verbose) {
423
+ for (const field of record.EntityInfo.Fields) {
424
+ if (!field.RelatedEntity)
425
+ continue;
426
+ const objectPropName = `${field.Name}_Object`;
427
+ const entityRecord = record;
428
+ const embedded = entityRecord[objectPropName];
429
+ if (embedded && typeof embedded.Get === 'function') {
430
+ const embedProperties = this.propertyExtractor.extractAllProperties(embedded);
431
+ const embedFields = {};
432
+ const embedPK = {};
433
+ for (const pk of embedded.EntityInfo.PrimaryKeys) {
434
+ embedPK[pk.Name] = embedded.Get(pk.Name);
435
+ }
436
+ for (const [fName, fVal] of Object.entries(embedProperties)) {
437
+ if (fName.startsWith('__mj_') || embedPK[fName] !== undefined)
438
+ continue;
439
+ embedFields[fName] = fVal;
440
+ }
441
+ embeds[field.Name] = {
442
+ fields: embedFields,
443
+ ...(Object.keys(embedPK).length > 0 ? { primaryKey: embedPK } : {}),
444
+ };
445
+ }
446
+ }
447
+ }
297
448
  /**
298
449
  * Checks if the record has externalized fields
299
450
  */
@@ -309,10 +460,12 @@ export class RecordProcessor {
309
460
  return guidValue;
310
461
  }
311
462
  try {
463
+ // The lookup target is any entity — build the predicate from its real key column(s).
464
+ const md = new Metadata(); // global-provider-ok: MetadataSync is a single-provider CLI process
312
465
  const rv = new RunView();
313
466
  const result = await rv.RunView({
314
467
  EntityName: lookupConfig.entity,
315
- ExtraFilter: `ID = '${guidValue}'`,
468
+ ExtraFilter: CompositeKey.FromURLSegment(md.EntityByName(lookupConfig.entity), guidValue).ToWhereClause(),
316
469
  ResultType: 'entity_object'
317
470
  }, this.contextUser);
318
471
  if (result.Success && result.Results && result.Results.length > 0) {