@graview/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (327) hide show
  1. package/LICENSE +96 -0
  2. package/README.md +35 -0
  3. package/dist/app.d.ts +294 -0
  4. package/dist/app.d.ts.map +1 -0
  5. package/dist/app.js +49 -0
  6. package/dist/app.js.map +1 -0
  7. package/dist/arrange.d.ts +185 -0
  8. package/dist/arrange.d.ts.map +1 -0
  9. package/dist/arrange.js +456 -0
  10. package/dist/arrange.js.map +1 -0
  11. package/dist/beginning.d.ts +65 -0
  12. package/dist/beginning.d.ts.map +1 -0
  13. package/dist/beginning.js +94 -0
  14. package/dist/beginning.js.map +1 -0
  15. package/dist/bind.d.ts +42 -0
  16. package/dist/bind.d.ts.map +1 -0
  17. package/dist/bind.js +26 -0
  18. package/dist/bind.js.map +1 -0
  19. package/dist/city.d.ts +93 -0
  20. package/dist/city.d.ts.map +1 -0
  21. package/dist/city.js +160 -0
  22. package/dist/city.js.map +1 -0
  23. package/dist/cli/check/arrangement.d.ts +13 -0
  24. package/dist/cli/check/arrangement.d.ts.map +1 -0
  25. package/dist/cli/check/arrangement.js +63 -0
  26. package/dist/cli/check/arrangement.js.map +1 -0
  27. package/dist/cli/check/beginnings.d.ts +16 -0
  28. package/dist/cli/check/beginnings.d.ts.map +1 -0
  29. package/dist/cli/check/beginnings.js +53 -0
  30. package/dist/cli/check/beginnings.js.map +1 -0
  31. package/dist/cli/check/brand.d.ts +17 -0
  32. package/dist/cli/check/brand.d.ts.map +1 -0
  33. package/dist/cli/check/brand.js +153 -0
  34. package/dist/cli/check/brand.js.map +1 -0
  35. package/dist/cli/check/city.d.ts +17 -0
  36. package/dist/cli/check/city.d.ts.map +1 -0
  37. package/dist/cli/check/city.js +58 -0
  38. package/dist/cli/check/city.js.map +1 -0
  39. package/dist/cli/check/context.d.ts +50 -0
  40. package/dist/cli/check/context.d.ts.map +1 -0
  41. package/dist/cli/check/context.js +37 -0
  42. package/dist/cli/check/context.js.map +1 -0
  43. package/dist/cli/check/fields.d.ts +16 -0
  44. package/dist/cli/check/fields.d.ts.map +1 -0
  45. package/dist/cli/check/fields.js +237 -0
  46. package/dist/cli/check/fields.js.map +1 -0
  47. package/dist/cli/check/index.d.ts +14 -0
  48. package/dist/cli/check/index.d.ts.map +1 -0
  49. package/dist/cli/check/index.js +14 -0
  50. package/dist/cli/check/index.js.map +1 -0
  51. package/dist/cli/check/intelligence.d.ts +17 -0
  52. package/dist/cli/check/intelligence.d.ts.map +1 -0
  53. package/dist/cli/check/intelligence.js +136 -0
  54. package/dist/cli/check/intelligence.js.map +1 -0
  55. package/dist/cli/check/lenses.d.ts +17 -0
  56. package/dist/cli/check/lenses.d.ts.map +1 -0
  57. package/dist/cli/check/lenses.js +239 -0
  58. package/dist/cli/check/lenses.js.map +1 -0
  59. package/dist/cli/check/migrations.d.ts +16 -0
  60. package/dist/cli/check/migrations.d.ts.map +1 -0
  61. package/dist/cli/check/migrations.js +43 -0
  62. package/dist/cli/check/migrations.js.map +1 -0
  63. package/dist/cli/check/modules.d.ts +16 -0
  64. package/dist/cli/check/modules.d.ts.map +1 -0
  65. package/dist/cli/check/modules.js +123 -0
  66. package/dist/cli/check/modules.js.map +1 -0
  67. package/dist/cli/check/policy.d.ts +16 -0
  68. package/dist/cli/check/policy.d.ts.map +1 -0
  69. package/dist/cli/check/policy.js +90 -0
  70. package/dist/cli/check/policy.js.map +1 -0
  71. package/dist/cli/check/relations.d.ts +29 -0
  72. package/dist/cli/check/relations.d.ts.map +1 -0
  73. package/dist/cli/check/relations.js +279 -0
  74. package/dist/cli/check/relations.js.map +1 -0
  75. package/dist/cli/check/routes.d.ts +16 -0
  76. package/dist/cli/check/routes.d.ts.map +1 -0
  77. package/dist/cli/check/routes.js +31 -0
  78. package/dist/cli/check/routes.js.map +1 -0
  79. package/dist/cli/check/settings.d.ts +16 -0
  80. package/dist/cli/check/settings.d.ts.map +1 -0
  81. package/dist/cli/check/settings.js +81 -0
  82. package/dist/cli/check/settings.js.map +1 -0
  83. package/dist/cli/check.d.ts +36 -0
  84. package/dist/cli/check.d.ts.map +1 -0
  85. package/dist/cli/check.js +76 -0
  86. package/dist/cli/check.js.map +1 -0
  87. package/dist/cli/create.d.ts +20 -0
  88. package/dist/cli/create.d.ts.map +1 -0
  89. package/dist/cli/create.js +251 -0
  90. package/dist/cli/create.js.map +1 -0
  91. package/dist/cli/describe.d.ts +35 -0
  92. package/dist/cli/describe.d.ts.map +1 -0
  93. package/dist/cli/describe.js +230 -0
  94. package/dist/cli/describe.js.map +1 -0
  95. package/dist/cli/docs.d.ts +11 -0
  96. package/dist/cli/docs.d.ts.map +1 -0
  97. package/dist/cli/docs.js +152 -0
  98. package/dist/cli/docs.js.map +1 -0
  99. package/dist/cli/index.d.ts +18 -0
  100. package/dist/cli/index.d.ts.map +1 -0
  101. package/dist/cli/index.js +281 -0
  102. package/dist/cli/index.js.map +1 -0
  103. package/dist/extend.d.ts +23 -0
  104. package/dist/extend.d.ts.map +1 -0
  105. package/dist/extend.js +53 -0
  106. package/dist/extend.js.map +1 -0
  107. package/dist/graph/diff.d.ts +31 -0
  108. package/dist/graph/diff.d.ts.map +1 -0
  109. package/dist/graph/diff.js +71 -0
  110. package/dist/graph/diff.js.map +1 -0
  111. package/dist/graph/graph.d.ts +69 -0
  112. package/dist/graph/graph.d.ts.map +1 -0
  113. package/dist/graph/graph.js +284 -0
  114. package/dist/graph/graph.js.map +1 -0
  115. package/dist/graph/primitives.d.ts +52 -0
  116. package/dist/graph/primitives.d.ts.map +1 -0
  117. package/dist/graph/primitives.js +62 -0
  118. package/dist/graph/primitives.js.map +1 -0
  119. package/dist/graph/tracked.d.ts +31 -0
  120. package/dist/graph/tracked.d.ts.map +1 -0
  121. package/dist/graph/tracked.js +69 -0
  122. package/dist/graph/tracked.js.map +1 -0
  123. package/dist/graph/types.d.ts +34 -0
  124. package/dist/graph/types.d.ts.map +1 -0
  125. package/dist/graph/types.js +0 -0
  126. package/dist/graph/types.js.map +1 -0
  127. package/dist/index.d.ts +100 -0
  128. package/dist/index.d.ts.map +1 -0
  129. package/dist/index.js +90 -0
  130. package/dist/index.js.map +1 -0
  131. package/dist/installation.d.ts +112 -0
  132. package/dist/installation.d.ts.map +1 -0
  133. package/dist/installation.js +193 -0
  134. package/dist/installation.js.map +1 -0
  135. package/dist/intelligence-bridge.d.ts +73 -0
  136. package/dist/intelligence-bridge.d.ts.map +1 -0
  137. package/dist/intelligence-bridge.js +31 -0
  138. package/dist/intelligence-bridge.js.map +1 -0
  139. package/dist/invariants/engine.d.ts +36 -0
  140. package/dist/invariants/engine.d.ts.map +1 -0
  141. package/dist/invariants/engine.js +88 -0
  142. package/dist/invariants/engine.js.map +1 -0
  143. package/dist/invariants/types.d.ts +75 -0
  144. package/dist/invariants/types.d.ts.map +1 -0
  145. package/dist/invariants/types.js +2 -0
  146. package/dist/invariants/types.js.map +1 -0
  147. package/dist/modules.d.ts +75 -0
  148. package/dist/modules.d.ts.map +1 -0
  149. package/dist/modules.js +87 -0
  150. package/dist/modules.js.map +1 -0
  151. package/dist/mutations/decidable.d.ts +26 -0
  152. package/dist/mutations/decidable.d.ts.map +1 -0
  153. package/dist/mutations/decidable.js +39 -0
  154. package/dist/mutations/decidable.js.map +1 -0
  155. package/dist/mutations/define-mutation.d.ts +32 -0
  156. package/dist/mutations/define-mutation.d.ts.map +1 -0
  157. package/dist/mutations/define-mutation.js +181 -0
  158. package/dist/mutations/define-mutation.js.map +1 -0
  159. package/dist/mutations/derive-edits.d.ts +75 -0
  160. package/dist/mutations/derive-edits.d.ts.map +1 -0
  161. package/dist/mutations/derive-edits.js +240 -0
  162. package/dist/mutations/derive-edits.js.map +1 -0
  163. package/dist/mutations/form.d.ts +63 -0
  164. package/dist/mutations/form.d.ts.map +1 -0
  165. package/dist/mutations/form.js +113 -0
  166. package/dist/mutations/form.js.map +1 -0
  167. package/dist/mutations/node-ref.d.ts +83 -0
  168. package/dist/mutations/node-ref.d.ts.map +1 -0
  169. package/dist/mutations/node-ref.js +113 -0
  170. package/dist/mutations/node-ref.js.map +1 -0
  171. package/dist/mutations/types.d.ts +136 -0
  172. package/dist/mutations/types.d.ts.map +1 -0
  173. package/dist/mutations/types.js +2 -0
  174. package/dist/mutations/types.js.map +1 -0
  175. package/dist/ops/log.d.ts +35 -0
  176. package/dist/ops/log.d.ts.map +1 -0
  177. package/dist/ops/log.js +103 -0
  178. package/dist/ops/log.js.map +1 -0
  179. package/dist/ops/types.d.ts +52 -0
  180. package/dist/ops/types.d.ts.map +1 -0
  181. package/dist/ops/types.js +2 -0
  182. package/dist/ops/types.js.map +1 -0
  183. package/dist/ops/undo.d.ts +33 -0
  184. package/dist/ops/undo.d.ts.map +1 -0
  185. package/dist/ops/undo.js +65 -0
  186. package/dist/ops/undo.js.map +1 -0
  187. package/dist/permissions/policy.d.ts +68 -0
  188. package/dist/permissions/policy.d.ts.map +1 -0
  189. package/dist/permissions/policy.js +191 -0
  190. package/dist/permissions/policy.js.map +1 -0
  191. package/dist/permissions/types.d.ts +78 -0
  192. package/dist/permissions/types.d.ts.map +1 -0
  193. package/dist/permissions/types.js +17 -0
  194. package/dist/permissions/types.js.map +1 -0
  195. package/dist/persistence/memory.d.ts +6 -0
  196. package/dist/persistence/memory.d.ts.map +1 -0
  197. package/dist/persistence/memory.js +31 -0
  198. package/dist/persistence/memory.js.map +1 -0
  199. package/dist/persistence/sqlite.d.ts +59 -0
  200. package/dist/persistence/sqlite.d.ts.map +1 -0
  201. package/dist/persistence/sqlite.js +131 -0
  202. package/dist/persistence/sqlite.js.map +1 -0
  203. package/dist/persistence/types.d.ts +22 -0
  204. package/dist/persistence/types.d.ts.map +1 -0
  205. package/dist/persistence/types.js +2 -0
  206. package/dist/persistence/types.js.map +1 -0
  207. package/dist/presence.d.ts +38 -0
  208. package/dist/presence.d.ts.map +1 -0
  209. package/dist/presence.js +50 -0
  210. package/dist/presence.js.map +1 -0
  211. package/dist/scaffold/domain.d.ts +8 -0
  212. package/dist/scaffold/domain.d.ts.map +1 -0
  213. package/dist/scaffold/domain.js +331 -0
  214. package/dist/scaffold/domain.js.map +1 -0
  215. package/dist/scaffold/index.d.ts +66 -0
  216. package/dist/scaffold/index.d.ts.map +1 -0
  217. package/dist/scaffold/index.js +142 -0
  218. package/dist/scaffold/index.js.map +1 -0
  219. package/dist/scaffold/lens.d.ts +31 -0
  220. package/dist/scaffold/lens.d.ts.map +1 -0
  221. package/dist/scaffold/lens.js +176 -0
  222. package/dist/scaffold/lens.js.map +1 -0
  223. package/dist/scaffold/names.d.ts +44 -0
  224. package/dist/scaffold/names.d.ts.map +1 -0
  225. package/dist/scaffold/names.js +69 -0
  226. package/dist/scaffold/names.js.map +1 -0
  227. package/dist/scaffold/project.d.ts +41 -0
  228. package/dist/scaffold/project.d.ts.map +1 -0
  229. package/dist/scaffold/project.js +604 -0
  230. package/dist/scaffold/project.js.map +1 -0
  231. package/dist/scaffold/ui.d.ts +15 -0
  232. package/dist/scaffold/ui.d.ts.map +1 -0
  233. package/dist/scaffold/ui.js +536 -0
  234. package/dist/scaffold/ui.js.map +1 -0
  235. package/dist/schema/define-node.d.ts +132 -0
  236. package/dist/schema/define-node.d.ts.map +1 -0
  237. package/dist/schema/define-node.js +254 -0
  238. package/dist/schema/define-node.js.map +1 -0
  239. package/dist/schema/figures.d.ts +42 -0
  240. package/dist/schema/figures.d.ts.map +1 -0
  241. package/dist/schema/figures.js +220 -0
  242. package/dist/schema/figures.js.map +1 -0
  243. package/dist/schema/json-schema.d.ts +39 -0
  244. package/dist/schema/json-schema.d.ts.map +1 -0
  245. package/dist/schema/json-schema.js +74 -0
  246. package/dist/schema/json-schema.js.map +1 -0
  247. package/dist/schema/schema.d.ts +43 -0
  248. package/dist/schema/schema.d.ts.map +1 -0
  249. package/dist/schema/schema.js +102 -0
  250. package/dist/schema/schema.js.map +1 -0
  251. package/dist/schema/types.d.ts +201 -0
  252. package/dist/schema/types.d.ts.map +1 -0
  253. package/dist/schema/types.js +2 -0
  254. package/dist/schema/types.js.map +1 -0
  255. package/dist/search.d.ts +215 -0
  256. package/dist/search.d.ts.map +1 -0
  257. package/dist/search.js +449 -0
  258. package/dist/search.js.map +1 -0
  259. package/dist/settings.d.ts +30 -0
  260. package/dist/settings.d.ts.map +1 -0
  261. package/dist/settings.js +74 -0
  262. package/dist/settings.js.map +1 -0
  263. package/dist/store.d.ts +284 -0
  264. package/dist/store.d.ts.map +1 -0
  265. package/dist/store.js +660 -0
  266. package/dist/store.js.map +1 -0
  267. package/dist/studio-door.d.ts +187 -0
  268. package/dist/studio-door.d.ts.map +1 -0
  269. package/dist/studio-door.js +20 -0
  270. package/dist/studio-door.js.map +1 -0
  271. package/dist/sync/conflict.d.ts +37 -0
  272. package/dist/sync/conflict.d.ts.map +1 -0
  273. package/dist/sync/conflict.js +56 -0
  274. package/dist/sync/conflict.js.map +1 -0
  275. package/dist/sync/engine.d.ts +118 -0
  276. package/dist/sync/engine.d.ts.map +1 -0
  277. package/dist/sync/engine.js +341 -0
  278. package/dist/sync/engine.js.map +1 -0
  279. package/dist/sync/google-calendar.d.ts +54 -0
  280. package/dist/sync/google-calendar.d.ts.map +1 -0
  281. package/dist/sync/google-calendar.js +167 -0
  282. package/dist/sync/google-calendar.js.map +1 -0
  283. package/dist/sync/types.d.ts +125 -0
  284. package/dist/sync/types.d.ts.map +1 -0
  285. package/dist/sync/types.js +6 -0
  286. package/dist/sync/types.js.map +1 -0
  287. package/dist/temporal/effectivity.d.ts +75 -0
  288. package/dist/temporal/effectivity.d.ts.map +1 -0
  289. package/dist/temporal/effectivity.js +89 -0
  290. package/dist/temporal/effectivity.js.map +1 -0
  291. package/dist/testing.d.ts +63 -0
  292. package/dist/testing.d.ts.map +1 -0
  293. package/dist/testing.js +194 -0
  294. package/dist/testing.js.map +1 -0
  295. package/dist/theme/contrast.d.ts +47 -0
  296. package/dist/theme/contrast.d.ts.map +1 -0
  297. package/dist/theme/contrast.js +172 -0
  298. package/dist/theme/contrast.js.map +1 -0
  299. package/dist/theme/derive.d.ts +81 -0
  300. package/dist/theme/derive.d.ts.map +1 -0
  301. package/dist/theme/derive.js +171 -0
  302. package/dist/theme/derive.js.map +1 -0
  303. package/dist/theme/kit.d.ts +106 -0
  304. package/dist/theme/kit.d.ts.map +1 -0
  305. package/dist/theme/kit.js +84 -0
  306. package/dist/theme/kit.js.map +1 -0
  307. package/dist/theme/palettes.d.ts +32 -0
  308. package/dist/theme/palettes.d.ts.map +1 -0
  309. package/dist/theme/palettes.js +96 -0
  310. package/dist/theme/palettes.js.map +1 -0
  311. package/dist/theme/types.d.ts +131 -0
  312. package/dist/theme/types.d.ts.map +1 -0
  313. package/dist/theme/types.js +23 -0
  314. package/dist/theme/types.js.map +1 -0
  315. package/dist/views/types.d.ts +89 -0
  316. package/dist/views/types.d.ts.map +1 -0
  317. package/dist/views/types.js +88 -0
  318. package/dist/views/types.js.map +1 -0
  319. package/dist/watched.d.ts +33 -0
  320. package/dist/watched.d.ts.map +1 -0
  321. package/dist/watched.js +50 -0
  322. package/dist/watched.js.map +1 -0
  323. package/dist/who.d.ts +26 -0
  324. package/dist/who.d.ts.map +1 -0
  325. package/dist/who.js +20 -0
  326. package/dist/who.js.map +1 -0
  327. package/package.json +77 -0
@@ -0,0 +1,176 @@
1
+ import { pascal, titleCase } from "./index.js";
2
+ export function validateLensOptions(options) {
3
+ const problems = [];
4
+ if (!/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/.test(options.name)) {
5
+ problems.push(`"${options.name}" is not a slug: lower case, hyphen-separated, e.g. grounds-map`);
6
+ }
7
+ if (options.roles.length === 0) {
8
+ problems.push("a lens needs at least one role: --roles rows,columns,link");
9
+ }
10
+ for (const role of options.roles) {
11
+ if (!/^[a-z][A-Za-z0-9]*$/.test(role))
12
+ problems.push(`"${role}" is not a role name`);
13
+ }
14
+ return problems;
15
+ }
16
+ /** The files a new lens is: the lens itself, and the test that proves it. */
17
+ export function scaffoldLens(options) {
18
+ const dir = (options.dir ?? "src/ui/lens").replace(/\/+$/, "");
19
+ const binds = options.binds ?? "fields";
20
+ const Name = pascal(options.name);
21
+ const title = titleCase(options.name);
22
+ const roles = options.roles;
23
+ return [
24
+ { path: `${dir}/${options.name}.tsx`, contents: lensTsx(options.name, Name, title, roles, binds) },
25
+ { path: `${dir}/${options.name}.reuse.test.tsx`, contents: reuseTest(options.name, Name, roles, binds) },
26
+ ];
27
+ }
28
+ function rolesType(roles, binds) {
29
+ return roles
30
+ .map((role) => binds === "fields"
31
+ ? ` /** The field that fills "${role}". */\n readonly ${role}: string;`
32
+ : ` /** The kind or edge that fills "${role}". */\n readonly ${role}: { readonly kind: string } | { readonly edge: string };`)
33
+ .join("\n");
34
+ }
35
+ function lensTsx(name, Name, title, roles, binds) {
36
+ return `import { Chip, Panel } from "@graview/primitives";
37
+ import { useGraview, type ViewProps } from "@graview/react";
38
+ import type { AnySchema } from "@graview/core";
39
+
40
+ /**
41
+ * ${title} — a lens.
42
+ *
43
+ * A lens knows nothing about your domain: it knows there is ${roles
44
+ .map((role) => `a "${role}"`)
45
+ .join(", ")}, and an app says which of its own ${binds === "fields" ? "fields" : "kinds and edges"} fill them. That indirection is the whole point, and the test beside this
46
+ * file is where the claim is kept honest.
47
+ */
48
+
49
+ export const ${constantName(name)}_REQUIRED_ROLES = [${roles.map((role) => `"${role}"`).join(", ")}] as const;
50
+
51
+ export interface ${Name}Roles {
52
+ ${rolesType(roles, binds)}
53
+ }
54
+
55
+ /** Thrown when an app binds a role to something that is not there. */
56
+ export class ${Name}BindingError extends Error {
57
+ /** A sentence about what to do, which the scene's panel prints. */
58
+ readonly hint: string;
59
+ constructor(message: string, hint: string) {
60
+ super(message);
61
+ this.name = "${Name}BindingError";
62
+ this.hint = hint;
63
+ }
64
+ }
65
+
66
+ /**
67
+ * FAIL LOUDLY ON A BAD BINDING — and loudly means this panel, not the page:
68
+ * the scene puts an error boundary around every view, so a throw draws the
69
+ * message and the hint where the picture would have been.
70
+ */
71
+ function check<S extends AnySchema>(roles: ${Name}Roles, schema: S): void {
72
+ for (const role of ${constantName(name)}_REQUIRED_ROLES) {
73
+ if (roles[role] === undefined) {
74
+ throw new ${Name}BindingError(
75
+ \`${title} has no "\${role}" bound.\`,
76
+ \`Add \${role} to the lens bindings for this kind.\`,
77
+ );
78
+ }
79
+ }
80
+ void schema;
81
+ }
82
+
83
+ export function build${Name}(
84
+ nodes: readonly { readonly id: string; readonly kind: string }[],
85
+ roles: ${Name}Roles,
86
+ schema: AnySchema,
87
+ ): { readonly marks: readonly { readonly id: string; readonly label: string }[] } {
88
+ check(roles, schema);
89
+ /* TODO: read the roles, not the field names. This is the whole lens. */
90
+ return { marks: nodes.map((node) => ({ id: node.id, label: node.id })) };
91
+ }
92
+
93
+ /**
94
+ * Three fidelities, and \`summary\` is DENSER CONTENT rather than the same
95
+ * content scaled down.
96
+ */
97
+ export function create${Name}Lens<S extends AnySchema>(roles: ${Name}Roles) {
98
+ function View(props: ViewProps<S>) {
99
+ const { store } = useGraview<S>();
100
+ const built = build${Name}(props.nodes ?? [], roles, store.schema);
101
+ if (props.fidelity === "glyph") {
102
+ return <Chip label={\`\${props.label ?? "${title}"} · \${built.marks.length}\`} />;
103
+ }
104
+ return (
105
+ <Panel title={props.label ?? "${title}"} meta={\`\${built.marks.length}\`}>
106
+ {built.marks.map((mark) => (
107
+ /*
108
+ * EVERY REAL THING IS A TARGET. That one attribute is the whole
109
+ * contract: the host routes the click, gives it a tab stop and a
110
+ * role. Drawing in SVG? Set aria-label yourself — a shape has no
111
+ * text to be named by.
112
+ */
113
+ <div
114
+ key={mark.id}
115
+ data-graview-pick={mark.id}
116
+ data-graview-emphasis={props.implicated?.includes(mark.id) ? "lit" : undefined}
117
+ >
118
+ {mark.label}
119
+ </div>
120
+ ))}
121
+ </Panel>
122
+ );
123
+ }
124
+ return {
125
+ name: "${name}",
126
+ requiredRoles: [...${constantName(name)}_REQUIRED_ROLES],
127
+ roles,
128
+ View,
129
+ };
130
+ }
131
+ `;
132
+ }
133
+ function reuseTest(name, Name, roles, binds) {
134
+ const bound = roles
135
+ .map((role) => (binds === "fields" ? `${role}: "TODO"` : `${role}: { kind: "TODO" }`))
136
+ .join(", ");
137
+ return `import { createSchema, defineNode, z } from "@graview/core";
138
+ import { describe, expect, it } from "vitest";
139
+ import { build${Name} } from "./${name}.js";
140
+
141
+ /**
142
+ * THE REUSE TEST, RED ON PURPOSE.
143
+ *
144
+ * This is the claim a lens exists to support and the one nothing can make
145
+ * for you: build it against a domain it was NOT designed for, and if you
146
+ * cannot write this test, say so plainly — you have written a view, and a
147
+ * view is a legitimate thing to have written.
148
+ *
149
+ * The domain below is deliberately nothing to do with the app. Change the
150
+ * bindings to this domain's own fields, make it pass, and the claim is true.
151
+ */
152
+ const shift = defineNode("shift", {
153
+ fields: z.object({ label: z.string(), on: z.string(), place: z.string() }),
154
+ plural: "Shifts",
155
+ });
156
+ const volunteer = defineNode("volunteer", { fields: z.object({ label: z.string() }), plural: "Volunteers" });
157
+ const rota = createSchema([shift, volunteer]);
158
+
159
+ describe("${name} in a domain nothing here is about", () => {
160
+ it("builds against a rota, with no change to the lens", () => {
161
+ const built = build${Name}(
162
+ [{ id: "s1", kind: "shift" }],
163
+ { ${bound} },
164
+ rota as never,
165
+ );
166
+ expect(built.marks).toHaveLength(1);
167
+ /* TODO: assert something this lens is FOR, not that it returned. */
168
+ expect.fail("Bind the roles to this domain and assert what the picture says.");
169
+ });
170
+ });
171
+ `;
172
+ }
173
+ function constantName(name) {
174
+ return name.replace(/-/g, "_").toUpperCase();
175
+ }
176
+ //# sourceMappingURL=lens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lens.js","sourceRoot":"","sources":["../../src/scaffold/lens.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { ScaffoldOptions } from "./index.js";
2
+ export declare const SLUG: RegExp;
3
+ export declare function slugify(text: string): string;
4
+ export declare function titleCase(slug: string): string;
5
+ export declare function camel(slug: string): string;
6
+ export declare function pascal(slug: string): string;
7
+ /**
8
+ * The reasons a name or a kind cannot be used, said before any file exists.
9
+ * A kind is a TypeScript identifier and a URL segment and an edge target,
10
+ * so it is held to the strictest of those.
11
+ */
12
+ export declare function validateScaffoldOptions(options: ScaffoldOptions): readonly string[];
13
+ export type Ids = {
14
+ name: string;
15
+ kind: string;
16
+ plural: string;
17
+ spoken: string;
18
+ spokenPlural: string;
19
+ /** The kind spoken with its article: "an item", "a work order". */
20
+ aSpoken: string;
21
+ /** The same, capitalised for the head of a sentence. */
22
+ ASpoken: string;
23
+ Kind: string;
24
+ Plural: string;
25
+ kindVar: string;
26
+ KindPascal: string;
27
+ appVar: string;
28
+ brandVar: string;
29
+ schemaVar: string;
30
+ SchemaType: string;
31
+ StoreType: string;
32
+ AppComponent: string;
33
+ accent: string;
34
+ port: number;
35
+ link: string | undefined;
36
+ frameworkRepo: string | undefined;
37
+ range: string;
38
+ packageManager: "pnpm" | "npm";
39
+ packageName: string;
40
+ };
41
+ export declare function escapeHtml(text: string): string;
42
+ export declare function escapeString(text: string): string;
43
+ export declare function escapeTemplate(text: string): string;
44
+ //# sourceMappingURL=names.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"names.d.ts","sourceRoot":"","sources":["../../src/scaffold/names.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAQlD,eAAO,MAAM,IAAI,QAAoC,CAAC;AAEtD,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM5C;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK9C;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1C;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG3C;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,eAAe,GAAG,SAAS,MAAM,EAAE,CA0BnF;AAED,MAAM,MAAM,GAAG,GAAG;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,mEAAmE;IACnE,OAAO,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,GAAG,KAAK,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAIF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD"}
@@ -0,0 +1,69 @@
1
+ /*
2
+ * WHAT A NEW PROJECT IS CALLED, and every way that name is spelled: a slug
3
+ * for paths, a title for people, camel and pascal for code, and the escapes
4
+ * that let a name sit safely inside the files written about it.
5
+ */
6
+ export const SLUG = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;
7
+ export function slugify(text) {
8
+ return text
9
+ .trim()
10
+ .toLowerCase()
11
+ .replace(/[^a-z0-9]+/g, "-")
12
+ .replace(/^-+|-+$/g, "");
13
+ }
14
+ export function titleCase(slug) {
15
+ return slug
16
+ .split("-")
17
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
18
+ .join(" ");
19
+ }
20
+ export function camel(slug) {
21
+ return slug.replace(/-([a-z0-9])/g, (_, c) => c.toUpperCase());
22
+ }
23
+ export function pascal(slug) {
24
+ const c = camel(slug);
25
+ return c.charAt(0).toUpperCase() + c.slice(1);
26
+ }
27
+ /**
28
+ * The reasons a name or a kind cannot be used, said before any file exists.
29
+ * A kind is a TypeScript identifier and a URL segment and an edge target,
30
+ * so it is held to the strictest of those.
31
+ */
32
+ export function validateScaffoldOptions(options) {
33
+ const problems = [];
34
+ if (!options.name || options.name.trim().length === 0) {
35
+ problems.push("a name is required — the product's name, as a person would say it");
36
+ }
37
+ const kind = options.kind ?? "item";
38
+ if (!SLUG.test(kind)) {
39
+ problems.push(`the kind "${kind}" must be a slug: lowercase letters, digits and hyphens, starting with a letter`);
40
+ }
41
+ const plural = options.plural ?? `${kind}s`;
42
+ if (!SLUG.test(plural)) {
43
+ problems.push(`the plural "${plural}" must be a slug like the kind: lowercase letters, digits and hyphens`);
44
+ }
45
+ if (["kind", "edge", "node", "rule", "graph"].includes(kind)) {
46
+ problems.push(`the kind "${kind}" is a word the framework uses for itself; pick the thing your product is about`);
47
+ }
48
+ if (options.packageName !== undefined && !/^(@[a-z0-9-]+\/)?[a-z0-9][a-z0-9-._]*$/.test(options.packageName)) {
49
+ problems.push(`the package name "${options.packageName}" is not one npm accepts`);
50
+ }
51
+ if (options.port !== undefined && !(Number.isInteger(options.port) && options.port > 0 && options.port < 65536)) {
52
+ problems.push(`the port ${String(options.port)} is not a port`);
53
+ }
54
+ if (options.accent !== undefined && !/^#[0-9a-fA-F]{6}$/.test(options.accent)) {
55
+ problems.push(`the accent "${options.accent}" must be a six-digit hex colour like #2e7d32`);
56
+ }
57
+ return problems;
58
+ }
59
+ /* -------------------------------------------------------------- escapes */
60
+ export function escapeHtml(text) {
61
+ return text.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
62
+ }
63
+ export function escapeString(text) {
64
+ return text.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
65
+ }
66
+ export function escapeTemplate(text) {
67
+ return text.replace(/\\/g, "\\\\").replace(/`/g, "\`").replace(/\$\{/g, "\${");
68
+ }
69
+ //# sourceMappingURL=names.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"names.js","sourceRoot":"","sources":["../../src/scaffold/names.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { Ids } from "./names.js";
2
+ /** The packages a product depends on, in the order the skill lists them. */
3
+ export declare const GRAVIEW_PACKAGES: readonly ["core", "layout", "tools", "render", "react", "primitives", "pages", "ship", "embed", "studio"];
4
+ /**
5
+ * Everything a linked project resolves from the framework checkout: the
6
+ * packages a product imports, plus the skills and the tool it takes as
7
+ * devDependencies. Each must be built before `--link` can work.
8
+ */
9
+ export declare const LINKED_PACKAGES: readonly string[];
10
+ export declare const SURVEY_SAYS: string[];
11
+ export declare const AUDIT_SAYS: string[];
12
+ export declare const A11Y_SAYS: string[];
13
+ /**
14
+ * A harness that has not been written yet, and says so rather than passing.
15
+ *
16
+ * A green verdict from a script that measured nothing is worse than no
17
+ * script: it is a claim. This one exits non-zero, names what it is for, and
18
+ * points at the framework's own implementation to steal.
19
+ */
20
+ export declare function harness(name: string, says: readonly string[], ids: Ids): string;
21
+ /** The workspace root: what the app is, and where the harnesses go. */
22
+ export declare function workspaceRoot(ids: Ids, link: string | undefined): string;
23
+ /** The compiler options both the app and anything beside it share. */
24
+ export declare function tsconfigBase(): string;
25
+ /** One test run for the whole workspace, whatever grows beside the app. */
26
+ export declare function rootVitest(): string;
27
+ export declare function packageJson(ids: Ids, workspace: boolean): string;
28
+ export declare function tsconfig(workspace: boolean): string;
29
+ export declare function tsconfigBuild(): string;
30
+ export declare function viteConfig(ids: Ids): string;
31
+ export declare function gitignore(): string;
32
+ export declare function readme(ids: Ids): string;
33
+ export declare function ciYml(ids: Ids): string;
34
+ /**
35
+ * A project that consumes the framework by path needs the framework on the
36
+ * runner, at the same relative path, built. The project is checked out into
37
+ * a directory of its own and the framework beside it, so \`link:../<name>\`
38
+ * resolves exactly as it does on a laptop.
39
+ */
40
+ export declare function linkedCiYml(ids: Ids, pnpm: boolean): string;
41
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/scaffold/project.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAEtC,4EAA4E;AAC5E,eAAO,MAAM,gBAAgB,2GAoBnB,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,MAAM,EAA+C,CAAC;AAO7F,eAAO,MAAM,WAAW,UAIvB,CAAC;AAEF,eAAO,MAAM,UAAU,UAMtB,CAAC;AAEF,eAAO,MAAM,SAAS,UAIrB,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,MAAM,CAqB/E;AAED,uEAAuE;AACvE,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAgCxE;AAED,sEAAsE;AACtE,wBAAgB,YAAY,IAAI,MAAM,CAsBrC;AAED,2EAA2E;AAC3E,wBAAgB,UAAU,IAAI,MAAM,CAOnC;AAID,wBAAgB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,GAAG,MAAM,CAiEhE;AAED,wBAAgB,QAAQ,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,CAyCnD;AAED,wBAAgB,aAAa,IAAI,MAAM,CAoBtC;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAkL3C;AAOD,wBAAgB,SAAS,IAAI,MAAM,CAWlC;AAED,wBAAgB,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAwEvC;AAID,wBAAgB,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CA2BtC;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAwC3D"}