@ankhorage/studio 5.10.13 → 5.11.0

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 (42) hide show
  1. package/README.md +1 -1
  2. package/apm/update.json +1 -1
  3. package/dist/bindingSchemaModel.js +3 -0
  4. package/dist/bindingSchemaModel.js.map +1 -1
  5. package/dist/features/authoring-engine/adapters/inbound/AuthoringEditor.d.ts.map +1 -1
  6. package/dist/features/authoring-engine/adapters/inbound/AuthoringEditor.js +47 -1
  7. package/dist/features/authoring-engine/adapters/inbound/AuthoringEditor.js.map +1 -1
  8. package/dist/features/authoring-engine/adapters/outbound/resolveContractsAuthoringStructure.d.ts.map +1 -1
  9. package/dist/features/authoring-engine/adapters/outbound/resolveContractsAuthoringStructure.js +17 -11
  10. package/dist/features/authoring-engine/adapters/outbound/resolveContractsAuthoringStructure.js.map +1 -1
  11. package/dist/features/authoring-engine/application/use-cases/applyAuthoringMutationToStructure.d.ts +1 -1
  12. package/dist/features/authoring-engine/application/use-cases/applyAuthoringMutationToStructure.d.ts.map +1 -1
  13. package/dist/features/authoring-engine/application/use-cases/applyAuthoringMutationToStructure.js +183 -50
  14. package/dist/features/authoring-engine/application/use-cases/applyAuthoringMutationToStructure.js.map +1 -1
  15. package/dist/features/authoring-engine/application/use-cases/createInitialAuthoringValue.d.ts.map +1 -1
  16. package/dist/features/authoring-engine/application/use-cases/createInitialAuthoringValue.js +8 -0
  17. package/dist/features/authoring-engine/application/use-cases/createInitialAuthoringValue.js.map +1 -1
  18. package/dist/features/authoring-engine/application/use-cases/createInitialEntityRegistryValue.d.ts +4 -0
  19. package/dist/features/authoring-engine/application/use-cases/createInitialEntityRegistryValue.d.ts.map +1 -0
  20. package/dist/features/authoring-engine/application/use-cases/createInitialEntityRegistryValue.js +14 -0
  21. package/dist/features/authoring-engine/application/use-cases/createInitialEntityRegistryValue.js.map +1 -0
  22. package/dist/features/authoring-engine/application/use-cases/deriveAuthoringModel.d.ts.map +1 -1
  23. package/dist/features/authoring-engine/application/use-cases/deriveAuthoringModel.js +126 -24
  24. package/dist/features/authoring-engine/application/use-cases/deriveAuthoringModel.js.map +1 -1
  25. package/dist/features/authoring-engine/utils/isAuthoringCollectionKeyAllowed.d.ts +4 -0
  26. package/dist/features/authoring-engine/utils/isAuthoringCollectionKeyAllowed.d.ts.map +1 -0
  27. package/dist/features/authoring-engine/utils/isAuthoringCollectionKeyAllowed.js +7 -0
  28. package/dist/features/authoring-engine/utils/isAuthoringCollectionKeyAllowed.js.map +1 -0
  29. package/dist/features/authoring-engine/utils/resolveAuthoringCollectionKey.d.ts +4 -0
  30. package/dist/features/authoring-engine/utils/resolveAuthoringCollectionKey.d.ts.map +1 -0
  31. package/dist/features/authoring-engine/utils/resolveAuthoringCollectionKey.js +11 -0
  32. package/dist/features/authoring-engine/utils/resolveAuthoringCollectionKey.js.map +1 -0
  33. package/dist/features/authoring-engine/utils/resolveAuthoringUnion.d.ts +17 -0
  34. package/dist/features/authoring-engine/utils/resolveAuthoringUnion.d.ts.map +1 -0
  35. package/dist/features/authoring-engine/utils/resolveAuthoringUnion.js +66 -0
  36. package/dist/features/authoring-engine/utils/resolveAuthoringUnion.js.map +1 -0
  37. package/dist/types/authoring-engine.d.ts +34 -2
  38. package/dist/types/authoring-engine.d.ts.map +1 -1
  39. package/dist/ui/admin/pages/SecretsAdminPage.d.ts.map +1 -1
  40. package/dist/ui/admin/pages/SecretsAdminPage.js +3 -9
  41. package/dist/ui/admin/pages/SecretsAdminPage.js.map +1 -1
  42. package/package.json +1 -1
@@ -1,12 +1,18 @@
1
1
  import { deleteOwnProperty, isRecord, readOwnProperty, setOwnProperty, } from '@ankhorage/utility/object';
2
+ import { isAuthoringCollectionKeyAllowed } from '../../utils/isAuthoringCollectionKeyAllowed';
3
+ import { resolveAuthoringCollectionKey } from '../../utils/resolveAuthoringCollectionKey';
4
+ import { resolveAuthoringUnion } from '../../utils/resolveAuthoringUnion';
2
5
  import { applyAuthoringMutation } from './applyAuthoringMutation';
3
- /*** Apply one neutral mutation against owner structure, materializing valid parents and pruning empty optional overrides. */
6
+ /*** Apply one neutral mutation against owner structure, preserving collection identity and active union semantics. */
4
7
  export function applyAuthoringMutationToStructure(current, structure, mutation) {
5
8
  if (!isRecord(current)) {
6
9
  return rejected(mutation, 'Structured authoring mutations require object state.');
7
10
  }
11
+ const pathValidation = validateMutationPath(structure, current, mutation.path, mutation);
12
+ if (!pathValidation.ok)
13
+ return pathValidation;
8
14
  if (mutation.kind === 'rename-key') {
9
- const validation = validateValueMapRename(structure, mutation);
15
+ const validation = validateValueMapRename(current, structure, mutation);
10
16
  if (!validation.ok)
11
17
  return validation;
12
18
  }
@@ -18,100 +24,223 @@ export function applyAuthoringMutationToStructure(current, structure, mutation)
18
24
  const applied = applyAuthoringMutation(prepared.value, mutation);
19
25
  if (!applied.ok)
20
26
  return applied;
27
+ const validation = validateStructuredValue(structure, applied.value, mutation, []);
28
+ if (!validation.ok)
29
+ return validation;
21
30
  return {
22
31
  ok: true,
23
32
  value: normalizeStructuredValue(structure, applied.value, mutation.kind === 'unset'),
24
33
  };
25
34
  }
35
+ /*** Reject mutations that target a stable entity identity field, including nested active unions. */
36
+ function validateMutationPath(structure, value, path, mutation) {
37
+ if (path.length === 0)
38
+ return { ok: true };
39
+ const effective = resolveEffectiveStructure(structure, value, mutation);
40
+ if (!effective.ok)
41
+ return effective;
42
+ const [segment, ...remaining] = path;
43
+ if (!segment)
44
+ return rejected(mutation, 'Structured authoring mutation path is empty.');
45
+ if (effective.structure.kind === 'entity-registry' &&
46
+ effective.structure.identityField !== undefined &&
47
+ remaining.at(0) === effective.structure.identityField) {
48
+ return rejected(mutation, 'Entity-registry identity fields are immutable.');
49
+ }
50
+ const child = resolveChildStructure(effective.structure, segment);
51
+ if (!child || remaining.length === 0)
52
+ return { ok: true };
53
+ const childValue = isRecord(value) ? readOwnProperty(value, segment) : undefined;
54
+ return validateMutationPath(child, childValue, remaining, mutation);
55
+ }
26
56
  /*** Validate one keyed rename against the owner map structure before applying it. */
27
- function validateValueMapRename(structure, mutation) {
28
- const target = resolveStructureAtPath(structure, mutation.path);
29
- if (target?.kind !== 'value-map') {
57
+ function validateValueMapRename(current, structure, mutation) {
58
+ const target = resolveStructureAtPath(structure, current, mutation.path, mutation);
59
+ if (!target.ok)
60
+ return target;
61
+ if (target.structure.kind !== 'value-map') {
30
62
  return rejected(mutation, 'Authoring key rename requires a value-map target.');
31
63
  }
32
- if (!isValueMapKeyAllowed(target.key, mutation.toKey)) {
33
- return rejected(mutation, `Value-map key "${mutation.toKey}" is not allowed by the owner structure.`);
64
+ const key = resolveAuthoringCollectionKey(target.structure.key);
65
+ if (!key || !isAuthoringCollectionKeyAllowed(key, mutation.toKey)) {
66
+ return rejected(mutation, 'Value-map key "' + mutation.toKey + '" is not allowed by the owner structure.');
34
67
  }
35
68
  return { ok: true };
36
69
  }
37
- /*** Resolve one owner structure node at a canonical object/value-map path. */
38
- function resolveStructureAtPath(structure, path) {
39
- if (path.length === 0)
40
- return structure;
70
+ /*** Resolve one owner structure node at a canonical path, selecting active union variants from state. */
71
+ function resolveStructureAtPath(structure, value, path, mutation) {
72
+ const effective = resolveEffectiveStructure(structure, value, mutation);
73
+ if (!effective.ok || path.length === 0)
74
+ return effective;
41
75
  const [segment, ...remaining] = path;
42
76
  if (!segment)
43
- return undefined;
44
- const child = resolveChildStructure(structure, segment);
45
- return child ? resolveStructureAtPath(child, remaining) : undefined;
77
+ return rejected(mutation, 'Structured authoring mutation path is empty.');
78
+ const child = resolveChildStructure(effective.structure, segment);
79
+ if (!child)
80
+ return rejected(mutation, 'Unknown authoring path segment "' + segment + '".');
81
+ const childValue = isRecord(value) ? readOwnProperty(value, segment) : undefined;
82
+ return resolveStructureAtPath(child, childValue, remaining, mutation);
46
83
  }
47
- /*** Materialize missing object/value-map ancestors only when the owner structure authorizes the path. */
84
+ /*** Materialize missing object/map/registry ancestors only when owner structure authorizes the path. */
48
85
  function materializeMutationPath(current, structure, path, mutation) {
86
+ const effective = resolveEffectiveStructure(structure, current, mutation);
87
+ if (!effective.ok)
88
+ return effective;
49
89
  const [segment, ...remaining] = path;
50
90
  if (!segment)
51
91
  return rejected(mutation, 'Structured authoring mutation path is empty.');
52
- const childStructure = resolveChildStructure(structure, segment);
53
- if (!childStructure) {
54
- return rejected(mutation, `Authoring path segment "${segment}" is not allowed by the owner structure.`);
92
+ const child = resolveChildStructure(effective.structure, segment);
93
+ if (!child) {
94
+ return rejected(mutation, 'Authoring path segment "' + segment + '" is not allowed by the owner structure.');
55
95
  }
56
96
  if (remaining.length === 0)
57
97
  return { ok: true, value: current };
58
98
  const existing = readOwnProperty(current, segment);
59
99
  if (existing !== undefined && !isRecord(existing)) {
60
- return rejected(mutation, `Cannot materialize through non-object authoring path segment "${segment}".`);
100
+ return rejected(mutation, 'Cannot materialize through non-object authoring path segment "' + segment + '".');
61
101
  }
62
- const nested = materializeMutationPath(isRecord(existing) ? existing : {}, childStructure, remaining, mutation);
102
+ const nested = materializeMutationPath(isRecord(existing) ? existing : {}, child, remaining, mutation);
63
103
  if (!nested.ok)
64
104
  return nested;
65
105
  const value = { ...current };
66
106
  setOwnProperty(value, segment, nested.value);
67
107
  return { ok: true, value };
68
108
  }
69
- /*** Resolve one structural child for an object field or keyed value-map entry. */
109
+ /*** Resolve an active union variant or preserve a non-union structure unchanged. */
110
+ function resolveEffectiveStructure(structure, value, mutation) {
111
+ if (structure.kind !== 'union')
112
+ return { ok: true, structure };
113
+ const resolved = resolveAuthoringUnion(structure, value, mutation.path);
114
+ if (!resolved.ok || resolved.selected === undefined) {
115
+ return rejected(mutation, resolved.ok
116
+ ? 'Select a union variant before editing its fields.'
117
+ : resolved.diagnostic.message);
118
+ }
119
+ return { ok: true, structure: resolved.selected.structure };
120
+ }
121
+ /*** Resolve one structural child for fixed object, value-map, or entity-registry semantics. */
70
122
  function resolveChildStructure(structure, segment) {
71
123
  if (structure.kind === 'object') {
72
124
  return structure.fields.find((field) => field.name === segment)?.structure;
73
125
  }
74
- if (structure.kind !== 'value-map' || !isValueMapKeyAllowed(structure.key, segment)) {
126
+ if (structure.kind !== 'value-map' && structure.kind !== 'entity-registry')
75
127
  return undefined;
128
+ const key = resolveAuthoringCollectionKey(structure.key);
129
+ return key && isAuthoringCollectionKeyAllowed(key, segment) ? structure.value : undefined;
130
+ }
131
+ /*** Validate registry identity and active discriminated unions after a mutation is applied. */
132
+ function validateStructuredValue(structure, value, mutation, path) {
133
+ if (value === undefined)
134
+ return { ok: true };
135
+ if (structure.kind === 'union')
136
+ return validateUnionValue(structure, value, mutation, path);
137
+ if (structure.kind === 'entity-registry') {
138
+ return validateEntityRegistryValue(structure, value, mutation, path);
139
+ }
140
+ if (!isRecord(value))
141
+ return { ok: true };
142
+ if (structure.kind === 'object') {
143
+ for (const field of structure.fields) {
144
+ const current = readOwnProperty(value, field.name);
145
+ const result = validateStructuredValue(field.structure, current, mutation, [
146
+ ...path,
147
+ field.name,
148
+ ]);
149
+ if (!result.ok)
150
+ return result;
151
+ }
152
+ }
153
+ if (structure.kind === 'value-map') {
154
+ for (const [key, current] of Object.entries(value)) {
155
+ const result = validateStructuredValue(structure.value, current, mutation, [...path, key]);
156
+ if (!result.ok)
157
+ return result;
158
+ }
159
+ }
160
+ return { ok: true };
161
+ }
162
+ /*** Validate one entity registry including record key to owner identity-field consistency. */
163
+ function validateEntityRegistryValue(structure, value, mutation, path) {
164
+ if (!isRecord(value))
165
+ return rejectedAt(mutation, path, 'Expected entity-registry object.');
166
+ const key = resolveAuthoringCollectionKey(structure.key);
167
+ if (!key)
168
+ return rejectedAt(mutation, path, 'Unsupported entity-registry key semantics.');
169
+ for (const [entryKey, entryValue] of Object.entries(value)) {
170
+ if (!isAuthoringCollectionKeyAllowed(key, entryKey)) {
171
+ return rejectedAt(mutation, [...path, entryKey], 'Invalid entity-registry key.');
172
+ }
173
+ if (structure.identityField !== undefined) {
174
+ if (!isRecord(entryValue)) {
175
+ return rejectedAt(mutation, [...path, entryKey], 'Entity-registry value must be an object.');
176
+ }
177
+ if (readOwnProperty(entryValue, structure.identityField) !== entryKey) {
178
+ return rejectedAt(mutation, [...path, entryKey, structure.identityField], 'Entity-registry key must match its owner identity field.');
179
+ }
180
+ }
181
+ const nested = validateStructuredValue(structure.value, entryValue, mutation, [
182
+ ...path,
183
+ entryKey,
184
+ ]);
185
+ if (!nested.ok)
186
+ return nested;
76
187
  }
77
- return structure.value;
188
+ return { ok: true };
78
189
  }
79
- /*** Validate one keyed value-map path segment without guessing unsupported key semantics. */
80
- function isValueMapKeyAllowed(structure, key) {
81
- if (key.trim().length === 0)
82
- return false;
83
- if (structure.kind === 'scalar' && structure.scalarType === 'string')
84
- return true;
85
- return (structure.kind === 'choice' &&
86
- structure.values.some((value) => typeof value === 'string' && value === key));
190
+ /*** Validate one union value against its selected owner variant and recurse through that structure. */
191
+ function validateUnionValue(structure, value, mutation, path) {
192
+ const resolved = resolveAuthoringUnion(structure, value, path);
193
+ if (!resolved.ok || resolved.selected === undefined) {
194
+ return rejectedAt(mutation, resolved.ok ? path : resolved.diagnostic.path, resolved.ok ? 'Union value has no selected variant.' : resolved.diagnostic.message);
195
+ }
196
+ return validateStructuredValue(resolved.selected.structure, value, mutation, path);
87
197
  }
88
198
  /*** Normalize known owner structure recursively while preserving unknown sibling fields. */
89
199
  function normalizeStructuredValue(structure, value, pruneEmptyOverrides) {
90
200
  if (!isRecord(value))
91
201
  return value;
202
+ if (structure.kind === 'union') {
203
+ const resolved = resolveAuthoringUnion(structure, value, []);
204
+ return resolved.ok && resolved.selected
205
+ ? normalizeStructuredValue(resolved.selected.structure, value, pruneEmptyOverrides)
206
+ : value;
207
+ }
92
208
  if (structure.kind === 'object') {
93
- const normalized = { ...value };
94
- for (const field of structure.fields) {
95
- const current = readOwnProperty(normalized, field.name);
96
- if (current === undefined)
97
- continue;
98
- const next = normalizeStructuredValue(field.structure, current, pruneEmptyOverrides);
99
- if (pruneEmptyOverrides && field.optional && isEmptyRecord(next)) {
100
- deleteOwnProperty(normalized, field.name);
101
- }
102
- else {
103
- setOwnProperty(normalized, field.name, next);
104
- }
209
+ return normalizeObject(structure, value, pruneEmptyOverrides);
210
+ }
211
+ if (structure.kind === 'entity-registry') {
212
+ return normalizeCollection(structure.value, value, pruneEmptyOverrides, false);
213
+ }
214
+ if (structure.kind === 'value-map') {
215
+ return normalizeCollection(structure.value, value, pruneEmptyOverrides, true);
216
+ }
217
+ return value;
218
+ }
219
+ /*** Normalize fixed object fields and prune empty optional override containers. */
220
+ function normalizeObject(structure, value, pruneEmptyOverrides) {
221
+ const normalized = { ...value };
222
+ for (const field of structure.fields) {
223
+ const current = readOwnProperty(normalized, field.name);
224
+ if (current === undefined)
225
+ continue;
226
+ const next = normalizeStructuredValue(field.structure, current, pruneEmptyOverrides);
227
+ if (pruneEmptyOverrides && field.optional && isEmptyRecord(next)) {
228
+ deleteOwnProperty(normalized, field.name);
229
+ }
230
+ else {
231
+ setOwnProperty(normalized, field.name, next);
105
232
  }
106
- return normalized;
107
233
  }
108
- if (structure.kind !== 'value-map')
109
- return value;
234
+ return normalized;
235
+ }
236
+ /*** Normalize keyed values while pruning empty map overrides but never deleting stable entities. */
237
+ function normalizeCollection(valueStructure, value, pruneEmptyOverrides, pruneEntries) {
110
238
  const normalized = {};
111
239
  for (const [key, current] of Object.entries(value)) {
112
- const next = normalizeStructuredValue(structure.value, current, pruneEmptyOverrides);
113
- if (pruneEmptyOverrides && shouldPruneEmptyMapValue(structure.value, next))
240
+ const next = normalizeStructuredValue(valueStructure, current, pruneEmptyOverrides);
241
+ if (pruneEntries && pruneEmptyOverrides && shouldPruneEmptyMapValue(valueStructure, next)) {
114
242
  continue;
243
+ }
115
244
  setOwnProperty(normalized, key, next);
116
245
  }
117
246
  return normalized;
@@ -126,14 +255,18 @@ function shouldPruneEmptyMapValue(structure, value) {
126
255
  function isEmptyRecord(value) {
127
256
  return isRecord(value) && Object.keys(value).length === 0;
128
257
  }
129
- /*** Create one structure-aware mutation rejection without mutating the authored value. */
258
+ /*** Create one structure-aware mutation rejection at the mutation's requested path. */
130
259
  function rejected(mutation, message) {
260
+ return rejectedAt(mutation, mutation.path, message);
261
+ }
262
+ /*** Create one structure-aware mutation rejection at an exact owner-semantic path. */
263
+ function rejectedAt(mutation, path, message) {
131
264
  return {
132
265
  ok: false,
133
266
  diagnostic: {
134
267
  code: 'mutation-rejected',
135
268
  message,
136
- path: mutation.path,
269
+ path,
137
270
  },
138
271
  };
139
272
  }
@@ -1 +1 @@
1
- {"version":3,"file":"applyAuthoringMutationToStructure.js","sourceRoot":"","sources":["../../../../../src/features/authoring-engine/application/use-cases/applyAuthoringMutationToStructure.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"applyAuthoringMutationToStructure.js","sourceRoot":"","sources":["../../../../../src/features/authoring-engine/application/use-cases/applyAuthoringMutationToStructure.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"createInitialAuthoringValue.d.ts","sourceRoot":"","sources":["../../../../../src/features/authoring-engine/application/use-cases/createInitialAuthoringValue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAE7F,mGAAmG;AACnG,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,kBAAkB,GAC5B,cAAc,GAAG,SAAS,CAyB5B"}
1
+ {"version":3,"file":"createInitialAuthoringValue.d.ts","sourceRoot":"","sources":["../../../../../src/features/authoring-engine/application/use-cases/createInitialAuthoringValue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAG7F,mGAAmG;AACnG,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,kBAAkB,GAC5B,cAAc,GAAG,SAAS,CAgC5B"}
@@ -1,3 +1,4 @@
1
+ import { resolveAuthoringUnion } from '../../utils/resolveAuthoringUnion';
1
2
  /*** Create one deterministic structurally valid initial value for generic collection insertion. */
2
3
  export function createInitialAuthoringValue(structure) {
3
4
  switch (structure.kind) {
@@ -16,7 +17,14 @@ export function createInitialAuthoringValue(structure) {
16
17
  case 'ordered-list':
17
18
  return [];
18
19
  case 'value-map':
20
+ case 'entity-registry':
19
21
  return {};
22
+ case 'union': {
23
+ const resolved = resolveAuthoringUnion(structure, undefined, []);
24
+ return resolved.ok && resolved.variants[0]
25
+ ? createInitialAuthoringValue(resolved.variants[0].structure)
26
+ : undefined;
27
+ }
20
28
  case 'object': {
21
29
  const entries = structure.fields
22
30
  .filter((field) => !field.optional)
@@ -1 +1 @@
1
- {"version":3,"file":"createInitialAuthoringValue.js","sourceRoot":"","sources":["../../../../../src/features/authoring-engine/application/use-cases/createInitialAuthoringValue.ts"],"names":[],"mappings":"AAEA,mGAAmG;AACnG,MAAM,UAAU,2BAA2B,CACzC,SAA6B;IAE7B,QAAQ,SAAS,CAAC,IAAI,EAAE,CAAC;QACvB,KAAK,QAAQ;YACX,IAAI,SAAS,CAAC,UAAU,KAAK,SAAS;gBAAE,OAAO,KAAK,CAAC;YACrD,IAAI,SAAS,CAAC,UAAU,KAAK,MAAM;gBAAE,OAAO,IAAI,CAAC;YACjD,IAAI,SAAS,CAAC,UAAU,KAAK,QAAQ;gBAAE,OAAO,EAAE,CAAC;YACjD,OAAO,CAAC,CAAC;QACX,KAAK,QAAQ;YACX,OAAO,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAChC,KAAK,KAAK;YACR,OAAO,EAAE,CAAC;QACZ,KAAK,cAAc;YACjB,OAAO,EAAE,CAAC;QACZ,KAAK,WAAW;YACd,OAAO,EAAE,CAAC;QACZ,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM;iBAC7B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;iBAClC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,2BAA2B,CAAC,KAAK,CAAC,SAAS,CAAC,CAAU,CAAC,CAAC;YACvF,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC;gBAAE,OAAO,SAAS,CAAC;YACvE,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAA6C,CAAC;QACjF,CAAC;QACD,KAAK,aAAa;YAChB,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"createInitialAuthoringValue.js","sourceRoot":"","sources":["../../../../../src/features/authoring-engine/application/use-cases/createInitialAuthoringValue.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAE1E,mGAAmG;AACnG,MAAM,UAAU,2BAA2B,CACzC,SAA6B;IAE7B,QAAQ,SAAS,CAAC,IAAI,EAAE,CAAC;QACvB,KAAK,QAAQ;YACX,IAAI,SAAS,CAAC,UAAU,KAAK,SAAS;gBAAE,OAAO,KAAK,CAAC;YACrD,IAAI,SAAS,CAAC,UAAU,KAAK,MAAM;gBAAE,OAAO,IAAI,CAAC;YACjD,IAAI,SAAS,CAAC,UAAU,KAAK,QAAQ;gBAAE,OAAO,EAAE,CAAC;YACjD,OAAO,CAAC,CAAC;QACX,KAAK,QAAQ;YACX,OAAO,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAChC,KAAK,KAAK;YACR,OAAO,EAAE,CAAC;QACZ,KAAK,cAAc;YACjB,OAAO,EAAE,CAAC;QACZ,KAAK,WAAW,CAAC;QACjB,KAAK,iBAAiB;YACpB,OAAO,EAAE,CAAC;QACZ,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,QAAQ,GAAG,qBAAqB,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;YACjE,OAAO,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACxC,CAAC,CAAC,2BAA2B,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC7D,CAAC,CAAC,SAAS,CAAC;QAChB,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM;iBAC7B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;iBAClC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,2BAA2B,CAAC,KAAK,CAAC,SAAS,CAAC,CAAU,CAAC,CAAC;YACvF,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC;gBAAE,OAAO,SAAS,CAAC;YACvE,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAA6C,CAAC;QACjF,CAAC;QACD,KAAK,aAAa;YAChB,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { AuthoringStructure, AuthoringValue } from '../../../../types/authoring-engine';
2
+ /*** Create one registry entity and materialize its owner identity field from the stable record key. */
3
+ export declare function createInitialEntityRegistryValue(structure: AuthoringStructure, identityField: string | undefined, key: string): AuthoringValue | undefined;
4
+ //# sourceMappingURL=createInitialEntityRegistryValue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createInitialEntityRegistryValue.d.ts","sourceRoot":"","sources":["../../../../../src/features/authoring-engine/application/use-cases/createInitialEntityRegistryValue.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAG7F,uGAAuG;AACvG,wBAAgB,gCAAgC,CAC9C,SAAS,EAAE,kBAAkB,EAC7B,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,GAAG,EAAE,MAAM,GACV,cAAc,GAAG,SAAS,CAQ5B"}
@@ -0,0 +1,14 @@
1
+ import { isRecord, setOwnProperty } from '@ankhorage/utility/object';
2
+ import { createInitialAuthoringValue } from './createInitialAuthoringValue';
3
+ /*** Create one registry entity and materialize its owner identity field from the stable record key. */
4
+ export function createInitialEntityRegistryValue(structure, identityField, key) {
5
+ const initial = createInitialAuthoringValue(structure);
6
+ if (!identityField)
7
+ return initial;
8
+ if (!isRecord(initial))
9
+ return undefined;
10
+ const value = { ...initial };
11
+ setOwnProperty(value, identityField, key);
12
+ return value;
13
+ }
14
+ //# sourceMappingURL=createInitialEntityRegistryValue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createInitialEntityRegistryValue.js","sourceRoot":"","sources":["../../../../../src/features/authoring-engine/application/use-cases/createInitialEntityRegistryValue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAGrE,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAE5E,uGAAuG;AACvG,MAAM,UAAU,gCAAgC,CAC9C,SAA6B,EAC7B,aAAiC,EACjC,GAAW;IAEX,MAAM,OAAO,GAAG,2BAA2B,CAAC,SAAS,CAAC,CAAC;IACvD,IAAI,CAAC,aAAa;QAAE,OAAO,OAAO,CAAC;IACnC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAC;IAEzC,MAAM,KAAK,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;IAC7B,cAAc,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;IAC1C,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"deriveAuthoringModel.d.ts","sourceRoot":"","sources":["../../../../../src/features/authoring-engine/application/use-cases/deriveAuthoringModel.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,aAAa,EAEb,2BAA2B,EAG3B,kBAAkB,EAEnB,MAAM,oCAAoC,CAAC;AAE5C,mGAAmG;AACnG,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,QAAQ,CAAC,SAAS,EAAE,kBAAkB,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,2BAA2B,CAAC;IAC9C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B,GAAG,aAAa,CAUhB"}
1
+ {"version":3,"file":"deriveAuthoringModel.d.ts","sourceRoot":"","sources":["../../../../../src/features/authoring-engine/application/use-cases/deriveAuthoringModel.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAGV,aAAa,EAEb,2BAA2B,EAG3B,kBAAkB,EAEnB,MAAM,oCAAoC,CAAC;AAK5C,mGAAmG;AACnG,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,QAAQ,CAAC,SAAS,EAAE,kBAAkB,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,2BAA2B,CAAC;IAC9C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B,GAAG,aAAa,CAUhB"}
@@ -1,4 +1,7 @@
1
- import { isRecord } from '@ankhorage/utility/object';
1
+ import { isRecord, readOwnProperty } from '@ankhorage/utility/object';
2
+ import { isAuthoringCollectionKeyAllowed } from '../../utils/isAuthoringCollectionKeyAllowed';
3
+ import { resolveAuthoringCollectionKey } from '../../utils/resolveAuthoringCollectionKey';
4
+ import { resolveAuthoringUnion } from '../../utils/resolveAuthoringUnion';
2
5
  /*** Derive one UI-neutral authoring model from neutral structure semantics and a runtime value. */
3
6
  export function deriveAuthoringModel(args) {
4
7
  return deriveNode({
@@ -99,6 +102,54 @@ function deriveNode(args) {
99
102
  }
100
103
  : unsupportedValue(base, value.diagnostic);
101
104
  }
105
+ case 'entity-registry': {
106
+ const { identityField, value: valueStructure } = args.structure;
107
+ const value = readEntityRegistryValue(args.structure.key, identityField, args.value, args.optional, args.path);
108
+ if (!value.ok)
109
+ return unsupportedValue(base, value.diagnostic);
110
+ return {
111
+ ...base,
112
+ kind: 'entity-registry',
113
+ key: value.key,
114
+ valueStructure,
115
+ ...(identityField === undefined ? {} : { identityField }),
116
+ entries: value.entries.map(([key, entryValue]) => ({
117
+ key,
118
+ value: deriveNode({
119
+ structure: valueStructure,
120
+ value: entryValue,
121
+ policy: withRegistryIdentityReadOnly(resolvePresentationFieldPolicy(args.policy?.fields, key), identityField),
122
+ path: [...args.path, key],
123
+ label: key,
124
+ optional: false,
125
+ inheritedReadOnly: readOnly,
126
+ }),
127
+ })),
128
+ };
129
+ }
130
+ case 'union': {
131
+ const resolved = resolveAuthoringUnion(args.structure, args.value, args.path);
132
+ if (!resolved.ok)
133
+ return unsupportedValue(base, resolved.diagnostic);
134
+ return {
135
+ ...base,
136
+ kind: 'union',
137
+ discriminator: resolved.discriminator,
138
+ variants: resolved.variants,
139
+ selected: resolved.selected?.value,
140
+ value: resolved.selected === undefined
141
+ ? undefined
142
+ : deriveNode({
143
+ structure: withoutUnionDiscriminator(resolved.selected.structure, resolved.discriminator),
144
+ value: args.value,
145
+ policy: args.policy,
146
+ path: args.path,
147
+ label: args.label,
148
+ optional: false,
149
+ inheritedReadOnly: readOnly,
150
+ }),
151
+ };
152
+ }
102
153
  case 'object': {
103
154
  if (args.value !== undefined && !isRecord(args.value)) {
104
155
  return unsupportedValue(base, {
@@ -221,11 +272,19 @@ function readSetValue(member, value, optional) {
221
272
  }
222
273
  /*** Validate keyed value-map state while keeping key identity distinct from collection order. */
223
274
  function readValueMapValue(keyStructure, value, optional) {
224
- const key = resolveValueMapKey(keyStructure);
225
- if (!key.ok)
226
- return key;
275
+ const key = resolveAuthoringCollectionKey(keyStructure);
276
+ if (!key) {
277
+ return {
278
+ ok: false,
279
+ diagnostic: {
280
+ code: 'unsupported-structure',
281
+ message: 'Value-map authoring requires scalar-string or finite-string-choice keys.',
282
+ path: [],
283
+ },
284
+ };
285
+ }
227
286
  if (value === undefined && optional)
228
- return { ok: true, key: key.key, entries: [] };
287
+ return { ok: true, key, entries: [] };
229
288
  if (!isRecord(value)) {
230
289
  return {
231
290
  ok: false,
@@ -237,7 +296,7 @@ function readValueMapValue(keyStructure, value, optional) {
237
296
  };
238
297
  }
239
298
  const entries = Object.entries(value).sort(([left], [right]) => left.localeCompare(right));
240
- const invalid = entries.find(([candidate]) => !isValueMapKeyAllowed(key.key, candidate));
299
+ const invalid = entries.find(([candidate]) => !isAuthoringCollectionKeyAllowed(key, candidate));
241
300
  if (invalid) {
242
301
  return {
243
302
  ok: false,
@@ -248,40 +307,83 @@ function readValueMapValue(keyStructure, value, optional) {
248
307
  },
249
308
  };
250
309
  }
251
- return { ok: true, key: key.key, entries };
310
+ return { ok: true, key, entries };
252
311
  }
253
312
  /*** Merge authored entries with presentation-only inherited keys without materializing defaults. */
254
313
  function mergeValueMapEntries(authoredEntries, fields, key) {
255
314
  const authoredKeys = new Set(authoredEntries.map(([entryKey]) => entryKey));
256
- const inheritedKeys = Object.keys(fields ?? {}).filter((candidate) => !authoredKeys.has(candidate) && isValueMapKeyAllowed(key, candidate));
315
+ const inheritedKeys = Object.keys(fields ?? {}).filter((candidate) => !authoredKeys.has(candidate) && isAuthoringCollectionKeyAllowed(key, candidate));
257
316
  return [
258
317
  ...authoredEntries.map(([entryKey, value]) => [entryKey, value, true]),
259
318
  ...inheritedKeys.map((entryKey) => [entryKey, undefined, false]),
260
319
  ].sort(([left], [right]) => left.localeCompare(right));
261
320
  }
262
- /*** Resolve the currently supported portable value-map key semantics. */
263
- function resolveValueMapKey(structure) {
264
- if (structure.kind === 'scalar' && structure.scalarType === 'string') {
265
- return { ok: true, key: { kind: 'scalar', scalarType: 'string' } };
321
+ /*** Validate one stable entity registry without assigning semantic meaning to record order. */
322
+ function readEntityRegistryValue(keyStructure, identityField, value, optional, path) {
323
+ const key = resolveAuthoringCollectionKey(keyStructure);
324
+ if (!key) {
325
+ return {
326
+ ok: false,
327
+ diagnostic: {
328
+ code: 'unsupported-structure',
329
+ message: 'Entity-registry authoring requires scalar-string or finite-string-choice keys.',
330
+ path,
331
+ },
332
+ };
333
+ }
334
+ if (value === undefined && optional)
335
+ return { ok: true, key, entries: [] };
336
+ if (!isRecord(value)) {
337
+ return {
338
+ ok: false,
339
+ diagnostic: {
340
+ code: 'invalid-value',
341
+ message: 'Expected entity-registry object.',
342
+ path,
343
+ },
344
+ };
266
345
  }
267
- if (structure.kind === 'choice') {
268
- const values = structure.values.filter((candidate) => typeof candidate === 'string');
269
- if (values.length === structure.values.length) {
270
- return { ok: true, key: { kind: 'choice', values } };
346
+ const entries = Object.entries(value).sort(([left], [right]) => left.localeCompare(right));
347
+ for (const [entryKey, entryValue] of entries) {
348
+ if (!isAuthoringCollectionKeyAllowed(key, entryKey)) {
349
+ return registryInvalid(path, 'Invalid entity-registry key "' + entryKey + '".');
350
+ }
351
+ if (identityField !== undefined) {
352
+ if (!isRecord(entryValue)) {
353
+ return registryInvalid(path, 'Entity-registry identity requires object values.');
354
+ }
355
+ if (readOwnProperty(entryValue, identityField) !== entryKey) {
356
+ return registryInvalid([...path, entryKey, identityField], 'Entity-registry key must match owner identity field "' + identityField + '".');
357
+ }
271
358
  }
272
359
  }
360
+ return { ok: true, key, entries };
361
+ }
362
+ /*** Build one entity-registry invalid-value result with an exact authored path. */
363
+ function registryInvalid(path, message) {
364
+ return { ok: false, diagnostic: { code: 'invalid-value', message, path } };
365
+ }
366
+ /*** Keep an entity identity field immutable inside its keyed detail editor. */
367
+ function withRegistryIdentityReadOnly(policy, identityField) {
368
+ if (!identityField)
369
+ return policy;
370
+ const identityPolicy = resolvePresentationFieldPolicy(policy?.fields, identityField);
273
371
  return {
274
- ok: false,
275
- diagnostic: {
276
- code: 'unsupported-structure',
277
- message: 'Value-map authoring requires scalar-string or finite-string-choice keys.',
278
- path: [],
372
+ ...policy,
373
+ fields: {
374
+ ...policy?.fields,
375
+ [identityField]: { ...identityPolicy, readOnly: true },
279
376
  },
280
377
  };
281
378
  }
282
- /*** Check one authored object key against the resolved value-map key contract. */
283
- function isValueMapKeyAllowed(key, candidate) {
284
- return key.kind === 'scalar' || key.values.includes(candidate);
379
+ /*** Remove the union discriminator from detail rendering because variant selection owns it. */
380
+ function withoutUnionDiscriminator(structure, discriminator) {
381
+ if (structure.kind !== 'object')
382
+ return structure;
383
+ return {
384
+ ...structure,
385
+ fields: structure.fields.filter((field) => field.name !== discriminator),
386
+ };
285
387
  }
286
388
  /*** Validate one ordered primitive list while preserving authored order and duplicates. */
287
389
  function readOrderedListValue(item, value, optional) {