@intentius/sql-yodeler 0.1.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.
- package/README.md +28 -26
- package/dist/bin.js +15 -0
- package/dist/bin.js.map +1 -1
- package/dist/chant/apply.d.ts +9 -1
- package/dist/chant/apply.js +13 -1
- package/dist/chant/apply.js.map +1 -1
- package/dist/chant/build.js +7 -0
- package/dist/chant/build.js.map +1 -1
- package/dist/chant/drift.d.ts +69 -1
- package/dist/chant/drift.js +152 -5
- package/dist/chant/drift.js.map +1 -1
- package/dist/chant/runnable.d.ts +19 -0
- package/dist/chant/runnable.js +47 -0
- package/dist/chant/runnable.js.map +1 -0
- package/dist/ci/render.d.ts +289 -0
- package/dist/ci/render.js +688 -0
- package/dist/ci/render.js.map +1 -0
- package/dist/ci/replay.d.ts +17 -0
- package/dist/ci/replay.js +69 -0
- package/dist/ci/replay.js.map +1 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.js +40 -0
- package/dist/cli.js.map +1 -1
- package/dist/command.d.ts +6 -0
- package/dist/command.js.map +1 -1
- package/dist/commands/apply.d.ts +113 -0
- package/dist/commands/apply.js +376 -49
- package/dist/commands/apply.js.map +1 -1
- package/dist/commands/approve.d.ts +5 -0
- package/dist/commands/approve.js +155 -0
- package/dist/commands/approve.js.map +1 -0
- package/dist/commands/checkpoint.d.ts +3 -0
- package/dist/commands/checkpoint.js +78 -0
- package/dist/commands/checkpoint.js.map +1 -0
- package/dist/commands/ci.d.ts +3 -0
- package/dist/commands/ci.js +118 -0
- package/dist/commands/ci.js.map +1 -0
- package/dist/commands/docs.d.ts +11 -0
- package/dist/commands/docs.js +108 -0
- package/dist/commands/docs.js.map +1 -0
- package/dist/commands/drift.d.ts +23 -0
- package/dist/commands/drift.js +263 -18
- package/dist/commands/drift.js.map +1 -1
- package/dist/commands/index.js +16 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.js +15 -11
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/lint.js +25 -8
- package/dist/commands/lint.js.map +1 -1
- package/dist/commands/mcp.d.ts +3 -0
- package/dist/commands/mcp.js +50 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/new.d.ts +2 -0
- package/dist/commands/new.js +134 -10
- package/dist/commands/new.js.map +1 -1
- package/dist/commands/override.d.ts +3 -0
- package/dist/commands/override.js +150 -0
- package/dist/commands/override.js.map +1 -0
- package/dist/commands/plan.js +43 -27
- package/dist/commands/plan.js.map +1 -1
- package/dist/commands/repair.d.ts +11 -0
- package/dist/commands/repair.js +15 -7
- package/dist/commands/repair.js.map +1 -1
- package/dist/commands/report.d.ts +13 -0
- package/dist/commands/report.js +121 -0
- package/dist/commands/report.js.map +1 -0
- package/dist/commands/revert.d.ts +20 -0
- package/dist/commands/revert.js +246 -0
- package/dist/commands/revert.js.map +1 -0
- package/dist/commands/status.js +44 -17
- package/dist/commands/status.js.map +1 -1
- package/dist/config/base.d.ts +69 -0
- package/dist/config/base.js +121 -0
- package/dist/config/base.js.map +1 -0
- package/dist/config/define.d.ts +223 -3
- package/dist/config/define.js +3 -1
- package/dist/config/define.js.map +1 -1
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.js +2 -0
- package/dist/config/index.js.map +1 -1
- package/dist/config/load.d.ts +1 -1
- package/dist/config/load.js +150 -5
- package/dist/config/load.js.map +1 -1
- package/dist/config/settings.d.ts +18 -2
- package/dist/config/settings.js +40 -6
- package/dist/config/settings.js.map +1 -1
- package/dist/env-args.d.ts +6 -0
- package/dist/env-args.js +31 -1
- package/dist/env-args.js.map +1 -1
- package/dist/exit.d.ts +20 -0
- package/dist/exit.js +28 -0
- package/dist/exit.js.map +1 -0
- package/dist/history/client.d.ts +8 -0
- package/dist/history/client.js +24 -1
- package/dist/history/client.js.map +1 -1
- package/dist/history/lock.d.ts +5 -1
- package/dist/history/lock.js +8 -2
- package/dist/history/lock.js.map +1 -1
- package/dist/history/postgres/ddl.d.ts +18 -0
- package/dist/history/postgres/ddl.js +27 -2
- package/dist/history/postgres/ddl.js.map +1 -1
- package/dist/history/postgres/store.d.ts +2 -0
- package/dist/history/postgres/store.js +7 -1
- package/dist/history/postgres/store.js.map +1 -1
- package/dist/history/rows.d.ts +16 -3
- package/dist/history/rows.js +30 -1
- package/dist/history/rows.js.map +1 -1
- package/dist/history/store.d.ts +2 -0
- package/dist/history/store.js +2 -2
- package/dist/history/store.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/init/adopt.js +8 -3
- package/dist/init/adopt.js.map +1 -1
- package/dist/init/live.d.ts +11 -0
- package/dist/init/live.js +25 -2
- package/dist/init/live.js.map +1 -1
- package/dist/lint/check.d.ts +8 -1
- package/dist/lint/check.js +38 -4
- package/dist/lint/check.js.map +1 -1
- package/dist/lint/report.js +1 -1
- package/dist/lint/report.js.map +1 -1
- package/dist/lint/routines.d.ts +26 -0
- package/dist/lint/routines.js +65 -0
- package/dist/lint/routines.js.map +1 -0
- package/dist/lint/rules.d.ts +16 -4
- package/dist/lint/rules.js +9 -4
- package/dist/lint/rules.js.map +1 -1
- package/dist/mcp/server.d.ts +40 -0
- package/dist/mcp/server.js +106 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +72 -0
- package/dist/mcp/tools.js +178 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/migrations/checkpoint.d.ts +45 -0
- package/dist/migrations/checkpoint.js +110 -0
- package/dist/migrations/checkpoint.js.map +1 -0
- package/dist/migrations/checks.d.ts +28 -0
- package/dist/migrations/checks.js +97 -0
- package/dist/migrations/checks.js.map +1 -0
- package/dist/migrations/create.d.ts +3 -1
- package/dist/migrations/create.js +3 -0
- package/dist/migrations/create.js.map +1 -1
- package/dist/migrations/directory.js +4 -0
- package/dist/migrations/directory.js.map +1 -1
- package/dist/migrations/document.d.ts +33 -0
- package/dist/migrations/document.js +2 -0
- package/dist/migrations/document.js.map +1 -1
- package/dist/migrations/index.d.ts +3 -0
- package/dist/migrations/index.js +3 -0
- package/dist/migrations/index.js.map +1 -1
- package/dist/migrations/routines.d.ts +31 -0
- package/dist/migrations/routines.js +55 -0
- package/dist/migrations/routines.js.map +1 -0
- package/dist/notify/index.d.ts +124 -0
- package/dist/notify/index.js +210 -0
- package/dist/notify/index.js.map +1 -0
- package/dist/notify/verify.d.ts +53 -0
- package/dist/notify/verify.js +71 -0
- package/dist/notify/verify.js.map +1 -0
- package/dist/pr/forge.d.ts +4 -0
- package/dist/pr/forge.js +21 -7
- package/dist/pr/forge.js.map +1 -1
- package/dist/pr/issue.d.ts +68 -0
- package/dist/pr/issue.js +107 -0
- package/dist/pr/issue.js.map +1 -0
- package/dist/pr/model.d.ts +12 -1
- package/dist/pr/model.js +44 -6
- package/dist/pr/model.js.map +1 -1
- package/dist/pr/render.d.ts +3 -1
- package/dist/pr/render.js +63 -4
- package/dist/pr/render.js.map +1 -1
- package/dist/project.d.ts +19 -2
- package/dist/project.js +33 -1
- package/dist/project.js.map +1 -1
- package/dist/replay/index.d.ts +3 -0
- package/dist/replay/index.js +3 -0
- package/dist/replay/index.js.map +1 -1
- package/dist/replay/replay.d.ts +9 -1
- package/dist/replay/replay.js +63 -32
- package/dist/replay/replay.js.map +1 -1
- package/dist/replay/report.js +1 -1
- package/dist/replay/report.js.map +1 -1
- package/dist/replay/shared.d.ts +28 -0
- package/dist/replay/shared.js +77 -0
- package/dist/replay/shared.js.map +1 -0
- package/dist/report/audit.d.ts +138 -0
- package/dist/report/audit.js +202 -0
- package/dist/report/audit.js.map +1 -0
- package/dist/report/jsonl.d.ts +21 -0
- package/dist/report/jsonl.js +52 -0
- package/dist/report/jsonl.js.map +1 -0
- package/dist/report/model.d.ts +68 -0
- package/dist/report/model.js +127 -0
- package/dist/report/model.js.map +1 -0
- package/dist/report/render.d.ts +18 -0
- package/dist/report/render.js +127 -0
- package/dist/report/render.js.map +1 -0
- package/dist/schema-docs/render.d.ts +49 -0
- package/dist/schema-docs/render.js +359 -0
- package/dist/schema-docs/render.js.map +1 -0
- package/dist/schemas.d.ts +37 -0
- package/dist/schemas.js +41 -0
- package/dist/schemas.js.map +1 -0
- package/dist/server.d.ts +40 -0
- package/dist/server.js +87 -0
- package/dist/server.js.map +1 -0
- package/dist/sources/ddl.d.ts +53 -0
- package/dist/sources/ddl.js +347 -0
- package/dist/sources/ddl.js.map +1 -0
- package/dist/sources/index.d.ts +69 -0
- package/dist/sources/index.js +170 -0
- package/dist/sources/index.js.map +1 -0
- package/dist/steps/backfill.d.ts +21 -17
- package/dist/steps/backfill.js +20 -20
- package/dist/steps/backfill.js.map +1 -1
- package/dist/steps/index.d.ts +2 -2
- package/dist/steps/index.js +3 -3
- package/dist/steps/index.js.map +1 -1
- package/dist/steps/postgres-migration.d.ts +35 -25
- package/dist/steps/postgres-migration.js +42 -29
- package/dist/steps/postgres-migration.js.map +1 -1
- package/dist/steps/rebuild.d.ts +15 -15
- package/dist/steps/rebuild.js +17 -24
- package/dist/steps/rebuild.js.map +1 -1
- package/dist/tenants/index.d.ts +40 -0
- package/dist/tenants/index.js +122 -0
- package/dist/tenants/index.js.map +1 -0
- package/dist/tenants/target.d.ts +23 -0
- package/dist/tenants/target.js +29 -0
- package/dist/tenants/target.js.map +1 -0
- package/dist/versioned/checks.d.ts +29 -0
- package/dist/versioned/checks.js +54 -0
- package/dist/versioned/checks.js.map +1 -0
- package/dist/versioned/clickhouse.js +8 -0
- package/dist/versioned/clickhouse.js.map +1 -1
- package/dist/versioned/driver.d.ts +10 -0
- package/dist/versioned/engine.d.ts +61 -1
- package/dist/versioned/engine.js +109 -6
- package/dist/versioned/engine.js.map +1 -1
- package/dist/versioned/explain.js +7 -2
- package/dist/versioned/explain.js.map +1 -1
- package/dist/versioned/index.d.ts +10 -0
- package/dist/versioned/index.js +25 -1
- package/dist/versioned/index.js.map +1 -1
- package/dist/versioned/op.d.ts +16 -1
- package/dist/versioned/op.js +43 -6
- package/dist/versioned/op.js.map +1 -1
- package/dist/versioned/policy.d.ts +98 -0
- package/dist/versioned/policy.js +212 -0
- package/dist/versioned/policy.js.map +1 -0
- package/dist/versioned/postgres/driver.d.ts +3 -1
- package/dist/versioned/postgres/driver.js +30 -3
- package/dist/versioned/postgres/driver.js.map +1 -1
- package/dist/versioned/postgres/waits.d.ts +46 -0
- package/dist/versioned/postgres/waits.js +78 -0
- package/dist/versioned/postgres/waits.js.map +1 -0
- package/dist/versioned/report.d.ts +3 -0
- package/dist/versioned/report.js +13 -1
- package/dist/versioned/report.js.map +1 -1
- package/dist/versioned/revert.d.ts +128 -0
- package/dist/versioned/revert.js +251 -0
- package/dist/versioned/revert.js.map +1 -0
- package/dist/versioned/stand-down.d.ts +30 -0
- package/dist/versioned/stand-down.js +56 -0
- package/dist/versioned/stand-down.js.map +1 -0
- package/dist/versioned/state.d.ts +25 -0
- package/dist/versioned/state.js +36 -3
- package/dist/versioned/state.js.map +1 -1
- package/dist/waves/index.d.ts +179 -0
- package/dist/waves/index.js +268 -0
- package/dist/waves/index.js.map +1 -0
- package/dist/waves/promotion.d.ts +56 -0
- package/dist/waves/promotion.js +108 -0
- package/dist/waves/promotion.js.map +1 -0
- package/dist/waves/record.d.ts +24 -0
- package/dist/waves/record.js +20 -0
- package/dist/waves/record.js.map +1 -0
- package/package.json +22 -8
- package/schemas/apply.schema.json +428 -0
- package/schemas/checkpoint.schema.json +19 -0
- package/schemas/common.schema.json +213 -0
- package/schemas/drift.schema.json +61 -0
- package/schemas/event.schema.json +36 -0
- package/schemas/init.schema.json +31 -0
- package/schemas/lint-rules.schema.json +54 -0
- package/schemas/lint.schema.json +294 -0
- package/schemas/mcp.schema.json +70 -0
- package/schemas/new.schema.json +71 -0
- package/schemas/plan.schema.json +489 -0
- package/schemas/rebase.schema.json +54 -0
- package/schemas/repair.schema.json +20 -0
- package/schemas/report.schema.json +114 -0
- package/schemas/revert.schema.json +69 -0
- package/schemas/status.schema.json +371 -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, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
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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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The JSON Schemas of `yodel <command> --json` and of `yodel mcp`'s tool
|
|
3
|
+
* results. They are written beside the code, in `schemas/` at the package
|
|
4
|
+
* root, and ship in the package; the docs site serves them at their `$id`.
|
|
5
|
+
* test/schemas.test.ts validates each command's output against its schema.
|
|
6
|
+
*
|
|
7
|
+
* Within a version a schema only gains fields, and a reader ignores fields it
|
|
8
|
+
* does not know. Removing a field or changing what one means is a new version:
|
|
9
|
+
* a new `v<N>/` in every `$id`, and {@link SCHEMA_VERSION} moves with it.
|
|
10
|
+
*/
|
|
11
|
+
export declare const SCHEMA_VERSION = 1;
|
|
12
|
+
/** Where the schemas are published; each `$id` is this plus `<name>.schema.json`. */
|
|
13
|
+
export declare const SCHEMA_BASE: string;
|
|
14
|
+
/** `schemas/` in the package: src/ and dist/ are both one level below it. */
|
|
15
|
+
export declare const schemasDir: string;
|
|
16
|
+
/** The schema of each command's `--json` output, by the command line that prints it. */
|
|
17
|
+
export declare const COMMAND_SCHEMAS: {
|
|
18
|
+
readonly init: "init";
|
|
19
|
+
readonly plan: "plan";
|
|
20
|
+
readonly apply: "apply";
|
|
21
|
+
readonly new: "new";
|
|
22
|
+
readonly checkpoint: "checkpoint";
|
|
23
|
+
readonly lint: "lint";
|
|
24
|
+
readonly "lint --rules": "lint-rules";
|
|
25
|
+
readonly status: "status";
|
|
26
|
+
readonly report: "report";
|
|
27
|
+
readonly drift: "drift";
|
|
28
|
+
readonly rebase: "rebase";
|
|
29
|
+
readonly repair: "repair";
|
|
30
|
+
readonly revert: "revert";
|
|
31
|
+
};
|
|
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"];
|
|
34
|
+
export type SchemaName = (typeof SCHEMA_NAMES)[number];
|
|
35
|
+
export declare const schemaId: (name: SchemaName) => string;
|
|
36
|
+
/** A schema as the package ships it. */
|
|
37
|
+
export declare function readSchema(name: SchemaName): Record<string, unknown>;
|
package/dist/schemas.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The JSON Schemas of `yodel <command> --json` and of `yodel mcp`'s tool
|
|
3
|
+
* results. They are written beside the code, in `schemas/` at the package
|
|
4
|
+
* root, and ship in the package; the docs site serves them at their `$id`.
|
|
5
|
+
* test/schemas.test.ts validates each command's output against its schema.
|
|
6
|
+
*
|
|
7
|
+
* Within a version a schema only gains fields, and a reader ignores fields it
|
|
8
|
+
* does not know. Removing a field or changing what one means is a new version:
|
|
9
|
+
* a new `v<N>/` in every `$id`, and {@link SCHEMA_VERSION} moves with it.
|
|
10
|
+
*/
|
|
11
|
+
import { readFileSync } from "node:fs";
|
|
12
|
+
import { fileURLToPath } from "node:url";
|
|
13
|
+
export const SCHEMA_VERSION = 1;
|
|
14
|
+
/** Where the schemas are published; each `$id` is this plus `<name>.schema.json`. */
|
|
15
|
+
export const SCHEMA_BASE = `https://intentius.io/sql-yodeler/schemas/v${String(SCHEMA_VERSION)}/`;
|
|
16
|
+
/** `schemas/` in the package: src/ and dist/ are both one level below it. */
|
|
17
|
+
export const schemasDir = fileURLToPath(new URL("../schemas/", import.meta.url));
|
|
18
|
+
/** The schema of each command's `--json` output, by the command line that prints it. */
|
|
19
|
+
export const COMMAND_SCHEMAS = {
|
|
20
|
+
init: "init",
|
|
21
|
+
plan: "plan",
|
|
22
|
+
apply: "apply",
|
|
23
|
+
new: "new",
|
|
24
|
+
checkpoint: "checkpoint",
|
|
25
|
+
lint: "lint",
|
|
26
|
+
"lint --rules": "lint-rules",
|
|
27
|
+
status: "status",
|
|
28
|
+
report: "report",
|
|
29
|
+
drift: "drift",
|
|
30
|
+
rebase: "rebase",
|
|
31
|
+
repair: "repair",
|
|
32
|
+
revert: "revert",
|
|
33
|
+
};
|
|
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"];
|
|
36
|
+
export const schemaId = (name) => `${SCHEMA_BASE}${name}.schema.json`;
|
|
37
|
+
/** A schema as the package ships it. */
|
|
38
|
+
export function readSchema(name) {
|
|
39
|
+
return JSON.parse(readFileSync(`${schemasDir}${name}.schema.json`, "utf8"));
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=schemas.js.map
|
|
@@ -0,0 +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,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;CACR,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"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which server a command reached, for the first line of its output (#11):
|
|
3
|
+
* `postgres 16.14 at 127.0.0.1:5432/postgres`. A wrong target (a native
|
|
4
|
+
* Postgres on localhost:5432 instead of the emulator) then shows in the
|
|
5
|
+
* header, by its address and its version.
|
|
6
|
+
*
|
|
7
|
+
* The address comes from the profile's URL, without credentials; the
|
|
8
|
+
* version is asked of the server. A server that does not answer the version
|
|
9
|
+
* query still gets its address.
|
|
10
|
+
*/
|
|
11
|
+
import type { Environment, Project, SqlDialect } from "./project.js";
|
|
12
|
+
export interface ServerInfo {
|
|
13
|
+
dialect: SqlDialect;
|
|
14
|
+
/** `host:port/database` on Postgres, `host:port` on ClickHouse. */
|
|
15
|
+
address: string;
|
|
16
|
+
/** The server's own version string, first word: `16.14`, `25.3.2.39`. */
|
|
17
|
+
version?: string | undefined;
|
|
18
|
+
}
|
|
19
|
+
/** `postgres 16.14 at 127.0.0.1:5432/postgres`. */
|
|
20
|
+
export declare function describeServer(s: ServerInfo): string;
|
|
21
|
+
/** `host:port/database` (Postgres) or `host:port` (ClickHouse) from a server URL, with no credentials. */
|
|
22
|
+
export declare function serverAddress(dialect: SqlDialect, url: string): string;
|
|
23
|
+
/** The first word of a version string: `16.14 (Homebrew)` is `16.14`. */
|
|
24
|
+
export declare const versionWord: (v: unknown) => string | undefined;
|
|
25
|
+
/** Asks a Postgres connection its version. */
|
|
26
|
+
export declare function postgresVersion(client: {
|
|
27
|
+
query<T>(sql: string): Promise<T[]>;
|
|
28
|
+
}): Promise<string | undefined>;
|
|
29
|
+
/** Asks a ClickHouse server its version. */
|
|
30
|
+
export declare function clickhouseVersion(port: {
|
|
31
|
+
query<T>(sql: string): Promise<T[]>;
|
|
32
|
+
}): Promise<string | undefined>;
|
|
33
|
+
/** Runs `probe`, giving up quietly: the header is worth a line, not a failure. */
|
|
34
|
+
export declare function softly<T>(probe: () => Promise<T>): Promise<T | undefined>;
|
|
35
|
+
/**
|
|
36
|
+
* The server `sql.profiles.<env>` binds, with its version when it answers,
|
|
37
|
+
* for a command that does not hold its own connection (the declarative plan
|
|
38
|
+
* and apply, drift). Undefined when the profile binds no server.
|
|
39
|
+
*/
|
|
40
|
+
export declare function probeServer(project: Project, env: Environment, processEnv?: NodeJS.ProcessEnv): Promise<ServerInfo | undefined>;
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which server a command reached, for the first line of its output (#11):
|
|
3
|
+
* `postgres 16.14 at 127.0.0.1:5432/postgres`. A wrong target (a native
|
|
4
|
+
* Postgres on localhost:5432 instead of the emulator) then shows in the
|
|
5
|
+
* header, by its address and its version.
|
|
6
|
+
*
|
|
7
|
+
* The address comes from the profile's URL, without credentials; the
|
|
8
|
+
* version is asked of the server. A server that does not answer the version
|
|
9
|
+
* query still gets its address.
|
|
10
|
+
*/
|
|
11
|
+
/** `postgres 16.14 at 127.0.0.1:5432/postgres`. */
|
|
12
|
+
export function describeServer(s) {
|
|
13
|
+
return `${s.dialect}${s.version ? ` ${s.version}` : ""} at ${s.address}`;
|
|
14
|
+
}
|
|
15
|
+
/** `host:port/database` (Postgres) or `host:port` (ClickHouse) from a server URL, with no credentials. */
|
|
16
|
+
export function serverAddress(dialect, url) {
|
|
17
|
+
let u;
|
|
18
|
+
try {
|
|
19
|
+
u = new URL(url);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return url.replace(/\/\/[^@/]*@/, "//");
|
|
23
|
+
}
|
|
24
|
+
if (dialect === "postgres") {
|
|
25
|
+
const port = u.port || "5432";
|
|
26
|
+
const db = decodeURIComponent(u.pathname.replace(/^\/+/, "")) || "postgres";
|
|
27
|
+
return `${u.hostname}:${port}/${db}`;
|
|
28
|
+
}
|
|
29
|
+
const port = u.port || (u.protocol === "https:" ? "8443" : "8123");
|
|
30
|
+
return `${u.hostname}:${port}`;
|
|
31
|
+
}
|
|
32
|
+
/** The first word of a version string: `16.14 (Homebrew)` is `16.14`. */
|
|
33
|
+
export const versionWord = (v) => (typeof v === "string" && v.trim() ? v.trim().split(/\s+/)[0] : undefined);
|
|
34
|
+
/** Asks a Postgres connection its version. */
|
|
35
|
+
export async function postgresVersion(client) {
|
|
36
|
+
const rows = await client.query("SHOW server_version");
|
|
37
|
+
return versionWord(rows[0]?.server_version);
|
|
38
|
+
}
|
|
39
|
+
/** Asks a ClickHouse server its version. */
|
|
40
|
+
export async function clickhouseVersion(port) {
|
|
41
|
+
const rows = await port.query("SELECT version() AS version");
|
|
42
|
+
return versionWord(rows[0]?.version);
|
|
43
|
+
}
|
|
44
|
+
/** Runs `probe`, giving up quietly: the header is worth a line, not a failure. */
|
|
45
|
+
export async function softly(probe) {
|
|
46
|
+
try {
|
|
47
|
+
return await probe();
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* The server `sql.profiles.<env>` binds, with its version when it answers,
|
|
55
|
+
* for a command that does not hold its own connection (the declarative plan
|
|
56
|
+
* and apply, drift). Undefined when the profile binds no server.
|
|
57
|
+
*/
|
|
58
|
+
export async function probeServer(project, env, processEnv = process.env) {
|
|
59
|
+
return softly(async () => {
|
|
60
|
+
if (project.dialect === "postgres") {
|
|
61
|
+
const { resolvePostgresTarget, isUnresolvedTarget } = await import("@intentius/chant-lexicon-sql/postgres/live/bind");
|
|
62
|
+
const target = resolvePostgresTarget({ environment: env.name, config: project.config, env: processEnv });
|
|
63
|
+
if (isUnresolvedTarget(target))
|
|
64
|
+
return undefined;
|
|
65
|
+
const info = { dialect: "postgres", address: serverAddress("postgres", target.endpoint.url) };
|
|
66
|
+
const { connectPostgres } = await import("@intentius/chant-lexicon-sql/postgres/live/client");
|
|
67
|
+
const client = await softly(() => connectPostgres(target.endpoint, { applicationName: "yodel" }));
|
|
68
|
+
if (client) {
|
|
69
|
+
try {
|
|
70
|
+
info.version = await softly(() => postgresVersion(client));
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
await client.end();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return info;
|
|
77
|
+
}
|
|
78
|
+
const { resolveClickHouseTarget, isUnresolvedTarget } = await import("@intentius/chant-lexicon-sql/clickhouse/live/bind");
|
|
79
|
+
const target = resolveClickHouseTarget({ environment: env.name, config: project.config, env: processEnv });
|
|
80
|
+
if (isUnresolvedTarget(target))
|
|
81
|
+
return undefined;
|
|
82
|
+
const { httpPort } = await import("./history/client.js");
|
|
83
|
+
const port = await httpPort(target.endpoint);
|
|
84
|
+
return { dialect: "clickhouse", address: serverAddress("clickhouse", target.endpoint.url), version: await softly(() => clickhouseVersion(port)) };
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|