@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 @@
1
+ {"version":3,"file":"units.js","sourceRoot":"","sources":["../../src/units.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,114 @@
1
+ import type { Dictionary } from "./defs.ts";
2
+ import type { Json, JsonObject, Record } from "./model.ts";
3
+ export declare const AUDIENCES: readonly ["public", "member", "staff", "owner"];
4
+ export type Slot = {
5
+ from: string;
6
+ to: string;
7
+ required: boolean;
8
+ line: number;
9
+ };
10
+ export type Shape = {
11
+ name: string;
12
+ slots: Slot[];
13
+ line: number;
14
+ };
15
+ export type Bucket = {
16
+ name: string;
17
+ values?: string[];
18
+ range?: [number, number];
19
+ };
20
+ export type Filter = {
21
+ name: string;
22
+ facet: string;
23
+ buckets?: Bucket[];
24
+ dependent: string[];
25
+ line: number;
26
+ bucketLines: number[];
27
+ };
28
+ export type View = {
29
+ name: string;
30
+ line: number;
31
+ level?: string;
32
+ wears: string[];
33
+ when?: string;
34
+ list?: string;
35
+ of?: string;
36
+ pin: string[];
37
+ hide: string[];
38
+ order: {
39
+ key: string;
40
+ dir: "after" | "before";
41
+ }[];
42
+ page: number;
43
+ shapes: string[];
44
+ filters: string[];
45
+ index: string[];
46
+ indexLine: number;
47
+ show: string;
48
+ fresh: string;
49
+ };
50
+ export type RoleDef = {
51
+ name: string;
52
+ audience: string;
53
+ see: string[];
54
+ seeLine: number;
55
+ line: number;
56
+ };
57
+ export type ViewSet = {
58
+ shapes: Map<string, Shape>;
59
+ filters: Map<string, Filter>;
60
+ views: Map<string, View>;
61
+ roles: Map<string, RoleDef>;
62
+ shown: Map<string, string>;
63
+ };
64
+ /** Read shapes, filters, views (with a body), roles and `shown to` rules. */
65
+ export declare function readViews(source: string): ViewSet;
66
+ export declare function checkViews(set: ViewSet, dict: Dictionary): void;
67
+ export type ProjectOptions = {
68
+ audience?: string;
69
+ caller?: Record;
70
+ context?: Record;
71
+ picks?: {
72
+ [filter: string]: string[];
73
+ };
74
+ page?: number;
75
+ };
76
+ export type Projection = {
77
+ rows: JsonObject[];
78
+ records: string[];
79
+ counts: {
80
+ [filter: string]: {
81
+ [bucket: string]: number;
82
+ };
83
+ };
84
+ pages: number;
85
+ indexable: boolean;
86
+ };
87
+ export declare class Views {
88
+ readonly dict: Dictionary;
89
+ readonly set: ViewSet;
90
+ private records;
91
+ private engine;
92
+ constructor(dict: Dictionary, set: ViewSet);
93
+ put(r: Record): void;
94
+ private effective;
95
+ private below;
96
+ /** The values an address reads, as a list: own values, or a lower level's (`unit::price`). */
97
+ private valuesAt;
98
+ /** Is a value fit for this audience's eyes? New, unknown and held values never reach the public. */
99
+ private fit;
100
+ private canSee;
101
+ private slot;
102
+ private inBucket;
103
+ private bucketsOf;
104
+ /** The records a view selects, curated and ordered, before filters and paging. */
105
+ select(v: View, opts?: ProjectOptions): Record[];
106
+ /** A view's projection for an audience (or a caller), with filter counts and a page. */
107
+ project(name: string, opts?: ProjectOptions): Projection;
108
+ /** The portable shape (12.1): key, label, type and value for every value the audience may see. */
109
+ portable(r: Record, audience?: string, caller?: Record): Json[];
110
+ /** The keys a view reads (12.6), with level prefixes kept. */
111
+ readSet(name: string): Set<string>;
112
+ /** Which of a view's rows a write makes stale: the written record, or what reads it through. */
113
+ staleAfter(name: string, write: Record): string[];
114
+ }
@@ -0,0 +1,436 @@
1
+ // views.ts: the Views level (spec chapter 12). Shapes map facets into display slots like a send
2
+ // contract's writes; views select records, curate, order and page them; filters are sub-indexes whose
3
+ // counts follow the other picks; audiences and show rules decide visibility, and roles narrow an audience;
4
+ // a view's read set decides which projection rows go stale.
5
+ import { serialize } from "./canonical.js";
6
+ import { evaluate, parseCondition } from "./conditions.js";
7
+ import { splitTop } from "./lex.js";
8
+ import { Engine } from "./rules.js";
9
+ import { CrubalError, readTree } from "./tree.js";
10
+ const isObj = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
11
+ const unq = (s) => (s.trim().startsWith('"') ? JSON.parse(s.trim()) : s.trim());
12
+ export const AUDIENCES = ["public", "member", "staff", "owner"];
13
+ const rankOf = (a) => {
14
+ const i = AUDIENCES.indexOf(a);
15
+ return i < 0 ? AUDIENCES.length : i;
16
+ };
17
+ /** Read shapes, filters, views (with a body), roles and `shown to` rules. */
18
+ export function readViews(source) {
19
+ const set = { shapes: new Map(), filters: new Map(), views: new Map(), roles: new Map(), shown: new Map() };
20
+ for (const n of readTree(source)) {
21
+ if (n.kind !== "pair" || !n.key)
22
+ continue;
23
+ const name = n.value.trim();
24
+ const get = (k) => n.children.find((c) => c.key === k);
25
+ if (n.key === "shape") {
26
+ const slots = (get("slots")?.children ?? []).map((l) => {
27
+ const at = l.text.lastIndexOf(" -> ");
28
+ if (at < 0)
29
+ throw new CrubalError(`a slot is "from -> slot": ${l.text}`, l.line);
30
+ let from = l.text.slice(0, at).trim();
31
+ const required = from.startsWith("!");
32
+ if (required)
33
+ from = from.slice(1);
34
+ return { from, to: l.text.slice(at + 4).trim(), required, line: l.line };
35
+ });
36
+ set.shapes.set(name, { name, slots, line: n.line });
37
+ }
38
+ else if (n.key === "filter") {
39
+ const b = get("buckets");
40
+ const buckets = b?.children.map((c) => {
41
+ // A bucket line is `name: values`; the name may be quoted, with spaces ("Like new": NM, VG).
42
+ const m = c.text.match(/^("(?:[^"\\]|\\.)*"|[^:]+):\s+(.*)$/);
43
+ if (!m)
44
+ throw new CrubalError(`a bucket is "name: values": ${c.text}`, c.line);
45
+ const label = unq(m[1]);
46
+ const rest = m[2].trim();
47
+ const range = rest.match(/^(-?[\d.]+)\.\.(-?[\d.]+)$/);
48
+ return range ? { name: label, range: [Number(range[1]), Number(range[2])] } : { name: label, values: splitTop(rest, ",", c.line).map(unq) };
49
+ });
50
+ set.filters.set(name, {
51
+ name,
52
+ facet: get("facet")?.value ?? name,
53
+ ...(buckets ? { buckets } : {}),
54
+ dependent: (get("dependent")?.value ?? "").split(",").map((s) => s.trim()).filter(Boolean),
55
+ line: n.line,
56
+ bucketLines: b?.children.map((c) => c.line) ?? [],
57
+ });
58
+ }
59
+ else if (n.key === "view" && n.children.length) {
60
+ const sel = get("select");
61
+ const s = (k) => sel?.children.find((c) => c.key === k)?.value;
62
+ const list = (k) => (get(k)?.value ?? "").split(",").map((x) => x.trim()).filter(Boolean);
63
+ set.views.set(name, {
64
+ name,
65
+ line: n.line,
66
+ ...(s("level") ? { level: s("level") } : {}),
67
+ wears: (s("wears") ?? "").split(",").map((x) => x.trim()).filter(Boolean),
68
+ ...(s("when") ? { when: s("when") } : {}),
69
+ ...(s("list") ? { list: s("list") } : {}),
70
+ ...(get("of") ? { of: get("of")?.value } : {}),
71
+ pin: list("pin"),
72
+ hide: list("hide"),
73
+ order: list("order").map((o) => {
74
+ const [key = "", dir] = o.split(/\s+/);
75
+ return { key, dir: dir === "after" ? "after" : "before" };
76
+ }),
77
+ page: Number(get("page")?.value ?? 24),
78
+ shapes: list("shape"),
79
+ filters: list("filters"),
80
+ index: list("index"),
81
+ indexLine: get("index")?.line ?? n.line,
82
+ show: get("show")?.value ?? "public",
83
+ fresh: get("fresh")?.value ?? "write",
84
+ });
85
+ }
86
+ else if (n.key === "role") {
87
+ const see = get("may")?.children.find((c) => c.key === "see");
88
+ set.roles.set(name, {
89
+ name,
90
+ audience: get("audience")?.value ?? "member",
91
+ see: (see?.value ?? "").split(",").map((x) => x.trim()).filter(Boolean),
92
+ seeLine: see?.line ?? n.line,
93
+ line: n.line,
94
+ });
95
+ }
96
+ else if (n.key === "rule") {
97
+ const then = get("then")?.value ?? "";
98
+ const m = then.match(/^(\S+) shown to (\S+)$/);
99
+ if (m)
100
+ set.shown.set(m[1], m[2]);
101
+ }
102
+ }
103
+ return set;
104
+ }
105
+ /** Can an audience see a facet? (`shown to` names the lowest audience that may.) */
106
+ function visibleTo(set, facet, audience) {
107
+ const min = set.shown.get(facet.replace(/^\w+::/, ""));
108
+ return !min || rankOf(audience) >= rankOf(min);
109
+ }
110
+ /** The keys a slot's source reads. */
111
+ function slotKeys(from) {
112
+ if (from.startsWith('"'))
113
+ return [...JSON.parse(from).matchAll(/\{([^{}]+)\}/g)].flatMap((m) => m[1].split("??").map((k) => k.trim().replace(/\?$/, "")));
114
+ const agg = from.match(/^(?:count|least|most|sum|best|worst|join) of (\S+)$/);
115
+ return [agg ? agg[1] : from];
116
+ }
117
+ // ─── Publish checks (12.8) ───────────────────────────────────────────────────
118
+ export function checkViews(set, dict) {
119
+ const defined = (k) => dict.facets.has(k.replace(/^\w+::/, "").replace(/^parts\[\*\]\./, ""));
120
+ for (const f of set.filters.values()) {
121
+ if (!defined(f.facet))
122
+ throw new CrubalError(`the filter ${f.name} reads ${f.facet}, which isn't a facet`, f.line);
123
+ const facet = dict.facets.get(f.facet.replace(/^\w+::/, ""));
124
+ const seen = new Map();
125
+ f.buckets?.forEach((b, i) => {
126
+ for (const v of b.values ?? []) {
127
+ if (facet?.values && !facet.values.some((x) => x.value === v))
128
+ throw new CrubalError(`${v} is not a value of ${facet.key}`, f.bucketLines[i]);
129
+ const other = seen.get(v);
130
+ if (other)
131
+ throw new CrubalError(`${v} is in both ${other} and ${b.name}`, f.bucketLines[i]);
132
+ seen.set(v, b.name);
133
+ }
134
+ });
135
+ }
136
+ for (const s of set.shapes.values()) {
137
+ for (const sl of s.slots)
138
+ for (const k of slotKeys(sl.from))
139
+ if (!sl.from.startsWith('"') || k)
140
+ if (!defined(k) && k !== "id")
141
+ throw new CrubalError(`the slot ${sl.to} reads ${k}, which isn't a facet`, sl.line);
142
+ }
143
+ for (const v of set.views.values()) {
144
+ for (const s of v.shapes)
145
+ if (s !== "crubal:portable" && !set.shapes.has(s))
146
+ throw new CrubalError(`${v.name} names the shape ${s}, which doesn't exist`, v.line);
147
+ for (const f of v.filters)
148
+ if (!set.filters.has(f))
149
+ throw new CrubalError(`${v.name} names the filter ${f}, which doesn't exist`, v.line);
150
+ for (const i of v.index)
151
+ if (!v.filters.includes(i))
152
+ throw new CrubalError(`${v.name} indexes ${i}, which isn't one of its filters`, v.indexLine);
153
+ for (const c of v.wears)
154
+ if (!dict.classes.has(c))
155
+ throw new CrubalError(`${v.name} selects by ${c}, which isn't a class`, v.line);
156
+ if (v.show === "public") {
157
+ const reads = [
158
+ ...v.shapes.flatMap((s) => (set.shapes.get(s)?.slots ?? []).flatMap((sl) => slotKeys(sl.from))),
159
+ ...v.filters.map((f) => set.filters.get(f)?.facet ?? f),
160
+ ];
161
+ const hidden = reads.find((k) => !visibleTo(set, k, "public"));
162
+ if (hidden)
163
+ throw new CrubalError(`the public view ${v.name} reads ${hidden}, which show rules hide from public`, v.line);
164
+ }
165
+ }
166
+ for (const r of set.roles.values()) {
167
+ for (const k of r.see) {
168
+ if (!defined(k))
169
+ throw new CrubalError(`${r.name} grants see: ${k}, which isn't a facet`, r.seeLine);
170
+ if (!visibleTo(set, k, r.audience))
171
+ throw new CrubalError(`${r.name} grants see: ${k}, which the ${r.audience} audience can't see`, r.seeLine);
172
+ }
173
+ }
174
+ }
175
+ function plainText(v) {
176
+ if (typeof v === "string")
177
+ return v;
178
+ if (isObj(v) && "$link" in v)
179
+ return `&${v.$link}`;
180
+ if (isObj(v) && "$value" in v)
181
+ return plainText(v.$value);
182
+ return serialize(v);
183
+ }
184
+ function label(key) {
185
+ const words = key.replace(/^.*:/, "").replace(/([a-z0-9])([A-Z])/g, "$1 $2").toLowerCase();
186
+ return words.charAt(0).toUpperCase() + words.slice(1);
187
+ }
188
+ export class Views {
189
+ dict;
190
+ set;
191
+ records = new Map();
192
+ engine;
193
+ constructor(dict, set) {
194
+ this.dict = dict;
195
+ this.set = set;
196
+ this.engine = new Engine(dict, []);
197
+ }
198
+ put(r) {
199
+ this.records.set(r.id, r);
200
+ }
201
+ effective(r) {
202
+ const up = r.of ? this.records.get(r.of) : undefined;
203
+ return { ...(up ? this.effective(up) : {}), ...r.values };
204
+ }
205
+ below(r, level) {
206
+ return [...this.records.values()].filter((x) => x.of === r.id && x.level === level);
207
+ }
208
+ /** The values an address reads, as a list: own values, or a lower level's (`unit::price`). */
209
+ valuesAt(r, address) {
210
+ const m = address.match(/^(\w+)::(.+)$/);
211
+ if (m)
212
+ return this.below(r, m[1]).flatMap((u) => this.valuesAt(u, m[2]));
213
+ const v = this.effective(r)[address];
214
+ return v === undefined ? [] : Array.isArray(v) ? v : [v];
215
+ }
216
+ /** Is a value fit for this audience's eyes? New, unknown and held values never reach the public. */
217
+ fit(key, v, audience) {
218
+ if (audience !== "public")
219
+ return true;
220
+ if (isObj(v) && "$empty" in v)
221
+ return v.$empty === "n/a";
222
+ const f = this.dict.facets.get(key.replace(/^\w+::/, ""));
223
+ if (f?.type === "choice" && typeof v === "string")
224
+ return (f.values ?? []).some((x) => x.value === v);
225
+ return true;
226
+ }
227
+ canSee(key, audience, caller) {
228
+ if (!visibleTo(this.set, key, audience))
229
+ return false;
230
+ if (!caller || rankOf(audience) <= rankOf("member"))
231
+ return true;
232
+ // Above member, a person sees what members see plus what their roles grant (default deny).
233
+ if (visibleTo(this.set, key, "member"))
234
+ return true;
235
+ const held = caller.values.roles;
236
+ const names = (Array.isArray(held) ? held : held ? [held] : []).map((x) => (isObj(x) && "$link" in x ? String(x.$link) : String(x)));
237
+ return names.some((n) => {
238
+ const role = this.set.roles.get(n);
239
+ return role && role.see.includes(key.replace(/^\w+::/, "")) && rankOf(role.audience) <= rankOf(audience);
240
+ });
241
+ }
242
+ slot(r, s, audience, caller) {
243
+ const keys = slotKeys(s.from);
244
+ if (!keys.every((k) => this.canSee(k, audience, caller)))
245
+ return undefined;
246
+ if (s.from.startsWith('"'))
247
+ return this.engine.template(s.from, this.effective(r));
248
+ const agg = s.from.match(/^(count|least|most|sum|best|worst|join) of (\S+)$/);
249
+ if (agg) {
250
+ const items = this.valuesAt(r, agg[2]).filter((v) => !(isObj(v) && "$empty" in v));
251
+ if (agg[1] === "count")
252
+ return String(items.length);
253
+ if (!items.length)
254
+ return undefined;
255
+ const amount = (v) => Number(isObj(v) ? (v.$money ?? v.$qty ?? NaN) : v);
256
+ const sorted = [...items].sort((a, b) => amount(a) - amount(b));
257
+ if (agg[1] === "least")
258
+ return sorted[0];
259
+ if (agg[1] === "most")
260
+ return sorted.at(-1);
261
+ return items;
262
+ }
263
+ const f = this.dict.facets.get(s.from.replace(/^\w+::/, ""));
264
+ const v = s.from.includes("::") ? this.valuesAt(r, s.from) : this.effective(r)[s.from];
265
+ if (v === undefined)
266
+ return undefined;
267
+ if (Array.isArray(v)) {
268
+ const kept = v.filter((x) => this.fit(s.from, x, audience));
269
+ return kept.length ? (f?.many || s.from.includes("::") ? kept : kept[0]) : undefined;
270
+ }
271
+ return this.fit(s.from, v, audience) ? v : undefined;
272
+ }
273
+ inBucket(r, f, b) {
274
+ return this.valuesAt(r, f.facet).some((v) => {
275
+ const t = plainText(v);
276
+ if (b.values)
277
+ return b.values.includes(t);
278
+ if (b.range)
279
+ return Number.parseFloat(t) >= b.range[0] && Number.parseFloat(t) <= b.range[1];
280
+ return false;
281
+ });
282
+ }
283
+ bucketsOf(f) {
284
+ if (f.buckets)
285
+ return f.buckets;
286
+ const facet = this.dict.facets.get(f.facet.replace(/^\w+::/, ""));
287
+ return (facet?.values ?? []).map((v) => ({ name: v.value, values: [v.value] }));
288
+ }
289
+ /** The records a view selects, curated and ordered, before filters and paging. */
290
+ select(v, opts = {}) {
291
+ const audience = opts.audience ?? v.show;
292
+ let rows = [...this.records.values()].filter((r) => {
293
+ if (v.level && r.level !== v.level)
294
+ return false;
295
+ if (v.wears.some((w) => !(r.wears ?? []).includes(w)))
296
+ return false;
297
+ if (v.hide.includes(r.id))
298
+ return false;
299
+ const vals = { ...this.effective(r), id: r.id };
300
+ if (v.when && evaluate(parseCondition(v.when), vals) !== true)
301
+ return false;
302
+ if (v.of) {
303
+ const ctx = opts.context;
304
+ if (!ctx)
305
+ return false;
306
+ const cvals = { ...this.effective(ctx), id: ctx.id };
307
+ const cond = v.of.replace(/context\.(\w+)/g, (_, k) => JSON.stringify(cvals[k] === undefined ? "" : plainText(cvals[k])));
308
+ if (evaluate(parseCondition(cond), vals) !== true)
309
+ return false;
310
+ }
311
+ return true;
312
+ });
313
+ // A record whose required slot is empty is dropped from the view.
314
+ const shape = this.set.shapes.get(v.shapes[0] ?? "");
315
+ rows = rows.filter((r) => (shape?.slots ?? []).every((s) => !s.required || this.slot(r, s, audience, opts.caller) !== undefined));
316
+ const cmp = (a, b) => {
317
+ for (const o of v.order) {
318
+ const x = plainText((this.effective(a)[o.key] ?? ""));
319
+ const y = plainText((this.effective(b)[o.key] ?? ""));
320
+ if (x !== y)
321
+ return (x < y ? -1 : 1) * (o.dir === "after" ? -1 : 1);
322
+ }
323
+ return a.id < b.id ? -1 : a.id > b.id ? 1 : 0;
324
+ };
325
+ const pinned = v.pin.map((id) => rows.find((r) => r.id === id)).filter((r) => !!r);
326
+ return [...pinned, ...rows.filter((r) => !v.pin.includes(r.id)).sort(cmp)];
327
+ }
328
+ /** A view's projection for an audience (or a caller), with filter counts and a page. */
329
+ project(name, opts = {}) {
330
+ const v = this.set.views.get(name);
331
+ if (!v)
332
+ throw new Error(`no view ${name}`);
333
+ const audience = opts.caller ? String(opts.caller.values.audience ?? "member") : (opts.audience ?? v.show);
334
+ const all = this.select(v, { ...opts, audience });
335
+ const picks = opts.picks ?? {};
336
+ const passes = (r, except) => Object.entries(picks).every(([fname, chosen]) => {
337
+ if (fname === except)
338
+ return true;
339
+ const f = this.set.filters.get(fname);
340
+ return !f || this.bucketsOf(f).some((b) => chosen.includes(b.name) && this.inBucket(r, f, b));
341
+ });
342
+ const counts = {};
343
+ for (const fname of v.filters) {
344
+ const f = this.set.filters.get(fname);
345
+ if (!f)
346
+ continue;
347
+ const pool = all.filter((r) => passes(r, fname));
348
+ counts[fname] = Object.fromEntries(this.bucketsOf(f).map((b) => [b.name, pool.filter((r) => this.inBucket(r, f, b)).length]));
349
+ }
350
+ const chosen = all.filter((r) => passes(r));
351
+ const pages = Math.max(1, Math.ceil(chosen.length / v.page));
352
+ const page = opts.page ?? 1;
353
+ const onPage = chosen.slice((page - 1) * v.page, page * v.page);
354
+ const pickList = Object.entries(picks).filter(([, c]) => c.length);
355
+ const indexable = page === 1 && (pickList.length === 0 || (pickList.length === 1 && v.index.includes(pickList[0]?.[0]) && pickList[0]?.[1].length === 1));
356
+ const shapeName = v.shapes[0] ?? "";
357
+ const rows = onPage.map((r) => {
358
+ if (shapeName === "crubal:portable")
359
+ return { record: r.id, values: this.portable(r, audience, opts.caller) };
360
+ const row = { record: r.id };
361
+ for (const s of this.set.shapes.get(shapeName)?.slots ?? []) {
362
+ const val = this.slot(r, s, audience, opts.caller);
363
+ if (val !== undefined)
364
+ row[s.to] = val;
365
+ }
366
+ return row;
367
+ });
368
+ return { rows, records: onPage.map((r) => r.id), counts, pages, indexable };
369
+ }
370
+ /** The portable shape (12.1): key, label, type and value for every value the audience may see. */
371
+ portable(r, audience = "public", caller) {
372
+ return Object.entries(r.values).flatMap(([key, v]) => {
373
+ if (!this.canSee(key, audience, caller))
374
+ return [];
375
+ const f = this.dict.facets.get(key);
376
+ return [{ key, label: f?.label ?? label(key), type: f?.type ?? "raw", value: v }];
377
+ });
378
+ }
379
+ /** The keys a view reads (12.6), with level prefixes kept. */
380
+ readSet(name) {
381
+ const v = this.set.views.get(name);
382
+ if (!v)
383
+ return new Set();
384
+ const keys = [];
385
+ if (v.when)
386
+ keys.push(...parseConditionKeys(v.when));
387
+ if (v.of)
388
+ keys.push(...parseConditionKeys(v.of.replace(/context\.\w+/g, '""')));
389
+ keys.push(...v.order.map((o) => o.key));
390
+ for (const s of v.shapes)
391
+ for (const sl of this.set.shapes.get(s)?.slots ?? [])
392
+ keys.push(...slotKeys(sl.from));
393
+ for (const f of v.filters)
394
+ keys.push(this.set.filters.get(f)?.facet ?? f);
395
+ for (const k of [...keys])
396
+ if (this.set.shown.has(k))
397
+ keys.push(k);
398
+ return new Set(keys.filter((k) => k !== "id"));
399
+ }
400
+ /** Which of a view's rows a write makes stale: the written record, or what reads it through. */
401
+ staleAfter(name, write) {
402
+ const v = this.set.views.get(name);
403
+ if (!v)
404
+ return [];
405
+ const reads = this.readSet(name);
406
+ const out = new Set();
407
+ for (const key of Object.keys(write.values)) {
408
+ if (reads.has(key) && (!v.level || write.level === v.level))
409
+ out.add(write.id);
410
+ if (reads.has(`${write.level}::${key}`) && write.of)
411
+ out.add(write.of);
412
+ if (reads.has(key) && v.level && write.level !== v.level) {
413
+ for (const r of this.records.values())
414
+ if (r.of === write.id && r.level === v.level)
415
+ out.add(r.id);
416
+ }
417
+ }
418
+ return [...out];
419
+ }
420
+ }
421
+ function parseConditionKeys(text) {
422
+ const out = [];
423
+ const walk = (e) => {
424
+ if (e.op === "test")
425
+ out.push(e.path.replace(/^(count|least|most|sum) of /, ""));
426
+ else if (e.op === "not")
427
+ walk(e.a);
428
+ else {
429
+ walk(e.a);
430
+ walk(e.b);
431
+ }
432
+ };
433
+ walk(parseCondition(text));
434
+ return out;
435
+ }
436
+ //# sourceMappingURL=views.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"views.js","sourceRoot":"","sources":["../../src/views.ts"],"names":[],"mappings":"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"}