@intentius/sql-yodeler 0.3.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.
- package/README.md +1 -1
- package/dist/apply-steps/index.d.ts +65 -0
- package/dist/apply-steps/index.js +106 -0
- package/dist/apply-steps/index.js.map +1 -0
- package/dist/approval-mode/index.d.ts +78 -0
- package/dist/approval-mode/index.js +105 -0
- package/dist/approval-mode/index.js.map +1 -0
- package/dist/chant/access.d.ts +87 -0
- package/dist/chant/access.js +169 -0
- package/dist/chant/access.js.map +1 -0
- package/dist/chant/drift.d.ts +17 -1
- package/dist/chant/drift.js +55 -2
- package/dist/chant/drift.js.map +1 -1
- package/dist/chant/plan.d.ts +18 -2
- package/dist/chant/plan.js +21 -3
- package/dist/chant/plan.js.map +1 -1
- package/dist/ci/render.d.ts +54 -10
- package/dist/ci/render.js +249 -52
- package/dist/ci/render.js.map +1 -1
- package/dist/cleanup/index.d.ts +86 -0
- package/dist/cleanup/index.js +207 -0
- package/dist/cleanup/index.js.map +1 -0
- package/dist/commands/apply.js +153 -20
- package/dist/commands/apply.js.map +1 -1
- package/dist/commands/approve.d.ts +13 -0
- package/dist/commands/approve.js +206 -24
- package/dist/commands/approve.js.map +1 -1
- package/dist/commands/ci.js +12 -0
- package/dist/commands/ci.js.map +1 -1
- package/dist/commands/cleanup.d.ts +13 -0
- package/dist/commands/cleanup.js +138 -0
- package/dist/commands/cleanup.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.js +136 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/drift.js +34 -3
- package/dist/commands/drift.js.map +1 -1
- package/dist/commands/index.js +6 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/lint.js +30 -6
- package/dist/commands/lint.js.map +1 -1
- package/dist/commands/new.js +133 -34
- package/dist/commands/new.js.map +1 -1
- package/dist/commands/plan.js +42 -5
- package/dist/commands/plan.js.map +1 -1
- package/dist/commands/test.d.ts +3 -0
- package/dist/commands/test.js +164 -0
- package/dist/commands/test.js.map +1 -0
- package/dist/config/define.d.ts +117 -2
- package/dist/config/define.js +2 -0
- package/dist/config/define.js.map +1 -1
- package/dist/config/load.js +74 -10
- package/dist/config/load.js.map +1 -1
- package/dist/config/settings.d.ts +18 -0
- package/dist/config/settings.js +26 -0
- package/dist/config/settings.js.map +1 -1
- package/dist/credentials.d.ts +119 -0
- package/dist/credentials.js +119 -0
- package/dist/credentials.js.map +1 -0
- package/dist/exit.js +1 -1
- package/dist/exit.js.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/init/adopt.js +1 -1
- package/dist/init/adopt.js.map +1 -1
- package/dist/init/clickhouse-access.d.ts +64 -0
- package/dist/init/clickhouse-access.js +211 -0
- package/dist/init/clickhouse-access.js.map +1 -0
- package/dist/init/live.d.ts +4 -0
- package/dist/init/live.js +16 -0
- package/dist/init/live.js.map +1 -1
- package/dist/lint/access.d.ts +18 -0
- package/dist/lint/access.js +34 -0
- package/dist/lint/access.js.map +1 -0
- package/dist/lint/check.js +23 -6
- package/dist/lint/check.js.map +1 -1
- package/dist/lint/config.d.ts +7 -1
- package/dist/lint/config.js +11 -5
- package/dist/lint/config.js.map +1 -1
- package/dist/lint/index.d.ts +2 -0
- package/dist/lint/index.js +2 -0
- package/dist/lint/index.js.map +1 -1
- package/dist/lint/naming.d.ts +62 -0
- package/dist/lint/naming.js +138 -0
- package/dist/lint/naming.js.map +1 -0
- package/dist/lint/rules.d.ts +37 -4
- package/dist/lint/rules.js +16 -4
- package/dist/lint/rules.js.map +1 -1
- package/dist/lint/schema-checks.d.ts +63 -0
- package/dist/lint/schema-checks.js +128 -0
- package/dist/lint/schema-checks.js.map +1 -0
- package/dist/lint/statements.d.ts +22 -1
- package/dist/lint/statements.js +40 -1
- package/dist/lint/statements.js.map +1 -1
- package/dist/mcp/tools.d.ts +1 -1
- package/dist/mcp/tools.js +1 -1
- package/dist/mcp/tools.js.map +1 -1
- package/dist/migrations/checkpoint.js +0 -2
- package/dist/migrations/checkpoint.js.map +1 -1
- package/dist/migrations/checks.d.ts +19 -1
- package/dist/migrations/checks.js +15 -0
- package/dist/migrations/checks.js.map +1 -1
- package/dist/migrations/create.d.ts +13 -4
- package/dist/migrations/create.js +24 -9
- package/dist/migrations/create.js.map +1 -1
- package/dist/migrations/routines.d.ts +5 -15
- package/dist/migrations/routines.js +5 -30
- package/dist/migrations/routines.js.map +1 -1
- package/dist/pr/model.d.ts +4 -1
- package/dist/pr/model.js +13 -5
- package/dist/pr/model.js.map +1 -1
- package/dist/pr/render.d.ts +4 -1
- package/dist/pr/render.js +22 -8
- package/dist/pr/render.js.map +1 -1
- package/dist/pr/tenants.d.ts +37 -0
- package/dist/pr/tenants.js +138 -0
- package/dist/pr/tenants.js.map +1 -0
- package/dist/probe.d.ts +27 -0
- package/dist/probe.js +106 -0
- package/dist/probe.js.map +1 -0
- package/dist/project.d.ts +16 -0
- package/dist/project.js +29 -1
- package/dist/project.js.map +1 -1
- package/dist/replay/clickhouse.d.ts +31 -0
- package/dist/replay/clickhouse.js +103 -6
- package/dist/replay/clickhouse.js.map +1 -1
- package/dist/replay/replay.d.ts +5 -2
- package/dist/replay/replay.js.map +1 -1
- package/dist/report/audit.d.ts +1 -1
- package/dist/report/audit.js +20 -3
- package/dist/report/audit.js.map +1 -1
- package/dist/schemas.d.ts +3 -1
- package/dist/schemas.js +2 -0
- package/dist/schemas.js.map +1 -1
- package/dist/sources/ddl.d.ts +15 -20
- package/dist/sources/ddl.js +34 -328
- package/dist/sources/ddl.js.map +1 -1
- package/dist/sources/index.js +2 -2
- package/dist/sources/index.js.map +1 -1
- package/dist/steps/backfill.d.ts +40 -5
- package/dist/steps/backfill.js +128 -8
- package/dist/steps/backfill.js.map +1 -1
- package/dist/steps/index.d.ts +19 -1
- package/dist/steps/index.js +34 -7
- package/dist/steps/index.js.map +1 -1
- package/dist/steps/kinds.d.ts +42 -4
- package/dist/steps/kinds.js +88 -14
- package/dist/steps/kinds.js.map +1 -1
- package/dist/steps/postgres-migration.d.ts +3 -0
- package/dist/steps/postgres-migration.js +7 -3
- package/dist/steps/postgres-migration.js.map +1 -1
- package/dist/steps/rebuild.d.ts +15 -6
- package/dist/steps/rebuild.js +12 -9
- package/dist/steps/rebuild.js.map +1 -1
- package/dist/tenants/index.d.ts +2 -1
- package/dist/tenants/index.js +3 -4
- package/dist/tenants/index.js.map +1 -1
- package/dist/tenants/wave.d.ts +128 -0
- package/dist/tenants/wave.js +254 -0
- package/dist/tenants/wave.js.map +1 -0
- package/dist/testing/define.d.ts +62 -0
- package/dist/testing/define.js +32 -0
- package/dist/testing/define.js.map +1 -0
- package/dist/testing/files.d.ts +5 -0
- package/dist/testing/files.js +18 -0
- package/dist/testing/files.js.map +1 -0
- package/dist/testing/report.d.ts +14 -0
- package/dist/testing/report.js +83 -0
- package/dist/testing/report.js.map +1 -0
- package/dist/testing/run.d.ts +104 -0
- package/dist/testing/run.js +328 -0
- package/dist/testing/run.js.map +1 -0
- package/dist/versioned/approval.d.ts +6 -0
- package/dist/versioned/approval.js +11 -5
- package/dist/versioned/approval.js.map +1 -1
- package/dist/versioned/checks.d.ts +8 -2
- package/dist/versioned/checks.js +34 -13
- package/dist/versioned/checks.js.map +1 -1
- package/dist/versioned/driver.d.ts +2 -2
- package/dist/versioned/engine.d.ts +10 -0
- package/dist/versioned/engine.js +8 -4
- package/dist/versioned/engine.js.map +1 -1
- package/dist/versioned/explain.d.ts +2 -0
- package/dist/versioned/explain.js +3 -1
- package/dist/versioned/explain.js.map +1 -1
- package/dist/versioned/state.js +1 -1
- package/dist/versioned/state.js.map +1 -1
- package/dist/waves/index.d.ts +58 -13
- package/dist/waves/index.js +109 -24
- package/dist/waves/index.js.map +1 -1
- package/dist/waves/record.d.ts +10 -0
- package/dist/waves/record.js.map +1 -1
- package/package.json +7 -7
- package/schemas/apply.schema.json +1 -1
- package/schemas/cleanup.schema.json +40 -0
- package/schemas/lint-rules.schema.json +4 -0
- package/schemas/new.schema.json +41 -3
- package/schemas/plan.schema.json +39 -0
- package/schemas/report.schema.json +1 -1
- package/schemas/test.schema.json +41 -0
package/dist/sources/ddl.js
CHANGED
|
@@ -1,347 +1,53 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* A file of DDL, as an ORM prints it (Prisma's `migrate diff --script`,
|
|
3
3
|
* Drizzle's `generate`, Django's `sqlmigrate`, SQLAlchemy's `CreateTable`),
|
|
4
|
-
* read
|
|
5
|
-
* one TypeScript file of `table`, `index`, `view`, ...
|
|
6
|
-
* file `chant import` writes. The build then treats
|
|
7
|
-
* declaration in `src/`.
|
|
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
8
|
*
|
|
9
|
-
* What is read
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* - ClickHouse: `CREATE DATABASE`, `TABLE`, `VIEW` and `MATERIALIZED VIEW`,
|
|
18
|
-
* as `chant import <file>.sql` reads them.
|
|
19
|
-
*
|
|
20
|
-
* Any other statement is an error naming it: a statement left out would be
|
|
21
|
-
* a schema yodel does not manage, silently.
|
|
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.
|
|
22
17
|
*
|
|
23
18
|
* `schema` (a Postgres schema, a ClickHouse database) qualifies the names
|
|
24
19
|
* the DDL leaves unqualified, as an ORM does when the schema comes from its
|
|
25
|
-
* connection
|
|
26
|
-
* key's table and a column type naming an enum or domain the file creates;
|
|
27
|
-
* on ClickHouse an object's own name.
|
|
20
|
+
* connection.
|
|
28
21
|
*/
|
|
29
22
|
import { YodelError } from "../project.js";
|
|
30
|
-
|
|
31
|
-
const
|
|
32
|
-
const
|
|
33
|
-
/**
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
let current = [];
|
|
39
|
-
const flush = () => {
|
|
40
|
-
let from = 0;
|
|
41
|
-
let to = current.length;
|
|
42
|
-
const trivia = (i) => {
|
|
43
|
-
const t = current[i];
|
|
44
|
-
return t !== undefined && isTrivia(t);
|
|
45
|
-
};
|
|
46
|
-
while (from < to && trivia(from))
|
|
47
|
-
from++;
|
|
48
|
-
while (to > from && trivia(to - 1))
|
|
49
|
-
to--;
|
|
50
|
-
if (to > from)
|
|
51
|
-
out.push(current.slice(from, to));
|
|
52
|
-
current = [];
|
|
53
|
-
};
|
|
54
|
-
for (const t of tokens) {
|
|
55
|
-
if (t.kind === "punct" && t.text === ";")
|
|
56
|
-
flush();
|
|
57
|
-
else
|
|
58
|
-
current.push(t);
|
|
59
|
-
}
|
|
60
|
-
flush();
|
|
61
|
-
return out;
|
|
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.`);
|
|
62
31
|
}
|
|
63
|
-
const text = (tokens) => tokens.map((t) => t.text).join("");
|
|
64
|
-
const firstLine = (s) => (s.split("\n")[0] ?? "").slice(0, 100);
|
|
65
32
|
/** Turns a file of DDL into declarations. */
|
|
66
33
|
export async function ddlToDeclarations(dialect, ddl, options) {
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
? new (await import("@intentius/chant-lexicon-sql/postgres/import/generator")).PostgresGenerator(options.header).generate(ir)
|
|
72
|
-
: new (await import("@intentius/chant-lexicon-sql/clickhouse/import/generator")).ClickHouseGenerator(options.header).generate(ir);
|
|
73
|
-
const [file] = files;
|
|
74
|
-
if (!file || files.length !== 1)
|
|
75
|
-
throw new YodelError(`${options.origin}: the lexicon's generator wrote ${String(files.length)} files, expected one`);
|
|
76
|
-
return {
|
|
77
|
-
content: file.content,
|
|
78
|
-
objects: ir.resources.map((r) => {
|
|
79
|
-
const p = r.properties;
|
|
80
|
-
const qualifier = p.schema ?? p.database;
|
|
81
|
-
return { export: r.logicalId, type: r.type, name: qualifier ? `${qualifier}.${p.name}` : p.name };
|
|
82
|
-
}),
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
// ---------- ClickHouse ----------
|
|
86
|
-
async function clickhouseIR(ddl, options) {
|
|
87
|
-
const { tokenizeText } = await import("@intentius/chant-lexicon-sql/clickhouse/tokens");
|
|
88
|
-
const { parseCreate } = await import("@intentius/chant-lexicon-sql/clickhouse/parser");
|
|
89
|
-
const { describeStatement, objectsToIR } = await import("@intentius/chant-lexicon-sql/clickhouse/import/ir");
|
|
90
|
-
const objects = [];
|
|
91
|
-
const problems = [];
|
|
92
|
-
for (const stmt of splitTokens(tokenizeText(ddl, 0))) {
|
|
93
|
-
let sql = text(stmt);
|
|
94
|
-
if (!/^CREATE\b/i.test(sql)) {
|
|
95
|
-
problems.push(`not a CREATE statement: ${firstLine(sql)}`);
|
|
96
|
-
continue;
|
|
97
|
-
}
|
|
98
|
-
try {
|
|
99
|
-
const tokens = tokenizeText(sql, 0);
|
|
100
|
-
const node = parseCreate(tokens);
|
|
101
|
-
const name = tokens.slice(node.name.from, node.name.to).filter((t) => !isTrivia(t));
|
|
102
|
-
const [only] = name;
|
|
103
|
-
if (options.schema && node.statement !== "database" && only && name.length === 1) {
|
|
104
|
-
const at = tokens.indexOf(only);
|
|
105
|
-
sql = text(tokens.slice(0, at)) + `${quoteIdent(options.schema)}.` + text(tokens.slice(at));
|
|
106
|
-
}
|
|
107
|
-
objects.push(describeStatement(sql));
|
|
108
|
-
}
|
|
109
|
-
catch (e) {
|
|
110
|
-
problems.push(`does not parse (${e instanceof Error ? e.message : String(e)}): ${firstLine(sql)}`);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
if (problems.length > 0)
|
|
114
|
-
throw ddlError(options.origin, problems);
|
|
115
|
-
return objectsToIR(objects);
|
|
116
|
-
}
|
|
117
|
-
// ---------- Postgres ----------
|
|
118
|
-
const PG_TYPE = {
|
|
119
|
-
schema: "Postgres::Schema",
|
|
120
|
-
table: "Postgres::Table",
|
|
121
|
-
index: "Postgres::Index",
|
|
122
|
-
view: "Postgres::View",
|
|
123
|
-
sequence: "Postgres::Sequence",
|
|
124
|
-
enum: "Postgres::Enum",
|
|
125
|
-
domain: "Postgres::Domain",
|
|
126
|
-
extension: "Postgres::Extension",
|
|
127
|
-
};
|
|
128
|
-
function ddlError(origin, problems) {
|
|
129
|
-
return new YodelError(`${origin}: ${String(problems.length)} statement(s) yodel cannot read as declarations:\n${problems.map((p) => ` - ${p}`).join("\n")}\n` +
|
|
130
|
-
`A DDL source holds CREATE statements (and, on Postgres, COMMENT ON and ALTER TABLE ... ADD of a table constraint).`);
|
|
131
|
-
}
|
|
132
|
-
async function postgresIR(ddl, options) {
|
|
133
|
-
const { tokenizeText } = await import("@intentius/chant-lexicon-sql/postgres/tokens");
|
|
134
|
-
const { parseStatements, identValue } = await import("@intentius/chant-lexicon-sql/postgres/parser");
|
|
135
|
-
const { objectsToIR } = await import("@intentius/chant-lexicon-sql/postgres/import/ir");
|
|
136
|
-
const problems = [];
|
|
137
|
-
const parsed = [];
|
|
138
|
-
const alters = [];
|
|
139
|
-
for (const stmt of splitTokens(tokenizeText(ddl, 0))) {
|
|
140
|
-
const sig = stmt.filter((t) => !isTrivia(t));
|
|
141
|
-
const sql = text(stmt);
|
|
142
|
-
if (sig.length === 1 && word(sig[0], "BEGIN", "COMMIT"))
|
|
143
|
-
continue;
|
|
144
|
-
if (word(sig[0], "ALTER") && word(sig[1], "TABLE")) {
|
|
145
|
-
const alter = readAlterAdd(stmt, sig, identValue);
|
|
146
|
-
if (alter)
|
|
147
|
-
alters.push({ ...alter, sql });
|
|
148
|
-
else
|
|
149
|
-
problems.push(`an ALTER TABLE other than ADD of a table constraint: ${firstLine(sql)}`);
|
|
150
|
-
continue;
|
|
151
|
-
}
|
|
152
|
-
if (!word(sig[0], "CREATE", "COMMENT")) {
|
|
153
|
-
problems.push(`not a CREATE statement: ${firstLine(sql)}`);
|
|
154
|
-
continue;
|
|
155
|
-
}
|
|
156
|
-
try {
|
|
157
|
-
const tokens = tokenizeText(sql, 0);
|
|
158
|
-
const nodes = parseStatements(tokens);
|
|
159
|
-
for (const node of nodes)
|
|
160
|
-
parsed.push({ tokens, node });
|
|
161
|
-
}
|
|
162
|
-
catch (e) {
|
|
163
|
-
problems.push(`does not parse (${e instanceof Error ? e.message : String(e)}): ${firstLine(sql)}`);
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
if (problems.length > 0)
|
|
167
|
-
throw ddlError(options.origin, problems);
|
|
168
|
-
const nameOf = (tokens, n) => n.pieces.length > 0 ? n.pieces : tokens.slice(n.span.from, n.span.to).filter((t) => isName(t)).map((t) => identValue(t));
|
|
169
|
-
const qualify = (pieces) => {
|
|
170
|
-
const name = pieces[pieces.length - 1] ?? "";
|
|
171
|
-
const schema = pieces.length >= 2 ? pieces[pieces.length - 2] : options.schema;
|
|
172
|
-
return schema ? { schema, name } : { name };
|
|
173
|
-
};
|
|
174
|
-
const key = (q) => `${q.schema ?? ""}.${q.name}`;
|
|
175
|
-
// The types the file creates, so a column of one is qualified with the rest.
|
|
176
|
-
const fileTypes = new Set();
|
|
177
|
-
for (const { tokens, node } of parsed) {
|
|
178
|
-
if (node.statement === "enum" || node.statement === "domain") {
|
|
179
|
-
const pieces = nameOf(tokens, node.name);
|
|
180
|
-
const [only] = pieces;
|
|
181
|
-
if (only !== undefined && pieces.length === 1)
|
|
182
|
-
fileTypes.add(only);
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
const objects = [];
|
|
186
|
-
const byName = new Map();
|
|
187
|
-
for (const { tokens, node } of parsed) {
|
|
188
|
-
const inserts = new Set();
|
|
189
|
-
/** Qualifies an unqualified name in the statement, when `schema` is set. */
|
|
190
|
-
const mark = (n) => {
|
|
191
|
-
if (!n || !options.schema)
|
|
192
|
-
return;
|
|
193
|
-
const names = tokens.slice(n.span.from, n.span.to).filter((t) => !isTrivia(t));
|
|
194
|
-
const [only] = names;
|
|
195
|
-
if (only && names.length === 1 && isName(only))
|
|
196
|
-
inserts.add(tokens.indexOf(only));
|
|
197
|
-
};
|
|
198
|
-
if (node.statement === "comment") {
|
|
199
|
-
const target = qualify(nameOf(tokens, node.objectType === "COLUMN" ? { ...node.target, pieces: nameOf(tokens, node.target).slice(0, -1) } : node.target));
|
|
200
|
-
const owner = byName.get(key(target));
|
|
201
|
-
if (!owner) {
|
|
202
|
-
problems.push(`COMMENT ON ${node.objectType} for an object the file does not create: ${firstLine(text(tokens))}`);
|
|
203
|
-
continue;
|
|
204
|
-
}
|
|
205
|
-
if (node.objectType !== "COLUMN" || nameOf(tokens, node.target).length < 3)
|
|
206
|
-
mark(node.target);
|
|
207
|
-
owner.statements.push(rewrite(tokens, inserts, options.schema));
|
|
208
|
-
continue;
|
|
209
|
-
}
|
|
210
|
-
if (node.statement === "policy" || node.statement === "role" || node.statement === "grant" || node.statement === "rowSecurity") {
|
|
211
|
-
problems.push(`access control (a policy, role, grant or row security) is not read from a DDL source: ${firstLine(text(tokens))}`);
|
|
212
|
-
continue;
|
|
213
|
-
}
|
|
214
|
-
if (node.statement === "index") {
|
|
215
|
-
if (!node.name) {
|
|
216
|
-
problems.push(`an index with no name (the declaration needs one): ${firstLine(text(tokens))}`);
|
|
217
|
-
continue;
|
|
218
|
-
}
|
|
219
|
-
mark(node.table);
|
|
220
|
-
}
|
|
221
|
-
else if (node.statement === "table") {
|
|
222
|
-
for (const c of [...node.columns.flatMap((col) => col.constraints), ...node.constraints])
|
|
223
|
-
mark(c.references?.table);
|
|
224
|
-
if (options.schema) {
|
|
225
|
-
for (const col of node.columns) {
|
|
226
|
-
if (!col.type)
|
|
227
|
-
continue;
|
|
228
|
-
const type = tokens.slice(col.type.from, col.type.to).filter((t) => !isTrivia(t));
|
|
229
|
-
const first = type[0];
|
|
230
|
-
if (first && isName(first) && fileTypes.has(identValue(first)) && !(type[1]?.kind === "punct" && type[1].text === "."))
|
|
231
|
-
inserts.add(tokens.indexOf(first));
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
else if (node.statement === "schema" && !node.name) {
|
|
236
|
-
problems.push(`a CREATE SCHEMA with no name: ${firstLine(text(tokens))}`);
|
|
237
|
-
continue;
|
|
238
|
-
}
|
|
239
|
-
// An index takes its table's schema: its own name is never qualified.
|
|
240
|
-
if (node.statement !== "schema" && node.statement !== "extension" && node.statement !== "index")
|
|
241
|
-
mark(node.name);
|
|
242
|
-
const pieces = node.name ? nameOf(tokens, node.name) : [];
|
|
243
|
-
const q = node.statement === "schema" || node.statement === "extension" ? { name: pieces[pieces.length - 1] ?? "" } : node.statement === "index" ? qualify([...nameOf(tokens, node.table).slice(0, -1), pieces[pieces.length - 1] ?? ""]) : qualify(pieces);
|
|
244
|
-
const type = node.statement === "view" && node.materialized ? "Postgres::MaterializedView" : (PG_TYPE[node.statement] ?? node.statement);
|
|
245
|
-
const object = { type, ...q, statements: [rewrite(tokens, inserts, options.schema)], constraints: [] };
|
|
246
|
-
objects.push(object);
|
|
247
|
-
if (node.statement !== "index")
|
|
248
|
-
byName.set(key(q), object);
|
|
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 })) };
|
|
249
38
|
}
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
if (!table || table.type !== "Postgres::Table") {
|
|
253
|
-
problems.push(`ALTER TABLE of a table the file does not create: ${firstLine(alter.sql)}`);
|
|
254
|
-
continue;
|
|
255
|
-
}
|
|
256
|
-
table.constraints.push(await qualifyConstraint(alter.constraint, options.schema));
|
|
39
|
+
catch (e) {
|
|
40
|
+
throw await ddlError(e);
|
|
257
41
|
}
|
|
258
|
-
if (problems.length > 0)
|
|
259
|
-
throw ddlError(options.origin, problems);
|
|
260
|
-
return objectsToIR(objects.map((o) => {
|
|
261
|
-
const [create = [], ...comments] = o.statements;
|
|
262
|
-
const ddl = [o.constraints.length > 0 ? addConstraints(create, o.constraints) : text(create), ...comments.map((c) => text(c))].join(";\n");
|
|
263
|
-
return { type: o.type, ...(o.schema ? { schema: o.schema } : {}), name: o.name, ddl };
|
|
264
|
-
}));
|
|
265
42
|
}
|
|
266
|
-
/** The
|
|
267
|
-
function
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
tokens.forEach((t, i) => {
|
|
272
|
-
if (inserts.has(i))
|
|
273
|
-
out.push({ kind: "ident", text: `${quoteIdent(schema)}.`, part: 0, start: 0, end: 0 });
|
|
274
|
-
out.push(t);
|
|
275
|
-
});
|
|
276
|
-
return out;
|
|
277
|
-
}
|
|
278
|
-
/** `ALTER TABLE [ONLY] [IF EXISTS] <name> ADD <table constraint>`: the table's name pieces and the constraint's text. */
|
|
279
|
-
function readAlterAdd(stmt, sig, identValue) {
|
|
280
|
-
let i = 2;
|
|
281
|
-
if (word(sig[i], "IF") && word(sig[i + 1], "EXISTS"))
|
|
282
|
-
i += 2;
|
|
283
|
-
if (word(sig[i], "ONLY"))
|
|
284
|
-
i++;
|
|
285
|
-
const table = [];
|
|
286
|
-
for (let t = sig[i]; t && isName(t); t = sig[i]) {
|
|
287
|
-
table.push(identValue(t));
|
|
288
|
-
i++;
|
|
289
|
-
const dot = sig[i];
|
|
290
|
-
if (dot?.kind === "punct" && dot.text === ".")
|
|
291
|
-
i++;
|
|
292
|
-
else
|
|
293
|
-
break;
|
|
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 }));
|
|
294
48
|
}
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
i++;
|
|
298
|
-
if (!word(sig[i], "CONSTRAINT", "FOREIGN", "UNIQUE", "PRIMARY", "CHECK", "EXCLUDE"))
|
|
299
|
-
return undefined;
|
|
300
|
-
// One constraint: a comma at depth 0 starts another ALTER action, which is not read.
|
|
301
|
-
let depth = 0;
|
|
302
|
-
for (const t of sig.slice(i)) {
|
|
303
|
-
if (t.kind === "punct" && t.text === "(")
|
|
304
|
-
depth++;
|
|
305
|
-
else if (t.kind === "punct" && t.text === ")")
|
|
306
|
-
depth--;
|
|
307
|
-
else if (t.kind === "punct" && t.text === "," && depth === 0)
|
|
308
|
-
return undefined;
|
|
49
|
+
catch (e) {
|
|
50
|
+
throw await ddlError(e);
|
|
309
51
|
}
|
|
310
|
-
const start = sig[i];
|
|
311
|
-
return start ? { table, constraint: text(stmt.slice(stmt.indexOf(start))) } : undefined;
|
|
312
|
-
}
|
|
313
|
-
/** Qualifies the table a folded FOREIGN KEY references, when it is unqualified. */
|
|
314
|
-
async function qualifyConstraint(constraint, schema) {
|
|
315
|
-
if (!schema)
|
|
316
|
-
return constraint;
|
|
317
|
-
const { tokenizeText } = await import("@intentius/chant-lexicon-sql/postgres/tokens");
|
|
318
|
-
const tokens = tokenizeText(constraint, 0);
|
|
319
|
-
const sig = tokens.map((t, i) => ({ t, i })).filter((x) => !isTrivia(x.t));
|
|
320
|
-
const inserts = new Set();
|
|
321
|
-
sig.forEach((x, k) => {
|
|
322
|
-
const target = sig[k + 1];
|
|
323
|
-
const dot = sig[k + 2]?.t;
|
|
324
|
-
if (word(x.t, "REFERENCES") && target && isName(target.t) && !(dot?.kind === "punct" && dot.text === "."))
|
|
325
|
-
inserts.add(target.i);
|
|
326
|
-
});
|
|
327
|
-
return text(rewrite(tokens, inserts, schema));
|
|
328
|
-
}
|
|
329
|
-
/** A CREATE TABLE with table constraints added at the end of its column list (the `)` matching the first `(`). */
|
|
330
|
-
function addConstraints(create, constraints) {
|
|
331
|
-
let depth = 0;
|
|
332
|
-
const close = create.findIndex((t) => {
|
|
333
|
-
if (t.kind !== "punct")
|
|
334
|
-
return false;
|
|
335
|
-
if (t.text === "(")
|
|
336
|
-
depth++;
|
|
337
|
-
else if (t.text === ")")
|
|
338
|
-
return --depth === 0;
|
|
339
|
-
return false;
|
|
340
|
-
});
|
|
341
|
-
if (close < 0)
|
|
342
|
-
return text(create);
|
|
343
|
-
const before = text(create.slice(0, close)).replace(/\s+$/, "");
|
|
344
|
-
const indent = /\n([ \t]+)\S[^\n]*$/.exec(before)?.[1] ?? " ";
|
|
345
|
-
return `${before}${constraints.map((c) => `,\n${indent}${c}`).join("")}\n${text(create.slice(close))}`;
|
|
346
52
|
}
|
|
347
53
|
//# sourceMappingURL=ddl.js.map
|
package/dist/sources/ddl.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ddl.js","sourceRoot":"","sources":["../../src/sources/ddl.ts"],"names":[],"mappings":"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"}
|
|
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"}
|
package/dist/sources/index.js
CHANGED
|
@@ -27,7 +27,7 @@ import { exec } from "node:child_process";
|
|
|
27
27
|
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
28
28
|
import { isAbsolute, join, relative } from "node:path";
|
|
29
29
|
import { YodelError } from "../project.js";
|
|
30
|
-
import { ddlToDeclarations } from "./ddl.js";
|
|
30
|
+
import { ddlObjects, ddlToDeclarations } from "./ddl.js";
|
|
31
31
|
const SOURCE_NAME = /^[a-z][a-z0-9-]*$/;
|
|
32
32
|
/** The generated file a source writes, relative to the project directory. */
|
|
33
33
|
export const generatedPath = (project, name) => join(project.sourceDir, `${name}.generated.ts`);
|
|
@@ -125,7 +125,7 @@ export function duplicateExport(buildOutput, synced) {
|
|
|
125
125
|
async function builtName(dialect, type, ddl) {
|
|
126
126
|
try {
|
|
127
127
|
const first = ddl.split(/;\s*\n\s*COMMENT ON\b/i)[0] ?? ddl;
|
|
128
|
-
const [object] =
|
|
128
|
+
const [object] = await ddlObjects(dialect, first, { origin: "build" });
|
|
129
129
|
return object && (type === undefined || object.type === type) ? object.name : undefined;
|
|
130
130
|
}
|
|
131
131
|
catch {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sources/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAEvD,OAAO,EAAE,UAAU,EAAgB,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAkB,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sources/index.ts"],"names":[],"mappings":"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"}
|
package/dist/steps/backfill.d.ts
CHANGED
|
@@ -2,7 +2,16 @@
|
|
|
2
2
|
* A backfill step: a data migration the author writes, run inside the
|
|
3
3
|
* migration between the statements around it, resumable from receipts.
|
|
4
4
|
*
|
|
5
|
-
* The
|
|
5
|
+
* The common case is a form, the step's options in `migration.json`
|
|
6
|
+
* ({@link BackfillForm}): a table, an integer key and a batch size (or a
|
|
7
|
+
* list of batches), and the SQL of one batch with `{from}` and `{to}` (or
|
|
8
|
+
* `{batch}`) in it. `yodel new <name> --backfill` writes it from
|
|
9
|
+
* `backfills/<name>.json`. When the step runs, yodel builds the Op below
|
|
10
|
+
* from it ({@link formOp}): one `effect()` per batch, the batches read from
|
|
11
|
+
* the table's smallest and largest key at that moment, aligned to the
|
|
12
|
+
* batch size so a rerun sees the same ranges.
|
|
13
|
+
*
|
|
14
|
+
* The advanced case: the step names a module in the migration's directory (`backfill.ts` by
|
|
6
15
|
* default) that exports a chant Op as `op` (or as its default export). Each
|
|
7
16
|
* step of its phases is an `effect()` step: one batch of the backfill, with
|
|
8
17
|
* its own receipt. The nested steps run SQL on the environment's server with
|
|
@@ -62,15 +71,23 @@ import type { ClickHousePort } from "../history/index.js";
|
|
|
62
71
|
import type { PgClient } from "../history/postgres/index.js";
|
|
63
72
|
import type { PgTimeouts } from "../versioned/postgres/executor.js";
|
|
64
73
|
import { type RunOpOptions } from "./run.js";
|
|
65
|
-
import { type BackfillStep } from "./kinds.js";
|
|
74
|
+
import { type BackfillForm, type BackfillStep } from "./kinds.js";
|
|
66
75
|
/** The activity a backfill's steps run SQL with: `activity("yodelSql", { sql, settings? })`. */
|
|
67
76
|
export declare const SQL_ACTIVITY = "yodelSql";
|
|
68
77
|
/** The step `yodel new --backfill` adds to a migration. */
|
|
69
78
|
export declare function backfillStep(migrationName: string, file?: string): BackfillStep;
|
|
79
|
+
/** The default place `yodel new <name> --backfill` reads a form from (and writes its template at), in the project directory. */
|
|
80
|
+
export declare const formPath: (name: string) => string;
|
|
81
|
+
/** What one batch of a form runs, as the plan shows it. */
|
|
82
|
+
export declare function describeFormSql(form: BackfillForm): string;
|
|
83
|
+
/** The step `yodel new --backfill` adds for a form: the form is the step's options, so it is in the checksum and the plan shows it. */
|
|
84
|
+
export declare function backfillFormStep(migrationName: string, form: BackfillForm): BackfillStep;
|
|
70
85
|
/** Text only the template holds: a backfill still carrying it has not been written. */
|
|
71
86
|
export declare const TEMPLATE_MARK = "write the backfill of";
|
|
72
87
|
/** What `yodel new --backfill <file>` writes at `<file>` when there is none yet. */
|
|
73
88
|
export declare function backfillTemplate(name: string, dialect?: SqlDialect): string;
|
|
89
|
+
/** What `yodel new <name> --backfill` writes at `backfills/<name>.json` when there is none yet: a form to fill in. */
|
|
90
|
+
export declare function formTemplate(name: string, dialect?: SqlDialect): string;
|
|
74
91
|
/** The Op config a module exports as `op` or as its default export. */
|
|
75
92
|
export declare function exportedOp(mod: Record<string, unknown>): OpConfig | undefined;
|
|
76
93
|
/** What is wrong with a backfill's Op, if anything: every phase step is an effect() step, and there are no gates. */
|
|
@@ -79,7 +96,10 @@ export declare function backfillProblems(config: OpConfig): string[];
|
|
|
79
96
|
export declare function loadBackfill(path: string, text?: string): Promise<OpConfig>;
|
|
80
97
|
export interface BackfillSummary {
|
|
81
98
|
op: "backfill";
|
|
82
|
-
|
|
99
|
+
/** The module, for a backfill written as an Op. */
|
|
100
|
+
file?: string;
|
|
101
|
+
/** The table, for a backfill written as a form. */
|
|
102
|
+
table?: string;
|
|
83
103
|
/** The Op's name. */
|
|
84
104
|
name: string;
|
|
85
105
|
/** Batches (effect steps) the Op has. */
|
|
@@ -124,9 +144,24 @@ export interface RunBackfillOptions extends Omit<RunOpOptions, "activities" | "c
|
|
|
124
144
|
postgres?: PgBackfillServer | undefined;
|
|
125
145
|
receipts: ReceiptStore;
|
|
126
146
|
log?: (line: string) => void;
|
|
147
|
+
/** On a tenant (#56): renames the template in each statement the backfill sends. */
|
|
148
|
+
rename?: ((sql: string) => string) | undefined;
|
|
149
|
+
}
|
|
150
|
+
/** One batch of a form: the receipt's name and the values its placeholders take. */
|
|
151
|
+
export interface FormBatch {
|
|
152
|
+
id: string;
|
|
153
|
+
values: Record<string, string>;
|
|
127
154
|
}
|
|
128
|
-
/**
|
|
129
|
-
export declare function
|
|
155
|
+
/** The ranges `[from, to)` of width `size`, aligned to multiples of it, that cover `lo` to `hi`. */
|
|
156
|
+
export declare function keyRanges(lo: bigint, hi: bigint, size: number): FormBatch[];
|
|
157
|
+
/** A form's batches: its list, or the ranges of its key over the table's rows now (none when the table is empty). */
|
|
158
|
+
export declare function formBatches(form: BackfillForm, read: (sql: string) => Promise<Array<Record<string, unknown>>>, dialect: "clickhouse" | "postgres"): Promise<FormBatch[]>;
|
|
159
|
+
/** The SQL of one batch: each placeholder replaced by its value. */
|
|
160
|
+
export declare function batchSql(form: BackfillForm, batch: FormBatch): string[];
|
|
161
|
+
/** The Op a form runs: one effect() per batch, each running its statements with `yodelSql` and writing its receipt last. */
|
|
162
|
+
export declare function formOp(name: string, form: BackfillForm, batches: readonly FormBatch[]): Promise<OpConfig>;
|
|
163
|
+
/** Runs a backfill step to the end, counting batches as they skip or finish. `source` is the module's file, or the step's form. */
|
|
164
|
+
export declare function runBackfill(source: string | BackfillForm, run: RunBackfillOptions): Promise<{
|
|
130
165
|
summary: BackfillSummary;
|
|
131
166
|
records: StepRecord[];
|
|
132
167
|
}>;
|