@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.
Files changed (62) hide show
  1. package/dist/src/config/component/checkbox-input.model.d.ts +0 -1
  2. package/dist/src/config/component/checkbox-input.model.js +1 -2
  3. package/dist/src/config/component/checkbox-input.outline.d.ts +1 -2
  4. package/dist/src/config/component/checkbox-input.outline.js +1 -1
  5. package/dist/src/config/component/data-location.outline.d.ts +0 -1
  6. package/dist/src/config/component/file-upload.outline.d.ts +0 -2
  7. package/dist/src/config/component/file-upload.outline.js +1 -1
  8. package/dist/src/config/component/save-button.model.d.ts +0 -1
  9. package/dist/src/config/component/save-button.model.js +1 -2
  10. package/dist/src/config/component/save-button.outline.d.ts +0 -5
  11. package/dist/src/config/component/save-status.model.d.ts +0 -4
  12. package/dist/src/config/component/save-status.model.js +1 -5
  13. package/dist/src/config/component/save-status.outline.d.ts +0 -20
  14. package/dist/src/config/dictionary.model.d.ts +4 -28
  15. package/dist/src/config/dictionary.model.js +1 -7
  16. package/dist/src/config/dictionary.outline.d.ts +3 -5
  17. package/dist/src/config/form-behaviour.outline.d.ts +7 -120
  18. package/dist/src/config/form-behaviour.outline.js +5 -13
  19. package/dist/src/config/form-component.model.d.ts +0 -1
  20. package/dist/src/config/form-component.model.js +1 -2
  21. package/dist/src/config/form-component.outline.d.ts +0 -14
  22. package/dist/src/config/form-config.model.d.ts +0 -3
  23. package/dist/src/config/form-config.model.js +1 -2
  24. package/dist/src/config/form-config.outline.d.ts +0 -10
  25. package/dist/src/config/form-override.model.js +3 -4
  26. package/dist/src/config/visitor/base.model.d.ts +0 -6
  27. package/dist/src/config/visitor/base.model.js +1 -13
  28. package/dist/src/config/visitor/base.outline.d.ts +0 -6
  29. package/dist/src/config/visitor/common.model.js +1 -2
  30. package/dist/src/index.d.ts +1 -9
  31. package/dist/src/index.js +2 -10
  32. package/dist/src/jsonata-helpers.d.ts +0 -15
  33. package/dist/src/jsonata-helpers.js +13 -49
  34. package/dist/src/translation-html.d.ts +23 -0
  35. package/dist/src/translation-html.js +170 -0
  36. package/package.json +11 -16
  37. package/dist/src/config/component/related-object-data.model.d.ts +0 -45
  38. package/dist/src/config/component/related-object-data.model.js +0 -39
  39. package/dist/src/config/component/related-object-data.outline.d.ts +0 -59
  40. package/dist/src/config/component/related-object-data.outline.js +0 -5
  41. package/dist/src/config/component/workspace.model.d.ts +0 -44
  42. package/dist/src/config/component/workspace.model.js +0 -44
  43. package/dist/src/config/component/workspace.outline.d.ts +0 -62
  44. package/dist/src/config/component/workspace.outline.js +0 -5
  45. package/dist/src/internal/plain-record.d.ts +0 -11
  46. package/dist/src/internal/plain-record.js +0 -21
  47. package/dist/src/jsonata-parity.fixtures.d.ts +0 -9
  48. package/dist/src/jsonata-parity.fixtures.js +0 -25
  49. package/dist/src/record-concurrency.model.d.ts +0 -118
  50. package/dist/src/record-concurrency.model.js +0 -199
  51. package/dist/src/record-diff.d.ts +0 -69
  52. package/dist/src/record-diff.js +0 -298
  53. package/dist/src/record-save.model.d.ts +0 -154
  54. package/dist/src/record-save.model.js +0 -289
  55. package/dist/src/testing.d.ts +0 -3
  56. package/dist/src/testing.js +0 -20
  57. package/dist/src/validation/record-validation.model.d.ts +0 -84
  58. package/dist/src/validation/record-validation.model.js +0 -53
  59. package/dist/src/validation/validation-groups.d.ts +0 -29
  60. package/dist/src/validation/validation-groups.fixtures.d.ts +0 -20
  61. package/dist/src/validation/validation-groups.fixtures.js +0 -83
  62. package/dist/src/validation/validation-groups.js +0 -82
@@ -1,25 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.jsonataParityFixtures = void 0;
4
- /** @internal */
5
- exports.jsonataParityFixtures = [
6
- {
7
- name: 'evaluates standard JSONata functions',
8
- expression: '$sum(items.amount)',
9
- context: { items: [{ amount: 2 }, { amount: 3 }, { amount: 5 }] },
10
- expected: 10,
11
- },
12
- {
13
- name: 'formats an ISO date through the shared Luxon function',
14
- expression: '$luxonFormatDate(date, "yyyy-LL-dd")',
15
- context: { date: '2026-08-22' },
16
- expected: '2026-08-22',
17
- },
18
- {
19
- name: 'guesses name parts through the shared helper',
20
- expression: '$guessNameParts(name)',
21
- context: { name: 'Ada Lovelace' },
22
- expected: { full: 'Ada Lovelace', first: 'Ada', last: 'Lovelace' },
23
- },
24
- ];
25
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbmF0YS1wYXJpdHkuZml4dHVyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvanNvbmF0YS1wYXJpdHkuZml4dHVyZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBUUEsZ0JBQWdCO0FBQ0gsUUFBQSxxQkFBcUIsR0FBMkI7SUFDM0Q7UUFDRSxJQUFJLEVBQUUsc0NBQXNDO1FBQzVDLFVBQVUsRUFBRSxvQkFBb0I7UUFDaEMsT0FBTyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtRQUNqRSxRQUFRLEVBQUUsRUFBRTtLQUNiO0lBQ0Q7UUFDRSxJQUFJLEVBQUUsdURBQXVEO1FBQzdELFVBQVUsRUFBRSxzQ0FBc0M7UUFDbEQsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRTtRQUMvQixRQUFRLEVBQUUsWUFBWTtLQUN2QjtJQUNEO1FBQ0UsSUFBSSxFQUFFLDhDQUE4QztRQUNwRCxVQUFVLEVBQUUsdUJBQXVCO1FBQ25DLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUU7UUFDakMsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7S0FDbkU7Q0FDRixDQUFDIn0=
@@ -1,118 +0,0 @@
1
- /**
2
- * Data-only optimistic-concurrency contracts shared by the server and browser.
3
- * Runtime policy enforcement remains a backend responsibility.
4
- */
5
- import { isRecordSaveRequestId } from './record-save.model';
6
- export declare const RECORD_CONCURRENT_MODIFICATION_MODES: readonly ["last-write-wins", "observe", "strict"];
7
- export type RecordConcurrentModificationMode = (typeof RECORD_CONCURRENT_MODIFICATION_MODES)[number];
8
- export interface RecordConcurrentModificationConfig {
9
- mode: RecordConcurrentModificationMode;
10
- }
11
- export declare const DEFAULT_RECORD_CONCURRENT_MODIFICATION_MODE: "last-write-wins";
12
- export declare const DEFAULT_RECORD_CONCURRENT_MODIFICATION_CONFIG: Readonly<RecordConcurrentModificationConfig>;
13
- export type RecordConcurrentModificationConfigValidation = {
14
- readonly valid: true;
15
- readonly config: RecordConcurrentModificationConfig;
16
- readonly defaulted: boolean;
17
- } | {
18
- readonly valid: false;
19
- readonly reason: 'malformed-config' | 'malformed-mode';
20
- };
21
- export declare const RECORD_CONCURRENCY_RESOLUTIONS: readonly ["direct", "already-current", "client-auto-merged", "client-manually-resolved", "internal"];
22
- /**
23
- * Diagnostic description of how a successful candidate was produced. It is
24
- * never authority and never relaxes authorization, validation, or persistence:
25
- * the server repeats every check regardless of the label a client sent.
26
- */
27
- export type RecordConcurrencyResolution = (typeof RECORD_CONCURRENCY_RESOLUTIONS)[number];
28
- export declare const RECORD_CONCURRENCY_PROBLEM_CODES: readonly ["record-precondition-required", "record-revision-stale", "record-deleted", "record-concurrency-capability-unavailable", "form-definition-changed", "record-lifecycle-operation-conflict"];
29
- export type RecordConcurrencyProblemCode = (typeof RECORD_CONCURRENCY_PROBLEM_CODES)[number];
30
- /** Revisions are exact non-negative integers, not timestamps or floating-point counters. */
31
- export declare const RECORD_REVISION_MAX: number;
32
- /**
33
- * Entity tags are quoted, bounded, opaque values produced by one backend
34
- * helper. Clients retain and return the complete value; they never construct a
35
- * tag from the numeric revision.
36
- */
37
- export declare const RECORD_ENTITY_TAG_VERSION: "rb-record-v1";
38
- export declare const RECORD_ENTITY_TAG_MAX_LENGTH = 128;
39
- export declare const RECORD_ENTITY_TAG_RECORD_ID_MAX_LENGTH = 1024;
40
- /**
41
- * `"<version>.<revision>.<digest>"`. Built from the version constant so a
42
- * future format bump cannot leave the guard matching the previous shape.
43
- */
44
- export declare const RECORD_ENTITY_TAG_PATTERN: RegExp;
45
- declare const recordEntityTagBrand: unique symbol;
46
- export type RecordEntityTag = string & {
47
- readonly [recordEntityTagBrand]: true;
48
- };
49
- /**
50
- * Form fingerprints are deliberately independent of record revisions and
51
- * entity tags: an administrator editing a form must not invalidate API
52
- * operations that never rendered it.
53
- */
54
- export declare const RECORD_FORM_FINGERPRINT_MAX_LENGTH = 128;
55
- export declare const RECORD_FORM_FINGERPRINT_PATTERN: RegExp;
56
- declare const recordFormFingerprintBrand: unique symbol;
57
- export type RecordFormFingerprint = string & {
58
- readonly [recordFormFingerprintBrand]: true;
59
- };
60
- export interface RecordConcurrencyMetadata {
61
- mode?: RecordConcurrentModificationMode;
62
- revision?: number;
63
- expectedRevision?: number;
64
- currentRevision?: number;
65
- entityTag?: string;
66
- formFingerprint?: string;
67
- /** Diagnostic only; the server repeats all authoritative checks. */
68
- resolution?: RecordConcurrencyResolution;
69
- /** Bounded diagnostic linkage to the prior request; not an idempotency key. */
70
- resolutionOfRequestId?: string;
71
- }
72
- export declare function isRecordConcurrentModificationMode(value: unknown): value is RecordConcurrentModificationMode;
73
- /**
74
- * Validate absent, valid, and malformed record-type policy. Absent policy is
75
- * the compatibility default; an explicit but malformed policy is reported so
76
- * enforcement boundaries can fail closed rather than silently defaulting.
77
- * No raw input is retained in the result.
78
- */
79
- export declare function validateRecordConcurrentModificationConfig(value: unknown): RecordConcurrentModificationConfigValidation;
80
- /** True only for an explicit, well-formed policy object. */
81
- export declare function isRecordConcurrentModificationConfig(value: unknown): value is RecordConcurrentModificationConfig;
82
- /**
83
- * Resolve the compatibility default while failing closed for explicit
84
- * malformed policy. Use this at enforcement boundaries, where guessing a mode
85
- * would risk permitting an unguarded write.
86
- */
87
- export declare function resolveRecordConcurrentModificationConfig(value: unknown): RecordConcurrentModificationConfig;
88
- export declare function resolveRecordConcurrentModificationMode(value: unknown): RecordConcurrentModificationMode;
89
- /**
90
- * Non-throwing counterpart for presentation boundaries such as record-type
91
- * discovery, where one corrupted stored policy must not break an unrelated
92
- * listing. Reporting the default is safe because it cannot loosen enforcement:
93
- * a malformed policy still fails closed when a mutation resolves it.
94
- */
95
- export declare function coerceRecordConcurrentModificationConfig(value: unknown): RecordConcurrentModificationConfig;
96
- export declare function isRecordConcurrencyResolution(value: unknown): value is RecordConcurrencyResolution;
97
- export declare function isRecordConcurrencyProblemCode(value: unknown): value is RecordConcurrencyProblemCode;
98
- export declare function isRecordRevision(value: unknown): value is number;
99
- export declare function recordEntityTagRevision(value: unknown): number | undefined;
100
- /**
101
- * Structural entity-tag guard. Record identity is certified by the backend
102
- * parser, which recomputes the digest for a known OID; this guard only proves
103
- * the value has the bounded opaque shape worth carrying in client state.
104
- */
105
- export declare function isRecordEntityTag(value: unknown): value is RecordEntityTag;
106
- export declare function isRecordFormFingerprint(value: unknown): value is RecordFormFingerprint;
107
- export declare const RECORD_CONCURRENCY_REQUEST_ID_MAX_LENGTH = 36;
108
- /** Diagnostic request linkage uses the same canonical save request-id format. */
109
- export declare const isRecordConcurrencyRequestId: typeof isRecordSaveRequestId;
110
- /** Runtime guard used at transport boundaries for bounded concurrency metadata. */
111
- export declare function isRecordConcurrencyMetadata(value: unknown): value is RecordConcurrencyMetadata;
112
- /**
113
- * Copy only valid bounded fields from untrusted or cross-runtime metadata.
114
- * Unknown keys are dropped rather than carried, so a payload cannot widen the
115
- * diagnostic contract. Returns `undefined` when nothing survives.
116
- */
117
- export declare function sanitizeRecordConcurrencyMetadata(value: unknown): RecordConcurrencyMetadata | undefined;
118
- export {};
@@ -1,199 +0,0 @@
1
- "use strict";
2
- /**
3
- * Data-only optimistic-concurrency contracts shared by the server and browser.
4
- * Runtime policy enforcement remains a backend responsibility.
5
- */
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.isRecordConcurrencyRequestId = exports.RECORD_CONCURRENCY_REQUEST_ID_MAX_LENGTH = exports.RECORD_FORM_FINGERPRINT_PATTERN = exports.RECORD_FORM_FINGERPRINT_MAX_LENGTH = exports.RECORD_ENTITY_TAG_PATTERN = exports.RECORD_ENTITY_TAG_RECORD_ID_MAX_LENGTH = exports.RECORD_ENTITY_TAG_MAX_LENGTH = exports.RECORD_ENTITY_TAG_VERSION = exports.RECORD_REVISION_MAX = exports.RECORD_CONCURRENCY_PROBLEM_CODES = exports.RECORD_CONCURRENCY_RESOLUTIONS = exports.DEFAULT_RECORD_CONCURRENT_MODIFICATION_CONFIG = exports.DEFAULT_RECORD_CONCURRENT_MODIFICATION_MODE = exports.RECORD_CONCURRENT_MODIFICATION_MODES = void 0;
8
- exports.isRecordConcurrentModificationMode = isRecordConcurrentModificationMode;
9
- exports.validateRecordConcurrentModificationConfig = validateRecordConcurrentModificationConfig;
10
- exports.isRecordConcurrentModificationConfig = isRecordConcurrentModificationConfig;
11
- exports.resolveRecordConcurrentModificationConfig = resolveRecordConcurrentModificationConfig;
12
- exports.resolveRecordConcurrentModificationMode = resolveRecordConcurrentModificationMode;
13
- exports.coerceRecordConcurrentModificationConfig = coerceRecordConcurrentModificationConfig;
14
- exports.isRecordConcurrencyResolution = isRecordConcurrencyResolution;
15
- exports.isRecordConcurrencyProblemCode = isRecordConcurrencyProblemCode;
16
- exports.isRecordRevision = isRecordRevision;
17
- exports.recordEntityTagRevision = recordEntityTagRevision;
18
- exports.isRecordEntityTag = isRecordEntityTag;
19
- exports.isRecordFormFingerprint = isRecordFormFingerprint;
20
- exports.isRecordConcurrencyMetadata = isRecordConcurrencyMetadata;
21
- exports.sanitizeRecordConcurrencyMetadata = sanitizeRecordConcurrencyMetadata;
22
- const plain_record_1 = require("./internal/plain-record");
23
- const record_save_model_1 = require("./record-save.model");
24
- exports.RECORD_CONCURRENT_MODIFICATION_MODES = ['last-write-wins', 'observe', 'strict'];
25
- exports.DEFAULT_RECORD_CONCURRENT_MODIFICATION_MODE = 'last-write-wins';
26
- exports.DEFAULT_RECORD_CONCURRENT_MODIFICATION_CONFIG = Object.freeze({
27
- mode: exports.DEFAULT_RECORD_CONCURRENT_MODIFICATION_MODE,
28
- });
29
- exports.RECORD_CONCURRENCY_RESOLUTIONS = [
30
- 'direct',
31
- 'already-current',
32
- 'client-auto-merged',
33
- 'client-manually-resolved',
34
- 'internal',
35
- ];
36
- exports.RECORD_CONCURRENCY_PROBLEM_CODES = [
37
- 'record-precondition-required',
38
- 'record-revision-stale',
39
- 'record-deleted',
40
- 'record-concurrency-capability-unavailable',
41
- 'form-definition-changed',
42
- 'record-lifecycle-operation-conflict',
43
- ];
44
- /** Revisions are exact non-negative integers, not timestamps or floating-point counters. */
45
- exports.RECORD_REVISION_MAX = Number.MAX_SAFE_INTEGER;
46
- /**
47
- * Entity tags are quoted, bounded, opaque values produced by one backend
48
- * helper. Clients retain and return the complete value; they never construct a
49
- * tag from the numeric revision.
50
- */
51
- exports.RECORD_ENTITY_TAG_VERSION = 'rb-record-v1';
52
- exports.RECORD_ENTITY_TAG_MAX_LENGTH = 128;
53
- exports.RECORD_ENTITY_TAG_RECORD_ID_MAX_LENGTH = 1_024;
54
- /** Base64url SHA-256 digest length, without padding. */
55
- const RECORD_ENTITY_TAG_DIGEST_LENGTH = 43;
56
- /**
57
- * `"<version>.<revision>.<digest>"`. Built from the version constant so a
58
- * future format bump cannot leave the guard matching the previous shape.
59
- */
60
- exports.RECORD_ENTITY_TAG_PATTERN = new RegExp(`^"${exports.RECORD_ENTITY_TAG_VERSION}\\.(0|[1-9][0-9]{0,15})\\.[A-Za-z0-9_-]{${RECORD_ENTITY_TAG_DIGEST_LENGTH}}"$`);
61
- /**
62
- * Form fingerprints are deliberately independent of record revisions and
63
- * entity tags: an administrator editing a form must not invalidate API
64
- * operations that never rendered it.
65
- */
66
- exports.RECORD_FORM_FINGERPRINT_MAX_LENGTH = 128;
67
- exports.RECORD_FORM_FINGERPRINT_PATTERN = record_save_model_1.RECORD_SAVE_PUBLIC_IDENTIFIER_PATTERN;
68
- function isRecordConcurrentModificationMode(value) {
69
- return typeof value === 'string' && exports.RECORD_CONCURRENT_MODIFICATION_MODES.includes(value);
70
- }
71
- /**
72
- * Validate absent, valid, and malformed record-type policy. Absent policy is
73
- * the compatibility default; an explicit but malformed policy is reported so
74
- * enforcement boundaries can fail closed rather than silently defaulting.
75
- * No raw input is retained in the result.
76
- */
77
- function validateRecordConcurrentModificationConfig(value) {
78
- if (value === undefined || value === null) {
79
- return {
80
- valid: true,
81
- config: { ...exports.DEFAULT_RECORD_CONCURRENT_MODIFICATION_CONFIG },
82
- defaulted: true,
83
- };
84
- }
85
- if (!(0, plain_record_1.isPlainRecord)(value)) {
86
- return { valid: false, reason: 'malformed-config' };
87
- }
88
- if (!isRecordConcurrentModificationMode(value.mode)) {
89
- return { valid: false, reason: 'malformed-mode' };
90
- }
91
- return { valid: true, config: { mode: value.mode }, defaulted: false };
92
- }
93
- /** True only for an explicit, well-formed policy object. */
94
- function isRecordConcurrentModificationConfig(value) {
95
- const validation = validateRecordConcurrentModificationConfig(value);
96
- return validation.valid && !validation.defaulted;
97
- }
98
- /**
99
- * Resolve the compatibility default while failing closed for explicit
100
- * malformed policy. Use this at enforcement boundaries, where guessing a mode
101
- * would risk permitting an unguarded write.
102
- */
103
- function resolveRecordConcurrentModificationConfig(value) {
104
- const validation = validateRecordConcurrentModificationConfig(value);
105
- if (!validation.valid) {
106
- throw new TypeError(`Record concurrent-modification configuration is ${validation.reason}.`);
107
- }
108
- return validation.config;
109
- }
110
- function resolveRecordConcurrentModificationMode(value) {
111
- return resolveRecordConcurrentModificationConfig(value).mode;
112
- }
113
- /**
114
- * Non-throwing counterpart for presentation boundaries such as record-type
115
- * discovery, where one corrupted stored policy must not break an unrelated
116
- * listing. Reporting the default is safe because it cannot loosen enforcement:
117
- * a malformed policy still fails closed when a mutation resolves it.
118
- */
119
- function coerceRecordConcurrentModificationConfig(value) {
120
- const validation = validateRecordConcurrentModificationConfig(value);
121
- return validation.valid ? validation.config : { ...exports.DEFAULT_RECORD_CONCURRENT_MODIFICATION_CONFIG };
122
- }
123
- function isRecordConcurrencyResolution(value) {
124
- return typeof value === 'string' && exports.RECORD_CONCURRENCY_RESOLUTIONS.includes(value);
125
- }
126
- function isRecordConcurrencyProblemCode(value) {
127
- return typeof value === 'string' && exports.RECORD_CONCURRENCY_PROBLEM_CODES.includes(value);
128
- }
129
- function isRecordRevision(value) {
130
- return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0 && value <= exports.RECORD_REVISION_MAX;
131
- }
132
- function recordEntityTagRevision(value) {
133
- if (typeof value !== 'string' || value.length > exports.RECORD_ENTITY_TAG_MAX_LENGTH)
134
- return undefined;
135
- const match = exports.RECORD_ENTITY_TAG_PATTERN.exec(value);
136
- const revision = match ? Number(match[1]) : undefined;
137
- return isRecordRevision(revision) ? revision : undefined;
138
- }
139
- /**
140
- * Structural entity-tag guard. Record identity is certified by the backend
141
- * parser, which recomputes the digest for a known OID; this guard only proves
142
- * the value has the bounded opaque shape worth carrying in client state.
143
- */
144
- function isRecordEntityTag(value) {
145
- return recordEntityTagRevision(value) !== undefined;
146
- }
147
- function isRecordFormFingerprint(value) {
148
- return (typeof value === 'string' &&
149
- value.length > 0 &&
150
- value.length <= exports.RECORD_FORM_FINGERPRINT_MAX_LENGTH &&
151
- exports.RECORD_FORM_FINGERPRINT_PATTERN.test(value));
152
- }
153
- exports.RECORD_CONCURRENCY_REQUEST_ID_MAX_LENGTH = record_save_model_1.RECORD_SAVE_REQUEST_ID_MAX_LENGTH;
154
- /** Diagnostic request linkage uses the same canonical save request-id format. */
155
- exports.isRecordConcurrencyRequestId = record_save_model_1.isRecordSaveRequestId;
156
- /** Runtime guard used at transport boundaries for bounded concurrency metadata. */
157
- function isRecordConcurrencyMetadata(value) {
158
- if (!(0, plain_record_1.isPlainRecord)(value)) {
159
- return false;
160
- }
161
- return ((value.mode === undefined || isRecordConcurrentModificationMode(value.mode)) &&
162
- (value.revision === undefined || isRecordRevision(value.revision)) &&
163
- (value.expectedRevision === undefined || isRecordRevision(value.expectedRevision)) &&
164
- (value.currentRevision === undefined || isRecordRevision(value.currentRevision)) &&
165
- (value.entityTag === undefined || isRecordEntityTag(value.entityTag)) &&
166
- (value.formFingerprint === undefined || isRecordFormFingerprint(value.formFingerprint)) &&
167
- (value.resolution === undefined || isRecordConcurrencyResolution(value.resolution)) &&
168
- (value.resolutionOfRequestId === undefined || (0, exports.isRecordConcurrencyRequestId)(value.resolutionOfRequestId)));
169
- }
170
- /**
171
- * Copy only valid bounded fields from untrusted or cross-runtime metadata.
172
- * Unknown keys are dropped rather than carried, so a payload cannot widen the
173
- * diagnostic contract. Returns `undefined` when nothing survives.
174
- */
175
- function sanitizeRecordConcurrencyMetadata(value) {
176
- if (!(0, plain_record_1.isPlainRecord)(value)) {
177
- return undefined;
178
- }
179
- const result = {};
180
- if (isRecordConcurrentModificationMode(value.mode))
181
- result.mode = value.mode;
182
- if (isRecordRevision(value.revision))
183
- result.revision = value.revision;
184
- if (isRecordRevision(value.expectedRevision))
185
- result.expectedRevision = value.expectedRevision;
186
- if (isRecordRevision(value.currentRevision))
187
- result.currentRevision = value.currentRevision;
188
- if (isRecordEntityTag(value.entityTag))
189
- result.entityTag = value.entityTag;
190
- if (isRecordFormFingerprint(value.formFingerprint))
191
- result.formFingerprint = value.formFingerprint;
192
- if (isRecordConcurrencyResolution(value.resolution))
193
- result.resolution = value.resolution;
194
- if ((0, exports.isRecordConcurrencyRequestId)(value.resolutionOfRequestId)) {
195
- result.resolutionOfRequestId = value.resolutionOfRequestId;
196
- }
197
- return Object.keys(result).length > 0 ? result : undefined;
198
- }
199
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkLWNvbmN1cnJlbmN5Lm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlY29yZC1jb25jdXJyZW5jeS5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7OztHQUdHOzs7QUE4R0gsZ0ZBRUM7QUFRRCxnR0FpQkM7QUFHRCxvRkFHQztBQU9ELDhGQU1DO0FBRUQsMEZBRUM7QUFRRCw0RkFHQztBQUVELHNFQUVDO0FBRUQsd0VBRUM7QUFFRCw0Q0FFQztBQUVELDBEQUtDO0FBT0QsOENBRUM7QUFFRCwwREFPQztBQVFELGtFQWNDO0FBT0QsOEVBZ0JDO0FBM1BELDBEQUF3RDtBQUN4RCwyREFJNkI7QUFFaEIsUUFBQSxvQ0FBb0MsR0FBRyxDQUFDLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxRQUFRLENBQVUsQ0FBQztBQVF6RixRQUFBLDJDQUEyQyxHQUFHLGlCQUEwQixDQUFDO0FBQ3pFLFFBQUEsNkNBQTZDLEdBQ3hELE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDWixJQUFJLEVBQUUsbURBQTJDO0NBQ2xELENBQUMsQ0FBQztBQWFRLFFBQUEsOEJBQThCLEdBQUc7SUFDNUMsUUFBUTtJQUNSLGlCQUFpQjtJQUNqQixvQkFBb0I7SUFDcEIsMEJBQTBCO0lBQzFCLFVBQVU7Q0FDRixDQUFDO0FBU0UsUUFBQSxnQ0FBZ0MsR0FBRztJQUM5Qyw4QkFBOEI7SUFDOUIsdUJBQXVCO0lBQ3ZCLGdCQUFnQjtJQUNoQiwyQ0FBMkM7SUFDM0MseUJBQXlCO0lBQ3pCLHFDQUFxQztDQUM3QixDQUFDO0FBSVgsNEZBQTRGO0FBQy9FLFFBQUEsbUJBQW1CLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDO0FBRTNEOzs7O0dBSUc7QUFDVSxRQUFBLHlCQUF5QixHQUFHLGNBQXVCLENBQUM7QUFDcEQsUUFBQSw0QkFBNEIsR0FBRyxHQUFHLENBQUM7QUFDbkMsUUFBQSxzQ0FBc0MsR0FBRyxLQUFLLENBQUM7QUFFNUQs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
@@ -1,69 +0,0 @@
1
- /** A property or array-index path through a JSON-like record value. */
2
- export type RecordValuePath = Array<string | number>;
3
- export type RecordValueChangeKind = 'add' | 'delete' | 'change';
4
- /**
5
- * One structural change between two JSON-like values.
6
- *
7
- * Object additions/deletions and array-index additions/deletions retain their
8
- * historical backend semantics. Concurrency callers should use
9
- * `diffRecordValuesForConcurrency`, which treats an array as one atomic value.
10
- */
11
- export interface RecordValueChange {
12
- readonly kind: RecordValueChangeKind;
13
- readonly path: RecordValuePath;
14
- readonly original: unknown;
15
- readonly changed: unknown;
16
- }
17
- export interface RecordValueOverlap {
18
- readonly path: RecordValuePath;
19
- readonly local: RecordValueChange;
20
- readonly remote: RecordValueChange;
21
- readonly resolved: boolean;
22
- }
23
- export interface ThreeWayRecordDiff {
24
- readonly localChanges: readonly RecordValueChange[];
25
- readonly remoteChanges: readonly RecordValueChange[];
26
- readonly applicableLocalChanges: readonly RecordValueChange[];
27
- readonly resolvedOverlaps: readonly RecordValueOverlap[];
28
- readonly unresolvedOverlaps: readonly RecordValueOverlap[];
29
- /** True when latest already contains every base-to-local final value. */
30
- readonly localChangesAlreadyPresent: boolean;
31
- }
32
- export interface ThreeWayRecordRebase<T> extends ThreeWayRecordDiff {
33
- /** Latest plus only base-to-local changes that do not diverge from remote. */
34
- readonly candidate: T;
35
- }
36
- /**
37
- * Pure recursive diff retaining the established FormRecordConsistencyService
38
- * add/delete/change and path ordering contract.
39
- */
40
- export declare function diffRecordValues(original: unknown, changed: unknown, path?: readonly (string | number)[]): RecordValueChange[];
41
- /**
42
- * Collapse a descendant of an array to the containing array path. Numeric path
43
- * segments are emitted only by array traversal; numeric-looking object keys
44
- * remain strings and therefore remain ordinary object properties.
45
- */
46
- export declare function normalizeConcurrencyPath(path: readonly (string | number)[]): RecordValuePath;
47
- /** Prefix-aware path overlap: equality, local parent, or remote parent. */
48
- export declare function recordValuePathsOverlap(first: readonly (string | number)[], second: readonly (string | number)[]): boolean;
49
- /** Deterministic deep equality for JSON-like values; object key order is ignored. */
50
- export declare function canonicallyEqualRecordValues(first: unknown, second: unknown): boolean;
51
- /**
52
- * Concurrency diff with arrays/repeatables represented by one whole-value
53
- * change at their root. The ordinary diff remains index-based for audit users.
54
- */
55
- export declare function diffRecordValuesForConcurrency(original: unknown, changed: unknown, path?: readonly (string | number)[]): RecordValueChange[];
56
- /**
57
- * Compare base/local/latest and classify overlaps using final projected state,
58
- * not merely the leaf values stored on individual diff entries.
59
- */
60
- export declare function compareThreeWayRecordValues(base: unknown, local: unknown, latest: unknown): ThreeWayRecordDiff;
61
- /**
62
- * Clone latest and apply the supplied structural changes without mutating any
63
- * snapshot. Numeric deletes against the same array are applied from the
64
- * highest index down, so a compatible `diffRecordValues()` result cannot
65
- * shift a later delete onto the wrong item.
66
- */
67
- export declare function applyRecordValueChanges<T>(latest: T, changes: readonly RecordValueChange[]): T;
68
- /** Build latest-plus-local while retaining divergent overlaps for later review. */
69
- export declare function rebaseRecordValues<T>(base: unknown, local: unknown, latest: T): ThreeWayRecordRebase<T>;