@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.
Files changed (63) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +69 -2
  3. package/dist/bin/crubal.d.ts +2 -0
  4. package/dist/bin/crubal.js +37 -0
  5. package/dist/bin/crubal.js.map +1 -0
  6. package/dist/src/browser.d.ts +10 -0
  7. package/dist/src/browser.js +13 -0
  8. package/dist/src/browser.js.map +1 -0
  9. package/dist/src/canonical.d.ts +6 -0
  10. package/dist/src/canonical.js +47 -0
  11. package/dist/src/canonical.js.map +1 -0
  12. package/dist/src/conditions.d.ts +22 -0
  13. package/dist/src/conditions.js +175 -0
  14. package/dist/src/conditions.js.map +1 -0
  15. package/dist/src/corpus.d.ts +8 -0
  16. package/dist/src/corpus.js +673 -0
  17. package/dist/src/corpus.js.map +1 -0
  18. package/dist/src/defs.d.ts +116 -0
  19. package/dist/src/defs.js +530 -0
  20. package/dist/src/defs.js.map +1 -0
  21. package/dist/src/dictionary.d.ts +50 -0
  22. package/dist/src/dictionary.js +498 -0
  23. package/dist/src/dictionary.js.map +1 -0
  24. package/dist/src/exchange.d.ts +45 -0
  25. package/dist/src/exchange.js +321 -0
  26. package/dist/src/exchange.js.map +1 -0
  27. package/dist/src/index.d.ts +15 -0
  28. package/dist/src/index.js +17 -0
  29. package/dist/src/index.js.map +1 -0
  30. package/dist/src/lex.d.ts +21 -0
  31. package/dist/src/lex.js +142 -0
  32. package/dist/src/lex.js.map +1 -0
  33. package/dist/src/migrate.d.ts +88 -0
  34. package/dist/src/migrate.js +191 -0
  35. package/dist/src/migrate.js.map +1 -0
  36. package/dist/src/model.d.ts +36 -0
  37. package/dist/src/model.js +32 -0
  38. package/dist/src/model.js.map +1 -0
  39. package/dist/src/packages.d.ts +25 -0
  40. package/dist/src/packages.js +98 -0
  41. package/dist/src/packages.js.map +1 -0
  42. package/dist/src/print-text.d.ts +7 -0
  43. package/dist/src/print-text.js +194 -0
  44. package/dist/src/print-text.js.map +1 -0
  45. package/dist/src/read-text.d.ts +8 -0
  46. package/dist/src/read-text.js +317 -0
  47. package/dist/src/read-text.js.map +1 -0
  48. package/dist/src/rules.d.ts +64 -0
  49. package/dist/src/rules.js +486 -0
  50. package/dist/src/rules.js.map +1 -0
  51. package/dist/src/store.d.ts +133 -0
  52. package/dist/src/store.js +396 -0
  53. package/dist/src/store.js.map +1 -0
  54. package/dist/src/tree.d.ts +32 -0
  55. package/dist/src/tree.js +123 -0
  56. package/dist/src/tree.js.map +1 -0
  57. package/dist/src/units.d.ts +4 -0
  58. package/dist/src/units.js +37 -0
  59. package/dist/src/units.js.map +1 -0
  60. package/dist/src/views.d.ts +114 -0
  61. package/dist/src/views.js +436 -0
  62. package/dist/src/views.js.map +1 -0
  63. package/package.json +58 -4
@@ -0,0 +1,194 @@
1
+ // print-text.ts: the JSON form (spec chapter 3) back to canonical text (chapter 2.9). Full mode writes the
2
+ // envelope lines and sources, so reading the print gives the same pairs back.
3
+ import { blank } from "./defs.js";
4
+ import { writeText } from "./lex.js";
5
+ const isObj = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
6
+ /** Detail pairs whose values are already spelled for the text form. */
7
+ function detailText(pairs) {
8
+ if (!pairs.length)
9
+ return "";
10
+ return ` [${pairs.map(([k, v]) => `${k}: ${v}`).join(", ")}]`;
11
+ }
12
+ function sourcePairs(s) {
13
+ if (!s)
14
+ return [];
15
+ const out = [["origin", writeText(s.origin, true)], ["via", writeText(s.via, true)]];
16
+ if (s.owner)
17
+ out.push(["owner", writeText(s.owner, true)]);
18
+ return out;
19
+ }
20
+ const TEXT = blank("", "text");
21
+ /** Spellings that would read as another shape under this facet, so text holding them must be quoted. */
22
+ function otherShapes(f) {
23
+ const out = ["_", "-", "n/a", "N/A"];
24
+ if (f.type === "yes-no")
25
+ out.push("yes", "no", ...(f.words ?? []));
26
+ return out;
27
+ }
28
+ /** One scalar, as the text form spells it, without detail. */
29
+ function scalarText(f, v) {
30
+ if (typeof v === "boolean") {
31
+ const [yes, no] = f.words ?? ["yes", "no"];
32
+ return v ? yes : no;
33
+ }
34
+ if (typeof v === "string")
35
+ return writeText(v, false, otherShapes(f));
36
+ if (typeof v === "number")
37
+ return String(v);
38
+ if (isObj(v)) {
39
+ if ("$empty" in v)
40
+ return v.$empty === "unknown" ? "_" : "-";
41
+ if ("$link" in v)
42
+ return `&${v.$link}`;
43
+ if ("$qty" in v)
44
+ return `${v.$qty}${v.unit}`;
45
+ if ("$money" in v)
46
+ return `${v.$money}${v.currency}`;
47
+ if ("$image" in v)
48
+ return writeText(String(v.$image));
49
+ }
50
+ return JSON.stringify(v);
51
+ }
52
+ /** The detail pairs a value carries in itself: qualifiers and image fields. */
53
+ function ownDetail(v) {
54
+ if (!isObj(v))
55
+ return [];
56
+ if ("$value" in v) {
57
+ return Object.entries(v)
58
+ .filter(([k]) => k !== "$value")
59
+ .map(([k, q]) => [k, typeof q === "string" ? writeText(q, true) : scalarText(TEXT, q)]);
60
+ }
61
+ if ("$image" in v) {
62
+ return Object.entries(v)
63
+ .filter(([k]) => k !== "$image")
64
+ .map(([k, x]) => [k, typeof x === "string" ? writeText(x, true) : String(x)]);
65
+ }
66
+ return [];
67
+ }
68
+ function core(v) {
69
+ return isObj(v) && "$value" in v ? v.$value : v;
70
+ }
71
+ /** A list item's text form with its qualifiers and without its sources: the selector in an address. */
72
+ export function itemText(f, v) {
73
+ return scalarText(f, core(v)) + detailText(ownDetail(v));
74
+ }
75
+ function valueLine(f, v, address, out) {
76
+ const src = out.mode === "full" ? out.sources[address] : undefined;
77
+ return scalarText(f, core(v)) + detailText([...ownDetail(v), ...sourcePairs(src)]);
78
+ }
79
+ function printFields(obj, within, prefix, depth, out) {
80
+ const pad = " ".repeat(depth);
81
+ for (const [key, v] of Object.entries(obj)) {
82
+ const f = within ? within.get(key) : out.dict.facets.get(key);
83
+ const address = prefix ? `${prefix}.${key}` : key;
84
+ if (!f) {
85
+ const [first = "", ...more] = (typeof v === "string" ? v : JSON.stringify(v)).split("\n");
86
+ out.lines.push(first ? `${pad}${key}: ${first}` : `${pad}${key}:`);
87
+ for (const m of more)
88
+ out.lines.push(`${pad} ${m}`);
89
+ continue;
90
+ }
91
+ printValue(f, key, v, address, depth, out);
92
+ }
93
+ }
94
+ function printValue(f, key, v, address, depth, out) {
95
+ const pad = " ".repeat(depth);
96
+ if (isObj(v) && "$empty" in v) {
97
+ out.lines.push(`${pad}${key}: ${valueLine(f, v, address, out)}`);
98
+ return;
99
+ }
100
+ if (f.type === "compound") {
101
+ const children = f.children ?? new Map();
102
+ out.lines.push(`${pad}${key}:`);
103
+ if (!f.many || !Array.isArray(v)) {
104
+ if (isObj(v))
105
+ printFields(v, children, address, depth + 1, out);
106
+ return;
107
+ }
108
+ for (const row of v) {
109
+ if (!isObj(row))
110
+ continue;
111
+ const rowKey = f.identity ? linkTarget(row[f.identity]) : String(row.$row ?? "");
112
+ const fields = {};
113
+ if (f.identity && row[f.identity] !== undefined)
114
+ fields[f.identity] = row[f.identity];
115
+ for (const [k, x] of Object.entries(row))
116
+ if (k !== "$row" && !(k in fields))
117
+ fields[k] = x;
118
+ const start = out.lines.length;
119
+ if (!f.identity)
120
+ out.lines.push(`${pad} - [row: ${rowKey}]`);
121
+ printFields(fields, children, `${address}[${rowKey}]`, depth + 2, out);
122
+ if (f.identity) {
123
+ const first = out.lines[start];
124
+ if (first !== undefined)
125
+ out.lines[start] = `${pad} - ${first.trimStart()}`;
126
+ }
127
+ }
128
+ return;
129
+ }
130
+ if (!f.many || !Array.isArray(v)) {
131
+ out.lines.push(`${pad}${key}: ${valueLine(f, v, address, out)}`);
132
+ return;
133
+ }
134
+ const items = v.map((item) => {
135
+ const src = out.mode === "full" ? out.sources[`${key}[${JSON.stringify(itemText(f, item))}]`] : undefined;
136
+ return scalarText(f, core(item)) + detailText([...ownDetail(item), ...sourcePairs(src)]);
137
+ });
138
+ const short = `${pad}${key}: ${items.join(", ")}`;
139
+ if (short.length <= 100 && items.every((i) => !i.includes("\n"))) {
140
+ out.lines.push(short);
141
+ return;
142
+ }
143
+ out.lines.push(`${pad}${key}:`);
144
+ for (const item of items)
145
+ out.lines.push(`${pad} - ${item}`);
146
+ }
147
+ function linkTarget(v) {
148
+ return isObj(v) && "$link" in v ? String(v.$link) : String(v ?? "");
149
+ }
150
+ function printRecord(r, fileOwner, out) {
151
+ const sources = r.sources ?? {};
152
+ out.sources = sources;
153
+ const star = out.mode === "full" ? detailText(sourcePairs(sources["*"])) : "";
154
+ out.lines.push(`${r.level}: ${r.id}${r.of ? ` of ${r.of}` : ""}${star}`);
155
+ if (r.owner !== fileOwner)
156
+ out.lines.push(` crubal:owner: ${r.owner}`);
157
+ if (r.wears?.length)
158
+ out.lines.push(` crubal:wears: ${r.wears.join(", ")}`);
159
+ if (out.mode === "full" && r.created)
160
+ out.lines.push(` crubal:created: ${r.created}`);
161
+ if (out.mode === "full" && r.updated)
162
+ out.lines.push(` crubal:updated: ${r.updated}`);
163
+ printFields(r.values, null, "", 1, out);
164
+ if (r.parts?.length) {
165
+ out.lines.push(" crubal:parts:");
166
+ for (const part of r.parts) {
167
+ if (!isObj(part))
168
+ continue;
169
+ out.lines.push(` - [row: ${part.$row}]`);
170
+ const wears = part.wears;
171
+ if (Array.isArray(wears) && wears.length)
172
+ out.lines.push(` crubal:wears: ${wears.join(", ")}`);
173
+ if (isObj(part.values))
174
+ printFields(part.values, null, `parts[${part.$row}]`, 3, out);
175
+ }
176
+ }
177
+ }
178
+ /** Print a wrapper as text. */
179
+ export function printText(w, dict, mode = "full") {
180
+ const out = { lines: [], sources: {}, mode, dict };
181
+ const owners = w.records.map((r) => r.owner);
182
+ const fileOwner = owners[0];
183
+ out.lines.push(`crubal: ${w.crubal}`);
184
+ if (w.package)
185
+ out.lines.push(`package: ${w.package}`);
186
+ if (fileOwner)
187
+ out.lines.push(`owner: ${fileOwner}`);
188
+ for (const r of w.records) {
189
+ out.lines.push("");
190
+ printRecord(r, fileOwner, out);
191
+ }
192
+ return `${out.lines.join("\n")}\n`;
193
+ }
194
+ //# sourceMappingURL=print-text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"print-text.js","sourceRoot":"","sources":["../../src/print-text.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Dictionary, Facet } from "./defs.ts";
2
+ import { writeText } from "./lex.ts";
3
+ import { type Json, type Wrapper } from "./model.ts";
4
+ /** Read CRUBAL data text into a border wrapper (spec chapter 3.8). */
5
+ export declare function readText(source: string, dict: Dictionary): Wrapper;
6
+ export { writeText };
7
+ /** Read one value's text under a facet, as if it had been written on that facet's line. */
8
+ export declare function readUnder(f: Facet, text: string, dict: Dictionary, line?: number): Json | undefined;
@@ -0,0 +1,317 @@
1
+ // read-text.ts: CRUBAL data text (spec chapter 2) into the JSON form (chapter 3). The facet decides each
2
+ // value's shape (chapter 1.4); a key without a facet keeps its exact text as a raw value.
3
+ import { readList, readPiece, writeText } from "./lex.js";
4
+ import { CrubalError, innerText, readTree } from "./tree.js";
5
+ import {} from "./model.js";
6
+ import { itemText } from "./print-text.js";
7
+ const RESERVED_DETAIL = new Set(["row", "origin", "via", "owner"]);
8
+ const IMAGE_FIELDS = new Set(["sha256", "w", "h", "type"]);
9
+ const ENVELOPE = new Set(["crubal:wears", "crubal:parts", "crubal:kind", "crubal:owner", "crubal:created", "crubal:updated"]);
10
+ const NUMBER = /^-?(0|[1-9]\d*)(\.\d+)?$/;
11
+ const ORIGINS = new Set(["observed", "declared", "derived", "reported"]);
12
+ function sourceOf(detail, line) {
13
+ const get = (n) => detail.find(([k]) => k === n)?.[1].text;
14
+ const origin = get("origin");
15
+ const via = get("via");
16
+ const owner = get("owner");
17
+ if (origin === undefined && via === undefined && owner === undefined)
18
+ return null;
19
+ if (!origin || !via)
20
+ throw new CrubalError("a source needs both origin and via", line);
21
+ if (!ORIGINS.has(origin))
22
+ throw new CrubalError(`unknown origin ${origin}`, line);
23
+ const s = { origin, via };
24
+ if (owner)
25
+ s.owner = owner;
26
+ return s;
27
+ }
28
+ function isEmptyMark(p) {
29
+ if (p.quoted)
30
+ return null;
31
+ if (p.text === "_")
32
+ return "unknown";
33
+ if (p.text === "-" || p.text === "n/a" || p.text === "N/A")
34
+ return "n/a";
35
+ return null;
36
+ }
37
+ /** Read one scalar piece under its facet: the shape the facet decides, falling back to text. */
38
+ function scalar(f, p) {
39
+ const t = p.text;
40
+ switch (f.type) {
41
+ case "link":
42
+ return !p.quoted && t.startsWith("&") ? { $link: t.slice(1) } : t;
43
+ case "number": {
44
+ const unit = f.unit;
45
+ if (!unit)
46
+ return NUMBER.test(t) ? t : t;
47
+ const m = t.match(/^(-?(?:0|[1-9]\d*)(?:\.\d+)?) ?(\S+)$/);
48
+ if (m && (unit === "currency" || /^[A-Z]{3}$/.test(unit)) && /^[A-Z]{3}$/.test(m[2] ?? "")) {
49
+ return { $money: m[1], currency: m[2] };
50
+ }
51
+ if (m)
52
+ return { $qty: m[1], unit: m[2] };
53
+ return t;
54
+ }
55
+ case "yes-no": {
56
+ const [yes, no] = f.words ?? ["yes", "no"];
57
+ if (!p.quoted && (t === "yes" || t === yes))
58
+ return true;
59
+ if (!p.quoted && (t === "no" || t === no))
60
+ return false;
61
+ return t;
62
+ }
63
+ case "image":
64
+ return { $image: t };
65
+ default:
66
+ return t;
67
+ }
68
+ }
69
+ /** A value with its detail: image fields, qualifiers (a `$value` wrapper), and its source. */
70
+ function value(f, p, ctx, address, line) {
71
+ let v = scalar(f, p);
72
+ const qualifiers = {};
73
+ for (const [name, d] of p.detail) {
74
+ if (name === "row")
75
+ throw new CrubalError("a row key belongs on the row's own line", line);
76
+ if (RESERVED_DETAIL.has(name))
77
+ continue;
78
+ if (f.type === "image" && IMAGE_FIELDS.has(name) && typeof v === "object" && v && "$image" in v) {
79
+ v[name] = name === "w" || name === "h" ? Number(d.text) : d.text;
80
+ continue;
81
+ }
82
+ const qf = ctx.dict.facets.get(name);
83
+ qualifiers[name] = qf ? scalar(qf, d) : d.text;
84
+ }
85
+ if (Object.keys(qualifiers).length)
86
+ v = { $value: v, ...qualifiers };
87
+ const src = sourceOf(p.detail, line);
88
+ if (src) {
89
+ const at = address ?? "";
90
+ ctx.sources[at] = src;
91
+ }
92
+ return v;
93
+ }
94
+ function addressItem(key, f, item) {
95
+ return `${key}[${JSON.stringify(itemText(f, item))}]`;
96
+ }
97
+ /** Read a facet's value from its node: one value, a list, or a compound. */
98
+ function readValue(f, node, ctx, address) {
99
+ const raw = node.value;
100
+ // An empty is the whole value (chapter 1.5).
101
+ if (raw && node.children.length === 0 && /^(_|-|n\/a|N\/A)( \[.*\])?$/.test(raw.trim())) {
102
+ const whole = readPiece(raw, node.line);
103
+ const empty = isEmptyMark(whole);
104
+ if (empty) {
105
+ const src = sourceOf(whole.detail, node.line);
106
+ if (src)
107
+ ctx.sources[address] = src;
108
+ return { $empty: empty };
109
+ }
110
+ }
111
+ if (f.type === "compound")
112
+ return readCompound(f, node, ctx, address);
113
+ if (!f.many) {
114
+ if (!raw)
115
+ return undefined;
116
+ return value(f, readPiece(raw, node.line), ctx, address, node.line);
117
+ }
118
+ const pieces = raw
119
+ ? readList(raw, node.line).map((p) => ({ p, line: node.line }))
120
+ : node.children.map((c) => {
121
+ if (c.kind !== "item")
122
+ throw new CrubalError("a list's lines start with \"- \"", c.line);
123
+ return { p: readPiece(c.value, c.line), line: c.line };
124
+ });
125
+ const out = [];
126
+ for (const { p, line } of pieces) {
127
+ if (isEmptyMark(p) || (!p.quoted && p.text === ""))
128
+ throw new CrubalError("an empty can't be a list item", line);
129
+ const tmp = { dict: ctx.dict, sources: {} };
130
+ const v = value(f, p, tmp, "", line);
131
+ out.push(v);
132
+ if (tmp.sources[""])
133
+ ctx.sources[addressItem(f.key, f, v)] = tmp.sources[""];
134
+ }
135
+ return out.length ? out : undefined;
136
+ }
137
+ function readFields(children, within, ctx, prefix) {
138
+ const obj = {};
139
+ const seen = new Set();
140
+ for (const c of children) {
141
+ if (c.kind !== "pair" || !c.key)
142
+ throw new CrubalError(`expected "key: value": ${c.text}`, c.line);
143
+ if (seen.has(c.key))
144
+ throw new CrubalError(`the key ${c.key} twice`, c.line);
145
+ seen.add(c.key);
146
+ const f = within ? within.get(c.key) : ctx.dict.facets.get(c.key);
147
+ const address = prefix ? `${prefix}.${c.key}` : c.key;
148
+ if (!f) {
149
+ obj[c.key] = c.children.length ? `${c.value}\n${innerText(c)}` : c.value;
150
+ continue;
151
+ }
152
+ const v = readValue(f, c, ctx, address);
153
+ if (v !== undefined)
154
+ obj[c.key] = v;
155
+ }
156
+ return obj;
157
+ }
158
+ function rowKeyOf(item) {
159
+ if (!item.value)
160
+ return { key: null, rest: item.children };
161
+ const p = readPiece(item.value, item.line);
162
+ if (p.text !== "")
163
+ throw new CrubalError(`a row starts with "[row: key]" or its first pair: ${item.value}`, item.line);
164
+ const row = p.detail.find(([k]) => k === "row");
165
+ if (!row || p.detail.length !== 1)
166
+ throw new CrubalError("a row's own line holds only [row: key]", item.line);
167
+ return { key: row[1].text, rest: item.children };
168
+ }
169
+ function readCompound(f, node, ctx, address) {
170
+ const children = f.children ?? new Map();
171
+ if (!f.many)
172
+ return readFields(node.children, children, ctx, address);
173
+ const rows = [];
174
+ const keys = new Set();
175
+ for (const item of node.children) {
176
+ if (item.kind !== "item")
177
+ throw new CrubalError("a compound's rows start with \"- \"", item.line);
178
+ const { key: written, rest } = rowKeyOf(item);
179
+ if (written && f.identity) {
180
+ throw new CrubalError(`a row key on ${f.key}, whose row keys come from ${f.identity}`, item.line);
181
+ }
182
+ let key = written;
183
+ if (f.identity) {
184
+ const idNode = rest.find((c) => c.key === f.identity);
185
+ const target = idNode?.value.trim();
186
+ if (!target?.startsWith("&"))
187
+ throw new CrubalError(`a row of ${f.key} needs its ${f.identity}`, item.line);
188
+ key = target.slice(1);
189
+ }
190
+ if (!key)
191
+ throw new CrubalError(`a row of ${f.key} needs [row: key]`, item.line);
192
+ if (keys.has(key))
193
+ throw new CrubalError(`the row key ${key} twice in one list`, item.line);
194
+ keys.add(key);
195
+ const row = readFields(rest, children, ctx, `${address}[${key}]`);
196
+ rows.push(f.identity ? row : { $row: key, ...row });
197
+ }
198
+ return rows.length ? rows : undefined;
199
+ }
200
+ function readParts(node, ctx) {
201
+ const parts = [];
202
+ const keys = new Set();
203
+ for (const item of node.children) {
204
+ if (item.kind !== "item")
205
+ throw new CrubalError("parts are list items", item.line);
206
+ const { key, rest } = rowKeyOf(item);
207
+ if (!key)
208
+ throw new CrubalError("every part needs [row: key]", item.line);
209
+ if (keys.has(key))
210
+ throw new CrubalError(`the row key ${key} twice in one list`, item.line);
211
+ keys.add(key);
212
+ const wearsNode = rest.find((c) => c.key === "crubal:wears");
213
+ const values = readFields(rest.filter((c) => c !== wearsNode), null, ctx, `parts[${key}]`);
214
+ const part = { $row: key };
215
+ if (wearsNode)
216
+ part.wears = readList(wearsNode.value, wearsNode.line).map((p) => p.text);
217
+ part.values = values;
218
+ parts.push(part);
219
+ }
220
+ return parts;
221
+ }
222
+ /** Read CRUBAL data text into a border wrapper (spec chapter 3.8). */
223
+ export function readText(source, dict) {
224
+ const nodes = readTree(source);
225
+ const wrapper = { crubal: "2", records: [] };
226
+ let owner;
227
+ for (const node of nodes) {
228
+ if (node.kind !== "pair" || !node.key)
229
+ throw new CrubalError(`unexpected line: ${node.text}`, node.line);
230
+ if (node.key === "crubal") {
231
+ wrapper.crubal = node.value;
232
+ continue;
233
+ }
234
+ if (node.key === "package") {
235
+ wrapper.package = node.value;
236
+ continue;
237
+ }
238
+ if (node.key === "owner") {
239
+ owner = node.value;
240
+ continue;
241
+ }
242
+ const kind = dict.levels.get(node.key);
243
+ if (!kind)
244
+ throw new CrubalError(`an unknown top-level key ${node.key}`, node.line);
245
+ wrapper.records.push(readRecord(node, kind, owner));
246
+ }
247
+ return wrapper;
248
+ function readRecord(node, kind, fileOwner) {
249
+ const head = readPiece(node.value, node.line);
250
+ const m = head.text.match(/^(\S+)(?: of (\S+))?$/);
251
+ if (!m)
252
+ throw new CrubalError(`a record header is "level: id" or "level: id of parent": ${node.value}`, node.line);
253
+ const ctx = { dict, sources: {} };
254
+ const star = sourceOf(head.detail, node.line);
255
+ if (star)
256
+ ctx.sources["*"] = star;
257
+ const rec = { id: m[1], kind, level: node.key, owner: fileOwner ?? "", values: {} };
258
+ if (m[2])
259
+ rec.of = m[2];
260
+ const seen = new Set();
261
+ const valueNodes = [];
262
+ for (const c of node.children) {
263
+ if (c.kind !== "pair" || !c.key)
264
+ throw new CrubalError(`expected "key: value": ${c.text}`, c.line);
265
+ if (seen.has(c.key))
266
+ throw new CrubalError(`the key ${c.key} twice in one record`, c.line);
267
+ seen.add(c.key);
268
+ if (!ENVELOPE.has(c.key)) {
269
+ valueNodes.push(c);
270
+ continue;
271
+ }
272
+ if (c.key === "crubal:wears")
273
+ rec.wears = readList(c.value, c.line).map((p) => p.text);
274
+ else if (c.key === "crubal:parts")
275
+ rec.parts = readParts(c, ctx);
276
+ else if (c.key === "crubal:owner")
277
+ rec.owner = c.value;
278
+ else if (c.key === "crubal:created")
279
+ rec.created = c.value;
280
+ else if (c.key === "crubal:updated")
281
+ rec.updated = c.value;
282
+ else if (c.key === "crubal:kind" && c.value !== kind) {
283
+ throw new CrubalError(`crubal:kind ${c.value} disagrees with the level's kind ${kind}`, c.line);
284
+ }
285
+ }
286
+ rec.values = readFields(valueNodes, null, ctx, "");
287
+ if (Object.keys(ctx.sources).length)
288
+ rec.sources = ctx.sources;
289
+ return orderRecord(rec);
290
+ }
291
+ }
292
+ /** Members in the order chapter 3.2 lists them, so output reads the same every time. */
293
+ function orderRecord(r) {
294
+ const o = { id: r.id, kind: r.kind, level: r.level };
295
+ if (r.of)
296
+ o.of = r.of;
297
+ o.owner = r.owner;
298
+ if (r.wears)
299
+ o.wears = r.wears;
300
+ if (r.created)
301
+ o.created = r.created;
302
+ if (r.updated)
303
+ o.updated = r.updated;
304
+ o.values = r.values;
305
+ if (r.parts)
306
+ o.parts = r.parts;
307
+ if (r.sources)
308
+ o.sources = r.sources;
309
+ return o;
310
+ }
311
+ export { writeText };
312
+ /** Read one value's text under a facet, as if it had been written on that facet's line. */
313
+ export function readUnder(f, text, dict, line = 0) {
314
+ const node = { kind: "pair", key: f.key, value: text, text, line, indent: 0, children: [] };
315
+ return readValue(f, node, { dict, sources: {} }, f.key);
316
+ }
317
+ //# sourceMappingURL=read-text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-text.js","sourceRoot":"","sources":["../../src/read-text.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ import { type Expr } from "./conditions.ts";
2
+ import type { Dictionary, Facet } from "./defs.ts";
3
+ import type { Json, JsonObject, Record } from "./model.ts";
4
+ export type Strength = "must" | "should" | "suggest";
5
+ export type Rule = {
6
+ name: string;
7
+ line: number;
8
+ for: string;
9
+ when: Expr | null;
10
+ whenText: string;
11
+ thenText: string;
12
+ then: Expr | null;
13
+ strength: Strength;
14
+ because?: string;
15
+ /** A production: `key is <value | template | aggregate>`. */
16
+ produces?: {
17
+ key: string;
18
+ kind: "fill" | "template" | "rollup";
19
+ right: string;
20
+ };
21
+ /** Where it came from when it was expanded from a shortcut. */
22
+ shortcut?: boolean;
23
+ };
24
+ /** Read `rule:` blocks from definition text. */
25
+ export declare function readRules(source: string): Rule[];
26
+ /** The rules a facet's shortcut settings expand to (4.4). */
27
+ export declare function shortcutRules(dict: Dictionary): Rule[];
28
+ /** Check a rule set (6.8). Throws the first problem. */
29
+ export declare function checkRules(rules: Rule[], dict: Dictionary): void;
30
+ export type Result = {
31
+ record: string;
32
+ result: string;
33
+ address?: string;
34
+ value?: Json;
35
+ rule?: string;
36
+ };
37
+ export declare class Engine {
38
+ readonly dict: Dictionary;
39
+ readonly rules: Rule[];
40
+ private store;
41
+ private order;
42
+ constructor(dict: Dictionary, rules: Rule[]);
43
+ /** The values a record reads: its own over everything above it (1.7). */
44
+ effective(rec: Record): JsonObject;
45
+ private applies;
46
+ /** Where a produced key may be stored: the top of its chain, or a level where it varies. */
47
+ private storesAt;
48
+ private states;
49
+ /** A path a check tests, for reporting. */
50
+ private pathOf;
51
+ private uniqueClash;
52
+ /** Write a record (a create, or values merged onto one already stored). Returns its results. */
53
+ write(incoming: Record): Result[];
54
+ private layered;
55
+ /** A value's plain text in a template: the value itself, never quoted, without detail. */
56
+ private text;
57
+ /** A template (6.4.1): `{a}`, `{a ?? b}`, `{a?}`, `{{`, `}}`. Nothing when a needed value is empty. */
58
+ template(right: string, vals: JsonObject): string | undefined;
59
+ /** A rollup over parts: `worst of parts[*].condition`. */
60
+ rollup(right: string, rec: Record): Json | undefined;
61
+ /** Completeness (6.9): asked facets with a value ÷ asked facets, per record and per part. */
62
+ completeness(rec: Record): Result[];
63
+ }
64
+ export type { Facet };