@cruba/crubal 0.0.0-stage → 0.1.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.
- package/LICENSE +202 -0
- package/README.md +69 -2
- package/dist/bin/crubal.d.ts +2 -0
- package/dist/bin/crubal.js +37 -0
- package/dist/bin/crubal.js.map +1 -0
- package/dist/src/browser.d.ts +10 -0
- package/dist/src/browser.js +13 -0
- package/dist/src/browser.js.map +1 -0
- package/dist/src/canonical.d.ts +6 -0
- package/dist/src/canonical.js +47 -0
- package/dist/src/canonical.js.map +1 -0
- package/dist/src/conditions.d.ts +22 -0
- package/dist/src/conditions.js +175 -0
- package/dist/src/conditions.js.map +1 -0
- package/dist/src/corpus.d.ts +8 -0
- package/dist/src/corpus.js +673 -0
- package/dist/src/corpus.js.map +1 -0
- package/dist/src/defs.d.ts +116 -0
- package/dist/src/defs.js +530 -0
- package/dist/src/defs.js.map +1 -0
- package/dist/src/dictionary.d.ts +50 -0
- package/dist/src/dictionary.js +498 -0
- package/dist/src/dictionary.js.map +1 -0
- package/dist/src/exchange.d.ts +45 -0
- package/dist/src/exchange.js +321 -0
- package/dist/src/exchange.js.map +1 -0
- package/dist/src/index.d.ts +15 -0
- package/dist/src/index.js +17 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/lex.d.ts +21 -0
- package/dist/src/lex.js +142 -0
- package/dist/src/lex.js.map +1 -0
- package/dist/src/migrate.d.ts +88 -0
- package/dist/src/migrate.js +191 -0
- package/dist/src/migrate.js.map +1 -0
- package/dist/src/model.d.ts +36 -0
- package/dist/src/model.js +32 -0
- package/dist/src/model.js.map +1 -0
- package/dist/src/packages.d.ts +25 -0
- package/dist/src/packages.js +98 -0
- package/dist/src/packages.js.map +1 -0
- package/dist/src/print-text.d.ts +7 -0
- package/dist/src/print-text.js +194 -0
- package/dist/src/print-text.js.map +1 -0
- package/dist/src/read-text.d.ts +8 -0
- package/dist/src/read-text.js +317 -0
- package/dist/src/read-text.js.map +1 -0
- package/dist/src/rules.d.ts +64 -0
- package/dist/src/rules.js +486 -0
- package/dist/src/rules.js.map +1 -0
- package/dist/src/store.d.ts +133 -0
- package/dist/src/store.js +396 -0
- package/dist/src/store.js.map +1 -0
- package/dist/src/tree.d.ts +32 -0
- package/dist/src/tree.js +123 -0
- package/dist/src/tree.js.map +1 -0
- package/dist/src/units.d.ts +4 -0
- package/dist/src/units.js +37 -0
- package/dist/src/units.js.map +1 -0
- package/dist/src/views.d.ts +114 -0
- package/dist/src/views.js +436 -0
- package/dist/src/views.js.map +1 -0
- package/package.json +58 -4
|
@@ -0,0 +1,486 @@
|
|
|
1
|
+
// rules.ts: the Rules level (spec chapter 6). Rules are read from `rule:` blocks and from the facet
|
|
2
|
+
// shortcuts that expand to them (4.4); a rule set is checked at publish (6.8: layered, no contradictions,
|
|
3
|
+
// one spelling); and writes run through the rules in order (6.2, 6.4, 6.7, 6.9): refused, held, filled,
|
|
4
|
+
// derived, flagged, incomplete, complete and completeness.
|
|
5
|
+
import { evaluate, parseCondition, reads } from "./conditions.js";
|
|
6
|
+
import { resolve } from "./dictionary.js";
|
|
7
|
+
import { itemText } from "./print-text.js";
|
|
8
|
+
import { CrubalError, readTree } from "./tree.js";
|
|
9
|
+
const AGG = /^(join|sum|best|narrow|worst|deduct|replace|keep|count|least|most) of (\S+)$/;
|
|
10
|
+
const isObj = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
|
|
11
|
+
function production(thenText, strength) {
|
|
12
|
+
const m = thenText.match(/^([A-Za-z_][\w:]*) is (.+)$/);
|
|
13
|
+
if (!m)
|
|
14
|
+
return undefined;
|
|
15
|
+
const key = m[1];
|
|
16
|
+
const right = m[2].trim();
|
|
17
|
+
if (right.startsWith('"'))
|
|
18
|
+
return { key, kind: "template", right };
|
|
19
|
+
if (AGG.test(right))
|
|
20
|
+
return { key, kind: "rollup", right };
|
|
21
|
+
if (right === "unique" || right === "_" || right === "-")
|
|
22
|
+
return undefined;
|
|
23
|
+
if (strength === "suggest")
|
|
24
|
+
return { key, kind: "fill", right };
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
function makeRule(r) {
|
|
28
|
+
const rule = { ...r, when: r.whenText ? parseCondition(r.whenText, r.line) : null, then: null };
|
|
29
|
+
rule.produces = production(r.thenText, r.strength);
|
|
30
|
+
if (!rule.produces || rule.produces.kind === "fill") {
|
|
31
|
+
rule.then = r.thenText.endsWith(" is unique") ? null : parseCondition(r.thenText, r.line);
|
|
32
|
+
}
|
|
33
|
+
return rule;
|
|
34
|
+
}
|
|
35
|
+
/** Read `rule:` blocks from definition text. */
|
|
36
|
+
export function readRules(source) {
|
|
37
|
+
const out = [];
|
|
38
|
+
for (const node of readTree(source)) {
|
|
39
|
+
if (node.kind !== "pair" || node.key !== "rule")
|
|
40
|
+
continue;
|
|
41
|
+
const get = (k) => node.children.find((c) => c.key === k);
|
|
42
|
+
const strength = get("strength")?.value;
|
|
43
|
+
if (!strength || !["must", "should", "suggest"].includes(strength)) {
|
|
44
|
+
throw new CrubalError(`the rule ${node.value} needs a strength: must, should or suggest`, node.line);
|
|
45
|
+
}
|
|
46
|
+
const thenNode = get("then");
|
|
47
|
+
if (!thenNode)
|
|
48
|
+
throw new CrubalError(`the rule ${node.value} needs a then`, node.line);
|
|
49
|
+
const because = get("because")?.value;
|
|
50
|
+
out.push(makeRule({
|
|
51
|
+
name: node.value.trim(),
|
|
52
|
+
line: node.line,
|
|
53
|
+
for: get("for")?.value ?? "everywhere",
|
|
54
|
+
whenText: get("when")?.value ?? "",
|
|
55
|
+
thenText: thenNode.value,
|
|
56
|
+
strength,
|
|
57
|
+
...(because ? { because } : {}),
|
|
58
|
+
}));
|
|
59
|
+
}
|
|
60
|
+
return out;
|
|
61
|
+
}
|
|
62
|
+
/** The rules a facet's shortcut settings expand to (4.4). */
|
|
63
|
+
export function shortcutRules(dict) {
|
|
64
|
+
const out = [];
|
|
65
|
+
for (const f of dict.facets.values()) {
|
|
66
|
+
const line = f.line ?? 0;
|
|
67
|
+
const add = (name, thenText, strength, whenText = "") => out.push(makeRule({ name: `${f.key}: ${name}`, line, for: "everywhere", whenText, thenText, strength, shortcut: true }));
|
|
68
|
+
if (f.required)
|
|
69
|
+
add("required", `${f.key} has`, "must");
|
|
70
|
+
if (f.unique)
|
|
71
|
+
add("unique", `${f.key} is unique`, "must");
|
|
72
|
+
if (f.when)
|
|
73
|
+
add("when", `${f.key} is -`, "must", `not (${f.when})`);
|
|
74
|
+
if (f.length !== undefined)
|
|
75
|
+
add("length", `${f.key} under ${f.length + 1}`, "should", `${f.key} has`);
|
|
76
|
+
if (f.range)
|
|
77
|
+
add("range", `${f.key} in ${f.range.min}..${f.range.max}`, "should", `${f.key} has`);
|
|
78
|
+
if (f.combine)
|
|
79
|
+
add("combine", `${f.key} is ${f.combine} of parts[*].${f.key}`, "must");
|
|
80
|
+
}
|
|
81
|
+
return out;
|
|
82
|
+
}
|
|
83
|
+
// ─── Publish checks (6.8) ────────────────────────────────────────────────────
|
|
84
|
+
function readsOf(r) {
|
|
85
|
+
const keys = r.when ? reads(r.when) : [];
|
|
86
|
+
if (r.produces?.kind === "template") {
|
|
87
|
+
for (const m of r.produces.right.matchAll(/\{([^{}]+)\}/g)) {
|
|
88
|
+
for (const alt of m[1].split("??"))
|
|
89
|
+
keys.push(alt.trim().replace(/\?$/, ""));
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// A rollup reads its parts' addresses (parts[*].condition), not the key it produces on the whole.
|
|
93
|
+
if (r.produces?.kind === "rollup")
|
|
94
|
+
keys.push(r.produces.right.match(AGG)?.[2] ?? "");
|
|
95
|
+
return keys.map((k) => k.replace(/^\w+::/, ""));
|
|
96
|
+
}
|
|
97
|
+
/** Top-level `and`-terms of a condition that pin a key to a set of values. */
|
|
98
|
+
function pins(e) {
|
|
99
|
+
const out = new Map();
|
|
100
|
+
const walk = (x) => {
|
|
101
|
+
if (x.op === "and") {
|
|
102
|
+
walk(x.a);
|
|
103
|
+
walk(x.b);
|
|
104
|
+
}
|
|
105
|
+
else if (x.op === "test" && (x.verb === "is" || x.verb === "in") && !/\.\./.test(x.arg)) {
|
|
106
|
+
out.set(x.path, new Set(x.arg.split(",").map((s) => s.trim().replace(/^"|"$/g, ""))));
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
if (e)
|
|
110
|
+
walk(e);
|
|
111
|
+
return out;
|
|
112
|
+
}
|
|
113
|
+
function disjoint(a, b) {
|
|
114
|
+
for (const x of a)
|
|
115
|
+
if (b.has(x))
|
|
116
|
+
return false;
|
|
117
|
+
return true;
|
|
118
|
+
}
|
|
119
|
+
/** Check a rule set (6.8). Throws the first problem. */
|
|
120
|
+
export function checkRules(rules, dict) {
|
|
121
|
+
const all = [...shortcutRules(dict), ...rules];
|
|
122
|
+
// One spelling: an explicit rule that says what a shortcut says.
|
|
123
|
+
for (const r of rules) {
|
|
124
|
+
const twin = all.find((s) => s.shortcut && s.thenText === r.thenText && s.whenText === r.whenText && s.strength === r.strength);
|
|
125
|
+
if (twin)
|
|
126
|
+
throw new CrubalError(`${r.name} says the same as ${twin.name.replace(": ", "'s ")} setting`, r.line);
|
|
127
|
+
}
|
|
128
|
+
// Layered: no cycle from what a rule reads to what it produces.
|
|
129
|
+
const producers = all.filter((r) => r.produces);
|
|
130
|
+
const edges = new Map();
|
|
131
|
+
for (const r of producers) {
|
|
132
|
+
for (const k of readsOf(r))
|
|
133
|
+
edges.set(k, [...(edges.get(k) ?? []), { to: r.produces?.key, rule: r }]);
|
|
134
|
+
}
|
|
135
|
+
for (const start of producers) {
|
|
136
|
+
const seen = new Set();
|
|
137
|
+
const stack = [{ key: start.produces?.key, path: [start] }];
|
|
138
|
+
while (stack.length) {
|
|
139
|
+
const { key, path } = stack.pop();
|
|
140
|
+
for (const e of edges.get(key) ?? []) {
|
|
141
|
+
if (e.rule === start) {
|
|
142
|
+
const names = [...new Set(path.map((p) => p.name))];
|
|
143
|
+
const first = [...path].sort((a, b) => a.line - b.line)[0];
|
|
144
|
+
throw new CrubalError(`the rules ${names.join(" and ")} depend on each other's effect`, first.line);
|
|
145
|
+
}
|
|
146
|
+
if (!seen.has(e.to)) {
|
|
147
|
+
seen.add(e.to);
|
|
148
|
+
stack.push({ key: e.to, path: [...path, e.rule] });
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// No contradictions: two must rules pinning one key to disjoint values, with whens that can both hold.
|
|
154
|
+
const musts = all.filter((r) => r.strength === "must" && r.then && !r.produces);
|
|
155
|
+
for (let i = 0; i < musts.length; i++) {
|
|
156
|
+
for (let j = i + 1; j < musts.length; j++) {
|
|
157
|
+
const a = musts[i];
|
|
158
|
+
const b = musts[j];
|
|
159
|
+
if (a.for !== b.for && a.for !== "everywhere" && b.for !== "everywhere")
|
|
160
|
+
continue;
|
|
161
|
+
const pa = pins(a.then);
|
|
162
|
+
const pb = pins(b.then);
|
|
163
|
+
const wa = pins(a.when);
|
|
164
|
+
const wb = pins(b.when);
|
|
165
|
+
const whensClash = [...wa].some(([k, s]) => wb.has(k) && disjoint(s, wb.get(k)));
|
|
166
|
+
if (whensClash)
|
|
167
|
+
continue;
|
|
168
|
+
for (const [k, s] of pa) {
|
|
169
|
+
const t = pb.get(k);
|
|
170
|
+
if (t && disjoint(s, t)) {
|
|
171
|
+
const when = a.whenText && a.whenText === b.whenText ? ` when ${a.whenText.replace(/ has$/, " has a value")}` : "";
|
|
172
|
+
throw new CrubalError(`${a.name} and ${b.name} can't both hold${when}`, Math.min(a.line, b.line));
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
function emptyOf(v) {
|
|
179
|
+
return v === undefined || (isObj(v) && v.$empty === "unknown");
|
|
180
|
+
}
|
|
181
|
+
export class Engine {
|
|
182
|
+
dict;
|
|
183
|
+
rules;
|
|
184
|
+
store = new Map();
|
|
185
|
+
order = [];
|
|
186
|
+
constructor(dict, rules) {
|
|
187
|
+
this.dict = dict;
|
|
188
|
+
this.rules = [...shortcutRules(dict), ...rules];
|
|
189
|
+
}
|
|
190
|
+
/** The values a record reads: its own over everything above it (1.7). */
|
|
191
|
+
effective(rec) {
|
|
192
|
+
const up = rec.of ? this.store.get(rec.of)?.rec : undefined;
|
|
193
|
+
return { ...(up ? this.effective(up) : {}), ...rec.values };
|
|
194
|
+
}
|
|
195
|
+
applies(r, rec) {
|
|
196
|
+
if (r.for === "everywhere")
|
|
197
|
+
return true;
|
|
198
|
+
if (this.dict.classes.has(r.for))
|
|
199
|
+
return (rec.wears ?? []).some((w) => w === r.for || resolveUses(this.dict, w).includes(r.for));
|
|
200
|
+
if (this.dict.levels.has(r.for))
|
|
201
|
+
return rec.level === r.for;
|
|
202
|
+
return rec.kind === r.for;
|
|
203
|
+
}
|
|
204
|
+
/** Where a produced key may be stored: the top of its chain, or a level where it varies. */
|
|
205
|
+
storesAt(key, rec) {
|
|
206
|
+
return !rec.of || (this.dict.vary.get(rec.level)?.has(key) ?? false);
|
|
207
|
+
}
|
|
208
|
+
states(rec, held) {
|
|
209
|
+
return (path) => {
|
|
210
|
+
const s = new Set();
|
|
211
|
+
const alt = rec.alternatives?.[path];
|
|
212
|
+
if (alt?.length)
|
|
213
|
+
s.add("conflicted");
|
|
214
|
+
if (held.has(path))
|
|
215
|
+
s.add("held");
|
|
216
|
+
const f = this.dict.facets.get(path);
|
|
217
|
+
const v = rec.values[path];
|
|
218
|
+
if (f?.type === "choice" && typeof v === "string" && !(f.values ?? []).some((x) => x.value === v))
|
|
219
|
+
s.add("new");
|
|
220
|
+
if (rec.sources?.[path]?.adopted)
|
|
221
|
+
s.add("adopted");
|
|
222
|
+
return s;
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
/** A path a check tests, for reporting. */
|
|
226
|
+
pathOf(e) {
|
|
227
|
+
if (!e)
|
|
228
|
+
return undefined;
|
|
229
|
+
if (e.op === "test")
|
|
230
|
+
return e.path;
|
|
231
|
+
if (e.op === "not")
|
|
232
|
+
return this.pathOf(e.a);
|
|
233
|
+
return this.pathOf(e.a);
|
|
234
|
+
}
|
|
235
|
+
uniqueClash(r, rec) {
|
|
236
|
+
const key = r.thenText.replace(/ is unique$/, "");
|
|
237
|
+
const mine = rec.values[key];
|
|
238
|
+
if (emptyOf(mine) || (isObj(mine) && "$empty" in mine))
|
|
239
|
+
return false;
|
|
240
|
+
const want = JSON.stringify(mine);
|
|
241
|
+
for (const [id, s] of this.store)
|
|
242
|
+
if (id !== rec.id && JSON.stringify(s.rec.values[key]) === want)
|
|
243
|
+
return true;
|
|
244
|
+
return false;
|
|
245
|
+
}
|
|
246
|
+
/** Write a record (a create, or values merged onto one already stored). Returns its results. */
|
|
247
|
+
write(incoming) {
|
|
248
|
+
const before = this.store.get(incoming.id);
|
|
249
|
+
const rec = before
|
|
250
|
+
? { ...before.rec, values: { ...before.rec.values, ...incoming.values }, parts: incoming.parts ?? before.rec.parts }
|
|
251
|
+
: { ...incoming, values: { ...incoming.values } };
|
|
252
|
+
const touched = new Set(Object.keys(incoming.values));
|
|
253
|
+
const produced = new Set(before?.produced ?? []);
|
|
254
|
+
const held = new Set();
|
|
255
|
+
const results = [];
|
|
256
|
+
// 1. Must checks against the write: refuse what the write broke; hold what a changed verdict broke.
|
|
257
|
+
for (const r of this.rules) {
|
|
258
|
+
if (r.strength !== "must" || r.produces || !this.applies(r, rec))
|
|
259
|
+
continue;
|
|
260
|
+
const vals = this.effective(rec);
|
|
261
|
+
if (r.when && evaluate(r.when, vals, this.states(rec, held)) !== true)
|
|
262
|
+
continue;
|
|
263
|
+
if (r.thenText.endsWith(" is unique")) {
|
|
264
|
+
const key = r.thenText.replace(/ is unique$/, "");
|
|
265
|
+
if (this.uniqueClash(r, rec)) {
|
|
266
|
+
if (touched.has(key))
|
|
267
|
+
return [{ record: rec.id, result: "refused", address: key, rule: r.name }];
|
|
268
|
+
held.add(key);
|
|
269
|
+
results.push({ record: rec.id, result: "held", address: key, rule: r.name });
|
|
270
|
+
}
|
|
271
|
+
continue;
|
|
272
|
+
}
|
|
273
|
+
const path = this.pathOf(r.then);
|
|
274
|
+
if (emptyOf(vals[path]))
|
|
275
|
+
continue; // an empty value is incompleteness, reported below
|
|
276
|
+
if (r.then && evaluate(r.then, vals, this.states(rec, held)) === false) {
|
|
277
|
+
if (touched.has(path))
|
|
278
|
+
return [{ record: rec.id, result: "refused", address: path, rule: r.name }];
|
|
279
|
+
held.add(path);
|
|
280
|
+
results.push({ record: rec.id, result: "held", address: path, rule: r.name });
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
const visible = () => {
|
|
284
|
+
const v = this.effective(rec);
|
|
285
|
+
for (const h of held)
|
|
286
|
+
delete v[h];
|
|
287
|
+
return v;
|
|
288
|
+
};
|
|
289
|
+
// 2a. A gate that fails produces "does not apply" when the value is empty (chapter 1.5).
|
|
290
|
+
for (const r of this.rules) {
|
|
291
|
+
if (r.strength !== "must" || !this.applies(r, rec))
|
|
292
|
+
continue;
|
|
293
|
+
const gate = r.thenText.match(/^([A-Za-z_][\w:]*) is -$/);
|
|
294
|
+
if (!gate)
|
|
295
|
+
continue;
|
|
296
|
+
const key = gate[1];
|
|
297
|
+
if (held.has(key) || rec.values[key] !== undefined || !this.storesAt(key, rec))
|
|
298
|
+
continue;
|
|
299
|
+
if (r.when && evaluate(r.when, visible(), this.states(rec, held)) !== true)
|
|
300
|
+
continue;
|
|
301
|
+
rec.values[key] = { $empty: "n/a" };
|
|
302
|
+
produced.add(key);
|
|
303
|
+
results.push({ record: rec.id, result: "filled", address: key, value: { $empty: "n/a" }, rule: r.name });
|
|
304
|
+
}
|
|
305
|
+
// 2. Productions, in layer order (a rule's inputs before its output).
|
|
306
|
+
for (const r of this.layered()) {
|
|
307
|
+
if (!r.produces || !this.applies(r, rec))
|
|
308
|
+
continue;
|
|
309
|
+
const { key, kind, right } = r.produces;
|
|
310
|
+
if (!this.storesAt(key, rec))
|
|
311
|
+
continue;
|
|
312
|
+
const vals = visible();
|
|
313
|
+
if (r.when && evaluate(r.when, vals, this.states(rec, held)) !== true)
|
|
314
|
+
continue;
|
|
315
|
+
const current = rec.values[key];
|
|
316
|
+
const mine = produced.has(key);
|
|
317
|
+
if (kind === "fill") {
|
|
318
|
+
if (!emptyOf(current))
|
|
319
|
+
continue;
|
|
320
|
+
const f = this.dict.facets.get(key);
|
|
321
|
+
const v = f?.type === "choice" || !f ? right.replace(/^"|"$/g, "") : right;
|
|
322
|
+
rec.values[key] = v;
|
|
323
|
+
produced.add(key);
|
|
324
|
+
results.push({ record: rec.id, result: "filled", address: key, value: v, rule: r.name });
|
|
325
|
+
continue;
|
|
326
|
+
}
|
|
327
|
+
if (!emptyOf(current) && !mine)
|
|
328
|
+
continue; // a person's value: adopted, not overwritten
|
|
329
|
+
const v = kind === "template" ? this.template(right, vals) : this.rollup(right, rec);
|
|
330
|
+
if (v === undefined)
|
|
331
|
+
continue;
|
|
332
|
+
rec.values[key] = v;
|
|
333
|
+
produced.add(key);
|
|
334
|
+
results.push({ record: rec.id, result: "derived", address: key, value: v, rule: r.name });
|
|
335
|
+
}
|
|
336
|
+
// 3. Results: incomplete, flagged, complete, completeness.
|
|
337
|
+
let complete = held.size === 0;
|
|
338
|
+
const vals = visible();
|
|
339
|
+
for (const r of this.rules) {
|
|
340
|
+
if (r.produces || !this.applies(r, rec))
|
|
341
|
+
continue;
|
|
342
|
+
if (r.when && evaluate(r.when, vals, this.states(rec, held)) !== true)
|
|
343
|
+
continue;
|
|
344
|
+
if (r.thenText.endsWith(" is unique"))
|
|
345
|
+
continue;
|
|
346
|
+
const truth = r.then ? evaluate(r.then, vals, this.states(rec, held)) : true;
|
|
347
|
+
const path = this.pathOf(r.then);
|
|
348
|
+
const needsValue = path !== undefined && emptyOf(vals[path]);
|
|
349
|
+
if (r.strength === "must" && (truth === "undetermined" || (truth === false && needsValue))) {
|
|
350
|
+
complete = false;
|
|
351
|
+
results.push({ record: rec.id, result: "incomplete", rule: r.name, ...(path ? { address: path } : {}) });
|
|
352
|
+
}
|
|
353
|
+
else if (r.strength === "should" && truth !== true) {
|
|
354
|
+
results.push({ record: rec.id, result: "flagged", rule: r.name, ...(path ? { address: path } : {}) });
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
if (complete)
|
|
358
|
+
results.unshift({ record: rec.id, result: "complete" });
|
|
359
|
+
results.push(...this.completeness(rec));
|
|
360
|
+
this.store.set(rec.id, { rec, produced, held });
|
|
361
|
+
if (!this.order.includes(rec.id))
|
|
362
|
+
this.order.push(rec.id);
|
|
363
|
+
return results;
|
|
364
|
+
}
|
|
365
|
+
layered() {
|
|
366
|
+
const prods = this.rules.filter((r) => r.produces);
|
|
367
|
+
const out = [];
|
|
368
|
+
const placed = new Set();
|
|
369
|
+
while (out.length < prods.length) {
|
|
370
|
+
const before = out.length;
|
|
371
|
+
for (const r of prods) {
|
|
372
|
+
if (placed.has(r))
|
|
373
|
+
continue;
|
|
374
|
+
const needs = readsOf(r);
|
|
375
|
+
const blocked = prods.some((p) => !placed.has(p) && p !== r && needs.includes(p.produces?.key));
|
|
376
|
+
if (!blocked) {
|
|
377
|
+
out.push(r);
|
|
378
|
+
placed.add(r);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
if (out.length === before)
|
|
382
|
+
return [...out, ...prods.filter((p) => !placed.has(p))];
|
|
383
|
+
}
|
|
384
|
+
return out;
|
|
385
|
+
}
|
|
386
|
+
/** A value's plain text in a template: the value itself, never quoted, without detail. */
|
|
387
|
+
text(key, v) {
|
|
388
|
+
const c = isObj(v) && "$value" in v ? v.$value : v;
|
|
389
|
+
if (typeof c === "string")
|
|
390
|
+
return c;
|
|
391
|
+
const f = this.dict.facets.get(key);
|
|
392
|
+
return f ? itemText(f, c) : JSON.stringify(c);
|
|
393
|
+
}
|
|
394
|
+
/** A template (6.4.1): `{a}`, `{a ?? b}`, `{a?}`, `{{`, `}}`. Nothing when a needed value is empty. */
|
|
395
|
+
template(right, vals) {
|
|
396
|
+
const src = JSON.parse(right);
|
|
397
|
+
let out = "";
|
|
398
|
+
for (let i = 0; i < src.length; i++) {
|
|
399
|
+
const ch = src[i];
|
|
400
|
+
if (src.startsWith("{{", i) || src.startsWith("}}", i)) {
|
|
401
|
+
out += ch;
|
|
402
|
+
i++;
|
|
403
|
+
continue;
|
|
404
|
+
}
|
|
405
|
+
if (ch !== "{") {
|
|
406
|
+
out += ch;
|
|
407
|
+
continue;
|
|
408
|
+
}
|
|
409
|
+
const end = src.indexOf("}", i);
|
|
410
|
+
const inner = src.slice(i + 1, end).trim();
|
|
411
|
+
i = end;
|
|
412
|
+
const optional = inner.endsWith("?") && !inner.includes("??");
|
|
413
|
+
const alts = (optional ? inner.slice(0, -1) : inner).split("??").map((s) => s.trim());
|
|
414
|
+
const found = alts.find((a) => !emptyOf(vals[a]) && !(isObj(vals[a]) && "$empty" in vals[a]));
|
|
415
|
+
if (found === undefined) {
|
|
416
|
+
if (!optional)
|
|
417
|
+
return undefined;
|
|
418
|
+
out = out.replace(/[\s·,:-]+$/, "");
|
|
419
|
+
continue;
|
|
420
|
+
}
|
|
421
|
+
out += this.text(found, vals[found]);
|
|
422
|
+
}
|
|
423
|
+
return out;
|
|
424
|
+
}
|
|
425
|
+
/** A rollup over parts: `worst of parts[*].condition`. */
|
|
426
|
+
rollup(right, rec) {
|
|
427
|
+
const m = right.match(AGG);
|
|
428
|
+
if (!m)
|
|
429
|
+
return undefined;
|
|
430
|
+
const how = m[1];
|
|
431
|
+
const key = m[2].replace(/^parts\[\*\]\./, "");
|
|
432
|
+
const items = (rec.parts ?? [])
|
|
433
|
+
.map((p) => (isObj(p) && isObj(p.values) ? p.values[key] : undefined))
|
|
434
|
+
.filter((v) => v !== undefined && !(isObj(v) && "$empty" in v));
|
|
435
|
+
if (how === "count")
|
|
436
|
+
return String(items.length);
|
|
437
|
+
if (!items.length)
|
|
438
|
+
return undefined;
|
|
439
|
+
const f = this.dict.facets.get(key);
|
|
440
|
+
if ((how === "worst" || how === "best") && f?.values) {
|
|
441
|
+
const rank = (v) => (f.values ?? []).findIndex((x) => x.value === v);
|
|
442
|
+
const sorted = [...items].sort((a, b) => rank(a) - rank(b));
|
|
443
|
+
return (how === "best" ? sorted[0] : sorted.at(-1));
|
|
444
|
+
}
|
|
445
|
+
const nums = items.map((v) => Number(isObj(v) ? (v.$qty ?? v.$money) : v));
|
|
446
|
+
if (how === "sum")
|
|
447
|
+
return String(nums.reduce((a, b) => a + b, 0));
|
|
448
|
+
if (how === "least" || how === "worst")
|
|
449
|
+
return String(Math.min(...nums));
|
|
450
|
+
if (how === "most" || how === "best")
|
|
451
|
+
return String(Math.max(...nums));
|
|
452
|
+
if (how === "join")
|
|
453
|
+
return items;
|
|
454
|
+
return items.at(-1);
|
|
455
|
+
}
|
|
456
|
+
/** Completeness (6.9): asked facets with a value ÷ asked facets, per record and per part. */
|
|
457
|
+
completeness(rec) {
|
|
458
|
+
const out = [];
|
|
459
|
+
const measure = (worn, values) => {
|
|
460
|
+
const asked = resolve(this.dict, worn.filter((w) => this.dict.classes.has(w))).filter((l) => !l.when || evaluate(parseCondition(l.when), values) === true);
|
|
461
|
+
if (!asked.length)
|
|
462
|
+
return null;
|
|
463
|
+
const had = asked.filter((l) => !emptyOf(values[l.facet])).length;
|
|
464
|
+
return String(Number((had / asked.length).toFixed(4)));
|
|
465
|
+
};
|
|
466
|
+
const own = measure(rec.wears ?? [], this.effective(rec));
|
|
467
|
+
if (own !== null)
|
|
468
|
+
out.push({ record: rec.id, result: "completeness", value: own });
|
|
469
|
+
for (const p of rec.parts ?? []) {
|
|
470
|
+
if (!isObj(p))
|
|
471
|
+
continue;
|
|
472
|
+
const v = measure(Array.isArray(p.wears) ? p.wears.map(String) : [], isObj(p.values) ? p.values : {});
|
|
473
|
+
if (v !== null)
|
|
474
|
+
out.push({ record: rec.id, address: `parts[${p.$row}]`, result: "completeness", value: v });
|
|
475
|
+
}
|
|
476
|
+
return out;
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
function resolveUses(dict, name, seen = new Set()) {
|
|
480
|
+
if (seen.has(name))
|
|
481
|
+
return [];
|
|
482
|
+
seen.add(name);
|
|
483
|
+
const c = dict.classes.get(name);
|
|
484
|
+
return c ? c.uses.flatMap((u) => [u, ...resolveUses(dict, u, seen)]) : [];
|
|
485
|
+
}
|
|
486
|
+
//# sourceMappingURL=rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/rules.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { type ClassLine, type Dictionary } from "./defs.ts";
|
|
2
|
+
import type { Json, JsonObject, Record, Source } from "./model.ts";
|
|
3
|
+
export declare function sha256(text: string): string;
|
|
4
|
+
/** An entry's hash: SHA-256 of its canonical form without `sig`; a redacted entry's hash is what it carries. */
|
|
5
|
+
export declare function entryHash(entry: JsonObject): string;
|
|
6
|
+
/** Published keys by owner domain: `{ "test.example": { "alg": "Ed25519", "public": "<base64url>" } }`. */
|
|
7
|
+
export type Keys = {
|
|
8
|
+
[owner: string]: {
|
|
9
|
+
alg: string;
|
|
10
|
+
public: string;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
/** Does `sig` (base64url) verify over the entry's hash bytes with the owner's Ed25519 key? */
|
|
14
|
+
export declare function verifySig(entry: JsonObject, owner: string, keys: Keys): boolean;
|
|
15
|
+
/** Check a chain's links, and, when the owner's key is known, every entry's signature (8.5). */
|
|
16
|
+
export declare function verifyChain(entries: JsonObject[], keys?: Keys): {
|
|
17
|
+
valid: boolean;
|
|
18
|
+
"breaks-at"?: string;
|
|
19
|
+
reason?: string;
|
|
20
|
+
};
|
|
21
|
+
export type MapLine = {
|
|
22
|
+
from: string;
|
|
23
|
+
to: string;
|
|
24
|
+
values: [string, string][];
|
|
25
|
+
line: number;
|
|
26
|
+
valueLines: number[];
|
|
27
|
+
};
|
|
28
|
+
export type Contract = {
|
|
29
|
+
name: string;
|
|
30
|
+
kind: string;
|
|
31
|
+
origin: string;
|
|
32
|
+
prefix?: string;
|
|
33
|
+
reads: MapLine[];
|
|
34
|
+
writes: MapLine[];
|
|
35
|
+
ignore: string[];
|
|
36
|
+
keepRaw: string[];
|
|
37
|
+
absorb: boolean;
|
|
38
|
+
lands: string;
|
|
39
|
+
line: number;
|
|
40
|
+
/** needs: an unnamed class (7.2) */
|
|
41
|
+
needs: ClassLine[];
|
|
42
|
+
gives: string[];
|
|
43
|
+
who?: string;
|
|
44
|
+
when?: string;
|
|
45
|
+
from?: string;
|
|
46
|
+
to?: string;
|
|
47
|
+
mode?: string;
|
|
48
|
+
undo?: string;
|
|
49
|
+
/** Every part as written, with its line, for the publish checks. */
|
|
50
|
+
parts: {
|
|
51
|
+
[k: string]: string;
|
|
52
|
+
};
|
|
53
|
+
partLines: {
|
|
54
|
+
[k: string]: number;
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
/** Read `contract:` blocks. */
|
|
58
|
+
export declare function readContracts(source: string): Contract[];
|
|
59
|
+
/** Split a field path into names: `aspects."Run Time"` → ["aspects", "Run Time"]. */
|
|
60
|
+
export declare function fieldPath(path: string): string[];
|
|
61
|
+
export type IntakeOutcome = {
|
|
62
|
+
from: string;
|
|
63
|
+
to?: string;
|
|
64
|
+
outcome: string;
|
|
65
|
+
value?: Json;
|
|
66
|
+
cites?: JsonObject;
|
|
67
|
+
};
|
|
68
|
+
export type IntakeRecord = {
|
|
69
|
+
intake: string;
|
|
70
|
+
contract: string;
|
|
71
|
+
for: string;
|
|
72
|
+
received?: string;
|
|
73
|
+
raw: {
|
|
74
|
+
type: string;
|
|
75
|
+
sha256: string;
|
|
76
|
+
body: string;
|
|
77
|
+
};
|
|
78
|
+
outcomes: IntakeOutcome[];
|
|
79
|
+
};
|
|
80
|
+
/** Keep a payload's exact bytes (3.8): as text when they are valid UTF-8, otherwise as base64. */
|
|
81
|
+
export declare function rawOf(bytes: Uint8Array, type: string): {
|
|
82
|
+
type: string;
|
|
83
|
+
sha256: string;
|
|
84
|
+
body?: string;
|
|
85
|
+
base64?: string;
|
|
86
|
+
};
|
|
87
|
+
/** Replay an intake record from its kept bytes under the current contract (9.6); earlier outcomes stay. */
|
|
88
|
+
export declare function replay(intake: IntakeRecord & {
|
|
89
|
+
replays?: JsonObject[];
|
|
90
|
+
}, c: Contract, dict: Dictionary): IntakeRecord & {
|
|
91
|
+
replays: JsonObject[];
|
|
92
|
+
};
|
|
93
|
+
/** Review by key across every intake record (9.5), and candidate facets proposed by recurrence. */
|
|
94
|
+
export declare function reviewByKey(intakes: {
|
|
95
|
+
for: string;
|
|
96
|
+
outcomes: IntakeOutcome[];
|
|
97
|
+
}[], recur?: number): {
|
|
98
|
+
"by-key": JsonObject[];
|
|
99
|
+
proposals: JsonObject[];
|
|
100
|
+
};
|
|
101
|
+
/** Receive a raw payload through a contract: every field gets exactly one outcome. The bytes are kept. */
|
|
102
|
+
export declare function receive(c: Contract, body: string, forRecord: string, dict: Dictionary, intakeId?: string): IntakeRecord;
|
|
103
|
+
/** Who a source is, for the trust order (11.3): a person, a contract, a party's domain, and its origin. */
|
|
104
|
+
export type Who = {
|
|
105
|
+
source: Source;
|
|
106
|
+
person?: boolean;
|
|
107
|
+
contract?: string;
|
|
108
|
+
};
|
|
109
|
+
/**
|
|
110
|
+
* Land an intake record's outcomes on a record. Absorbed and conflicting values go through the trust
|
|
111
|
+
* order: the winner is current, the loser is kept as an alternative. Equal values are agreement.
|
|
112
|
+
*/
|
|
113
|
+
export declare function land(r: Record, intake: {
|
|
114
|
+
outcomes: IntakeOutcome[];
|
|
115
|
+
contract?: string;
|
|
116
|
+
}, source: Source, trust?: string[], facetTrust?: Map<string, string[]>): Record;
|
|
117
|
+
export type PartMatch = {
|
|
118
|
+
parts: JsonObject[];
|
|
119
|
+
review: JsonObject[];
|
|
120
|
+
};
|
|
121
|
+
/** Bind incoming parts to existing ones: by the slot's match child, else review, else a new row. */
|
|
122
|
+
export declare function matchParts(r: Record, incoming: {
|
|
123
|
+
slot: string;
|
|
124
|
+
[k: string]: Json;
|
|
125
|
+
}[], dict: Dictionary): PartMatch;
|
|
126
|
+
export type Observation = JsonObject & {
|
|
127
|
+
obs: string;
|
|
128
|
+
on: string;
|
|
129
|
+
address: string;
|
|
130
|
+
supports: string;
|
|
131
|
+
};
|
|
132
|
+
/** Validate a value from observations: independent witnesses for and against, vetoes, and the state. */
|
|
133
|
+
export declare function validate(r: Record, address: string, observations: Observation[], confirmAt?: number, splitAt?: number): JsonObject;
|