@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.
- package/LICENSE +180 -4
- package/dist/generic/InMemoryLocalStorageProvider.d.ts +6 -0
- package/dist/generic/InMemoryLocalStorageProvider.d.ts.map +1 -1
- package/dist/generic/InMemoryLocalStorageProvider.js +6 -0
- package/dist/generic/InMemoryLocalStorageProvider.js.map +1 -1
- package/dist/generic/JSONType-interfaces/IEntityConfiguration.d.ts +120 -0
- package/dist/generic/JSONType-interfaces/IEntityConfiguration.d.ts.map +1 -0
- package/dist/generic/JSONType-interfaces/IEntityConfiguration.js +6 -0
- package/dist/generic/JSONType-interfaces/IEntityConfiguration.js.map +1 -0
- package/dist/generic/JSONType-interfaces/IEntityFieldConfiguration.d.ts +31 -0
- package/dist/generic/JSONType-interfaces/IEntityFieldConfiguration.d.ts.map +1 -0
- package/dist/generic/JSONType-interfaces/IEntityFieldConfiguration.js +6 -0
- package/dist/generic/JSONType-interfaces/IEntityFieldConfiguration.js.map +1 -0
- package/dist/generic/JSONType-interfaces/IEntityRelationshipConfiguration.d.ts +75 -0
- package/dist/generic/JSONType-interfaces/IEntityRelationshipConfiguration.d.ts.map +1 -0
- package/dist/generic/JSONType-interfaces/IEntityRelationshipConfiguration.js +6 -0
- package/dist/generic/JSONType-interfaces/IEntityRelationshipConfiguration.js.map +1 -0
- package/dist/generic/JSONType-interfaces/IFileStorageProviderConfiguration.d.ts +19 -0
- package/dist/generic/JSONType-interfaces/IFileStorageProviderConfiguration.d.ts.map +1 -0
- package/dist/generic/JSONType-interfaces/IFileStorageProviderConfiguration.js +6 -0
- package/dist/generic/JSONType-interfaces/IFileStorageProviderConfiguration.js.map +1 -0
- package/dist/generic/authTypes.d.ts +69 -0
- package/dist/generic/authTypes.d.ts.map +1 -1
- package/dist/generic/baseEngine.d.ts +14 -0
- package/dist/generic/baseEngine.d.ts.map +1 -1
- package/dist/generic/baseEngine.js +53 -13
- package/dist/generic/baseEngine.js.map +1 -1
- package/dist/generic/baseEntity.d.ts +150 -23
- package/dist/generic/baseEntity.d.ts.map +1 -1
- package/dist/generic/baseEntity.js +435 -66
- package/dist/generic/baseEntity.js.map +1 -1
- package/dist/generic/baseInfo.d.ts.map +1 -1
- package/dist/generic/baseInfo.js +16 -4
- package/dist/generic/baseInfo.js.map +1 -1
- package/dist/generic/compositeKey.d.ts +30 -0
- package/dist/generic/compositeKey.d.ts.map +1 -1
- package/dist/generic/compositeKey.js +97 -0
- package/dist/generic/compositeKey.js.map +1 -1
- package/dist/generic/dataHooks.d.ts +5 -0
- package/dist/generic/dataHooks.d.ts.map +1 -1
- package/dist/generic/dataHooks.js +27 -3
- package/dist/generic/dataHooks.js.map +1 -1
- package/dist/generic/databaseProviderBase.d.ts.map +1 -1
- package/dist/generic/databaseProviderBase.js +9 -5
- package/dist/generic/databaseProviderBase.js.map +1 -1
- package/dist/generic/embeddedRecord.d.ts +123 -0
- package/dist/generic/embeddedRecord.d.ts.map +1 -0
- package/dist/generic/embeddedRecord.js +356 -0
- package/dist/generic/embeddedRecord.js.map +1 -0
- package/dist/generic/entityCompanion.d.ts +20 -2
- package/dist/generic/entityCompanion.d.ts.map +1 -1
- package/dist/generic/entityCompanion.js +17 -1
- package/dist/generic/entityCompanion.js.map +1 -1
- package/dist/generic/entityConfiguration.d.ts +131 -0
- package/dist/generic/entityConfiguration.d.ts.map +1 -0
- package/dist/generic/entityConfiguration.js +346 -0
- package/dist/generic/entityConfiguration.js.map +1 -0
- package/dist/generic/entityInfo.d.ts +274 -4
- package/dist/generic/entityInfo.d.ts.map +1 -1
- package/dist/generic/entityInfo.js +502 -14
- package/dist/generic/entityInfo.js.map +1 -1
- package/dist/generic/entitySavePlan.d.ts +40 -11
- package/dist/generic/entitySavePlan.d.ts.map +1 -1
- package/dist/generic/entitySavePlan.js +70 -2
- package/dist/generic/entitySavePlan.js.map +1 -1
- package/dist/generic/interfaces.d.ts +35 -24
- package/dist/generic/interfaces.d.ts.map +1 -1
- package/dist/generic/interfaces.js +6 -24
- package/dist/generic/interfaces.js.map +1 -1
- package/dist/generic/localCacheManager.d.ts +123 -5
- package/dist/generic/localCacheManager.d.ts.map +1 -1
- package/dist/generic/localCacheManager.js +264 -9
- package/dist/generic/localCacheManager.js.map +1 -1
- package/dist/generic/providerBase.d.ts +118 -0
- package/dist/generic/providerBase.d.ts.map +1 -1
- package/dist/generic/providerBase.js +311 -11
- package/dist/generic/providerBase.js.map +1 -1
- package/dist/generic/relatedRecordCollection.d.ts +36 -4
- package/dist/generic/relatedRecordCollection.d.ts.map +1 -1
- package/dist/generic/relatedRecordCollection.js +70 -8
- package/dist/generic/relatedRecordCollection.js.map +1 -1
- package/dist/generic/runQuery.d.ts +14 -0
- package/dist/generic/runQuery.d.ts.map +1 -1
- package/dist/generic/runQuery.js.map +1 -1
- package/dist/generic/saveEntityGraphOperation.js +1 -1
- package/dist/generic/saveEntityGraphOperation.js.map +1 -1
- package/dist/generic/securityInfo.d.ts.map +1 -1
- package/dist/generic/securityInfo.js +15 -5
- package/dist/generic/securityInfo.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/views/runView.d.ts +58 -0
- package/dist/views/runView.d.ts.map +1 -1
- package/dist/views/runView.js +20 -0
- package/dist/views/runView.js.map +1 -1
- package/package.json +5 -4
- 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
|
|
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;
|
|
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"}
|