@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,321 @@
1
+ // exchange.ts: the Exchange level (spec chapters 7, 9 at borders, 11). Contracts are checked at publish
2
+ // (7.10) and run in seven steps (7.4): trigger and permission, needs, map out, act, map back, rules,
3
+ // record. Runs are idempotent (7.5). Offer and take share between owners, and only the overlap flows
4
+ // (7.8). Data crossing a border is verified against the presenter's published key (8.5.1).
5
+ import { serialize } from "./canonical.js";
6
+ import { evaluate, parseCondition } from "./conditions.js";
7
+ import { fieldPath, land, receive, sha256, verifyChain } from "./store.js";
8
+ import { CrubalError, readTree } from "./tree.js";
9
+ const isObj = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
10
+ export function readRoles(source) {
11
+ const out = [];
12
+ for (const node of readTree(source)) {
13
+ if (node.kind !== "pair" || node.key !== "role")
14
+ continue;
15
+ const role = { name: node.value.trim(), audience: "member", may: {}, line: node.line };
16
+ for (const c of node.children) {
17
+ if (c.key === "audience")
18
+ role.audience = c.value;
19
+ if (c.key === "may")
20
+ for (const g of c.children)
21
+ if (g.key)
22
+ role.may[g.key] = g.value.split(",").map((s) => s.trim());
23
+ }
24
+ out.push(role);
25
+ }
26
+ return out;
27
+ }
28
+ /** What a caller is, for `who` (7.6): its values, the classes it wears, and its roles' grants. */
29
+ function callerStates(caller, roles) {
30
+ return (path) => {
31
+ const s = new Set();
32
+ if (path !== "caller" || !caller)
33
+ return s;
34
+ for (const w of caller.wears ?? [])
35
+ s.add(`wears:${w}`);
36
+ const held = caller.values.roles;
37
+ const names = (Array.isArray(held) ? held : held ? [held] : []).map((r) => (isObj(r) && "$link" in r ? String(r.$link) : String(r)));
38
+ for (const r of roles.filter((x) => names.includes(x.name))) {
39
+ for (const [verb, targets] of Object.entries(r.may))
40
+ for (const t of targets)
41
+ s.add(`may:${verb} ${t}`);
42
+ }
43
+ return s;
44
+ };
45
+ }
46
+ // ─── Publish checks (7.10) ───────────────────────────────────────────────────
47
+ const PARTS = {
48
+ send: ["needs", "gives", "writes", "reads", "when", "who", "auth", "scope", "credential", "retry", "undo", "for", "label", "describe", "version"],
49
+ receive: ["needs", "gives", "reads", "when", "who", "origin", "lands", "evidence", "absorb", "ignore", "keep-raw", "prefix", "auth", "scope", "credential", "retry", "undo", "for", "label", "describe", "version"],
50
+ store: ["needs", "stores", "when", "who", "for", "label", "describe", "version"],
51
+ form: ["needs", "gives", "writes", "reads", "when", "who", "origin", "lands", "for", "label", "describe", "version"],
52
+ offer: ["needs", "gives", "to", "mode", "terms", "for", "when", "who", "label", "describe", "version"],
53
+ take: ["needs", "from", "reads", "mode", "lands", "origin", "absorb", "ignore", "keep-raw", "prefix", "when", "who", "for", "label", "describe", "version"],
54
+ };
55
+ function ourKey(address) {
56
+ return address.replace(/^\w+::/, "").split(/[.[]/)[0];
57
+ }
58
+ /** Check contracts against a dictionary (7.10). Throws the first problem. */
59
+ export function checkContracts(contracts, dict, ownPrefix = "") {
60
+ const names = new Set(contracts.map((c) => c.name));
61
+ for (const c of contracts) {
62
+ const allowed = PARTS[c.kind];
63
+ if (!allowed)
64
+ throw new CrubalError(`unknown contract kind ${c.kind}`, c.line);
65
+ for (const [part, line] of Object.entries(c.partLines)) {
66
+ if (part === "kind" || part.includes(":"))
67
+ continue;
68
+ if (!allowed.includes(part))
69
+ throw new CrubalError(`a ${c.kind} contract has no part ${part}`, line);
70
+ }
71
+ for (const l of c.needs)
72
+ if (!dict.facets.has(l.facet))
73
+ throw new CrubalError(`${l.facet} is not a defined facet`, l.line);
74
+ const sides = [
75
+ ...c.writes.filter((m) => !m.from.startsWith('"')).map((m) => ({ address: m.from, line: m.line, values: m.values.map(([ours]) => ours), valueLines: m.valueLines, mayBeUnknown: false })),
76
+ ...c.reads.map((m) => ({ address: m.to, line: m.line, values: m.values.map(([, ours]) => ours), valueLines: m.valueLines, mayBeUnknown: true })),
77
+ ];
78
+ for (const s of sides) {
79
+ const key = ourKey(s.address);
80
+ const f = dict.facets.get(key);
81
+ const foreign = key.includes(":") && !(ownPrefix && key.startsWith(`${ownPrefix}:`));
82
+ if (!f) {
83
+ if (s.mayBeUnknown && foreign)
84
+ continue;
85
+ throw new CrubalError(`${key} is not a defined facet`, s.line);
86
+ }
87
+ s.values.forEach((v, i) => {
88
+ if (f.type !== "choice" || v === "-")
89
+ return;
90
+ if ((f.values ?? []).some((x) => x.value === v))
91
+ return;
92
+ const of = (f.values ?? []).find((x) => x.aliases.includes(v));
93
+ throw new CrubalError(of ? `${v} is an alias of ${of.value}; a value map must name the real value` : `${v} is not a value of ${key}`, s.valueLines[i] ?? s.line);
94
+ });
95
+ }
96
+ for (const cond of [c.who, c.when])
97
+ if (cond && cond !== "asked")
98
+ parseCondition(cond, c.line);
99
+ if (c.undo && !names.has(c.undo))
100
+ throw new CrubalError(`${c.name}'s undo names ${c.undo}, which isn't a contract here`, c.partLines.undo);
101
+ const cred = c.parts.credential;
102
+ if (cred && /[^A-Za-z0-9._-]/.test(cred))
103
+ throw new CrubalError(`${c.name}'s credential must be a name, never a secret`, c.partLines.credential);
104
+ }
105
+ }
106
+ /** The plain text a value is sent as: an amount for money and quantities, a target for links. */
107
+ function wire(v) {
108
+ if (isObj(v)) {
109
+ if ("$value" in v)
110
+ return wire(v.$value);
111
+ if ("$money" in v)
112
+ return String(v.$money);
113
+ if ("$qty" in v)
114
+ return String(v.$qty);
115
+ if ("$link" in v)
116
+ return String(v.$link);
117
+ if ("$image" in v)
118
+ return String(v.$image);
119
+ if ("$empty" in v)
120
+ return "";
121
+ }
122
+ if (Array.isArray(v))
123
+ return v.map(wire);
124
+ return v;
125
+ }
126
+ function put(payload, path, value) {
127
+ const names = fieldPath(path);
128
+ let at = payload;
129
+ names.slice(0, -1).forEach((n) => {
130
+ if (!isObj(at[n]))
131
+ at[n] = {};
132
+ at = at[n];
133
+ });
134
+ at[names.at(-1)] = value;
135
+ }
136
+ export class Exchange {
137
+ dict;
138
+ contracts;
139
+ roles;
140
+ records = new Map();
141
+ sent = new Set();
142
+ runs = 0;
143
+ constructor(dict, contracts, roles = []) {
144
+ this.dict = dict;
145
+ this.contracts = new Map(contracts.map((c) => [c.name, c]));
146
+ this.roles = roles;
147
+ }
148
+ put(r) {
149
+ this.records.set(r.id, r);
150
+ }
151
+ get(id) {
152
+ return this.records.get(id);
153
+ }
154
+ /** A record's values with everything above it read through (1.7). */
155
+ effective(r) {
156
+ const up = r.of ? this.records.get(r.of) : undefined;
157
+ return { ...(up ? this.effective(up) : {}), ...r.values };
158
+ }
159
+ /** The value an address names from a record, with a level prefix reading that level. */
160
+ read(r, address) {
161
+ const m = address.match(/^(\w+)::(.+)$/);
162
+ // A level prefix reads the record at that level: the run's record itself, when it sits there.
163
+ if (m)
164
+ return r.level === m[1] ? this.effective(r)[m[2]] : undefined;
165
+ return this.effective(r)[address];
166
+ }
167
+ nextLog() {
168
+ this.runs += 1;
169
+ return `L-R${this.runs}`;
170
+ }
171
+ /** Steps 1–4 of a send (or form) contract: permission, needs, map out, act once. */
172
+ run(name, recordId, callerId) {
173
+ const c = this.contracts.get(name);
174
+ if (!c)
175
+ throw new Error(`no contract ${name}`);
176
+ const r = this.records.get(recordId);
177
+ if (!r)
178
+ throw new Error(`no record ${recordId}`);
179
+ const head = { contract: name, record: recordId, ...(callerId ? { caller: callerId } : {}) };
180
+ const log = this.nextLog();
181
+ // 1. Trigger and permission.
182
+ if (c.who) {
183
+ const caller = callerId ? this.records.get(callerId) : undefined;
184
+ const ok = evaluate(parseCondition(c.who), caller ? { ...caller.values } : {}, callerStates(caller, this.roles));
185
+ if (ok !== true)
186
+ return { ...head, stopped: "who" };
187
+ }
188
+ // 2. Needs: an unnamed class over the record.
189
+ const missing = [];
190
+ const unfit = [];
191
+ for (const l of this.needsOf(c)) {
192
+ const v = this.read(r, l.level ? `${l.level}::${l.facet}` : l.facet);
193
+ const empty = v === undefined || (isObj(v) && "$empty" in v);
194
+ if (l.required && empty)
195
+ missing.push(l.facet);
196
+ if (!empty && l.values && typeof v === "string" && !l.values.includes(v))
197
+ unfit.push(l.facet);
198
+ if (!empty && l.length !== undefined && typeof v === "string" && [...v].length > l.length)
199
+ unfit.push(l.facet);
200
+ }
201
+ if (missing.length || unfit.length)
202
+ return { ...head, stopped: "needs", ...(missing.length ? { missing } : {}), ...(unfit.length ? { unfit } : {}) };
203
+ if (c.kind === "receive" || c.kind === "take")
204
+ return { ...head, ready: true, log };
205
+ // 3. Map out.
206
+ const payload = {};
207
+ for (const m of c.writes) {
208
+ if (m.from.startsWith('"')) {
209
+ put(payload, m.to, JSON.parse(m.from));
210
+ continue;
211
+ }
212
+ const v = this.read(r, m.from);
213
+ if (v === undefined)
214
+ continue;
215
+ const mapped = typeof v === "string" ? (m.values.find(([ours]) => ours === v)?.[1] ?? v) : v;
216
+ put(payload, m.to, wire(mapped));
217
+ }
218
+ // 4. Act, at most once per contract, record and payload.
219
+ const key = `${name}|${recordId}|${sha256(serialize(payload))}`;
220
+ if (this.sent.has(key))
221
+ return { ...head, acted: false, reason: "the same payload was already sent" };
222
+ this.sent.add(key);
223
+ return { ...head, acted: true, payload, key, log };
224
+ }
225
+ needsOf(c) {
226
+ return c.needs;
227
+ }
228
+ /** Steps 5–6 for a receive contract: map the answer back, compare with the record, and land it. */
229
+ receiveRun(name, recordId, body) {
230
+ const c = this.contracts.get(name);
231
+ const r = this.records.get(recordId);
232
+ if (!c || !r)
233
+ throw new Error(`no contract ${name} or record ${recordId}`);
234
+ const log = this.nextLog();
235
+ const intake = receive(c, body, recordId, this.dict, `I-${log.slice(2)}`);
236
+ const outcomes = intake.outcomes.map((o) => {
237
+ if (o.outcome !== "absorbed" || !o.to)
238
+ return o;
239
+ const current = r.values[o.to];
240
+ if (current === undefined || (isObj(current) && "$empty" in current))
241
+ return o;
242
+ return serialize(current) === serialize(o.value) ? o : { ...o, outcome: "conflict" };
243
+ });
244
+ const source = { origin: c.origin, via: log };
245
+ if (c.lands === "suggestion")
246
+ this.put(suggest(r, outcomes, source));
247
+ else
248
+ this.put(land(r, { outcomes, contract: name }, source, this.dict.trust, this.dict.facetTrust));
249
+ return { contract: name, record: recordId, outcomes: outcomes, sources: { origin: c.origin }, log };
250
+ }
251
+ /** Offer and take (7.8): only what the offer gives and the take reads flows. */
252
+ take(takeName, offerName, recordId, presenter) {
253
+ const t = this.contracts.get(takeName);
254
+ const o = this.contracts.get(offerName);
255
+ const r = this.records.get(recordId);
256
+ if (!t || !o || !r)
257
+ throw new Error("a take needs its take contract, the offer and the record");
258
+ if (t.from && t.from !== presenter.owner)
259
+ return { contract: takeName, record: recordId, stopped: "from" };
260
+ const log = this.nextLog();
261
+ const values = { ...r.values };
262
+ const sources = { ...(r.sources ?? {}) };
263
+ const alternatives = { ...(r.alternatives ?? {}) };
264
+ const flows = [];
265
+ for (const m of t.reads) {
266
+ const theirs = m.from;
267
+ if (!o.gives.includes(theirs))
268
+ continue; // not offered: doesn't flow
269
+ const v = presenter.values[theirs];
270
+ if (v === undefined)
271
+ continue;
272
+ flows.push(theirs);
273
+ const theirSource = presenter.sources?.[theirs] ?? presenter.sources?.["*"];
274
+ const src = { origin: theirSource?.origin ?? "reported", via: log, owner: presenter.owner };
275
+ const current = values[m.to];
276
+ if (current === undefined || (isObj(current) && "$empty" in current)) {
277
+ values[m.to] = v;
278
+ sources[m.to] = src;
279
+ }
280
+ else if (serialize(current) !== serialize(v)) {
281
+ // A presenter never overrides the consumer's value unless the consumer took controlled terms.
282
+ alternatives[m.to] = [...(alternatives[m.to] ?? []), { value: v, origin: src.origin, via: log, owner: presenter.owner }];
283
+ }
284
+ }
285
+ const next = { ...r, values, sources, ...(Object.keys(alternatives).length ? { alternatives } : {}) };
286
+ this.put(next);
287
+ return { contract: takeName, record: recordId, flows, log };
288
+ }
289
+ }
290
+ function suggest(r, outcomes, source) {
291
+ const s = { ...(r.suggestions ?? {}) };
292
+ for (const o of outcomes) {
293
+ if (!o.to || o.value === undefined || o.outcome === "unknown" || o.outcome === "ignored" || o.outcome === "contradiction")
294
+ continue;
295
+ s[o.to] = [...(s[o.to] ?? []), { value: o.value, origin: source.origin, via: source.via }];
296
+ }
297
+ return { ...r, suggestions: s };
298
+ }
299
+ // ─── Borders (8.5.1) ─────────────────────────────────────────────────────────
300
+ /** Verify a border wrapper from another owner: its log against the owner's key, and its values against the log. */
301
+ export function verifyBorder(w, keys) {
302
+ const owner = w.records[0]?.owner ?? "";
303
+ if (!keys[owner])
304
+ return { verified: false, reason: "no key for the owner" };
305
+ const chain = verifyChain(w.log ?? [], keys);
306
+ if (!chain.valid)
307
+ return { verified: false, "breaks-at": chain["breaks-at"] ?? "", reason: chain.reason ?? "" };
308
+ const byLog = new Map((w.log ?? []).map((e) => [String(e.log), e]));
309
+ for (const r of w.records) {
310
+ for (const [address, value] of Object.entries(r.values)) {
311
+ const via = (r.sources?.[address] ?? r.sources?.["*"])?.via;
312
+ const entry = via ? byLog.get(via) : undefined;
313
+ const writes = Array.isArray(entry?.writes) ? entry.writes : [];
314
+ const write = writes.find((x) => x.record === r.id && x.address === address);
315
+ if (!write || serialize(write.value) !== serialize(value))
316
+ return { verified: false, record: r.id, address, reason: "value doesn't match the log" };
317
+ }
318
+ }
319
+ return { verified: true, records: w.records.length, owner };
320
+ }
321
+ //# sourceMappingURL=exchange.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exchange.js","sourceRoot":"","sources":["../../src/exchange.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export { CrubalError, readTree } from "./tree.ts";
2
+ export { readDefinitions, emptyDictionary, type ClassDef, type Dictionary, type Facet } from "./defs.ts";
3
+ export { readText } from "./read-text.ts";
4
+ export { printText, type PrintMode } from "./print-text.ts";
5
+ export { canonical, serialize } from "./canonical.ts";
6
+ export { checkWrapper, type Wrapper, type Record, type Json } from "./model.ts";
7
+ export { runCorpus, type CaseResult } from "./corpus.ts";
8
+ export { checkPackage, checkRecord, facetJson, foldKey, foldRecord, resolve, resolvedJson, type Outcome, type Warning } from "./dictionary.ts";
9
+ export { evaluate, parseCondition, type Truth } from "./conditions.ts";
10
+ export { checkRules, Engine, readRules, shortcutRules, type Result, type Rule, type Strength } from "./rules.ts";
11
+ export { entryHash, fieldPath, land, matchParts, readContracts, receive, sha256, validate, verifyChain, type Contract, type IntakeRecord, type Observation } from "./store.ts";
12
+ export { checkRecipe, readRecipes, restamp, type Recipe, type ReviewItem, type Step } from "./migrate.ts";
13
+ export { checkContracts, Exchange, readRoles, verifyBorder, type Role, type RunResult } from "./exchange.ts";
14
+ export { checkPackages, readPackages, type PackageInfo } from "./packages.ts";
15
+ export { AUDIENCES, checkViews, readViews, Views, type Projection, type ProjectOptions, type View, type ViewSet } from "./views.ts";
@@ -0,0 +1,17 @@
1
+ // @cruba/crubal: the CRUBAL reference implementation. Pure functions; JSON in, JSON out.
2
+ export { CrubalError, readTree } from "./tree.js";
3
+ export { readDefinitions, emptyDictionary } from "./defs.js";
4
+ export { readText } from "./read-text.js";
5
+ export { printText } from "./print-text.js";
6
+ export { canonical, serialize } from "./canonical.js";
7
+ export { checkWrapper } from "./model.js";
8
+ export { runCorpus } from "./corpus.js";
9
+ export { checkPackage, checkRecord, facetJson, foldKey, foldRecord, resolve, resolvedJson } from "./dictionary.js";
10
+ export { evaluate, parseCondition } from "./conditions.js";
11
+ export { checkRules, Engine, readRules, shortcutRules } from "./rules.js";
12
+ export { entryHash, fieldPath, land, matchParts, readContracts, receive, sha256, validate, verifyChain } from "./store.js";
13
+ export { checkRecipe, readRecipes, restamp } from "./migrate.js";
14
+ export { checkContracts, Exchange, readRoles, verifyBorder } from "./exchange.js";
15
+ export { checkPackages, readPackages } from "./packages.js";
16
+ export { AUDIENCES, checkViews, readViews, Views } from "./views.js";
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,yFAAyF;AAEzF,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,eAAe,EAA8C,MAAM,WAAW,CAAC;AACzG,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAkB,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAwC,MAAM,YAAY,CAAC;AAChF,OAAO,EAAE,SAAS,EAAmB,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAA8B,MAAM,iBAAiB,CAAC;AAC/I,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAc,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAyC,MAAM,YAAY,CAAC;AACjH,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAsD,MAAM,YAAY,CAAC;AAC/K,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAA2C,MAAM,cAAc,CAAC;AAC1G,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAA6B,MAAM,eAAe,CAAC;AAC7G,OAAO,EAAE,aAAa,EAAE,YAAY,EAAoB,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAiE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,21 @@
1
+ /** One value as written: its main text, whether it was quoted, and its detail pairs. */
2
+ export type Piece = {
3
+ /** The main text, unquoted (escapes decoded when it was quoted). */
4
+ text: string;
5
+ quoted: boolean;
6
+ /** Detail pairs in written order; each value is itself a piece without detail. */
7
+ detail: [string, Piece][];
8
+ };
9
+ /** Split on `sep` characters that sit outside quotes and brackets. */
10
+ export declare function splitTop(s: string, sep: string, line?: number): string[];
11
+ /** Read one value with its optional detail: `PG-13 [region: US]`. */
12
+ export declare function readPiece(raw: string, line?: number): Piece;
13
+ /** Read a short list: `Comedy, "Blu-ray, 3D", Drama`. */
14
+ export declare function readList(raw: string, line?: number): Piece[];
15
+ /**
16
+ * Should the printer quote this text (spec 2.5)? `inDetail` adds `]`; `otherShapes` lists spellings that
17
+ * would read as another shape under the facet (`yes`, `-`).
18
+ */
19
+ export declare function needsQuotes(text: string, inDetail?: boolean, otherShapes?: string[]): boolean;
20
+ /** Write text, quoted only when it needs to be. */
21
+ export declare function writeText(text: string, inDetail?: boolean, otherShapes?: string[]): string;
@@ -0,0 +1,142 @@
1
+ // lex.ts: the spellings of a value in the text form (spec chapter 2.4–2.7): quoting with the JSON string
2
+ // syntax, `[ … ]` detail after a value, and short lists separated by commas. Nothing here knows facets;
3
+ // read-text.ts gives the pieces their meaning.
4
+ import { CrubalError } from "./tree.js";
5
+ /** Find the end of a quoted string starting at `start` (the opening quote). Returns the closing index. */
6
+ function closeQuote(s, start, line) {
7
+ for (let i = start + 1; i < s.length; i++) {
8
+ if (s[i] === "\\") {
9
+ i++;
10
+ continue;
11
+ }
12
+ if (s[i] === '"')
13
+ return i;
14
+ }
15
+ throw new CrubalError(`a quote is not closed in ${s}`, line);
16
+ }
17
+ /** Split on `sep` characters that sit outside quotes and brackets. */
18
+ export function splitTop(s, sep, line) {
19
+ const out = [];
20
+ let depth = 0;
21
+ let cur = "";
22
+ for (let i = 0; i < s.length; i++) {
23
+ const ch = s[i];
24
+ if (ch === '"') {
25
+ const end = closeQuote(s, i, line);
26
+ cur += s.slice(i, end + 1);
27
+ i = end;
28
+ continue;
29
+ }
30
+ if (ch === "[")
31
+ depth++;
32
+ if (ch === "]")
33
+ depth--;
34
+ if (depth === 0 && ch === sep) {
35
+ out.push(cur.trim());
36
+ cur = "";
37
+ continue;
38
+ }
39
+ cur += ch;
40
+ }
41
+ if (depth > 0)
42
+ throw new CrubalError(`a "[" is not closed in ${s}`, line);
43
+ out.push(cur.trim());
44
+ return out;
45
+ }
46
+ /** Decode one scalar spelling: a quoted JSON string, or the text as written. */
47
+ function scalar(raw, line) {
48
+ const t = raw.trim();
49
+ if (t.startsWith('"')) {
50
+ const end = closeQuote(t, 0, line);
51
+ if (end !== t.length - 1)
52
+ throw new CrubalError(`text after a closing quote in ${t}`, line);
53
+ try {
54
+ return { text: JSON.parse(t), quoted: true };
55
+ }
56
+ catch {
57
+ throw new CrubalError(`a quoted value isn't valid: ${t}`, line);
58
+ }
59
+ }
60
+ return { text: t, quoted: false };
61
+ }
62
+ /** Read one value with its optional detail: `PG-13 [region: US]`. */
63
+ export function readPiece(raw, line) {
64
+ const t = raw.trim();
65
+ // A detail is the last top-level `[ … ]`, after a space, ending the value.
66
+ let detailAt = -1;
67
+ if (t.endsWith("]")) {
68
+ let depth = 0;
69
+ for (let i = 0; i < t.length; i++) {
70
+ const ch = t[i];
71
+ if (ch === '"') {
72
+ i = closeQuote(t, i, line);
73
+ continue;
74
+ }
75
+ if (ch === "[") {
76
+ if (depth === 0 && (i === 0 || t[i - 1] === " "))
77
+ detailAt = i;
78
+ depth++;
79
+ }
80
+ if (ch === "]")
81
+ depth--;
82
+ }
83
+ if (depth !== 0)
84
+ throw new CrubalError(`a "[" is not closed in ${t}`, line);
85
+ }
86
+ else if (/\[[^\]"]*$/.test(t.replace(/"(?:\\.|[^"\\])*"/g, ""))) {
87
+ throw new CrubalError(`a "[" is not closed in ${t}`, line);
88
+ }
89
+ const main = detailAt >= 0 ? t.slice(0, detailAt).trim() : t;
90
+ const detail = [];
91
+ if (detailAt >= 0) {
92
+ const inner = t.slice(detailAt + 1, -1);
93
+ for (const part of splitTop(inner, ",", line)) {
94
+ if (!part)
95
+ continue;
96
+ const colon = part.indexOf(": ");
97
+ if (colon <= 0)
98
+ throw new CrubalError(`a detail needs "name: value", not ${part}`, line);
99
+ const name = part.slice(0, colon).trim();
100
+ const value = scalar(part.slice(colon + 2), line);
101
+ detail.push([name, { ...value, detail: [] }]);
102
+ }
103
+ }
104
+ return { ...scalar(main, line), detail };
105
+ }
106
+ /** Read a short list: `Comedy, "Blu-ray, 3D", Drama`. */
107
+ export function readList(raw, line) {
108
+ return splitTop(raw, ",", line).map((p) => readPiece(p, line));
109
+ }
110
+ const MARK_START = /^(&|_|\[|"|\{|\.\.\.)/;
111
+ const NUMBER = /^-?(0|[1-9]\d*)(\.\d+)?$/;
112
+ /**
113
+ * Should the printer quote this text (spec 2.5)? `inDetail` adds `]`; `otherShapes` lists spellings that
114
+ * would read as another shape under the facet (`yes`, `-`).
115
+ */
116
+ export function needsQuotes(text, inDetail = false, otherShapes = []) {
117
+ if (text === "")
118
+ return true;
119
+ if (MARK_START.test(text))
120
+ return true;
121
+ if (text.startsWith("-") && !NUMBER.test(text))
122
+ return true;
123
+ if (text === "n/a" || text === "N/A")
124
+ return true;
125
+ if (text.includes(": ") || text.includes(" //") || text.includes(","))
126
+ return true;
127
+ if (inDetail && text.includes("]"))
128
+ return true;
129
+ if (/^\s|\s$/.test(text))
130
+ return true;
131
+ // biome-ignore lint/suspicious/noControlCharactersInRegex: control characters must be quoted
132
+ if (/[\u0000-\u001f\u007f]/.test(text))
133
+ return true;
134
+ if (text.endsWith(":"))
135
+ return true;
136
+ return otherShapes.includes(text);
137
+ }
138
+ /** Write text, quoted only when it needs to be. */
139
+ export function writeText(text, inDetail = false, otherShapes = []) {
140
+ return needsQuotes(text, inDetail, otherShapes) ? JSON.stringify(text) : text;
141
+ }
142
+ //# sourceMappingURL=lex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lex.js","sourceRoot":"","sources":["../../src/lex.ts"],"names":[],"mappings":"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"}