@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
|
@@ -7,8 +7,26 @@
|
|
|
7
7
|
* the plan digest: editing, adding or removing one moves the digest, and an
|
|
8
8
|
* approval given before does not carry over.
|
|
9
9
|
*/
|
|
10
|
-
import type { MigrationCheck } from "./document.js";
|
|
10
|
+
import type { MigrationCheck, MigrationDocument } from "./document.js";
|
|
11
11
|
export type { MigrationCheck };
|
|
12
|
+
/**
|
|
13
|
+
* A check a migration runs before its first statement: one of its own
|
|
14
|
+
* `checks`, or a statement's pre-check (#51). chant marks a Postgres
|
|
15
|
+
* statement that can fail on the rows already there (a unique index over
|
|
16
|
+
* duplicates, SET NOT NULL over NULLs, a check or foreign key a row breaks)
|
|
17
|
+
* with a query counting those rows; it must return 0. `migration.json`
|
|
18
|
+
* records it on the step, so it is in the checksum like a check.
|
|
19
|
+
*/
|
|
20
|
+
export interface RunnableCheck extends MigrationCheck {
|
|
21
|
+
/** Set on a statement's pre-check: the step, its statement, and what the count is of. */
|
|
22
|
+
step?: {
|
|
23
|
+
index: number;
|
|
24
|
+
sql: string;
|
|
25
|
+
detail: string;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/** The checks run before a migration's first statement: its `checks`, then each statement's pre-check, named `precheck-<step>`. */
|
|
29
|
+
export declare function migrationChecks(doc: Pick<MigrationDocument, "checks" | "steps">): RunnableCheck[];
|
|
12
30
|
/** What is wrong with a `checks` value read from `migration.json`, or `undefined` when it is well formed. */
|
|
13
31
|
export declare function checksProblem(value: unknown): string | undefined;
|
|
14
32
|
/** What a check expects, in words. */
|
|
@@ -7,6 +7,21 @@
|
|
|
7
7
|
* the plan digest: editing, adding or removing one moves the digest, and an
|
|
8
8
|
* approval given before does not carry over.
|
|
9
9
|
*/
|
|
10
|
+
/** The checks run before a migration's first statement: its `checks`, then each statement's pre-check, named `precheck-<step>`. */
|
|
11
|
+
export function migrationChecks(doc) {
|
|
12
|
+
const own = [...(doc.checks ?? [])];
|
|
13
|
+
const taken = new Set(own.map((c) => c.name));
|
|
14
|
+
doc.steps.forEach((s, index) => {
|
|
15
|
+
if (s.kind !== "statement" || !s.precheck)
|
|
16
|
+
return;
|
|
17
|
+
let name = `precheck-${String(index)}`;
|
|
18
|
+
while (taken.has(name))
|
|
19
|
+
name = `${name}-statement`;
|
|
20
|
+
taken.add(name);
|
|
21
|
+
own.push({ name, sql: s.precheck.sql, expect: { max: 0 }, step: { index, sql: s.sql, detail: s.precheck.detail } });
|
|
22
|
+
});
|
|
23
|
+
return own;
|
|
24
|
+
}
|
|
10
25
|
const NAME = /^[a-z0-9][a-z0-9_-]*$/;
|
|
11
26
|
const isRecord = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
|
|
12
27
|
/** What is wrong with a `checks` value read from `migration.json`, or `undefined` when it is well formed. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checks.js","sourceRoot":"","sources":["../../src/migrations/checks.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"checks.js","sourceRoot":"","sources":["../../src/migrations/checks.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,7 @@ import { type DiffStatementsOptions, type SchemaStatements } from "@intentius/ch
|
|
|
11
11
|
import type { BuildOutput } from "../chant/build.js";
|
|
12
12
|
import { type MigrationCheck, type MigrationDocument, type MigrationFiles, type MigrationStep } from "./document.js";
|
|
13
13
|
import { type Migration } from "./directory.js";
|
|
14
|
+
import { type BackfillForm } from "../steps/kinds.js";
|
|
14
15
|
export interface CreateMigrationOptions {
|
|
15
16
|
/** The migration's name, the part of its id after the timestamp. */
|
|
16
17
|
name: string;
|
|
@@ -27,15 +28,23 @@ export interface CreateMigrationOptions {
|
|
|
27
28
|
/** Postgres: the schema a bare name means. Default: chant's, `public`. */
|
|
28
29
|
defaultSchema?: string;
|
|
29
30
|
/**
|
|
30
|
-
* A backfill step to end the migration with (#12):
|
|
31
|
-
*
|
|
32
|
-
* and counted in its checksum.
|
|
33
|
-
* build has no schema change.
|
|
31
|
+
* A backfill step to end the migration with (#12): a form, written as
|
|
32
|
+
* the step's options, or a module's text, written into the migration's
|
|
33
|
+
* directory as `file` (default `backfill.ts`) and counted in its checksum.
|
|
34
|
+
* With one, a migration is made even when the build has no schema change.
|
|
34
35
|
*/
|
|
35
36
|
backfill?: {
|
|
36
37
|
text: string;
|
|
37
38
|
file?: string;
|
|
39
|
+
} | {
|
|
40
|
+
form: BackfillForm;
|
|
38
41
|
};
|
|
42
|
+
/**
|
|
43
|
+
* How long a `PostgresMigrationOp` step keeps the old column, or a
|
|
44
|
+
* `ClickHouseRebuildOp` step the old table, after the switch: written
|
|
45
|
+
* into each such step's options (`retain`).
|
|
46
|
+
*/
|
|
47
|
+
retain?: string;
|
|
39
48
|
/** Pre-migration checks (#52), written to `migration.json`. */
|
|
40
49
|
checks?: MigrationCheck[];
|
|
41
50
|
}
|
|
@@ -12,9 +12,8 @@ import { YodelError } from "../project.js";
|
|
|
12
12
|
import { computeChecksum } from "./checksum.js";
|
|
13
13
|
import { MIGRATION_FORMAT, serializeDocument } from "./document.js";
|
|
14
14
|
import { MIGRATION_NAME } from "./directory.js";
|
|
15
|
-
import { asBackfill, BACKFILL_FILE } from "../steps/kinds.js";
|
|
16
|
-
import { backfillStep } from "../steps/backfill.js";
|
|
17
|
-
import { relabelTriggerCreates } from "./routines.js";
|
|
15
|
+
import { asBackfill, BACKFILL_FILE, describeForm, PG_MIGRATION_OP, REBUILD_OP } from "../steps/kinds.js";
|
|
16
|
+
import { backfillFormStep, backfillStep, describeFormSql } from "../steps/backfill.js";
|
|
18
17
|
/** `YYYYMMDDTHHMM` in UTC. */
|
|
19
18
|
export function migrationTimestamp(now) {
|
|
20
19
|
const iso = now.toISOString(); // 2026-10-09T14:12:34.567Z
|
|
@@ -44,8 +43,11 @@ export function emptyBuild(like) {
|
|
|
44
43
|
export const refusedSteps = (steps) => steps.filter((s) => s.kind !== "statement");
|
|
45
44
|
function describeRefused(s) {
|
|
46
45
|
const backfill = asBackfill(s);
|
|
47
|
-
if (backfill)
|
|
46
|
+
if (backfill) {
|
|
47
|
+
if (!("file" in backfill.options))
|
|
48
|
+
return `a backfill of ${describeForm(backfill.options)}, its batches resumable from their receipts`;
|
|
48
49
|
return `a backfill: the Op ${backfill.options.file} exports, its effect() batches resumable from their receipts`;
|
|
50
|
+
}
|
|
49
51
|
const rules = s.changes.map((c) => c.rule).join(", ");
|
|
50
52
|
return s.kind === "op"
|
|
51
53
|
? `${s.op} for ${s.object} (${s.name}), ${rules}: not SQL; migration.json holds its declaration`
|
|
@@ -65,12 +67,24 @@ export function renderMigrationSql(doc, statements) {
|
|
|
65
67
|
const body = statements.steps
|
|
66
68
|
.map((s) => {
|
|
67
69
|
const backfill = asBackfill(s);
|
|
68
|
-
|
|
70
|
+
if (!backfill)
|
|
71
|
+
return renderStatements({ ...statements, steps: [s] });
|
|
72
|
+
if ("file" in backfill.options)
|
|
73
|
+
return `-- ${backfill.object} (${backfill.name}): made by the Op ${backfill.options.file} exports, not a statement\n`;
|
|
74
|
+
const sql = describeFormSql(backfill.options).split("\n").map((l) => `-- ${l}`);
|
|
75
|
+
return `-- ${backfill.object} (${backfill.name}): a backfill of ${describeForm(backfill.options)}, not a statement; each batch runs:\n${sql.join("\n")}\n`;
|
|
69
76
|
})
|
|
70
77
|
.join("\n")
|
|
71
78
|
.replace(/\n+$/, "");
|
|
72
79
|
return `${head.join("\n")}\n\n${body}\n`;
|
|
73
80
|
}
|
|
81
|
+
/** `step` with `retain` in its options (and its declaration) when it is a column migration or a rebuild. */
|
|
82
|
+
function withRetain(step, retain) {
|
|
83
|
+
if (step.kind !== "op" || ![PG_MIGRATION_OP, REBUILD_OP].includes(step.op))
|
|
84
|
+
return step;
|
|
85
|
+
const declaration = /\s*\}\);?\s*$/.test(step.declaration) ? step.declaration.replace(/\s*\}\)(;?)\s*$/, `, retain: ${JSON.stringify(retain)} })$1`) : step.declaration;
|
|
86
|
+
return { ...step, options: { ...step.options, retain }, declaration };
|
|
87
|
+
}
|
|
74
88
|
/**
|
|
75
89
|
* The next migration, or a {@link NoChange} when the build declares the
|
|
76
90
|
* schema the previous migration recorded. Throws a YodelError when the
|
|
@@ -91,10 +105,11 @@ export function createMigration(options) {
|
|
|
91
105
|
catch (e) {
|
|
92
106
|
throw new YodelError(e instanceof Error ? e.message : String(e));
|
|
93
107
|
}
|
|
94
|
-
|
|
108
|
+
if (options.retain !== undefined)
|
|
109
|
+
statements = { ...statements, steps: statements.steps.map((s) => withRetain(s, options.retain)) };
|
|
95
110
|
if (options.backfill) {
|
|
96
|
-
const
|
|
97
|
-
statements = { ...statements, refused: true, steps: [...statements.steps,
|
|
111
|
+
const step = "form" in options.backfill ? backfillFormStep(options.name, options.backfill.form) : backfillStep(options.name, options.backfill.file ?? BACKFILL_FILE);
|
|
112
|
+
statements = { ...statements, refused: true, steps: [...statements.steps, step] };
|
|
98
113
|
}
|
|
99
114
|
if (statements.steps.length === 0)
|
|
100
115
|
return { id: undefined, statements };
|
|
@@ -115,7 +130,7 @@ export function createMigration(options) {
|
|
|
115
130
|
schema: options.build,
|
|
116
131
|
};
|
|
117
132
|
const sql = renderMigrationSql(unsigned, statements);
|
|
118
|
-
const extra = options.backfill ? { [options.backfill.file ?? BACKFILL_FILE]: options.backfill.text } : undefined;
|
|
133
|
+
const extra = options.backfill && "text" in options.backfill ? { [options.backfill.file ?? BACKFILL_FILE]: options.backfill.text } : undefined;
|
|
119
134
|
const document = { ...unsigned, checksum: computeChecksum({ sql, json: unsigned, extra }) };
|
|
120
135
|
return { id, document, files: { sql, json: serializeDocument(document), ...(extra ? { extra } : {}) }, statements };
|
|
121
136
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/migrations/create.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAqD,MAAM,mDAAmD,CAAC;AACxJ,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAwF,MAAM,eAAe,CAAC;AAC1J,OAAO,EAAE,cAAc,EAAkB,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/migrations/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Postgres functions, procedures and triggers in a migration (#44)
|
|
2
|
+
* Postgres functions, procedures and triggers in a migration (#44): the
|
|
3
|
+
* objects of a Postgres build as chant's plan reads them, for lint.
|
|
3
4
|
*
|
|
4
|
-
* chant
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* create, as if the table were new. A plan policy or a reviewer reading
|
|
8
|
-
* `create` would take it for a statement that blocks nobody, so `yodel new`
|
|
9
|
-
* gives those statements the change's rule and class.
|
|
5
|
+
* chant labels a trigger created on a table that already exists SQLPG283
|
|
6
|
+
* (metadata: SHARE ROW EXCLUSIVE on the table) itself, and one created
|
|
7
|
+
* with its table SQLPG200 create.
|
|
10
8
|
*/
|
|
11
|
-
import type { SchemaStatements } from "@intentius/chant-lexicon-sql/migration-statements";
|
|
12
9
|
import type { BuildOutput } from "../chant/build.js";
|
|
13
|
-
export declare const PG_TRIGGER = "Postgres::Trigger";
|
|
14
10
|
/** A Postgres build's objects as chant's plan reads them: kind, schema-qualified names, a trigger's table and function. */
|
|
15
11
|
export interface PgObject {
|
|
16
12
|
export: string;
|
|
@@ -23,9 +19,3 @@ export interface PgObject {
|
|
|
23
19
|
}
|
|
24
20
|
/** The objects of a Postgres build, canonical; `[]` for a build the lexicon cannot read (lint reports that on its own). */
|
|
25
21
|
export declare function pgObjects(build: BuildOutput, defaultSchema?: string): PgObject[];
|
|
26
|
-
/**
|
|
27
|
-
* The statements with each `CREATE TRIGGER` on a table `before` already
|
|
28
|
-
* declares (and its `COMMENT ON TRIGGER`) labelled SQLPG283, the rule the
|
|
29
|
-
* diff gave the change, in place of SQLPG200 create.
|
|
30
|
-
*/
|
|
31
|
-
export declare function relabelTriggerCreates(statements: SchemaStatements, before: BuildOutput, after: BuildOutput): SchemaStatements;
|
|
@@ -1,16 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Postgres functions, procedures and triggers in a migration (#44)
|
|
2
|
+
* Postgres functions, procedures and triggers in a migration (#44): the
|
|
3
|
+
* objects of a Postgres build as chant's plan reads them, for lint.
|
|
3
4
|
*
|
|
4
|
-
* chant
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* create, as if the table were new. A plan policy or a reviewer reading
|
|
8
|
-
* `create` would take it for a statement that blocks nobody, so `yodel new`
|
|
9
|
-
* gives those statements the change's rule and class.
|
|
5
|
+
* chant labels a trigger created on a table that already exists SQLPG283
|
|
6
|
+
* (metadata: SHARE ROW EXCLUSIVE on the table) itself, and one created
|
|
7
|
+
* with its table SQLPG200 create.
|
|
10
8
|
*/
|
|
11
|
-
import { PG_CLASSIFIER_RULES } from "@intentius/chant-lexicon-sql/postgres/plan/rules";
|
|
12
9
|
import { pgSchemaFromBuildOutput } from "@intentius/chant-lexicon-sql/postgres/plan/schema";
|
|
13
|
-
export const PG_TRIGGER = "Postgres::Trigger";
|
|
14
10
|
/** The objects of a Postgres build, canonical; `[]` for a build the lexicon cannot read (lint reports that on its own). */
|
|
15
11
|
export function pgObjects(build, defaultSchema = "public") {
|
|
16
12
|
if (build.dialect !== "postgres" || !Array.isArray(build.objects))
|
|
@@ -31,25 +27,4 @@ export function pgObjects(build, defaultSchema = "public") {
|
|
|
31
27
|
return [];
|
|
32
28
|
}
|
|
33
29
|
}
|
|
34
|
-
/**
|
|
35
|
-
* The statements with each `CREATE TRIGGER` on a table `before` already
|
|
36
|
-
* declares (and its `COMMENT ON TRIGGER`) labelled SQLPG283, the rule the
|
|
37
|
-
* diff gave the change, in place of SQLPG200 create.
|
|
38
|
-
*/
|
|
39
|
-
export function relabelTriggerCreates(statements, before, after) {
|
|
40
|
-
if (statements.dialect !== "postgres")
|
|
41
|
-
return statements;
|
|
42
|
-
const schema = statements.defaultSchema ?? "public";
|
|
43
|
-
const tables = new Set(pgObjects(before, schema).filter((o) => o.kind === "table").map((o) => o.qualified));
|
|
44
|
-
if (tables.size === 0)
|
|
45
|
-
return statements;
|
|
46
|
-
const onExisting = new Set(pgObjects(after, schema)
|
|
47
|
-
.filter((o) => o.kind === "trigger" && tables.has(String(o.fields.table)))
|
|
48
|
-
.map((o) => o.export));
|
|
49
|
-
if (onExisting.size === 0)
|
|
50
|
-
return statements;
|
|
51
|
-
const rule = PG_CLASSIFIER_RULES.SQLPG283;
|
|
52
|
-
const steps = statements.steps.map((s) => s.kind === "statement" && s.type === PG_TRIGGER && s.rule === "SQLPG200" && s.class === "create" && onExisting.has(s.object) ? { ...s, rule: rule.id, class: rule.class } : s);
|
|
53
|
-
return { ...statements, steps };
|
|
54
|
-
}
|
|
55
30
|
//# sourceMappingURL=routines.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routines.js","sourceRoot":"","sources":["../../src/migrations/routines.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"routines.js","sourceRoot":"","sources":["../../src/migrations/routines.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,uBAAuB,EAAE,MAAM,mDAAmD,CAAC;AAc5F,2HAA2H;AAC3H,MAAM,UAAU,SAAS,CAAC,KAAkB,EAAE,aAAa,GAAG,QAAQ;IACpE,IAAI,KAAK,CAAC,OAAO,KAAK,UAAU,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IAC7E,IAAI,CAAC;QACH,OAAO,uBAAuB,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAC7E,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC;YACtB,OAAO;gBACL,MAAM,EAAE,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,GAAG;gBAC7B,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;gBACtD,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9F,MAAM,EAAE,CAAC,CAAC,MAAM;aACjB,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
|
package/dist/pr/model.d.ts
CHANGED
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
* no ledger entry.
|
|
11
11
|
*/
|
|
12
12
|
import type { MigrationStep } from "@intentius/chant-lexicon-sql/migration-statements";
|
|
13
|
+
import { type EnvironmentApprovalMode } from "../approval-mode/index.js";
|
|
13
14
|
import type { GateLedgerPort } from "@intentius/chant/op/gate";
|
|
14
15
|
import { type Environment, type Project, type SqlDialect } from "../project.js";
|
|
15
16
|
import { type MigrationCheck } from "../migrations/index.js";
|
|
@@ -36,7 +37,7 @@ export interface PendingView {
|
|
|
36
37
|
outOfOrder: boolean;
|
|
37
38
|
/** Where a migration that ran part way resumes. */
|
|
38
39
|
resumeAt?: number | undefined;
|
|
39
|
-
/** Its pre-migration checks (#52), run before its first statement. */
|
|
40
|
+
/** Its pre-migration checks (#52) and its statements' pre-checks (#51), run before its first statement. */
|
|
40
41
|
checks?: MigrationCheck[] | undefined;
|
|
41
42
|
steps: StepView[];
|
|
42
43
|
}
|
|
@@ -55,6 +56,8 @@ export type ApprovalView = {
|
|
|
55
56
|
}) | undefined;
|
|
56
57
|
/** Why the ledger was not read. */
|
|
57
58
|
ledgerNote?: string | undefined;
|
|
59
|
+
/** Which approvals of the gate count (#48), as yodel.config.ts at the base commit has it; absent, `ledger`. */
|
|
60
|
+
mode?: EnvironmentApprovalMode | undefined;
|
|
58
61
|
};
|
|
59
62
|
export interface VersionedPlan {
|
|
60
63
|
environment: string;
|
package/dist/pr/model.js
CHANGED
|
@@ -9,10 +9,12 @@
|
|
|
9
9
|
* the post-merge apply needs. Nothing here writes: no lock, no history row,
|
|
10
10
|
* no ledger entry.
|
|
11
11
|
*/
|
|
12
|
+
import { migrationsApprovalAtBase, portFor, signFlag } from "../approval-mode/index.js";
|
|
12
13
|
import { YodelError } from "../project.js";
|
|
13
|
-
import { scanMigrations } from "../migrations/index.js";
|
|
14
|
+
import { migrationChecks, scanMigrations } from "../migrations/index.js";
|
|
14
15
|
import { describeTopology } from "../history/index.js";
|
|
15
16
|
import { asBackfill } from "../steps/kinds.js";
|
|
17
|
+
import { retainedNote } from "../cleanup/index.js";
|
|
16
18
|
import { EXIT_REFUSED } from "../exit.js";
|
|
17
19
|
import { BROKEN_CHAIN, findMigrateOp, inspect, gitLedger, judgePlan, migrateOpExample, migrationsDir, closeVersioned, openVersioned, outOfOrder, planDigest, sameDigest, statusReport, } from "../versioned/index.js";
|
|
18
20
|
import { currentSubject, explainAgainst, explainMove, latestApproval } from "../versioned/explain.js";
|
|
@@ -22,9 +24,10 @@ const viewOf = (m, done = [], outOfOrder = false, resumeAt, refused = []) => ({
|
|
|
22
24
|
id: m.id,
|
|
23
25
|
outOfOrder,
|
|
24
26
|
resumeAt,
|
|
25
|
-
checks: m.document.
|
|
27
|
+
checks: migrationChecks(m.document).map((c) => ({ name: c.name, sql: c.sql, ...(c.expect !== undefined ? { expect: c.expect } : {}) })),
|
|
26
28
|
steps: m.document.steps.map((step, index) => {
|
|
27
|
-
const
|
|
29
|
+
const options = asBackfill(step)?.options;
|
|
30
|
+
const file = options && "file" in options ? options.file : undefined;
|
|
28
31
|
const text = file === undefined ? undefined : m.files.extra?.[file];
|
|
29
32
|
return { index, step, done: done.includes(index), refused: refused.find((r) => r.index === index)?.reason, ...(file !== undefined && text !== undefined ? { source: { file, text } } : {}) };
|
|
30
33
|
}),
|
|
@@ -80,6 +83,9 @@ async function collectWith(project, env, options, venv, ordered, base, problems)
|
|
|
80
83
|
if (!(await sameDigest(prev, report.digest)))
|
|
81
84
|
plan.sinceLast = await explainMove({ approvedDigest: prev, now: subject, previous: options.previous, ordered, applied: status.applied });
|
|
82
85
|
}
|
|
86
|
+
const kept = await retainedNote(venv);
|
|
87
|
+
if (kept)
|
|
88
|
+
plan.notes.push(kept);
|
|
83
89
|
plan.approval = await approvalView(project, env, venv, ordered, plan, options);
|
|
84
90
|
// The policy as the base commit has it (#73): a pull request that loosens a rule is judged by the old one.
|
|
85
91
|
const basePolicy = await policyAtBase(project, options.processEnv);
|
|
@@ -125,16 +131,18 @@ async function approvalView(project, env, venv, ordered, plan, options) {
|
|
|
125
131
|
throw e;
|
|
126
132
|
return { kind: "no-op", message: e.message.includes("no Op applies") ? `no Op applies the migrations to ${env.name}; declare one, for example:\n\n${migrateOpExample(env.name)}` : e.message };
|
|
127
133
|
}
|
|
134
|
+
const mode = await migrationsApprovalAtBase(project, env.name);
|
|
128
135
|
const view = {
|
|
129
136
|
kind: "op",
|
|
130
137
|
op: op.name,
|
|
131
138
|
gate: op.gate,
|
|
132
|
-
command: plan.digest ? `chant approve ${op.name} ${op.gate} --plan ${plan.digest}` : undefined,
|
|
139
|
+
command: plan.digest ? `chant approve ${op.name} ${op.gate} --plan ${plan.digest}${signFlag(mode.mode)}` : undefined,
|
|
140
|
+
...(mode.mode !== "ledger" ? { mode: mode.mode } : {}),
|
|
133
141
|
};
|
|
134
142
|
if (options.ledger === null)
|
|
135
143
|
return view;
|
|
136
144
|
try {
|
|
137
|
-
const ledger = options.ledger ?? (await gitLedger(project.dir));
|
|
145
|
+
const ledger = await portFor(options.ledger ?? (await gitLedger(project.dir)), mode.mode, project.dir, mode.base);
|
|
138
146
|
const latest = await latestApproval(ledger, op, plan.digest);
|
|
139
147
|
if (!latest)
|
|
140
148
|
return view;
|
package/dist/pr/model.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/pr/model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/pr/model.ts"],"names":[],"mappings":"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"}
|
package/dist/pr/render.d.ts
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* what moved. Neither holds a secret: migration ids, checksums, a hash of
|
|
9
9
|
* the live catalog. Server addresses and tokens are never rendered.
|
|
10
10
|
*/
|
|
11
|
-
import type { VersionedPlan } from "./model.js";
|
|
11
|
+
import type { PendingView, VersionedPlan } from "./model.js";
|
|
12
12
|
/** The marker that identifies one environment's plan comment. */
|
|
13
13
|
export declare const commentMarker: (env: string) => string;
|
|
14
14
|
/** The subject a comment body carries, encoded. */
|
|
@@ -21,6 +21,9 @@ export declare function redact(sql: string): string;
|
|
|
21
21
|
export declare function renderPlanText(plan: VersionedPlan, options?: {
|
|
22
22
|
runnable?: (command: string) => string;
|
|
23
23
|
}): string;
|
|
24
|
+
export declare const cell: (s: string) => string;
|
|
25
|
+
export declare const fence: (text: string, lang: string) => string;
|
|
26
|
+
export declare function pendingMarkdown(p: PendingView, withSql: boolean, level?: number): string[];
|
|
24
27
|
/** The pull request comment body. */
|
|
25
28
|
export declare function renderPlanMarkdown(plan: VersionedPlan, options?: {
|
|
26
29
|
sql?: boolean;
|
package/dist/pr/render.js
CHANGED
|
@@ -9,8 +9,10 @@
|
|
|
9
9
|
* the live catalog. Server addresses and tokens are never rendered.
|
|
10
10
|
*/
|
|
11
11
|
import { describeServer } from "../server.js";
|
|
12
|
+
import { describeApprovalMode } from "../approval-mode/index.js";
|
|
12
13
|
import { askedAgainLine, describeMove, encodeSubject } from "../versioned/explain.js";
|
|
13
|
-
import { asBackfill } from "../steps/kinds.js";
|
|
14
|
+
import { asBackfill, asForm, describeForm } from "../steps/kinds.js";
|
|
15
|
+
import { describeAccessSteps } from "../chant/access.js";
|
|
14
16
|
import { describeExpect } from "../migrations/checks.js";
|
|
15
17
|
import { describeResults } from "../versioned/policy.js";
|
|
16
18
|
import { describeWave } from "../waves/index.js";
|
|
@@ -47,10 +49,14 @@ function approvalLines(a, digest, md) {
|
|
|
47
49
|
if (a.kind === "no-op")
|
|
48
50
|
return [md ? `No migrations Op: ${a.message.split("\n")[0] ?? ""}` : a.message];
|
|
49
51
|
const out = [];
|
|
52
|
+
if (a.mode)
|
|
53
|
+
out.push(describeApprovalMode(a.mode, code));
|
|
50
54
|
if (a.latest) {
|
|
51
55
|
const l = a.latest;
|
|
52
56
|
if (l.holds)
|
|
53
57
|
out.push(`Approved by ${l.by} at ${l.at}: the apply after merge runs this plan.`);
|
|
58
|
+
else if (digest && l.sameDigest && l.uncounted)
|
|
59
|
+
out.push(`The newest approval of ${code(a.gate)}, by ${l.by} at ${l.at}, is for this plan's digest, but it does not count: ${l.uncounted}.`);
|
|
54
60
|
else if (digest && l.sameDigest)
|
|
55
61
|
out.push(`The newest approval of ${code(a.gate)}, by ${l.by} at ${l.at}, ${askedAgainLine(l, code)}.`);
|
|
56
62
|
else if (digest && l.digest) {
|
|
@@ -88,6 +94,8 @@ export function renderPlanText(plan, options = {}) {
|
|
|
88
94
|
}
|
|
89
95
|
for (const c of p.checks ?? [])
|
|
90
96
|
lines.push(` check ${c.name} (${describeExpect(c)}, before the first statement):`, ...redact(c.sql).split("\n").map((l) => ` ${l}`));
|
|
97
|
+
for (const l of describeAccessSteps(p.steps.map((s) => s.step)))
|
|
98
|
+
lines.push(` ${l}`);
|
|
91
99
|
}
|
|
92
100
|
if (plan.pending.length === 0 && !plan.refusal)
|
|
93
101
|
lines.push("", "Nothing pending: every migration is applied.");
|
|
@@ -112,25 +120,28 @@ export function renderPlanText(plan, options = {}) {
|
|
|
112
120
|
if (plan.digest) {
|
|
113
121
|
lines.push("", `Plan digest: ${plan.digest}`);
|
|
114
122
|
if (plan.approval?.kind === "op" && plan.approval.command)
|
|
115
|
-
lines.push(`Approve it with:`, ` ${run(plan.approval.command)}`, `or, at a terminal, with ${run(`yodel approve ${plan.environment}`)}, which shows the plan and asks you first.`);
|
|
123
|
+
lines.push(`Approve it with:`, ` ${run(plan.approval.command)}`, `or, at a terminal, with ${run(`yodel approve ${plan.environment}${plan.approval.mode === "sealed" ? " --sign" : ""}`)}, which shows the plan and asks you first.`);
|
|
116
124
|
}
|
|
117
125
|
const a = approvalLines(plan.approval, plan.digest, false);
|
|
118
126
|
if (a.length > 0)
|
|
119
127
|
lines.push("", ...a);
|
|
120
128
|
return `${lines.join("\n")}\n`;
|
|
121
129
|
}
|
|
122
|
-
const cell = (s) => s.replace(/\|/g, "\\|").replace(/\s*\n\s*/g, " ");
|
|
123
|
-
const fence = (text, lang) => {
|
|
130
|
+
export const cell = (s) => s.replace(/\|/g, "\\|").replace(/\s*\n\s*/g, " ");
|
|
131
|
+
export const fence = (text, lang) => {
|
|
124
132
|
const ticks = "`".repeat(Math.max(3, ...[...text.matchAll(/`+/g)].map((m) => m[0].length + 1)));
|
|
125
133
|
return `${ticks}${lang}\n${text}\n${ticks}`;
|
|
126
134
|
};
|
|
127
|
-
function pendingMarkdown(p, withSql) {
|
|
135
|
+
export function pendingMarkdown(p, withSql, level = 4) {
|
|
128
136
|
const marks = pendingMarks(p);
|
|
129
|
-
const out = [
|
|
137
|
+
const out = [`${"#".repeat(level)} \`${p.id}\`${marks.length > 0 ? ` (${marks.join("; ")})` : ""}`, "", "| # | Step | Rule | Class | Object |", "|---|---|---|---|---|"];
|
|
130
138
|
for (const { index, step, done } of p.steps) {
|
|
131
139
|
const { rule, cls } = stepRule(step);
|
|
132
140
|
out.push(`| ${String(index)} | ${step.kind === "statement" ? "statement" : `**${cell(stepKind(step))}**`}${done ? " (done)" : ""} | ${cell(rule)} | ${cell(cls)} | \`${cell(step.name)}\` |`);
|
|
133
141
|
}
|
|
142
|
+
const access = describeAccessSteps(p.steps.map((s) => s.step), true);
|
|
143
|
+
if (access.length > 0)
|
|
144
|
+
out.push("", ...access);
|
|
134
145
|
const checks = p.checks ?? [];
|
|
135
146
|
if (checks.length > 0) {
|
|
136
147
|
out.push("", `Pre-migration checks (${String(checks.length)}), run before the first statement; one that fails refuses the apply:`, "", "| Check | Must | Query |", "|---|---|---|");
|
|
@@ -168,9 +179,11 @@ function pendingMarkdown(p, withSql) {
|
|
|
168
179
|
function opStepMarkdown({ index, step, source }, runs) {
|
|
169
180
|
if (step.kind !== "op")
|
|
170
181
|
return [];
|
|
171
|
-
const
|
|
182
|
+
const backfill = asBackfill(step);
|
|
183
|
+
const form = backfill ? asForm(backfill.options) : undefined;
|
|
184
|
+
const made = step.changes.length > 0 ? changes(step.changes) : (source?.file ?? (form ? `a backfill of ${describeForm(form)}` : backfill && "file" in backfill.options ? backfill.options.file : ""));
|
|
172
185
|
const what = made ? ` (${cell(made)})` : "";
|
|
173
|
-
const declaration = source ? fence(redact(source.text).replace(/\n+$/, ""), "ts") : fence(step.declaration, "ts");
|
|
186
|
+
const declaration = source ? fence(redact(source.text).replace(/\n+$/, ""), "ts") : form ? fence(redact(step.declaration), "json") : fence(step.declaration, "ts");
|
|
174
187
|
return [
|
|
175
188
|
`- step ${String(index)}, \`${step.name}\`: made by Op \`${step.op}\`${what}.${runs}`,
|
|
176
189
|
"",
|
|
@@ -290,6 +303,7 @@ export function planJsonVersioned(plan) {
|
|
|
290
303
|
op: a.op,
|
|
291
304
|
gate: a.gate,
|
|
292
305
|
...(a.command ? { approve: a.command } : {}),
|
|
306
|
+
...(a.mode ? { approvalMode: a.mode } : {}),
|
|
293
307
|
...(a.latest ? { approval: { ...a.latest, moved: a.latest.moved ? { confirmed: a.latest.moved.confirmed, changes: a.latest.moved.changes } : undefined } } : {}),
|
|
294
308
|
}
|
|
295
309
|
: a
|