@intentius/sql-yodeler 0.2.0 → 0.3.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 (194) hide show
  1. package/README.md +3 -3
  2. package/dist/chant/build.js +7 -0
  3. package/dist/chant/build.js.map +1 -1
  4. package/dist/ci/render.d.ts +289 -0
  5. package/dist/ci/render.js +688 -0
  6. package/dist/ci/render.js.map +1 -0
  7. package/dist/ci/replay.d.ts +17 -0
  8. package/dist/ci/replay.js +69 -0
  9. package/dist/ci/replay.js.map +1 -0
  10. package/dist/commands/apply.d.ts +113 -0
  11. package/dist/commands/apply.js +228 -21
  12. package/dist/commands/apply.js.map +1 -1
  13. package/dist/commands/approve.js +44 -0
  14. package/dist/commands/approve.js.map +1 -1
  15. package/dist/commands/checkpoint.d.ts +3 -0
  16. package/dist/commands/checkpoint.js +78 -0
  17. package/dist/commands/checkpoint.js.map +1 -0
  18. package/dist/commands/ci.d.ts +3 -0
  19. package/dist/commands/ci.js +118 -0
  20. package/dist/commands/ci.js.map +1 -0
  21. package/dist/commands/docs.d.ts +11 -0
  22. package/dist/commands/docs.js +108 -0
  23. package/dist/commands/docs.js.map +1 -0
  24. package/dist/commands/drift.d.ts +13 -1
  25. package/dist/commands/drift.js +18 -2
  26. package/dist/commands/drift.js.map +1 -1
  27. package/dist/commands/index.js +10 -0
  28. package/dist/commands/index.js.map +1 -1
  29. package/dist/commands/init.js +1 -1
  30. package/dist/commands/init.js.map +1 -1
  31. package/dist/commands/lint.js +11 -3
  32. package/dist/commands/lint.js.map +1 -1
  33. package/dist/commands/override.js +48 -16
  34. package/dist/commands/override.js.map +1 -1
  35. package/dist/commands/plan.js +5 -1
  36. package/dist/commands/plan.js.map +1 -1
  37. package/dist/commands/report.d.ts +13 -0
  38. package/dist/commands/report.js +121 -0
  39. package/dist/commands/report.js.map +1 -0
  40. package/dist/commands/revert.d.ts +20 -0
  41. package/dist/commands/revert.js +246 -0
  42. package/dist/commands/revert.js.map +1 -0
  43. package/dist/commands/status.js +32 -5
  44. package/dist/commands/status.js.map +1 -1
  45. package/dist/config/base.d.ts +69 -0
  46. package/dist/config/base.js +121 -0
  47. package/dist/config/base.js.map +1 -0
  48. package/dist/config/define.d.ts +123 -1
  49. package/dist/config/define.js +2 -0
  50. package/dist/config/define.js.map +1 -1
  51. package/dist/config/index.d.ts +2 -0
  52. package/dist/config/index.js +2 -0
  53. package/dist/config/index.js.map +1 -1
  54. package/dist/config/load.d.ts +1 -1
  55. package/dist/config/load.js +90 -5
  56. package/dist/config/load.js.map +1 -1
  57. package/dist/config/settings.d.ts +4 -1
  58. package/dist/config/settings.js +8 -2
  59. package/dist/config/settings.js.map +1 -1
  60. package/dist/exit.js +1 -1
  61. package/dist/exit.js.map +1 -1
  62. package/dist/history/postgres/ddl.d.ts +18 -0
  63. package/dist/history/postgres/ddl.js +27 -2
  64. package/dist/history/postgres/ddl.js.map +1 -1
  65. package/dist/history/postgres/store.d.ts +2 -0
  66. package/dist/history/postgres/store.js +7 -1
  67. package/dist/history/postgres/store.js.map +1 -1
  68. package/dist/history/rows.d.ts +16 -3
  69. package/dist/history/rows.js +30 -1
  70. package/dist/history/rows.js.map +1 -1
  71. package/dist/history/store.d.ts +2 -0
  72. package/dist/history/store.js +2 -2
  73. package/dist/history/store.js.map +1 -1
  74. package/dist/index.d.ts +4 -1
  75. package/dist/index.js +1 -0
  76. package/dist/index.js.map +1 -1
  77. package/dist/lint/check.js +17 -2
  78. package/dist/lint/check.js.map +1 -1
  79. package/dist/lint/report.js +1 -1
  80. package/dist/lint/report.js.map +1 -1
  81. package/dist/lint/routines.d.ts +26 -0
  82. package/dist/lint/routines.js +65 -0
  83. package/dist/lint/routines.js.map +1 -0
  84. package/dist/lint/rules.d.ts +16 -4
  85. package/dist/lint/rules.js +9 -4
  86. package/dist/lint/rules.js.map +1 -1
  87. package/dist/mcp/tools.d.ts +1 -1
  88. package/dist/mcp/tools.js +1 -1
  89. package/dist/mcp/tools.js.map +1 -1
  90. package/dist/migrations/checkpoint.d.ts +45 -0
  91. package/dist/migrations/checkpoint.js +110 -0
  92. package/dist/migrations/checkpoint.js.map +1 -0
  93. package/dist/migrations/create.js +2 -0
  94. package/dist/migrations/create.js.map +1 -1
  95. package/dist/migrations/document.d.ts +10 -0
  96. package/dist/migrations/document.js +1 -0
  97. package/dist/migrations/document.js.map +1 -1
  98. package/dist/migrations/index.d.ts +2 -0
  99. package/dist/migrations/index.js +2 -0
  100. package/dist/migrations/index.js.map +1 -1
  101. package/dist/migrations/routines.d.ts +31 -0
  102. package/dist/migrations/routines.js +55 -0
  103. package/dist/migrations/routines.js.map +1 -0
  104. package/dist/notify/index.d.ts +124 -0
  105. package/dist/notify/index.js +210 -0
  106. package/dist/notify/index.js.map +1 -0
  107. package/dist/notify/verify.d.ts +53 -0
  108. package/dist/notify/verify.js +71 -0
  109. package/dist/notify/verify.js.map +1 -0
  110. package/dist/pr/model.d.ts +3 -0
  111. package/dist/pr/model.js +16 -2
  112. package/dist/pr/model.js.map +1 -1
  113. package/dist/pr/render.js +27 -1
  114. package/dist/pr/render.js.map +1 -1
  115. package/dist/project.d.ts +19 -2
  116. package/dist/project.js +33 -1
  117. package/dist/project.js.map +1 -1
  118. package/dist/replay/replay.d.ts +9 -1
  119. package/dist/replay/replay.js +62 -31
  120. package/dist/replay/replay.js.map +1 -1
  121. package/dist/replay/report.js +1 -1
  122. package/dist/replay/report.js.map +1 -1
  123. package/dist/report/audit.d.ts +138 -0
  124. package/dist/report/audit.js +202 -0
  125. package/dist/report/audit.js.map +1 -0
  126. package/dist/report/jsonl.d.ts +21 -0
  127. package/dist/report/jsonl.js +52 -0
  128. package/dist/report/jsonl.js.map +1 -0
  129. package/dist/report/model.d.ts +68 -0
  130. package/dist/report/model.js +127 -0
  131. package/dist/report/model.js.map +1 -0
  132. package/dist/report/render.d.ts +18 -0
  133. package/dist/report/render.js +127 -0
  134. package/dist/report/render.js.map +1 -0
  135. package/dist/schema-docs/render.d.ts +49 -0
  136. package/dist/schema-docs/render.js +359 -0
  137. package/dist/schema-docs/render.js.map +1 -0
  138. package/dist/schemas.d.ts +5 -2
  139. package/dist/schemas.js +5 -2
  140. package/dist/schemas.js.map +1 -1
  141. package/dist/sources/ddl.d.ts +53 -0
  142. package/dist/sources/ddl.js +347 -0
  143. package/dist/sources/ddl.js.map +1 -0
  144. package/dist/sources/index.d.ts +69 -0
  145. package/dist/sources/index.js +170 -0
  146. package/dist/sources/index.js.map +1 -0
  147. package/dist/steps/postgres-migration.d.ts +35 -25
  148. package/dist/steps/postgres-migration.js +42 -29
  149. package/dist/steps/postgres-migration.js.map +1 -1
  150. package/dist/tenants/index.d.ts +40 -0
  151. package/dist/tenants/index.js +122 -0
  152. package/dist/tenants/index.js.map +1 -0
  153. package/dist/tenants/target.d.ts +23 -0
  154. package/dist/tenants/target.js +29 -0
  155. package/dist/tenants/target.js.map +1 -0
  156. package/dist/versioned/engine.d.ts +6 -0
  157. package/dist/versioned/engine.js +12 -2
  158. package/dist/versioned/engine.js.map +1 -1
  159. package/dist/versioned/index.d.ts +1 -0
  160. package/dist/versioned/index.js +1 -0
  161. package/dist/versioned/index.js.map +1 -1
  162. package/dist/versioned/op.d.ts +6 -1
  163. package/dist/versioned/op.js +7 -2
  164. package/dist/versioned/op.js.map +1 -1
  165. package/dist/versioned/policy.d.ts +33 -2
  166. package/dist/versioned/policy.js +59 -8
  167. package/dist/versioned/policy.js.map +1 -1
  168. package/dist/versioned/report.js +9 -0
  169. package/dist/versioned/report.js.map +1 -1
  170. package/dist/versioned/revert.d.ts +128 -0
  171. package/dist/versioned/revert.js +251 -0
  172. package/dist/versioned/revert.js.map +1 -0
  173. package/dist/versioned/state.d.ts +25 -0
  174. package/dist/versioned/state.js +36 -3
  175. package/dist/versioned/state.js.map +1 -1
  176. package/dist/waves/index.d.ts +179 -0
  177. package/dist/waves/index.js +268 -0
  178. package/dist/waves/index.js.map +1 -0
  179. package/dist/waves/promotion.d.ts +56 -0
  180. package/dist/waves/promotion.js +108 -0
  181. package/dist/waves/promotion.js.map +1 -0
  182. package/dist/waves/record.d.ts +24 -0
  183. package/dist/waves/record.js +20 -0
  184. package/dist/waves/record.js.map +1 -0
  185. package/package.json +11 -7
  186. package/schemas/apply.schema.json +162 -3
  187. package/schemas/checkpoint.schema.json +19 -0
  188. package/schemas/drift.schema.json +26 -1
  189. package/schemas/event.schema.json +36 -0
  190. package/schemas/lint.schema.json +4 -0
  191. package/schemas/plan.schema.json +118 -0
  192. package/schemas/report.schema.json +114 -0
  193. package/schemas/revert.schema.json +69 -0
  194. package/schemas/status.schema.json +64 -3
@@ -0,0 +1,127 @@
1
+ /**
2
+ * The report as text, and as a self-contained HTML page (the run view): one
3
+ * row per migration (each merge that added one), one column per
4
+ * environment, in the order they were asked for, so a change's progress from
5
+ * dev to prod reads left to right. Then the gaps and the audit log.
6
+ */
7
+ const short = (d) => (d ? (d.length > 24 ? `${d.slice(0, 24)}...` : d) : "");
8
+ const day = (t) => (t ? t.slice(0, 16).replace("T", " ") : "");
9
+ function cell(m) {
10
+ if (!m)
11
+ return "-";
12
+ if (m.state === "applied")
13
+ return `applied ${day(m.at)}`;
14
+ return m.state;
15
+ }
16
+ export function renderReportText(r, extra = {}) {
17
+ const lines = [`Report for ${r.project} (${r.dialect}, ${String(r.environments.length)} environment${r.environments.length === 1 ? "" : "s"})`, ""];
18
+ const head = ["migration", ...r.environments.map((e) => e.name)];
19
+ const rows = r.migrations.map((id) => [id, ...r.environments.map((e) => (e.error ? "unread" : cell(e.migrations.find((m) => m.id === id))))]);
20
+ const widths = head.map((h, i) => Math.max(h.length, ...rows.map((row) => (row[i] ?? "").length)));
21
+ const fmt = (row) => row.map((c, i) => c.padEnd(widths[i] ?? 0)).join(" ").trimEnd();
22
+ lines.push(fmt(head), ...rows.map(fmt));
23
+ if (r.migrations.length === 0)
24
+ lines.push("(no migrations)");
25
+ for (const e of r.environments) {
26
+ if (e.error)
27
+ lines.push("", `${e.name}: ${e.error}`);
28
+ for (const n of e.notes)
29
+ lines.push("", `${e.name}: ${n}`);
30
+ }
31
+ lines.push("", r.gaps.length === 0 ? "Gaps: none. Every applied migration has its approval on the ledger, and no history row is missing." : `Gaps (${String(r.gaps.length)}):`);
32
+ for (const g of r.gaps)
33
+ lines.push(` ${g.environment}: ${g.detail}`);
34
+ if (extra.check) {
35
+ const c = extra.check;
36
+ if (c.missing.length === 0)
37
+ lines.push("", `${c.file}: every entry is still in the sources${c.appended > 0 ? `; ${String(c.appended)} new entr${c.appended === 1 ? "y" : "ies"} appended` : ""}.`);
38
+ else
39
+ lines.push("", `${c.file}: ${String(c.missing.length)} entr${c.missing.length === 1 ? "y is" : "ies are"} no longer in the history or the ledger:`, ...c.missing.map((m) => ` ${m}`));
40
+ }
41
+ lines.push("", `Audit (${String(r.audit.length)} entries):`);
42
+ for (const a of r.audit)
43
+ lines.push(` ${auditLine(a)}`);
44
+ return `${lines.join("\n")}\n`;
45
+ }
46
+ export function auditLine(a) {
47
+ return [a.at, a.environment, a.kind, a.migration ?? "", a.by ? `by ${a.by}` : "", a.digest ? short(a.digest) : "", a.detail ? `(${a.detail})` : ""].filter(Boolean).join(" ");
48
+ }
49
+ const esc = (s) => s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
50
+ /** The run view: a page with no external resources, safe to upload as a CI artifact and open from disk. */
51
+ export function renderReportHtml(r) {
52
+ const th = r.environments.map((e) => `<th scope="col">${esc(e.name)}${e.op ? `<br><small>${esc(e.op.name)}</small>` : ""}</th>`).join("");
53
+ const body = r.migrations
54
+ .map((id) => {
55
+ const tds = r.environments
56
+ .map((e) => {
57
+ if (e.error)
58
+ return `<td class="unread">unread</td>`;
59
+ const m = e.migrations.find((x) => x.id === id);
60
+ if (!m)
61
+ return `<td class="none">-</td>`;
62
+ const lines = [m.state];
63
+ if (m.at)
64
+ lines.push(day(m.at));
65
+ if (m.by)
66
+ lines.push(`by ${m.by}`);
67
+ if (m.approvedBy)
68
+ lines.push(`approved by ${m.approvedBy}`);
69
+ const title = m.digest ? ` title="${esc(m.digest)}"` : "";
70
+ return `<td class="${m.state}"${title}>${lines.map((l, i) => (i === 0 ? `<b>${esc(l)}</b>` : `<small>${esc(l)}</small>`)).join("<br>")}</td>`;
71
+ })
72
+ .join("");
73
+ return `<tr><th scope="row"><code>${esc(id)}</code></th>${tds}</tr>`;
74
+ })
75
+ .join("\n");
76
+ const notes = r.environments.flatMap((e) => [...(e.error ? [`${e.name}: ${e.error}`] : []), ...e.notes.map((n) => `${e.name}: ${n}`)]);
77
+ const gaps = r.gaps.length === 0 ? `<p class="ok">No gaps: every applied migration has its approval on the ledger, and no history row is missing.</p>` : `<ul class="gaps">${r.gaps.map((g) => `<li><b>${esc(g.environment)}</b> ${esc(g.detail)}</li>`).join("")}</ul>`;
78
+ const audit = r.audit
79
+ .map((a) => `<tr class="k-${a.kind}"><td>${esc(day(a.at))}</td><td>${esc(a.environment)}</td><td>${esc(a.kind)}</td><td><code>${esc(a.migration ?? "")}</code></td><td>${esc(a.by ?? "")}</td><td title="${esc(a.digest ?? "")}"><code>${esc(short(a.digest))}</code></td><td>${esc(a.detail ?? "")}</td></tr>`)
80
+ .join("\n");
81
+ return `<!doctype html>
82
+ <html lang="en">
83
+ <head>
84
+ <meta charset="utf-8">
85
+ <meta name="viewport" content="width=device-width, initial-scale=1">
86
+ <title>Migrations report</title>
87
+ <style>
88
+ :root { --bg: #fff; --fg: #1d1d1f; --muted: #6e6e73; --line: #d2d2d7; --applied: #e3f4e8; --pending: #fff6db; --failed: #fde4e1; --started: #fde4e1; }
89
+ @media (prefers-color-scheme: dark) { :root { --bg: #161618; --fg: #ececf0; --muted: #a1a1a6; --line: #3a3a3c; --applied: #1f3a29; --pending: #3d3317; --failed: #4a2420; --started: #4a2420; } }
90
+ body { background: var(--bg); color: var(--fg); font: 14px/1.45 system-ui, sans-serif; margin: 0; padding: 24px 16px; }
91
+ main { max-width: 1200px; margin: 0 auto; }
92
+ h1 { font-size: 20px; margin: 0 0 4px; } h2 { font-size: 16px; margin: 28px 0 8px; }
93
+ .meta, small { color: var(--muted); }
94
+ .scroll { overflow-x: auto; }
95
+ table { border-collapse: collapse; width: 100%; }
96
+ th, td { border-bottom: 1px solid var(--line); padding: 6px 8px; text-align: left; vertical-align: top; }
97
+ td.applied { background: var(--applied); } td.pending { background: var(--pending); } td.failed, td.started { background: var(--failed); }
98
+ code { font: 12px ui-monospace, monospace; }
99
+ .gaps li { color: #c0392b; } .ok { color: var(--muted); }
100
+ </style>
101
+ </head>
102
+ <body>
103
+ <main>
104
+ <h1>Migrations report</h1>
105
+ <p class="meta">${esc(r.project)} (${esc(r.dialect)}), generated ${esc(r.generatedAt)}. One row per migration, one column per environment.</p>
106
+ ${notes.length > 0 ? `<ul>${notes.map((n) => `<li>${esc(n)}</li>`).join("")}</ul>` : ""}
107
+ <div class="scroll"><table>
108
+ <thead><tr><th scope="col">migration</th>${th}</tr></thead>
109
+ <tbody>
110
+ ${body}
111
+ </tbody>
112
+ </table></div>
113
+ <h2>Gaps</h2>
114
+ ${gaps}
115
+ <h2>Audit log (${String(r.audit.length)} entries)</h2>
116
+ <div class="scroll"><table>
117
+ <thead><tr><th>when</th><th>environment</th><th>what</th><th>migration</th><th>by</th><th>digest</th><th>detail</th></tr></thead>
118
+ <tbody>
119
+ ${audit}
120
+ </tbody>
121
+ </table></div>
122
+ </main>
123
+ </body>
124
+ </html>
125
+ `;
126
+ }
127
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/report/render.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
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
+ import type { BuildOutput } from "../chant/build.js";
18
+ import type { MigrationStep } from "../migrations/index.js";
19
+ /** A migration as far as the reference needs it: its id and its steps. */
20
+ export interface DocsMigration {
21
+ id: string;
22
+ steps: readonly MigrationStep[];
23
+ }
24
+ export interface DocsInput {
25
+ /** The page's title, e.g. the project's name. */
26
+ title: string;
27
+ output: BuildOutput;
28
+ /** Where the schema came from, said under the title: "the declared schema (chant build)", "migration <id>". */
29
+ source: string;
30
+ /** The migrations directory's chain, oldest first, for each object's history. */
31
+ migrations?: readonly DocsMigration[];
32
+ }
33
+ /** One relation between two objects, by export name. */
34
+ export interface Relation {
35
+ from: string;
36
+ to: string;
37
+ kind: "foreign key" | "reads" | "writes to" | "distributes";
38
+ label: string;
39
+ /** Foreign keys only: the referencing columns may be null. */
40
+ optional?: boolean;
41
+ }
42
+ /** Every relation between the objects the ERD draws, in a stable order. */
43
+ export declare function relations(output: BuildOutput): Relation[];
44
+ /** The Mermaid `erDiagram`: one entity per table or view, one line per relation. */
45
+ export declare function erdMermaid(output: BuildOutput): string;
46
+ /** The ERD as Markdown, which GitHub, GitLab and Forgejo render. */
47
+ export declare function erdMarkdown(input: DocsInput): string;
48
+ /** The self-contained HTML reference. */
49
+ export declare function schemaHtml(input: DocsInput): string;
@@ -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,18 @@ 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";
28
31
  };
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"];
32
+ /** Every schema file: the commands', the definitions they share, the MCP tool results, and the webhook event (#61). */
33
+ export declare const SCHEMA_NAMES: readonly ["common", ...("checkpoint" | "drift" | "apply" | "plan" | "status" | "lint" | "revert" | "report" | "init" | "new" | "lint-rules" | "rebase" | "repair")[], "mcp", "event"];
31
34
  export type SchemaName = (typeof SCHEMA_NAMES)[number];
32
35
  export declare const schemaId: (name: SchemaName) => string;
33
36
  /** A schema as the package ships it. */
package/dist/schemas.js CHANGED
@@ -21,15 +21,18 @@ 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",
30
33
  };
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"];
34
+ /** Every schema file: the commands', the definitions they share, the MCP tool results, and the webhook event (#61). */
35
+ export const SCHEMA_NAMES = ["common", ...Object.values(COMMAND_SCHEMAS), "mcp", "event"];
33
36
  export const schemaId = (name) => `${SCHEMA_BASE}${name}.schema.json`;
34
37
  /** A schema as the package ships it. */
35
38
  export function readSchema(name) {