@altopelago/aeos-core 0.11.0 → 0.12.1
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/README.md +9 -0
- package/dist/bin/aeos-validator.d.ts +1 -1
- package/dist/bin/aeos-validator.js +9 -5
- package/dist/bin/aeos-validator.js.map +1 -1
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/rules/numericForm.d.ts.map +1 -1
- package/dist/rules/numericForm.js +1 -9
- package/dist/rules/numericForm.js.map +1 -1
- package/dist/rules/stringForm.js +1 -1
- package/dist/rules/stringForm.js.map +1 -1
- package/dist/rules/typeCheck.d.ts +1 -0
- package/dist/rules/typeCheck.d.ts.map +1 -1
- package/dist/rules/typeCheck.js +6 -2
- package/dist/rules/typeCheck.js.map +1 -1
- package/dist/schema-codec.d.ts.map +1 -1
- package/dist/schema-codec.js +142 -8
- package/dist/schema-codec.js.map +1 -1
- package/dist/schema-tools.d.ts +90 -0
- package/dist/schema-tools.d.ts.map +1 -0
- package/dist/schema-tools.js +465 -0
- package/dist/schema-tools.js.map +1 -0
- package/dist/telex.d.ts +14 -0
- package/dist/telex.d.ts.map +1 -0
- package/dist/telex.js +33 -0
- package/dist/telex.js.map +1 -0
- package/dist/types/aes.d.ts +9 -3
- package/dist/types/aes.d.ts.map +1 -1
- package/dist/types/schema.d.ts +22 -1
- package/dist/types/schema.d.ts.map +1 -1
- package/dist/types/schema.js.map +1 -1
- package/dist/util/datatypes.d.ts +13 -0
- package/dist/util/datatypes.d.ts.map +1 -0
- package/dist/util/datatypes.js +50 -0
- package/dist/util/datatypes.js.map +1 -0
- package/dist/validate.d.ts.map +1 -1
- package/dist/validate.js +207 -42
- package/dist/validate.js.map +1 -1
- package/package.json +6 -6
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tooling primitives for deriving editable schema candidates and reviewing
|
|
3
|
+
* changes between schema versions. These functions do not admit migrations.
|
|
4
|
+
*/
|
|
5
|
+
import { type CompileOptions } from '@altopelago/aeon-core';
|
|
6
|
+
import type { AssignmentEvent } from './types/aes.js';
|
|
7
|
+
import type { SchemaRule, SchemaV1 } from './types/schema.js';
|
|
8
|
+
type JsonValue = null | boolean | number | string | readonly JsonValue[] | {
|
|
9
|
+
readonly [key: string]: JsonValue;
|
|
10
|
+
};
|
|
11
|
+
export interface InferSchemaOptions {
|
|
12
|
+
/** Generated candidates are open-world unless the caller explicitly closes them. */
|
|
13
|
+
readonly world?: 'open' | 'closed';
|
|
14
|
+
readonly compileOptions?: CompileOptions;
|
|
15
|
+
readonly maxInputBytes?: number;
|
|
16
|
+
readonly maxEvents?: number;
|
|
17
|
+
}
|
|
18
|
+
export interface InferredSchemaCandidate {
|
|
19
|
+
readonly schema: SchemaV1;
|
|
20
|
+
readonly source: string;
|
|
21
|
+
readonly observedEventCount: number;
|
|
22
|
+
readonly assumptions: readonly string[];
|
|
23
|
+
}
|
|
24
|
+
export declare class SchemaInferenceError extends Error {
|
|
25
|
+
readonly diagnostics: readonly string[];
|
|
26
|
+
constructor(message: string, diagnostics?: readonly string[]);
|
|
27
|
+
}
|
|
28
|
+
export type SchemaDiffChange = {
|
|
29
|
+
readonly kind: 'setting-changed';
|
|
30
|
+
readonly setting: string;
|
|
31
|
+
readonly before?: JsonValue;
|
|
32
|
+
readonly after?: JsonValue;
|
|
33
|
+
} | {
|
|
34
|
+
readonly kind: 'rule-added';
|
|
35
|
+
readonly rule: SchemaRule;
|
|
36
|
+
} | {
|
|
37
|
+
readonly kind: 'rule-removed';
|
|
38
|
+
readonly rule: SchemaRule;
|
|
39
|
+
} | {
|
|
40
|
+
readonly kind: 'rule-relocated';
|
|
41
|
+
readonly identity: string;
|
|
42
|
+
readonly before: SchemaRule;
|
|
43
|
+
readonly after: SchemaRule;
|
|
44
|
+
readonly constraintPaths: readonly string[];
|
|
45
|
+
readonly evidence: 'shared-declaration-id';
|
|
46
|
+
} | {
|
|
47
|
+
readonly kind: 'rule-changed';
|
|
48
|
+
readonly identity: string;
|
|
49
|
+
readonly before: SchemaRule;
|
|
50
|
+
readonly after: SchemaRule;
|
|
51
|
+
readonly constraintPaths: readonly string[];
|
|
52
|
+
readonly metadataPaths?: readonly string[];
|
|
53
|
+
};
|
|
54
|
+
export interface PossibleRuleMove {
|
|
55
|
+
readonly from: string;
|
|
56
|
+
readonly to: string;
|
|
57
|
+
readonly reason: 'shared-lineage-id' | 'identical-constraints';
|
|
58
|
+
}
|
|
59
|
+
export interface SchemaDiff {
|
|
60
|
+
readonly equal: boolean;
|
|
61
|
+
readonly changes: readonly SchemaDiffChange[];
|
|
62
|
+
/** These are review hints, not inferred migration instructions. */
|
|
63
|
+
readonly possibleRuleMoves: readonly PossibleRuleMove[];
|
|
64
|
+
}
|
|
65
|
+
export interface SchemaEvolutionDiagnostic {
|
|
66
|
+
readonly changeId: string;
|
|
67
|
+
readonly code: 'SOURCE_DECLARATION_MISSING' | 'TEMPORAL_KIND_MISMATCH';
|
|
68
|
+
readonly message: string;
|
|
69
|
+
}
|
|
70
|
+
export interface SchemaAeonProjection {
|
|
71
|
+
/** Illustrative AEON instance shape. It is not schema authority or validation evidence. */
|
|
72
|
+
readonly source: string;
|
|
73
|
+
readonly assumptions: readonly string[];
|
|
74
|
+
readonly omittedRules: readonly string[];
|
|
75
|
+
}
|
|
76
|
+
export declare function inferSchemaFromAeon(source: string, options?: InferSchemaOptions): InferredSchemaCandidate;
|
|
77
|
+
/**
|
|
78
|
+
* Projects a schema into one inspectable AEON instance shape. The schema remains
|
|
79
|
+
* authoritative; this deliberately cannot represent every valid value.
|
|
80
|
+
*/
|
|
81
|
+
export declare function projectSchemaToAeon(schema: SchemaV1): SchemaAeonProjection;
|
|
82
|
+
export declare function projectSchemaSourceToAeon(source: string): SchemaAeonProjection;
|
|
83
|
+
export declare function inferSchemaFromEvents(events: readonly AssignmentEvent[], options?: Pick<InferSchemaOptions, 'world'>): InferredSchemaCandidate;
|
|
84
|
+
export declare function diffSchemaSources(source: string, target: string): SchemaDiff;
|
|
85
|
+
/** Validate authored temporal intent against the two schema states it relates. */
|
|
86
|
+
export declare function validateSchemaEvolution(source: SchemaV1, target: SchemaV1): readonly SchemaEvolutionDiagnostic[];
|
|
87
|
+
export declare function validateSchemaEvolutionSources(source: string, target: string): readonly SchemaEvolutionDiagnostic[];
|
|
88
|
+
export declare function diffSchemas(source: SchemaV1, target: SchemaV1): SchemaDiff;
|
|
89
|
+
export {};
|
|
90
|
+
//# sourceMappingURL=schema-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-tools.d.ts","sourceRoot":"","sources":["../src/schema-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,465 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tooling primitives for deriving editable schema candidates and reviewing
|
|
3
|
+
* changes between schema versions. These functions do not admit migrations.
|
|
4
|
+
*/
|
|
5
|
+
import { compile } from '@altopelago/aeon-core';
|
|
6
|
+
import { parseAddress } from '@altopelago/sansa';
|
|
7
|
+
import { normalizeSchemaObject, parseSchemaSource, schemaToAeon } from './schema-codec.js';
|
|
8
|
+
export class SchemaInferenceError extends Error {
|
|
9
|
+
diagnostics;
|
|
10
|
+
constructor(message, diagnostics = []) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.name = 'SchemaInferenceError';
|
|
13
|
+
this.diagnostics = diagnostics;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
const INFERENCE_ASSUMPTIONS = Object.freeze([
|
|
17
|
+
'Only bindings observed in this bootstrap document are represented.',
|
|
18
|
+
'Observed bindings are marked required; optionality must be reviewed by the author.',
|
|
19
|
+
'Collection indexes remain exact paths; selectors and reusable shapes must be authored deliberately.',
|
|
20
|
+
'Value types and datatype labels are copied, but bounds, patterns, unions, and business rules are not inferred.',
|
|
21
|
+
]);
|
|
22
|
+
export function inferSchemaFromAeon(source, options = {}) {
|
|
23
|
+
const maxInputBytes = options.maxInputBytes ?? options.compileOptions?.maxInputBytes;
|
|
24
|
+
const maxEvents = options.maxEvents ?? options.compileOptions?.maxEvents;
|
|
25
|
+
const compiled = compile(source, {
|
|
26
|
+
...options.compileOptions,
|
|
27
|
+
recovery: false,
|
|
28
|
+
datatypePolicy: options.compileOptions?.datatypePolicy ?? 'allow_custom',
|
|
29
|
+
...(maxInputBytes === undefined ? {} : { maxInputBytes }),
|
|
30
|
+
...(maxEvents === undefined ? {} : { maxEvents }),
|
|
31
|
+
});
|
|
32
|
+
if (compiled.errors.length > 0) {
|
|
33
|
+
const diagnostics = compiled.errors.map(formatDiagnostic);
|
|
34
|
+
throw new SchemaInferenceError(`Bootstrap AEON did not compile: ${diagnostics.join('; ')}`, diagnostics);
|
|
35
|
+
}
|
|
36
|
+
return inferSchemaFromEvents(compiled.events, options.world === undefined ? {} : { world: options.world });
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Projects a schema into one inspectable AEON instance shape. The schema remains
|
|
40
|
+
* authoritative; this deliberately cannot represent every valid value.
|
|
41
|
+
*/
|
|
42
|
+
export function projectSchemaToAeon(schema) {
|
|
43
|
+
const root = projectionNode();
|
|
44
|
+
const omittedRules = [];
|
|
45
|
+
let includesOptional = false;
|
|
46
|
+
let expandsSelector = false;
|
|
47
|
+
const orderedRules = [...schema.rules].sort((left, right) => Number(left.selector !== undefined) - Number(right.selector !== undefined));
|
|
48
|
+
for (const rule of orderedRules) {
|
|
49
|
+
const address = parseAddress(rule.path ?? rule.selector);
|
|
50
|
+
if (!address.ok || address.address.root.kind !== 'absolute') {
|
|
51
|
+
omittedRules.push(ruleAddress(rule));
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
let current = root;
|
|
55
|
+
let supported = true;
|
|
56
|
+
for (const selector of address.address.selectors) {
|
|
57
|
+
if (selector.type === 'member') {
|
|
58
|
+
current = childMember(current, selector.name);
|
|
59
|
+
}
|
|
60
|
+
else if (selector.type === 'position') {
|
|
61
|
+
current = childPosition(current, selector.index);
|
|
62
|
+
}
|
|
63
|
+
else if (selector.type === 'directExpansion') {
|
|
64
|
+
expandsSelector = true;
|
|
65
|
+
current = projectionContainerKind(current) === 'sequence'
|
|
66
|
+
? childPosition(current, 0)
|
|
67
|
+
: childMember(current, 'example');
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
supported = false;
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (!supported) {
|
|
75
|
+
omittedRules.push(ruleAddress(rule));
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
current.rule = rule;
|
|
79
|
+
if (rule.constraints.required !== true)
|
|
80
|
+
includesOptional = true;
|
|
81
|
+
}
|
|
82
|
+
const assumptions = [
|
|
83
|
+
'Placeholder values illustrate representation shape; they are not guaranteed to satisfy business patterns or ranges.',
|
|
84
|
+
...(includesOptional ? ['Optional declarations are included to make the available shape visible.'] : []),
|
|
85
|
+
...(expandsSelector ? ["Each direct wildcard selector is represented by one member or item named 'example'."] : []),
|
|
86
|
+
...(omittedRules.length > 0 ? ['Rules using filters, ranges, parent traversal, or other non-structural selectors are omitted.'] : []),
|
|
87
|
+
];
|
|
88
|
+
return {
|
|
89
|
+
source: `${renderProjectionRoot(root)}\n`,
|
|
90
|
+
assumptions,
|
|
91
|
+
omittedRules,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
export function projectSchemaSourceToAeon(source) {
|
|
95
|
+
return projectSchemaToAeon(parseSchemaSource(source));
|
|
96
|
+
}
|
|
97
|
+
function projectionNode() {
|
|
98
|
+
return { members: new Map(), positions: new Map() };
|
|
99
|
+
}
|
|
100
|
+
function childMember(parent, name) {
|
|
101
|
+
const existing = parent.members.get(name);
|
|
102
|
+
if (existing !== undefined)
|
|
103
|
+
return existing;
|
|
104
|
+
const child = projectionNode();
|
|
105
|
+
parent.members.set(name, child);
|
|
106
|
+
return child;
|
|
107
|
+
}
|
|
108
|
+
function childPosition(parent, index) {
|
|
109
|
+
const existing = parent.positions.get(index);
|
|
110
|
+
if (existing !== undefined)
|
|
111
|
+
return existing;
|
|
112
|
+
const child = projectionNode();
|
|
113
|
+
parent.positions.set(index, child);
|
|
114
|
+
return child;
|
|
115
|
+
}
|
|
116
|
+
function projectionContainerKind(node) {
|
|
117
|
+
const type = node.rule?.constraints.type;
|
|
118
|
+
return type === 'ListNode' || type === 'ListLiteral' || type === 'TupleLiteral'
|
|
119
|
+
|| node.rule?.constraints.type_is === 'list' || node.rule?.constraints.type_is === 'tuple'
|
|
120
|
+
? 'sequence'
|
|
121
|
+
: 'object';
|
|
122
|
+
}
|
|
123
|
+
function renderProjectionRoot(root) {
|
|
124
|
+
return [...root.members.entries()].map(([name, node]) => renderProjectionBinding(name, node, 0)).join('\n');
|
|
125
|
+
}
|
|
126
|
+
function renderProjectionBinding(name, node, indent) {
|
|
127
|
+
const pad = ' '.repeat(indent);
|
|
128
|
+
return `${pad}${renderProjectionKey(name)}:${projectionDatatype(node)} = ${renderProjectionValue(node, indent)}`;
|
|
129
|
+
}
|
|
130
|
+
function renderProjectionValue(node, indent) {
|
|
131
|
+
const type = node.rule?.constraints.type;
|
|
132
|
+
if (node.positions.size > 0 || type === 'ListNode' || type === 'ListLiteral' || type === 'TupleLiteral') {
|
|
133
|
+
const tuple = type === 'TupleLiteral' || node.rule?.constraints.type_is === 'tuple';
|
|
134
|
+
const open = tuple ? '(' : '[';
|
|
135
|
+
const close = tuple ? ')' : ']';
|
|
136
|
+
const maximum = Math.max(-1, ...node.positions.keys());
|
|
137
|
+
if (maximum < 0)
|
|
138
|
+
return `${open}${close}`;
|
|
139
|
+
const items = Array.from({ length: maximum + 1 }, (_, index) => {
|
|
140
|
+
const item = node.positions.get(index);
|
|
141
|
+
return `${' '.repeat(indent + 1)}${item === undefined ? '!notSet' : renderProjectionValue(item, indent + 1)}`;
|
|
142
|
+
});
|
|
143
|
+
return `${open}\n${items.join('\n')}\n${' '.repeat(indent)}${close}`;
|
|
144
|
+
}
|
|
145
|
+
if (node.members.size > 0 || type === 'ObjectNode') {
|
|
146
|
+
if (node.members.size === 0)
|
|
147
|
+
return '{}';
|
|
148
|
+
const entries = [...node.members.entries()].map(([name, child]) => renderProjectionBinding(name, child, indent + 1));
|
|
149
|
+
return `{\n${entries.join('\n')}\n${' '.repeat(indent)}}`;
|
|
150
|
+
}
|
|
151
|
+
return projectionLiteral(node.rule?.constraints);
|
|
152
|
+
}
|
|
153
|
+
function projectionDatatype(node) {
|
|
154
|
+
if (node.rule?.constraints.datatype !== undefined)
|
|
155
|
+
return node.rule.constraints.datatype;
|
|
156
|
+
const type = node.rule?.constraints.type;
|
|
157
|
+
if (type === 'ObjectNode' || node.members.size > 0)
|
|
158
|
+
return 'object';
|
|
159
|
+
if (type === 'TupleLiteral')
|
|
160
|
+
return 'tuple';
|
|
161
|
+
if (type === 'ListNode' || type === 'ListLiteral' || node.positions.size > 0)
|
|
162
|
+
return 'list';
|
|
163
|
+
return {
|
|
164
|
+
StringLiteral: 'string', NumberLiteral: 'number', BooleanLiteral: 'boolean', ToggleLiteral: 'toggle',
|
|
165
|
+
NullLiteral: 'null', SansaAddressLiteral: 'sansa',
|
|
166
|
+
}[type ?? ''] ?? 'value';
|
|
167
|
+
}
|
|
168
|
+
function projectionLiteral(constraints) {
|
|
169
|
+
const effective = constraints?.any_of?.[0] === undefined ? constraints : { ...constraints, ...constraints.any_of[0], any_of: undefined };
|
|
170
|
+
switch (effective?.type) {
|
|
171
|
+
case 'StringLiteral': {
|
|
172
|
+
const minimum = Math.max(0, effective.min_length ?? 0);
|
|
173
|
+
const maximum = Math.max(minimum, effective.max_length ?? Math.max(7, minimum));
|
|
174
|
+
const length = Math.max(minimum, Math.min(7, maximum));
|
|
175
|
+
return JSON.stringify('example'.slice(0, length).padEnd(length, 'x'));
|
|
176
|
+
}
|
|
177
|
+
case 'NumberLiteral': return effective.min_value ?? '0';
|
|
178
|
+
case 'BooleanLiteral': return 'true';
|
|
179
|
+
case 'ToggleLiteral': return effective.toggle_pair === 'on_off' ? 'on' : 'yes';
|
|
180
|
+
case 'NullLiteral': return `!${effective.null_value ?? effective.null_values?.[0] ?? 'notSet'}`;
|
|
181
|
+
case 'SansaAddressLiteral': return '$';
|
|
182
|
+
case 'InfinityLiteral': return 'Infinity';
|
|
183
|
+
case 'NaNLiteral': return 'NaN';
|
|
184
|
+
case 'HexLiteral': return '#0';
|
|
185
|
+
default: return '!notSet';
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
function renderProjectionKey(key) {
|
|
189
|
+
return /^[A-Za-z_][A-Za-z0-9_]*$/.test(key) ? key : JSON.stringify(key);
|
|
190
|
+
}
|
|
191
|
+
export function inferSchemaFromEvents(events, options = {}) {
|
|
192
|
+
const rules = [];
|
|
193
|
+
const seen = new Set();
|
|
194
|
+
for (const event of events) {
|
|
195
|
+
const path = formatEventPath(event.path);
|
|
196
|
+
if (path === '$' || isHeaderPath(path) || seen.has(path))
|
|
197
|
+
continue;
|
|
198
|
+
seen.add(path);
|
|
199
|
+
const declarationId = generatedRuleIdentity(path);
|
|
200
|
+
rules.push({
|
|
201
|
+
declaration_id: declarationId,
|
|
202
|
+
lineage_id: declarationId,
|
|
203
|
+
path,
|
|
204
|
+
constraints: constraintsFromShape(event),
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
const schema = normalizeSchemaObject({ world: options.world ?? 'open', rules });
|
|
208
|
+
return {
|
|
209
|
+
schema,
|
|
210
|
+
source: schemaToAeon(schema),
|
|
211
|
+
observedEventCount: events.length,
|
|
212
|
+
assumptions: INFERENCE_ASSUMPTIONS,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
export function diffSchemaSources(source, target) {
|
|
216
|
+
return diffSchemas(parseSchemaSource(source), parseSchemaSource(target));
|
|
217
|
+
}
|
|
218
|
+
/** Validate authored temporal intent against the two schema states it relates. */
|
|
219
|
+
export function validateSchemaEvolution(source, target) {
|
|
220
|
+
const before = normalizeSchemaObject(source);
|
|
221
|
+
const after = normalizeSchemaObject(target);
|
|
222
|
+
const beforeById = declarationsById(before.rules);
|
|
223
|
+
const afterById = declarationsById(after.rules);
|
|
224
|
+
const diagnostics = [];
|
|
225
|
+
for (const change of after.evolution ?? []) {
|
|
226
|
+
const missing = change.from_declarations.filter((id) => !beforeById.has(id));
|
|
227
|
+
if (missing.length > 0) {
|
|
228
|
+
diagnostics.push({
|
|
229
|
+
changeId: change.change_id,
|
|
230
|
+
code: 'SOURCE_DECLARATION_MISSING',
|
|
231
|
+
message: `Source declaration${missing.length === 1 ? '' : 's'} ${missing.join(', ')} do not exist in the source schema.`,
|
|
232
|
+
});
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
if (!evolutionMatchesStates(change, beforeById, afterById)) {
|
|
236
|
+
diagnostics.push({
|
|
237
|
+
changeId: change.change_id,
|
|
238
|
+
code: 'TEMPORAL_KIND_MISMATCH',
|
|
239
|
+
message: `The declared '${change.kind}' intent does not match the source and target schema states.`,
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
return diagnostics;
|
|
244
|
+
}
|
|
245
|
+
export function validateSchemaEvolutionSources(source, target) {
|
|
246
|
+
return validateSchemaEvolution(parseSchemaSource(source), parseSchemaSource(target));
|
|
247
|
+
}
|
|
248
|
+
export function diffSchemas(source, target) {
|
|
249
|
+
const before = normalizeSchemaObject(source);
|
|
250
|
+
const after = normalizeSchemaObject(target);
|
|
251
|
+
const changes = [];
|
|
252
|
+
compareSetting(changes, 'world', before.world, after.world);
|
|
253
|
+
compareSetting(changes, 'reference_policy', before.reference_policy, after.reference_policy);
|
|
254
|
+
compareSetting(changes, 'attribute_policy', before.attribute_policy, after.attribute_policy);
|
|
255
|
+
compareSetting(changes, 'datatype_rules', before.datatype_rules, after.datatype_rules);
|
|
256
|
+
compareSetting(changes, 'resource_policy', before.resource_policy, after.resource_policy);
|
|
257
|
+
const afterByDeclaration = new Map(after.rules
|
|
258
|
+
.filter((rule) => rule.declaration_id !== undefined)
|
|
259
|
+
.map((rule) => [rule.declaration_id, rule]));
|
|
260
|
+
const afterByAddress = new Map(after.rules.map((rule) => [ruleIdentity(rule), rule]));
|
|
261
|
+
const matchedAfter = new Set();
|
|
262
|
+
const removed = [];
|
|
263
|
+
const added = [];
|
|
264
|
+
for (const rule of before.rules) {
|
|
265
|
+
const declarationMatch = rule.declaration_id === undefined ? undefined : afterByDeclaration.get(rule.declaration_id);
|
|
266
|
+
const addressMatch = afterByAddress.get(ruleIdentity(rule));
|
|
267
|
+
const compatibleAddressMatch = addressMatch !== undefined
|
|
268
|
+
&& (rule.declaration_id === undefined
|
|
269
|
+
|| addressMatch.declaration_id === undefined
|
|
270
|
+
|| rule.declaration_id === addressMatch.declaration_id)
|
|
271
|
+
? addressMatch
|
|
272
|
+
: undefined;
|
|
273
|
+
const next = declarationMatch !== undefined && !matchedAfter.has(declarationMatch)
|
|
274
|
+
? declarationMatch
|
|
275
|
+
: compatibleAddressMatch !== undefined && !matchedAfter.has(compatibleAddressMatch)
|
|
276
|
+
? compatibleAddressMatch
|
|
277
|
+
: undefined;
|
|
278
|
+
if (!next) {
|
|
279
|
+
removed.push(rule);
|
|
280
|
+
changes.push({ kind: 'rule-removed', rule });
|
|
281
|
+
continue;
|
|
282
|
+
}
|
|
283
|
+
matchedAfter.add(next);
|
|
284
|
+
const identity = rule.declaration_id !== undefined && rule.declaration_id === next.declaration_id
|
|
285
|
+
? `declaration:${rule.declaration_id}`
|
|
286
|
+
: ruleIdentity(rule);
|
|
287
|
+
if (ruleIdentity(rule) !== ruleIdentity(next)) {
|
|
288
|
+
changes.push({
|
|
289
|
+
kind: 'rule-relocated',
|
|
290
|
+
identity,
|
|
291
|
+
before: rule,
|
|
292
|
+
after: next,
|
|
293
|
+
constraintPaths: changedPaths(rule.constraints, next.constraints),
|
|
294
|
+
evidence: 'shared-declaration-id',
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
else if (!jsonEqual(rule.constraints, next.constraints)
|
|
298
|
+
|| rule.declaration_id !== next.declaration_id
|
|
299
|
+
|| rule.lineage_id !== next.lineage_id) {
|
|
300
|
+
const metadataPaths = [
|
|
301
|
+
...(rule.declaration_id === next.declaration_id ? [] : ['declaration_id']),
|
|
302
|
+
...(rule.lineage_id === next.lineage_id ? [] : ['lineage_id']),
|
|
303
|
+
];
|
|
304
|
+
changes.push({
|
|
305
|
+
kind: 'rule-changed',
|
|
306
|
+
identity,
|
|
307
|
+
before: rule,
|
|
308
|
+
after: next,
|
|
309
|
+
constraintPaths: changedPaths(rule.constraints, next.constraints),
|
|
310
|
+
...(metadataPaths.length === 0 ? {} : { metadataPaths }),
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
for (const rule of after.rules) {
|
|
315
|
+
if (!matchedAfter.has(rule)) {
|
|
316
|
+
added.push(rule);
|
|
317
|
+
changes.push({ kind: 'rule-added', rule });
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
const possibleRuleMoves = [];
|
|
321
|
+
for (const oldRule of removed) {
|
|
322
|
+
const lineageMatches = oldRule.lineage_id === undefined
|
|
323
|
+
? []
|
|
324
|
+
: added.filter((newRule) => newRule.lineage_id === oldRule.lineage_id);
|
|
325
|
+
const uniqueLineage = lineageMatches.length === 1
|
|
326
|
+
&& removed.filter((candidate) => candidate.lineage_id === oldRule.lineage_id).length === 1;
|
|
327
|
+
const constraintMatches = added.filter((newRule) => jsonEqual(oldRule.constraints, newRule.constraints));
|
|
328
|
+
const uniqueConstraints = constraintMatches.length === 1
|
|
329
|
+
&& removed.filter((candidate) => jsonEqual(candidate.constraints, constraintMatches[0].constraints)).length === 1;
|
|
330
|
+
const matches = uniqueLineage ? lineageMatches : uniqueConstraints ? constraintMatches : [];
|
|
331
|
+
if (matches.length === 1) {
|
|
332
|
+
possibleRuleMoves.push({
|
|
333
|
+
from: ruleIdentity(oldRule),
|
|
334
|
+
to: ruleIdentity(matches[0]),
|
|
335
|
+
reason: uniqueLineage ? 'shared-lineage-id' : 'identical-constraints',
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
return { equal: changes.length === 0, changes, possibleRuleMoves };
|
|
340
|
+
}
|
|
341
|
+
function constraintsFromShape(entry) {
|
|
342
|
+
const constraints = {
|
|
343
|
+
required: true,
|
|
344
|
+
type: entry.value.type,
|
|
345
|
+
};
|
|
346
|
+
if (entry.datatype)
|
|
347
|
+
constraints.datatype = entry.datatype;
|
|
348
|
+
if (entry.annotations && entry.annotations.size > 0) {
|
|
349
|
+
const attributes = {};
|
|
350
|
+
for (const [key, attribute] of entry.annotations) {
|
|
351
|
+
attributes[key] = constraintsFromShape(attribute);
|
|
352
|
+
}
|
|
353
|
+
constraints.attributes = attributes;
|
|
354
|
+
}
|
|
355
|
+
return constraints;
|
|
356
|
+
}
|
|
357
|
+
function declarationsById(rules) {
|
|
358
|
+
return new Map(rules.flatMap((rule) => rule.declaration_id === undefined ? [] : [[rule.declaration_id, rule]]));
|
|
359
|
+
}
|
|
360
|
+
function evolutionMatchesStates(change, before, after) {
|
|
361
|
+
const from = change.from_declarations.map((id) => before.get(id));
|
|
362
|
+
const to = change.to_declarations.map((id) => after.get(id));
|
|
363
|
+
if (change.kind === 'add')
|
|
364
|
+
return !before.has(change.to_declarations[0]) && to.length === 1;
|
|
365
|
+
if (change.kind === 'remove')
|
|
366
|
+
return !after.has(change.from_declarations[0]) && from.length === 1;
|
|
367
|
+
if (['split', 'merge', 'derive', 'replace'].includes(change.kind))
|
|
368
|
+
return true;
|
|
369
|
+
if (from.length !== 1 || to.length !== 1)
|
|
370
|
+
return false;
|
|
371
|
+
const sourceAddress = ruleAddress(from[0]);
|
|
372
|
+
const targetAddress = ruleAddress(to[0]);
|
|
373
|
+
if (change.kind === 'rename')
|
|
374
|
+
return sameParent(sourceAddress, targetAddress) && sourceAddress !== targetAddress;
|
|
375
|
+
if (change.kind === 'move')
|
|
376
|
+
return !sameParent(sourceAddress, targetAddress);
|
|
377
|
+
if (change.kind === 'constraint-change') {
|
|
378
|
+
return sourceAddress === targetAddress && !jsonEqual(from[0].constraints, to[0].constraints);
|
|
379
|
+
}
|
|
380
|
+
if (change.kind === 'datatype-change') {
|
|
381
|
+
return sourceAddress === targetAddress
|
|
382
|
+
&& from[0].constraints.datatype !== to[0].constraints.datatype;
|
|
383
|
+
}
|
|
384
|
+
return false;
|
|
385
|
+
}
|
|
386
|
+
function ruleAddress(rule) {
|
|
387
|
+
return rule.path ?? rule.selector;
|
|
388
|
+
}
|
|
389
|
+
function sameParent(left, right) {
|
|
390
|
+
const leftAddress = parseAddress(left);
|
|
391
|
+
const rightAddress = parseAddress(right);
|
|
392
|
+
if (!leftAddress.ok || !rightAddress.ok)
|
|
393
|
+
return false;
|
|
394
|
+
return jsonEqual(leftAddress.address.root, rightAddress.address.root)
|
|
395
|
+
&& jsonEqual(leftAddress.address.selectors.slice(0, -1), rightAddress.address.selectors.slice(0, -1));
|
|
396
|
+
}
|
|
397
|
+
function formatEventPath(path) {
|
|
398
|
+
let result = '';
|
|
399
|
+
for (const segment of path.segments) {
|
|
400
|
+
if (segment.type === 'root')
|
|
401
|
+
result = '$';
|
|
402
|
+
if (segment.type === 'member') {
|
|
403
|
+
result += /^[A-Za-z_][A-Za-z0-9_]*$/.test(segment.key)
|
|
404
|
+
? `.${segment.key}`
|
|
405
|
+
: `.[${JSON.stringify(segment.key)}]`;
|
|
406
|
+
}
|
|
407
|
+
if (segment.type === 'index')
|
|
408
|
+
result += `[${segment.index}]`;
|
|
409
|
+
}
|
|
410
|
+
return result || '$';
|
|
411
|
+
}
|
|
412
|
+
function isHeaderPath(path) {
|
|
413
|
+
return path.startsWith('$.[') && path.includes('"aeon:');
|
|
414
|
+
}
|
|
415
|
+
function formatDiagnostic(error) {
|
|
416
|
+
if (error instanceof Error)
|
|
417
|
+
return error.message;
|
|
418
|
+
return String(error);
|
|
419
|
+
}
|
|
420
|
+
function ruleIdentity(rule) {
|
|
421
|
+
return rule.path !== undefined ? `path:${rule.path}` : `selector:${rule.selector}`;
|
|
422
|
+
}
|
|
423
|
+
function generatedRuleIdentity(path) {
|
|
424
|
+
return `rule:path:${encodeURIComponent(path)}`;
|
|
425
|
+
}
|
|
426
|
+
function compareSetting(changes, setting, before, after) {
|
|
427
|
+
if (!jsonEqual(before, after)) {
|
|
428
|
+
changes.push({
|
|
429
|
+
kind: 'setting-changed',
|
|
430
|
+
setting,
|
|
431
|
+
...(before !== undefined ? { before: before } : {}),
|
|
432
|
+
...(after !== undefined ? { after: after } : {}),
|
|
433
|
+
});
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
function jsonEqual(left, right) {
|
|
437
|
+
return stableJson(left) === stableJson(right);
|
|
438
|
+
}
|
|
439
|
+
function stableJson(value) {
|
|
440
|
+
if (value === undefined)
|
|
441
|
+
return 'undefined';
|
|
442
|
+
if (value === null || typeof value !== 'object')
|
|
443
|
+
return JSON.stringify(value);
|
|
444
|
+
if (Array.isArray(value))
|
|
445
|
+
return `[${value.map(stableJson).join(',')}]`;
|
|
446
|
+
return `{${Object.keys(value)
|
|
447
|
+
.sort()
|
|
448
|
+
.map((key) => `${JSON.stringify(key)}:${stableJson(value[key])}`)
|
|
449
|
+
.join(',')}}`;
|
|
450
|
+
}
|
|
451
|
+
function changedPaths(before, after, prefix = 'constraints') {
|
|
452
|
+
if (jsonEqual(before, after))
|
|
453
|
+
return [];
|
|
454
|
+
if (!isRecord(before) || !isRecord(after))
|
|
455
|
+
return [prefix];
|
|
456
|
+
const paths = [];
|
|
457
|
+
for (const key of new Set([...Object.keys(before), ...Object.keys(after)])) {
|
|
458
|
+
paths.push(...changedPaths(before[key], after[key], `${prefix}.${key}`));
|
|
459
|
+
}
|
|
460
|
+
return paths;
|
|
461
|
+
}
|
|
462
|
+
function isRecord(value) {
|
|
463
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
464
|
+
}
|
|
465
|
+
//# sourceMappingURL=schema-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-tools.js","sourceRoot":"","sources":["../src/schema-tools.ts"],"names":[],"mappings":"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"}
|
package/dist/telex.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type TelexLimitOptions } from '@altopelago/aeon-aes';
|
|
2
|
+
import { type ResultEnvelope } from './types/envelope.js';
|
|
3
|
+
import type { SchemaV1 } from './types/schema.js';
|
|
4
|
+
import { type ValidateOptions } from './validate.js';
|
|
5
|
+
export interface ValidateTelexOptions extends ValidateOptions, TelexLimitOptions {
|
|
6
|
+
readonly registeredFields?: readonly string[];
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Decode and validate a Telex stream before applying an AEOS schema to its
|
|
10
|
+
* body records. Header-plane records are transport metadata and are not schema
|
|
11
|
+
* bindings.
|
|
12
|
+
*/
|
|
13
|
+
export declare function validateTelex(input: string, schema: SchemaV1, options?: ValidateTelexOptions): ResultEnvelope;
|
|
14
|
+
//# sourceMappingURL=telex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telex.d.ts","sourceRoot":"","sources":["../src/telex.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,KAAK,iBAAiB,EAEzB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAyB,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,OAAO,EAAY,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAE/D,MAAM,WAAW,oBAAqB,SAAQ,eAAe,EAAE,iBAAiB;IAC5E,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACjD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CACzB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,QAAQ,EAChB,OAAO,GAAE,oBAAyB,GACnC,cAAc,CAkChB"}
|
package/dist/telex.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { parseTelex, validateTelexRecords, } from '@altopelago/aeon-aes';
|
|
2
|
+
import { createDiag } from './diag/emit.js';
|
|
3
|
+
import { createFailingEnvelope } from './types/envelope.js';
|
|
4
|
+
import { validate } from './validate.js';
|
|
5
|
+
/**
|
|
6
|
+
* Decode and validate a Telex stream before applying an AEOS schema to its
|
|
7
|
+
* body records. Header-plane records are transport metadata and are not schema
|
|
8
|
+
* bindings.
|
|
9
|
+
*/
|
|
10
|
+
export function validateTelex(input, schema, options = {}) {
|
|
11
|
+
let parsed;
|
|
12
|
+
try {
|
|
13
|
+
parsed = parseTelex(input, options);
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
const syntax = error;
|
|
17
|
+
return createFailingEnvelope([
|
|
18
|
+
createDiag('$', null, syntax.message, syntax.code ?? 'TELEX_SYNTAX_ERROR'),
|
|
19
|
+
]);
|
|
20
|
+
}
|
|
21
|
+
const portable = validateTelexRecords(parsed.records, {
|
|
22
|
+
...options,
|
|
23
|
+
profile: parsed.profile,
|
|
24
|
+
projection: parsed.projection,
|
|
25
|
+
});
|
|
26
|
+
if (!portable.valid) {
|
|
27
|
+
return createFailingEnvelope(portable.diagnostics.map((diagnostic) => createDiag(diagnostic.path ?? '$', null, diagnostic.message, diagnostic.code)));
|
|
28
|
+
}
|
|
29
|
+
return validate(parsed.records.filter((record) => (typeof record.path === 'string'
|
|
30
|
+
&& typeof record.kind === 'string'
|
|
31
|
+
&& record.header === undefined)), schema, options);
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=telex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telex.js","sourceRoot":"","sources":["../src/telex.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,UAAU,EACV,oBAAoB,GAGvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAuB,MAAM,qBAAqB,CAAC;AAGjF,OAAO,EAAE,QAAQ,EAAwB,MAAM,eAAe,CAAC;AAM/D;;;;GAIG;AACH,MAAM,UAAU,aAAa,CACzB,KAAa,EACb,MAAgB,EAChB,OAAO,GAAyB,EAAE;IAElC,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACD,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,KAAyB,CAAC;QACzC,OAAO,qBAAqB,CAAC;YACzB,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,IAAI,oBAAoB,CAAC;SAC7E,CAAC,CAAC;IACP,CAAC;IAED,MAAM,QAAQ,GAAG,oBAAoB,CAAC,MAAM,CAAC,OAAO,EAAE;QAClD,GAAG,OAAO;QACV,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,UAAU,EAAE,MAAM,CAAC,UAAU;KAChC,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,qBAAqB,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAC5E,UAAU,CAAC,IAAI,IAAI,GAAG,EACtB,IAAI,EACJ,UAAU,CAAC,OAAO,EAClB,UAAU,CAAC,IAAI,CAClB,CAAC,CAAC,CAAC;IACR,CAAC;IAED,OAAO,QAAQ,CACX,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAkC,EAAE,CAAC,CAC9D,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;WAC5B,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;WAC/B,MAAM,CAAC,MAAM,KAAK,SAAS,CACjC,CAAC,EACF,MAAM,EACN,OAAO,CACV,CAAC;AACN,CAAC"}
|