@intentius/sql-yodeler 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- 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/build.js +7 -0
- package/dist/chant/build.js.map +1 -1
- 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 +333 -0
- package/dist/ci/render.js +885 -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/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.d.ts +113 -0
- package/dist/commands/apply.js +370 -30
- package/dist/commands/apply.js.map +1 -1
- package/dist/commands/approve.d.ts +13 -0
- package/dist/commands/approve.js +239 -13
- package/dist/commands/approve.js.map +1 -1
- 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 +130 -0
- package/dist/commands/ci.js.map +1 -0
- 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/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 +13 -1
- package/dist/commands/drift.js +52 -5
- 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.js +1 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/lint.js +39 -7
- 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/override.js +48 -16
- package/dist/commands/override.js.map +1 -1
- package/dist/commands/plan.js +47 -6
- package/dist/commands/plan.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 +32 -5
- package/dist/commands/status.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/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 +240 -3
- package/dist/config/define.js +4 -0
- 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 +156 -7
- package/dist/config/load.js.map +1 -1
- package/dist/config/settings.d.ts +22 -1
- package/dist/config/settings.js +34 -2
- 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/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 +8 -1
- package/dist/index.js +3 -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 +38 -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/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 +51 -6
- package/dist/lint/rules.js +23 -6
- 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.d.ts +45 -0
- package/dist/migrations/checkpoint.js +108 -0
- package/dist/migrations/checkpoint.js.map +1 -0
- 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 -7
- package/dist/migrations/create.js.map +1 -1
- package/dist/migrations/document.d.ts +10 -0
- package/dist/migrations/document.js +1 -0
- package/dist/migrations/document.js.map +1 -1
- package/dist/migrations/index.d.ts +2 -0
- package/dist/migrations/index.js +2 -0
- package/dist/migrations/index.js.map +1 -1
- package/dist/migrations/routines.d.ts +21 -0
- package/dist/migrations/routines.js +30 -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/model.d.ts +7 -1
- package/dist/pr/model.js +29 -7
- package/dist/pr/model.js.map +1 -1
- package/dist/pr/render.d.ts +4 -1
- package/dist/pr/render.js +49 -9
- 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 +35 -2
- package/dist/project.js +62 -2
- 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 +14 -3
- package/dist/replay/replay.js +62 -31
- 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/report/audit.d.ts +138 -0
- package/dist/report/audit.js +219 -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 +7 -2
- package/dist/schemas.js +7 -2
- package/dist/schemas.js.map +1 -1
- package/dist/sources/ddl.d.ts +48 -0
- package/dist/sources/ddl.js +53 -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 +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 +38 -25
- package/dist/steps/postgres-migration.js +49 -32
- 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 +41 -0
- package/dist/tenants/index.js +121 -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/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 +16 -0
- package/dist/versioned/engine.js +20 -6
- 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/index.d.ts +1 -0
- package/dist/versioned/index.js +1 -0
- package/dist/versioned/index.js.map +1 -1
- package/dist/versioned/op.d.ts +6 -1
- package/dist/versioned/op.js +7 -2
- package/dist/versioned/op.js.map +1 -1
- package/dist/versioned/policy.d.ts +33 -2
- package/dist/versioned/policy.js +59 -8
- package/dist/versioned/policy.js.map +1 -1
- package/dist/versioned/report.js +9 -0
- 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/state.d.ts +25 -0
- package/dist/versioned/state.js +37 -4
- package/dist/versioned/state.js.map +1 -1
- package/dist/waves/index.d.ts +224 -0
- package/dist/waves/index.js +353 -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 +34 -0
- package/dist/waves/record.js +20 -0
- package/dist/waves/record.js.map +1 -0
- package/package.json +11 -7
- package/schemas/apply.schema.json +162 -3
- package/schemas/checkpoint.schema.json +19 -0
- package/schemas/cleanup.schema.json +40 -0
- package/schemas/drift.schema.json +26 -1
- package/schemas/event.schema.json +36 -0
- package/schemas/lint-rules.schema.json +4 -0
- package/schemas/lint.schema.json +4 -0
- package/schemas/new.schema.json +41 -3
- package/schemas/plan.schema.json +157 -0
- package/schemas/report.schema.json +114 -0
- package/schemas/revert.schema.json +69 -0
- package/schemas/status.schema.json +64 -3
- package/schemas/test.schema.json +41 -0
package/dist/commands/plan.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { parseArgs } from "node:util";
|
|
2
|
+
import { eventFromRun, sendEvent } from "../notify/index.js";
|
|
2
3
|
import { guarded } from "../env-args.js";
|
|
3
4
|
import { loadProject, resolveEnvironment, YodelError } from "../project.js";
|
|
4
|
-
import { declarativeTopologyRefusal, describeSettingsTopology, environmentSettings } from "../config/settings.js";
|
|
5
|
+
import { declarativeAccessRefusal, declarativeTopologyRefusal, describeSettingsTopology, environmentSettings } from "../config/settings.js";
|
|
5
6
|
import { buildSchema } from "../chant/build.js";
|
|
6
7
|
import { planEnvironment, planExitCode, planJson, renderPlan } from "../chant/plan.js";
|
|
8
|
+
import { accessReview, clickhouseAccessRefusal, renderAccessReview } from "../chant/access.js";
|
|
7
9
|
import { hasMigrations } from "../versioned/index.js";
|
|
8
10
|
import { describeServer, probeServer } from "../server.js";
|
|
9
11
|
import { runnable } from "../chant/runnable.js";
|
|
@@ -12,6 +14,8 @@ import { collectVersionedPlan } from "../pr/model.js";
|
|
|
12
14
|
import { commentMarker, planJsonVersioned, renderPlanMarkdown, renderPlanText, subjectIn } from "../pr/render.js";
|
|
13
15
|
import { resolveForgeTarget } from "../pr/forge.js";
|
|
14
16
|
import { commentClient, findComment, upsertComment } from "../pr/comment.js";
|
|
17
|
+
import { collectTenantSetPlan, renderTenantSetMarkdown, renderTenantSetText, tenantSetExitCode, tenantSetJson } from "../pr/tenants.js";
|
|
18
|
+
import { tenantSetOf } from "../tenants/index.js";
|
|
15
19
|
const usage = "usage: yodel plan <env> [--json] [--dir <project>] [--format text|markdown|json]\n" +
|
|
16
20
|
" [--allow-out-of-order] [--op <name>]\n" +
|
|
17
21
|
" [--comment [--forge github|gitlab|forgejo]\n" +
|
|
@@ -30,6 +34,12 @@ apply asks approval for, with the chant approve command that approves it.
|
|
|
30
34
|
When chant's gate ledger holds an approval of the migrations Op's gate for
|
|
31
35
|
another digest, it says what moved since. Reads only.
|
|
32
36
|
|
|
37
|
+
An environment with a tenant set (yodel.config.ts environments.<env>.tenants)
|
|
38
|
+
is planned tenant by tenant, each against its own history, and shown as one
|
|
39
|
+
plan: tenants with the same migrations pending once, as a group, then the
|
|
40
|
+
wave's one approval of the set digest over every tenant. --comment posts it
|
|
41
|
+
as one comment for the set. <env>/<tenant> plans one tenant.
|
|
42
|
+
|
|
33
43
|
Options:
|
|
34
44
|
--json print the plan as JSON (the same as --format json)
|
|
35
45
|
--format <f> text (default), markdown (the pull request comment),
|
|
@@ -140,18 +150,25 @@ export const plan = {
|
|
|
140
150
|
}),
|
|
141
151
|
};
|
|
142
152
|
async function declarativePlan(project, env, json, io) {
|
|
143
|
-
const refusal = project.dialect === "clickhouse" ? declarativeTopologyRefusal(project, env.name) :
|
|
153
|
+
const refusal = project.dialect === "clickhouse" ? declarativeTopologyRefusal(project, env.name) : declarativeAccessRefusal(project, env.name);
|
|
144
154
|
if (refusal)
|
|
145
155
|
throw refusal;
|
|
146
156
|
const topology = project.dialect === "clickhouse" ? `, topology ${describeSettingsTopology(environmentSettings(project, env.name))}` : "";
|
|
147
157
|
const build = await buildSchema(project);
|
|
148
158
|
try {
|
|
159
|
+
const chRefusal = project.dialect === "clickhouse" ? clickhouseAccessRefusal(project, env.name, build.output) : undefined;
|
|
160
|
+
if (chRefusal)
|
|
161
|
+
throw chRefusal;
|
|
149
162
|
const result = await planEnvironment(project, env, build);
|
|
150
163
|
const server = await probeServer(project, env);
|
|
164
|
+
const access = await accessReview(project, env.name, result.diff.changes, build.output);
|
|
151
165
|
if (json)
|
|
152
|
-
io.out(`${JSON.stringify({ ...planJson(result), ...(server ? { server } : {}) }, null, 2)}\n`);
|
|
153
|
-
else
|
|
154
|
-
|
|
166
|
+
io.out(`${JSON.stringify({ ...planJson(result), access, ...(server ? { server } : {}) }, null, 2)}\n`);
|
|
167
|
+
else {
|
|
168
|
+
const text = await renderPlan(result, `Plan for ${env.name} (${server ? describeServer(server) : project.dialect}, sql.profiles.${env.name}${topology})`);
|
|
169
|
+
const review = renderAccessReview(access, env.name);
|
|
170
|
+
io.out(`${text}\n${review.length > 0 ? `\n${review.join("\n")}\n` : ""}`);
|
|
171
|
+
}
|
|
155
172
|
return planExitCode(result);
|
|
156
173
|
}
|
|
157
174
|
finally {
|
|
@@ -159,6 +176,8 @@ async function declarativePlan(project, env, json, io) {
|
|
|
159
176
|
}
|
|
160
177
|
}
|
|
161
178
|
async function versionedPlan(project, env, a, io) {
|
|
179
|
+
if (!env.tenant && tenantSetOf(project, env.name))
|
|
180
|
+
return tenantSetPlan(project, env, a, io);
|
|
162
181
|
const marker = commentMarker(env.name);
|
|
163
182
|
// Resolve the forge first: a job missing its token fails before it reads the server.
|
|
164
183
|
const target = a.comment ? resolveForgeTarget(a.forge, process.env) : undefined;
|
|
@@ -172,12 +191,34 @@ async function versionedPlan(project, env, a, io) {
|
|
|
172
191
|
const posted = await upsertComment(client, marker, renderPlanMarkdown(result), existing);
|
|
173
192
|
io.err(`yodel plan: ${posted.action} the plan comment on ${target.forge} ${target.repo}#${String(target.pr)}${posted.comment.url ? ` (${posted.comment.url})` : ` (comment ${String(posted.comment.id)})`}\n`);
|
|
174
193
|
}
|
|
194
|
+
const doc = planJsonVersioned(result);
|
|
175
195
|
if (a.format === "json")
|
|
176
|
-
io.out(`${JSON.stringify(
|
|
196
|
+
io.out(`${JSON.stringify(doc, null, 2)}\n`);
|
|
177
197
|
else if (a.format === "markdown")
|
|
178
198
|
io.out(renderPlanMarkdown(result));
|
|
179
199
|
else
|
|
180
200
|
io.out(renderPlanText(result, { runnable: (c) => runnable(c, project.dir) }));
|
|
201
|
+
// A plan that is refused, or that the policy denies, is news before anyone merges it (#61).
|
|
202
|
+
await sendEvent(project.yodel?.config.notify, eventFromRun("plan", doc), { io, verb: "plan" });
|
|
181
203
|
return code;
|
|
182
204
|
}
|
|
205
|
+
/** `yodel plan <set>` (#56): every tenant, grouped, and one comment for the set. */
|
|
206
|
+
async function tenantSetPlan(project, env, a, io) {
|
|
207
|
+
const target = a.comment ? resolveForgeTarget(a.forge, process.env) : undefined;
|
|
208
|
+
const client = target ? commentClient(target) : undefined;
|
|
209
|
+
const marker = commentMarker(env.name);
|
|
210
|
+
const existing = client ? await findComment(client, marker) : undefined;
|
|
211
|
+
const result = await collectTenantSetPlan(project, env.name, { allowOutOfOrder: a.allowOutOfOrder });
|
|
212
|
+
if (client && target) {
|
|
213
|
+
const posted = await upsertComment(client, marker, renderTenantSetMarkdown(result), existing);
|
|
214
|
+
io.err(`yodel plan: ${posted.action} the plan comment on ${target.forge} ${target.repo}#${String(target.pr)}${posted.comment.url ? ` (${posted.comment.url})` : ` (comment ${String(posted.comment.id)})`}\n`);
|
|
215
|
+
}
|
|
216
|
+
if (a.format === "json")
|
|
217
|
+
io.out(`${JSON.stringify(tenantSetJson(result), null, 2)}\n`);
|
|
218
|
+
else if (a.format === "markdown")
|
|
219
|
+
io.out(renderTenantSetMarkdown(result));
|
|
220
|
+
else
|
|
221
|
+
io.out(renderTenantSetText(result, { runnable: (c) => runnable(c, project.dir) }));
|
|
222
|
+
return tenantSetExitCode(result);
|
|
223
|
+
}
|
|
183
224
|
//# sourceMappingURL=plan.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Command } from "../command.js";
|
|
2
|
+
import type { AuditEntry } from "../report/audit.js";
|
|
3
|
+
import { type Report } from "../report/model.js";
|
|
4
|
+
/** Exit code: a gap in the sources, or an audit file entry they no longer give. */
|
|
5
|
+
export declare const REPORT_GAPS = 4;
|
|
6
|
+
/** The JSON `yodel report --json` prints (schemas/report.schema.json). */
|
|
7
|
+
export declare function reportJson(r: Report, auditFile?: {
|
|
8
|
+
path: string;
|
|
9
|
+
appended: number;
|
|
10
|
+
missing: AuditEntry[];
|
|
11
|
+
}): Record<string, unknown>;
|
|
12
|
+
/** `yodel report [<env>...]`; the exit codes are in `help`. */
|
|
13
|
+
export declare const report: Command;
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { writeFileSync } from "node:fs";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { parseArgs } from "node:util";
|
|
4
|
+
import { guarded } from "../env-args.js";
|
|
5
|
+
import { loadProject, resolveEnvironment, YodelError } from "../project.js";
|
|
6
|
+
import { hasMigrations, readChain } from "../versioned/index.js";
|
|
7
|
+
import { expandTargets } from "../tenants/index.js";
|
|
8
|
+
import { appendAudit, compareAudit, describeEntry, readAuditFile } from "../report/jsonl.js";
|
|
9
|
+
import { collectReport } from "../report/model.js";
|
|
10
|
+
import { renderReportHtml, renderReportText } from "../report/render.js";
|
|
11
|
+
/** Exit code: a gap in the sources, or an audit file entry they no longer give. */
|
|
12
|
+
export const REPORT_GAPS = 4;
|
|
13
|
+
const usage = "usage: yodel report [<env>...] [--json] [--html <file>] [--audit <file> [--check]] [--dir <project>]";
|
|
14
|
+
const help = `${usage}
|
|
15
|
+
|
|
16
|
+
Every environment's migrations side by side (default: every environment in
|
|
17
|
+
chant.config.ts's sql.profiles, in that order; an environment with a tenant
|
|
18
|
+
set, yodel.config.ts environments.<env>.tenants, is one column per tenant), and the audit log derived
|
|
19
|
+
from each environment's history table and chant's gate ledger (the
|
|
20
|
+
chant/lifecycle branch): approval requested, approved, override, silenced,
|
|
21
|
+
applied, refused, failed, repaired, reverted. Nothing in the log is written
|
|
22
|
+
by hand, so it cannot disagree with what ran. Reads only; takes no lock.
|
|
23
|
+
|
|
24
|
+
It also names the gaps the sources show: a history row missing (seqs run
|
|
25
|
+
from 1 with no hole), and a migration applied under a plan digest the ledger
|
|
26
|
+
holds no approval of. Fetch the chant/lifecycle branch first in CI, so the
|
|
27
|
+
ledger is there to read.
|
|
28
|
+
|
|
29
|
+
Options:
|
|
30
|
+
--json print the report as JSON
|
|
31
|
+
--html <file> write the run view, a self-contained HTML page: one row
|
|
32
|
+
per migration, one column per environment, then the audit
|
|
33
|
+
log
|
|
34
|
+
--audit <file> append the entries the sources hold that the file does
|
|
35
|
+
not (audit.jsonl, one entry per line, only ever appended)
|
|
36
|
+
--check with --audit: append nothing, and name every entry of the
|
|
37
|
+
file the sources no longer give (a ledger line or history
|
|
38
|
+
row removed since it was written)
|
|
39
|
+
-C, --dir <dir> the project directory (default: the working directory)
|
|
40
|
+
|
|
41
|
+
Exit codes:
|
|
42
|
+
0 read, no gaps
|
|
43
|
+
4 a gap: a history row missing, an applied migration with no approval on
|
|
44
|
+
the ledger, or (with --audit) an entry of the file no longer in the
|
|
45
|
+
sources
|
|
46
|
+
1 an environment could not be read, or a bad config
|
|
47
|
+
`;
|
|
48
|
+
function parseReportArgs(args) {
|
|
49
|
+
let parsed;
|
|
50
|
+
try {
|
|
51
|
+
parsed = parseArgs({
|
|
52
|
+
args,
|
|
53
|
+
allowPositionals: true,
|
|
54
|
+
strict: true,
|
|
55
|
+
options: {
|
|
56
|
+
json: { type: "boolean" },
|
|
57
|
+
html: { type: "string" },
|
|
58
|
+
audit: { type: "string" },
|
|
59
|
+
check: { type: "boolean" },
|
|
60
|
+
dir: { type: "string", short: "C" },
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
catch (e) {
|
|
65
|
+
throw new YodelError(`${e instanceof Error ? e.message : String(e)}\n${usage}`);
|
|
66
|
+
}
|
|
67
|
+
const v = parsed.values;
|
|
68
|
+
if (v.check === true && typeof v.audit !== "string")
|
|
69
|
+
throw new YodelError(`--check checks an audit file: give it with --audit <file>\n${usage}`);
|
|
70
|
+
return {
|
|
71
|
+
envs: parsed.positionals,
|
|
72
|
+
json: v.json === true,
|
|
73
|
+
html: typeof v.html === "string" ? v.html : undefined,
|
|
74
|
+
audit: typeof v.audit === "string" ? v.audit : undefined,
|
|
75
|
+
check: v.check === true,
|
|
76
|
+
dir: typeof v.dir === "string" ? v.dir : process.cwd(),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/** The JSON `yodel report --json` prints (schemas/report.schema.json). */
|
|
80
|
+
export function reportJson(r, auditFile) {
|
|
81
|
+
return { ...r, ...(auditFile ? { auditFile } : {}) };
|
|
82
|
+
}
|
|
83
|
+
/** `yodel report [<env>...]`; the exit codes are in `help`. */
|
|
84
|
+
export const report = {
|
|
85
|
+
name: "report",
|
|
86
|
+
summary: "each environment's migrations side by side, and the audit log",
|
|
87
|
+
implemented: true,
|
|
88
|
+
run: (args, io) => guarded("report", io, args, help, async () => {
|
|
89
|
+
const a = parseReportArgs(args);
|
|
90
|
+
const project = await loadProject(a.dir);
|
|
91
|
+
if (!hasMigrations(project))
|
|
92
|
+
throw new YodelError(`yodel report reads versioned migrations' history, and ${project.dir} has no migrations/ directory with a migration`);
|
|
93
|
+
// An environment with a tenant set is a column per tenant (#56).
|
|
94
|
+
const names = await expandTargets(project, a.envs.length > 0 ? a.envs : Object.keys(project.config.sql?.profiles ?? {}));
|
|
95
|
+
for (const n of names)
|
|
96
|
+
resolveEnvironment(project, n);
|
|
97
|
+
const r = await collectReport(project, readChain(project), names);
|
|
98
|
+
let auditFile;
|
|
99
|
+
if (a.audit) {
|
|
100
|
+
const path = resolve(a.audit);
|
|
101
|
+
const file = readAuditFile(path);
|
|
102
|
+
const read = r.environments.filter((e) => !e.error).map((e) => e.name);
|
|
103
|
+
const { missing, added } = compareAudit(file, r.audit, read);
|
|
104
|
+
if (!a.check)
|
|
105
|
+
appendAudit(path, added);
|
|
106
|
+
auditFile = { path: a.audit, appended: a.check ? 0 : added.length, missing };
|
|
107
|
+
}
|
|
108
|
+
if (a.html)
|
|
109
|
+
writeFileSync(resolve(a.html), renderReportHtml(r));
|
|
110
|
+
if (a.json)
|
|
111
|
+
io.out(`${JSON.stringify(reportJson(r, auditFile), null, 2)}\n`);
|
|
112
|
+
else
|
|
113
|
+
io.out(renderReportText(r, auditFile ? { check: { file: auditFile.path, missing: auditFile.missing.map(describeEntry), appended: auditFile.appended } } : {}));
|
|
114
|
+
if (a.html && !a.json)
|
|
115
|
+
io.err(`yodel report: wrote the run view to ${a.html}\n`);
|
|
116
|
+
if (r.gaps.length > 0 || (auditFile?.missing.length ?? 0) > 0)
|
|
117
|
+
return REPORT_GAPS;
|
|
118
|
+
return r.environments.some((e) => e.error) ? 1 : 0;
|
|
119
|
+
}),
|
|
120
|
+
};
|
|
121
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/commands/report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Command } from "../command.js";
|
|
2
|
+
import type { WaveGate } from "../config/define.js";
|
|
3
|
+
import { type DestructiveStep } from "../waves/index.js";
|
|
4
|
+
import { type RevertPlan } from "../versioned/index.js";
|
|
5
|
+
/** The wave of the environment a revert runs in (#97), when yodel.config.ts waves names it. */
|
|
6
|
+
export interface RevertWave {
|
|
7
|
+
/** The wave's gate policy, as the base commit has it. */
|
|
8
|
+
gate: WaveGate;
|
|
9
|
+
base: string;
|
|
10
|
+
/** The revert's statements the wave's gate counts as destructive (what on-destructive waits on). */
|
|
11
|
+
destructiveSteps: DestructiveStep[];
|
|
12
|
+
/** Whether the wave's gate policy asks for an approval of this revert. The revert waits at the migrations Op's gate either way. */
|
|
13
|
+
policyWaits: boolean;
|
|
14
|
+
}
|
|
15
|
+
/** What the wave gate `gate` makes of the revert `plan`: the statements it counts as destructive, the way a wave plan counts a migration's steps, and whether it asks for an approval. */
|
|
16
|
+
export declare function revertWaveOf(gate: WaveGate, base: string, dialect: "clickhouse" | "postgres", plan: RevertPlan): RevertWave;
|
|
17
|
+
/** The revert as JSON (schemas/revert.schema.json), with what happened. */
|
|
18
|
+
export declare function revertJson(plan: RevertPlan, digest: string, outcome: Record<string, unknown>): Record<string, unknown>;
|
|
19
|
+
/** `yodel revert <env> <id>`; the exit codes are in `help`. */
|
|
20
|
+
export declare const revert: Command;
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import { resolve } from "node:path";
|
|
2
|
+
import { parseArgs } from "node:util";
|
|
3
|
+
import { guarded } from "../env-args.js";
|
|
4
|
+
import { loadProject, resolveEnvironment, YodelError } from "../project.js";
|
|
5
|
+
import { GATED } from "../chant/apply.js";
|
|
6
|
+
import { runnable } from "../chant/runnable.js";
|
|
7
|
+
import { LOCK_WAIT_ENV, parseDuration } from "../config/settings.js";
|
|
8
|
+
import { MIGRATION_ID } from "../migrations/index.js";
|
|
9
|
+
import { describeServer } from "../server.js";
|
|
10
|
+
import { policyAtBase } from "../config/base.js";
|
|
11
|
+
import { EXIT_REFUSED } from "../exit.js";
|
|
12
|
+
import { destructiveSteps, gateAtBase } from "../waves/index.js";
|
|
13
|
+
import { closeVersioned, currentRevert, describeResults, findMigrateOp, gitLedger, judgeRevert, openVersioned, policyRefusal, readChain, readRevertStep, renderStatus, runMigrateOp, statusReport, } from "../versioned/index.js";
|
|
14
|
+
const usage = "usage: yodel revert <env> <id> [--step <file>] [--dry-run] [--json] [--op <name>] [--lock-wait <duration>] [--dir <project>]";
|
|
15
|
+
const help = `${usage}
|
|
16
|
+
|
|
17
|
+
Undoes migration <id> in <env>: plans the statements that take the schema
|
|
18
|
+
from <id>'s recorded schema back to its parent's (an empty schema for the
|
|
19
|
+
first migration), offline, from migration.json alone. Only the newest
|
|
20
|
+
migration applied in <env> can be reverted; a later one was written against
|
|
21
|
+
it. <env> and <id> may come in either order.
|
|
22
|
+
|
|
23
|
+
The revert runs through the environment's migrations Op, as yodel apply
|
|
24
|
+
does: its Plan step prints the revert's digest (the statements, the history
|
|
25
|
+
and the live schema), its gate binds the approval to that digest, and its
|
|
26
|
+
Apply step plans the revert again under the lock, refuses if the digest
|
|
27
|
+
moved, and runs it. A run that stops at the gate prints the chant approve
|
|
28
|
+
command; approve, then run yodel revert again. The history gets a revert row
|
|
29
|
+
for each statement and a migration row reverted: <id> is then pending
|
|
30
|
+
again, and yodel status shows it reverted. Delete it, or rewrite it with
|
|
31
|
+
yodel new --replace, before the next yodel apply, which would apply it
|
|
32
|
+
again.
|
|
33
|
+
|
|
34
|
+
The policy in yodel.config.ts (policy.rules), as the base commit has it, is
|
|
35
|
+
judged over the revert's statements before the gate, and again under the
|
|
36
|
+
lock: a rule that refuses drops refuses a revert that drops what the
|
|
37
|
+
migration added (exit 4), unless an override is recorded for the revert's
|
|
38
|
+
digest (yodel override <env> --revert <id> --rule <rule> --reason <why>).
|
|
39
|
+
In an environment yodel.config.ts waves names, the revert waits at the
|
|
40
|
+
migrations Op's gate whatever the wave's gate policy: under on-destructive,
|
|
41
|
+
a destructive revert waits for an approval, and so does any other.
|
|
42
|
+
|
|
43
|
+
Statements carry the schema back, never data. A migration with a data step
|
|
44
|
+
(a backfill) is refused unless --step names a file of statements that undo
|
|
45
|
+
it, each ending with ; at the end of a line; they run before the reverse
|
|
46
|
+
statements, and are in the digest. A reverse that needs an Op or a manual
|
|
47
|
+
step is refused: write it as a new migration.
|
|
48
|
+
|
|
49
|
+
Options:
|
|
50
|
+
--step <file> a hand-written revert step: SQL that undoes the
|
|
51
|
+
migration's data step (relative to the project directory)
|
|
52
|
+
--dry-run print the revert's statements and digest; run nothing
|
|
53
|
+
--json print the outcome as JSON
|
|
54
|
+
--op <name> the Op to run, when more than one applies <env>
|
|
55
|
+
--lock-wait <d> when another apply holds the lock, wait up to <d> for it
|
|
56
|
+
-C, --dir <dir> the project directory (default: the working directory)
|
|
57
|
+
|
|
58
|
+
Exit codes:
|
|
59
|
+
0 reverted, or (--dry-run) planned
|
|
60
|
+
2 refused, nothing reverted: the migration has a data step and no --step,
|
|
61
|
+
or the reverse needs an Op or a manual step
|
|
62
|
+
3 stopped at the gate, waiting for approval of this revert
|
|
63
|
+
4 refused, nothing reverted: <id> is not applied in <env>, a migration
|
|
64
|
+
after it is, the history does not match the migrations directory, or
|
|
65
|
+
a policy rule denies the revert and no override is recorded for its
|
|
66
|
+
digest
|
|
67
|
+
5 another apply holds the lock
|
|
68
|
+
1 anything else failed: a statement (the history records where; rerun to
|
|
69
|
+
resume), a revert whose plan moved since approval, a bad config
|
|
70
|
+
`;
|
|
71
|
+
function parseRevertArgs(args) {
|
|
72
|
+
let parsed;
|
|
73
|
+
try {
|
|
74
|
+
parsed = parseArgs({
|
|
75
|
+
args,
|
|
76
|
+
allowPositionals: true,
|
|
77
|
+
strict: true,
|
|
78
|
+
options: {
|
|
79
|
+
step: { type: "string" },
|
|
80
|
+
"dry-run": { type: "boolean" },
|
|
81
|
+
json: { type: "boolean" },
|
|
82
|
+
op: { type: "string" },
|
|
83
|
+
"lock-wait": { type: "string" },
|
|
84
|
+
dir: { type: "string", short: "C" },
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
catch (e) {
|
|
89
|
+
throw new YodelError(`${e instanceof Error ? e.message : String(e)}\n${usage}`);
|
|
90
|
+
}
|
|
91
|
+
const { values, positionals } = parsed;
|
|
92
|
+
if (positionals.length !== 2)
|
|
93
|
+
throw new YodelError(usage);
|
|
94
|
+
const [first = "", second = ""] = positionals;
|
|
95
|
+
// The migration is the one named like an id; the other is the environment.
|
|
96
|
+
const [id, env] = MIGRATION_ID.test(first) && !MIGRATION_ID.test(second) ? [first, second] : [second, first];
|
|
97
|
+
const str = (k) => (typeof values[k] === "string" ? values[k] : undefined);
|
|
98
|
+
return {
|
|
99
|
+
env,
|
|
100
|
+
id,
|
|
101
|
+
step: str("step"),
|
|
102
|
+
dryRun: values["dry-run"] === true,
|
|
103
|
+
json: values.json === true,
|
|
104
|
+
op: str("op"),
|
|
105
|
+
lockWaitMs: typeof values["lock-wait"] === "string" ? parseDuration(values["lock-wait"], "--lock-wait") : undefined,
|
|
106
|
+
dir: str("dir") ?? process.cwd(),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/** What the wave gate `gate` makes of the revert `plan`: the statements it counts as destructive, the way a wave plan counts a migration's steps, and whether it asks for an approval. */
|
|
110
|
+
export function revertWaveOf(gate, base, dialect, plan) {
|
|
111
|
+
const steps = destructiveSteps(dialect, [{ id: plan.migration.id, migration: { document: { ...plan.migration.document, steps: plan.statements.map((s) => s.step) } } }]);
|
|
112
|
+
return { gate, base, destructiveSteps: steps, policyWaits: plan.statements.length > 0 && (gate === "always" || (gate === "on-destructive" && steps.length > 0)) };
|
|
113
|
+
}
|
|
114
|
+
/** `env`'s wave gate at the base commit for the revert `plan`, or undefined when no wave names `env`. */
|
|
115
|
+
async function revertWave(project, env, plan) {
|
|
116
|
+
if (!(project.yodel?.config.waves ?? []).some((w) => w.env === env))
|
|
117
|
+
return undefined;
|
|
118
|
+
const { gate, at } = await gateAtBase(project, env);
|
|
119
|
+
return revertWaveOf(gate, at.sha, project.dialect === "postgres" ? "postgres" : "clickhouse", plan);
|
|
120
|
+
}
|
|
121
|
+
function describeWave(env, wave) {
|
|
122
|
+
const destructive = wave.destructiveSteps.length > 0 ? `destructive (${wave.destructiveSteps.map((d) => `statement ${String(d.step)}: ${d.why}`).join(", ")})` : "not destructive";
|
|
123
|
+
return `wave gate ${wave.gate} for ${env} at ${wave.base.slice(0, 12)}: the revert is ${destructive}; ${wave.policyWaits ? "it waits for an approval" : "the gate policy alone would let it through, and it waits at the migrations Op's gate all the same"}`;
|
|
124
|
+
}
|
|
125
|
+
/** The revert as JSON (schemas/revert.schema.json), with what happened. */
|
|
126
|
+
export function revertJson(plan, digest, outcome) {
|
|
127
|
+
return {
|
|
128
|
+
environment: plan.environment,
|
|
129
|
+
migration: plan.migration.id,
|
|
130
|
+
to: plan.to,
|
|
131
|
+
planDigest: digest,
|
|
132
|
+
statements: plan.statements.map((s, i) => ({ index: i, source: s.source, sql: s.step.sql, rule: s.step.rule, class: s.step.class, ...(s.step.destructive ? { destructive: true } : {}), done: plan.done.includes(i) })),
|
|
133
|
+
dataSteps: plan.dataSteps,
|
|
134
|
+
...(plan.step ? { step: { file: plan.step.file, sha: plan.step.sha, statements: plan.step.statements.length } } : {}),
|
|
135
|
+
...outcome,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
function renderPlan(plan, digest) {
|
|
139
|
+
const lines = [`Revert of ${plan.migration.id} in ${plan.environment}, back to ${plan.to ?? "an empty schema"}:`];
|
|
140
|
+
for (const [i, s] of plan.statements.entries()) {
|
|
141
|
+
const what = s.source === "step" ? `the revert step ${plan.step?.file ?? ""}` : `${s.step.rule} ${s.step.class}${s.step.destructive ? ", destructive" : ""}, ${s.step.name}`;
|
|
142
|
+
lines.push(` ${String(i)}: ${what}${plan.done.includes(i) ? " (succeeded in an earlier run; not sent again)" : ""}`, ` ${s.step.sql.split("\n").join("\n ")}`);
|
|
143
|
+
}
|
|
144
|
+
if (plan.statements.length === 0)
|
|
145
|
+
lines.push(" (no statement: the recorded schemas are the same)");
|
|
146
|
+
for (const d of plan.dataSteps)
|
|
147
|
+
lines.push(` data step ${d}: undone by the revert step`);
|
|
148
|
+
lines.push(`Plan digest: ${digest}`);
|
|
149
|
+
return `${lines.join("\n")}\n`;
|
|
150
|
+
}
|
|
151
|
+
/** `yodel revert <env> <id>`; the exit codes are in `help`. */
|
|
152
|
+
export const revert = {
|
|
153
|
+
name: "revert",
|
|
154
|
+
summary: "undo the newest applied migration from its recorded schemas",
|
|
155
|
+
implemented: true,
|
|
156
|
+
run: (args, io) => guarded("revert", io, args, help, () => run(parseRevertArgs(args), io)),
|
|
157
|
+
};
|
|
158
|
+
async function run(a, io) {
|
|
159
|
+
const project = await loadProject(a.dir);
|
|
160
|
+
const env = resolveEnvironment(project, a.env);
|
|
161
|
+
const ordered = readChain(project);
|
|
162
|
+
const step = a.step !== undefined ? readRevertStep(a.step, project.dir) : undefined;
|
|
163
|
+
const venv = await openVersioned(project, env);
|
|
164
|
+
try {
|
|
165
|
+
const { plan, digest } = await currentRevert(venv, ordered, a.id, step);
|
|
166
|
+
// The policy (#53) over the revert (#97), as the base commit has it (#73), with the overrides recorded for this revert's digest.
|
|
167
|
+
const basePolicy = await policyAtBase(project);
|
|
168
|
+
if (basePolicy.note && !a.json)
|
|
169
|
+
io.err(`${basePolicy.note}\n`);
|
|
170
|
+
const op = a.dryRun ? undefined : await findMigrateOp(project, env, a.op);
|
|
171
|
+
const policy = await judgeRevert({
|
|
172
|
+
policy: basePolicy.policy,
|
|
173
|
+
environment: env.name,
|
|
174
|
+
dialect: project.dialect,
|
|
175
|
+
plan,
|
|
176
|
+
digest,
|
|
177
|
+
ledger: async () => {
|
|
178
|
+
try {
|
|
179
|
+
return { port: await gitLedger(project.dir), op: op ?? (await findMigrateOp(project, env, a.op)) };
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
return undefined;
|
|
183
|
+
}
|
|
184
|
+
},
|
|
185
|
+
});
|
|
186
|
+
const wave = await revertWave(project, env.name, plan);
|
|
187
|
+
const extra = { ...(policy.length > 0 ? { policy } : {}), ...(wave ? { wave } : {}) };
|
|
188
|
+
const emit = (outcome, code) => {
|
|
189
|
+
if (a.json)
|
|
190
|
+
io.out(`${JSON.stringify(revertJson(plan, digest, { ...outcome, ...extra }), null, 2)}\n`);
|
|
191
|
+
return code;
|
|
192
|
+
};
|
|
193
|
+
if (!a.json) {
|
|
194
|
+
io.out(renderPlan(plan, digest));
|
|
195
|
+
for (const line of describeResults(policy))
|
|
196
|
+
io.out(`${line}\n`);
|
|
197
|
+
if (wave)
|
|
198
|
+
io.out(`${describeWave(env.name, wave)}\n`);
|
|
199
|
+
}
|
|
200
|
+
if (a.dryRun || !op)
|
|
201
|
+
return emit({ status: "planned" }, 0);
|
|
202
|
+
const denied = policyRefusal(policy, env.name, digest, "before the gate", { id: plan.migration.id, step: a.step });
|
|
203
|
+
if (denied) {
|
|
204
|
+
if (!a.json)
|
|
205
|
+
io.err(`yodel revert: ${denied.message}\n`);
|
|
206
|
+
return emit({ status: "denied" }, EXIT_REFUSED);
|
|
207
|
+
}
|
|
208
|
+
if (!a.json)
|
|
209
|
+
io.out(`\nRunning ${op.name} (${op.filePath}) to revert ${plan.migration.id}\n`);
|
|
210
|
+
const childEnv = { ...process.env, ...(a.lockWaitMs !== undefined ? { [LOCK_WAIT_ENV]: `${String(a.lockWaitMs)}ms` } : {}) };
|
|
211
|
+
const ran = await runMigrateOp(project, op, {
|
|
212
|
+
allowOutOfOrder: false,
|
|
213
|
+
env: childEnv,
|
|
214
|
+
revert: { id: plan.migration.id, ...(a.step !== undefined ? { step: resolve(project.dir, a.step) } : {}) },
|
|
215
|
+
onOutput: (t) => { io.err(t); },
|
|
216
|
+
});
|
|
217
|
+
if (ran.status === "gated") {
|
|
218
|
+
if (!a.json) {
|
|
219
|
+
io.out(`\n${op.name} is waiting at gate "${op.gate}" for approval of this revert${ran.planDigest ? ` (${ran.planDigest})` : ""}.\n`);
|
|
220
|
+
if (ran.approve)
|
|
221
|
+
io.out(`Approve it with:\n ${runnable(ran.approve, project.dir)}\nthen run ${runnable(`yodel revert ${env.name} ${plan.migration.id}${a.step !== undefined ? ` --step ${a.step}` : ""}`, project.dir)} again.\n`);
|
|
222
|
+
}
|
|
223
|
+
return emit({ status: "gated", op: op.name, gate: op.gate, ...(ran.approve ? { approve: ran.approve } : {}), ...(ran.planDigest ? { gatePlanDigest: ran.planDigest } : {}) }, GATED);
|
|
224
|
+
}
|
|
225
|
+
if (ran.status === "failed") {
|
|
226
|
+
const code = ran.stepExit !== undefined && ran.stepExit !== 0 ? ran.stepExit : 1;
|
|
227
|
+
if (!a.json)
|
|
228
|
+
io.err(`yodel revert: chant run ${op.name} failed (exit ${String(ran.code)})${ran.stepExit ? `: its Apply step exited ${String(ran.stepExit)}` : ""}\n`);
|
|
229
|
+
return emit({ status: "failed", op: op.name, exitCode: code }, code);
|
|
230
|
+
}
|
|
231
|
+
const after = await statusReport(venv, ordered);
|
|
232
|
+
const reverted = after.status.pending.find((p) => p.id === plan.migration.id)?.reverted !== undefined;
|
|
233
|
+
if (!reverted) {
|
|
234
|
+
if (!a.json)
|
|
235
|
+
io.err(`yodel revert: ${op.name} completed, but ${env.name}'s history does not record ${plan.migration.id} reverted\n`);
|
|
236
|
+
return emit({ status: "failed", op: op.name, exitCode: 1 }, 1);
|
|
237
|
+
}
|
|
238
|
+
if (!a.json)
|
|
239
|
+
io.out(`\nReverted ${plan.migration.id} in ${env.name}${after.server ? ` (${describeServer(after.server)})` : ""}, back to ${plan.to ?? "an empty schema"}.\n\n${renderStatus(after)}`);
|
|
240
|
+
return emit({ status: "reverted", op: op.name }, 0);
|
|
241
|
+
}
|
|
242
|
+
finally {
|
|
243
|
+
await closeVersioned(venv);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=revert.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"revert.js","sourceRoot":"","sources":["../../src/commands/revert.ts"],"names":[],"mappings":"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"}
|