@memberjunction/core 6.1.0-edge.1 → 6.1.0-edge.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 (99) hide show
  1. package/LICENSE +180 -4
  2. package/dist/generic/InMemoryLocalStorageProvider.d.ts +6 -0
  3. package/dist/generic/InMemoryLocalStorageProvider.d.ts.map +1 -1
  4. package/dist/generic/InMemoryLocalStorageProvider.js +6 -0
  5. package/dist/generic/InMemoryLocalStorageProvider.js.map +1 -1
  6. package/dist/generic/JSONType-interfaces/IEntityConfiguration.d.ts +120 -0
  7. package/dist/generic/JSONType-interfaces/IEntityConfiguration.d.ts.map +1 -0
  8. package/dist/generic/JSONType-interfaces/IEntityConfiguration.js +6 -0
  9. package/dist/generic/JSONType-interfaces/IEntityConfiguration.js.map +1 -0
  10. package/dist/generic/JSONType-interfaces/IEntityFieldConfiguration.d.ts +31 -0
  11. package/dist/generic/JSONType-interfaces/IEntityFieldConfiguration.d.ts.map +1 -0
  12. package/dist/generic/JSONType-interfaces/IEntityFieldConfiguration.js +6 -0
  13. package/dist/generic/JSONType-interfaces/IEntityFieldConfiguration.js.map +1 -0
  14. package/dist/generic/JSONType-interfaces/IEntityRelationshipConfiguration.d.ts +75 -0
  15. package/dist/generic/JSONType-interfaces/IEntityRelationshipConfiguration.d.ts.map +1 -0
  16. package/dist/generic/JSONType-interfaces/IEntityRelationshipConfiguration.js +6 -0
  17. package/dist/generic/JSONType-interfaces/IEntityRelationshipConfiguration.js.map +1 -0
  18. package/dist/generic/JSONType-interfaces/IFileStorageProviderConfiguration.d.ts +19 -0
  19. package/dist/generic/JSONType-interfaces/IFileStorageProviderConfiguration.d.ts.map +1 -0
  20. package/dist/generic/JSONType-interfaces/IFileStorageProviderConfiguration.js +6 -0
  21. package/dist/generic/JSONType-interfaces/IFileStorageProviderConfiguration.js.map +1 -0
  22. package/dist/generic/authTypes.d.ts +69 -0
  23. package/dist/generic/authTypes.d.ts.map +1 -1
  24. package/dist/generic/baseEngine.d.ts +14 -0
  25. package/dist/generic/baseEngine.d.ts.map +1 -1
  26. package/dist/generic/baseEngine.js +53 -13
  27. package/dist/generic/baseEngine.js.map +1 -1
  28. package/dist/generic/baseEntity.d.ts +150 -23
  29. package/dist/generic/baseEntity.d.ts.map +1 -1
  30. package/dist/generic/baseEntity.js +435 -66
  31. package/dist/generic/baseEntity.js.map +1 -1
  32. package/dist/generic/baseInfo.d.ts.map +1 -1
  33. package/dist/generic/baseInfo.js +16 -4
  34. package/dist/generic/baseInfo.js.map +1 -1
  35. package/dist/generic/compositeKey.d.ts +30 -0
  36. package/dist/generic/compositeKey.d.ts.map +1 -1
  37. package/dist/generic/compositeKey.js +97 -0
  38. package/dist/generic/compositeKey.js.map +1 -1
  39. package/dist/generic/dataHooks.d.ts +5 -0
  40. package/dist/generic/dataHooks.d.ts.map +1 -1
  41. package/dist/generic/dataHooks.js +27 -3
  42. package/dist/generic/dataHooks.js.map +1 -1
  43. package/dist/generic/databaseProviderBase.d.ts.map +1 -1
  44. package/dist/generic/databaseProviderBase.js +9 -5
  45. package/dist/generic/databaseProviderBase.js.map +1 -1
  46. package/dist/generic/embeddedRecord.d.ts +123 -0
  47. package/dist/generic/embeddedRecord.d.ts.map +1 -0
  48. package/dist/generic/embeddedRecord.js +356 -0
  49. package/dist/generic/embeddedRecord.js.map +1 -0
  50. package/dist/generic/entityCompanion.d.ts +20 -2
  51. package/dist/generic/entityCompanion.d.ts.map +1 -1
  52. package/dist/generic/entityCompanion.js +17 -1
  53. package/dist/generic/entityCompanion.js.map +1 -1
  54. package/dist/generic/entityConfiguration.d.ts +131 -0
  55. package/dist/generic/entityConfiguration.d.ts.map +1 -0
  56. package/dist/generic/entityConfiguration.js +346 -0
  57. package/dist/generic/entityConfiguration.js.map +1 -0
  58. package/dist/generic/entityInfo.d.ts +274 -4
  59. package/dist/generic/entityInfo.d.ts.map +1 -1
  60. package/dist/generic/entityInfo.js +502 -14
  61. package/dist/generic/entityInfo.js.map +1 -1
  62. package/dist/generic/entitySavePlan.d.ts +40 -11
  63. package/dist/generic/entitySavePlan.d.ts.map +1 -1
  64. package/dist/generic/entitySavePlan.js +70 -2
  65. package/dist/generic/entitySavePlan.js.map +1 -1
  66. package/dist/generic/interfaces.d.ts +35 -24
  67. package/dist/generic/interfaces.d.ts.map +1 -1
  68. package/dist/generic/interfaces.js +6 -24
  69. package/dist/generic/interfaces.js.map +1 -1
  70. package/dist/generic/localCacheManager.d.ts +123 -5
  71. package/dist/generic/localCacheManager.d.ts.map +1 -1
  72. package/dist/generic/localCacheManager.js +264 -9
  73. package/dist/generic/localCacheManager.js.map +1 -1
  74. package/dist/generic/providerBase.d.ts +118 -0
  75. package/dist/generic/providerBase.d.ts.map +1 -1
  76. package/dist/generic/providerBase.js +311 -11
  77. package/dist/generic/providerBase.js.map +1 -1
  78. package/dist/generic/relatedRecordCollection.d.ts +36 -4
  79. package/dist/generic/relatedRecordCollection.d.ts.map +1 -1
  80. package/dist/generic/relatedRecordCollection.js +70 -8
  81. package/dist/generic/relatedRecordCollection.js.map +1 -1
  82. package/dist/generic/runQuery.d.ts +14 -0
  83. package/dist/generic/runQuery.d.ts.map +1 -1
  84. package/dist/generic/runQuery.js.map +1 -1
  85. package/dist/generic/saveEntityGraphOperation.js +1 -1
  86. package/dist/generic/saveEntityGraphOperation.js.map +1 -1
  87. package/dist/generic/securityInfo.d.ts.map +1 -1
  88. package/dist/generic/securityInfo.js +15 -5
  89. package/dist/generic/securityInfo.js.map +1 -1
  90. package/dist/index.d.ts +3 -0
  91. package/dist/index.d.ts.map +1 -1
  92. package/dist/index.js +3 -0
  93. package/dist/index.js.map +1 -1
  94. package/dist/views/runView.d.ts +58 -0
  95. package/dist/views/runView.d.ts.map +1 -1
  96. package/dist/views/runView.js +20 -0
  97. package/dist/views/runView.js.map +1 -1
  98. package/package.json +5 -4
  99. package/readme.md +64 -1
@@ -0,0 +1,123 @@
1
+ /**
2
+ * @fileoverview `EmbeddedRecord<T>` — a 1:1 peer `BaseEntity` that loads, validates
3
+ * and persists as one unit with its owner, joined by an **owner-held** foreign key.
4
+ *
5
+ * This is the third composition axis on `BaseEntity`, next to IS-A (shared PK) and
6
+ * related-record collections (FK on the related row). The FK lives on the owner
7
+ * (`Deal.OrderID`), so the save order inverts: the peer persists first, the owner
8
+ * stamps the FK, then the owner persists.
9
+ *
10
+ * Callers never hold this class. They see `owner.OrderID_Object` (the entity) and
11
+ * `owner.OrderID_EnsureObject()` (sync provision for a nullable FK).
12
+ *
13
+ * @module @memberjunction/core
14
+ */
15
+ import type { BaseEntity } from './baseEntity.js';
16
+ import { EntityCompanion, EntityCompanionDeserializeMode, EntityCompanionPayload } from './entityCompanion.js';
17
+ import type { EntitySavePlan } from './entitySavePlan.js';
18
+ import { ValidationResult } from './entityInfo.js';
19
+ import type { EntitySaveOptions } from './interfaces.js';
20
+ /** What clearing the relationship does to the embedded row. */
21
+ export type EmbeddedRecordClearMode = 'delete' | 'orphan' | 'refuse';
22
+ /** How far `owner.Load()` walks into the embedded record. */
23
+ export type EmbeddedRecordLoadNested = 'inherit' | 'related';
24
+ /**
25
+ * Declaration for an {@link EmbeddedRecord}, supplied to `BaseEntity.DeclareEmbeddedRecord()`.
26
+ *
27
+ * `RelatedEntity` and `ForeignKeyField` are the only required values — they are the
28
+ * join. Everything else has a default that matches the Deal → Order case.
29
+ */
30
+ export type EmbeddedRecordOptions = {
31
+ /**
32
+ * The owner's field holding the foreign key, e.g. `'OrderID'`.
33
+ * The generated property names are derived from this: `{Field}_Object`,
34
+ * `{Field}_EnsureObject`.
35
+ */
36
+ ForeignKeyField: string;
37
+ /** The related entity's name in MJ metadata, e.g. `'MJ_BizApps_Orders: Order Headers'`. */
38
+ RelatedEntity: string;
39
+ /** Defaults to `'orphan'`. */
40
+ OnClear?: EmbeddedRecordClearMode;
41
+ /** Defaults to `'inherit'`. */
42
+ LoadNested?: EmbeddedRecordLoadNested;
43
+ };
44
+ /** Wire shape. Nested companions travel so a browser save does not drop the peer's graph. */
45
+ export type EmbeddedRecordWire = {
46
+ /**
47
+ * Entity name in metadata for polymorphic IS-A subtypes.
48
+ * If omitted, defaults to the embedded record's declared RelatedEntityName.
49
+ */
50
+ EntityName?: string | null;
51
+ Fields: Record<string, unknown>;
52
+ IsNew: boolean;
53
+ Cleared: boolean;
54
+ Companions: EntityCompanionPayload[] | null;
55
+ };
56
+ /**
57
+ * Internal companion for one owner-held 1:1 peer.
58
+ *
59
+ * @typeParam T - The embedded entity type.
60
+ */
61
+ export declare class EmbeddedRecord<T extends BaseEntity = BaseEntity> extends EntityCompanion<EmbeddedRecordWire> {
62
+ readonly Name: string;
63
+ readonly ForeignKeyField: string;
64
+ readonly RelatedEntityName: string;
65
+ readonly ClearMode: EmbeddedRecordClearMode;
66
+ readonly LoadNested: EmbeddedRecordLoadNested;
67
+ private instance;
68
+ private exposed;
69
+ private cleared;
70
+ private constructing;
71
+ constructor(owner: BaseEntity, options: EmbeddedRecordOptions);
72
+ /** The live peer, or `null` when a nullable FK is not yet provisioned. */
73
+ get Value(): T | null;
74
+ /** True when the getter will return an object. */
75
+ get IsProvisioned(): boolean;
76
+ /** True when the owner's FK column refuses null. */
77
+ get IsRequired(): boolean;
78
+ /**
79
+ * Constructs the related entity instance without `NewRecord` / `Load`.
80
+ * Called from `BaseEntity.InitializeEmbeddedRecords` during `GetEntityObject`.
81
+ *
82
+ * @param visited - Entity names already being constructed, for cycle detection.
83
+ */
84
+ InitializeInstance(visited: Set<string>): Promise<void>;
85
+ /**
86
+ * Sync provision. Idempotent. For a required FK this is a no-op after `NewRecord`.
87
+ */
88
+ Ensure(): T;
89
+ /**
90
+ * Marks the relationship for removal on the next save. Does not persist by itself.
91
+ */
92
+ Clear(): void;
93
+ /**
94
+ * Called from the owner's `NewRecord()`. Required FKs are provisioned here so
95
+ * `owner.OrderID_Object` is usable immediately after `GetEntityObject`.
96
+ */
97
+ OnOwnerNewRecord(): void;
98
+ /** @inheritdoc */
99
+ get Dirty(): boolean;
100
+ /** @inheritdoc */
101
+ Validate(result: ValidationResult): void;
102
+ /** @inheritdoc */
103
+ ValidateAsync(result: ValidationResult): Promise<void>;
104
+ /** @inheritdoc */
105
+ ContributeSaveWork(plan: EntitySavePlan, options?: EntitySaveOptions): void;
106
+ /** @inheritdoc */
107
+ ContributePostDeleteWork(plan: EntitySavePlan): void;
108
+ /** @inheritdoc */
109
+ LoadEager(visited?: Set<string>): Promise<void>;
110
+ /** @inheritdoc */
111
+ AcceptChanges(): void;
112
+ /** @inheritdoc */
113
+ Serialize(mode?: EntityCompanionDeserializeMode): Promise<EmbeddedRecordWire | null>;
114
+ /** @inheritdoc */
115
+ Deserialize(data: EmbeddedRecordWire, mode?: EntityCompanionDeserializeMode): Promise<void>;
116
+ private applyWire;
117
+ private loadExistingThenApply;
118
+ private contributeClearWork;
119
+ private stampOwnerKey;
120
+ private keyFromForeignKey;
121
+ private prefixError;
122
+ }
123
+ //# sourceMappingURL=embeddedRecord.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddedRecord.d.ts","sourceRoot":"","sources":["../../src/generic/embeddedRecord.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,356 @@
1
+ /**
2
+ * @fileoverview `EmbeddedRecord<T>` — a 1:1 peer `BaseEntity` that loads, validates
3
+ * and persists as one unit with its owner, joined by an **owner-held** foreign key.
4
+ *
5
+ * This is the third composition axis on `BaseEntity`, next to IS-A (shared PK) and
6
+ * related-record collections (FK on the related row). The FK lives on the owner
7
+ * (`Deal.OrderID`), so the save order inverts: the peer persists first, the owner
8
+ * stamps the FK, then the owner persists.
9
+ *
10
+ * Callers never hold this class. They see `owner.OrderID_Object` (the entity) and
11
+ * `owner.OrderID_EnsureObject()` (sync provision for a nullable FK).
12
+ *
13
+ * @module @memberjunction/core
14
+ */
15
+ import { CompositeKey, KeyValuePair } from './compositeKey.js';
16
+ import { EntityCompanion } from './entityCompanion.js';
17
+ import { ValidationErrorInfo, ValidationErrorType } from './entityInfo.js';
18
+ /**
19
+ * Internal companion for one owner-held 1:1 peer.
20
+ *
21
+ * @typeParam T - The embedded entity type.
22
+ */
23
+ export class EmbeddedRecord extends EntityCompanion {
24
+ constructor(owner, options) {
25
+ super(owner);
26
+ this.instance = null;
27
+ this.exposed = false;
28
+ this.cleared = false;
29
+ this.constructing = false;
30
+ this.ForeignKeyField = options.ForeignKeyField;
31
+ this.RelatedEntityName = options.RelatedEntity;
32
+ const fieldInfo = owner.EntityInfo?.Fields.find(f => f.Name === options.ForeignKeyField);
33
+ this.Name = `${fieldInfo?.CodeName ?? options.ForeignKeyField}_Object`;
34
+ this.ClearMode = options.OnClear ?? 'orphan';
35
+ this.LoadNested = options.LoadNested ?? 'inherit';
36
+ }
37
+ /** The live peer, or `null` when a nullable FK is not yet provisioned. */
38
+ get Value() {
39
+ return this.exposed ? this.instance : null;
40
+ }
41
+ /** True when the getter will return an object. */
42
+ get IsProvisioned() {
43
+ return this.exposed && this.instance !== null;
44
+ }
45
+ /** True when the owner's FK column refuses null. */
46
+ get IsRequired() {
47
+ const field = this.Owner.GetFieldByName(this.ForeignKeyField);
48
+ return field?.EntityFieldInfo.AllowsNull === false;
49
+ }
50
+ /**
51
+ * Constructs the related entity instance without `NewRecord` / `Load`.
52
+ * Called from `BaseEntity.InitializeEmbeddedRecords` during `GetEntityObject`.
53
+ *
54
+ * @param visited - Entity names already being constructed, for cycle detection.
55
+ */
56
+ async InitializeInstance(visited) {
57
+ if (this.instance || this.constructing) {
58
+ return;
59
+ }
60
+ // Path-set, not a global set: a sibling targeting the same entity
61
+ // (BillTo + ShipTo) is not a cycle — InitializeEmbeddedRecords copies
62
+ // `visited` per sibling so they never see each other in-flight. A
63
+ // self-FK or A→B→A ancestor is on this path and must stop here, or
64
+ // ConstructUninitializedEntity's recurse would construct forever.
65
+ if (visited.has(this.RelatedEntityName)) {
66
+ return;
67
+ }
68
+ this.constructing = true;
69
+ visited.add(this.RelatedEntityName);
70
+ try {
71
+ this.instance = await this.Owner.ConstructUninitializedEntity(this.RelatedEntityName, visited);
72
+ }
73
+ finally {
74
+ visited.delete(this.RelatedEntityName);
75
+ this.constructing = false;
76
+ }
77
+ }
78
+ /**
79
+ * Sync provision. Idempotent. For a required FK this is a no-op after `NewRecord`.
80
+ */
81
+ Ensure() {
82
+ if (!this.instance) {
83
+ throw new Error(`EmbeddedRecord '${this.Name}' on ${this.Owner.EntityInfo?.Name}: the related ` +
84
+ `'${this.RelatedEntityName}' instance was not constructed. GetEntityObject must ` +
85
+ `run InitializeEmbeddedRecords before Ensure().`);
86
+ }
87
+ if (this.exposed) {
88
+ return this.instance;
89
+ }
90
+ // Always mint a new peer. After Clear()+Save() the leftover instance is
91
+ // the orphaned row (still IsSaved). Restamping its PK would silently
92
+ // re-attach it. Re-attachment is an explicit FK set, not Ensure's job.
93
+ this.instance.NewRecord();
94
+ this.stampOwnerKey();
95
+ this.exposed = true;
96
+ this.cleared = false;
97
+ return this.instance;
98
+ }
99
+ /**
100
+ * Marks the relationship for removal on the next save. Does not persist by itself.
101
+ */
102
+ Clear() {
103
+ if (this.ClearMode === 'refuse') {
104
+ throw new Error(`EmbeddedRecord '${this.Name}' on ${this.Owner.EntityInfo?.Name}: Clear() is refused ` +
105
+ `(OnClear: 'refuse'). Detaching this relationship is not allowed.`);
106
+ }
107
+ this.exposed = false;
108
+ this.cleared = true;
109
+ this.Owner.Set(this.ForeignKeyField, null);
110
+ }
111
+ /**
112
+ * Called from the owner's `NewRecord()`. Required FKs are provisioned here so
113
+ * `owner.OrderID_Object` is usable immediately after `GetEntityObject`.
114
+ */
115
+ OnOwnerNewRecord() {
116
+ this.cleared = false;
117
+ if (!this.instance) {
118
+ return;
119
+ }
120
+ if (this.IsRequired) {
121
+ const existingFk = this.Owner.Get(this.ForeignKeyField);
122
+ if (existingFk !== null && existingFk !== undefined && existingFk !== '') {
123
+ // Caller passed NewRecord({ [FK]: existingId }). Do not mint a
124
+ // new peer and overwrite that FK. The owner points at an existing
125
+ // row; Load() will hydrate it.
126
+ this.exposed = false;
127
+ }
128
+ else {
129
+ this.instance.NewRecord();
130
+ this.stampOwnerKey();
131
+ this.exposed = true;
132
+ }
133
+ }
134
+ else {
135
+ this.exposed = false;
136
+ }
137
+ }
138
+ /** @inheritdoc */
139
+ get Dirty() {
140
+ if (this.cleared) {
141
+ return true;
142
+ }
143
+ if (!this.exposed || !this.instance) {
144
+ return false;
145
+ }
146
+ return this.instance.Dirty;
147
+ }
148
+ /** @inheritdoc */
149
+ Validate(result) {
150
+ if (!this.exposed || !this.instance) {
151
+ return;
152
+ }
153
+ const inner = this.instance.Validate();
154
+ if (!inner.Success) {
155
+ result.Success = false;
156
+ for (const err of inner.Errors) {
157
+ result.Errors.push(this.prefixError(err));
158
+ }
159
+ }
160
+ }
161
+ /** @inheritdoc */
162
+ async ValidateAsync(result) {
163
+ if (!this.exposed || !this.instance) {
164
+ return;
165
+ }
166
+ const inner = await this.instance.ValidateAsync();
167
+ if (!inner.Success) {
168
+ result.Success = false;
169
+ for (const err of inner.Errors) {
170
+ result.Errors.push(this.prefixError(err));
171
+ }
172
+ }
173
+ }
174
+ /** @inheritdoc */
175
+ ContributeSaveWork(plan, options) {
176
+ if (this.cleared) {
177
+ this.contributeClearWork(plan);
178
+ return;
179
+ }
180
+ if (!this.exposed || !this.instance) {
181
+ return;
182
+ }
183
+ if (this.instance.IsSaved && !this.instance.Dirty && !options?.IgnoreDirtyState) {
184
+ return;
185
+ }
186
+ plan.AddSaveBeforeRoot(this.instance, this.Name);
187
+ plan.AddRootPrepare(() => this.stampOwnerKey());
188
+ }
189
+ /** @inheritdoc */
190
+ ContributePostDeleteWork(plan) {
191
+ if (this.ClearMode !== 'delete') {
192
+ return;
193
+ }
194
+ if (!this.instance || !this.instance.IsSaved) {
195
+ return;
196
+ }
197
+ plan.AddDelete(this.instance, `${this.Name}.OnOwnerDelete`);
198
+ }
199
+ /** @inheritdoc */
200
+ async LoadEager(visited = new Set()) {
201
+ if (!this.instance) {
202
+ return;
203
+ }
204
+ const fk = this.Owner.Get(this.ForeignKeyField);
205
+ if (fk === null || fk === undefined || fk === '') {
206
+ this.exposed = false;
207
+ this.cleared = false;
208
+ // A reused owner instance can still hold the previous record's
209
+ // saved peer. Reset it so Ensure() does not restamp that PK and
210
+ // OnClear:'delete' does not delete the previous peer.
211
+ if (this.instance.IsSaved) {
212
+ this.instance.NewRecord();
213
+ }
214
+ return;
215
+ }
216
+ const token = `${this.RelatedEntityName}:${String(fk)}`;
217
+ if (visited.has(token)) {
218
+ throw new Error(`EmbeddedRecord '${this.Name}' on ${this.Owner.EntityInfo?.Name}: load cycle at ` +
219
+ `${token}. A self-parented or mutually-referential embed cannot inherit forever.`);
220
+ }
221
+ const next = new Set(visited);
222
+ next.add(token);
223
+ // Nested embeds of a different entity were constructed with the owner.
224
+ // Self-FK / cycle peers stay unconstructed until this load walk; init
225
+ // them now so InnerLoad's loadEagerCompanions can inherit.
226
+ await this.instance.InitializeEmbeddedRecords();
227
+ this.instance.SetEmbeddedLoadVisited(next);
228
+ try {
229
+ const loaded = await this.instance.InnerLoad(this.keyFromForeignKey(fk));
230
+ if (!loaded) {
231
+ if (this.IsRequired) {
232
+ throw new Error(`EmbeddedRecord '${this.Name}' on ${this.Owner.EntityInfo?.Name}: required ` +
233
+ `FK ${this.ForeignKeyField}='${fk}' does not resolve to a ${this.RelatedEntityName} row.`);
234
+ }
235
+ this.exposed = false;
236
+ return;
237
+ }
238
+ this.exposed = true;
239
+ this.cleared = false;
240
+ if (this.LoadNested === 'related') {
241
+ await this.instance.LoadRelatedRecords();
242
+ }
243
+ }
244
+ finally {
245
+ this.instance.SetEmbeddedLoadVisited(undefined);
246
+ }
247
+ }
248
+ /** @inheritdoc */
249
+ AcceptChanges() {
250
+ this.cleared = false;
251
+ }
252
+ /** @inheritdoc */
253
+ async Serialize(mode = 'request') {
254
+ if (this.cleared) {
255
+ return { Fields: {}, IsNew: false, Cleared: true, Companions: null };
256
+ }
257
+ if (!this.exposed || !this.instance) {
258
+ return null;
259
+ }
260
+ // Request: omit a clean saved peer so a header-only edit does not ship it.
261
+ // Result: always ship an exposed peer so the client can mark it saved.
262
+ // Skipping result-serialize left the client IsSaved=false; the next Save
263
+ // re-sent IsNew:true and the server re-INSERTed the same UUID.
264
+ if (mode !== 'result' && this.instance.IsSaved && !this.instance.Dirty) {
265
+ return null;
266
+ }
267
+ const companions = await this.instance.SerializeCompanions(mode);
268
+ return {
269
+ EntityName: this.instance.EntityInfo?.Name ?? this.RelatedEntityName,
270
+ Fields: this.instance.GetAll(),
271
+ IsNew: !this.instance.IsSaved,
272
+ Cleared: false,
273
+ Companions: companions.length > 0 ? companions : null,
274
+ };
275
+ }
276
+ /** @inheritdoc */
277
+ async Deserialize(data, mode = 'request') {
278
+ if (!data) {
279
+ return;
280
+ }
281
+ if (data.Cleared) {
282
+ this.exposed = false;
283
+ this.cleared = true;
284
+ this.Owner.Set(this.ForeignKeyField, null);
285
+ return;
286
+ }
287
+ if (data.EntityName && data.EntityName !== this.RelatedEntityName && (!this.instance || this.instance.EntityInfo?.Name !== data.EntityName)) {
288
+ const provider = this.Owner.ProviderToUse;
289
+ if (provider) {
290
+ this.instance = (await provider.GetEntityObject(data.EntityName, this.Owner.ContextCurrentUser));
291
+ }
292
+ }
293
+ if (!this.instance) {
294
+ await this.InitializeInstance(new Set());
295
+ }
296
+ if (!this.instance) {
297
+ throw new Error(`EmbeddedRecord '${this.Name}': cannot deserialize — no instance of ${data.EntityName ?? this.RelatedEntityName}.`);
298
+ }
299
+ await this.applyWire(data, mode);
300
+ this.exposed = true;
301
+ this.cleared = false;
302
+ }
303
+ async applyWire(data, mode) {
304
+ const target = this.instance;
305
+ if (mode === 'result') {
306
+ await target.LoadFromData(data.Fields, true);
307
+ if (data.Companions && data.Companions.length > 0) {
308
+ await target.DeserializeCompanions(data.Companions, 'result');
309
+ }
310
+ return;
311
+ }
312
+ if (data.IsNew) {
313
+ target.NewRecord();
314
+ target.SetMany(data.Fields, true);
315
+ }
316
+ else {
317
+ await this.loadExistingThenApply(target, data.Fields);
318
+ }
319
+ if (data.Companions && data.Companions.length > 0) {
320
+ await target.DeserializeCompanions(data.Companions, mode);
321
+ }
322
+ }
323
+ async loadExistingThenApply(target, fields) {
324
+ const key = new CompositeKey(target.EntityInfo.PrimaryKeys.map(pk => new KeyValuePair(pk.Name, fields[pk.Name])));
325
+ const loaded = await target.InnerLoad(key);
326
+ if (!loaded) {
327
+ throw new Error(`EmbeddedRecord '${this.Name}': cannot load existing ${this.RelatedEntityName} ` +
328
+ `record ${key.ToString()} referenced by the incoming payload.`);
329
+ }
330
+ target.SetMany(fields, true);
331
+ }
332
+ contributeClearWork(plan) {
333
+ plan.AddRootPrepare(() => this.Owner.Set(this.ForeignKeyField, null));
334
+ if (this.ClearMode === 'delete' && this.instance?.IsSaved) {
335
+ plan.AddDelete(this.instance, `${this.Name}.Cleared`);
336
+ }
337
+ }
338
+ stampOwnerKey() {
339
+ const key = this.instance?.FirstPrimaryKey?.Value;
340
+ if (key === null || key === undefined || key === '') {
341
+ return;
342
+ }
343
+ this.Owner.Set(this.ForeignKeyField, key);
344
+ }
345
+ keyFromForeignKey(fk) {
346
+ const pks = this.instance.EntityInfo.PrimaryKeys;
347
+ if (pks.length === 1) {
348
+ return CompositeKey.FromID(fk);
349
+ }
350
+ return new CompositeKey(pks.map(pk => new KeyValuePair(pk.Name, fk)));
351
+ }
352
+ prefixError(err) {
353
+ return new ValidationErrorInfo(`${this.Name}.${err.Source ?? ''}`.replace(/\.$/, ''), err.Message, err.Value, err.Type ?? ValidationErrorType.Failure);
354
+ }
355
+ }
356
+ //# sourceMappingURL=embeddedRecord.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddedRecord.js","sourceRoot":"","sources":["../../src/generic/embeddedRecord.ts"],"names":[],"mappings":"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"}
@@ -127,9 +127,13 @@ export declare abstract class EntityCompanion<TWire = unknown> {
127
127
  * touches only header fields should not ship an empty children array and pay for it on every
128
128
  * request.
129
129
  *
130
+ * @param mode - `'request'` (default) is the caller's intent — omit a clean saved
131
+ * companion so a header-only edit does not ship it. `'result'` is
132
+ * post-save state the client must adopt so the next save does not
133
+ * re-INSERT a peer the server already persisted.
130
134
  * @returns The wire payload, or `null` to omit this companion.
131
135
  */
132
- abstract Serialize(): Promise<TWire | null>;
136
+ abstract Serialize(mode?: EntityCompanionDeserializeMode): Promise<TWire | null>;
133
137
  /**
134
138
  * Restores this companion's state from a wire payload produced by {@link Serialize} on the
135
139
  * other tier.
@@ -200,6 +204,16 @@ export declare abstract class EntityCompanion<TWire = unknown> {
200
204
  * @param _plan - The plan being assembled for this unit of work.
201
205
  */
202
206
  ContributeDeleteWork(_plan: EntitySavePlan): void;
207
+ /**
208
+ * Contributes work that must run **after** the owner's own delete node.
209
+ *
210
+ * Related-record collections delete first (they point at the owner). Embedded
211
+ * records delete last (the owner points at them — the FK dies with the owner
212
+ * row, then the peer can go). Default is a no-op.
213
+ *
214
+ * @param _plan - The plan being assembled; the owner's delete node already exists.
215
+ */
216
+ ContributePostDeleteWork(_plan: EntitySavePlan): void;
203
217
  /**
204
218
  * Populates this companion from the database, when it is configured to load eagerly.
205
219
  *
@@ -207,8 +221,12 @@ export declare abstract class EntityCompanion<TWire = unknown> {
207
221
  * from `LoadFromData()` — that is the row-materialization path for
208
222
  * `RunView(ResultType:'entity_object')`, so loading children there turns one view into an N+1
209
223
  * storm. Set-oriented eager loading is handled by `RunView`'s batched child loading instead.
224
+ *
225
+ * @param _visited - EntityName:PK tokens already on this load walk. Embedded
226
+ * records use it to fail a self-parented / cyclic inherit
227
+ * instead of recursing until the stack dies.
210
228
  */
211
- LoadEager(): Promise<void>;
229
+ LoadEager(_visited?: Set<string>): Promise<void>;
212
230
  /**
213
231
  * Resets the companion to its post-save state — clearing pending removals, rebasing dirty
214
232
  * tracking, and so on. Called after the graph commits successfully.
@@ -1 +1 @@
1
- {"version":3,"file":"entityCompanion.d.ts","sourceRoot":"","sources":["../../src/generic/entityCompanion.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEtD;;;;;GAKG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACjC,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,IAAI,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,kBAAkB,CAAC;AAErD;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,8BAA8B,GAAG,SAAS,GAAG,QAAQ,CAAC;AAElE;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,8BAAsB,eAAe,CAAC,KAAK,GAAG,OAAO;IACjD;;OAEG;IACH,SAAgB,KAAK,EAAE,UAAU,CAAC;IAElC;;OAEG;gBACS,KAAK,EAAE,UAAU;IAI7B;;;;;;OAMG;IACH,kBAAyB,IAAI,EAAE,MAAM,CAAC;IAEtC;;;;;;;;;OASG;aACa,SAAS,IAAI,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAElD;;;;;;;;;;OAUG;aACa,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,8BAA8B,GAAG,OAAO,CAAC,IAAI,CAAC;IAE7F;;;;;;;;OAQG;IACH,IAAW,KAAK,IAAI,OAAO,CAE1B;IAED;;;;;;;;;;OAUG;IACI,QAAQ,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAIhD;;;;;;;;;;;OAWG;IACU,aAAa,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpE;;;;;;;;;;;OAWG;IACI,kBAAkB,CAAC,KAAK,EAAE,cAAc,EAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,IAAI;IAIpF;;;;;;;;OAQG;IACI,oBAAoB,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAIxD;;;;;;;OAOG;IACU,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAIvC;;;OAGG;IACI,aAAa,IAAI,IAAI;CAG/B"}
1
+ {"version":3,"file":"entityCompanion.d.ts","sourceRoot":"","sources":["../../src/generic/entityCompanion.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEtD;;;;;GAKG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACjC,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,IAAI,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,kBAAkB,CAAC;AAErD;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,8BAA8B,GAAG,SAAS,GAAG,QAAQ,CAAC;AAElE;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,8BAAsB,eAAe,CAAC,KAAK,GAAG,OAAO;IACjD;;OAEG;IACH,SAAgB,KAAK,EAAE,UAAU,CAAC;IAElC;;OAEG;gBACS,KAAK,EAAE,UAAU;IAI7B;;;;;;OAMG;IACH,kBAAyB,IAAI,EAAE,MAAM,CAAC;IAEtC;;;;;;;;;;;;;OAaG;aACa,SAAS,CAAC,IAAI,CAAC,EAAE,8BAA8B,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAEvF;;;;;;;;;;OAUG;aACa,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,8BAA8B,GAAG,OAAO,CAAC,IAAI,CAAC;IAE7F;;;;;;;;OAQG;IACH,IAAW,KAAK,IAAI,OAAO,CAE1B;IAED;;;;;;;;;;OAUG;IACI,QAAQ,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAIhD;;;;;;;;;;;OAWG;IACU,aAAa,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpE;;;;;;;;;;;OAWG;IACI,kBAAkB,CAAC,KAAK,EAAE,cAAc,EAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,IAAI;IAIpF;;;;;;;;OAQG;IACI,oBAAoB,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAIxD;;;;;;;;OAQG;IACI,wBAAwB,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAI5D;;;;;;;;;;;OAWG;IACU,SAAS,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7D;;;OAGG;IACI,aAAa,IAAI,IAAI;CAG/B"}
@@ -148,6 +148,18 @@ export class EntityCompanion {
148
148
  ContributeDeleteWork(_plan) {
149
149
  /* no-op by default */
150
150
  }
151
+ /**
152
+ * Contributes work that must run **after** the owner's own delete node.
153
+ *
154
+ * Related-record collections delete first (they point at the owner). Embedded
155
+ * records delete last (the owner points at them — the FK dies with the owner
156
+ * row, then the peer can go). Default is a no-op.
157
+ *
158
+ * @param _plan - The plan being assembled; the owner's delete node already exists.
159
+ */
160
+ ContributePostDeleteWork(_plan) {
161
+ /* no-op by default */
162
+ }
151
163
  /**
152
164
  * Populates this companion from the database, when it is configured to load eagerly.
153
165
  *
@@ -155,8 +167,12 @@ export class EntityCompanion {
155
167
  * from `LoadFromData()` — that is the row-materialization path for
156
168
  * `RunView(ResultType:'entity_object')`, so loading children there turns one view into an N+1
157
169
  * storm. Set-oriented eager loading is handled by `RunView`'s batched child loading instead.
170
+ *
171
+ * @param _visited - EntityName:PK tokens already on this load walk. Embedded
172
+ * records use it to fail a self-parented / cyclic inherit
173
+ * instead of recursing until the stack dies.
158
174
  */
159
- async LoadEager() {
175
+ async LoadEager(_visited) {
160
176
  /* no-op by default */
161
177
  }
162
178
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"entityCompanion.js","sourceRoot":"","sources":["../../src/generic/entityCompanion.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAoBH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,eAAe,CAAC;AAgBrD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,OAAgB,eAAe;IAMjC;;OAEG;IACH,YAAY,KAAiB;QACzB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;IAoCD;;;;;;;;OAQG;IACH,IAAW,KAAK;QACZ,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;;;;;;;;;OAUG;IACI,QAAQ,CAAC,OAAyB;QACrC,sBAAsB;IAC1B,CAAC;IAED;;;;;;;;;;;OAWG;IACI,KAAK,CAAC,aAAa,CAAC,OAAyB;QAChD,sBAAsB;IAC1B,CAAC;IAED;;;;;;;;;;;OAWG;IACI,kBAAkB,CAAC,KAAqB,EAAE,QAA4B;QACzE,sBAAsB;IAC1B,CAAC;IAED;;;;;;;;OAQG;IACI,oBAAoB,CAAC,KAAqB;QAC7C,sBAAsB;IAC1B,CAAC;IAED;;;;;;;OAOG;IACI,KAAK,CAAC,SAAS;QAClB,sBAAsB;IAC1B,CAAC;IAED;;;OAGG;IACI,aAAa;QAChB,sBAAsB;IAC1B,CAAC;CACJ"}
1
+ {"version":3,"file":"entityCompanion.js","sourceRoot":"","sources":["../../src/generic/entityCompanion.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAoBH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,eAAe,CAAC;AAgBrD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,OAAgB,eAAe;IAMjC;;OAEG;IACH,YAAY,KAAiB;QACzB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;IAwCD;;;;;;;;OAQG;IACH,IAAW,KAAK;QACZ,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;;;;;;;;;OAUG;IACI,QAAQ,CAAC,OAAyB;QACrC,sBAAsB;IAC1B,CAAC;IAED;;;;;;;;;;;OAWG;IACI,KAAK,CAAC,aAAa,CAAC,OAAyB;QAChD,sBAAsB;IAC1B,CAAC;IAED;;;;;;;;;;;OAWG;IACI,kBAAkB,CAAC,KAAqB,EAAE,QAA4B;QACzE,sBAAsB;IAC1B,CAAC;IAED;;;;;;;;OAQG;IACI,oBAAoB,CAAC,KAAqB;QAC7C,sBAAsB;IAC1B,CAAC;IAED;;;;;;;;OAQG;IACI,wBAAwB,CAAC,KAAqB;QACjD,sBAAsB;IAC1B,CAAC;IAED;;;;;;;;;;;OAWG;IACI,KAAK,CAAC,SAAS,CAAC,QAAsB;QACzC,sBAAsB;IAC1B,CAAC;IAED;;;OAGG;IACI,aAAa;QAChB,sBAAsB;IAC1B,CAAC;CACJ"}