@altopelago/aeon-aes 0.9.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.
@@ -0,0 +1,340 @@
1
+ /**
2
+ * Phase 6 — Reference Validation (no evaluation)
3
+ *
4
+ * Validates references (~ and ~>) against the Assignment Event stream.
5
+ *
6
+ * Non-negotiable constraints:
7
+ * - Do NOT resolve/inline references
8
+ * - Do NOT transform values
9
+ * - Fail-closed by default (no events if any reference validation error)
10
+ */
11
+ import { formatPath } from './paths.js';
12
+ import { formatReferenceTargetPath } from './reference-target.js';
13
+ export class ReferenceValidationError extends Error {
14
+ span;
15
+ code;
16
+ /** Path of the binding that contains the reference */
17
+ sourcePath;
18
+ /** Target canonical path string (e.g., "$.a.b") */
19
+ targetPath;
20
+ constructor(message, span, code, sourcePath, targetPath) {
21
+ super(message);
22
+ this.name = 'ReferenceValidationError';
23
+ this.span = span;
24
+ this.code = code;
25
+ this.sourcePath = sourcePath;
26
+ this.targetPath = targetPath;
27
+ }
28
+ }
29
+ export class MissingReferenceTargetError extends ReferenceValidationError {
30
+ constructor(span, sourcePath, targetPath) {
31
+ super(`Missing reference target: '${targetPath}'`, span, 'MISSING_REFERENCE_TARGET', sourcePath, targetPath);
32
+ this.name = 'MissingReferenceTargetError';
33
+ }
34
+ }
35
+ export class ForwardReferenceError extends ReferenceValidationError {
36
+ sourceIndex;
37
+ targetIndex;
38
+ constructor(span, sourcePath, targetPath, sourceIndex, targetIndex) {
39
+ super(`Forward reference: '${sourcePath}' references '${targetPath}' defined later`, span, 'FORWARD_REFERENCE', sourcePath, targetPath);
40
+ this.name = 'ForwardReferenceError';
41
+ this.sourceIndex = sourceIndex;
42
+ this.targetIndex = targetIndex;
43
+ }
44
+ }
45
+ export class SelfReferenceError extends ReferenceValidationError {
46
+ constructor(span, sourcePath, targetPath) {
47
+ super(`Self reference: '${sourcePath}' references itself`, span, 'SELF_REFERENCE', sourcePath, targetPath);
48
+ this.name = 'SelfReferenceError';
49
+ }
50
+ }
51
+ export class AttributeDepthExceededError extends ReferenceValidationError {
52
+ observedDepth;
53
+ limit;
54
+ constructor(span, sourcePath, targetPath, observedDepth, limit) {
55
+ super(`Attribute depth ${observedDepth} exceeds max_attribute_depth ${limit} for '${targetPath}'`, span, 'ATTRIBUTE_DEPTH_EXCEEDED', sourcePath, targetPath);
56
+ this.name = 'AttributeDepthExceededError';
57
+ this.observedDepth = observedDepth;
58
+ this.limit = limit;
59
+ }
60
+ }
61
+ export function validateReferences(events, options = {}) {
62
+ const errors = [];
63
+ const maxAttributeDepth = options.maxAttributeDepth ?? 1;
64
+ const pathToIndex = new Map();
65
+ for (let i = 0; i < events.length; i++) {
66
+ const event = events[i];
67
+ const pathStr = formatPath(event.path);
68
+ pathToIndex.set(pathStr, i);
69
+ }
70
+ for (let i = 0; i < events.length; i++) {
71
+ const event = events[i];
72
+ const sourcePath = formatPath(event.path);
73
+ for (const ref of findOwnedReferences(event.value)) {
74
+ validateOneReference(ref, sourcePath, i, events, pathToIndex, errors, maxAttributeDepth);
75
+ }
76
+ if (event.annotations) {
77
+ for (const [, entry] of event.annotations) {
78
+ for (const ref of findReferencesInAttributeEntry(entry)) {
79
+ validateOneReference(ref, sourcePath, i, events, pathToIndex, errors, maxAttributeDepth);
80
+ }
81
+ }
82
+ }
83
+ }
84
+ if (errors.length > 0 && !options.recovery) {
85
+ return { events: [], errors };
86
+ }
87
+ return { events, errors };
88
+ }
89
+ function* findReferences(value) {
90
+ switch (value.type) {
91
+ case 'TypedValue':
92
+ for (const attr of value.attributes) {
93
+ yield* findReferencesInAttribute(attr);
94
+ }
95
+ yield* findReferences(value.value);
96
+ return;
97
+ case 'CloneReference':
98
+ case 'PointerReference':
99
+ yield value;
100
+ return;
101
+ case 'ObjectNode':
102
+ for (const attr of value.attributes) {
103
+ yield* findReferencesInAttribute(attr);
104
+ }
105
+ return;
106
+ case 'ListNode':
107
+ for (const element of value.elements) {
108
+ yield* findReferences(element);
109
+ }
110
+ for (const attr of value.attributes) {
111
+ yield* findReferencesInAttribute(attr);
112
+ }
113
+ return;
114
+ case 'TupleLiteral':
115
+ for (const element of value.elements) {
116
+ yield* findReferences(element);
117
+ }
118
+ for (const attr of value.attributes) {
119
+ yield* findReferencesInAttribute(attr);
120
+ }
121
+ return;
122
+ case 'NodeLiteral':
123
+ for (const attr of value.attributes) {
124
+ yield* findReferencesInAttribute(attr);
125
+ }
126
+ for (const child of value.children) {
127
+ yield* findReferences(child);
128
+ }
129
+ return;
130
+ default:
131
+ return;
132
+ }
133
+ }
134
+ function* findOwnedReferences(value) {
135
+ switch (value.type) {
136
+ case 'TypedValue':
137
+ for (const attr of value.attributes) {
138
+ yield* findReferencesInAttribute(attr);
139
+ }
140
+ yield* findOwnedReferences(value.value);
141
+ return;
142
+ case 'CloneReference':
143
+ case 'PointerReference':
144
+ yield value;
145
+ return;
146
+ case 'ObjectNode':
147
+ for (const attr of value.attributes) {
148
+ yield* findReferencesInAttribute(attr);
149
+ }
150
+ return;
151
+ case 'ListNode':
152
+ case 'TupleLiteral':
153
+ for (const attr of value.attributes) {
154
+ yield* findReferencesInAttribute(attr);
155
+ }
156
+ return;
157
+ case 'NodeLiteral':
158
+ for (const attr of value.attributes) {
159
+ yield* findReferencesInAttribute(attr);
160
+ }
161
+ for (const child of value.children) {
162
+ yield* findReferences(child);
163
+ }
164
+ return;
165
+ default:
166
+ return;
167
+ }
168
+ }
169
+ function* findReferencesInAttribute(attr) {
170
+ for (const [, entry] of attr.entries) {
171
+ yield* findReferencesInAttributeEntry(entry);
172
+ }
173
+ }
174
+ function* findReferencesInAttributeEntry(entry) {
175
+ if (hasAnnotationEntries(entry)) {
176
+ for (const [, nestedEntry] of entry.annotations) {
177
+ yield* findReferencesInAttributeEntry(nestedEntry);
178
+ }
179
+ }
180
+ yield* findReferences(entry.value);
181
+ if (hasNestedAttributes(entry)) {
182
+ for (const nestedAttribute of entry.attributes) {
183
+ yield* findReferencesInAttribute(nestedAttribute);
184
+ }
185
+ }
186
+ }
187
+ function hasAnnotationEntries(entry) {
188
+ return 'annotations' in entry && entry.annotations !== undefined;
189
+ }
190
+ function hasNestedAttributes(entry) {
191
+ return 'attributes' in entry;
192
+ }
193
+ function validateOneReference(ref, sourcePath, sourceIndex, events, pathToIndex, errors, maxAttributeDepth) {
194
+ const targetPath = formatReferenceTargetPath(ref.path);
195
+ const observedDepth = ref.path.filter((segment) => typeof segment === 'object' && segment.type === 'attr').length;
196
+ if (observedDepth > maxAttributeDepth) {
197
+ errors.push(new AttributeDepthExceededError(ref.span, sourcePath, targetPath, observedDepth, maxAttributeDepth));
198
+ return;
199
+ }
200
+ if (targetPath === sourcePath) {
201
+ errors.push(new SelfReferenceError(ref.span, sourcePath, targetPath));
202
+ return;
203
+ }
204
+ const indexedOwnerPath = sourcePath.replace(/(?:\[\d+\])+$/, '');
205
+ if (indexedOwnerPath !== sourcePath && targetPath === indexedOwnerPath) {
206
+ errors.push(new SelfReferenceError(ref.span, sourcePath, targetPath));
207
+ return;
208
+ }
209
+ const target = resolveReferenceTarget(ref.path, events, pathToIndex);
210
+ if (!target) {
211
+ errors.push(new MissingReferenceTargetError(ref.span, sourcePath, targetPath));
212
+ return;
213
+ }
214
+ if (target.index > sourceIndex) {
215
+ errors.push(new ForwardReferenceError(ref.span, sourcePath, targetPath, sourceIndex, target.index));
216
+ }
217
+ }
218
+ function isAttrSegment(segment) {
219
+ return typeof segment === 'object' && segment !== null && segment.type === 'attr';
220
+ }
221
+ function resolveReferenceTarget(path, events, pathToIndex) {
222
+ // Find the longest member/index-only prefix that maps to a known binding path.
223
+ for (let split = path.length; split >= 1; split--) {
224
+ const prefix = path.slice(0, split);
225
+ if (prefix.some((segment) => typeof segment === 'object' && segment.type === 'attr')) {
226
+ continue;
227
+ }
228
+ const prefixPath = formatReferenceTargetPath(prefix);
229
+ const targetIndex = pathToIndex.get(prefixPath);
230
+ if (targetIndex === undefined) {
231
+ continue;
232
+ }
233
+ const remainder = path.slice(split);
234
+ if (remainder.length === 0) {
235
+ return { index: targetIndex };
236
+ }
237
+ const event = events[targetIndex];
238
+ if (!event) {
239
+ return null;
240
+ }
241
+ if (resolveSubpath(event, remainder)) {
242
+ return { index: targetIndex };
243
+ }
244
+ }
245
+ return null;
246
+ }
247
+ function resolveSubpath(event, remainder) {
248
+ let context = {
249
+ value: event.value,
250
+ annotations: selectAnnotations(event.annotations, event.value),
251
+ };
252
+ for (const segment of remainder) {
253
+ if (isAttrSegment(segment)) {
254
+ const attrEntry = context.annotations?.get(segment.key);
255
+ if (!attrEntry)
256
+ return false;
257
+ context = {
258
+ value: attrEntry.value,
259
+ annotations: selectAnnotations(attrEntry.annotations, attrEntry.value),
260
+ };
261
+ continue;
262
+ }
263
+ else if (typeof segment === 'string') {
264
+ const value = unwrapTypedValue(context.value);
265
+ if (value.type !== 'ObjectNode')
266
+ return false;
267
+ const binding = value.bindings.find((candidate) => candidate.key === segment);
268
+ if (!binding)
269
+ return false;
270
+ const bindingAnnotations = buildAnnotationMap(binding.attributes);
271
+ context = {
272
+ value: binding.value,
273
+ annotations: selectAnnotations(bindingAnnotations, binding.value),
274
+ };
275
+ continue;
276
+ }
277
+ else if (typeof segment === 'number') {
278
+ if (segment < 0 || !Number.isInteger(segment))
279
+ return false;
280
+ const value = unwrapTypedValue(context.value);
281
+ let element;
282
+ if (value.type === 'ListNode' || value.type === 'TupleLiteral') {
283
+ element = value.elements[segment];
284
+ }
285
+ else if (value.type === 'NodeLiteral') {
286
+ element = value.children[segment];
287
+ }
288
+ else {
289
+ return false;
290
+ }
291
+ if (!element)
292
+ return false;
293
+ context = {
294
+ value: element,
295
+ annotations: selectAnnotations(undefined, element),
296
+ };
297
+ }
298
+ else {
299
+ return false;
300
+ }
301
+ }
302
+ return true;
303
+ }
304
+ function selectAnnotations(preferred, value) {
305
+ if (preferred && preferred.size > 0)
306
+ return preferred;
307
+ if (value.type === 'TypedValue' && value.attributes.length > 0) {
308
+ return buildAnnotationMap(value.attributes);
309
+ }
310
+ return buildValueAnnotationMap(unwrapTypedValue(value));
311
+ }
312
+ function unwrapTypedValue(value) {
313
+ return value.type === 'TypedValue' ? value.value : value;
314
+ }
315
+ function buildValueAnnotationMap(value) {
316
+ if (value.type !== 'ObjectNode'
317
+ && value.type !== 'ListNode'
318
+ && value.type !== 'TupleLiteral'
319
+ && value.type !== 'NodeLiteral') {
320
+ return undefined;
321
+ }
322
+ return buildAnnotationMap(value.attributes);
323
+ }
324
+ function buildAnnotationMap(attributes) {
325
+ if (!attributes || attributes.length === 0)
326
+ return undefined;
327
+ const result = new Map();
328
+ for (const attribute of attributes) {
329
+ for (const [key, entry] of attribute.entries) {
330
+ const mapped = { value: entry.value };
331
+ const nested = buildAnnotationMap(entry.attributes);
332
+ if (nested) {
333
+ mapped.annotations = nested;
334
+ }
335
+ result.set(key, mapped);
336
+ }
337
+ }
338
+ return result;
339
+ }
340
+ //# sourceMappingURL=references.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"references.js","sourceRoot":"","sources":["../src/references.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Phase 11 — Reference Resolution (Resolved AES)
3
+ *
4
+ * Resolves clone references (~) into terminal values while preserving
5
+ * pointer references (~>) as alias tokens. Output remains AES.
6
+ */
7
+ import type { AssignmentEvent } from './events.js';
8
+ import type { ReferencePathSegment } from '@altopelago/aeon-parser';
9
+ import type { Span } from '@altopelago/aeon-lexer';
10
+ export interface ResolveDiagnostic {
11
+ readonly message: string;
12
+ readonly code?: string;
13
+ readonly span?: Span;
14
+ readonly path?: string;
15
+ }
16
+ export interface ResolveMeta {
17
+ readonly warnings?: readonly ResolveDiagnostic[];
18
+ readonly errors?: readonly ResolveDiagnostic[];
19
+ readonly resolutionMap?: Record<string, string>;
20
+ readonly cycles?: readonly {
21
+ path: readonly ReferencePathSegment[];
22
+ }[];
23
+ }
24
+ export interface ResolveOptions {
25
+ readonly mode?: 'strict' | 'loose';
26
+ }
27
+ export interface ResolveResult {
28
+ readonly aes: readonly AssignmentEvent[];
29
+ readonly meta?: ResolveMeta;
30
+ }
31
+ export declare function resolveRefs(aes: readonly AssignmentEvent[], options?: ResolveOptions): ResolveResult;
32
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAA6C,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/G,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAInD,MAAM,WAAW,iBAAiB;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;IACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACjD,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC/C,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChD,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS;QAAE,IAAI,EAAE,SAAS,oBAAoB,EAAE,CAAA;KAAE,EAAE,CAAC;CAC1E;AAED,MAAM,WAAW,cAAc;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;CACtC;AAED,MAAM,WAAW,aAAa;IAC1B,QAAQ,CAAC,GAAG,EAAE,SAAS,eAAe,EAAE,CAAC;IACzC,QAAQ,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC;CAC/B;AAED,wBAAgB,WAAW,CACvB,GAAG,EAAE,SAAS,eAAe,EAAE,EAC/B,OAAO,GAAE,cAAmB,GAC7B,aAAa,CA6Tf"}
@@ -0,0 +1,257 @@
1
+ /**
2
+ * Phase 11 — Reference Resolution (Resolved AES)
3
+ *
4
+ * Resolves clone references (~) into terminal values while preserving
5
+ * pointer references (~>) as alias tokens. Output remains AES.
6
+ */
7
+ import { formatPath } from './paths.js';
8
+ import { formatReferenceTargetPath } from './reference-target.js';
9
+ export function resolveRefs(aes, options = {}) {
10
+ const strict = (options.mode ?? 'strict') === 'strict';
11
+ const errors = [];
12
+ const warnings = [];
13
+ const resolutionMap = {};
14
+ const cycles = [];
15
+ const pathToIndex = new Map();
16
+ for (let i = 0; i < aes.length; i++) {
17
+ const pathStr = formatPath(aes[i].path);
18
+ pathToIndex.set(pathStr, i);
19
+ }
20
+ const resolvedCache = new Map();
21
+ function addDiag(target, message, code, span, path) {
22
+ const diag = {
23
+ message,
24
+ code,
25
+ ...(span !== undefined ? { span } : {}),
26
+ ...(path !== undefined ? { path } : {}),
27
+ };
28
+ if (target === 'error')
29
+ errors.push(diag);
30
+ else
31
+ warnings.push(diag);
32
+ }
33
+ function getPathMembers(path) {
34
+ const members = [];
35
+ for (const segment of path.segments) {
36
+ if (segment.type === 'member')
37
+ members.push(segment.key);
38
+ if (segment.type === 'index')
39
+ members.push(segment.index);
40
+ }
41
+ return members;
42
+ }
43
+ function resolveValueAtSubpath(value, segments) {
44
+ if (value.type === 'TypedValue') {
45
+ return resolveValueAtSubpath(value.value, segments);
46
+ }
47
+ if (segments.length === 0)
48
+ return value;
49
+ const [head, ...rest] = segments;
50
+ if (typeof head === 'object' && head !== null && head.type === 'attr') {
51
+ return null;
52
+ }
53
+ if (value.type === 'ObjectNode' && typeof head === 'string') {
54
+ const binding = value.bindings.find((b) => b.key === head);
55
+ if (!binding)
56
+ return null;
57
+ return resolveValueAtSubpath(binding.value, rest);
58
+ }
59
+ if ((value.type === 'ListNode' || value.type === 'TupleLiteral') && typeof head === 'number') {
60
+ const element = value.elements[head];
61
+ if (!element)
62
+ return null;
63
+ return resolveValueAtSubpath(element, rest);
64
+ }
65
+ return null;
66
+ }
67
+ function resolveClone(ref, sourcePath, sourceIndex, stack) {
68
+ const targetPath = formatReferenceTargetPath(ref.path);
69
+ if (targetPath === sourcePath) {
70
+ addDiag(strict ? 'error' : 'warning', `Self reference: '${sourcePath}' references itself`, 'RESOLVE_SELF_REFERENCE', ref.span, sourcePath);
71
+ return { ...ref, type: 'CloneReference' };
72
+ }
73
+ const targetIndex = pathToIndex.get(targetPath);
74
+ if (targetIndex === undefined) {
75
+ addDiag(strict ? 'error' : 'warning', `Missing reference target: '${targetPath}'`, 'RESOLVE_MISSING_TARGET', ref.span, sourcePath);
76
+ return { ...ref, type: 'CloneReference' };
77
+ }
78
+ if (targetIndex > sourceIndex) {
79
+ addDiag(strict ? 'error' : 'warning', `Forward reference: '${sourcePath}' references '${targetPath}' defined later`, 'RESOLVE_FORWARD_REFERENCE', ref.span, sourcePath);
80
+ return { ...ref, type: 'CloneReference' };
81
+ }
82
+ if (stack.includes(targetPath)) {
83
+ cycles.push({ path: [...ref.path] });
84
+ addDiag(strict ? 'error' : 'warning', `Reference cycle detected at '${targetPath}'`, 'RESOLVE_CYCLE', ref.span, sourcePath);
85
+ return { ...ref, type: 'CloneReference' };
86
+ }
87
+ if (resolvedCache.has(targetPath)) {
88
+ resolutionMap[`${sourcePath}::${targetPath}`] = targetPath;
89
+ return resolvedCache.get(targetPath);
90
+ }
91
+ const targetEvent = aes[targetIndex];
92
+ const targetMembers = getPathMembers(targetEvent.path);
93
+ const remainder = ref.path.slice(targetMembers.length);
94
+ const targetValue = resolveValueAtSubpath(targetEvent.value, remainder);
95
+ if (!targetValue) {
96
+ addDiag(strict ? 'error' : 'warning', `Missing reference target: '${targetPath}'`, 'RESOLVE_MISSING_TARGET', ref.span, sourcePath);
97
+ return { ...ref, type: 'CloneReference' };
98
+ }
99
+ const resolved = resolveValue(targetValue, targetPath, targetIndex, [...stack, targetPath]);
100
+ resolvedCache.set(targetPath, resolved);
101
+ resolutionMap[`${sourcePath}::${targetPath}`] = targetPath;
102
+ return resolved;
103
+ }
104
+ function resolveValue(value, sourcePath, sourceIndex, stack) {
105
+ switch (value.type) {
106
+ case 'TypedValue': {
107
+ const next = resolveValue(value.value, sourcePath, sourceIndex, stack);
108
+ return next !== value.value ? { ...value, value: next } : value;
109
+ }
110
+ case 'CloneReference':
111
+ return resolveClone(value, sourcePath, sourceIndex, stack);
112
+ case 'PointerReference':
113
+ return value;
114
+ case 'ObjectNode': {
115
+ let changed = false;
116
+ const bindings = value.bindings.map((binding) => {
117
+ const next = resolveBinding(binding, sourcePath, sourceIndex, stack);
118
+ changed ||= next !== binding;
119
+ return next;
120
+ });
121
+ const attributes = value.attributes.map((attr) => {
122
+ const next = resolveAttribute(attr, sourcePath, sourceIndex, stack);
123
+ changed ||= next !== attr;
124
+ return next;
125
+ });
126
+ return changed ? { ...value, bindings, attributes } : value;
127
+ }
128
+ case 'ListNode': {
129
+ let changed = false;
130
+ const elements = value.elements.map((element) => {
131
+ const next = resolveValue(element, sourcePath, sourceIndex, stack);
132
+ changed ||= next !== element;
133
+ return next;
134
+ });
135
+ const attributes = value.attributes.map((attr) => {
136
+ const next = resolveAttribute(attr, sourcePath, sourceIndex, stack);
137
+ changed ||= next !== attr;
138
+ return next;
139
+ });
140
+ return changed ? { ...value, elements, attributes } : value;
141
+ }
142
+ case 'TupleLiteral': {
143
+ let changed = false;
144
+ const elements = value.elements.map((element) => {
145
+ const next = resolveValue(element, sourcePath, sourceIndex, stack);
146
+ changed ||= next !== element;
147
+ return next;
148
+ });
149
+ const attributes = value.attributes.map((attr) => {
150
+ const next = resolveAttribute(attr, sourcePath, sourceIndex, stack);
151
+ changed ||= next !== attr;
152
+ return next;
153
+ });
154
+ return changed ? { ...value, elements, attributes } : value;
155
+ }
156
+ case 'NodeLiteral': {
157
+ let changed = false;
158
+ const attributes = value.attributes.map((attr) => {
159
+ const next = resolveAttribute(attr, sourcePath, sourceIndex, stack);
160
+ changed ||= next !== attr;
161
+ return next;
162
+ });
163
+ const children = value.children.map((child) => {
164
+ const next = resolveValue(child, sourcePath, sourceIndex, stack);
165
+ changed ||= next !== child;
166
+ return next;
167
+ });
168
+ return changed ? { ...value, attributes, children } : value;
169
+ }
170
+ default:
171
+ return value;
172
+ }
173
+ }
174
+ function resolveBinding(binding, sourcePath, sourceIndex, stack) {
175
+ const nextValue = resolveValue(binding.value, sourcePath, sourceIndex, stack);
176
+ let changed = nextValue !== binding.value;
177
+ const attributes = binding.attributes.map((attr) => {
178
+ const next = resolveAttribute(attr, sourcePath, sourceIndex, stack);
179
+ changed ||= next !== attr;
180
+ return next;
181
+ });
182
+ return changed ? { ...binding, value: nextValue, attributes } : binding;
183
+ }
184
+ function resolveAttribute(attr, sourcePath, sourceIndex, stack) {
185
+ let changed = false;
186
+ const entries = new Map();
187
+ for (const [key, entry] of attr.entries) {
188
+ const nextValue = resolveValue(entry.value, sourcePath, sourceIndex, stack);
189
+ const nextAttributes = entry.attributes.map((nested) => {
190
+ const next = resolveAttribute(nested, sourcePath, sourceIndex, stack);
191
+ changed ||= next !== nested;
192
+ return next;
193
+ });
194
+ const nextEntry = nextValue === entry.value && nextAttributes.every((item, index) => item === entry.attributes[index])
195
+ ? entry
196
+ : { ...entry, value: nextValue, attributes: nextAttributes };
197
+ if (nextEntry !== entry)
198
+ changed = true;
199
+ entries.set(key, nextEntry);
200
+ }
201
+ return changed ? { ...attr, entries } : attr;
202
+ }
203
+ const resolvedEvents = [];
204
+ for (let i = 0; i < aes.length; i++) {
205
+ const event = aes[i];
206
+ const sourcePath = formatPath(event.path);
207
+ const nextValue = resolveValue(event.value, sourcePath, i, [sourcePath]);
208
+ const resolveAnnotationEntries = (entries) => {
209
+ const updated = new Map();
210
+ for (const [key, entry] of entries) {
211
+ const nextValueEntry = resolveValue(entry.value, sourcePath, i, [sourcePath]);
212
+ const nextAnnotationsEntry = entry.annotations
213
+ ? resolveAnnotationEntries(entry.annotations)
214
+ : entry.annotations;
215
+ const nextEntry = nextValueEntry === entry.value && nextAnnotationsEntry === entry.annotations
216
+ ? entry
217
+ : { ...entry, value: nextValueEntry, ...(nextAnnotationsEntry ? { annotations: nextAnnotationsEntry } : {}) };
218
+ updated.set(key, nextEntry);
219
+ }
220
+ return updated;
221
+ };
222
+ let annotationsChanged = false;
223
+ let nextAnnotations = event.annotations;
224
+ if (event.annotations) {
225
+ const updated = resolveAnnotationEntries(event.annotations);
226
+ annotationsChanged = updated !== event.annotations && Array.from(updated.entries()).some(([key, entry]) => event.annotations?.get(key) !== entry);
227
+ nextAnnotations = annotationsChanged ? updated : event.annotations;
228
+ }
229
+ const changed = nextValue !== event.value || annotationsChanged;
230
+ if (!changed) {
231
+ resolvedEvents.push(event);
232
+ continue;
233
+ }
234
+ const nextEvent = {
235
+ ...event,
236
+ value: nextValue,
237
+ };
238
+ if (nextAnnotations) {
239
+ nextEvent.annotations =
240
+ nextAnnotations;
241
+ }
242
+ resolvedEvents.push(nextEvent);
243
+ }
244
+ const hasErrors = errors.length > 0;
245
+ const meta = {
246
+ ...(warnings.length > 0 ? { warnings } : {}),
247
+ ...(errors.length > 0 ? { errors } : {}),
248
+ ...(Object.keys(resolutionMap).length > 0 ? { resolutionMap } : {}),
249
+ ...(cycles.length > 0 ? { cycles } : {}),
250
+ };
251
+ const hasMeta = Object.keys(meta).length > 0;
252
+ if (strict && hasErrors) {
253
+ return hasMeta ? { aes: [], meta } : { aes: [] };
254
+ }
255
+ return hasMeta ? { aes: resolvedEvents, meta } : { aes: resolvedEvents };
256
+ }
257
+ //# sourceMappingURL=resolve.js.map