@intentius/sql-yodeler 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (194) hide show
  1. package/README.md +3 -3
  2. package/dist/chant/build.js +7 -0
  3. package/dist/chant/build.js.map +1 -1
  4. package/dist/ci/render.d.ts +289 -0
  5. package/dist/ci/render.js +688 -0
  6. package/dist/ci/render.js.map +1 -0
  7. package/dist/ci/replay.d.ts +17 -0
  8. package/dist/ci/replay.js +69 -0
  9. package/dist/ci/replay.js.map +1 -0
  10. package/dist/commands/apply.d.ts +113 -0
  11. package/dist/commands/apply.js +228 -21
  12. package/dist/commands/apply.js.map +1 -1
  13. package/dist/commands/approve.js +44 -0
  14. package/dist/commands/approve.js.map +1 -1
  15. package/dist/commands/checkpoint.d.ts +3 -0
  16. package/dist/commands/checkpoint.js +78 -0
  17. package/dist/commands/checkpoint.js.map +1 -0
  18. package/dist/commands/ci.d.ts +3 -0
  19. package/dist/commands/ci.js +118 -0
  20. package/dist/commands/ci.js.map +1 -0
  21. package/dist/commands/docs.d.ts +11 -0
  22. package/dist/commands/docs.js +108 -0
  23. package/dist/commands/docs.js.map +1 -0
  24. package/dist/commands/drift.d.ts +13 -1
  25. package/dist/commands/drift.js +18 -2
  26. package/dist/commands/drift.js.map +1 -1
  27. package/dist/commands/index.js +10 -0
  28. package/dist/commands/index.js.map +1 -1
  29. package/dist/commands/init.js +1 -1
  30. package/dist/commands/init.js.map +1 -1
  31. package/dist/commands/lint.js +11 -3
  32. package/dist/commands/lint.js.map +1 -1
  33. package/dist/commands/override.js +48 -16
  34. package/dist/commands/override.js.map +1 -1
  35. package/dist/commands/plan.js +5 -1
  36. package/dist/commands/plan.js.map +1 -1
  37. package/dist/commands/report.d.ts +13 -0
  38. package/dist/commands/report.js +121 -0
  39. package/dist/commands/report.js.map +1 -0
  40. package/dist/commands/revert.d.ts +20 -0
  41. package/dist/commands/revert.js +246 -0
  42. package/dist/commands/revert.js.map +1 -0
  43. package/dist/commands/status.js +32 -5
  44. package/dist/commands/status.js.map +1 -1
  45. package/dist/config/base.d.ts +69 -0
  46. package/dist/config/base.js +121 -0
  47. package/dist/config/base.js.map +1 -0
  48. package/dist/config/define.d.ts +123 -1
  49. package/dist/config/define.js +2 -0
  50. package/dist/config/define.js.map +1 -1
  51. package/dist/config/index.d.ts +2 -0
  52. package/dist/config/index.js +2 -0
  53. package/dist/config/index.js.map +1 -1
  54. package/dist/config/load.d.ts +1 -1
  55. package/dist/config/load.js +90 -5
  56. package/dist/config/load.js.map +1 -1
  57. package/dist/config/settings.d.ts +4 -1
  58. package/dist/config/settings.js +8 -2
  59. package/dist/config/settings.js.map +1 -1
  60. package/dist/exit.js +1 -1
  61. package/dist/exit.js.map +1 -1
  62. package/dist/history/postgres/ddl.d.ts +18 -0
  63. package/dist/history/postgres/ddl.js +27 -2
  64. package/dist/history/postgres/ddl.js.map +1 -1
  65. package/dist/history/postgres/store.d.ts +2 -0
  66. package/dist/history/postgres/store.js +7 -1
  67. package/dist/history/postgres/store.js.map +1 -1
  68. package/dist/history/rows.d.ts +16 -3
  69. package/dist/history/rows.js +30 -1
  70. package/dist/history/rows.js.map +1 -1
  71. package/dist/history/store.d.ts +2 -0
  72. package/dist/history/store.js +2 -2
  73. package/dist/history/store.js.map +1 -1
  74. package/dist/index.d.ts +4 -1
  75. package/dist/index.js +1 -0
  76. package/dist/index.js.map +1 -1
  77. package/dist/lint/check.js +17 -2
  78. package/dist/lint/check.js.map +1 -1
  79. package/dist/lint/report.js +1 -1
  80. package/dist/lint/report.js.map +1 -1
  81. package/dist/lint/routines.d.ts +26 -0
  82. package/dist/lint/routines.js +65 -0
  83. package/dist/lint/routines.js.map +1 -0
  84. package/dist/lint/rules.d.ts +16 -4
  85. package/dist/lint/rules.js +9 -4
  86. package/dist/lint/rules.js.map +1 -1
  87. package/dist/mcp/tools.d.ts +1 -1
  88. package/dist/mcp/tools.js +1 -1
  89. package/dist/mcp/tools.js.map +1 -1
  90. package/dist/migrations/checkpoint.d.ts +45 -0
  91. package/dist/migrations/checkpoint.js +110 -0
  92. package/dist/migrations/checkpoint.js.map +1 -0
  93. package/dist/migrations/create.js +2 -0
  94. package/dist/migrations/create.js.map +1 -1
  95. package/dist/migrations/document.d.ts +10 -0
  96. package/dist/migrations/document.js +1 -0
  97. package/dist/migrations/document.js.map +1 -1
  98. package/dist/migrations/index.d.ts +2 -0
  99. package/dist/migrations/index.js +2 -0
  100. package/dist/migrations/index.js.map +1 -1
  101. package/dist/migrations/routines.d.ts +31 -0
  102. package/dist/migrations/routines.js +55 -0
  103. package/dist/migrations/routines.js.map +1 -0
  104. package/dist/notify/index.d.ts +124 -0
  105. package/dist/notify/index.js +210 -0
  106. package/dist/notify/index.js.map +1 -0
  107. package/dist/notify/verify.d.ts +53 -0
  108. package/dist/notify/verify.js +71 -0
  109. package/dist/notify/verify.js.map +1 -0
  110. package/dist/pr/model.d.ts +3 -0
  111. package/dist/pr/model.js +16 -2
  112. package/dist/pr/model.js.map +1 -1
  113. package/dist/pr/render.js +27 -1
  114. package/dist/pr/render.js.map +1 -1
  115. package/dist/project.d.ts +19 -2
  116. package/dist/project.js +33 -1
  117. package/dist/project.js.map +1 -1
  118. package/dist/replay/replay.d.ts +9 -1
  119. package/dist/replay/replay.js +62 -31
  120. package/dist/replay/replay.js.map +1 -1
  121. package/dist/replay/report.js +1 -1
  122. package/dist/replay/report.js.map +1 -1
  123. package/dist/report/audit.d.ts +138 -0
  124. package/dist/report/audit.js +202 -0
  125. package/dist/report/audit.js.map +1 -0
  126. package/dist/report/jsonl.d.ts +21 -0
  127. package/dist/report/jsonl.js +52 -0
  128. package/dist/report/jsonl.js.map +1 -0
  129. package/dist/report/model.d.ts +68 -0
  130. package/dist/report/model.js +127 -0
  131. package/dist/report/model.js.map +1 -0
  132. package/dist/report/render.d.ts +18 -0
  133. package/dist/report/render.js +127 -0
  134. package/dist/report/render.js.map +1 -0
  135. package/dist/schema-docs/render.d.ts +49 -0
  136. package/dist/schema-docs/render.js +359 -0
  137. package/dist/schema-docs/render.js.map +1 -0
  138. package/dist/schemas.d.ts +5 -2
  139. package/dist/schemas.js +5 -2
  140. package/dist/schemas.js.map +1 -1
  141. package/dist/sources/ddl.d.ts +53 -0
  142. package/dist/sources/ddl.js +347 -0
  143. package/dist/sources/ddl.js.map +1 -0
  144. package/dist/sources/index.d.ts +69 -0
  145. package/dist/sources/index.js +170 -0
  146. package/dist/sources/index.js.map +1 -0
  147. package/dist/steps/postgres-migration.d.ts +35 -25
  148. package/dist/steps/postgres-migration.js +42 -29
  149. package/dist/steps/postgres-migration.js.map +1 -1
  150. package/dist/tenants/index.d.ts +40 -0
  151. package/dist/tenants/index.js +122 -0
  152. package/dist/tenants/index.js.map +1 -0
  153. package/dist/tenants/target.d.ts +23 -0
  154. package/dist/tenants/target.js +29 -0
  155. package/dist/tenants/target.js.map +1 -0
  156. package/dist/versioned/engine.d.ts +6 -0
  157. package/dist/versioned/engine.js +12 -2
  158. package/dist/versioned/engine.js.map +1 -1
  159. package/dist/versioned/index.d.ts +1 -0
  160. package/dist/versioned/index.js +1 -0
  161. package/dist/versioned/index.js.map +1 -1
  162. package/dist/versioned/op.d.ts +6 -1
  163. package/dist/versioned/op.js +7 -2
  164. package/dist/versioned/op.js.map +1 -1
  165. package/dist/versioned/policy.d.ts +33 -2
  166. package/dist/versioned/policy.js +59 -8
  167. package/dist/versioned/policy.js.map +1 -1
  168. package/dist/versioned/report.js +9 -0
  169. package/dist/versioned/report.js.map +1 -1
  170. package/dist/versioned/revert.d.ts +128 -0
  171. package/dist/versioned/revert.js +251 -0
  172. package/dist/versioned/revert.js.map +1 -0
  173. package/dist/versioned/state.d.ts +25 -0
  174. package/dist/versioned/state.js +36 -3
  175. package/dist/versioned/state.js.map +1 -1
  176. package/dist/waves/index.d.ts +179 -0
  177. package/dist/waves/index.js +268 -0
  178. package/dist/waves/index.js.map +1 -0
  179. package/dist/waves/promotion.d.ts +56 -0
  180. package/dist/waves/promotion.js +108 -0
  181. package/dist/waves/promotion.js.map +1 -0
  182. package/dist/waves/record.d.ts +24 -0
  183. package/dist/waves/record.js +20 -0
  184. package/dist/waves/record.js.map +1 -0
  185. package/package.json +11 -7
  186. package/schemas/apply.schema.json +162 -3
  187. package/schemas/checkpoint.schema.json +19 -0
  188. package/schemas/drift.schema.json +26 -1
  189. package/schemas/event.schema.json +36 -0
  190. package/schemas/lint.schema.json +4 -0
  191. package/schemas/plan.schema.json +118 -0
  192. package/schemas/report.schema.json +114 -0
  193. package/schemas/revert.schema.json +69 -0
  194. package/schemas/status.schema.json +64 -3
@@ -0,0 +1,128 @@
1
+ /**
2
+ * `yodel revert` (#55): undoing an applied migration from its recorded
3
+ * schemas, through the same plan, gate and history as `yodel apply`.
4
+ *
5
+ * A migration records the schema after it, and its parent records the
6
+ * schema before it, so the reverse is planned offline: chant's
7
+ * `diffStatements` from the migration's recorded schema to its parent's
8
+ * (an empty schema for the first migration). Only the newest migration
9
+ * applied in the environment can be reverted, since a later one was
10
+ * written against it.
11
+ *
12
+ * Statements carry the schema back, never the data. A migration with a
13
+ * data step (a backfill) is refused unless a hand-written revert step is
14
+ * given (`--step <file>`): SQL statements, each ending with `;` at the end
15
+ * of a line, that undo what the data step did. They run first, before the
16
+ * reverse statements, as the migration ran its data step after the
17
+ * statements it needed. A reverse that needs an Op or a manual step (a
18
+ * ClickHouse sort-key change back, a Postgres rename back) is refused:
19
+ * write it as a new migration.
20
+ *
21
+ * The run goes through the project's migrations Op (`./op.ts`), with the
22
+ * migration and the step's file in `YODEL_REVERT` and `YODEL_REVERT_STEP`:
23
+ * its Plan step (`yodel apply <env> --digest`) prints the revert's digest,
24
+ * the gate binds the approval to it, and its Apply step (`yodel apply <env>
25
+ * --execute`) takes the lock, plans the revert again, refuses if the digest
26
+ * moved, checks the approval in chant's gate ledger, and runs it. The
27
+ * history gets a `revert` row for each statement as it starts, succeeds or
28
+ * fails, then a migration row `reverted` (`../history/rows.ts`): the
29
+ * migration is pending again, and `yodel status` shows it reverted.
30
+ */
31
+ import { type StatementStep } from "@intentius/chant-lexicon-sql/migration-statements";
32
+ import { YodelError } from "../project.js";
33
+ import { type Migration } from "../migrations/index.js";
34
+ import { type HistoryState } from "../history/index.js";
35
+ import { type VersionedEnv } from "./engine.js";
36
+ import type { VersionedStatus } from "./state.js";
37
+ import type { PolicyOverride } from "./policy.js";
38
+ /** The migration `yodel apply --digest` and `--execute` revert instead of applying, set by `yodel revert` for its Op run. */
39
+ export declare const REVERT_ENV = "YODEL_REVERT";
40
+ /** The hand-written revert step's file, absolute, set with {@link REVERT_ENV}. */
41
+ export declare const REVERT_STEP_ENV = "YODEL_REVERT_STEP";
42
+ /** chant's plan-digest kind for a revert: a revert's digest is never an apply's. */
43
+ export declare const REVERT_DIGEST_KIND = "yodel-revert";
44
+ /** A hand-written revert step: its file and the statements in it. */
45
+ export interface RevertStepFile {
46
+ /** As given; for messages. */
47
+ file: string;
48
+ /** `sha256:<hex>` of its text. */
49
+ sha: string;
50
+ statements: string[];
51
+ }
52
+ /** The statements of a SQL file: each ends with `;` at the end of a line; `--` comment lines and blank ones between them are dropped. */
53
+ export declare function splitStatements(text: string): string[];
54
+ /** Reads a hand-written revert step, relative to `dir`. */
55
+ export declare function readRevertStep(path: string, dir: string): RevertStepFile;
56
+ /** One statement of a revert, in the order it runs. */
57
+ export interface RevertStatement {
58
+ /** `step`: from the hand-written revert step. `reverse`: diffed from the recorded schemas. */
59
+ source: "step" | "reverse";
60
+ step: StatementStep;
61
+ }
62
+ export interface RevertPlan {
63
+ environment: string;
64
+ migration: Migration;
65
+ /** The migration it goes back to, or `null` for none (the first migration reverted). */
66
+ to: string | null;
67
+ /** The checksum the history recorded when it was applied. */
68
+ checksum: string;
69
+ statements: RevertStatement[];
70
+ /** The migration's data steps, which the hand-written step undoes. */
71
+ dataSteps: string[];
72
+ step?: RevertStepFile;
73
+ /** The indexes in {@link statements} that already succeeded: a revert that failed part way resumes. */
74
+ done: number[];
75
+ }
76
+ /**
77
+ * The revert of migration `id` in an environment whose status is `status`,
78
+ * or a YodelError: exit 1 for no such migration, 4 when the history does not
79
+ * match the directory, the migration is not applied, or one after it is;
80
+ * 2 when the reverse needs a step revert does not run, or the migration has
81
+ * a data step and no hand-written revert step is given.
82
+ */
83
+ export declare function planRevert(input: {
84
+ environment: string;
85
+ ordered: readonly Migration[];
86
+ status: VersionedStatus;
87
+ state: HistoryState;
88
+ id: string;
89
+ step?: RevertStepFile | undefined;
90
+ }): RevertPlan;
91
+ /** The revert's plan digest: what it runs, what it starts from and the live schema, as chant computes digests. */
92
+ export declare function revertDigest(venv: VersionedEnv, status: VersionedStatus, plan: RevertPlan): Promise<string>;
93
+ /** Plans the revert from the history as it is now, with its digest. Reads only; takes no lock. */
94
+ export declare function currentRevert(venv: VersionedEnv, ordered: readonly Migration[], id: string, step?: RevertStepFile): Promise<{
95
+ plan: RevertPlan;
96
+ digest: string;
97
+ status: VersionedStatus;
98
+ }>;
99
+ export declare class RevertFailed extends YodelError {
100
+ readonly migration: string;
101
+ readonly statement: number;
102
+ readonly serverError: string;
103
+ constructor(migration: string, statement: number, serverError: string);
104
+ }
105
+ export interface ExecuteRevertOptions {
106
+ id: string;
107
+ step?: RevertStepFile | undefined;
108
+ /** The digest the Op's gate passed. A revert whose digest moved since is refused. */
109
+ approvedDigest: string;
110
+ /** Checks the approval for the digest computed under the lock; throws to refuse. */
111
+ approve: (digest: string) => Promise<unknown>;
112
+ /**
113
+ * Judges the policy (#53, #97) over the revert for the digest computed
114
+ * under the lock; throws to refuse. Resolves to the overrides it relied
115
+ * on, which the `reverted` row records. Absent: no policy.
116
+ */
117
+ policy?: (digest: string, plan: RevertPlan) => Promise<PolicyOverride[]>;
118
+ log: (line: string) => void;
119
+ processEnv?: NodeJS.ProcessEnv;
120
+ lockWaitMs?: number;
121
+ }
122
+ /** Runs the revert under the lock, after planning it again and checking its digest and approval. Returns the plan run. */
123
+ export declare function executeRevert(venv: VersionedEnv, ordered: readonly Migration[], options: ExecuteRevertOptions): Promise<RevertPlan>;
124
+ /** The revert `yodel apply --digest` or `--execute` runs instead, when `yodel revert` started the Op run. */
125
+ export declare function revertFromEnv(env: NodeJS.ProcessEnv, dir: string): {
126
+ id: string;
127
+ step?: RevertStepFile;
128
+ } | undefined;
@@ -0,0 +1,251 @@
1
+ /**
2
+ * `yodel revert` (#55): undoing an applied migration from its recorded
3
+ * schemas, through the same plan, gate and history as `yodel apply`.
4
+ *
5
+ * A migration records the schema after it, and its parent records the
6
+ * schema before it, so the reverse is planned offline: chant's
7
+ * `diffStatements` from the migration's recorded schema to its parent's
8
+ * (an empty schema for the first migration). Only the newest migration
9
+ * applied in the environment can be reverted, since a later one was
10
+ * written against it.
11
+ *
12
+ * Statements carry the schema back, never the data. A migration with a
13
+ * data step (a backfill) is refused unless a hand-written revert step is
14
+ * given (`--step <file>`): SQL statements, each ending with `;` at the end
15
+ * of a line, that undo what the data step did. They run first, before the
16
+ * reverse statements, as the migration ran its data step after the
17
+ * statements it needed. A reverse that needs an Op or a manual step (a
18
+ * ClickHouse sort-key change back, a Postgres rename back) is refused:
19
+ * write it as a new migration.
20
+ *
21
+ * The run goes through the project's migrations Op (`./op.ts`), with the
22
+ * migration and the step's file in `YODEL_REVERT` and `YODEL_REVERT_STEP`:
23
+ * its Plan step (`yodel apply <env> --digest`) prints the revert's digest,
24
+ * the gate binds the approval to it, and its Apply step (`yodel apply <env>
25
+ * --execute`) takes the lock, plans the revert again, refuses if the digest
26
+ * moved, checks the approval in chant's gate ledger, and runs it. The
27
+ * history gets a `revert` row for each statement as it starts, succeeds or
28
+ * fails, then a migration row `reverted` (`../history/rows.ts`): the
29
+ * migration is pending again, and `yodel status` shows it reverted.
30
+ */
31
+ import { createHash } from "node:crypto";
32
+ import { readFileSync } from "node:fs";
33
+ import { resolve } from "node:path";
34
+ import { diffStatements } from "@intentius/chant-lexicon-sql/migration-statements";
35
+ import { YodelError } from "../project.js";
36
+ import { EXIT_NEEDS_OP, EXIT_REFUSED } from "../exit.js";
37
+ import { emptyBuild, isCheckpoint } from "../migrations/index.js";
38
+ import { asBackfill, describeStep } from "../steps/index.js";
39
+ import { HistoryRecorder, MIGRATION_ROW, newRunContext, statementSha, withLock, appliedBy } from "../history/index.js";
40
+ import { acquireWaiting, inspect } from "./engine.js";
41
+ import { sameDigest } from "./digest.js";
42
+ /** The migration `yodel apply --digest` and `--execute` revert instead of applying, set by `yodel revert` for its Op run. */
43
+ export const REVERT_ENV = "YODEL_REVERT";
44
+ /** The hand-written revert step's file, absolute, set with {@link REVERT_ENV}. */
45
+ export const REVERT_STEP_ENV = "YODEL_REVERT_STEP";
46
+ /** chant's plan-digest kind for a revert: a revert's digest is never an apply's. */
47
+ export const REVERT_DIGEST_KIND = "yodel-revert";
48
+ /** The statements of a SQL file: each ends with `;` at the end of a line; `--` comment lines and blank ones between them are dropped. */
49
+ export function splitStatements(text) {
50
+ const out = [];
51
+ let current = [];
52
+ for (const line of text.replace(/\r\n?/g, "\n").split("\n")) {
53
+ if (current.length === 0 && (/^\s*--/.test(line) || line.trim() === ""))
54
+ continue;
55
+ current.push(line);
56
+ if (/;\s*$/.test(line)) {
57
+ out.push(current.join("\n").replace(/;\s*$/, "").trim());
58
+ current = [];
59
+ }
60
+ }
61
+ const rest = current.join("\n").trim();
62
+ if (rest)
63
+ out.push(rest);
64
+ return out.filter((s) => s !== "");
65
+ }
66
+ /** Reads a hand-written revert step, relative to `dir`. */
67
+ export function readRevertStep(path, dir) {
68
+ let text;
69
+ try {
70
+ text = readFileSync(resolve(dir, path), "utf8");
71
+ }
72
+ catch (e) {
73
+ throw new YodelError(`--step ${path}: ${e instanceof Error ? e.message : String(e)}`);
74
+ }
75
+ const statements = splitStatements(text);
76
+ if (statements.length === 0)
77
+ throw new YodelError(`--step ${path} holds no statement`);
78
+ return { file: path, sha: `sha256:${createHash("sha256").update(text, "utf8").digest("hex")}`, statements };
79
+ }
80
+ /** A hand-written statement as a step the driver sends. */
81
+ function handStatement(sql, i, dialect) {
82
+ return {
83
+ kind: "statement",
84
+ object: "revert-step",
85
+ type: "revert-step",
86
+ name: `revert step statement ${String(i + 1)}`,
87
+ sql,
88
+ rule: "revert-step",
89
+ class: "data",
90
+ transactional: dialect === "postgres",
91
+ ...(dialect === "clickhouse" && /^\s*ALTER\s+TABLE\b[\s\S]*\b(UPDATE|DELETE)\b/i.test(sql) ? { waitsForMutation: true } : {}),
92
+ };
93
+ }
94
+ /**
95
+ * The revert of migration `id` in an environment whose status is `status`,
96
+ * or a YodelError: exit 1 for no such migration, 4 when the history does not
97
+ * match the directory, the migration is not applied, or one after it is;
98
+ * 2 when the reverse needs a step revert does not run, or the migration has
99
+ * a data step and no hand-written revert step is given.
100
+ */
101
+ export function planRevert(input) {
102
+ const { ordered, status, id, environment } = input;
103
+ const at = ordered.findIndex((m) => m.id === id);
104
+ const m = ordered[at];
105
+ if (!m)
106
+ throw new YodelError(`no migration ${id} in the migrations directory`);
107
+ if (status.mismatches.length > 0) {
108
+ throw new YodelError(`refused: the history does not match the migrations directory; nothing was reverted:\n${status.mismatches.map((x) => ` ${x.message}`).join("\n")}`, EXIT_REFUSED);
109
+ }
110
+ // Checkpoints (#63): one an environment started from has no schema before it there, and the migrations before it never ran there.
111
+ const skipped = status.skipped?.find((k) => k.id === id);
112
+ if (skipped) {
113
+ throw new YodelError(skipped.reason === "covered"
114
+ ? `refused: ${id} comes before the checkpoint ${skipped.checkpoint ?? ""}, which ${environment} started from: it never ran in ${environment}, so there is nothing to revert. Nothing was reverted.`
115
+ : `refused: ${id} is a checkpoint ${environment} skips, since it ran the migrations before it: it never ran in ${environment}, so there is nothing to revert. Nothing was reverted.`, EXIT_REFUSED);
116
+ }
117
+ if (isCheckpoint(m) && status.applied.some((a) => a.id === id)) {
118
+ throw new YodelError(`refused: ${id} is the checkpoint ${environment} started from: it created the whole schema, and ${environment} never ran the migrations before it, so there is no earlier schema to go back to. Nothing was reverted.`, EXIT_REFUSED);
119
+ }
120
+ const applied = status.applied.find((a) => a.id === id);
121
+ if (!applied)
122
+ throw new YodelError(`refused: ${id} is not applied in ${environment}, so there is nothing to revert. Nothing was reverted.`, EXIT_REFUSED);
123
+ const later = status.applied.filter((a) => a.index !== undefined && a.index > at).map((a) => a.id);
124
+ if (later.length > 0) {
125
+ throw new YodelError(`refused: ${later.join(", ")} ${later.length === 1 ? "is" : "are"} applied in ${environment} after ${id}, and ${later.length === 1 ? "was" : "were"} written against it; revert ${later.length === 1 ? "it" : "them"} first, newest first. Nothing was reverted.`, EXIT_REFUSED);
126
+ }
127
+ const parent = m.parent === null ? undefined : ordered.find((x) => x.id === m.parent);
128
+ const doc = m.document;
129
+ const before = parent?.document.schema ?? emptyBuild(doc.schema);
130
+ let steps;
131
+ try {
132
+ steps = diffStatements(doc.schema, before, {
133
+ ...(doc.defaultDatabase !== undefined ? { defaultDatabase: doc.defaultDatabase } : {}),
134
+ ...(doc.defaultSchema !== undefined ? { defaultSchema: doc.defaultSchema } : {}),
135
+ }).steps;
136
+ }
137
+ catch (e) {
138
+ throw new YodelError(`the reverse of ${id} cannot be planned from the recorded schemas: ${e instanceof Error ? e.message : String(e)}`);
139
+ }
140
+ const notStatements = steps.filter((s) => s.kind !== "statement");
141
+ if (notStatements.length > 0) {
142
+ throw new YodelError(`refused: going back from ${id} to ${parent?.id ?? "an empty schema"} takes a step yodel revert does not run (${notStatements.map((s) => describeStep(s)).join("; ")}); write the change as a new migration (yodel new). Nothing was reverted.`, EXIT_NEEDS_OP);
143
+ }
144
+ const dataSteps = doc.steps.flatMap((s, i) => (asBackfill(s) ? [`step ${String(i)}: ${describeStep(s)}`] : []));
145
+ if (dataSteps.length > 0 && !input.step) {
146
+ throw new YodelError(`refused: ${id} has a data step the recorded schemas cannot undo (${dataSteps.join("; ")}). Write the statements that undo it in a file and pass --step <file>; they run before the reverse statements. Nothing was reverted.`, EXIT_NEEDS_OP);
147
+ }
148
+ const statements = [
149
+ ...(input.step?.statements ?? []).map((sql, i) => ({ source: "step", step: handStatement(sql, i, doc.dialect) })),
150
+ ...steps.map((s) => ({ source: "reverse", step: s })),
151
+ ];
152
+ const rec = input.state.byId.get(id);
153
+ const done = statements.flatMap((s, i) => {
154
+ const r = rec?.reverts.get(i);
155
+ return r?.status === "succeeded" && r.sha === statementSha(s.step.sql) ? [i] : [];
156
+ });
157
+ return { environment, migration: m, to: parent?.id ?? null, checksum: applied.checksum, statements, dataSteps, ...(input.step ? { step: input.step } : {}), done };
158
+ }
159
+ /** The revert's plan digest: what it runs, what it starts from and the live schema, as chant computes digests. */
160
+ export async function revertDigest(venv, status, plan) {
161
+ const { computePlanDigest } = await import("@intentius/chant/lifecycle/plan-digest");
162
+ const live = await venv.driver.liveFingerprint();
163
+ return computePlanDigest(REVERT_DIGEST_KIND, {
164
+ environment: venv.environment,
165
+ historyDatabase: venv.location.database,
166
+ topology: venv.topology ?? { kind: "single" },
167
+ applied: status.applied.map((a) => ({ id: a.id, checksum: a.checksum })),
168
+ revert: { id: plan.migration.id, checksum: plan.checksum, to: plan.to, statements: plan.statements.map((s) => statementSha(s.step.sql)), step: plan.step?.sha ?? null, done: plan.done },
169
+ live,
170
+ });
171
+ }
172
+ /** Plans the revert from the history as it is now, with its digest. Reads only; takes no lock. */
173
+ export async function currentRevert(venv, ordered, id, step) {
174
+ const { state, status } = await inspect(venv, ordered);
175
+ const plan = planRevert({ environment: venv.environment, ordered, status, state, id, step });
176
+ return { plan, digest: await revertDigest(venv, status, plan), status };
177
+ }
178
+ export class RevertFailed extends YodelError {
179
+ migration;
180
+ statement;
181
+ serverError;
182
+ constructor(migration, statement, serverError) {
183
+ super(`the revert of ${migration} failed at its statement ${String(statement)}: ${serverError}\n` +
184
+ `Fix the cause, then run yodel revert again: it resumes at statement ${String(statement)} and never sends again the statements that succeeded. ${migration} is still applied.`, 1);
185
+ this.migration = migration;
186
+ this.statement = statement;
187
+ this.serverError = serverError;
188
+ this.name = "RevertFailed";
189
+ }
190
+ }
191
+ /** Runs the revert under the lock, after planning it again and checking its digest and approval. Returns the plan run. */
192
+ export async function executeRevert(venv, ordered, options) {
193
+ const got = await acquireWaiting(venv, appliedBy(options.processEnv), { waitMs: options.lockWaitMs ?? venv.lockWaitMs ?? 0, log: options.log });
194
+ if ("stoodDown" in got)
195
+ throw new YodelError("the revert stood down", 1);
196
+ const { lock } = got;
197
+ options.log(lock.notice ? `lock: ${lock.notice}` : `lock: held in ${lock.where}`);
198
+ return withLock(lock, venv.lockTtlMs, async (beat) => {
199
+ await venv.store.ensure();
200
+ await venv.store.allowRevert?.();
201
+ const { state, status } = await inspect(venv, ordered);
202
+ const plan = planRevert({ environment: venv.environment, ordered, status, state, id: options.id, step: options.step });
203
+ const digest = await revertDigest(venv, status, plan);
204
+ if (!(await sameDigest(digest, options.approvedDigest))) {
205
+ throw new YodelError(`refused: the revert's plan moved since it was approved (approved ${options.approvedDigest}, now ${digest}). Nothing was reverted; run yodel revert ${venv.environment} ${options.id} again and approve the new plan.`, 1);
206
+ }
207
+ await options.approve(digest);
208
+ // The policy, judged again under the lock for the digest computed here: a denial with no override for it refuses.
209
+ const overrides = options.policy ? await options.policy(digest, plan) : [];
210
+ const m = plan.migration;
211
+ const recorder = new HistoryRecorder(venv.store, newRunContext(options.approvedDigest, options.processEnv), state.maxSeq);
212
+ const base = { migration_id: m.id, parent: m.parent ?? "", checksum: plan.checksum, silences: "[]" };
213
+ options.log(`${m.id}: reverting to ${plan.to ?? "an empty schema"}${plan.done.length > 0 ? `, resuming at statement ${String(plan.statements.findIndex((_, i) => !plan.done.includes(i)))}` : ""}`);
214
+ const rowNote = venv.driver.rowNote ?? "";
215
+ for (const [i, s] of plan.statements.entries()) {
216
+ if (plan.done.includes(i)) {
217
+ options.log(` statement ${String(i)}: succeeded in an earlier run; not sent`);
218
+ continue;
219
+ }
220
+ await beat();
221
+ const row = { ...base, kind: "revert", statement_index: i, statement_sha: statementSha(s.step.sql), note: rowNote };
222
+ await recorder.record({ ...row, status: "started" });
223
+ try {
224
+ await venv.driver.runStatement(s.step, { succeeded: (note) => recorder.record({ ...row, status: "succeeded", note: [rowNote, note].filter(Boolean).join("; ") }), log: options.log });
225
+ }
226
+ catch (e) {
227
+ const error = e instanceof Error ? e.message : String(e);
228
+ await recorder.record({ ...row, status: "failed", error });
229
+ options.log(` statement ${String(i)}: failed: ${error.split("\n")[0] ?? ""}`);
230
+ throw new RevertFailed(m.id, i, error.split("\n")[0] ?? error);
231
+ }
232
+ options.log(` statement ${String(i)}: ok (${s.source === "step" ? `the revert step ${plan.step?.file ?? ""}` : `${s.step.rule} ${s.step.class}, ${s.step.name}`})`);
233
+ }
234
+ const note = JSON.stringify({
235
+ revert: { to: plan.to, statements: plan.statements.length, ...(plan.step ? { step: plan.step.file, stepSha: plan.step.sha } : {}) },
236
+ ...(overrides.length > 0 ? { policy: { overrides } } : {}),
237
+ });
238
+ await recorder.record({ ...base, kind: "migration", statement_index: MIGRATION_ROW, statement_sha: "", status: "reverted", note });
239
+ options.log(`${m.id}: reverted`);
240
+ return plan;
241
+ });
242
+ }
243
+ /** The revert `yodel apply --digest` or `--execute` runs instead, when `yodel revert` started the Op run. */
244
+ export function revertFromEnv(env, dir) {
245
+ const id = env[REVERT_ENV];
246
+ if (!id)
247
+ return undefined;
248
+ const file = env[REVERT_STEP_ENV];
249
+ return { id, ...(file ? { step: readRevertStep(file, dir) } : {}) };
250
+ }
251
+ //# sourceMappingURL=revert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revert.js","sourceRoot":"","sources":["../../src/versioned/revert.ts"],"names":[],"mappings":"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"}
@@ -21,6 +21,16 @@
21
21
  * migration that failed part way may be edited before it resumes (to fix
22
22
  * the statement that failed), as long as every statement that already
23
23
  * succeeded is unchanged: those are compared statement by statement.
24
+ *
25
+ * ## Checkpoints (#63)
26
+ *
27
+ * A checkpoint creates its parent's recorded schema from nothing. An
28
+ * environment whose history is empty starts at the newest checkpoint: the
29
+ * migrations before it are skipped, never run there. An environment whose
30
+ * history records a checkpoint started there, and skips the migrations
31
+ * before it the same way. Any other checkpoint is skipped: the environment
32
+ * ran (or started past) the migrations it stands for. A skipped migration
33
+ * is neither applied nor pending, so it is never out of order either.
24
34
  */
25
35
  import type { MigrationStep } from "@intentius/chant-lexicon-sql/migration-statements";
26
36
  import { type Migration } from "../migrations/index.js";
@@ -59,6 +69,11 @@ export interface PendingMigration {
59
69
  /** Before a migration the history records applied. */
60
70
  outOfOrder: boolean;
61
71
  partWay: PartWay | undefined;
72
+ /** It was applied, then `yodel revert` (#55) undid it: who reverted it and when. Applied again, every statement runs again. */
73
+ reverted?: {
74
+ by: string;
75
+ at: string;
76
+ };
62
77
  /** Its Op steps `apply` runs: a ClickHouse rebuild, a backfill (#12). */
63
78
  opSteps: Array<{
64
79
  index: number;
@@ -93,12 +108,22 @@ export type Mismatch = {
93
108
  recorded: string;
94
109
  message: string;
95
110
  };
111
+ /** A migration this environment never runs, because of a checkpoint (#63). */
112
+ export interface SkippedMigration {
113
+ id: string;
114
+ /** `covered`: it comes before the checkpoint the environment starts from. `checkpoint`: a checkpoint the environment does not start from. */
115
+ reason: "covered" | "checkpoint";
116
+ /** `covered`: the checkpoint the environment starts from. */
117
+ checkpoint?: string;
118
+ }
96
119
  export interface VersionedStatus {
97
120
  /** In chain order; then any the directory no longer has, in the order they were applied. */
98
121
  applied: AppliedMigration[];
99
122
  /** In chain order. */
100
123
  pending: PendingMigration[];
101
124
  mismatches: Mismatch[];
125
+ /** In chain order: the migrations a checkpoint leaves out here. Absent when there are none. */
126
+ skipped?: SkippedMigration[];
102
127
  }
103
128
  export declare const outOfOrder: (s: VersionedStatus) => PendingMigration[];
104
129
  export declare const partWay: (s: VersionedStatus) => PendingMigration[];
@@ -21,9 +21,19 @@
21
21
  * migration that failed part way may be edited before it resumes (to fix
22
22
  * the statement that failed), as long as every statement that already
23
23
  * succeeded is unchanged: those are compared statement by statement.
24
+ *
25
+ * ## Checkpoints (#63)
26
+ *
27
+ * A checkpoint creates its parent's recorded schema from nothing. An
28
+ * environment whose history is empty starts at the newest checkpoint: the
29
+ * migrations before it are skipped, never run there. An environment whose
30
+ * history records a checkpoint started there, and skips the migrations
31
+ * before it the same way. Any other checkpoint is skipped: the environment
32
+ * ran (or started past) the migrations it stands for. A skipped migration
33
+ * is neither applied nor pending, so it is never out of order either.
24
34
  */
25
- import { computeChecksum } from "../migrations/index.js";
26
- import { isApplied, statementDone } from "../history/index.js";
35
+ import { computeChecksum, isCheckpoint } from "../migrations/index.js";
36
+ import { isApplied, isReverted, statementDone } from "../history/index.js";
27
37
  import { planStep, stepSha } from "../steps/index.js";
28
38
  export const outOfOrder = (s) => s.pending.filter((p) => p.outOfOrder);
29
39
  export const partWay = (s) => s.pending.filter((p) => p.partWay !== undefined);
@@ -125,13 +135,36 @@ export function compareHistory(ordered, state) {
125
135
  message: `${r.id} is recorded applied, but the migrations directory no longer has it; restore it, or ${repair(r.id)}`,
126
136
  });
127
137
  }
138
+ // The checkpoint this environment starts from: the newest one its history records, or, for an empty history, the newest one in the chain.
139
+ let start = -1;
140
+ for (const [i, m] of ordered.entries())
141
+ if (isCheckpoint(m) && state.byId.has(m.id))
142
+ start = i;
143
+ if (start < 0 && state.migrations.length === 0)
144
+ for (const [i, m] of ordered.entries())
145
+ if (isCheckpoint(m))
146
+ start = i;
147
+ const startId = start < 0 ? undefined : ordered[start]?.id;
148
+ const skipped = [];
128
149
  const pending = [];
129
150
  for (const [i, m] of ordered.entries()) {
130
151
  const rec = state.byId.get(m.id);
131
152
  if (isApplied(rec))
132
153
  continue;
154
+ if (!rec && i < start) {
155
+ skipped.push({ id: m.id, reason: "covered", ...(startId ? { checkpoint: startId } : {}) });
156
+ continue;
157
+ }
158
+ if (!rec && i !== start && isCheckpoint(m)) {
159
+ skipped.push({ id: m.id, reason: "checkpoint" });
160
+ continue;
161
+ }
133
162
  const actual = computeChecksum(m.files);
134
163
  let pw;
164
+ if (rec && isReverted(rec)) {
165
+ pending.push({ id: m.id, index: i, checksum: actual, outOfOrder: i < lastApplied, partWay: undefined, reverted: { by: rec.appliedBy, at: rec.recordedAt }, ...classifySteps(m), migration: m });
166
+ continue;
167
+ }
135
168
  if (rec) {
136
169
  const r = partWayOf(m, rec, actual);
137
170
  pw = r.partWay;
@@ -148,6 +181,6 @@ export function compareHistory(ordered, state) {
148
181
  migration: m,
149
182
  });
150
183
  }
151
- return { applied, pending, mismatches };
184
+ return { applied, pending, mismatches, ...(skipped.length > 0 ? { skipped } : {}) };
152
185
  }
153
186
  //# sourceMappingURL=state.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/versioned/state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/versioned/state.ts"],"names":[],"mappings":"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"}