@intentius/sql-yodeler 0.2.0 → 0.4.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 (308) hide show
  1. package/README.md +3 -3
  2. package/dist/apply-steps/index.d.ts +65 -0
  3. package/dist/apply-steps/index.js +106 -0
  4. package/dist/apply-steps/index.js.map +1 -0
  5. package/dist/approval-mode/index.d.ts +78 -0
  6. package/dist/approval-mode/index.js +105 -0
  7. package/dist/approval-mode/index.js.map +1 -0
  8. package/dist/chant/access.d.ts +87 -0
  9. package/dist/chant/access.js +169 -0
  10. package/dist/chant/access.js.map +1 -0
  11. package/dist/chant/build.js +7 -0
  12. package/dist/chant/build.js.map +1 -1
  13. package/dist/chant/drift.d.ts +17 -1
  14. package/dist/chant/drift.js +55 -2
  15. package/dist/chant/drift.js.map +1 -1
  16. package/dist/chant/plan.d.ts +18 -2
  17. package/dist/chant/plan.js +21 -3
  18. package/dist/chant/plan.js.map +1 -1
  19. package/dist/ci/render.d.ts +333 -0
  20. package/dist/ci/render.js +885 -0
  21. package/dist/ci/render.js.map +1 -0
  22. package/dist/ci/replay.d.ts +17 -0
  23. package/dist/ci/replay.js +69 -0
  24. package/dist/ci/replay.js.map +1 -0
  25. package/dist/cleanup/index.d.ts +86 -0
  26. package/dist/cleanup/index.js +207 -0
  27. package/dist/cleanup/index.js.map +1 -0
  28. package/dist/commands/apply.d.ts +113 -0
  29. package/dist/commands/apply.js +370 -30
  30. package/dist/commands/apply.js.map +1 -1
  31. package/dist/commands/approve.d.ts +13 -0
  32. package/dist/commands/approve.js +239 -13
  33. package/dist/commands/approve.js.map +1 -1
  34. package/dist/commands/checkpoint.d.ts +3 -0
  35. package/dist/commands/checkpoint.js +78 -0
  36. package/dist/commands/checkpoint.js.map +1 -0
  37. package/dist/commands/ci.d.ts +3 -0
  38. package/dist/commands/ci.js +130 -0
  39. package/dist/commands/ci.js.map +1 -0
  40. package/dist/commands/cleanup.d.ts +13 -0
  41. package/dist/commands/cleanup.js +138 -0
  42. package/dist/commands/cleanup.js.map +1 -0
  43. package/dist/commands/config.d.ts +3 -0
  44. package/dist/commands/config.js +136 -0
  45. package/dist/commands/config.js.map +1 -0
  46. package/dist/commands/docs.d.ts +11 -0
  47. package/dist/commands/docs.js +108 -0
  48. package/dist/commands/docs.js.map +1 -0
  49. package/dist/commands/drift.d.ts +13 -1
  50. package/dist/commands/drift.js +52 -5
  51. package/dist/commands/drift.js.map +1 -1
  52. package/dist/commands/index.js +16 -0
  53. package/dist/commands/index.js.map +1 -1
  54. package/dist/commands/init.js +1 -1
  55. package/dist/commands/init.js.map +1 -1
  56. package/dist/commands/lint.js +39 -7
  57. package/dist/commands/lint.js.map +1 -1
  58. package/dist/commands/new.js +133 -34
  59. package/dist/commands/new.js.map +1 -1
  60. package/dist/commands/override.js +48 -16
  61. package/dist/commands/override.js.map +1 -1
  62. package/dist/commands/plan.js +47 -6
  63. package/dist/commands/plan.js.map +1 -1
  64. package/dist/commands/report.d.ts +13 -0
  65. package/dist/commands/report.js +121 -0
  66. package/dist/commands/report.js.map +1 -0
  67. package/dist/commands/revert.d.ts +20 -0
  68. package/dist/commands/revert.js +246 -0
  69. package/dist/commands/revert.js.map +1 -0
  70. package/dist/commands/status.js +32 -5
  71. package/dist/commands/status.js.map +1 -1
  72. package/dist/commands/test.d.ts +3 -0
  73. package/dist/commands/test.js +164 -0
  74. package/dist/commands/test.js.map +1 -0
  75. package/dist/config/base.d.ts +69 -0
  76. package/dist/config/base.js +121 -0
  77. package/dist/config/base.js.map +1 -0
  78. package/dist/config/define.d.ts +240 -3
  79. package/dist/config/define.js +4 -0
  80. package/dist/config/define.js.map +1 -1
  81. package/dist/config/index.d.ts +2 -0
  82. package/dist/config/index.js +2 -0
  83. package/dist/config/index.js.map +1 -1
  84. package/dist/config/load.d.ts +1 -1
  85. package/dist/config/load.js +156 -7
  86. package/dist/config/load.js.map +1 -1
  87. package/dist/config/settings.d.ts +22 -1
  88. package/dist/config/settings.js +34 -2
  89. package/dist/config/settings.js.map +1 -1
  90. package/dist/credentials.d.ts +119 -0
  91. package/dist/credentials.js +119 -0
  92. package/dist/credentials.js.map +1 -0
  93. package/dist/exit.js +1 -1
  94. package/dist/exit.js.map +1 -1
  95. package/dist/history/postgres/ddl.d.ts +18 -0
  96. package/dist/history/postgres/ddl.js +27 -2
  97. package/dist/history/postgres/ddl.js.map +1 -1
  98. package/dist/history/postgres/store.d.ts +2 -0
  99. package/dist/history/postgres/store.js +7 -1
  100. package/dist/history/postgres/store.js.map +1 -1
  101. package/dist/history/rows.d.ts +16 -3
  102. package/dist/history/rows.js +30 -1
  103. package/dist/history/rows.js.map +1 -1
  104. package/dist/history/store.d.ts +2 -0
  105. package/dist/history/store.js +2 -2
  106. package/dist/history/store.js.map +1 -1
  107. package/dist/index.d.ts +8 -1
  108. package/dist/index.js +3 -0
  109. package/dist/index.js.map +1 -1
  110. package/dist/init/adopt.js +1 -1
  111. package/dist/init/adopt.js.map +1 -1
  112. package/dist/init/clickhouse-access.d.ts +64 -0
  113. package/dist/init/clickhouse-access.js +211 -0
  114. package/dist/init/clickhouse-access.js.map +1 -0
  115. package/dist/init/live.d.ts +4 -0
  116. package/dist/init/live.js +16 -0
  117. package/dist/init/live.js.map +1 -1
  118. package/dist/lint/access.d.ts +18 -0
  119. package/dist/lint/access.js +34 -0
  120. package/dist/lint/access.js.map +1 -0
  121. package/dist/lint/check.js +38 -6
  122. package/dist/lint/check.js.map +1 -1
  123. package/dist/lint/config.d.ts +7 -1
  124. package/dist/lint/config.js +11 -5
  125. package/dist/lint/config.js.map +1 -1
  126. package/dist/lint/index.d.ts +2 -0
  127. package/dist/lint/index.js +2 -0
  128. package/dist/lint/index.js.map +1 -1
  129. package/dist/lint/naming.d.ts +62 -0
  130. package/dist/lint/naming.js +138 -0
  131. package/dist/lint/naming.js.map +1 -0
  132. package/dist/lint/report.js +1 -1
  133. package/dist/lint/report.js.map +1 -1
  134. package/dist/lint/routines.d.ts +26 -0
  135. package/dist/lint/routines.js +65 -0
  136. package/dist/lint/routines.js.map +1 -0
  137. package/dist/lint/rules.d.ts +51 -6
  138. package/dist/lint/rules.js +23 -6
  139. package/dist/lint/rules.js.map +1 -1
  140. package/dist/lint/schema-checks.d.ts +63 -0
  141. package/dist/lint/schema-checks.js +128 -0
  142. package/dist/lint/schema-checks.js.map +1 -0
  143. package/dist/lint/statements.d.ts +22 -1
  144. package/dist/lint/statements.js +40 -1
  145. package/dist/lint/statements.js.map +1 -1
  146. package/dist/mcp/tools.d.ts +1 -1
  147. package/dist/mcp/tools.js +1 -1
  148. package/dist/mcp/tools.js.map +1 -1
  149. package/dist/migrations/checkpoint.d.ts +45 -0
  150. package/dist/migrations/checkpoint.js +108 -0
  151. package/dist/migrations/checkpoint.js.map +1 -0
  152. package/dist/migrations/checks.d.ts +19 -1
  153. package/dist/migrations/checks.js +15 -0
  154. package/dist/migrations/checks.js.map +1 -1
  155. package/dist/migrations/create.d.ts +13 -4
  156. package/dist/migrations/create.js +24 -7
  157. package/dist/migrations/create.js.map +1 -1
  158. package/dist/migrations/document.d.ts +10 -0
  159. package/dist/migrations/document.js +1 -0
  160. package/dist/migrations/document.js.map +1 -1
  161. package/dist/migrations/index.d.ts +2 -0
  162. package/dist/migrations/index.js +2 -0
  163. package/dist/migrations/index.js.map +1 -1
  164. package/dist/migrations/routines.d.ts +21 -0
  165. package/dist/migrations/routines.js +30 -0
  166. package/dist/migrations/routines.js.map +1 -0
  167. package/dist/notify/index.d.ts +124 -0
  168. package/dist/notify/index.js +210 -0
  169. package/dist/notify/index.js.map +1 -0
  170. package/dist/notify/verify.d.ts +53 -0
  171. package/dist/notify/verify.js +71 -0
  172. package/dist/notify/verify.js.map +1 -0
  173. package/dist/pr/model.d.ts +7 -1
  174. package/dist/pr/model.js +29 -7
  175. package/dist/pr/model.js.map +1 -1
  176. package/dist/pr/render.d.ts +4 -1
  177. package/dist/pr/render.js +49 -9
  178. package/dist/pr/render.js.map +1 -1
  179. package/dist/pr/tenants.d.ts +37 -0
  180. package/dist/pr/tenants.js +138 -0
  181. package/dist/pr/tenants.js.map +1 -0
  182. package/dist/probe.d.ts +27 -0
  183. package/dist/probe.js +106 -0
  184. package/dist/probe.js.map +1 -0
  185. package/dist/project.d.ts +35 -2
  186. package/dist/project.js +62 -2
  187. package/dist/project.js.map +1 -1
  188. package/dist/replay/clickhouse.d.ts +31 -0
  189. package/dist/replay/clickhouse.js +103 -6
  190. package/dist/replay/clickhouse.js.map +1 -1
  191. package/dist/replay/replay.d.ts +14 -3
  192. package/dist/replay/replay.js +62 -31
  193. package/dist/replay/replay.js.map +1 -1
  194. package/dist/replay/report.js +1 -1
  195. package/dist/replay/report.js.map +1 -1
  196. package/dist/report/audit.d.ts +138 -0
  197. package/dist/report/audit.js +219 -0
  198. package/dist/report/audit.js.map +1 -0
  199. package/dist/report/jsonl.d.ts +21 -0
  200. package/dist/report/jsonl.js +52 -0
  201. package/dist/report/jsonl.js.map +1 -0
  202. package/dist/report/model.d.ts +68 -0
  203. package/dist/report/model.js +127 -0
  204. package/dist/report/model.js.map +1 -0
  205. package/dist/report/render.d.ts +18 -0
  206. package/dist/report/render.js +127 -0
  207. package/dist/report/render.js.map +1 -0
  208. package/dist/schema-docs/render.d.ts +49 -0
  209. package/dist/schema-docs/render.js +359 -0
  210. package/dist/schema-docs/render.js.map +1 -0
  211. package/dist/schemas.d.ts +7 -2
  212. package/dist/schemas.js +7 -2
  213. package/dist/schemas.js.map +1 -1
  214. package/dist/sources/ddl.d.ts +48 -0
  215. package/dist/sources/ddl.js +53 -0
  216. package/dist/sources/ddl.js.map +1 -0
  217. package/dist/sources/index.d.ts +69 -0
  218. package/dist/sources/index.js +170 -0
  219. package/dist/sources/index.js.map +1 -0
  220. package/dist/steps/backfill.d.ts +40 -5
  221. package/dist/steps/backfill.js +128 -8
  222. package/dist/steps/backfill.js.map +1 -1
  223. package/dist/steps/index.d.ts +19 -1
  224. package/dist/steps/index.js +34 -7
  225. package/dist/steps/index.js.map +1 -1
  226. package/dist/steps/kinds.d.ts +42 -4
  227. package/dist/steps/kinds.js +88 -14
  228. package/dist/steps/kinds.js.map +1 -1
  229. package/dist/steps/postgres-migration.d.ts +38 -25
  230. package/dist/steps/postgres-migration.js +49 -32
  231. package/dist/steps/postgres-migration.js.map +1 -1
  232. package/dist/steps/rebuild.d.ts +15 -6
  233. package/dist/steps/rebuild.js +12 -9
  234. package/dist/steps/rebuild.js.map +1 -1
  235. package/dist/tenants/index.d.ts +41 -0
  236. package/dist/tenants/index.js +121 -0
  237. package/dist/tenants/index.js.map +1 -0
  238. package/dist/tenants/target.d.ts +23 -0
  239. package/dist/tenants/target.js +29 -0
  240. package/dist/tenants/target.js.map +1 -0
  241. package/dist/tenants/wave.d.ts +128 -0
  242. package/dist/tenants/wave.js +254 -0
  243. package/dist/tenants/wave.js.map +1 -0
  244. package/dist/testing/define.d.ts +62 -0
  245. package/dist/testing/define.js +32 -0
  246. package/dist/testing/define.js.map +1 -0
  247. package/dist/testing/files.d.ts +5 -0
  248. package/dist/testing/files.js +18 -0
  249. package/dist/testing/files.js.map +1 -0
  250. package/dist/testing/report.d.ts +14 -0
  251. package/dist/testing/report.js +83 -0
  252. package/dist/testing/report.js.map +1 -0
  253. package/dist/testing/run.d.ts +104 -0
  254. package/dist/testing/run.js +328 -0
  255. package/dist/testing/run.js.map +1 -0
  256. package/dist/versioned/approval.d.ts +6 -0
  257. package/dist/versioned/approval.js +11 -5
  258. package/dist/versioned/approval.js.map +1 -1
  259. package/dist/versioned/checks.d.ts +8 -2
  260. package/dist/versioned/checks.js +34 -13
  261. package/dist/versioned/checks.js.map +1 -1
  262. package/dist/versioned/driver.d.ts +2 -2
  263. package/dist/versioned/engine.d.ts +16 -0
  264. package/dist/versioned/engine.js +20 -6
  265. package/dist/versioned/engine.js.map +1 -1
  266. package/dist/versioned/explain.d.ts +2 -0
  267. package/dist/versioned/explain.js +3 -1
  268. package/dist/versioned/explain.js.map +1 -1
  269. package/dist/versioned/index.d.ts +1 -0
  270. package/dist/versioned/index.js +1 -0
  271. package/dist/versioned/index.js.map +1 -1
  272. package/dist/versioned/op.d.ts +6 -1
  273. package/dist/versioned/op.js +7 -2
  274. package/dist/versioned/op.js.map +1 -1
  275. package/dist/versioned/policy.d.ts +33 -2
  276. package/dist/versioned/policy.js +59 -8
  277. package/dist/versioned/policy.js.map +1 -1
  278. package/dist/versioned/report.js +9 -0
  279. package/dist/versioned/report.js.map +1 -1
  280. package/dist/versioned/revert.d.ts +128 -0
  281. package/dist/versioned/revert.js +251 -0
  282. package/dist/versioned/revert.js.map +1 -0
  283. package/dist/versioned/state.d.ts +25 -0
  284. package/dist/versioned/state.js +37 -4
  285. package/dist/versioned/state.js.map +1 -1
  286. package/dist/waves/index.d.ts +224 -0
  287. package/dist/waves/index.js +353 -0
  288. package/dist/waves/index.js.map +1 -0
  289. package/dist/waves/promotion.d.ts +56 -0
  290. package/dist/waves/promotion.js +108 -0
  291. package/dist/waves/promotion.js.map +1 -0
  292. package/dist/waves/record.d.ts +34 -0
  293. package/dist/waves/record.js +20 -0
  294. package/dist/waves/record.js.map +1 -0
  295. package/package.json +11 -7
  296. package/schemas/apply.schema.json +162 -3
  297. package/schemas/checkpoint.schema.json +19 -0
  298. package/schemas/cleanup.schema.json +40 -0
  299. package/schemas/drift.schema.json +26 -1
  300. package/schemas/event.schema.json +36 -0
  301. package/schemas/lint-rules.schema.json +4 -0
  302. package/schemas/lint.schema.json +4 -0
  303. package/schemas/new.schema.json +41 -3
  304. package/schemas/plan.schema.json +157 -0
  305. package/schemas/report.schema.json +114 -0
  306. package/schemas/revert.schema.json +69 -0
  307. package/schemas/status.schema.json +64 -3
  308. package/schemas/test.schema.json +41 -0
@@ -0,0 +1,359 @@
1
+ /**
2
+ * `yodel docs` (#62): the declared schema as a static reference, from the
3
+ * sql lexicon's build output (or a migration's recorded schema), with no
4
+ * server read and nothing to run in the browser.
5
+ *
6
+ * - {@link schemaHtml}: one self-contained HTML page (inline CSS, no
7
+ * scripts): every object with its columns, keys, relations, ClickHouse
8
+ * engine and sort key, comments, DDL, and the migrations that changed it.
9
+ * - {@link erdMermaid}: a Mermaid `erDiagram` of the tables and views and
10
+ * how they relate: Postgres foreign keys, what a view or materialized view
11
+ * reads, the table a materialized view writes to, and the local table a
12
+ * ClickHouse `Distributed` table serves.
13
+ *
14
+ * Both are deterministic: the same input gives the same bytes, so the
15
+ * output can be committed and compared.
16
+ */
17
+ const RELATIONS = new Set(["Table", "View", "MaterializedView", "Dictionary"]);
18
+ /** "ClickHouse::Table" to "Table". */
19
+ const kindOf = (o) => (o.type ?? "").split("::").pop() ?? "";
20
+ const str = (v) => (typeof v === "string" ? v : undefined);
21
+ const strs = (v) => (Array.isArray(v) ? v.filter((x) => typeof x === "string") : []);
22
+ const sqlName = (o) => str(o.sqlName) ?? str(o.name) ?? o.export;
23
+ const columnsOf = (o) => (Array.isArray(o.columns) ? o.columns : []);
24
+ const foreignKeysOf = (o) => (Array.isArray(o.foreignKeys) ? o.foreignKeys : []);
25
+ /** The objects in apply order (then any the order leaves out, by export name). */
26
+ function ordered(output) {
27
+ const objects = output.objects;
28
+ const byExport = new Map(objects.map((o) => [o.export, o]));
29
+ const order = strs(output.applyOrder);
30
+ const seen = new Set();
31
+ const out = [];
32
+ for (const name of order) {
33
+ const o = byExport.get(name);
34
+ if (o && !seen.has(name)) {
35
+ out.push(o);
36
+ seen.add(name);
37
+ }
38
+ }
39
+ for (const o of [...objects].sort((a, b) => a.export.localeCompare(b.export)))
40
+ if (!seen.has(o.export))
41
+ out.push(o);
42
+ return out;
43
+ }
44
+ /** The tables, views, materialized views and dictionaries: what the ERD draws. */
45
+ const relationsOf = (output) => ordered(output).filter((o) => RELATIONS.has(kindOf(o)));
46
+ /** The identifiers in a key expression such as `(kind, id)` or `tuple()`. */
47
+ const identifiers = (expr) => new Set((expr ?? "").match(/[A-Za-z_][A-Za-z0-9_]*/g) ?? []);
48
+ /** Every relation between the objects the ERD draws, in a stable order. */
49
+ export function relations(output) {
50
+ const objects = relationsOf(output);
51
+ const byExport = new Map(objects.map((o) => [o.export, o]));
52
+ const bySqlName = new Map(objects.map((o) => [sqlName(o), o]));
53
+ const out = [];
54
+ for (const o of objects) {
55
+ for (const fk of foreignKeysOf(o)) {
56
+ const target = (fk.references !== undefined ? byExport.get(fk.references) : undefined) ?? (fk.refTable !== undefined ? bySqlName.get(fk.refTable) : undefined);
57
+ if (!target)
58
+ continue;
59
+ const columns = columnsOf(o);
60
+ const optional = fk.columns.some((c) => columns.find((col) => col.name === c)?.notNull !== true);
61
+ const cols = `${fk.columns.join(", ")} to ${(fk.refColumns ?? []).join(", ") || "its primary key"}`;
62
+ out.push({ from: o.export, to: target.export, kind: "foreign key", label: fk.name ? `${fk.name}: ${cols}` : cols, optional });
63
+ }
64
+ const to = str(o.to);
65
+ if (to !== undefined && byExport.has(to))
66
+ out.push({ from: o.export, to, kind: "writes to", label: "writes to" });
67
+ for (const r of strs(o.reads))
68
+ if (byExport.has(r))
69
+ out.push({ from: o.export, to: r, kind: "reads", label: "reads" });
70
+ const engine = o.engine;
71
+ if (engine?.name === "Distributed") {
72
+ const [, db, table] = (engine.args ?? []).map((a) => (typeof a === "string" ? a.replace(/^'|'$/g, "") : ""));
73
+ const target = db !== undefined && table !== undefined ? bySqlName.get(`${db}.${table}`) : undefined;
74
+ if (target)
75
+ out.push({ from: o.export, to: target.export, kind: "distributes", label: "distributes to" });
76
+ }
77
+ }
78
+ return out;
79
+ }
80
+ /** A Mermaid entity id: the SQL name with every other character as `_`. */
81
+ function entityIds(objects) {
82
+ const ids = new Map();
83
+ const used = new Set();
84
+ for (const o of objects) {
85
+ const base = sqlName(o).replace(/[^A-Za-z0-9_]/g, "_");
86
+ let id = base;
87
+ for (let n = 2; used.has(id); n++)
88
+ id = `${base}_${String(n)}`;
89
+ used.add(id);
90
+ ids.set(o.export, id);
91
+ }
92
+ return ids;
93
+ }
94
+ /** Mermaid takes a type as one word: the type with spaces and commas as `_`. */
95
+ const mermaidType = (type) => (type ?? "unknown").replace(/,\s*/g, "_").replace(/[^A-Za-z0-9_()[\]-]/g, "_");
96
+ const mermaidText = (text) => text.replace(/"/g, "'").replace(/\s+/g, " ").trim();
97
+ /** The columns the object's keys name: PK, FK, UK, for the ERD's key column. */
98
+ function columnKeys(o) {
99
+ const keys = new Map();
100
+ const add = (column, key) => {
101
+ const list = keys.get(column) ?? [];
102
+ if (!list.includes(key))
103
+ list.push(key);
104
+ keys.set(column, list);
105
+ };
106
+ const pk = o.primaryKey;
107
+ if (pk && typeof pk === "object" && "columns" in pk)
108
+ for (const c of strs((pk).columns))
109
+ add(c, "PK");
110
+ // ClickHouse: the primary key, or the sort key when it has none, is what the sparse index is built on.
111
+ if (typeof pk === "string" || (pk === undefined && typeof o.orderBy === "string")) {
112
+ const names = new Set(columnsOf(o).map((c) => c.name));
113
+ for (const id of identifiers(str(pk) ?? str(o.orderBy)))
114
+ if (names.has(id))
115
+ add(id, "PK");
116
+ }
117
+ for (const fk of foreignKeysOf(o))
118
+ for (const c of fk.columns)
119
+ add(c, "FK");
120
+ if (Array.isArray(o.uniques))
121
+ for (const u of o.uniques)
122
+ for (const c of strs(u.columns))
123
+ add(c, "UK");
124
+ return keys;
125
+ }
126
+ /** The Mermaid `erDiagram`: one entity per table or view, one line per relation. */
127
+ export function erdMermaid(output) {
128
+ const objects = relationsOf(output);
129
+ const ids = entityIds(objects);
130
+ const lines = ["erDiagram"];
131
+ for (const o of objects) {
132
+ const keys = columnKeys(o);
133
+ const entity = ` ${ids.get(o.export) ?? o.export}["${sqlName(o)}"]`;
134
+ const columns = columnsOf(o);
135
+ // A view's columns come from its query and have no declared type: the entity alone.
136
+ if (columns.length === 0) {
137
+ lines.push(entity);
138
+ continue;
139
+ }
140
+ lines.push(`${entity} {`);
141
+ for (const c of columns) {
142
+ const k = keys.get(c.name);
143
+ const comment = c.comment ? ` "${mermaidText(c.comment)}"` : "";
144
+ lines.push(` ${mermaidType(c.type)} ${c.name}${k ? ` ${k.join(", ")}` : ""}${comment}`);
145
+ }
146
+ lines.push(" }");
147
+ }
148
+ for (const r of relations(output)) {
149
+ const from = ids.get(r.from) ?? r.from;
150
+ const to = ids.get(r.to) ?? r.to;
151
+ // A foreign key: many rows to one (or none, when its columns may be null). The rest are not keys, so dotted.
152
+ const shape = r.kind === "foreign key" ? (r.optional ? "}o--o|" : "}o--||") : "}o..||";
153
+ lines.push(` ${from} ${shape} ${to} : "${mermaidText(r.label)}"`);
154
+ }
155
+ return `${lines.join("\n")}\n`;
156
+ }
157
+ /** The ERD as Markdown, which GitHub, GitLab and Forgejo render. */
158
+ export function erdMarkdown(input) {
159
+ return `# ${input.title}: entity relationships\n\nFrom ${input.source}. Written by \`yodel docs\`; index.html next to this file has every object's columns, keys, engine and history.\n\n\`\`\`mermaid\n${erdMermaid(input.output)}\`\`\`\n`;
160
+ }
161
+ const esc = (s) => s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
162
+ const code = (s) => `<code>${esc(s)}</code>`;
163
+ const anchor = (o) => `o-${o.export.replace(/[^A-Za-z0-9_-]/g, "-")}`;
164
+ /** A column's default, generated expression or codec, as one line. */
165
+ function columnDetail(c) {
166
+ const parts = [];
167
+ const d = c.default;
168
+ if (typeof d === "string")
169
+ parts.push(`DEFAULT ${d}`);
170
+ else if (d && typeof d === "object") {
171
+ const { kind, expr } = d;
172
+ parts.push(`${kind ?? "DEFAULT"} ${expr ?? ""}`.trim());
173
+ }
174
+ const g = c.generated;
175
+ if (g && typeof g === "object") {
176
+ const { kind, always, expr } = g;
177
+ parts.push(kind === "identity" ? `GENERATED ${always ? "ALWAYS" : "BY DEFAULT"} AS IDENTITY` : `GENERATED ALWAYS AS (${expr ?? ""})`);
178
+ }
179
+ if (c.codec)
180
+ parts.push(`CODEC(${c.codec})`);
181
+ if (c.ttl)
182
+ parts.push(`TTL ${c.ttl}`);
183
+ return parts.join(", ");
184
+ }
185
+ /** A view's columns: each output of its query and the expression it comes from. */
186
+ function lineageTable(o) {
187
+ const lineage = Array.isArray(o.lineage) ? o.lineage : [];
188
+ if (lineage.length === 0)
189
+ return "";
190
+ const rows = lineage.map((l) => `<tr><td>${code(l.output ?? "")}</td><td>${code(l.expr ?? "")}</td></tr>`);
191
+ return `<table><thead><tr><th>Column</th><th>Expression</th></tr></thead><tbody>\n${rows.join("\n")}\n</tbody></table>`;
192
+ }
193
+ function columnsTable(o) {
194
+ const columns = columnsOf(o);
195
+ if (columns.length === 0)
196
+ return lineageTable(o);
197
+ const keys = columnKeys(o);
198
+ const postgres = o.type?.startsWith("Postgres::") === true;
199
+ const rows = columns.map((c) => {
200
+ const nullable = postgres ? (c.notNull === true ? "no" : "yes") : /^Nullable\(/.test(c.type ?? "") ? "yes" : "no";
201
+ return `<tr><td>${code(c.name)}</td><td>${code(c.type ?? "")}</td><td>${nullable}</td><td>${esc((keys.get(c.name) ?? []).join(", "))}</td><td>${esc(columnDetail(c))}</td><td>${esc(c.comment ?? "")}</td></tr>`;
202
+ });
203
+ return `<table><thead><tr><th>Column</th><th>Type</th><th>Null</th><th>Key</th><th>Default</th><th>Comment</th></tr></thead><tbody>\n${rows.join("\n")}\n</tbody></table>`;
204
+ }
205
+ /** The facts under an object's name: engine, sort key and the rest, as a definition list. */
206
+ function facts(o, byExport) {
207
+ const items = [];
208
+ const engine = o.engine;
209
+ if (engine?.name)
210
+ items.push(["Engine", code(`${engine.name}${engine.args?.length ? `(${engine.args.map(String).join(", ")})` : ""}`)]);
211
+ for (const [key, label] of [
212
+ ["orderBy", "ORDER BY"],
213
+ ["primaryKey", "PRIMARY KEY"],
214
+ ["partitionBy", "PARTITION BY"],
215
+ ["sampleBy", "SAMPLE BY"],
216
+ ["ttl", "TTL"],
217
+ ]) {
218
+ const v = str(o[key]);
219
+ if (v !== undefined)
220
+ items.push([label, code(v)]);
221
+ }
222
+ const pk = o.primaryKey;
223
+ if (pk && typeof pk === "object" && "columns" in pk) {
224
+ const { name, columns } = pk;
225
+ items.push(["Primary key", `${code(`(${strs(columns).join(", ")})`)}${name ? ` ${esc(name)}` : ""}`]);
226
+ }
227
+ if (Array.isArray(o.uniques))
228
+ for (const u of o.uniques)
229
+ items.push(["Unique", `${code(`(${strs(u.columns).join(", ")})`)}${u.name ? ` ${esc(u.name)}` : ""}`]);
230
+ if (Array.isArray(o.checks))
231
+ for (const c of o.checks)
232
+ items.push(["Check", `${code(c.expr ?? "")}${c.name ? ` ${esc(c.name)}` : ""}`]);
233
+ for (const fk of foreignKeysOf(o)) {
234
+ const target = (fk.references !== undefined ? byExport.get(fk.references) : undefined);
235
+ const ref = target ? `<a href="#${anchor(target)}">${esc(sqlName(target))}</a>` : esc(fk.refTable ?? fk.references ?? "");
236
+ const actions = [fk.onDelete ? `ON DELETE ${fk.onDelete}` : "", fk.onUpdate ? `ON UPDATE ${fk.onUpdate}` : ""].filter(Boolean).join(" ");
237
+ items.push(["Foreign key", `${code(`(${fk.columns.join(", ")})`)} references ${ref} ${code(`(${(fk.refColumns ?? []).join(", ")})`)}${actions ? ` ${esc(actions)}` : ""}${fk.name ? ` ${esc(fk.name)}` : ""}`]);
238
+ }
239
+ if (Array.isArray(o.indexes))
240
+ for (const i of o.indexes)
241
+ items.push(["Skip index", code(`${i.name ?? ""} ${i.expr ?? ""} TYPE ${i.type ?? ""}`.trim())]);
242
+ if (Array.isArray(o.projections))
243
+ for (const p of o.projections)
244
+ items.push(["Projection", code(p.name ?? "")]);
245
+ const table = str(o.table);
246
+ if (kindOf(o) === "Index" && table !== undefined) {
247
+ const t = byExport.get(table);
248
+ const elements = Array.isArray(o.elements) ? o.elements.map((e) => e.expr ?? "") : [];
249
+ items.push(["On", `${t ? `<a href="#${anchor(t)}">${esc(sqlName(t))}</a>` : esc(str(o.tableName) ?? table)} ${code(`(${elements.join(", ")})`)}${str(o.method) ? ` using ${esc(str(o.method) ?? "")}` : ""}`]);
250
+ }
251
+ const select = str(o.select) ?? str(o.query);
252
+ if (select !== undefined)
253
+ items.push(["Query", `<pre>${esc(select)}</pre>`]);
254
+ if (items.length === 0)
255
+ return "";
256
+ return `<dl>\n${items.map(([k, v]) => `<dt>${esc(k)}</dt><dd>${v}</dd>`).join("\n")}\n</dl>`;
257
+ }
258
+ function relationList(o, all, byExport) {
259
+ const link = (exportName) => {
260
+ const t = byExport.get(exportName);
261
+ return t ? `<a href="#${anchor(t)}">${esc(sqlName(t))}</a>` : esc(exportName);
262
+ };
263
+ const out = all.filter((r) => r.from === o.export).map((r) => `<li>${esc(r.kind === "foreign key" ? `foreign key ${r.label}:` : r.label)} ${link(r.to)}</li>`);
264
+ const inbound = all.filter((r) => r.to === o.export).map((r) => {
265
+ const verb = r.kind === "foreign key" ? `referenced by (${r.label})` : r.kind === "reads" ? "read by" : r.kind === "writes to" ? "written by" : "distributed by";
266
+ return `<li>${esc(verb)} ${link(r.from)}</li>`;
267
+ });
268
+ const items = [...out, ...inbound];
269
+ return items.length ? `<h4>Relations</h4>\n<ul>\n${items.join("\n")}\n</ul>` : "";
270
+ }
271
+ /** What one migration step did to an object, as one line. */
272
+ function stepLine(step) {
273
+ const s = step;
274
+ if (s.kind === "statement")
275
+ return `${str(s.rule) ?? ""} ${str(s.class) ?? ""}: ${str(s.sql) ?? ""}`.trim();
276
+ if (s.kind === "op") {
277
+ const changes = Array.isArray(s.changes) ? s.changes.map((c) => `${c.rule ?? ""} ${c.field ?? ""}`.trim()).join("; ") : "";
278
+ return `${str(s.op) ?? "Op"} step${changes ? ` (${changes})` : ""}`;
279
+ }
280
+ return `${typeof s.kind === "string" ? s.kind : "manual"} step${str(s.detail) ? `: ${str(s.detail) ?? ""}` : ""}`;
281
+ }
282
+ function history(o, migrations) {
283
+ if (!migrations)
284
+ return "";
285
+ const rows = [];
286
+ for (const m of migrations) {
287
+ for (const step of m.steps) {
288
+ const s = step;
289
+ if (s.name === sqlName(o) || (s.name === undefined && s.object === o.export))
290
+ rows.push(`<tr><td>${code(m.id)}</td><td>${code(stepLine(step))}</td></tr>`);
291
+ }
292
+ }
293
+ if (rows.length === 0)
294
+ return "";
295
+ return `<h4>History</h4>\n<table><thead><tr><th>Migration</th><th>Step</th></tr></thead><tbody>\n${rows.join("\n")}\n</tbody></table>`;
296
+ }
297
+ const STYLE = `:root{color-scheme:light dark;--fg:#1d1f23;--muted:#5d6470;--bg:#fff;--line:#d8dce3;--code:#f3f5f8;--link:#1f5fbf}
298
+ @media (prefers-color-scheme:dark){:root{--fg:#e6e8eb;--muted:#a3a9b3;--bg:#16181c;--line:#353a42;--code:#22262c;--link:#7fb0ff}}
299
+ body{margin:0;background:var(--bg);color:var(--fg);font:15px/1.5 system-ui,-apple-system,"Segoe UI",sans-serif}
300
+ main{max-width:1100px;margin:0 auto;padding:24px 16px 64px}
301
+ h1{font-size:1.6rem;margin:0 0 4px}h2{margin-top:2.2rem;border-bottom:1px solid var(--line);padding-bottom:4px}
302
+ h3{margin:2rem 0 .3rem}h4{margin:1rem 0 .3rem;font-size:.95rem}
303
+ .muted,.kind{color:var(--muted)}.kind{font-weight:400;font-size:.85rem;margin-left:.5rem}
304
+ a{color:var(--link)}code,pre{font:13px/1.45 ui-monospace,SFMono-Regular,Menlo,monospace;background:var(--code);border-radius:4px}
305
+ code{padding:1px 4px}pre{padding:8px 10px;overflow-x:auto;white-space:pre}
306
+ table{border-collapse:collapse;width:100%;margin:.4rem 0;display:block;overflow-x:auto}
307
+ th,td{border:1px solid var(--line);padding:4px 8px;text-align:left;vertical-align:top}th{font-weight:600}
308
+ dl{display:grid;grid-template-columns:max-content 1fr;gap:4px 12px;margin:.5rem 0}dt{color:var(--muted)}dd{margin:0}dd pre{margin:0}
309
+ ul.toc{columns:2 260px;padding-left:1.2rem}details{margin:.5rem 0}summary{cursor:pointer;color:var(--muted)}`;
310
+ /** The self-contained HTML reference. */
311
+ export function schemaHtml(input) {
312
+ const objects = ordered(input.output);
313
+ const byExport = new Map(objects.map((o) => [o.export, o]));
314
+ const all = relations(input.output);
315
+ const sections = objects.map((o) => {
316
+ const comment = str(o.comment);
317
+ return [
318
+ `<section id="${anchor(o)}">`,
319
+ `<h3>${esc(sqlName(o))}<span class="kind">${esc(o.type ?? "")}, export ${esc(o.export)}</span></h3>`,
320
+ comment ? `<p>${esc(comment)}</p>` : "",
321
+ facts(o, byExport),
322
+ columnsTable(o),
323
+ relationList(o, all, byExport),
324
+ history(o, input.migrations),
325
+ `<details><summary>DDL</summary><pre>${esc(o.ddl)}</pre></details>`,
326
+ "</section>",
327
+ ].filter(Boolean).join("\n");
328
+ });
329
+ const toc = objects.map((o) => `<li><a href="#${anchor(o)}">${esc(sqlName(o))}</a> <span class="muted">${esc(kindOf(o))}</span></li>`);
330
+ const dialect = input.output.dialect === "clickhouse" ? "ClickHouse" : "Postgres";
331
+ return `<!doctype html>
332
+ <html lang="en">
333
+ <head>
334
+ <meta charset="utf-8">
335
+ <meta name="viewport" content="width=device-width, initial-scale=1">
336
+ <title>${esc(input.title)}: schema</title>
337
+ <style>
338
+ ${STYLE}
339
+ </style>
340
+ </head>
341
+ <body>
342
+ <main>
343
+ <h1>${esc(input.title)}</h1>
344
+ <p class="muted">${esc(dialect)}, ${String(objects.length)} objects, from ${esc(input.source)}. Written by <code>yodel docs</code>.</p>
345
+ <h2>Objects</h2>
346
+ <ul class="toc">
347
+ ${toc.join("\n")}
348
+ </ul>
349
+ <h2>Entity relationships</h2>
350
+ <p class="muted">Mermaid source; erd.md next to this file renders it on GitHub, GitLab and Forgejo.</p>
351
+ <pre>${esc(erdMermaid(input.output))}</pre>
352
+ <h2>Reference</h2>
353
+ ${sections.join("\n")}
354
+ </main>
355
+ </body>
356
+ </html>
357
+ `;
358
+ }
359
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/schema-docs/render.ts"],"names":[],"mappings":"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"}
package/dist/schemas.d.ts CHANGED
@@ -19,15 +19,20 @@ export declare const COMMAND_SCHEMAS: {
19
19
  readonly plan: "plan";
20
20
  readonly apply: "apply";
21
21
  readonly new: "new";
22
+ readonly checkpoint: "checkpoint";
22
23
  readonly lint: "lint";
23
24
  readonly "lint --rules": "lint-rules";
24
25
  readonly status: "status";
26
+ readonly report: "report";
25
27
  readonly drift: "drift";
26
28
  readonly rebase: "rebase";
27
29
  readonly repair: "repair";
30
+ readonly revert: "revert";
31
+ readonly cleanup: "cleanup";
32
+ readonly test: "test";
28
33
  };
29
- /** Every schema file: the commands', the definitions they share, and the MCP tool results. */
30
- export declare const SCHEMA_NAMES: readonly ["common", ...("lint" | "plan" | "status" | "apply" | "drift" | "init" | "new" | "lint-rules" | "rebase" | "repair")[], "mcp"];
34
+ /** Every schema file: the commands', the definitions they share, the MCP tool results, and the webhook event (#61). */
35
+ export declare const SCHEMA_NAMES: readonly ["common", ...("checkpoint" | "status" | "apply" | "revert" | "drift" | "plan" | "lint" | "report" | "cleanup" | "init" | "new" | "lint-rules" | "rebase" | "repair" | "test")[], "mcp", "event"];
31
36
  export type SchemaName = (typeof SCHEMA_NAMES)[number];
32
37
  export declare const schemaId: (name: SchemaName) => string;
33
38
  /** A schema as the package ships it. */
package/dist/schemas.js CHANGED
@@ -21,15 +21,20 @@ export const COMMAND_SCHEMAS = {
21
21
  plan: "plan",
22
22
  apply: "apply",
23
23
  new: "new",
24
+ checkpoint: "checkpoint",
24
25
  lint: "lint",
25
26
  "lint --rules": "lint-rules",
26
27
  status: "status",
28
+ report: "report",
27
29
  drift: "drift",
28
30
  rebase: "rebase",
29
31
  repair: "repair",
32
+ revert: "revert",
33
+ cleanup: "cleanup",
34
+ test: "test",
30
35
  };
31
- /** Every schema file: the commands', the definitions they share, and the MCP tool results. */
32
- export const SCHEMA_NAMES = ["common", ...Object.values(COMMAND_SCHEMAS), "mcp"];
36
+ /** Every schema file: the commands', the definitions they share, the MCP tool results, and the webhook event (#61). */
37
+ export const SCHEMA_NAMES = ["common", ...Object.values(COMMAND_SCHEMAS), "mcp", "event"];
33
38
  export const schemaId = (name) => `${SCHEMA_BASE}${name}.schema.json`;
34
39
  /** A schema as the package ships it. */
35
40
  export function readSchema(name) {
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC;AAEhC,qFAAqF;AACrF,MAAM,CAAC,MAAM,WAAW,GAAG,6CAA6C,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC;AAElG,6EAA6E;AAC7E,MAAM,CAAC,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAEjF,wFAAwF;AACxF,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;IACd,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,MAAM;IACZ,cAAc,EAAE,YAAY;IAC5B,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;CACR,CAAC;AAEX,8FAA8F;AAC9F,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,KAAK,CAAU,CAAC;AAI1F,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,IAAgB,EAAU,EAAE,CAAC,GAAG,WAAW,GAAG,IAAI,cAAc,CAAC;AAE1F,wCAAwC;AACxC,MAAM,UAAU,UAAU,CAAC,IAAgB;IACzC,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,UAAU,GAAG,IAAI,cAAc,EAAE,MAAM,CAAC,CAA4B,CAAC;AACzG,CAAC"}
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC;AAEhC,qFAAqF;AACrF,MAAM,CAAC,MAAM,WAAW,GAAG,6CAA6C,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC;AAElG,6EAA6E;AAC7E,MAAM,CAAC,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAEjF,wFAAwF;AACxF,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;IACd,GAAG,EAAE,KAAK;IACV,UAAU,EAAE,YAAY;IACxB,IAAI,EAAE,MAAM;IACZ,cAAc,EAAE,YAAY;IAC5B,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,MAAM;CACJ,CAAC;AAEX,uHAAuH;AACvH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAU,CAAC;AAInG,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,IAAgB,EAAU,EAAE,CAAC,GAAG,WAAW,GAAG,IAAI,cAAc,CAAC;AAE1F,wCAAwC;AACxC,MAAM,UAAU,UAAU,CAAC,IAAgB;IACzC,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,UAAU,GAAG,IAAI,cAAc,EAAE,MAAM,CAAC,CAA4B,CAAC;AACzG,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * A file of DDL, as an ORM prints it (Prisma's `migrate diff --script`,
3
+ * Drizzle's `generate`, Django's `sqlmigrate`, SQLAlchemy's `CreateTable`),
4
+ * read by the sql lexicon's public `.sql` file API and written out as
5
+ * declarations: one TypeScript file of `table`, `index`, `view`, ...
6
+ * templates, the same file `chant import` writes. The build then treats
7
+ * them like any other declaration in `src/`.
8
+ *
9
+ * What is read is what chant reads from a `.sql` file in `src/`
10
+ * (`sqlFileDeclarations`): CREATE statements, on Postgres also GRANT, REVOKE
11
+ * and ALTER DEFAULT PRIVILEGES, with `COMMENT ON`,
12
+ * `ALTER TABLE ... ROW LEVEL SECURITY` and `ALTER TABLE <t> ADD <table
13
+ * constraint>` (the form ORMs print foreign keys in) folded into the object
14
+ * they finish. `BEGIN` and `COMMIT` are skipped. Any other statement is an
15
+ * error naming it: a statement left out would be a schema yodel does not
16
+ * manage, silently.
17
+ *
18
+ * `schema` (a Postgres schema, a ClickHouse database) qualifies the names
19
+ * the DDL leaves unqualified, as an ORM does when the schema comes from its
20
+ * connection.
21
+ */
22
+ import { type SqlDialect } from "../project.js";
23
+ export interface DdlOptions {
24
+ /** Qualifies unqualified names (a Postgres schema, a ClickHouse database). */
25
+ schema?: string | undefined;
26
+ /** Comment lines at the top of the generated file. */
27
+ header?: string | undefined;
28
+ /** Names the DDL in errors. */
29
+ origin: string;
30
+ }
31
+ /** One object the DDL creates. */
32
+ export interface DdlObject {
33
+ /** The export it is declared as. */
34
+ export: string;
35
+ /** Its entity type, `Postgres::Table`. */
36
+ type: string;
37
+ /** `schema.name` (Postgres), `database.name` (ClickHouse). */
38
+ name: string;
39
+ }
40
+ export interface Declarations {
41
+ /** The TypeScript file's content. */
42
+ content: string;
43
+ objects: DdlObject[];
44
+ }
45
+ /** Turns a file of DDL into declarations. */
46
+ export declare function ddlToDeclarations(dialect: SqlDialect, ddl: string, options: DdlOptions): Promise<Declarations>;
47
+ /** The objects a file of DDL creates, without writing declarations. */
48
+ export declare function ddlObjects(dialect: SqlDialect, ddl: string, options: DdlOptions): Promise<DdlObject[]>;
@@ -0,0 +1,53 @@
1
+ /**
2
+ * A file of DDL, as an ORM prints it (Prisma's `migrate diff --script`,
3
+ * Drizzle's `generate`, Django's `sqlmigrate`, SQLAlchemy's `CreateTable`),
4
+ * read by the sql lexicon's public `.sql` file API and written out as
5
+ * declarations: one TypeScript file of `table`, `index`, `view`, ...
6
+ * templates, the same file `chant import` writes. The build then treats
7
+ * them like any other declaration in `src/`.
8
+ *
9
+ * What is read is what chant reads from a `.sql` file in `src/`
10
+ * (`sqlFileDeclarations`): CREATE statements, on Postgres also GRANT, REVOKE
11
+ * and ALTER DEFAULT PRIVILEGES, with `COMMENT ON`,
12
+ * `ALTER TABLE ... ROW LEVEL SECURITY` and `ALTER TABLE <t> ADD <table
13
+ * constraint>` (the form ORMs print foreign keys in) folded into the object
14
+ * they finish. `BEGIN` and `COMMIT` are skipped. Any other statement is an
15
+ * error naming it: a statement left out would be a schema yodel does not
16
+ * manage, silently.
17
+ *
18
+ * `schema` (a Postgres schema, a ClickHouse database) qualifies the names
19
+ * the DDL leaves unqualified, as an ORM does when the schema comes from its
20
+ * connection.
21
+ */
22
+ import { YodelError } from "../project.js";
23
+ /** The lexicon, loaded when a source is read: a project without sources does not pay for it. */
24
+ const lexicon = () => import("@intentius/chant-lexicon-sql");
25
+ const readOptions = (options) => ({ origin: options.origin, ...(options.schema !== undefined ? { schema: options.schema } : {}) });
26
+ /** chant's error for a statement it cannot declare, as yodel's, with what a DDL source holds. */
27
+ async function ddlError(e) {
28
+ if (!(e instanceof (await lexicon()).SqlFileError))
29
+ return e;
30
+ return new YodelError(`${e.message}\nA DDL source holds what chant reads from a .sql file: CREATE statements, and on Postgres the COMMENT ON and ALTER TABLE ... ADD that finish them.`);
31
+ }
32
+ /** Turns a file of DDL into declarations. */
33
+ export async function ddlToDeclarations(dialect, ddl, options) {
34
+ const { sqlFileDeclarations } = await lexicon();
35
+ try {
36
+ const { content, objects } = sqlFileDeclarations(dialect, ddl, { ...readOptions(options), ...(options.header !== undefined ? { header: options.header } : {}) });
37
+ return { content, objects: objects.map((o) => ({ export: o.export, type: o.type, name: o.name })) };
38
+ }
39
+ catch (e) {
40
+ throw await ddlError(e);
41
+ }
42
+ }
43
+ /** The objects a file of DDL creates, without writing declarations. */
44
+ export async function ddlObjects(dialect, ddl, options) {
45
+ const { readSqlFile } = await lexicon();
46
+ try {
47
+ return readSqlFile(dialect, ddl, readOptions(options)).map((o) => ({ export: o.export, type: o.type, name: o.name }));
48
+ }
49
+ catch (e) {
50
+ throw await ddlError(e);
51
+ }
52
+ }
53
+ //# sourceMappingURL=ddl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ddl.js","sourceRoot":"","sources":["../../src/sources/ddl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,UAAU,EAAmB,MAAM,eAAe,CAAC;AA2B5D,gGAAgG;AAChG,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC;AAE7D,MAAM,WAAW,GAAG,CAAC,OAAmB,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AAE/I,iGAAiG;AACjG,KAAK,UAAU,QAAQ,CAAC,CAAU;IAChC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,YAAY,CAAC;QAAE,OAAO,CAAC,CAAC;IAC7D,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,OAAO,qJAAqJ,CAAC,CAAC;AAC3L,CAAC;AAED,6CAA6C;AAC7C,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAmB,EAAE,GAAW,EAAE,OAAmB;IAC3F,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,OAAO,EAAE,CAAC;IAChD,IAAI,CAAC;QACH,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,mBAAmB,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACjK,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;IACtG,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,MAAM,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,uEAAuE;AACvE,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAmB,EAAE,GAAW,EAAE,OAAmB;IACpF,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,OAAO,EAAE,CAAC;IACxC,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACxH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,MAAM,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * DDL sources (#67): schema that an ORM defines, read from the DDL it
3
+ * prints, beside the declarations in `src/`.
4
+ *
5
+ * ```ts
6
+ * // yodel.config.ts
7
+ * export default defineConfig({
8
+ * sources: {
9
+ * prisma: { command: "npx prisma migrate diff --from-empty --to-schema-datamodel prisma/schema.prisma --script", schema: "app" },
10
+ * legacy: { file: "db/legacy.sql" },
11
+ * },
12
+ * });
13
+ * ```
14
+ *
15
+ * Before each build, yodel runs each source's command (or reads its file)
16
+ * in the project directory and writes the DDL out as declarations in
17
+ * `<sourceDir>/<name>.generated.ts`, the file `chant import` would write.
18
+ * The build, and so plan, new, apply and drift, read it like any other
19
+ * declaration; the ApplyOp's own build finds it there too. Commit it: a
20
+ * build that does not run yodel (chant build, an Op run elsewhere) reads
21
+ * the committed file.
22
+ *
23
+ * Each object has one owner: an object a source creates that `src/` (or
24
+ * another source) also declares is an error, naming both.
25
+ */
26
+ import type { BuildOutput } from "../chant/build.js";
27
+ import { YodelError, type Project } from "../project.js";
28
+ import { type DdlObject } from "./ddl.js";
29
+ /** One source, in yodel.config.ts `sources.<name>`. */
30
+ export interface DdlSource {
31
+ /** A shell command, run in the project directory, that prints the DDL on stdout. */
32
+ command?: string;
33
+ /** A file of DDL, relative to the project directory. */
34
+ file?: string;
35
+ /**
36
+ * The Postgres schema (ClickHouse database) for the names the DDL leaves
37
+ * unqualified, as an ORM does when the schema comes from its connection.
38
+ */
39
+ schema?: string;
40
+ }
41
+ /** What one source wrote. */
42
+ export interface SyncedSource {
43
+ name: string;
44
+ /** The generated file, relative to the project directory. */
45
+ path: string;
46
+ objects: DdlObject[];
47
+ }
48
+ /** The generated file a source writes, relative to the project directory. */
49
+ export declare const generatedPath: (project: Project, name: string) => string;
50
+ /** Checks `sources` in yodel.config.ts. */
51
+ export declare function checkSources(value: unknown, where: string): Record<string, DdlSource>;
52
+ /**
53
+ * Writes each source's declarations to its generated file, and returns what
54
+ * each declared. A file whose content is unchanged is not rewritten.
55
+ */
56
+ export declare function syncSources(project: Project, options?: {
57
+ env?: NodeJS.ProcessEnv;
58
+ }): Promise<SyncedSource[]>;
59
+ /**
60
+ * chant's build refuses two declarations exported under one name. When one
61
+ * of them is a source's, that is an object declared twice: say so, naming
62
+ * the source.
63
+ */
64
+ export declare function duplicateExport(buildOutput: string, synced: readonly SyncedSource[]): YodelError | undefined;
65
+ /**
66
+ * Each object declared once: an object a source creates that another export
67
+ * in the build (in `src/`, or another source) also creates is an error.
68
+ */
69
+ export declare function checkOwnership(output: BuildOutput, synced: readonly SyncedSource[]): Promise<void>;