@graview/core 0.1.0 → 0.1.3

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 (296) hide show
  1. package/README.md +7 -0
  2. package/dist/app.d.ts +17 -0
  3. package/dist/app.d.ts.map +1 -1
  4. package/dist/app.js.map +1 -1
  5. package/dist/arrange.d.ts +3 -2
  6. package/dist/arrange.d.ts.map +1 -1
  7. package/dist/arrange.js +19 -2
  8. package/dist/arrange.js.map +1 -1
  9. package/dist/beginning.d.ts +5 -2
  10. package/dist/beginning.d.ts.map +1 -1
  11. package/dist/beginning.js +28 -0
  12. package/dist/beginning.js.map +1 -1
  13. package/dist/capabilities.d.ts +32 -0
  14. package/dist/capabilities.d.ts.map +1 -0
  15. package/dist/capabilities.js +31 -0
  16. package/dist/capabilities.js.map +1 -0
  17. package/dist/cli/check/index.d.ts +1 -0
  18. package/dist/cli/check/index.d.ts.map +1 -1
  19. package/dist/cli/check/index.js +1 -0
  20. package/dist/cli/check/index.js.map +1 -1
  21. package/dist/cli/check/lenses.d.ts.map +1 -1
  22. package/dist/cli/check/lenses.js +25 -0
  23. package/dist/cli/check/lenses.js.map +1 -1
  24. package/dist/cli/check/policy.d.ts.map +1 -1
  25. package/dist/cli/check/policy.js +35 -0
  26. package/dist/cli/check/policy.js.map +1 -1
  27. package/dist/cli/check/relations.d.ts.map +1 -1
  28. package/dist/cli/check/relations.js +31 -0
  29. package/dist/cli/check/relations.js.map +1 -1
  30. package/dist/cli/check/views.d.ts +14 -0
  31. package/dist/cli/check/views.d.ts.map +1 -0
  32. package/dist/cli/check/views.js +27 -0
  33. package/dist/cli/check/views.js.map +1 -0
  34. package/dist/cli/check.d.ts.map +1 -1
  35. package/dist/cli/check.js +2 -1
  36. package/dist/cli/check.js.map +1 -1
  37. package/dist/cli/create.d.ts +1 -1
  38. package/dist/cli/create.d.ts.map +1 -1
  39. package/dist/cli/create.js +63 -1
  40. package/dist/cli/create.js.map +1 -1
  41. package/dist/cli/index.d.ts +18 -1
  42. package/dist/cli/index.d.ts.map +1 -1
  43. package/dist/cli/index.js +66 -1
  44. package/dist/cli/index.js.map +1 -1
  45. package/dist/conformance/fixtures.d.ts +41 -0
  46. package/dist/conformance/fixtures.d.ts.map +1 -0
  47. package/dist/conformance/fixtures.js +950 -0
  48. package/dist/conformance/fixtures.js.map +1 -0
  49. package/dist/conformance/index.d.ts +54 -0
  50. package/dist/conformance/index.d.ts.map +1 -0
  51. package/dist/conformance/index.js +81 -0
  52. package/dist/conformance/index.js.map +1 -0
  53. package/dist/document/canonical.d.ts +4 -0
  54. package/dist/document/canonical.d.ts.map +1 -0
  55. package/dist/document/canonical.js +29 -0
  56. package/dist/document/canonical.js.map +1 -0
  57. package/dist/document/compile.d.ts +43 -0
  58. package/dist/document/compile.d.ts.map +1 -0
  59. package/dist/document/compile.js +807 -0
  60. package/dist/document/compile.js.map +1 -0
  61. package/dist/document/diff.d.ts +32 -0
  62. package/dist/document/diff.d.ts.map +1 -0
  63. package/dist/document/diff.js +148 -0
  64. package/dist/document/diff.js.map +1 -0
  65. package/dist/document/edit.d.ts +63 -0
  66. package/dist/document/edit.d.ts.map +1 -0
  67. package/dist/document/edit.js +1432 -0
  68. package/dist/document/edit.js.map +1 -0
  69. package/dist/document/expr/analyze.d.ts +14 -0
  70. package/dist/document/expr/analyze.d.ts.map +1 -0
  71. package/dist/document/expr/analyze.js +52 -0
  72. package/dist/document/expr/analyze.js.map +1 -0
  73. package/dist/document/expr/evaluate.d.ts +36 -0
  74. package/dist/document/expr/evaluate.d.ts.map +1 -0
  75. package/dist/document/expr/evaluate.js +344 -0
  76. package/dist/document/expr/evaluate.js.map +1 -0
  77. package/dist/document/expr/index.d.ts +8 -0
  78. package/dist/document/expr/index.d.ts.map +1 -0
  79. package/dist/document/expr/index.js +5 -0
  80. package/dist/document/expr/index.js.map +1 -0
  81. package/dist/document/expr/parse.d.ts +50 -0
  82. package/dist/document/expr/parse.d.ts.map +1 -0
  83. package/dist/document/expr/parse.js +240 -0
  84. package/dist/document/expr/parse.js.map +1 -0
  85. package/dist/document/expr/print.d.ts +4 -0
  86. package/dist/document/expr/print.d.ts.map +1 -0
  87. package/dist/document/expr/print.js +81 -0
  88. package/dist/document/expr/print.js.map +1 -0
  89. package/dist/document/findings.d.ts +15 -0
  90. package/dist/document/findings.d.ts.map +1 -0
  91. package/dist/document/findings.js +30 -0
  92. package/dist/document/findings.js.map +1 -0
  93. package/dist/document/graview-template.d.ts +148 -0
  94. package/dist/document/graview-template.d.ts.map +1 -0
  95. package/dist/document/graview-template.js +450 -0
  96. package/dist/document/graview-template.js.map +1 -0
  97. package/dist/document/index.d.ts +27 -0
  98. package/dist/document/index.d.ts.map +1 -0
  99. package/dist/document/index.js +16 -0
  100. package/dist/document/index.js.map +1 -0
  101. package/dist/document/migrate.d.ts +41 -0
  102. package/dist/document/migrate.d.ts.map +1 -0
  103. package/dist/document/migrate.js +252 -0
  104. package/dist/document/migrate.js.map +1 -0
  105. package/dist/document/patch.d.ts +16 -0
  106. package/dist/document/patch.d.ts.map +1 -0
  107. package/dist/document/patch.js +79 -0
  108. package/dist/document/patch.js.map +1 -0
  109. package/dist/document/rules.d.ts +40 -0
  110. package/dist/document/rules.d.ts.map +1 -0
  111. package/dist/document/rules.js +88 -0
  112. package/dist/document/rules.js.map +1 -0
  113. package/dist/document/schema.d.ts +461 -0
  114. package/dist/document/schema.d.ts.map +1 -0
  115. package/dist/document/schema.js +199 -0
  116. package/dist/document/schema.js.map +1 -0
  117. package/dist/document/template.d.ts +28 -0
  118. package/dist/document/template.d.ts.map +1 -0
  119. package/dist/document/template.js +117 -0
  120. package/dist/document/template.js.map +1 -0
  121. package/dist/document/to-document.d.ts +34 -0
  122. package/dist/document/to-document.d.ts.map +1 -0
  123. package/dist/document/to-document.js +186 -0
  124. package/dist/document/to-document.js.map +1 -0
  125. package/dist/document/upgrade.d.ts +9 -0
  126. package/dist/document/upgrade.d.ts.map +1 -0
  127. package/dist/document/upgrade.js +19 -0
  128. package/dist/document/upgrade.js.map +1 -0
  129. package/dist/document/views.d.ts +65 -0
  130. package/dist/document/views.d.ts.map +1 -0
  131. package/dist/document/views.js +264 -0
  132. package/dist/document/views.js.map +1 -0
  133. package/dist/formats.d.ts +50 -0
  134. package/dist/formats.d.ts.map +1 -0
  135. package/dist/formats.js +75 -0
  136. package/dist/formats.js.map +1 -0
  137. package/dist/graph/graph.d.ts +61 -3
  138. package/dist/graph/graph.d.ts.map +1 -1
  139. package/dist/graph/graph.js +187 -20
  140. package/dist/graph/graph.js.map +1 -1
  141. package/dist/index.d.ts +43 -18
  142. package/dist/index.d.ts.map +1 -1
  143. package/dist/index.js +31 -11
  144. package/dist/index.js.map +1 -1
  145. package/dist/integrity.d.ts +46 -0
  146. package/dist/integrity.d.ts.map +1 -0
  147. package/dist/integrity.js +179 -0
  148. package/dist/integrity.js.map +1 -0
  149. package/dist/invariants/engine.d.ts +8 -0
  150. package/dist/invariants/engine.d.ts.map +1 -1
  151. package/dist/invariants/engine.js +40 -2
  152. package/dist/invariants/engine.js.map +1 -1
  153. package/dist/invariants/types.d.ts +19 -0
  154. package/dist/invariants/types.d.ts.map +1 -1
  155. package/dist/labels.d.ts +65 -0
  156. package/dist/labels.d.ts.map +1 -0
  157. package/dist/labels.js +123 -0
  158. package/dist/labels.js.map +1 -0
  159. package/dist/mutations/define-mutation.d.ts.map +1 -1
  160. package/dist/mutations/define-mutation.js +5 -6
  161. package/dist/mutations/define-mutation.js.map +1 -1
  162. package/dist/mutations/derive-edits.d.ts.map +1 -1
  163. package/dist/mutations/derive-edits.js +20 -1
  164. package/dist/mutations/derive-edits.js.map +1 -1
  165. package/dist/mutations/form.d.ts +9 -0
  166. package/dist/mutations/form.d.ts.map +1 -1
  167. package/dist/mutations/form.js +20 -0
  168. package/dist/mutations/form.js.map +1 -1
  169. package/dist/mutations/node-ref.d.ts +6 -0
  170. package/dist/mutations/node-ref.d.ts.map +1 -1
  171. package/dist/mutations/node-ref.js +22 -8
  172. package/dist/mutations/node-ref.js.map +1 -1
  173. package/dist/mutations/types.d.ts +8 -0
  174. package/dist/mutations/types.d.ts.map +1 -1
  175. package/dist/mutations/words.d.ts +49 -0
  176. package/dist/mutations/words.d.ts.map +1 -0
  177. package/dist/mutations/words.js +61 -0
  178. package/dist/mutations/words.js.map +1 -0
  179. package/dist/ops/log.d.ts +156 -4
  180. package/dist/ops/log.d.ts.map +1 -1
  181. package/dist/ops/log.js +234 -51
  182. package/dist/ops/log.js.map +1 -1
  183. package/dist/ops/revisions.d.ts +66 -0
  184. package/dist/ops/revisions.d.ts.map +1 -0
  185. package/dist/ops/revisions.js +97 -0
  186. package/dist/ops/revisions.js.map +1 -0
  187. package/dist/ops/types.d.ts +49 -1
  188. package/dist/ops/types.d.ts.map +1 -1
  189. package/dist/ops/undo.d.ts +29 -2
  190. package/dist/ops/undo.d.ts.map +1 -1
  191. package/dist/ops/undo.js +110 -1
  192. package/dist/ops/undo.js.map +1 -1
  193. package/dist/ops/withheld.d.ts +37 -0
  194. package/dist/ops/withheld.d.ts.map +1 -0
  195. package/dist/ops/withheld.js +84 -0
  196. package/dist/ops/withheld.js.map +1 -0
  197. package/dist/permissions/policy.d.ts +15 -0
  198. package/dist/permissions/policy.d.ts.map +1 -1
  199. package/dist/permissions/policy.js +28 -1
  200. package/dist/permissions/policy.js.map +1 -1
  201. package/dist/permissions/sight.d.ts +66 -0
  202. package/dist/permissions/sight.d.ts.map +1 -0
  203. package/dist/permissions/sight.js +131 -0
  204. package/dist/permissions/sight.js.map +1 -0
  205. package/dist/permissions/types.d.ts +26 -0
  206. package/dist/permissions/types.d.ts.map +1 -1
  207. package/dist/permissions/types.js.map +1 -1
  208. package/dist/persistence/memory.d.ts.map +1 -1
  209. package/dist/persistence/memory.js +25 -0
  210. package/dist/persistence/memory.js.map +1 -1
  211. package/dist/persistence/sql.d.ts +43 -0
  212. package/dist/persistence/sql.d.ts.map +1 -0
  213. package/dist/persistence/sql.js +154 -0
  214. package/dist/persistence/sql.js.map +1 -0
  215. package/dist/persistence/sqlite.d.ts +17 -3
  216. package/dist/persistence/sqlite.d.ts.map +1 -1
  217. package/dist/persistence/sqlite.js +32 -96
  218. package/dist/persistence/sqlite.js.map +1 -1
  219. package/dist/persistence/types.d.ts +19 -0
  220. package/dist/persistence/types.d.ts.map +1 -1
  221. package/dist/presence.d.ts +56 -0
  222. package/dist/presence.d.ts.map +1 -1
  223. package/dist/presence.js +62 -2
  224. package/dist/presence.js.map +1 -1
  225. package/dist/refusal.d.ts +34 -0
  226. package/dist/refusal.d.ts.map +1 -0
  227. package/dist/refusal.js +40 -0
  228. package/dist/refusal.js.map +1 -0
  229. package/dist/scaffold/from-template.d.ts +16 -0
  230. package/dist/scaffold/from-template.d.ts.map +1 -0
  231. package/dist/scaffold/from-template.js +157 -0
  232. package/dist/scaffold/from-template.js.map +1 -0
  233. package/dist/scaffold/index.d.ts +10 -1
  234. package/dist/scaffold/index.d.ts.map +1 -1
  235. package/dist/scaffold/index.js +35 -7
  236. package/dist/scaffold/index.js.map +1 -1
  237. package/dist/scaffold/names.d.ts +4 -0
  238. package/dist/scaffold/names.d.ts.map +1 -1
  239. package/dist/scaffold/names.js.map +1 -1
  240. package/dist/scaffold/project.d.ts +1 -1
  241. package/dist/scaffold/project.d.ts.map +1 -1
  242. package/dist/scaffold/project.js +44 -13
  243. package/dist/scaffold/project.js.map +1 -1
  244. package/dist/scaffold/ui.d.ts.map +1 -1
  245. package/dist/scaffold/ui.js +19 -10
  246. package/dist/scaffold/ui.js.map +1 -1
  247. package/dist/schema/define-node.d.ts +20 -0
  248. package/dist/schema/define-node.d.ts.map +1 -1
  249. package/dist/schema/define-node.js +27 -2
  250. package/dist/schema/define-node.js.map +1 -1
  251. package/dist/schema/path.d.ts +19 -0
  252. package/dist/schema/path.d.ts.map +1 -0
  253. package/dist/schema/path.js +34 -0
  254. package/dist/schema/path.js.map +1 -0
  255. package/dist/schema/types.d.ts +17 -0
  256. package/dist/schema/types.d.ts.map +1 -1
  257. package/dist/seen.d.ts +64 -0
  258. package/dist/seen.d.ts.map +1 -0
  259. package/dist/seen.js +200 -0
  260. package/dist/seen.js.map +1 -0
  261. package/dist/store.d.ts +378 -8
  262. package/dist/store.d.ts.map +1 -1
  263. package/dist/store.js +801 -41
  264. package/dist/store.js.map +1 -1
  265. package/dist/testing.d.ts +6 -0
  266. package/dist/testing.d.ts.map +1 -1
  267. package/dist/testing.js +3 -1
  268. package/dist/testing.js.map +1 -1
  269. package/dist/theme/palettes.d.ts.map +1 -1
  270. package/dist/theme/palettes.js +4 -0
  271. package/dist/theme/palettes.js.map +1 -1
  272. package/dist/theme/types.d.ts +9 -0
  273. package/dist/theme/types.d.ts.map +1 -1
  274. package/dist/theme/types.js +4 -0
  275. package/dist/theme/types.js.map +1 -1
  276. package/dist/validate-graph.d.ts +84 -0
  277. package/dist/validate-graph.d.ts.map +1 -0
  278. package/dist/validate-graph.js +295 -0
  279. package/dist/validate-graph.js.map +1 -0
  280. package/dist/version.d.ts +3 -0
  281. package/dist/version.d.ts.map +1 -0
  282. package/dist/version.js +3 -0
  283. package/dist/version.js.map +1 -0
  284. package/dist/views/types.d.ts +8 -0
  285. package/dist/views/types.d.ts.map +1 -1
  286. package/dist/views/types.js +5 -0
  287. package/dist/views/types.js.map +1 -1
  288. package/dist/watched.d.ts +39 -0
  289. package/dist/watched.d.ts.map +1 -1
  290. package/dist/watched.js +94 -1
  291. package/dist/watched.js.map +1 -1
  292. package/dist/who.d.ts +24 -1
  293. package/dist/who.d.ts.map +1 -1
  294. package/dist/who.js +49 -2
  295. package/dist/who.js.map +1 -1
  296. package/package.json +9 -1
@@ -0,0 +1,295 @@
1
+ import { Graph } from "./graph/graph.js";
2
+ import { UNSET } from "./graph/primitives.js";
3
+ import { edgeId } from "./graph/types.js";
4
+ import { evaluate } from "./invariants/engine.js";
5
+ import { humaniseField, labelOf } from "./schema/define-node.js";
6
+ /** Every code, in the order findings are reported. */
7
+ export const GRAPH_FINDING_CODES = [
8
+ "kind-unknown",
9
+ "node-shape",
10
+ "edge-dangling",
11
+ "edge-disallowed",
12
+ "rule-error",
13
+ "rule-budget",
14
+ ];
15
+ /** A stored node's fields that do not fit: undefined when it fits, [] when the failure names no field. */
16
+ function failingFields(schema, node) {
17
+ try {
18
+ schema.parseNode(node);
19
+ return undefined;
20
+ }
21
+ catch (error) {
22
+ const issues = error.issues ?? [];
23
+ const fields = issues.flatMap((issue) => issue.code === "unrecognized_keys" && issue.keys ? [...issue.keys] : typeof issue.path?.[0] === "string" ? [issue.path[0]] : []);
24
+ return [...new Set(fields)];
25
+ }
26
+ }
27
+ /** The declared field schema, when the kind's fields are an object of them. */
28
+ function fieldSchema(schema, kind, field) {
29
+ const shape = schema.tryDefinition(kind)?.fields?.shape;
30
+ return shape?.[field];
31
+ }
32
+ function named(schema, node) {
33
+ try {
34
+ return labelOf(schema.tryDefinition(node.kind), node);
35
+ }
36
+ catch {
37
+ return typeof node["label"] === "string" ? node["label"] : "A record";
38
+ }
39
+ }
40
+ /** A link named the way `health()` names one: `kind:from->to`. */
41
+ const linkId = (edge) => `${edge.kind}:${edge.from}->${edge.to}`;
42
+ const byString = (a, b) => (a < b ? -1 : a > b ? 1 : 0);
43
+ /**
44
+ * What in a stored graph no longer fits its declaration, each with its
45
+ * smallest repair. Reads the snapshot as it is: nothing is parsed into it,
46
+ * coerced or stripped. A clean graph has no findings.
47
+ */
48
+ export function validateGraph(app, snapshot, options = {}) {
49
+ const { schema } = app;
50
+ const findings = [];
51
+ const nodes = new Map();
52
+ for (const node of snapshot.nodes)
53
+ if (!nodes.has(node.id))
54
+ nodes.set(node.id, node);
55
+ const edgesOf = (id) => snapshot.edges.filter((edge) => edge.from === id || edge.to === id);
56
+ const drop = (node) => ({
57
+ action: "drop",
58
+ primitives: [
59
+ ...edgesOf(node.id)
60
+ .filter((edge) => nodes.has(edge.from) && nodes.has(edge.to))
61
+ .map((edge) => ({ op: "remove-edge", edge })),
62
+ { op: "remove-node", node },
63
+ ],
64
+ });
65
+ const unknownKind = new Set();
66
+ for (const node of [...nodes.values()].sort((a, b) => byString(a.id, b.id))) {
67
+ if (!schema.tryDefinition(node.kind)) {
68
+ unknownKind.add(node.id);
69
+ findings.push({
70
+ code: "kind-unknown",
71
+ id: node.id,
72
+ message: `${named(schema, node)} is a kind of record this app no longer has`,
73
+ repair: drop(node),
74
+ });
75
+ continue;
76
+ }
77
+ const failing = failingFields(schema, node);
78
+ if (failing === undefined)
79
+ continue;
80
+ const name = named(schema, node);
81
+ /*
82
+ * THE SMALLEST FIX, PER FIELD: an optional field is cleared, a required
83
+ * one with a default takes it, and otherwise the record cannot be made to
84
+ * fit and goes. The fix must itself fit, or the record goes.
85
+ */
86
+ const fixes = new Map();
87
+ let fixable = failing.length > 0;
88
+ for (const field of failing) {
89
+ if (field === "id" || field === "kind") {
90
+ fixable = false;
91
+ continue;
92
+ }
93
+ const declared = fieldSchema(schema, node.kind, field);
94
+ let empty = declared ? declared.safeParse(undefined) : { success: true, data: undefined };
95
+ /*
96
+ * A default declared beside the schema (a document's, FR-50): the zod
97
+ * field cannot invent it, so a required field reads it here.
98
+ */
99
+ const beside = schema.tryDefinition(node.kind)?.defaults;
100
+ if (!empty.success && declared && beside && Object.hasOwn(beside, field))
101
+ empty = declared.safeParse(beside[field]);
102
+ if (!empty.success)
103
+ fixable = false;
104
+ else if (empty.data === undefined)
105
+ fixes.set(field, { action: "clear", value: UNSET });
106
+ else
107
+ fixes.set(field, { action: "coerce", value: empty.data });
108
+ }
109
+ if (fixable) {
110
+ const patched = { ...node };
111
+ for (const [field, fix] of fixes) {
112
+ if (fix.value === UNSET)
113
+ delete patched[field];
114
+ else
115
+ patched[field] = fix.value;
116
+ }
117
+ if (failingFields(schema, patched) !== undefined)
118
+ fixable = false;
119
+ }
120
+ if (failing.length === 0) {
121
+ findings.push({ code: "node-shape", id: node.id, message: `${name} does not fit what ${node.kind} declares`, repair: drop(node) });
122
+ continue;
123
+ }
124
+ for (const field of failing) {
125
+ const fix = fixes.get(field);
126
+ const repair = fixable && fix
127
+ ? {
128
+ action: fix.action,
129
+ primitives: [
130
+ {
131
+ op: "patch-node",
132
+ id: node.id,
133
+ before: { [field]: node[field] === undefined ? UNSET : node[field] },
134
+ after: { [field]: fix.value },
135
+ },
136
+ ],
137
+ }
138
+ : drop(node);
139
+ findings.push({
140
+ code: "node-shape",
141
+ id: node.id,
142
+ detail: field,
143
+ message: `${name}: ${humaniseField(field)} does not fit what ${node.kind} declares`,
144
+ repair,
145
+ });
146
+ }
147
+ }
148
+ const seenEdges = new Set();
149
+ const held = [];
150
+ for (const edge of [...snapshot.edges].sort((a, b) => byString(edgeId(a), edgeId(b)))) {
151
+ if (seenEdges.has(edgeId(edge)))
152
+ continue;
153
+ seenEdges.add(edgeId(edge));
154
+ const id = linkId(edge);
155
+ const from = nodes.get(edge.from);
156
+ const to = nodes.get(edge.to);
157
+ if (!from || !to) {
158
+ findings.push({
159
+ code: "edge-dangling",
160
+ id,
161
+ message: "A link points at a record that is not there",
162
+ repair: { action: "drop", primitives: [{ op: "remove-edge", edge }] },
163
+ });
164
+ continue;
165
+ }
166
+ held.push(edge);
167
+ // A link from or to a record of an unknown kind goes with its record.
168
+ if (unknownKind.has(from.id) || unknownKind.has(to.id))
169
+ continue;
170
+ if (!schema.edgeAllowed(edge.kind, from.kind, to.kind)) {
171
+ findings.push({
172
+ code: "edge-disallowed",
173
+ id,
174
+ message: `${named(schema, from)} → ${named(schema, to)}: this app does not allow that link between them`,
175
+ repair: { action: "drop", primitives: [{ op: "remove-edge", edge }] },
176
+ });
177
+ }
178
+ }
179
+ /*
180
+ * THE RULES, JUDGED OVER THE GRAPH AS STORED. Held without validation —
181
+ * a record that does not fit is exactly what a rule may fail to judge —
182
+ * and without the dangling links, which a graph cannot hold.
183
+ */
184
+ const invariants = app.invariants ?? [];
185
+ if (invariants.length > 0) {
186
+ const graph = Graph.from(schema, { nodes: [...nodes.values()], edges: held }, { validate: false });
187
+ const seen = new Set();
188
+ let violations;
189
+ try {
190
+ violations = evaluate(graph, invariants, options.invariantOptions ?? {});
191
+ }
192
+ catch {
193
+ violations = [{ invariant: "rules", status: "could-not-judge", label: "The rules", message: "The rules could not be judged", nodeIds: [], repairs: [] }];
194
+ }
195
+ for (const violation of violations) {
196
+ const code = violation.status === "could-not-judge" ? "rule-error" : violation.status === "over-budget" ? "rule-budget" : undefined;
197
+ if (!code)
198
+ continue;
199
+ const id = violation.subjectId ?? violation.invariant;
200
+ const key = `${code}|${id}|${violation.invariant}`;
201
+ if (seen.has(key))
202
+ continue;
203
+ seen.add(key);
204
+ findings.push({ code, id, detail: violation.invariant, message: violation.message });
205
+ }
206
+ }
207
+ return findings.sort((a, b) => GRAPH_FINDING_CODES.indexOf(a.code) - GRAPH_FINDING_CODES.indexOf(b.code) ||
208
+ byString(a.id, b.id) ||
209
+ byString(a.detail ?? "", b.detail ?? ""));
210
+ }
211
+ const count = (n, one, many) => `${n} ${n === 1 ? one : many}`;
212
+ /**
213
+ * The repairs of a set of findings, as one batch of primitives. A record
214
+ * that goes takes its field fixes with it; a link two findings both remove
215
+ * is removed once. Rule findings are left alone: they are the declaration's
216
+ * to fix.
217
+ */
218
+ export function repairPlan(findings) {
219
+ const removedNodes = new Map();
220
+ const removedEdges = new Map();
221
+ const patches = new Map();
222
+ let unknown = 0;
223
+ let unfit = 0;
224
+ let cleared = 0;
225
+ let coerced = 0;
226
+ const dangling = new Set();
227
+ const disallowed = new Set();
228
+ let unjudged = 0;
229
+ for (const finding of findings) {
230
+ if (finding.code === "rule-error" || finding.code === "rule-budget")
231
+ unjudged++;
232
+ const repair = finding.repair;
233
+ if (!repair)
234
+ continue;
235
+ for (const primitive of repair.primitives) {
236
+ if (primitive.op === "remove-node") {
237
+ if (!removedNodes.has(primitive.node.id)) {
238
+ if (finding.code === "kind-unknown")
239
+ unknown++;
240
+ else
241
+ unfit++;
242
+ }
243
+ removedNodes.set(primitive.node.id, primitive);
244
+ }
245
+ else if (primitive.op === "remove-edge") {
246
+ const id = edgeId(primitive.edge);
247
+ if (finding.code === "edge-dangling")
248
+ dangling.add(id);
249
+ if (finding.code === "edge-disallowed")
250
+ disallowed.add(id);
251
+ removedEdges.set(id, primitive);
252
+ }
253
+ else if (primitive.op === "patch-node") {
254
+ const patch = patches.get(primitive.id) ?? { before: {}, after: {} };
255
+ Object.assign(patch.before, primitive.before);
256
+ Object.assign(patch.after, primitive.after);
257
+ patches.set(primitive.id, patch);
258
+ }
259
+ }
260
+ }
261
+ const patchPrimitives = [];
262
+ for (const [id, patch] of [...patches].sort(([a], [b]) => byString(a, b))) {
263
+ if (removedNodes.has(id))
264
+ continue;
265
+ for (const value of Object.values(patch.after)) {
266
+ if (value === UNSET)
267
+ cleared++;
268
+ else
269
+ coerced++;
270
+ }
271
+ patchPrimitives.push({ op: "patch-node", id, before: patch.before, after: patch.after });
272
+ }
273
+ const said = [];
274
+ if (unknown > 0)
275
+ said.push(`${count(unknown, "record of a kind this app no longer has", "records of kinds this app no longer has")} would be removed, with their links`);
276
+ if (cleared > 0)
277
+ said.push(count(cleared, "field that no longer fits would be cleared", "fields that no longer fit would be cleared"));
278
+ if (coerced > 0)
279
+ said.push(count(coerced, "required field would be set to its default", "required fields would be set to their defaults"));
280
+ if (unfit > 0)
281
+ said.push(`${count(unfit, "record that cannot be made to fit would be removed", "records that cannot be made to fit would be removed")}, with their links`);
282
+ if (dangling.size > 0)
283
+ said.push(count(dangling.size, "link to a record that is not there would be removed", "links to records that are not there would be removed"));
284
+ if (disallowed.size > 0)
285
+ said.push(count(disallowed.size, "link this app no longer allows would be removed", "links this app no longer allows would be removed"));
286
+ if (unjudged > 0)
287
+ said.push(`${count(unjudged, "rule could not be judged", "rules could not be judged")}; that is the declaration's to fix, and a repair leaves it alone`);
288
+ if (said.length === 0)
289
+ said.push("Everything fits its declaration; there is nothing to repair.");
290
+ return {
291
+ primitives: [...removedEdges.values(), ...patchPrimitives, ...[...removedNodes.values()]],
292
+ said,
293
+ };
294
+ }
295
+ //# sourceMappingURL=validate-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-graph.js","sourceRoot":"","sources":["../src/validate-graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** The version of @graview/* that this build is — every package shares it. Written by scripts/write-framework-version.mjs. */
2
+ export declare const FRAMEWORK_VERSION = "0.1.3";
3
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,8HAA8H;AAC9H,eAAO,MAAM,iBAAiB,UAAU,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** The version of @graview/* that this build is — every package shares it. Written by scripts/write-framework-version.mjs. */
2
+ export const FRAMEWORK_VERSION = "0.1.3";
3
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,8HAA8H;AAC9H,MAAM,CAAC,MAAM,iBAAiB,GAAG,OAAO,CAAC"}
@@ -24,6 +24,8 @@ export interface ViewRegistration<V = unknown> {
24
24
  readonly view: V;
25
25
  /** The place's name, when the registration gave it one. */
26
26
  readonly title?: string;
27
+ /** The other kind of a picture over two, when the registration said so. */
28
+ readonly across?: string;
27
29
  }
28
30
  /**
29
31
  * What a registration may say about itself beyond the cell it fills.
@@ -83,6 +85,12 @@ export interface ViewRegistry<S extends AnySchema, V = unknown> {
83
85
  */
84
86
  resolve(kind: string, cell: ViewCell, as?: string): ViewRegistration<V> | undefined;
85
87
  all(): readonly ViewRegistration<V>[];
88
+ /**
89
+ * Every registration in the order it was made, a replaced one included —
90
+ * so one registry can be laid over another and land as it was written
91
+ * (`layerViews`), where `all()` answers only what each cell holds now.
92
+ */
93
+ registrations(): readonly ViewRegistration<V>[];
86
94
  kindsWithViews(): readonly string[];
87
95
  }
88
96
  export declare function createViewRegistry<S extends AnySchema, V = unknown>(_schema: S): ViewRegistry<S, V>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/views/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnE,2DAA2D;AAC3D,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,MAAM,CAAC;AAEzC;;;;;;;;GAQG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AAEpD,eAAO,MAAM,UAAU,EAAE,SAAS,QAAQ,EAAiC,CAAC;AAE5E,kEAAkE;AAClE,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC,GAAG,OAAO;IAC3C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjB,2DAA2D;IAC3D,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,oDAAoD;AACpD,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED,+EAA+E;AAC/E,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC,GAAG,OAAO;IAC5D;;;;OAIG;IACH,QAAQ,CAAC,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,EAChC,IAAI,EAAE,CAAC,EACP,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,CAAC,EACP,IAAI,CAAC,EAAE,QAAQ,GACd,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtB,wCAAwC;IACxC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,CAAC,GAAG,SAAS,CAAC;IACpD,qDAAqD;IACrD,MAAM,IAAI,SAAS,KAAK,EAAE,CAAC;IAC3B;;;;;;;;OAQG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IACpF,GAAG,IAAI,SAAS,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;IACtC,cAAc,IAAI,SAAS,MAAM,EAAE,CAAC;CACrC;AAiBD,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC,GAAG,OAAO,EACjE,OAAO,EAAE,CAAC,GACT,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAoEpB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/views/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnE,2DAA2D;AAC3D,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,MAAM,CAAC;AAEzC;;;;;;;;GAQG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AAEpD,eAAO,MAAM,UAAU,EAAE,SAAS,QAAQ,EAAiC,CAAC;AAE5E,kEAAkE;AAClE,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC,GAAG,OAAO;IAC3C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjB,2DAA2D;IAC3D,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,2EAA2E;IAC3E,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,oDAAoD;AACpD,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED,+EAA+E;AAC/E,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC,GAAG,OAAO;IAC5D;;;;OAIG;IACH,QAAQ,CAAC,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,EAChC,IAAI,EAAE,CAAC,EACP,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,CAAC,EACP,IAAI,CAAC,EAAE,QAAQ,GACd,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtB,wCAAwC;IACxC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,CAAC,GAAG,SAAS,CAAC;IACpD,qDAAqD;IACrD,MAAM,IAAI,SAAS,KAAK,EAAE,CAAC;IAC3B;;;;;;;;OAQG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IACpF,GAAG,IAAI,SAAS,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;IACtC;;;;OAIG;IACH,aAAa,IAAI,SAAS,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;IAChD,cAAc,IAAI,SAAS,MAAM,EAAE,CAAC;CACrC;AAiBD,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC,GAAG,OAAO,EACjE,OAAO,EAAE,CAAC,GACT,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAyEpB"}
@@ -19,6 +19,8 @@ export function createViewRegistry(_schema) {
19
19
  const entries = new Map();
20
20
  /** Every named place, in the order it was registered. */
21
21
  const named = [];
22
+ /** Every registration, in the order it was made. */
23
+ const order = [];
22
24
  const registry = {
23
25
  register(kind, cell, view, meta) {
24
26
  const registration = {
@@ -27,6 +29,7 @@ export function createViewRegistry(_schema) {
27
29
  fidelity: cell.fidelity,
28
30
  view,
29
31
  ...(meta?.title ? { title: meta.title } : {}),
32
+ ...(meta?.across ? { across: meta.across } : {}),
30
33
  };
31
34
  /*
32
35
  * A titled registration fills its cell AND stands on its own.
@@ -38,6 +41,7 @@ export function createViewRegistry(_schema) {
38
41
  * month are two questions about one pile of tasks, and before this a
39
42
  * kind could only ever have one answer.
40
43
  */
44
+ order.push(registration);
41
45
  entries.set(key(kind, cell), registration);
42
46
  if (meta?.title) {
43
47
  const as = placeSlug(meta.title);
@@ -76,6 +80,7 @@ export function createViewRegistry(_schema) {
76
80
  }
77
81
  return undefined;
78
82
  },
83
+ registrations: () => order,
79
84
  all() {
80
85
  return [...entries.values()];
81
86
  },
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/views/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/views/types.ts"],"names":[],"mappings":"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"}
package/dist/watched.d.ts CHANGED
@@ -14,6 +14,7 @@
14
14
  */
15
15
  import type { Policy, Refusal } from "./permissions/types.js";
16
16
  import type { AnySchema } from "./schema/schema.js";
17
+ import type { Principal } from "./permissions/types.js";
17
18
  /** The declaration's names, and the words it has for them. */
18
19
  export declare function tellTheWatchItsNames(schema: AnySchema, mutations: Iterable<{
19
20
  readonly name: string;
@@ -30,4 +31,42 @@ export declare function tellTheWatchOfAStore(store: unknown): void;
30
31
  export declare function tellTheWatchOfAnAuthor(id: string | undefined): void;
31
32
  /** A press reached the store and the policy refused it. */
32
33
  export declare function tellTheWatchOfARefusal(refusal: Refusal, author: string | undefined): void;
34
+ /**
35
+ * WHAT THIS SEAT MAY NOT SEE, for a watching harness to hold every screen
36
+ * to: the names (and email addresses) of the records the policy's `sees`
37
+ * keeps from it, less any a record it may see shares. A storefront showed
38
+ * a stranger every customer by name; the watch says so wherever one is.
39
+ */
40
+ export declare function tellTheWatchWhatIsUnseen(store: {
41
+ readonly policy?: {
42
+ readonly sees?: readonly unknown[];
43
+ };
44
+ readonly graph: {
45
+ allNodes(): readonly ({
46
+ id: string;
47
+ kind: string;
48
+ } & Record<string, unknown>)[];
49
+ };
50
+ readonly schema: AnySchema;
51
+ sees(principal: Principal, id: string): boolean;
52
+ }, principal: Principal,
53
+ /** Which surface is telling: two embeds on one page may sit two different seats down. */
54
+ from?: string): void;
55
+ /**
56
+ * WHO HAS AUTHORED, for a watching harness: every author id in the log that
57
+ * names no record — a migration ("ship:migration"), a seat — is an
58
+ * identifier, and no screen says one.
59
+ */
60
+ export declare function tellTheWatchItsAuthors(store: {
61
+ readonly graph: {
62
+ getNode(id: string): unknown;
63
+ };
64
+ readonly log: {
65
+ all(): readonly {
66
+ readonly author: {
67
+ readonly id?: string;
68
+ };
69
+ }[];
70
+ };
71
+ }): void;
33
72
  //# sourceMappingURL=watched.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"watched.d.ts","sourceRoot":"","sources":["../src/watched.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAUpD,8DAA8D;AAC9D,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,QAAQ,CAAC;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EACvE,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,IAAI,CAuBN;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAEzD;AAED,+EAA+E;AAC/E,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAGnE;AAED,2DAA2D;AAC3D,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAEzF"}
1
+ {"version":3,"file":"watched.d.ts","sourceRoot":"","sources":["../src/watched.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAWxD,8DAA8D;AAC9D,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,QAAQ,CAAC;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EACvE,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,IAAI,CAsEN;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAEzD;AAED,+EAA+E;AAC/E,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAGnE;AAED,2DAA2D;AAC3D,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAEzF;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE;IACL,QAAQ,CAAC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,OAAO,EAAE,CAAA;KAAE,CAAC;IACzD,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,IAAI,SAAS,CAAC;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,CAAA;KAAE,CAAC;IACpG,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;CACjD,EACD,SAAS,EAAE,SAAS;AACpB,yFAAyF;AACzF,IAAI,CAAC,EAAE,MAAM,GACZ,IAAI,CAWN;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAC5C,QAAQ,CAAC,KAAK,EAAE;QAAE,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;IACjD,QAAQ,CAAC,GAAG,EAAE;QAAE,GAAG,IAAI,SAAS;YAAE,QAAQ,CAAC,MAAM,EAAE;gBAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAA;aAAE,CAAA;SAAE,EAAE,CAAA;KAAE,CAAC;CACnF,GAAG,IAAI,CAKP"}
package/dist/watched.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { humaniseField, labelOf } from "./schema/define-node.js";
1
2
  const theWatch = () => globalThis.__graviewWatch;
2
3
  /** The declaration's names, and the words it has for them. */
3
4
  export function tellTheWatchItsNames(schema, mutations, policy) {
@@ -6,8 +7,42 @@ export function tellTheWatchItsNames(schema, mutations, policy) {
6
7
  return;
7
8
  const ids = [];
8
9
  const words = [];
10
+ /*
11
+ * THE KEY'S WORDS WHERE THE DECLARATION HAS ITS OWN. "Vin" over a field
12
+ * the kind calls "VIN", "suv" in a picker the record says "SUV" in: a
13
+ * single word passes for prose, so these are caught only where they are
14
+ * the whole of what is shown.
15
+ */
16
+ const unsaid = [];
9
17
  for (const definition of schema.definitions) {
10
18
  ids.push(definition.kind);
19
+ // A kind with a noun of its own is never shown by its id: "vehicle" where the declaration says "car".
20
+ if (definition.noun && humaniseField(definition.kind).toLowerCase() !== definition.noun.toLowerCase())
21
+ unsaid.push(definition.kind);
22
+ const fieldsOf = definition.fields.shape ?? {};
23
+ for (const [key, field] of Object.entries(fieldsOf)) {
24
+ const declared = definition.display?.labels?.[key];
25
+ if (declared !== undefined && humaniseField(key) !== declared)
26
+ unsaid.push(humaniseField(key));
27
+ const entries = field?.def?.entries;
28
+ const format = definition.display?.format?.[key];
29
+ for (const value of entries && typeof entries === "object" ? Object.values(entries) : []) {
30
+ if (typeof value !== "string")
31
+ continue;
32
+ ids.push(value);
33
+ if (!format)
34
+ continue;
35
+ const said = format(value);
36
+ /*
37
+ * The raw value only where the declaration says the same word another
38
+ * way ("suv" for "SUV"): a value that is an ordinary word ("open",
39
+ * "new") is a word the interface also says, and its spoken form
40
+ * ("Mon") one a calendar prints.
41
+ */
42
+ if (said !== value && said.toLowerCase() === value.toLowerCase())
43
+ unsaid.push(value);
44
+ }
45
+ }
11
46
  words.push(definition.plural ?? "", definition.noun ?? "", definition.description ?? "");
12
47
  const shape = definition.fields.shape ?? {};
13
48
  ids.push(...Object.keys(shape));
@@ -15,6 +50,9 @@ export function tellTheWatchItsNames(schema, mutations, policy) {
15
50
  words.push(label);
16
51
  for (const [name, edge] of Object.entries(definition.edges ?? {})) {
17
52
  ids.push(name);
53
+ // An edge's name spoken ("Drives", "On show at") where it has words of its own ("the test drives booked in it").
54
+ if (edge.description || edge.inverse)
55
+ unsaid.push(humaniseField(name));
18
56
  words.push(edge.description ?? "", edge.inverse ?? "");
19
57
  }
20
58
  }
@@ -26,7 +64,27 @@ export function tellTheWatchItsNames(schema, mutations, policy) {
26
64
  if (grant.roles !== "*")
27
65
  ids.push(...grant.roles);
28
66
  ids.push(...(policy?.roles ?? []));
29
- watch.learn({ ids, words: words.filter(Boolean) });
67
+ // A word one kind declares is never another's key: "Status" is a test drive's own label even where a car says "Availability".
68
+ const declared = new Set();
69
+ for (const definition of schema.definitions) {
70
+ // A kind's own words: what a picker asks for ("Owner") is a noun, not an edge's name.
71
+ declared.add(definition.plural ?? "");
72
+ declared.add(humaniseField(definition.noun ?? definition.kind));
73
+ for (const label of Object.values(definition.display?.labels ?? {}))
74
+ declared.add(label);
75
+ const fieldsOf = definition.fields.shape ?? {};
76
+ for (const [key, field] of Object.entries(fieldsOf)) {
77
+ const format = definition.display?.format?.[key];
78
+ const entries = field?.def?.entries;
79
+ if (!format && !definition.display?.labels?.[key])
80
+ declared.add(humaniseField(key));
81
+ // A value is said by its format, or spoken plainly where there is none ("Given", a talk's state).
82
+ if (entries && typeof entries === "object")
83
+ for (const value of Object.values(entries))
84
+ declared.add(format ? format(value) : humaniseField(String(value)));
85
+ }
86
+ }
87
+ watch.learn({ ids, words: words.filter(Boolean), unsaid: [...new Set(unsaid)].filter((word) => !declared.has(word)) });
30
88
  }
31
89
  /**
32
90
  * THE STORE ITSELF, for a harness that measures whether a person got a job
@@ -47,4 +105,39 @@ export function tellTheWatchOfAnAuthor(id) {
47
105
  export function tellTheWatchOfARefusal(refusal, author) {
48
106
  theWatch()?.refused?.({ ...refusal, ...(author === undefined ? {} : { author }) });
49
107
  }
108
+ /**
109
+ * WHAT THIS SEAT MAY NOT SEE, for a watching harness to hold every screen
110
+ * to: the names (and email addresses) of the records the policy's `sees`
111
+ * keeps from it, less any a record it may see shares. A storefront showed
112
+ * a stranger every customer by name; the watch says so wherever one is.
113
+ */
114
+ export function tellTheWatchWhatIsUnseen(store, principal,
115
+ /** Which surface is telling: two embeds on one page may sit two different seats down. */
116
+ from) {
117
+ const watch = theWatch();
118
+ if (!watch?.unseen || !store.policy?.sees?.length)
119
+ return;
120
+ const unseen = new Set();
121
+ const seen = new Set();
122
+ for (const node of store.graph.allNodes()) {
123
+ const definition = store.schema.tryDefinition(node.kind);
124
+ const said = [labelOf(definition, node), ...Object.values(node).filter((value) => typeof value === "string" && /^[^\s@]+@[^\s@]+$/.test(value))];
125
+ for (const word of said)
126
+ (store.sees(principal, node.id) ? seen : unseen).add(word);
127
+ }
128
+ watch.unseen({ words: [...unseen].filter((word) => word.length >= 5 && !seen.has(word)), ...(from ? { from } : {}) });
129
+ }
130
+ /**
131
+ * WHO HAS AUTHORED, for a watching harness: every author id in the log that
132
+ * names no record — a migration ("ship:migration"), a seat — is an
133
+ * identifier, and no screen says one.
134
+ */
135
+ export function tellTheWatchItsAuthors(store) {
136
+ const watch = theWatch();
137
+ if (!watch?.learn)
138
+ return;
139
+ const ids = [...new Set(store.log.all().map((op) => op.author.id).filter((id) => typeof id === "string" && store.graph.getNode(id) === undefined))];
140
+ if (ids.length > 0)
141
+ watch.learn({ ids, words: [] });
142
+ }
50
143
  //# sourceMappingURL=watched.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"watched.js","sourceRoot":"","sources":["../src/watched.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"watched.js","sourceRoot":"","sources":["../src/watched.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAUjE,MAAM,QAAQ,GAAG,GAAsB,EAAE,CAAE,UAAyC,CAAC,cAAc,CAAC;AAEpG,8DAA8D;AAC9D,MAAM,UAAU,oBAAoB,CAClC,MAAiB,EACjB,SAAuE,EACvE,MAA0B;IAE1B,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,IAAI,CAAC,KAAK,EAAE,KAAK;QAAE,OAAO;IAC1B,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B;;;;;OAKG;IACH,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QAC5C,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC1B,sGAAsG;QACtG,IAAI,UAAU,CAAC,IAAI,IAAI,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE;YAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACpI,MAAM,QAAQ,GAAI,UAAU,CAAC,MAAsF,CAAC,KAAK,IAAI,EAAE,CAAC;QAChI,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpD,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;YACnD,IAAI,QAAQ,KAAK,SAAS,IAAI,aAAa,CAAC,GAAG,CAAC,KAAK,QAAQ;gBAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;YAC/F,MAAM,OAAO,GAAG,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC;YACpC,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;YACjD,KAAK,MAAM,KAAK,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBACzF,IAAI,OAAO,KAAK,KAAK,QAAQ;oBAAE,SAAS;gBACxC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAChB,IAAI,CAAC,MAAM;oBAAE,SAAS;gBACtB,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC3B;;;;;mBAKG;gBACH,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,WAAW,EAAE;oBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvF,CAAC;QACH,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,EAAE,EAAE,UAAU,CAAC,IAAI,IAAI,EAAE,EAAE,UAAU,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;QACzF,MAAM,KAAK,GAAI,UAAU,CAAC,MAA8C,CAAC,KAAK,IAAI,EAAE,CAAC;QACrF,GAAG,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAChC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,IAAI,EAAE,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvF,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;YAClE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACf,iHAAiH;YACjH,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO;gBAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;YACvE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IACD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IACnC,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,MAAM,IAAI,EAAE;QAAE,IAAI,KAAK,CAAC,KAAK,KAAK,GAAG;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5F,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;IACnC,8HAA8H;IAC9H,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QAC5C,sFAAsF;QACtF,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QACtC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QAChE,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,IAAI,EAAE,CAAC;YAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzF,MAAM,QAAQ,GAAI,UAAU,CAAC,MAAsF,CAAC,KAAK,IAAI,EAAE,CAAC;QAChI,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpD,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;YACjD,MAAM,OAAO,GAAG,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC;YACpC,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC;gBAAE,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;YACpF,kGAAkG;YAClG,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;gBAAE,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;oBAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC9J,CAAC;IACH,CAAC;IACD,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;AACzH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,sBAAsB,CAAC,EAAsB;IAC3D,IAAI,EAAE,KAAK,SAAS;QAAE,OAAO;IAC7B,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;AAChD,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,sBAAsB,CAAC,OAAgB,EAAE,MAA0B;IACjF,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;AACrF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CACtC,KAKC,EACD,SAAoB;AACpB,yFAAyF;AACzF,IAAa;IAEb,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,IAAI,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM;QAAE,OAAO;IAC1D,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;QAC1C,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAClK,KAAK,MAAM,IAAI,IAAI,IAAI;YAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtF,CAAC;IACD,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AACxH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAGtC;IACC,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,IAAI,CAAC,KAAK,EAAE,KAAK;QAAE,OAAO;IAC1B,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAgB,EAAE,CAAC,OAAO,EAAE,KAAK,QAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC;IAClK,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;AACtD,CAAC"}