@hyperscale0/udl 1.0.0-alpha.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/AUTHORS +8 -0
- package/CHANGELOG.md +36 -0
- package/LICENSE +661 -0
- package/LICENSING.md +51 -0
- package/README.md +163 -0
- package/SECURITY.md +42 -0
- package/TRADEMARKS.md +35 -0
- package/conformance/README.md +79 -0
- package/conformance/invalid/blank-title.expected.json +10 -0
- package/conformance/invalid/blank-title.udl +50 -0
- package/conformance/invalid/depth-budget.expected.json +10 -0
- package/conformance/invalid/depth-budget.udl +49 -0
- package/conformance/invalid/format-version.expected.json +10 -0
- package/conformance/invalid/format-version.udl +50 -0
- package/conformance/invalid/invalid-utf8.expected.json +10 -0
- package/conformance/invalid/invalid-utf8.udl +1 -0
- package/conformance/invalid/malformed-json.expected.json +10 -0
- package/conformance/invalid/malformed-json.udl +1 -0
- package/conformance/invalid/missing-create-verb.expected.json +10 -0
- package/conformance/invalid/missing-create-verb.udl +45 -0
- package/conformance/invalid/not-an-object.expected.json +10 -0
- package/conformance/invalid/not-an-object.udl +1 -0
- package/conformance/invalid/noun-id-not-snake-case.expected.json +10 -0
- package/conformance/invalid/noun-id-not-snake-case.udl +50 -0
- package/conformance/invalid/unknown-key.expected.json +10 -0
- package/conformance/invalid/unknown-key.udl +51 -0
- package/conformance/invalid/unreachable-state.expected.json +10 -0
- package/conformance/invalid/unreachable-state.udl +51 -0
- package/conformance/invalid/verb-without-transition.expected.json +10 -0
- package/conformance/invalid/verb-without-transition.udl +55 -0
- package/conformance/valid/cards.expected.json +5 -0
- package/conformance/valid/cards.udl +1092 -0
- package/conformance/valid/commerce-escrow.expected.json +5 -0
- package/conformance/valid/commerce-escrow.udl +1011 -0
- package/conformance/valid/hand-edited.expected.json +5 -0
- package/conformance/valid/hand-edited.udl +1 -0
- package/conformance/valid/insured-car-marketplace.expected.json +5 -0
- package/conformance/valid/insured-car-marketplace.udl +831 -0
- package/conformance/valid/insured-travel.expected.json +5 -0
- package/conformance/valid/insured-travel.udl +2621 -0
- package/conformance/valid/minimal.expected.json +5 -0
- package/conformance/valid/minimal.udl +50 -0
- package/conformance/valid/protection.expected.json +5 -0
- package/conformance/valid/protection.udl +1136 -0
- package/dist/canonical.d.ts +2 -0
- package/dist/canonical.d.ts.map +1 -0
- package/dist/canonical.js +35 -0
- package/dist/canonical.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +138 -0
- package/dist/cli.js.map +1 -0
- package/dist/duration.d.ts +3 -0
- package/dist/duration.d.ts.map +1 -0
- package/dist/duration.js +23 -0
- package/dist/duration.js.map +1 -0
- package/dist/evolution.d.ts +63 -0
- package/dist/evolution.d.ts.map +1 -0
- package/dist/evolution.js +345 -0
- package/dist/evolution.js.map +1 -0
- package/dist/finance.d.ts +53 -0
- package/dist/finance.d.ts.map +1 -0
- package/dist/finance.js +511 -0
- package/dist/finance.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/limits.d.ts +33 -0
- package/dist/limits.d.ts.map +1 -0
- package/dist/limits.js +33 -0
- package/dist/limits.js.map +1 -0
- package/dist/parser.d.ts +4 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +54 -0
- package/dist/parser.js.map +1 -0
- package/dist/schema.d.ts +757 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +281 -0
- package/dist/schema.js.map +1 -0
- package/dist/validation.d.ts +64 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +1323 -0
- package/dist/validation.js.map +1 -0
- package/package.json +84 -0
- package/spec/README.md +137 -0
- package/spec/udl.schema.json +1019 -0
- package/src/canonical.ts +41 -0
- package/src/cli.ts +148 -0
- package/src/duration.ts +26 -0
- package/src/evolution.ts +587 -0
- package/src/finance.ts +775 -0
- package/src/index.ts +59 -0
- package/src/limits.ts +32 -0
- package/src/parser.ts +61 -0
- package/src/schema.ts +339 -0
- package/src/validation.ts +2053 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
|
package/dist/schema.js
ADDED
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const UDL_FORMAT_VERSION = 1;
|
|
3
|
+
const snakeCasePattern = /^[a-z][a-z0-9]*(?:_[a-z0-9]+)*$/;
|
|
4
|
+
const camelCasePattern = /^[a-z][A-Za-z0-9]*$/;
|
|
5
|
+
const fieldPathPattern = /^[a-z][A-Za-z0-9]*(?:\.[a-z][A-Za-z0-9]*)*$/;
|
|
6
|
+
const idPrefixPattern = /^[a-z]{2,8}$/;
|
|
7
|
+
const eventNamePattern = /^[a-z][a-z0-9_]*(?:\.[a-z][a-z0-9_]*)+$/;
|
|
8
|
+
const udlSnakeCaseSchema = z
|
|
9
|
+
.string()
|
|
10
|
+
.regex(snakeCasePattern, "must be a snake_case identifier");
|
|
11
|
+
const udlVerbNameSchema = z
|
|
12
|
+
.string()
|
|
13
|
+
.regex(snakeCasePattern, "must be a snake_case verb identifier");
|
|
14
|
+
const udlFieldNameSchema = z
|
|
15
|
+
.string()
|
|
16
|
+
.regex(camelCasePattern, "must be a camelCase field name");
|
|
17
|
+
const nonEmptyTextSchema = z
|
|
18
|
+
.string()
|
|
19
|
+
.refine((value) => value.trim().length > 0, "must not be blank");
|
|
20
|
+
const fieldPathSchema = z
|
|
21
|
+
.string()
|
|
22
|
+
.regex(fieldPathPattern, "must be a dot-separated camelCase field path");
|
|
23
|
+
const jsonObjectSchema = z.record(z.string(), z.json());
|
|
24
|
+
const stringMapSchema = z.record(nonEmptyTextSchema, nonEmptyTextSchema);
|
|
25
|
+
const udlDeclaredValuePolicySchema = z.enum(["required", "optional", "none"]);
|
|
26
|
+
const udlSubjectSchema = z.strictObject({
|
|
27
|
+
declaredValue: udlDeclaredValuePolicySchema,
|
|
28
|
+
kind: udlSnakeCaseSchema,
|
|
29
|
+
schema: jsonObjectSchema,
|
|
30
|
+
title: nonEmptyTextSchema,
|
|
31
|
+
version: z.number().int().positive(),
|
|
32
|
+
});
|
|
33
|
+
const udlNounSubjectSchema = z.strictObject({
|
|
34
|
+
kinds: z.array(udlSnakeCaseSchema).min(1),
|
|
35
|
+
});
|
|
36
|
+
const udlLifecycleTransitionSchema = z.strictObject({
|
|
37
|
+
from: z.array(udlSnakeCaseSchema).min(1),
|
|
38
|
+
to: udlSnakeCaseSchema,
|
|
39
|
+
});
|
|
40
|
+
const udlLifecycleSchema = z.strictObject({
|
|
41
|
+
initial: udlSnakeCaseSchema,
|
|
42
|
+
states: z.array(udlSnakeCaseSchema).min(1),
|
|
43
|
+
transitions: z.record(udlVerbNameSchema, udlLifecycleTransitionSchema),
|
|
44
|
+
});
|
|
45
|
+
const udlUpdatePolicySchema = z.strictObject({
|
|
46
|
+
fields: z.array(udlFieldNameSchema).min(1),
|
|
47
|
+
states: z.array(udlSnakeCaseSchema).min(1),
|
|
48
|
+
});
|
|
49
|
+
const udlGateSchema = z.strictObject({
|
|
50
|
+
/** Local field key <- referenced instance path; create verbs only. */
|
|
51
|
+
bind: z.record(udlFieldNameSchema, fieldPathSchema).optional(),
|
|
52
|
+
field: udlFieldNameSchema,
|
|
53
|
+
/** Local instance path === referenced instance path at admission. */
|
|
54
|
+
match: z.record(fieldPathSchema, fieldPathSchema).optional(),
|
|
55
|
+
/** Opt-in over an optional reference field: absent passes, set is held to the clause. */
|
|
56
|
+
optional: z.literal(true).optional(),
|
|
57
|
+
statuses: z.array(udlSnakeCaseSchema).min(1),
|
|
58
|
+
/** One dependent ever per referenced instance; create verbs only. */
|
|
59
|
+
unique: z.literal(true).optional(),
|
|
60
|
+
});
|
|
61
|
+
const udlBindingSchema = z.discriminatedUnion("from", [
|
|
62
|
+
z.strictObject({ from: z.literal("const"), value: z.string() }),
|
|
63
|
+
z.strictObject({ from: z.literal("instance"), path: fieldPathSchema }),
|
|
64
|
+
z.strictObject({ from: z.literal("input"), path: fieldPathSchema }),
|
|
65
|
+
]);
|
|
66
|
+
const udlStepOperationSchema = z.enum([
|
|
67
|
+
"account.escrow.provision",
|
|
68
|
+
"account.freeze",
|
|
69
|
+
"account.unfreeze",
|
|
70
|
+
]);
|
|
71
|
+
const udlMoveOperationSchema = z.enum([
|
|
72
|
+
"internal_transfer.create",
|
|
73
|
+
"internal_transfer.reserve",
|
|
74
|
+
"internal_transfer.post",
|
|
75
|
+
"internal_transfer.void",
|
|
76
|
+
]);
|
|
77
|
+
export const udlKernelOperationSchema = z.enum([
|
|
78
|
+
...udlStepOperationSchema.options,
|
|
79
|
+
...udlMoveOperationSchema.options,
|
|
80
|
+
]);
|
|
81
|
+
const udlStepSchema = z.strictObject({
|
|
82
|
+
bind: z.record(fieldPathSchema, udlBindingSchema),
|
|
83
|
+
capture: stringMapSchema.optional(),
|
|
84
|
+
operation: udlStepOperationSchema,
|
|
85
|
+
});
|
|
86
|
+
const udlMoveSchema = z.strictObject({
|
|
87
|
+
bind: z.record(fieldPathSchema, udlBindingSchema),
|
|
88
|
+
capture: stringMapSchema.optional(),
|
|
89
|
+
key: udlSnakeCaseSchema,
|
|
90
|
+
operation: udlMoveOperationSchema,
|
|
91
|
+
});
|
|
92
|
+
const udlDueRecurrenceSchema = z.strictObject({
|
|
93
|
+
countField: udlFieldNameSchema.optional(),
|
|
94
|
+
period: z.union([
|
|
95
|
+
nonEmptyTextSchema,
|
|
96
|
+
z.strictObject({
|
|
97
|
+
calendar: z.enum(["gregorian", "hijri"]),
|
|
98
|
+
months: z.number().int().positive(),
|
|
99
|
+
}),
|
|
100
|
+
]),
|
|
101
|
+
untilField: udlFieldNameSchema.optional(),
|
|
102
|
+
});
|
|
103
|
+
const udlDueParentStatusSchema = z.strictObject({
|
|
104
|
+
nounId: udlSnakeCaseSchema,
|
|
105
|
+
refField: udlFieldNameSchema,
|
|
106
|
+
statuses: z.array(udlSnakeCaseSchema).min(1),
|
|
107
|
+
});
|
|
108
|
+
const udlDueSchema = z.strictObject({
|
|
109
|
+
every: udlDueRecurrenceSchema.optional(),
|
|
110
|
+
field: udlFieldNameSchema,
|
|
111
|
+
offset: nonEmptyTextSchema.optional(),
|
|
112
|
+
whenParentStatus: udlDueParentStatusSchema.optional(),
|
|
113
|
+
});
|
|
114
|
+
const udlDeadlineSchema = z.strictObject({
|
|
115
|
+
field: udlFieldNameSchema,
|
|
116
|
+
offset: nonEmptyTextSchema.optional(),
|
|
117
|
+
});
|
|
118
|
+
const udlSetsAtSchema = z.strictObject({
|
|
119
|
+
field: udlFieldNameSchema,
|
|
120
|
+
offset: nonEmptyTextSchema,
|
|
121
|
+
});
|
|
122
|
+
const udlUnwindPenaltySchema = z.strictObject({
|
|
123
|
+
bps: z.number().int().min(0).max(9_999),
|
|
124
|
+
withinOffset: nonEmptyTextSchema.optional(),
|
|
125
|
+
});
|
|
126
|
+
const udlUnwindSchema = z.strictObject({
|
|
127
|
+
beforeField: udlFieldNameSchema.optional(),
|
|
128
|
+
confirm: udlVerbNameSchema,
|
|
129
|
+
penalty: z.array(udlUnwindPenaltySchema).min(1),
|
|
130
|
+
quote: udlVerbNameSchema,
|
|
131
|
+
refundableField: udlFieldNameSchema,
|
|
132
|
+
refundDestinationField: udlFieldNameSchema,
|
|
133
|
+
});
|
|
134
|
+
const udlDecisionSchema = z.strictObject({
|
|
135
|
+
capability: udlSnakeCaseSchema,
|
|
136
|
+
deadlineMs: z.number().int().positive(),
|
|
137
|
+
// A decision that never came back is not an approval. `approve` would let a
|
|
138
|
+
// document release money because a counterparty went quiet, so the grammar
|
|
139
|
+
// admits only the fail-closed answer. Every published document already
|
|
140
|
+
// writes `decline`; widening later is additive, narrowing later would not
|
|
141
|
+
// be.
|
|
142
|
+
onTimeout: z.literal("decline"),
|
|
143
|
+
});
|
|
144
|
+
const udlExampleSchema = z.strictObject({
|
|
145
|
+
input: jsonObjectSchema,
|
|
146
|
+
name: nonEmptyTextSchema,
|
|
147
|
+
output: z.json().optional(),
|
|
148
|
+
});
|
|
149
|
+
const udlAggregateCheckSchema = z.discriminatedUnion("kind", [
|
|
150
|
+
z.strictObject({
|
|
151
|
+
amountField: udlFieldNameSchema,
|
|
152
|
+
kind: z.literal("sum_at_least"),
|
|
153
|
+
targetField: udlFieldNameSchema,
|
|
154
|
+
}),
|
|
155
|
+
z.strictObject({
|
|
156
|
+
amountField: udlFieldNameSchema,
|
|
157
|
+
kind: z.literal("sum_below"),
|
|
158
|
+
targetField: udlFieldNameSchema,
|
|
159
|
+
}),
|
|
160
|
+
z.strictObject({
|
|
161
|
+
amountField: udlFieldNameSchema,
|
|
162
|
+
kind: z.literal("sum_exactly"),
|
|
163
|
+
targetField: udlFieldNameSchema,
|
|
164
|
+
}),
|
|
165
|
+
// Siblings summed against a cap read from the LOCKED anchor row's
|
|
166
|
+
// machinery-seeded ref (never a stored field on the counted rows).
|
|
167
|
+
z.strictObject({
|
|
168
|
+
amountField: udlFieldNameSchema,
|
|
169
|
+
anchorRef: udlFieldNameSchema,
|
|
170
|
+
kind: z.literal("sum_within_anchor_ref"),
|
|
171
|
+
}),
|
|
172
|
+
z.strictObject({
|
|
173
|
+
kind: z.literal("count_at_least"),
|
|
174
|
+
targetField: udlFieldNameSchema,
|
|
175
|
+
}),
|
|
176
|
+
z.strictObject({ kind: z.literal("all_in") }),
|
|
177
|
+
z.strictObject({
|
|
178
|
+
field: udlFieldNameSchema,
|
|
179
|
+
kind: z.literal("count_equals_field"),
|
|
180
|
+
}),
|
|
181
|
+
]);
|
|
182
|
+
const udlAggregateConditionSchema = z.strictObject({
|
|
183
|
+
check: udlAggregateCheckSchema,
|
|
184
|
+
nounId: udlSnakeCaseSchema.optional(),
|
|
185
|
+
over: z.enum(["children", "siblings"]),
|
|
186
|
+
refField: udlFieldNameSchema,
|
|
187
|
+
statuses: z.array(udlSnakeCaseSchema).min(1),
|
|
188
|
+
});
|
|
189
|
+
// The tenant-backend decision port: the verb's caller asserts the acting
|
|
190
|
+
// party, checked at admission against the noun's party bindings for the
|
|
191
|
+
// allowed roles.
|
|
192
|
+
const udlPortSchema = z.strictObject({
|
|
193
|
+
allowedParties: z
|
|
194
|
+
.array(z.enum(["payer", "beneficiary", "subjectHolder"]))
|
|
195
|
+
.min(1),
|
|
196
|
+
});
|
|
197
|
+
// A same-instance conservation law: the piece fields (money, minor units)
|
|
198
|
+
// must sum exactly to the total field; admission refuses a create whose
|
|
199
|
+
// pieces diverge.
|
|
200
|
+
const udlPartitionSchema = z.strictObject({
|
|
201
|
+
pieceFields: z.array(udlFieldNameSchema).min(2),
|
|
202
|
+
totalField: udlFieldNameSchema,
|
|
203
|
+
});
|
|
204
|
+
const udlVerbSchema = z.strictObject({
|
|
205
|
+
deadline: udlDeadlineSchema.optional(),
|
|
206
|
+
decision: udlDecisionSchema.optional(),
|
|
207
|
+
description: nonEmptyTextSchema.optional(),
|
|
208
|
+
due: udlDueSchema.optional(),
|
|
209
|
+
earnable: z.boolean().optional(),
|
|
210
|
+
eventName: z.string().regex(eventNamePattern).optional(),
|
|
211
|
+
examples: z.array(udlExampleSchema).min(1).optional(),
|
|
212
|
+
input: jsonObjectSchema.optional(),
|
|
213
|
+
moves: z.array(udlMoveSchema).default([]),
|
|
214
|
+
port: udlPortSchema.optional(),
|
|
215
|
+
requiresAggregate: z.array(udlAggregateConditionSchema).min(1).optional(),
|
|
216
|
+
requiresDrainedAccount: z.strictObject({ path: fieldPathSchema }).optional(),
|
|
217
|
+
requiresRefs: z.array(udlGateSchema).min(1).optional(),
|
|
218
|
+
setsAt: udlSetsAtSchema.optional(),
|
|
219
|
+
steps: z.array(udlStepSchema),
|
|
220
|
+
summary: nonEmptyTextSchema,
|
|
221
|
+
});
|
|
222
|
+
const udlAggregateBaseShape = {
|
|
223
|
+
childNounId: udlSnakeCaseSchema,
|
|
224
|
+
childRefField: udlFieldNameSchema,
|
|
225
|
+
childStatuses: z.array(udlSnakeCaseSchema).min(1),
|
|
226
|
+
parentField: udlFieldNameSchema,
|
|
227
|
+
};
|
|
228
|
+
// Two measures, mutually exclusive by strictness: a sum cap over a child money
|
|
229
|
+
// field, or a count cap (optionally windowed to the rolling `days` ending at
|
|
230
|
+
// the child's own as-written date-time value).
|
|
231
|
+
const udlAggregateSchema = z.union([
|
|
232
|
+
z.strictObject({
|
|
233
|
+
...udlAggregateBaseShape,
|
|
234
|
+
childField: udlFieldNameSchema,
|
|
235
|
+
}),
|
|
236
|
+
z.strictObject({
|
|
237
|
+
...udlAggregateBaseShape,
|
|
238
|
+
count: z.literal(true),
|
|
239
|
+
window: z
|
|
240
|
+
.strictObject({
|
|
241
|
+
field: udlFieldNameSchema,
|
|
242
|
+
days: z.number().int().min(1).max(3650),
|
|
243
|
+
})
|
|
244
|
+
.optional(),
|
|
245
|
+
}),
|
|
246
|
+
]);
|
|
247
|
+
const udlNounSchema = z.strictObject({
|
|
248
|
+
aggregateInvariants: z.array(udlAggregateSchema).min(1).optional(),
|
|
249
|
+
description: nonEmptyTextSchema.optional(),
|
|
250
|
+
distinctParties: z.literal(true).optional(),
|
|
251
|
+
fields: z.record(udlFieldNameSchema, jsonObjectSchema),
|
|
252
|
+
id: udlSnakeCaseSchema,
|
|
253
|
+
idPrefix: z
|
|
254
|
+
.string()
|
|
255
|
+
.regex(idPrefixPattern, "must contain 2 to 8 lowercase letters"),
|
|
256
|
+
lifecycle: udlLifecycleSchema,
|
|
257
|
+
parties: z
|
|
258
|
+
.strictObject({
|
|
259
|
+
beneficiary: udlFieldNameSchema.optional(),
|
|
260
|
+
payer: udlFieldNameSchema.optional(),
|
|
261
|
+
subjectHolder: udlFieldNameSchema.optional(),
|
|
262
|
+
})
|
|
263
|
+
.optional(),
|
|
264
|
+
partitions: z.array(udlPartitionSchema).min(1).optional(),
|
|
265
|
+
required: z.array(udlFieldNameSchema),
|
|
266
|
+
subject: udlNounSubjectSchema.optional(),
|
|
267
|
+
summary: nonEmptyTextSchema,
|
|
268
|
+
title: nonEmptyTextSchema,
|
|
269
|
+
unwind: udlUnwindSchema.optional(),
|
|
270
|
+
update: udlUpdatePolicySchema.optional(),
|
|
271
|
+
verbs: z.record(udlVerbNameSchema, udlVerbSchema),
|
|
272
|
+
});
|
|
273
|
+
export const udlDocumentSchema = z.strictObject({
|
|
274
|
+
nouns: z.array(udlNounSchema).min(1),
|
|
275
|
+
product: udlSnakeCaseSchema,
|
|
276
|
+
subjects: z.array(udlSubjectSchema),
|
|
277
|
+
title: nonEmptyTextSchema,
|
|
278
|
+
udl: z.literal(UDL_FORMAT_VERSION),
|
|
279
|
+
version: z.number().int().positive(),
|
|
280
|
+
});
|
|
281
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { type ValidationResult } from "@cfworker/json-schema";
|
|
2
|
+
import { type UdlDocument } from "./schema.js";
|
|
3
|
+
export type UdlIssueCode = "invalid_json" | "invalid_semantics" | "invalid_shape" | "invalid_utf8" | "resource_limit";
|
|
4
|
+
export interface UdlIssue {
|
|
5
|
+
readonly code: UdlIssueCode;
|
|
6
|
+
readonly message: string;
|
|
7
|
+
readonly path: string;
|
|
8
|
+
}
|
|
9
|
+
export type UdlValidationResult = {
|
|
10
|
+
readonly ok: true;
|
|
11
|
+
readonly value: UdlDocument;
|
|
12
|
+
} | {
|
|
13
|
+
readonly issues: readonly UdlIssue[];
|
|
14
|
+
readonly ok: false;
|
|
15
|
+
};
|
|
16
|
+
export declare class UdlError extends Error {
|
|
17
|
+
readonly issues: readonly UdlIssue[];
|
|
18
|
+
constructor(issues: readonly UdlIssue[]);
|
|
19
|
+
}
|
|
20
|
+
export declare function validateUdl(value: unknown): UdlValidationResult;
|
|
21
|
+
export declare function assertValidUdl(value: unknown): UdlDocument;
|
|
22
|
+
/**
|
|
23
|
+
* Applies the sealed UDL JSON Schema subset to one value. Both inputs pass the
|
|
24
|
+
* same deterministic admission budgets as a complete UDL document before the
|
|
25
|
+
* standard validator or sealed format validators run.
|
|
26
|
+
*/
|
|
27
|
+
export declare function validateUdlSchemaValue(schema: Readonly<Record<string, unknown>>, value: unknown): ValidationResult;
|
|
28
|
+
/**
|
|
29
|
+
* One budget's worth of reference-shape classification: the memo of the answers
|
|
30
|
+
* already bought and what is left of the probe budget. What is guaranteed is
|
|
31
|
+
* that separate opens are independent — each {@link openReferenceShapeBudget}
|
|
32
|
+
* call returns its own memo and its own counter, and nothing resets either
|
|
33
|
+
* afterwards. Sharing is the caller's call, and both choices are made today:
|
|
34
|
+
* `validateUdl` opens one budget for its semantic pass, while the engine's
|
|
35
|
+
* `checkComposerDocument` deliberately runs its noun-composition and
|
|
36
|
+
* gate-deadlock passes on a single shared budget.
|
|
37
|
+
*/
|
|
38
|
+
export interface ReferenceShapeBudget {
|
|
39
|
+
/**
|
|
40
|
+
* Does this field schema identify exactly one noun family, by accepting that
|
|
41
|
+
* family's scoped id and refusing a foreign one? Answering compiles two JSON
|
|
42
|
+
* Schema validators, and the question is asked once per declared noun per
|
|
43
|
+
* reference gate — a product a document controls both factors of. The answer
|
|
44
|
+
* is pure in (schema, prefix), so each pair is paid for once per budget.
|
|
45
|
+
*
|
|
46
|
+
* Once {@link UDL_LIMITS.maxSchemaProbes} answers have been bought this
|
|
47
|
+
* budget stops buying: {@link exhausted} is true from that moment on, and a
|
|
48
|
+
* pair not already in the memo answers "no" without being asked (memoized
|
|
49
|
+
* pairs go on answering truthfully). Nothing in this type forces
|
|
50
|
+
* a caller to notice that: reading {@link exhausted} and refusing instead of
|
|
51
|
+
* trusting a dropped "no" is a convention each consumer keeps by hand. The
|
|
52
|
+
* two that exist keep it — `validateUdl` below, and the engine's
|
|
53
|
+
* `checkComposerDocument` — and a third would have to be written to.
|
|
54
|
+
*/
|
|
55
|
+
accepts(schema: Readonly<Record<string, unknown>>, prefix: string): boolean;
|
|
56
|
+
/**
|
|
57
|
+
* True once the probe budget is spent — which is the moment the last answer
|
|
58
|
+
* is bought, before any answer has been dropped. A consumer that refuses
|
|
59
|
+
* here refuses a document that fit the budget exactly.
|
|
60
|
+
*/
|
|
61
|
+
readonly exhausted: boolean;
|
|
62
|
+
}
|
|
63
|
+
export declare function openReferenceShapeBudget(): ReferenceShapeBudget;
|
|
64
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,gBAAgB,EACtB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAGL,KAAK,WAAW,EAMjB,MAAM,aAAa,CAAC;AAKrB,MAAM,MAAM,YAAY,GACpB,cAAc,GACd,mBAAmB,GACnB,eAAe,GACf,cAAc,GACd,gBAAgB,CAAC;AAErB,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,mBAAmB,GAC3B;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;CAAE,GAClD;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAA;CAAE,CAAC;AAEjE,qBAAa,QAAS,SAAQ,KAAK;IACjC,QAAQ,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,CAAC;gBAEzB,MAAM,EAAE,SAAS,QAAQ,EAAE;CAUxC;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,CAiC/D;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAI1D;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACzC,KAAK,EAAE,OAAO,GACb,gBAAgB,CA2BlB;AA6qDD;;;;;;;;;GASG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5E;;;;OAIG;IACH,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAeD,wBAAgB,wBAAwB,IAAI,oBAAoB,CAwB/D"}
|