@memberjunction/metadata-sync 6.1.0-edge.4 → 6.1.0-edge.6
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 +48 -3
- package/dist/config.d.ts +32 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/constants/metadata-keywords.d.ts +13 -2
- package/dist/constants/metadata-keywords.d.ts.map +1 -1
- package/dist/constants/metadata-keywords.js +12 -0
- package/dist/constants/metadata-keywords.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/RecordProcessor.d.ts +12 -0
- package/dist/lib/RecordProcessor.d.ts.map +1 -1
- package/dist/lib/RecordProcessor.js +163 -10
- package/dist/lib/RecordProcessor.js.map +1 -1
- package/dist/lib/batch-context-index.js +1 -1
- package/dist/lib/batch-context-index.js.map +1 -1
- package/dist/lib/collection-resolver.d.ts +24 -0
- package/dist/lib/collection-resolver.d.ts.map +1 -0
- package/dist/lib/collection-resolver.js +117 -0
- package/dist/lib/collection-resolver.js.map +1 -0
- package/dist/lib/database-reference-scanner.js +5 -5
- package/dist/lib/database-reference-scanner.js.map +1 -1
- package/dist/lib/deletion-auditor.d.ts.map +1 -1
- package/dist/lib/deletion-auditor.js +1 -0
- package/dist/lib/deletion-auditor.js.map +1 -1
- package/dist/lib/entity-subclass-guard.d.ts +10 -0
- package/dist/lib/entity-subclass-guard.d.ts.map +1 -0
- package/dist/lib/entity-subclass-guard.js +38 -0
- package/dist/lib/entity-subclass-guard.js.map +1 -0
- package/dist/lib/graph-provider-pool.d.ts +67 -0
- package/dist/lib/graph-provider-pool.d.ts.map +1 -0
- package/dist/lib/graph-provider-pool.js +149 -0
- package/dist/lib/graph-provider-pool.js.map +1 -0
- package/dist/lib/json-write-helper.d.ts +12 -8
- package/dist/lib/json-write-helper.d.ts.map +1 -1
- package/dist/lib/json-write-helper.js +54 -24
- package/dist/lib/json-write-helper.js.map +1 -1
- package/dist/lib/record-dependency-analyzer.d.ts +8 -0
- package/dist/lib/record-dependency-analyzer.d.ts.map +1 -1
- package/dist/lib/record-dependency-analyzer.js +20 -5
- package/dist/lib/record-dependency-analyzer.js.map +1 -1
- package/dist/lib/reference-parser.d.ts.map +1 -1
- package/dist/lib/reference-parser.js +1 -0
- package/dist/lib/reference-parser.js.map +1 -1
- package/dist/lib/sync-engine.d.ts +27 -4
- package/dist/lib/sync-engine.d.ts.map +1 -1
- package/dist/lib/sync-engine.js +94 -45
- package/dist/lib/sync-engine.js.map +1 -1
- package/dist/lib/sync-metadata-engine.d.ts +44 -1
- package/dist/lib/sync-metadata-engine.d.ts.map +1 -1
- package/dist/lib/sync-metadata-engine.js +152 -4
- package/dist/lib/sync-metadata-engine.js.map +1 -1
- package/dist/lib/transaction-manager.d.ts +2 -1
- package/dist/lib/transaction-manager.d.ts.map +1 -1
- package/dist/lib/transaction-manager.js +4 -1
- package/dist/lib/transaction-manager.js.map +1 -1
- package/dist/plugins/index.js +3 -3
- package/dist/plugins/index.js.map +1 -1
- package/dist/services/FormattingService.d.ts +8 -0
- package/dist/services/FormattingService.d.ts.map +1 -1
- package/dist/services/FormattingService.js +18 -0
- package/dist/services/FormattingService.js.map +1 -1
- package/dist/services/PullService.js +1 -1
- package/dist/services/PullService.js.map +1 -1
- package/dist/services/PushService.d.ts +53 -3
- package/dist/services/PushService.d.ts.map +1 -1
- package/dist/services/PushService.js +455 -143
- package/dist/services/PushService.js.map +1 -1
- package/dist/services/ValidationService.d.ts +26 -0
- package/dist/services/ValidationService.d.ts.map +1 -1
- package/dist/services/ValidationService.js +454 -14
- package/dist/services/ValidationService.js.map +1 -1
- 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
|
|
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
|
-
#
|
|
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.
|
package/dist/config.d.ts.map
CHANGED
|
@@ -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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"}
|
package/dist/config.js.map
CHANGED
|
@@ -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;
|
|
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;
|
|
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';
|
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;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;
|
|
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;
|
|
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,
|
|
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 {
|
|
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(
|
|
263
|
-
: this.syncEngine.calculateChecksum(
|
|
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:
|
|
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) {
|