@researchdatabox/sails-ng-common 5.0.4-beta.12498 → 5.0.5
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/dist/src/config/component/checkbox-input.model.d.ts +0 -1
- package/dist/src/config/component/checkbox-input.model.js +1 -2
- package/dist/src/config/component/checkbox-input.outline.d.ts +1 -2
- package/dist/src/config/component/checkbox-input.outline.js +1 -1
- package/dist/src/config/component/data-location.outline.d.ts +0 -1
- package/dist/src/config/component/file-upload.outline.d.ts +0 -2
- package/dist/src/config/component/file-upload.outline.js +1 -1
- package/dist/src/config/component/save-button.model.d.ts +0 -1
- package/dist/src/config/component/save-button.model.js +1 -2
- package/dist/src/config/component/save-button.outline.d.ts +0 -5
- package/dist/src/config/component/save-status.model.d.ts +0 -4
- package/dist/src/config/component/save-status.model.js +1 -5
- package/dist/src/config/component/save-status.outline.d.ts +0 -20
- package/dist/src/config/dictionary.model.d.ts +4 -28
- package/dist/src/config/dictionary.model.js +1 -7
- package/dist/src/config/dictionary.outline.d.ts +3 -5
- package/dist/src/config/form-behaviour.outline.d.ts +7 -120
- package/dist/src/config/form-behaviour.outline.js +5 -13
- package/dist/src/config/form-component.model.d.ts +0 -1
- package/dist/src/config/form-component.model.js +1 -2
- package/dist/src/config/form-component.outline.d.ts +0 -14
- package/dist/src/config/form-config.model.d.ts +0 -3
- package/dist/src/config/form-config.model.js +1 -2
- package/dist/src/config/form-config.outline.d.ts +0 -10
- package/dist/src/config/form-override.model.js +3 -4
- package/dist/src/config/visitor/base.model.d.ts +0 -6
- package/dist/src/config/visitor/base.model.js +1 -13
- package/dist/src/config/visitor/base.outline.d.ts +0 -6
- package/dist/src/config/visitor/common.model.js +1 -2
- package/dist/src/index.d.ts +1 -9
- package/dist/src/index.js +2 -10
- package/dist/src/jsonata-helpers.d.ts +0 -15
- package/dist/src/jsonata-helpers.js +13 -49
- package/dist/src/translation-html.d.ts +23 -0
- package/dist/src/translation-html.js +170 -0
- package/package.json +11 -16
- package/dist/src/config/component/related-object-data.model.d.ts +0 -45
- package/dist/src/config/component/related-object-data.model.js +0 -39
- package/dist/src/config/component/related-object-data.outline.d.ts +0 -59
- package/dist/src/config/component/related-object-data.outline.js +0 -5
- package/dist/src/config/component/workspace.model.d.ts +0 -44
- package/dist/src/config/component/workspace.model.js +0 -44
- package/dist/src/config/component/workspace.outline.d.ts +0 -62
- package/dist/src/config/component/workspace.outline.js +0 -5
- package/dist/src/internal/plain-record.d.ts +0 -11
- package/dist/src/internal/plain-record.js +0 -21
- package/dist/src/jsonata-parity.fixtures.d.ts +0 -9
- package/dist/src/jsonata-parity.fixtures.js +0 -25
- package/dist/src/record-concurrency.model.d.ts +0 -118
- package/dist/src/record-concurrency.model.js +0 -199
- package/dist/src/record-diff.d.ts +0 -69
- package/dist/src/record-diff.js +0 -298
- package/dist/src/record-save.model.d.ts +0 -154
- package/dist/src/record-save.model.js +0 -289
- package/dist/src/testing.d.ts +0 -3
- package/dist/src/testing.js +0 -20
- package/dist/src/validation/record-validation.model.d.ts +0 -84
- package/dist/src/validation/record-validation.model.js +0 -53
- package/dist/src/validation/validation-groups.d.ts +0 -29
- package/dist/src/validation/validation-groups.fixtures.d.ts +0 -20
- package/dist/src/validation/validation-groups.fixtures.js +0 -83
- package/dist/src/validation/validation-groups.js +0 -82
package/dist/src/record-diff.js
DELETED
|
@@ -1,298 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.diffRecordValues = diffRecordValues;
|
|
4
|
-
exports.normalizeConcurrencyPath = normalizeConcurrencyPath;
|
|
5
|
-
exports.recordValuePathsOverlap = recordValuePathsOverlap;
|
|
6
|
-
exports.canonicallyEqualRecordValues = canonicallyEqualRecordValues;
|
|
7
|
-
exports.diffRecordValuesForConcurrency = diffRecordValuesForConcurrency;
|
|
8
|
-
exports.compareThreeWayRecordValues = compareThreeWayRecordValues;
|
|
9
|
-
exports.applyRecordValueChanges = applyRecordValueChanges;
|
|
10
|
-
exports.rebaseRecordValues = rebaseRecordValues;
|
|
11
|
-
const lodash_1 = require("lodash");
|
|
12
|
-
const plain_record_1 = require("./internal/plain-record");
|
|
13
|
-
/**
|
|
14
|
-
* Pure recursive diff retaining the established FormRecordConsistencyService
|
|
15
|
-
* add/delete/change and path ordering contract.
|
|
16
|
-
*/
|
|
17
|
-
function diffRecordValues(original, changed, path = []) {
|
|
18
|
-
if (original === changed)
|
|
19
|
-
return [];
|
|
20
|
-
const originalArray = Array.isArray(original);
|
|
21
|
-
const changedArray = Array.isArray(changed);
|
|
22
|
-
const originalRecord = (0, plain_record_1.isPlainRecord)(original);
|
|
23
|
-
const changedRecord = (0, plain_record_1.isPlainRecord)(changed);
|
|
24
|
-
if ((originalArray && changedArray) || (originalRecord && changedRecord)) {
|
|
25
|
-
const originalKeys = valueKeys(original);
|
|
26
|
-
const changedKeys = valueKeys(changed);
|
|
27
|
-
const originalKeySet = new Set(originalKeys);
|
|
28
|
-
const changedKeySet = new Set(changedKeys);
|
|
29
|
-
const result = [];
|
|
30
|
-
for (const key of originalKeys) {
|
|
31
|
-
const nextPath = [...path, key];
|
|
32
|
-
const originalValue = valueAtKey(original, key);
|
|
33
|
-
if (!changedKeySet.has(key)) {
|
|
34
|
-
result.push({ kind: 'delete', path: nextPath, original: originalValue, changed: undefined });
|
|
35
|
-
continue;
|
|
36
|
-
}
|
|
37
|
-
result.push(...diffRecordValues(originalValue, valueAtKey(changed, key), nextPath));
|
|
38
|
-
}
|
|
39
|
-
for (const key of changedKeys) {
|
|
40
|
-
if (originalKeySet.has(key))
|
|
41
|
-
continue;
|
|
42
|
-
result.push({
|
|
43
|
-
kind: 'add',
|
|
44
|
-
path: [...path, key],
|
|
45
|
-
original: undefined,
|
|
46
|
-
changed: valueAtKey(changed, key),
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
return result;
|
|
50
|
-
}
|
|
51
|
-
return [{ kind: 'change', path: [...path], original, changed }];
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Collapse a descendant of an array to the containing array path. Numeric path
|
|
55
|
-
* segments are emitted only by array traversal; numeric-looking object keys
|
|
56
|
-
* remain strings and therefore remain ordinary object properties.
|
|
57
|
-
*/
|
|
58
|
-
function normalizeConcurrencyPath(path) {
|
|
59
|
-
const firstArrayIndex = path.findIndex(segment => typeof segment === 'number');
|
|
60
|
-
return firstArrayIndex < 0 ? [...path] : path.slice(0, firstArrayIndex);
|
|
61
|
-
}
|
|
62
|
-
/** Prefix-aware path overlap: equality, local parent, or remote parent. */
|
|
63
|
-
function recordValuePathsOverlap(first, second) {
|
|
64
|
-
const commonLength = Math.min(first.length, second.length);
|
|
65
|
-
for (let index = 0; index < commonLength; index += 1) {
|
|
66
|
-
if (first[index] !== second[index])
|
|
67
|
-
return false;
|
|
68
|
-
}
|
|
69
|
-
return true;
|
|
70
|
-
}
|
|
71
|
-
/** Deterministic deep equality for JSON-like values; object key order is ignored. */
|
|
72
|
-
function canonicallyEqualRecordValues(first, second) {
|
|
73
|
-
return (0, lodash_1.isEqual)(first, second);
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* Concurrency diff with arrays/repeatables represented by one whole-value
|
|
77
|
-
* change at their root. The ordinary diff remains index-based for audit users.
|
|
78
|
-
*/
|
|
79
|
-
function diffRecordValuesForConcurrency(original, changed, path = []) {
|
|
80
|
-
if (canonicallyEqualRecordValues(original, changed))
|
|
81
|
-
return [];
|
|
82
|
-
if (Array.isArray(original) || Array.isArray(changed)) {
|
|
83
|
-
return [{ kind: 'change', path: [...path], original, changed }];
|
|
84
|
-
}
|
|
85
|
-
const originalRecord = (0, plain_record_1.isPlainRecord)(original);
|
|
86
|
-
const changedRecord = (0, plain_record_1.isPlainRecord)(changed);
|
|
87
|
-
if (originalRecord && changedRecord) {
|
|
88
|
-
const result = [];
|
|
89
|
-
const changedKeys = new Set(Object.keys(changed));
|
|
90
|
-
const originalKeys = Object.keys(original);
|
|
91
|
-
const originalKeySet = new Set(originalKeys);
|
|
92
|
-
for (const key of originalKeys) {
|
|
93
|
-
const nextPath = [...path, key];
|
|
94
|
-
if (!changedKeys.has(key)) {
|
|
95
|
-
result.push({ kind: 'delete', path: nextPath, original: original[key], changed: undefined });
|
|
96
|
-
continue;
|
|
97
|
-
}
|
|
98
|
-
result.push(...diffRecordValuesForConcurrency(original[key], changed[key], nextPath));
|
|
99
|
-
}
|
|
100
|
-
for (const key of Object.keys(changed)) {
|
|
101
|
-
if (originalKeySet.has(key))
|
|
102
|
-
continue;
|
|
103
|
-
result.push({ kind: 'add', path: [...path, key], original: undefined, changed: changed[key] });
|
|
104
|
-
}
|
|
105
|
-
return result;
|
|
106
|
-
}
|
|
107
|
-
return [{ kind: 'change', path: [...path], original, changed }];
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Compare base/local/latest and classify overlaps using final projected state,
|
|
111
|
-
* not merely the leaf values stored on individual diff entries.
|
|
112
|
-
*/
|
|
113
|
-
function compareThreeWayRecordValues(base, local, latest) {
|
|
114
|
-
const localChanges = diffRecordValuesForConcurrency(base, local);
|
|
115
|
-
const remoteChanges = diffRecordValuesForConcurrency(base, latest);
|
|
116
|
-
const resolvedOverlaps = [];
|
|
117
|
-
const unresolvedOverlaps = [];
|
|
118
|
-
const localWithDivergentOverlap = new Set();
|
|
119
|
-
for (const localChange of localChanges) {
|
|
120
|
-
for (const remoteChange of remoteChanges) {
|
|
121
|
-
if (!recordValuePathsOverlap(localChange.path, remoteChange.path))
|
|
122
|
-
continue;
|
|
123
|
-
const overlapPath = localChange.path.length <= remoteChange.path.length ? localChange.path : remoteChange.path;
|
|
124
|
-
const resolved = locatedValuesEqual(valueAtPath(local, overlapPath), valueAtPath(latest, overlapPath));
|
|
125
|
-
const overlap = {
|
|
126
|
-
path: [...overlapPath],
|
|
127
|
-
local: localChange,
|
|
128
|
-
remote: remoteChange,
|
|
129
|
-
resolved,
|
|
130
|
-
};
|
|
131
|
-
if (resolved) {
|
|
132
|
-
resolvedOverlaps.push(overlap);
|
|
133
|
-
}
|
|
134
|
-
else {
|
|
135
|
-
unresolvedOverlaps.push(overlap);
|
|
136
|
-
localWithDivergentOverlap.add(localChange);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
const applicableLocalChanges = localChanges.filter(change => {
|
|
141
|
-
if (localWithDivergentOverlap.has(change))
|
|
142
|
-
return false;
|
|
143
|
-
return !remoteChanges.some(remote => recordValuePathsOverlap(change.path, remote.path));
|
|
144
|
-
});
|
|
145
|
-
const localChangesAlreadyPresent = localChanges.every(change => locatedValuesEqual(valueAtPath(local, change.path), valueAtPath(latest, change.path)));
|
|
146
|
-
return {
|
|
147
|
-
localChanges,
|
|
148
|
-
remoteChanges,
|
|
149
|
-
applicableLocalChanges,
|
|
150
|
-
resolvedOverlaps,
|
|
151
|
-
unresolvedOverlaps,
|
|
152
|
-
localChangesAlreadyPresent,
|
|
153
|
-
};
|
|
154
|
-
}
|
|
155
|
-
/**
|
|
156
|
-
* Clone latest and apply the supplied structural changes without mutating any
|
|
157
|
-
* snapshot. Numeric deletes against the same array are applied from the
|
|
158
|
-
* highest index down, so a compatible `diffRecordValues()` result cannot
|
|
159
|
-
* shift a later delete onto the wrong item.
|
|
160
|
-
*/
|
|
161
|
-
function applyRecordValueChanges(latest, changes) {
|
|
162
|
-
let result = (0, lodash_1.cloneDeep)(latest);
|
|
163
|
-
for (const change of changesInApplicationOrder(changes)) {
|
|
164
|
-
if (change.path.length === 0) {
|
|
165
|
-
result = change.kind === 'delete' ? undefined : (0, lodash_1.cloneDeep)(change.changed);
|
|
166
|
-
continue;
|
|
167
|
-
}
|
|
168
|
-
result = applyChangeAtPath(result, change);
|
|
169
|
-
}
|
|
170
|
-
return result;
|
|
171
|
-
}
|
|
172
|
-
function changesInApplicationOrder(changes) {
|
|
173
|
-
const arrayDeleteGroups = new Map();
|
|
174
|
-
for (const change of changes) {
|
|
175
|
-
const key = arrayDeleteParentKey(change);
|
|
176
|
-
if (key === undefined)
|
|
177
|
-
continue;
|
|
178
|
-
const group = arrayDeleteGroups.get(key) ?? [];
|
|
179
|
-
group.push(change);
|
|
180
|
-
arrayDeleteGroups.set(key, group);
|
|
181
|
-
}
|
|
182
|
-
for (const group of arrayDeleteGroups.values()) {
|
|
183
|
-
group.sort((first, second) => {
|
|
184
|
-
const firstIndex = first.path[first.path.length - 1];
|
|
185
|
-
const secondIndex = second.path[second.path.length - 1];
|
|
186
|
-
return secondIndex - firstIndex;
|
|
187
|
-
});
|
|
188
|
-
for (let index = 1; index < group.length; index += 1) {
|
|
189
|
-
const previousIndex = group[index - 1].path[group[index - 1].path.length - 1];
|
|
190
|
-
const currentIndex = group[index].path[group[index].path.length - 1];
|
|
191
|
-
if (previousIndex === currentIndex) {
|
|
192
|
-
throw new TypeError('A record change set cannot delete the same array index more than once.');
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
const emittedGroups = new Set();
|
|
197
|
-
const ordered = [];
|
|
198
|
-
for (const change of changes) {
|
|
199
|
-
const key = arrayDeleteParentKey(change);
|
|
200
|
-
if (key === undefined) {
|
|
201
|
-
ordered.push(change);
|
|
202
|
-
continue;
|
|
203
|
-
}
|
|
204
|
-
if (emittedGroups.has(key))
|
|
205
|
-
continue;
|
|
206
|
-
emittedGroups.add(key);
|
|
207
|
-
ordered.push(...(arrayDeleteGroups.get(key) ?? []));
|
|
208
|
-
}
|
|
209
|
-
return ordered;
|
|
210
|
-
}
|
|
211
|
-
function arrayDeleteParentKey(change) {
|
|
212
|
-
if (change.kind !== 'delete' || change.path.length === 0)
|
|
213
|
-
return undefined;
|
|
214
|
-
const finalSegment = change.path[change.path.length - 1];
|
|
215
|
-
if (typeof finalSegment !== 'number')
|
|
216
|
-
return undefined;
|
|
217
|
-
if (!Number.isSafeInteger(finalSegment) || finalSegment < 0) {
|
|
218
|
-
throw new TypeError('A record change array index must be a non-negative safe integer.');
|
|
219
|
-
}
|
|
220
|
-
return JSON.stringify(change.path.slice(0, -1));
|
|
221
|
-
}
|
|
222
|
-
/** Build latest-plus-local while retaining divergent overlaps for later review. */
|
|
223
|
-
function rebaseRecordValues(base, local, latest) {
|
|
224
|
-
const comparison = compareThreeWayRecordValues(base, local, latest);
|
|
225
|
-
return {
|
|
226
|
-
...comparison,
|
|
227
|
-
candidate: applyRecordValueChanges(latest, comparison.applicableLocalChanges),
|
|
228
|
-
};
|
|
229
|
-
}
|
|
230
|
-
function valueKeys(value) {
|
|
231
|
-
if (Array.isArray(value))
|
|
232
|
-
return Array.from({ length: value.length }, (_, index) => index);
|
|
233
|
-
return (0, plain_record_1.isPlainRecord)(value) ? Object.keys(value) : [];
|
|
234
|
-
}
|
|
235
|
-
function valueAtKey(value, key) {
|
|
236
|
-
return value[key];
|
|
237
|
-
}
|
|
238
|
-
function valueAtPath(value, path) {
|
|
239
|
-
let current = value;
|
|
240
|
-
if (path.length === 0)
|
|
241
|
-
return { exists: true, value: current };
|
|
242
|
-
for (const segment of path) {
|
|
243
|
-
if ((!Array.isArray(current) && !(0, plain_record_1.isPlainRecord)(current)) || !hasOwn(current, segment)) {
|
|
244
|
-
return { exists: false, value: undefined };
|
|
245
|
-
}
|
|
246
|
-
current = current[segment];
|
|
247
|
-
}
|
|
248
|
-
return { exists: true, value: current };
|
|
249
|
-
}
|
|
250
|
-
function locatedValuesEqual(first, second) {
|
|
251
|
-
return first.exists === second.exists && (!first.exists || canonicallyEqualRecordValues(first.value, second.value));
|
|
252
|
-
}
|
|
253
|
-
function applyChangeAtPath(root, change) {
|
|
254
|
-
const clonedRoot = isContainer(root) ? root : containerFor(change.path[0]);
|
|
255
|
-
let parent = clonedRoot;
|
|
256
|
-
for (let index = 0; index < change.path.length - 1; index += 1) {
|
|
257
|
-
const segment = change.path[index];
|
|
258
|
-
const nextSegment = change.path[index + 1];
|
|
259
|
-
// Never traverse an inherited container. In particular, `__proto__` on a
|
|
260
|
-
// normal object resolves to Object.prototype; reusing it would let an
|
|
261
|
-
// otherwise ordinary record change mutate the global prototype.
|
|
262
|
-
const existing = hasOwn(parent, segment) ? parent[segment] : undefined;
|
|
263
|
-
const next = isContainer(existing) ? existing : containerFor(nextSegment);
|
|
264
|
-
defineValue(parent, segment, next);
|
|
265
|
-
parent = next;
|
|
266
|
-
}
|
|
267
|
-
const finalSegment = change.path[change.path.length - 1];
|
|
268
|
-
if (change.kind === 'delete') {
|
|
269
|
-
if (Array.isArray(parent) && typeof finalSegment === 'number') {
|
|
270
|
-
parent.splice(finalSegment, 1);
|
|
271
|
-
}
|
|
272
|
-
else {
|
|
273
|
-
delete parent[finalSegment];
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
else {
|
|
277
|
-
defineValue(parent, finalSegment, (0, lodash_1.cloneDeep)(change.changed));
|
|
278
|
-
}
|
|
279
|
-
return clonedRoot;
|
|
280
|
-
}
|
|
281
|
-
function defineValue(target, key, value) {
|
|
282
|
-
Object.defineProperty(target, key, {
|
|
283
|
-
configurable: true,
|
|
284
|
-
enumerable: true,
|
|
285
|
-
writable: true,
|
|
286
|
-
value,
|
|
287
|
-
});
|
|
288
|
-
}
|
|
289
|
-
function containerFor(segment) {
|
|
290
|
-
return typeof segment === 'number' ? [] : {};
|
|
291
|
-
}
|
|
292
|
-
function isContainer(value) {
|
|
293
|
-
return Array.isArray(value) || (0, plain_record_1.isPlainRecord)(value);
|
|
294
|
-
}
|
|
295
|
-
function hasOwn(value, key) {
|
|
296
|
-
return Object.prototype.hasOwnProperty.call(value, key);
|
|
297
|
-
}
|
|
298
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkLWRpZmYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVjb3JkLWRpZmYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFxREEsNENBMENDO0FBT0QsNERBR0M7QUFHRCwwREFTQztBQUdELG9FQUVDO0FBTUQsd0VBa0NDO0FBTUQsa0VBMkNDO0FBUUQsMERBVUM7QUFvREQsZ0RBTUM7QUEvUkQsbUNBQXNFO0FBQ3RFLDBEQUF3RDtBQWdEeEQ7OztHQUdHO0FBQ0gsU0FBZ0IsZ0JBQWdCLENBQzlCLFFBQWlCLEVBQ2pCLE9BQWdCLEVBQ2hCLE9BQXFDLEVBQUU7SUFFdkMsSUFBSSxRQUFRLEtBQUssT0FBTztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBRXBDLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDOUMsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM1QyxNQUFNLGNBQWMsR0FBRyxJQUFBLDRCQUFhLEVBQUMsUUFBUSxDQUFDLENBQUM7SUFDL0MsTUFBTSxhQUFhLEdBQUcsSUFBQSw0QkFBYSxFQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRTdDLElBQUksQ0FBQyxhQUFhLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksYUFBYSxDQUFDLEVBQUUsQ0FBQztRQUN6RSxNQUFNLFlBQVksR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekMsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sY0FBYyxHQUFHLElBQUksR0FBRyxDQUFrQixZQUFZLENBQUMsQ0FBQztRQUM5RCxNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsQ0FBa0IsV0FBVyxDQUFDLENBQUM7UUFDNUQsTUFBTSxNQUFNLEdBQXdCLEVBQUUsQ0FBQztRQUV2QyxLQUFLLE1BQU0sR0FBRyxJQUFJ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
|
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Contracts shared by the browser and server for record-save operations.
|
|
3
|
-
*
|
|
4
|
-
* These are deliberately data-only contracts. The server and Angular
|
|
5
|
-
* packages provide their own runtime response classes while this package
|
|
6
|
-
* remains safe to consume from either side of the application.
|
|
7
|
-
*/
|
|
8
|
-
import { LineagePathsOptional, LineagePathsPartial } from './config/names/naming-helpers';
|
|
9
|
-
import type { RecordConcurrencyMetadata } from './record-concurrency.model';
|
|
10
|
-
export interface ActionResult {
|
|
11
|
-
/** True when the requested primary action was completed. */
|
|
12
|
-
success: boolean;
|
|
13
|
-
/** The record identifier, when one is known. */
|
|
14
|
-
oid: string;
|
|
15
|
-
/** Compatibility summary for legacy callers. */
|
|
16
|
-
message: string;
|
|
17
|
-
/** Action-specific response data. */
|
|
18
|
-
data?: unknown;
|
|
19
|
-
/** Authoritative server-projected metadata, or null when unavailable. */
|
|
20
|
-
metadata: Record<string, unknown> | null;
|
|
21
|
-
}
|
|
22
|
-
export type RecordSaveOutcome = 'saved' | 'saved-with-warnings' | 'not-saved' | 'unknown';
|
|
23
|
-
export declare const RECORD_SAVE_PROBLEM_KINDS: readonly ["validation", "processing", "authorization", "conflict", "system", "network"];
|
|
24
|
-
export type RecordSaveProblemKind = (typeof RECORD_SAVE_PROBLEM_KINDS)[number];
|
|
25
|
-
export type RecordSaveProblemSource = 'schema';
|
|
26
|
-
export type RecordSaveLifecyclePhase = 'pre-save' | 'persistence' | 'attachments' | 'post-save' | 'response' | 'transport';
|
|
27
|
-
export type RecordSavePhase = 'schema' | RecordSaveLifecyclePhase;
|
|
28
|
-
export type RecordSaveValidatorParameterPrimitive = string | number | boolean | null;
|
|
29
|
-
export type RecordSaveValidatorParameterValue = RecordSaveValidatorParameterPrimitive | RecordSaveValidatorParameterPrimitive[];
|
|
30
|
-
export type RecordSaveValidatorParameters = Record<string, RecordSaveValidatorParameterValue>;
|
|
31
|
-
export declare const RECORD_SAVE_VALIDATOR_PARAMETER_LIMITS: {
|
|
32
|
-
readonly maxEntries: 16;
|
|
33
|
-
readonly maxKeyLength: 64;
|
|
34
|
-
readonly maxStringLength: 256;
|
|
35
|
-
readonly maxArrayLength: 16;
|
|
36
|
-
readonly maxSerializedLength: 4096;
|
|
37
|
-
};
|
|
38
|
-
export declare const RECORD_SAVE_VALIDATOR_CLASS_MAX_LENGTH = 128;
|
|
39
|
-
export declare const RECORD_SAVE_MESSAGE_MAX_LENGTH = 1024;
|
|
40
|
-
export declare const RECORD_SAVE_VALIDATOR_PARAMETER_KEY_PATTERN: RegExp;
|
|
41
|
-
export declare const RECORD_SAVE_PUBLIC_FIELD_LIMITS: {
|
|
42
|
-
readonly maxCodeLength: 128;
|
|
43
|
-
readonly maxFieldLength: 128;
|
|
44
|
-
readonly maxPointerLength: 2048;
|
|
45
|
-
readonly maxAttachmentIdLength: 128;
|
|
46
|
-
};
|
|
47
|
-
export declare const RECORD_SAVE_PUBLIC_IDENTIFIER_PATTERN: RegExp;
|
|
48
|
-
export declare const RECORD_SAVE_EXPECTED_JSON_TYPES: readonly ["array", "boolean", "integer", "null", "number", "object", "string"];
|
|
49
|
-
export type RecordSaveExpectedJsonType = (typeof RECORD_SAVE_EXPECTED_JSON_TYPES)[number];
|
|
50
|
-
export interface RecordSaveIssueExpectedShape {
|
|
51
|
-
type: RecordSaveExpectedJsonType;
|
|
52
|
-
}
|
|
53
|
-
export declare const RECORD_SAVE_LINEAGE_LIMITS: {
|
|
54
|
-
readonly maxSegments: 64;
|
|
55
|
-
readonly maxSegmentLength: 128;
|
|
56
|
-
readonly maxPointerLength: 2048;
|
|
57
|
-
};
|
|
58
|
-
export interface RecordSaveIssue {
|
|
59
|
-
/** A safe, stable identifier suitable for translation or support lookup. */
|
|
60
|
-
code?: string;
|
|
61
|
-
/** Safe user-facing text. Raw provider/exception text must not be placed here. */
|
|
62
|
-
message: string;
|
|
63
|
-
/** Configured form field name, when the issue maps unambiguously. */
|
|
64
|
-
field?: string;
|
|
65
|
-
/** JSON pointer into Angular or record metadata, when available. */
|
|
66
|
-
pointer?: string;
|
|
67
|
-
/** Narrow structural expectation safe to expose for schema type failures. */
|
|
68
|
-
expected?: RecordSaveIssueExpectedShape;
|
|
69
|
-
/** Logical attachment identity, never a storage key or path. */
|
|
70
|
-
attachmentId?: string;
|
|
71
|
-
/** Validator implementation class, when this is a validator failure. */
|
|
72
|
-
class?: string;
|
|
73
|
-
/** Bounded scalar parameters used to render a configured validator message. */
|
|
74
|
-
params?: RecordSaveValidatorParameters;
|
|
75
|
-
/** Validator-configured field ownership override. */
|
|
76
|
-
targetField?: LineagePathsPartial;
|
|
77
|
-
/** Lineage of the field or form control that produced the issue. */
|
|
78
|
-
lineagePaths?: LineagePathsOptional;
|
|
79
|
-
}
|
|
80
|
-
/** True only for root or syntactically valid RFC 6901 JSON pointers. */
|
|
81
|
-
export declare function isRecordSaveJsonPointer(value: unknown): value is string;
|
|
82
|
-
/** Remove non-allowlisted, executable, excessive, and otherwise unsafe validator parameters. */
|
|
83
|
-
export declare function sanitizeRecordSaveValidatorParameters(value: unknown, validatorClass?: unknown): RecordSaveValidatorParameters | undefined;
|
|
84
|
-
/**
|
|
85
|
-
* Copy only the public issue allowlist and normalize bounded validator/lineage
|
|
86
|
-
* metadata. This is suitable for a response serialization boundary.
|
|
87
|
-
*/
|
|
88
|
-
export declare function sanitizeRecordSaveIssue(value: unknown): RecordSaveIssue;
|
|
89
|
-
export interface RecordSaveSchemaProblem {
|
|
90
|
-
kind: RecordSaveProblemKind;
|
|
91
|
-
source: RecordSaveProblemSource;
|
|
92
|
-
phase: 'schema';
|
|
93
|
-
issues: RecordSaveIssue[];
|
|
94
|
-
}
|
|
95
|
-
export interface RecordSaveLifecycleProblem {
|
|
96
|
-
kind: RecordSaveProblemKind;
|
|
97
|
-
source?: never;
|
|
98
|
-
phase: RecordSaveLifecyclePhase;
|
|
99
|
-
issues: RecordSaveIssue[];
|
|
100
|
-
}
|
|
101
|
-
/** A nonblocking form suggestion, distinct from incomplete save work. */
|
|
102
|
-
export interface RecordSaveAdvisoryProblem {
|
|
103
|
-
kind: 'validation';
|
|
104
|
-
source: 'advisory';
|
|
105
|
-
phase: 'pre-save' | 'post-save';
|
|
106
|
-
issues: RecordSaveIssue[];
|
|
107
|
-
}
|
|
108
|
-
/** Provenance and phase form one discriminated contract. */
|
|
109
|
-
export type RecordSaveProblem = RecordSaveSchemaProblem | RecordSaveLifecycleProblem | RecordSaveAdvisoryProblem;
|
|
110
|
-
export type RecordAttachmentOperation = 'add' | 'finalize' | 'delete';
|
|
111
|
-
export type RecordAttachmentItemStatus = 'completed' | 'incomplete' | 'unknown';
|
|
112
|
-
export type RecordAttachmentCompletionStatus = 'not-required' | 'completed' | 'incomplete' | 'unknown';
|
|
113
|
-
export interface RecordAttachmentCompletionItem {
|
|
114
|
-
field: string;
|
|
115
|
-
attachmentId: string;
|
|
116
|
-
fileId?: string;
|
|
117
|
-
operation: RecordAttachmentOperation;
|
|
118
|
-
status: RecordAttachmentItemStatus;
|
|
119
|
-
/** A safe, bounded code such as attachment-reupload-required. */
|
|
120
|
-
code?: string;
|
|
121
|
-
}
|
|
122
|
-
export interface RecordAttachmentCompletion {
|
|
123
|
-
status: RecordAttachmentCompletionStatus;
|
|
124
|
-
items: RecordAttachmentCompletionItem[];
|
|
125
|
-
}
|
|
126
|
-
export interface RecordSaveCompletion {
|
|
127
|
-
attachments: RecordAttachmentCompletion;
|
|
128
|
-
}
|
|
129
|
-
export interface RecordSaveResult extends ActionResult {
|
|
130
|
-
outcome: RecordSaveOutcome;
|
|
131
|
-
problems: RecordSaveProblem[];
|
|
132
|
-
completion: RecordSaveCompletion;
|
|
133
|
-
requestId: string;
|
|
134
|
-
concurrency?: RecordConcurrencyMetadata;
|
|
135
|
-
}
|
|
136
|
-
/** A schema warning can coexist with a complete save; unfinished work cannot. */
|
|
137
|
-
export declare function isRecordSaveComplete(result: Pick<RecordSaveResult, 'outcome' | 'problems' | 'completion'>): boolean;
|
|
138
|
-
export type StorageMutationApplicationState = 'applied' | 'not-applied' | 'unknown';
|
|
139
|
-
export declare function emptyRecordSaveCompletion(): RecordSaveCompletion;
|
|
140
|
-
/**
|
|
141
|
-
* Reduce item-level attachment facts into the public aggregate status.
|
|
142
|
-
* Unknown takes precedence over incomplete because it represents less
|
|
143
|
-
* certainty about the physical operation.
|
|
144
|
-
*/
|
|
145
|
-
export declare function reduceAttachmentStatus(items: readonly RecordAttachmentCompletionItem[]): RecordAttachmentCompletionStatus;
|
|
146
|
-
export declare function isRecordSaveOutcome(value: unknown): value is RecordSaveOutcome;
|
|
147
|
-
export declare function isRecordSaveProblemKind(value: unknown): value is RecordSaveProblemKind;
|
|
148
|
-
/**
|
|
149
|
-
* Canonical save request-correlation identifier: one RFC 4122 UUID. It is
|
|
150
|
-
* correlation only and is never treated as an idempotency key.
|
|
151
|
-
*/
|
|
152
|
-
export declare const RECORD_SAVE_REQUEST_ID_PATTERN: RegExp;
|
|
153
|
-
export declare const RECORD_SAVE_REQUEST_ID_MAX_LENGTH = 36;
|
|
154
|
-
export declare function isRecordSaveRequestId(value: unknown): value is string;
|