@graview/core 0.1.10 → 0.1.14
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/README.md +41 -9
- package/dist/address.d.ts +31 -0
- package/dist/address.d.ts.map +1 -0
- package/dist/address.js +53 -0
- package/dist/address.js.map +1 -0
- package/dist/app.d.ts +1 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/arrange.d.ts +13 -183
- package/dist/arrange.d.ts.map +1 -1
- package/dist/arrange.js +12 -470
- package/dist/arrange.js.map +1 -1
- package/dist/arrangement.d.ts +169 -0
- package/dist/arrangement.d.ts.map +1 -0
- package/dist/arrangement.js +220 -0
- package/dist/arrangement.js.map +1 -0
- package/dist/arranging.d.ts +28 -0
- package/dist/arranging.d.ts.map +1 -0
- package/dist/arranging.js +264 -0
- package/dist/arranging.js.map +1 -0
- package/dist/blocks.d.ts +5 -0
- package/dist/blocks.d.ts.map +1 -0
- package/dist/blocks.js +14 -0
- package/dist/blocks.js.map +1 -0
- package/dist/capabilities.js +1 -1
- package/dist/capabilities.js.map +1 -1
- package/dist/check.d.ts +8 -0
- package/dist/check.d.ts.map +1 -0
- package/dist/check.js +19 -0
- package/dist/check.js.map +1 -0
- package/dist/cli/check/brand.d.ts.map +1 -1
- package/dist/cli/check/brand.js +21 -0
- package/dist/cli/check/brand.js.map +1 -1
- package/dist/cli/check/hidden-reads.d.ts +4 -0
- package/dist/cli/check/hidden-reads.d.ts.map +1 -0
- package/dist/cli/check/hidden-reads.js +183 -0
- package/dist/cli/check/hidden-reads.js.map +1 -0
- package/dist/cli/check/index.d.ts +1 -0
- package/dist/cli/check/index.d.ts.map +1 -1
- package/dist/cli/check/index.js +1 -0
- package/dist/cli/check/index.js.map +1 -1
- package/dist/cli/check/lenses.d.ts.map +1 -1
- package/dist/cli/check/lenses.js +29 -1
- package/dist/cli/check/lenses.js.map +1 -1
- package/dist/cli/check/views.d.ts.map +1 -1
- package/dist/cli/check/views.js +5 -1
- package/dist/cli/check/views.js.map +1 -1
- package/dist/cli/check.d.ts.map +1 -1
- package/dist/cli/check.js +2 -1
- package/dist/cli/check.js.map +1 -1
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +1 -1
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/describe.d.ts.map +1 -1
- package/dist/cli/describe.js +23 -1
- package/dist/cli/describe.js.map +1 -1
- package/dist/cli/docs.js +1 -1
- package/dist/cli/docs.js.map +1 -1
- package/dist/cli/index.d.ts +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +2 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/columns.d.ts +105 -0
- package/dist/columns.d.ts.map +1 -0
- package/dist/columns.js +143 -0
- package/dist/columns.js.map +1 -0
- package/dist/conformance/fixtures.d.ts.map +1 -1
- package/dist/conformance/fixtures.js +19 -1
- package/dist/conformance/fixtures.js.map +1 -1
- package/dist/conformance/index.js +1 -1
- package/dist/conformance/index.js.map +1 -1
- package/dist/describe.d.ts +2 -0
- package/dist/describe.d.ts.map +1 -1
- package/dist/describe.js +7 -0
- package/dist/describe.js.map +1 -1
- package/dist/document/act-findings.d.ts +5 -0
- package/dist/document/act-findings.d.ts.map +1 -0
- package/dist/document/act-findings.js +84 -0
- package/dist/document/act-findings.js.map +1 -0
- package/dist/document/blocks.d.ts +11 -6
- package/dist/document/blocks.d.ts.map +1 -1
- package/dist/document/blocks.js +21 -31
- package/dist/document/blocks.js.map +1 -1
- package/dist/document/compile-checked.d.ts +8 -0
- package/dist/document/compile-checked.d.ts.map +1 -0
- package/dist/document/compile-checked.js +43 -0
- package/dist/document/compile-checked.js.map +1 -0
- package/dist/document/compile.d.ts +22 -9
- package/dist/document/compile.d.ts.map +1 -1
- package/dist/document/compile.js +116 -52
- package/dist/document/compile.js.map +1 -1
- package/dist/document/describe-coverage.d.ts +37 -0
- package/dist/document/describe-coverage.d.ts.map +1 -0
- package/dist/document/describe-coverage.js +162 -0
- package/dist/document/describe-coverage.js.map +1 -0
- package/dist/document/describe-place.d.ts.map +1 -1
- package/dist/document/describe-place.js +43 -1
- package/dist/document/describe-place.js.map +1 -1
- package/dist/document/diff.d.ts +5 -0
- package/dist/document/diff.d.ts.map +1 -1
- package/dist/document/diff.js +18 -4
- package/dist/document/diff.js.map +1 -1
- package/dist/document/edit.d.ts +1 -1
- package/dist/document/edit.d.ts.map +1 -1
- package/dist/document/edit.js +155 -10
- package/dist/document/edit.js.map +1 -1
- package/dist/document/expr/analyze.d.ts.map +1 -1
- package/dist/document/expr/analyze.js +2 -1
- package/dist/document/expr/analyze.js.map +1 -1
- package/dist/document/expr/evaluate.d.ts.map +1 -1
- package/dist/document/expr/evaluate.js +26 -2
- package/dist/document/expr/evaluate.js.map +1 -1
- package/dist/document/expr/parse.d.ts +2 -1
- package/dist/document/expr/parse.d.ts.map +1 -1
- package/dist/document/expr/parse.js +6 -3
- package/dist/document/expr/parse.js.map +1 -1
- package/dist/document/expr/print.d.ts.map +1 -1
- package/dist/document/expr/print.js +4 -2
- package/dist/document/expr/print.js.map +1 -1
- package/dist/document/far-end.d.ts +15 -0
- package/dist/document/far-end.d.ts.map +1 -0
- package/dist/document/far-end.js +26 -0
- package/dist/document/far-end.js.map +1 -0
- package/dist/document/graview-template.d.ts +20 -12
- package/dist/document/graview-template.d.ts.map +1 -1
- package/dist/document/graview-template.js +5 -44
- package/dist/document/graview-template.js.map +1 -1
- package/dist/document/index.d.ts +5 -11
- package/dist/document/index.d.ts.map +1 -1
- package/dist/document/index.js +3 -6
- package/dist/document/index.js.map +1 -1
- package/dist/document/instantiate-template.d.ts +14 -0
- package/dist/document/instantiate-template.d.ts.map +1 -0
- package/dist/document/instantiate-template.js +46 -0
- package/dist/document/instantiate-template.js.map +1 -0
- package/dist/document/migrate.d.ts.map +1 -1
- package/dist/document/migrate.js +7 -5
- package/dist/document/migrate.js.map +1 -1
- package/dist/document/range.d.ts +17 -0
- package/dist/document/range.d.ts.map +1 -0
- package/dist/document/range.js +46 -0
- package/dist/document/range.js.map +1 -0
- package/dist/document/schema.d.ts +34 -2
- package/dist/document/schema.d.ts.map +1 -1
- package/dist/document/schema.js +25 -1
- package/dist/document/schema.js.map +1 -1
- package/dist/document/template.d.ts +18 -2
- package/dist/document/template.d.ts.map +1 -1
- package/dist/document/template.js +27 -9
- package/dist/document/template.js.map +1 -1
- package/dist/document/thumbnail.d.ts +26 -4
- package/dist/document/thumbnail.d.ts.map +1 -1
- package/dist/document/thumbnail.js +165 -50
- package/dist/document/thumbnail.js.map +1 -1
- package/dist/document/to-document.d.ts.map +1 -1
- package/dist/document/to-document.js +18 -2
- package/dist/document/to-document.js.map +1 -1
- package/dist/document/views.d.ts +11 -0
- package/dist/document/views.d.ts.map +1 -1
- package/dist/document/views.js +76 -12
- package/dist/document/views.js.map +1 -1
- package/dist/figures.d.ts +3 -0
- package/dist/figures.d.ts.map +1 -0
- package/dist/figures.js +14 -0
- package/dist/figures.js.map +1 -0
- package/dist/index.d.ts +3 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -9
- package/dist/index.js.map +1 -1
- package/dist/mutations/define-mutation.d.ts.map +1 -1
- package/dist/mutations/define-mutation.js +9 -1
- package/dist/mutations/define-mutation.js.map +1 -1
- package/dist/mutations/derive-edits.d.ts +8 -0
- package/dist/mutations/derive-edits.d.ts.map +1 -1
- package/dist/mutations/derive-edits.js +30 -7
- package/dist/mutations/derive-edits.js.map +1 -1
- package/dist/mutations/form.d.ts +2 -0
- package/dist/mutations/form.d.ts.map +1 -1
- package/dist/mutations/form.js +1 -0
- package/dist/mutations/form.js.map +1 -1
- package/dist/mutations/node-ref.d.ts +4 -1
- package/dist/mutations/node-ref.d.ts.map +1 -1
- package/dist/mutations/node-ref.js +6 -0
- package/dist/mutations/node-ref.js.map +1 -1
- package/dist/mutations/types.d.ts +28 -0
- package/dist/mutations/types.d.ts.map +1 -1
- package/dist/places.d.ts +11 -0
- package/dist/places.d.ts.map +1 -1
- package/dist/places.js +19 -1
- package/dist/places.js.map +1 -1
- package/dist/refusal.d.ts.map +1 -1
- package/dist/refusal.js +4 -0
- package/dist/refusal.js.map +1 -1
- package/dist/refused.d.ts +20 -0
- package/dist/refused.d.ts.map +1 -0
- package/dist/refused.js +24 -0
- package/dist/refused.js.map +1 -0
- package/dist/scaffold/domain.js +1 -1
- package/dist/scaffold/from-template.d.ts.map +1 -1
- package/dist/scaffold/from-template.js +3 -3
- package/dist/scaffold/from-template.js.map +1 -1
- package/dist/scaffold/project.d.ts.map +1 -1
- package/dist/scaffold/project.js +7 -0
- package/dist/scaffold/project.js.map +1 -1
- package/dist/scene-districts.d.ts +5 -1
- package/dist/scene-districts.d.ts.map +1 -1
- package/dist/scene-districts.js +11 -4
- package/dist/scene-districts.js.map +1 -1
- package/dist/scene.d.ts +7 -0
- package/dist/scene.d.ts.map +1 -0
- package/dist/scene.js +16 -0
- package/dist/scene.js.map +1 -0
- package/dist/search.d.ts +1 -1
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +1 -1
- package/dist/search.js.map +1 -1
- package/dist/theme/derive.d.ts.map +1 -1
- package/dist/theme/derive.js +5 -4
- package/dist/theme/derive.js.map +1 -1
- package/dist/theme/types.d.ts +9 -0
- package/dist/theme/types.d.ts.map +1 -1
- package/dist/theme/types.js +5 -0
- package/dist/theme/types.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +21 -1
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
import { humaniseField, labelOf, tellApart } from "./schema/define-node.js";
|
|
2
|
+
import { matchNode, parseQuery } from "./search.js";
|
|
3
|
+
import { arrangeable, asRecord, conditionHolds, describeArgOptions, edgesOf, farEnds, fields, fieldType, readingOf, } from "./arrangement.js";
|
|
4
|
+
/*
|
|
5
|
+
* ARRANGING: what a list, a lens or a band does with an arrangement —
|
|
6
|
+
* filter, sort and group the records it is handed — and the words a chosen
|
|
7
|
+
* arrangement is written back in. Apart from the offers and the grammar
|
|
8
|
+
* (`./arrangement.ts`), which the Find box and the opening of a page read
|
|
9
|
+
* from the first paint: only a drawn list arranges, so a page carries this
|
|
10
|
+
* when it fetches one (`@graview/core/arrange`).
|
|
11
|
+
*/
|
|
12
|
+
/** Whether a lens offers a part, given what it declared. Everything is on unless declined. */
|
|
13
|
+
export function arrangeAllows(option, part) {
|
|
14
|
+
if (option === undefined || option === true)
|
|
15
|
+
return true;
|
|
16
|
+
if (option === false)
|
|
17
|
+
return false;
|
|
18
|
+
return option[part] !== false;
|
|
19
|
+
}
|
|
20
|
+
export function formatArrangement(arrangement) {
|
|
21
|
+
const out = {};
|
|
22
|
+
if (arrangement.query && arrangement.query.trim().length > 0)
|
|
23
|
+
out.q = arrangement.query;
|
|
24
|
+
if (arrangement.sort) {
|
|
25
|
+
out.sort = arrangement.sort.direction === "desc" ? `${arrangement.sort.by}:desc` : arrangement.sort.by;
|
|
26
|
+
}
|
|
27
|
+
if (arrangement.filter?.length) {
|
|
28
|
+
out.filter = arrangement.filter.map((condition) => `${condition.key}:${condition.value}`).join(",");
|
|
29
|
+
}
|
|
30
|
+
if (arrangement.group) {
|
|
31
|
+
out.group = arrangement.group.bucket ? `${arrangement.group.by}:${arrangement.group.bucket}` : arrangement.group.by;
|
|
32
|
+
}
|
|
33
|
+
return out;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Keeps only the parts a kind can actually be arranged by, and says which
|
|
37
|
+
* were dropped — a stale link names a field that was renamed, and the
|
|
38
|
+
* honest thing is to show the rest arranged and say what was ignored.
|
|
39
|
+
*/
|
|
40
|
+
export function admitArrangement(arrangement, offers) {
|
|
41
|
+
const dropped = [];
|
|
42
|
+
const out = {};
|
|
43
|
+
if (arrangement.query)
|
|
44
|
+
out.query = arrangement.query;
|
|
45
|
+
if (arrangement.sort) {
|
|
46
|
+
if (offers.sorts.some((offer) => offer.key === arrangement.sort.by))
|
|
47
|
+
out.sort = arrangement.sort;
|
|
48
|
+
else
|
|
49
|
+
dropped.push(`sort ${arrangement.sort.by}`);
|
|
50
|
+
}
|
|
51
|
+
if (arrangement.filter) {
|
|
52
|
+
const kept = arrangement.filter.filter((condition) => {
|
|
53
|
+
const offer = offers.filters.find((candidate) => candidate.key === condition.key);
|
|
54
|
+
if (!offer) {
|
|
55
|
+
dropped.push(`filter ${condition.key}`);
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
return true;
|
|
59
|
+
});
|
|
60
|
+
if (kept.length > 0)
|
|
61
|
+
out.filter = kept;
|
|
62
|
+
}
|
|
63
|
+
if (arrangement.group) {
|
|
64
|
+
if (offers.groups.some((offer) => offer.key === arrangement.group.by))
|
|
65
|
+
out.group = arrangement.group;
|
|
66
|
+
else
|
|
67
|
+
dropped.push(`group ${arrangement.group.by}`);
|
|
68
|
+
}
|
|
69
|
+
return { arrangement: out, dropped };
|
|
70
|
+
}
|
|
71
|
+
function labelFor(ctx, node) {
|
|
72
|
+
return labelOf(ctx.schema.tryDefinition(node.kind), asRecord(node));
|
|
73
|
+
}
|
|
74
|
+
const compare = (a, b) => {
|
|
75
|
+
if (a === undefined || a === null)
|
|
76
|
+
return b === undefined || b === null ? 0 : 1;
|
|
77
|
+
if (b === undefined || b === null)
|
|
78
|
+
return -1;
|
|
79
|
+
if (typeof a === "number" && typeof b === "number")
|
|
80
|
+
return a - b;
|
|
81
|
+
if (typeof a === "boolean" && typeof b === "boolean")
|
|
82
|
+
return a === b ? 0 : a ? 1 : -1;
|
|
83
|
+
return String(a).localeCompare(String(b), undefined, { numeric: true, sensitivity: "base" });
|
|
84
|
+
};
|
|
85
|
+
/** What a node sorts by, for a key: its label, a field, or its first far end's label. */
|
|
86
|
+
function sortValue(ctx, node, by) {
|
|
87
|
+
if (by === "label")
|
|
88
|
+
return labelFor(ctx, node);
|
|
89
|
+
const definition = ctx.schema.tryDefinition(node.kind);
|
|
90
|
+
if (definition && by in (definition.fields.shape ?? {}))
|
|
91
|
+
return fields(node)[by];
|
|
92
|
+
const ends = farEnds(ctx.graph, node.id, by).map((end) => labelFor(ctx, end)).sort();
|
|
93
|
+
return ends[0];
|
|
94
|
+
}
|
|
95
|
+
const DAY = /^(\d{4})-(\d{2})-(\d{2})/;
|
|
96
|
+
/** The first day of the bucket a date falls in, as YYYY-MM-DD; weeks start on Monday, in UTC. */
|
|
97
|
+
export function bucketStart(date, bucket) {
|
|
98
|
+
const match = DAY.exec(date);
|
|
99
|
+
if (!match)
|
|
100
|
+
return undefined;
|
|
101
|
+
const [, y, m, d] = match;
|
|
102
|
+
if (bucket === "day")
|
|
103
|
+
return `${y}-${m}-${d}`;
|
|
104
|
+
if (bucket === "month")
|
|
105
|
+
return `${y}-${m}-01`;
|
|
106
|
+
if (bucket === "year")
|
|
107
|
+
return `${y}-01-01`;
|
|
108
|
+
if (bucket === "decade")
|
|
109
|
+
return `${String(Number(y) - (Number(y) % 10)).padStart(4, "0")}-01-01`;
|
|
110
|
+
const at = new Date(Date.UTC(Number(y), Number(m) - 1, Number(d)));
|
|
111
|
+
const back = (at.getUTCDay() + 6) % 7;
|
|
112
|
+
at.setUTCDate(at.getUTCDate() - back);
|
|
113
|
+
return at.toISOString().slice(0, 10);
|
|
114
|
+
}
|
|
115
|
+
const MONTHS = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
|
|
116
|
+
function bucketLabel(start, bucket) {
|
|
117
|
+
if (bucket === "month")
|
|
118
|
+
return `${MONTHS[Number(start.slice(5, 7)) - 1]} ${start.slice(0, 4)}`;
|
|
119
|
+
if (bucket === "week")
|
|
120
|
+
return `Week of ${start}`;
|
|
121
|
+
if (bucket === "year")
|
|
122
|
+
return start.slice(0, 4);
|
|
123
|
+
if (bucket === "decade")
|
|
124
|
+
return `The ${start.slice(0, 4)}s`;
|
|
125
|
+
return start;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Whether the words find the node — search's own matcher, so a list's `q`
|
|
129
|
+
* and the Find box never disagree: every word the start of a word in the
|
|
130
|
+
* label or a readable field, case, diacritics and punctuation aside.
|
|
131
|
+
*/
|
|
132
|
+
export function matches(ctx, node, query) {
|
|
133
|
+
return matcherFor(ctx, query)(node);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* The words, read once for a whole list. `key:value` tokens are conditions,
|
|
137
|
+
* as in the Find box: judged where the kind offers them, ignored where it
|
|
138
|
+
* does not — and words made ONLY of tokens nothing here offers (a pasted
|
|
139
|
+
* `https://…`, a `foo:bar`) find nothing, as `search()` says, rather than
|
|
140
|
+
* everything. `is:any` alone is a horizon, not a search: it keeps all.
|
|
141
|
+
*/
|
|
142
|
+
function matcherFor(ctx, query) {
|
|
143
|
+
const { words, conditions } = parseQuery(query);
|
|
144
|
+
if (words.length === 0 && conditions.length === 0)
|
|
145
|
+
return () => true;
|
|
146
|
+
const offers = new Map();
|
|
147
|
+
const offered = (kind) => {
|
|
148
|
+
let held = offers.get(kind);
|
|
149
|
+
if (!held) {
|
|
150
|
+
held = new Set(arrangeable(ctx.schema, kind).filters.map((offer) => offer.key));
|
|
151
|
+
offers.set(kind, held);
|
|
152
|
+
}
|
|
153
|
+
return held;
|
|
154
|
+
};
|
|
155
|
+
return (node) => {
|
|
156
|
+
const keys = offered(node.kind);
|
|
157
|
+
const applied = conditions.filter((condition) => keys.has(condition.key));
|
|
158
|
+
if (!applied.every((condition) => conditionHolds(ctx, node, condition)))
|
|
159
|
+
return false;
|
|
160
|
+
if (words.length > 0)
|
|
161
|
+
return matchNode(ctx.schema.tryDefinition(node.kind), asRecord(node), words) !== undefined;
|
|
162
|
+
return applied.length > 0;
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Filters, sorts and groups. The filter is a conjunction; the sort is
|
|
167
|
+
* stable; a grouping puts the group with nothing to say last. Nodes whose
|
|
168
|
+
* kind the context cannot describe are kept and sort by what they carry.
|
|
169
|
+
*/
|
|
170
|
+
export function arrange(nodes, arrangement, ctx) {
|
|
171
|
+
const query = arrangement.query?.trim();
|
|
172
|
+
const found = query ? nodes.filter(matcherFor(ctx, query)) : nodes;
|
|
173
|
+
const kept = arrangement.filter?.length
|
|
174
|
+
? found.filter((node) => arrangement.filter.every((condition) => conditionHolds(ctx, node, condition)))
|
|
175
|
+
: [...found];
|
|
176
|
+
const sort = arrangement.sort;
|
|
177
|
+
const ordered = sort
|
|
178
|
+
? kept
|
|
179
|
+
.map((node, index) => ({ node, index, value: sortValue(ctx, node, sort.by) }))
|
|
180
|
+
.sort((a, b) => {
|
|
181
|
+
const byValue = compare(a.value, b.value);
|
|
182
|
+
const signed = sort.direction === "desc" && byValue !== 0 && a.value !== undefined && b.value !== undefined ? -byValue : byValue;
|
|
183
|
+
return signed !== 0 ? signed : a.index - b.index;
|
|
184
|
+
})
|
|
185
|
+
.map((entry) => entry.node)
|
|
186
|
+
: kept;
|
|
187
|
+
const grouping = arrangement.group;
|
|
188
|
+
if (!grouping)
|
|
189
|
+
return { nodes: ordered, groups: [{ key: "", label: "", nodes: ordered }], grouped: false };
|
|
190
|
+
const groups = new Map();
|
|
191
|
+
const put = (key, label, node) => {
|
|
192
|
+
const group = groups.get(key) ?? { label, nodes: [] };
|
|
193
|
+
group.nodes.push(node);
|
|
194
|
+
groups.set(key, group);
|
|
195
|
+
};
|
|
196
|
+
const first = ordered[0];
|
|
197
|
+
const definition = first ? ctx.schema.tryDefinition(first.kind) : undefined;
|
|
198
|
+
const shape = (definition?.fields.shape ?? {});
|
|
199
|
+
const reading = definition ? readingOf(definition, grouping.by) : humaniseField(grouping.by);
|
|
200
|
+
const isField = grouping.by in shape;
|
|
201
|
+
const type = isField ? fieldType(shape[grouping.by]) : undefined;
|
|
202
|
+
const edgeReading = edgesOf(ctx.schema, first?.kind ?? "").find((offer) => offer.key === grouping.by)?.label;
|
|
203
|
+
// "No due date" for a field; an edge reads as a sentence, so "Without the list it is on".
|
|
204
|
+
const none = isField
|
|
205
|
+
? `No ${reading.toLowerCase()}`
|
|
206
|
+
: `Without ${(edgeReading ?? humaniseField(grouping.by)).toLowerCase()}`;
|
|
207
|
+
/*
|
|
208
|
+
* Two far ends of one name — a single and its album, both "Blue Hour" —
|
|
209
|
+
* are told apart in the heading, as they are in a picker (see `tellApart`):
|
|
210
|
+
* "Blue Hour · single, Blue Hour · album" rather than "Blue Hour, Blue Hour".
|
|
211
|
+
*/
|
|
212
|
+
const apart = isField
|
|
213
|
+
? new Map()
|
|
214
|
+
: tellApart([...new Map(ordered.flatMap((node) => farEnds(ctx.graph, node.id, grouping.by)).map((end) => [end.id, end])).values()].map(asRecord), (kind) => ctx.schema.tryDefinition(kind));
|
|
215
|
+
for (const node of ordered) {
|
|
216
|
+
if (isField) {
|
|
217
|
+
const value = fields(node)[grouping.by];
|
|
218
|
+
if (value === undefined || value === null || value === "") {
|
|
219
|
+
put("", none, node);
|
|
220
|
+
}
|
|
221
|
+
else if (type === "date") {
|
|
222
|
+
const bucket = grouping.bucket ?? "day";
|
|
223
|
+
const start = bucketStart(String(value), bucket);
|
|
224
|
+
if (start)
|
|
225
|
+
put(start, bucketLabel(start, bucket), node);
|
|
226
|
+
else
|
|
227
|
+
put("", none, node);
|
|
228
|
+
}
|
|
229
|
+
else if (type === "boolean") {
|
|
230
|
+
put(value ? "1" : "0", value ? "Yes" : "No", node);
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
const format = definition?.display?.format?.[grouping.by];
|
|
234
|
+
put(String(value), format ? format(value) : String(value), node);
|
|
235
|
+
}
|
|
236
|
+
continue;
|
|
237
|
+
}
|
|
238
|
+
const ends = farEnds(ctx.graph, node.id, grouping.by)
|
|
239
|
+
.map((end) => ({ id: end.id, label: apart.has(end.id) ? `${labelFor(ctx, end)} · ${apart.get(end.id)}` : labelFor(ctx, end) }))
|
|
240
|
+
.sort((a, b) => a.label.localeCompare(b.label));
|
|
241
|
+
if (ends.length === 0)
|
|
242
|
+
put("", none, node);
|
|
243
|
+
else
|
|
244
|
+
put(ends.map((end) => end.id).join(","), ends.map((end) => end.label).join(", "), node);
|
|
245
|
+
}
|
|
246
|
+
const optionOrder = type === "choice" ? describeArgOptions(shape[grouping.by]) : undefined;
|
|
247
|
+
const orderedGroups = [...groups.entries()]
|
|
248
|
+
.sort(([a, ga], [b, gb]) => {
|
|
249
|
+
if (a === "")
|
|
250
|
+
return 1;
|
|
251
|
+
if (b === "")
|
|
252
|
+
return -1;
|
|
253
|
+
if (optionOrder)
|
|
254
|
+
return optionOrder.indexOf(a) - optionOrder.indexOf(b);
|
|
255
|
+
if (type === "boolean")
|
|
256
|
+
return b.localeCompare(a); // Yes before No
|
|
257
|
+
if (type === "date")
|
|
258
|
+
return a.localeCompare(b);
|
|
259
|
+
return ga.label.localeCompare(gb.label);
|
|
260
|
+
})
|
|
261
|
+
.map(([key, group]) => ({ key, label: group.label, nodes: group.nodes }));
|
|
262
|
+
return { nodes: ordered, groups: orderedGroups, grouped: true };
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=arranging.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arranging.js","sourceRoot":"","sources":["../src/arranging.ts"],"names":[],"mappings":"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"}
|
package/dist/blocks.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { compileBlocks, fieldSpecsOf, isTallBlock, resolveBlocks, safeHref, sayNumber } from "./document/blocks.js";
|
|
2
|
+
export type { BlockContext, ResolvedBlock, ResolvedList, SpecBlock } from "./document/blocks.js";
|
|
3
|
+
export { computedNames, computedValues, withComputed } from "./document/computed-values.js";
|
|
4
|
+
export type { ComputedRecord, ComputedValues, PlainComputed } from "./document/computed-values.js";
|
|
5
|
+
//# sourceMappingURL=blocks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blocks.d.ts","sourceRoot":"","sources":["../src/blocks.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACpH,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjG,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC5F,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC"}
|
package/dist/blocks.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* `@graview/core/blocks` — a view's blocks resolved against a record, and
|
|
3
|
+
* the computed values they read.
|
|
4
|
+
*
|
|
5
|
+
* An entry of its own, not part of `@graview/core/document`: a hosted page
|
|
6
|
+
* imports that barrel up front to compile its document, and a bundler
|
|
7
|
+
* places a whole module in every chunk that can reach it — so a resolver
|
|
8
|
+
* only the faces call, once they are fetched to draw, rode in what every
|
|
9
|
+
* hosted page loads first. The views that draw blocks, the pages and an
|
|
10
|
+
* agent's seat import it from here, and it loads when they do.
|
|
11
|
+
*/
|
|
12
|
+
export { compileBlocks, fieldSpecsOf, isTallBlock, resolveBlocks, safeHref, sayNumber } from "./document/blocks.js";
|
|
13
|
+
export { computedNames, computedValues, withComputed } from "./document/computed-values.js";
|
|
14
|
+
//# sourceMappingURL=blocks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blocks.js","sourceRoot":"","sources":["../src/blocks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEpH,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC"}
|
package/dist/capabilities.js
CHANGED
|
@@ -17,7 +17,7 @@ export const WIRE_PROTOCOL = 1;
|
|
|
17
17
|
* id is named in the changeset that shipped it; `capabilities.test.ts`
|
|
18
18
|
* holds the two lists to each other.
|
|
19
19
|
*/
|
|
20
|
-
const SHIPPED = ["FR-01", "FR-02", "FR-03", "FR-04", "FR-05", "FR-06", "FR-07", "FR-08", "FR-09", "FR-10", "FR-11", "FR-12", "FR-13", "FR-15", "FR-16", "FR-17", "FR-18", "FR-19", "FR-20", "FR-21", "FR-22", "FR-23", "FR-24", "FR-25", "FR-26", "FR-27", "FR-28", "FR-29", "FR-30", "FR-31", "FR-32", "FR-33", "FR-34", "FR-35", "FR-36", "FR-37", "FR-38", "FR-39", "FR-40", "FR-41", "FR-42", "FR-43", "FR-44", "FR-45", "FR-46", "FR-47", "FR-49", "FR-50", "FR-51", "FR-52", "FR-53", "FR-54", "FR-55", "FR-56", "FR-57", "FR-58", "FR-59", "FR-60", "FR-61", "FR-62", "FR-63", "FR-64", "FR-65", "FR-66", "FR-67", "FR-68", "FR-69", "FR-70", "FR-71", "FR-72", "FR-73", "FR-74", "FR-75", "FR-76", "FR-77", "FR-78", "FR-79", "FR-80", "FR-81", "FR-82", "FR-83", "FR-84", "FR-85", "FR-86", "FR-87", "FR-88", "FR-89", "FR-90", "FR-91", "FR-92", "FR-93", "FR-94", "FR-95", "FR-96"];
|
|
20
|
+
const SHIPPED = ["FR-01", "FR-02", "FR-03", "FR-04", "FR-05", "FR-06", "FR-07", "FR-08", "FR-09", "FR-10", "FR-11", "FR-12", "FR-13", "FR-15", "FR-16", "FR-17", "FR-18", "FR-19", "FR-20", "FR-21", "FR-22", "FR-23", "FR-24", "FR-25", "FR-26", "FR-27", "FR-28", "FR-29", "FR-30", "FR-31", "FR-32", "FR-33", "FR-34", "FR-35", "FR-36", "FR-37", "FR-38", "FR-39", "FR-40", "FR-41", "FR-42", "FR-43", "FR-44", "FR-45", "FR-46", "FR-47", "FR-49", "FR-50", "FR-51", "FR-52", "FR-53", "FR-54", "FR-55", "FR-56", "FR-57", "FR-58", "FR-59", "FR-60", "FR-61", "FR-62", "FR-63", "FR-64", "FR-65", "FR-66", "FR-67", "FR-68", "FR-69", "FR-70", "FR-71", "FR-72", "FR-73", "FR-74", "FR-75", "FR-76", "FR-77", "FR-78", "FR-79", "FR-80", "FR-81", "FR-82", "FR-83", "FR-84", "FR-85", "FR-86", "FR-87", "FR-88", "FR-89", "FR-90", "FR-91", "FR-92", "FR-93", "FR-94", "FR-95", "FR-96", "FR-97", "FR-99", "FR-100", "FR-101", "FR-102", "FR-103", "FR-104", "FR-105", "FR-106", "FR-107", "FR-108", "FR-109", "FR-110", "FR-111", "FR-112", "FR-113", "FR-114", "FR-115", "FR-116", "FR-117", "FR-118"];
|
|
21
21
|
/**
|
|
22
22
|
* The declaration-document formats `@graview/core/document` parses, as
|
|
23
23
|
* `<format>@<version>`. Said here rather than imported, so the main entry
|
package/dist/capabilities.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC;AAE/B;;;;;;GAMG;AACH,MAAM,OAAO,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC;AAE/B;;;;;;GAMG;AACH,MAAM,OAAO,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAU,CAAC;AAExjC;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,oBAAoB,CAAU,CAAC;AAehE,oGAAoG;AACpG,MAAM,UAAU,YAAY;IAC1B,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,aAAa,EAAE,eAAe,EAAE,CAAC,GAAG,gBAAgB,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC;AAClJ,CAAC"}
|
package/dist/check.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { checkApp, formatFindings } from "./cli/check.js";
|
|
2
|
+
export type { CheckResult, Finding, Severity } from "./cli/check.js";
|
|
3
|
+
export { compileDocument } from "./document/compile-checked.js";
|
|
4
|
+
export { instantiateTemplate } from "./document/instantiate-template.js";
|
|
5
|
+
export { describeApp } from "./cli/describe.js";
|
|
6
|
+
export type { DescribeOptions } from "./cli/describe.js";
|
|
7
|
+
export { generateAgentsMd, generateLlmsTxt } from "./cli/docs.js";
|
|
8
|
+
//# sourceMappingURL=check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../src/check.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC1D,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/check.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* `@graview/core/check` — the checker, and the app read out in words: what
|
|
3
|
+
* `graview check`, `graview describe` and `graview docs` say of a
|
|
4
|
+
* declaration, and a document or a template compiled WITH the checker.
|
|
5
|
+
*
|
|
6
|
+
* An entry of its own, not part of `@graview/core` or
|
|
7
|
+
* `@graview/core/document`: a hosted page imports both barrels up front, and
|
|
8
|
+
* a bundler places a whole module in every chunk that can reach it — so the
|
|
9
|
+
* checker's reach (the city, the figures, the order things are made in)
|
|
10
|
+
* rode in what every hosted page loads first, though the page compiles with
|
|
11
|
+
* `compileDocumentWithoutCheck` and never asks for a verdict. A host, the
|
|
12
|
+
* command line and a test import the checker from here.
|
|
13
|
+
*/
|
|
14
|
+
export { checkApp, formatFindings } from "./cli/check.js";
|
|
15
|
+
export { compileDocument } from "./document/compile-checked.js";
|
|
16
|
+
export { instantiateTemplate } from "./document/instantiate-template.js";
|
|
17
|
+
export { describeApp } from "./cli/describe.js";
|
|
18
|
+
export { generateAgentsMd, generateLlmsTxt } from "./cli/docs.js";
|
|
19
|
+
//# sourceMappingURL=check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../src/check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAE1D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brand.d.ts","sourceRoot":"","sources":["../../../src/cli/check/brand.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAExD;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,wBAAgB,YAAY,CAAC,CAAC,SAAS,SAAS,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"brand.d.ts","sourceRoot":"","sources":["../../../src/cli/check/brand.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAExD;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,wBAAgB,YAAY,CAAC,CAAC,SAAS,SAAS,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI,CA+C5E;AAED,wBAAgB,YAAY,CAAC,CAAC,SAAS,SAAS,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI,CA2H5E"}
|
package/dist/cli/check/brand.js
CHANGED
|
@@ -27,6 +27,27 @@ export function checkAccents(ctx) {
|
|
|
27
27
|
});
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
|
+
/*
|
|
31
|
+
* THE APP'S MONEY (FR-100). A currency or a locale the runtime cannot
|
|
32
|
+
* format with is said as a plain number everywhere — a brand decision
|
|
33
|
+
* that looks applied and is not — so it is refused here by name.
|
|
34
|
+
*/
|
|
35
|
+
const { currency, locale } = app.brand ?? {};
|
|
36
|
+
const formats = (options, at) => {
|
|
37
|
+
try {
|
|
38
|
+
new Intl.NumberFormat(at ?? "en-US", options);
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
if (currency !== undefined && (!/^[A-Z]{3}$/.test(currency) || !formats({ style: "currency", currency }))) {
|
|
46
|
+
add({ severity: "error", code: "brand-currency", where: "brand.currency", message: `"${currency}" is not a currency's three-letter code, so money would be said with no symbol.`, fix: 'Use an ISO 4217 code, like "USD", "EUR" or "GBP".' });
|
|
47
|
+
}
|
|
48
|
+
if (locale !== undefined && !formats({}, locale)) {
|
|
49
|
+
add({ severity: "error", code: "brand-locale", where: "brand.locale", message: `"${locale}" is not a locale, so money could not be written for it.`, fix: 'Use a language tag, like "en-US" or "de-DE".' });
|
|
50
|
+
}
|
|
30
51
|
}
|
|
31
52
|
export function checkPalette(ctx) {
|
|
32
53
|
const { app, kinds, add } = ctx;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brand.js","sourceRoot":"","sources":["../../../src/cli/check/brand.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"brand.js","sourceRoot":"","sources":["../../../src/cli/check/brand.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hidden-reads.d.ts","sourceRoot":"","sources":["../../../src/cli/check/hidden-reads.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAmJjD,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,SAAS,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI,CAqChF"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { documentOf } from "../../document/to-document.js";
|
|
2
|
+
import { parseExpr } from "../../document/expr/parse.js";
|
|
3
|
+
import { perMember } from "../../document/expr/analyze.js";
|
|
4
|
+
import { farEnd } from "../../document/far-end.js";
|
|
5
|
+
import { parseTemplate } from "../../document/template.js";
|
|
6
|
+
import { nodeRefKinds } from "../../mutations/node-ref.js";
|
|
7
|
+
import { withArticle } from "../../schema/define-node.js";
|
|
8
|
+
import { permits, rolesOf } from "../../permissions/policy.js";
|
|
9
|
+
/** The kinds an expression reads, standing on `from`: swept, walked to, or read by a relation's name. */
|
|
10
|
+
function kindsRead(expr, from, schema, into, why) {
|
|
11
|
+
const definition = (kind) => schema.tryDefinition(kind);
|
|
12
|
+
const targets = (kinds, edge) => kinds.flatMap((kind) => {
|
|
13
|
+
const to = definition(kind)?.edges?.[edge]?.to;
|
|
14
|
+
return to === "*" ? [...schema.kinds] : [...(to ?? [])];
|
|
15
|
+
});
|
|
16
|
+
const sources = (edge) => schema.kinds.filter((kind) => definition(kind)?.edges?.[edge]);
|
|
17
|
+
const note = (kinds) => kinds.forEach((kind) => into.has(kind) || into.set(kind, why));
|
|
18
|
+
const every = schema.kinds;
|
|
19
|
+
const visit = (e, at) => {
|
|
20
|
+
switch (e.t) {
|
|
21
|
+
case "ident": {
|
|
22
|
+
const reached = targets(at, e.name);
|
|
23
|
+
note(reached);
|
|
24
|
+
return reached;
|
|
25
|
+
}
|
|
26
|
+
case "member": {
|
|
27
|
+
const reached = targets(visit(e.object, at), e.name);
|
|
28
|
+
note(reached);
|
|
29
|
+
return reached;
|
|
30
|
+
}
|
|
31
|
+
case "where": {
|
|
32
|
+
const set = visit(e.set, at);
|
|
33
|
+
visit(e.filter, set);
|
|
34
|
+
return set;
|
|
35
|
+
}
|
|
36
|
+
case "list":
|
|
37
|
+
e.items.forEach((x) => visit(x, at));
|
|
38
|
+
return [];
|
|
39
|
+
case "unary":
|
|
40
|
+
visit(e.operand, at);
|
|
41
|
+
return [];
|
|
42
|
+
case "binary":
|
|
43
|
+
return [...visit(e.left, at), ...visit(e.right, at)];
|
|
44
|
+
case "call": {
|
|
45
|
+
const word = (i) => (e.args[i]?.t === "lit" && typeof e.args[i].value === "string" ? (e.args[i].value) : undefined);
|
|
46
|
+
let reached = [];
|
|
47
|
+
if (e.fn === "all" && word(0))
|
|
48
|
+
reached = [word(0)];
|
|
49
|
+
else if ((e.fn === "out" || e.fn === "in") && word(e.args.length === 2 ? 1 : 0)) {
|
|
50
|
+
// A walk from the record, or from every member of a set (FR-101).
|
|
51
|
+
const edge = word(e.args.length === 2 ? 1 : 0);
|
|
52
|
+
const from = e.args.length === 2 ? visit(e.args[0], at) : at;
|
|
53
|
+
reached = e.fn === "out" ? targets(from, edge) : sources(edge);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
const set = e.args[0] ? visit(e.args[0], at) : [];
|
|
57
|
+
e.args.slice(1).forEach((x, i) => visit(x, perMember(e, i + 1) ? (set.length > 0 ? set : every) : at));
|
|
58
|
+
return e.fn === "first" || e.fn === "sort" || e.fn === "either" ? set : [];
|
|
59
|
+
}
|
|
60
|
+
note(reached);
|
|
61
|
+
return reached;
|
|
62
|
+
}
|
|
63
|
+
default:
|
|
64
|
+
return [];
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
visit(expr, from);
|
|
68
|
+
}
|
|
69
|
+
/** What a document's act reads, by kind, and where: its condition, its refusal, its sets and effects. */
|
|
70
|
+
function documentActReads(act, schema) {
|
|
71
|
+
const reads = new Map();
|
|
72
|
+
const on = act["on"];
|
|
73
|
+
const from = typeof on === "string" ? [on] : Array.isArray(on) ? on : [];
|
|
74
|
+
const read = (source, why) => {
|
|
75
|
+
if (typeof source !== "string")
|
|
76
|
+
return;
|
|
77
|
+
try {
|
|
78
|
+
kindsRead(parseExpr(source), from, schema, reads, why);
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// An expression that does not parse is the compile's to refuse.
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
read(act["allowedWhen"], "its condition");
|
|
85
|
+
if (typeof act["refusal"] === "string") {
|
|
86
|
+
try {
|
|
87
|
+
for (const part of parseTemplate(act["refusal"]))
|
|
88
|
+
if (part.source)
|
|
89
|
+
read(part.source, "its refusal");
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
// As above.
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
const values = (set, why) => {
|
|
96
|
+
if (set && typeof set === "object")
|
|
97
|
+
for (const value of Object.values(set))
|
|
98
|
+
if (value && typeof value === "object" && "expr" in value)
|
|
99
|
+
read(value.expr, why);
|
|
100
|
+
};
|
|
101
|
+
values(act["sets"], "a value it sets");
|
|
102
|
+
for (const effect of act["effects"] ?? [])
|
|
103
|
+
values(effect.set, "a value it sets");
|
|
104
|
+
/*
|
|
105
|
+
* THE OTHER END (FR-115). A value set on the record at the other end of
|
|
106
|
+
* what the act connects is worked out standing on that record; and the
|
|
107
|
+
* links an act replaces name the records at their far ends, whose kinds
|
|
108
|
+
* it reads to sever them.
|
|
109
|
+
*/
|
|
110
|
+
const declared = Object.fromEntries(schema.definitions.map((definition) => [definition.kind, { edges: definition.edges ?? {} }]));
|
|
111
|
+
const relation = (act["connects"] ?? act["severs"]);
|
|
112
|
+
const end = relation ? farEnd(declared, relation, from) : undefined;
|
|
113
|
+
const sets = act["setsOther"];
|
|
114
|
+
if (end && sets && typeof sets === "object") {
|
|
115
|
+
const there = end.kinds === "*" ? schema.kinds : end.kinds;
|
|
116
|
+
for (const value of Object.values(sets)) {
|
|
117
|
+
if (!value || typeof value !== "object" || !("expr" in value) || typeof value.expr !== "string")
|
|
118
|
+
continue;
|
|
119
|
+
try {
|
|
120
|
+
kindsRead(parseExpr(value.expr), there, schema, reads, "a value it sets on the other record");
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
// The compile's to refuse.
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
const replaces = act["replaces"];
|
|
128
|
+
for (const replaced of replaces === true && relation ? [relation] : Array.isArray(replaces) ? replaces : []) {
|
|
129
|
+
const other = farEnd(declared, replaced, from);
|
|
130
|
+
for (const kind of other && other.kinds !== "*" ? other.kinds : [])
|
|
131
|
+
if (!reads.has(kind))
|
|
132
|
+
reads.set(kind, "the links it replaces");
|
|
133
|
+
}
|
|
134
|
+
return reads;
|
|
135
|
+
}
|
|
136
|
+
export function checkHiddenReads(ctx) {
|
|
137
|
+
const { app, declaredMutations, add } = ctx;
|
|
138
|
+
const sights = app.policy?.sees ?? [];
|
|
139
|
+
if (!app.policy || sights.length === 0)
|
|
140
|
+
return;
|
|
141
|
+
const schema = app.schema;
|
|
142
|
+
const acts = (documentOf(app)?.acts ?? {});
|
|
143
|
+
/** A role sees a kind when some sight names it for the role, and not only where it is the role's own. */
|
|
144
|
+
const sees = (role, kind) => sights.some((sight) => sight.kinds.includes(kind) && (sight.roles === "*" || sight.roles.includes(role)));
|
|
145
|
+
const roles = [...new Set([...rolesOf(app.policy), ...sights.flatMap((sight) => (sight.roles === "*" ? [] : sight.roles))])].sort();
|
|
146
|
+
for (const mutation of declaredMutations) {
|
|
147
|
+
const reads = Object.prototype.hasOwnProperty.call(acts, mutation.name) ? documentActReads(acts[mutation.name], schema) : new Map();
|
|
148
|
+
for (const kind of mutation.reads ?? [])
|
|
149
|
+
if (!reads.has(kind))
|
|
150
|
+
reads.set(kind, "what it declares it reads");
|
|
151
|
+
const shape = mutation.input.shape ?? {};
|
|
152
|
+
for (const [arg, field] of Object.entries(shape)) {
|
|
153
|
+
if (arg === mutation.subject?.arg)
|
|
154
|
+
continue;
|
|
155
|
+
for (const kind of nodeRefKinds(field) ?? [])
|
|
156
|
+
if (kind !== "*" && !reads.has(kind))
|
|
157
|
+
reads.set(kind, `its argument "${arg}"`);
|
|
158
|
+
}
|
|
159
|
+
if (reads.size === 0)
|
|
160
|
+
continue;
|
|
161
|
+
const subjects = mutation.subject && mutation.subject.kinds !== "*" ? mutation.subject.kinds : [undefined];
|
|
162
|
+
for (const role of roles) {
|
|
163
|
+
const runs = subjects.some((kind) => permits(app.policy, { kind: "human", id: "themselves", roles: [role] }, mutation.name, kind, undefined, "themselves").ok);
|
|
164
|
+
if (!runs)
|
|
165
|
+
continue;
|
|
166
|
+
for (const [kind, why] of reads) {
|
|
167
|
+
if (sees(role, kind))
|
|
168
|
+
continue;
|
|
169
|
+
const argument = why.startsWith("its argument");
|
|
170
|
+
add({
|
|
171
|
+
severity: "warning",
|
|
172
|
+
code: "act-reads-hidden-kind",
|
|
173
|
+
where: mutation.name,
|
|
174
|
+
message: argument
|
|
175
|
+
? `"${mutation.name}" asks for ${kind} records (${why}), and "${role}" may run it but may not see one, so "${role}" can never give one: the store refuses it as missing.`
|
|
176
|
+
: `"${mutation.name}" reads ${kind} records (${why}), which "${role}" may run it but may not see: whether it is allowed, what it refuses with or what it writes can tell "${role}" that ${withArticle(kind)} they cannot see exists.`,
|
|
177
|
+
fix: `Let "${role}" see ${kind}, keep "${mutation.name}" from "${role}", or have it read only what "${role}" sees.`,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=hidden-reads.js.map
|