@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
package/dist/project.d.ts CHANGED
@@ -39,8 +39,18 @@ export interface Project {
39
39
  }
40
40
  export interface Environment {
41
41
  name: string;
42
- /** `sql.profiles.<name>`. */
42
+ /** `sql.profiles.<name>`; a tenant's is its environment's, on the tenant's database or schema. */
43
43
  profile: SqlProfile;
44
+ /** A tenant of a tenant set (#56): `name` is `<env>/<tenant>`. */
45
+ tenant?: TenantOf;
46
+ }
47
+ /** Which tenant an {@link Environment} is. */
48
+ export interface TenantOf {
49
+ /** The environment whose tenant set names it. */
50
+ env: string;
51
+ name: string;
52
+ /** The database (ClickHouse) or schema (Postgres) the environment's profile names, which the migrations are written against. */
53
+ template: string;
44
54
  }
45
55
  /** The nearest directory at or above `start` that holds `chant.config.ts`. */
46
56
  export declare function findProjectDir(start: string): string | undefined;
@@ -58,5 +68,12 @@ export declare function projectFromConfig(dir: string, configPath: string, confi
58
68
  * there is one.
59
69
  */
60
70
  export declare function loadProject(start?: string): Promise<Project>;
61
- /** `sql.profiles.<name>`, or an error naming the environments the project declares. */
71
+ /**
72
+ * `sql.profiles.<name>`, or an error naming the environments the project
73
+ * declares. A tenant, `<env>/<tenant>`, is `<env>`'s profile on the
74
+ * tenant's database or schema; it is added to the loaded config's
75
+ * `sql.profiles` under its own name, so chant binds it like any profile.
76
+ * Whether a tenant set given by a file or a query names it is checked when
77
+ * its server is opened (`openVersioned`).
78
+ */
62
79
  export declare function resolveEnvironment(project: Project, name: string): Environment;
package/dist/project.js CHANGED
@@ -7,6 +7,7 @@
7
7
  */
8
8
  import { existsSync } from "node:fs";
9
9
  import { dirname, join, resolve } from "node:path";
10
+ import { splitTarget, TENANT_NAME } from "./tenants/target.js";
10
11
  /** An error a verb reports as one line on stderr, with the exit code it ends with. */
11
12
  export class YodelError extends Error {
12
13
  exitCode;
@@ -74,8 +75,18 @@ export async function loadProject(start = process.cwd()) {
74
75
  const yodel = await loadYodelConfig(dir, Object.keys(config.sql?.profiles ?? {}));
75
76
  return projectFromConfig(dir, loaded.configPath ?? join(dir, "chant.config.ts"), config, yodel);
76
77
  }
77
- /** `sql.profiles.<name>`, or an error naming the environments the project declares. */
78
+ /**
79
+ * `sql.profiles.<name>`, or an error naming the environments the project
80
+ * declares. A tenant, `<env>/<tenant>`, is `<env>`'s profile on the
81
+ * tenant's database or schema; it is added to the loaded config's
82
+ * `sql.profiles` under its own name, so chant binds it like any profile.
83
+ * Whether a tenant set given by a file or a query names it is checked when
84
+ * its server is opened (`openVersioned`).
85
+ */
78
86
  export function resolveEnvironment(project, name) {
87
+ const { env: base, tenant } = splitTarget(name);
88
+ if (tenant !== undefined)
89
+ return resolveTenant(project, base, tenant);
79
90
  const profiles = project.config.sql?.profiles ?? {};
80
91
  const profile = profiles[name];
81
92
  if (!profile) {
@@ -89,4 +100,25 @@ export function resolveEnvironment(project, name) {
89
100
  }
90
101
  return { name, profile };
91
102
  }
103
+ function resolveTenant(project, base, tenant) {
104
+ const env = resolveEnvironment(project, base);
105
+ const set = project.yodel?.config.environments?.[base]?.tenants;
106
+ if (!set)
107
+ throw new YodelError(`no environment "${base}/${tenant}": ${base} has no tenant set (yodel.config.ts environments.${base}.tenants)`);
108
+ if (!TENANT_NAME.test(tenant))
109
+ throw new YodelError(`"${tenant}" is not a tenant name (letters, digits and _, not starting with a digit)`);
110
+ if (Array.isArray(set) && !set.includes(tenant))
111
+ throw new YodelError(`no tenant "${tenant}" in ${base}'s tenant set (${set.join(", ")})`);
112
+ const key = project.dialect === "postgres" ? "schemas" : "databases";
113
+ const named = env.profile[key];
114
+ const template = Array.isArray(named) && named.length === 1 && typeof named[0] === "string" ? named[0] : undefined;
115
+ if (!template) {
116
+ throw new YodelError(`${base} has a tenant set, so sql.profiles.${base}.${key} must name exactly one ${project.dialect === "postgres" ? "schema" : "database"}: the template its tenants are made from, which the migrations are written against`);
117
+ }
118
+ const name = `${base}/${tenant}`;
119
+ const profile = { ...env.profile, [key]: [tenant] };
120
+ const sql = (project.config.sql ??= {});
121
+ sql.profiles = { ...(sql.profiles ?? {}), [name]: profile };
122
+ return { name, profile, tenant: { env: base, name: tenant, template } };
123
+ }
92
124
  //# sourceMappingURL=project.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,12 @@
22
22
  * replayed: the check stops there, naming it ({@link ReplayResult} outcome
23
23
  * `unreplayable`).
24
24
  *
25
+ * A checkpoint (#63) is left out of the chain: it creates its parent's
26
+ * recorded schema from nothing. After the chain, each checkpoint is
27
+ * replayed on its own into the database emptied again, and compared with
28
+ * its recorded schema, the one the chain was shown to give. So a fresh
29
+ * environment that starts from it ends where one that ran the chain does.
30
+ *
25
31
  * The database is the replay's: it must be fresh when the replay starts
26
32
  * (every database or schema the history names absent, the default one
27
33
  * empty), or emptied first when the caller says so (`reset`), and it is
@@ -31,7 +37,7 @@
31
37
  import type { ClassifiedChange } from "@intentius/chant-lexicon-sql/core/classifier";
32
38
  import type { StatementStep } from "@intentius/chant-lexicon-sql/migration-statements";
33
39
  import { type SqlDialect } from "../project.js";
34
- import type { Migration } from "../migrations/index.js";
40
+ import { type Migration } from "../migrations/index.js";
35
41
  /** Exit code: the target is not fresh and `reset` was not given; nothing was run. */
36
42
  export declare const NOT_FRESH = 4;
37
43
  /** Exit code: a step the replay cannot run (a manual step, an Op it does not run). */
@@ -72,6 +78,8 @@ export interface ReplayedMigration {
72
78
  ran: string[];
73
79
  /** Steps skipped, as `step <i>: <what> (<why>)`. */
74
80
  skipped: string[];
81
+ /** A checkpoint (#63), replayed on its own into an empty database after the chain. */
82
+ checkpoint?: true;
75
83
  }
76
84
  export type ReplayResult = {
77
85
  dialect: SqlDialect;
@@ -22,6 +22,12 @@
22
22
  * replayed: the check stops there, naming it ({@link ReplayResult} outcome
23
23
  * `unreplayable`).
24
24
  *
25
+ * A checkpoint (#63) is left out of the chain: it creates its parent's
26
+ * recorded schema from nothing. After the chain, each checkpoint is
27
+ * replayed on its own into the database emptied again, and compared with
28
+ * its recorded schema, the one the chain was shown to give. So a fresh
29
+ * environment that starts from it ends where one that ran the chain does.
30
+ *
25
31
  * The database is the replay's: it must be fresh when the replay starts
26
32
  * (every database or schema the history names absent, the default one
27
33
  * empty), or emptied first when the caller says so (`reset`), and it is
@@ -29,6 +35,7 @@
29
35
  * table; no lock is taken.
30
36
  */
31
37
  import { YodelError } from "../project.js";
38
+ import { isCheckpoint } from "../migrations/index.js";
32
39
  import { asBackfill, describeStep, planStep } from "../steps/kinds.js";
33
40
  /** Exit code: the target is not fresh and `reset` was not given; nothing was run. */
34
41
  export const NOT_FRESH = 4;
@@ -52,42 +59,66 @@ export async function replayMigrations(ordered, driver, options = {}) {
52
59
  await driver.clear();
53
60
  }
54
61
  const matched = [];
55
- try {
56
- for (const m of ordered) {
57
- const done = { id: m.id, statements: 0, ran: [], skipped: [] };
58
- log(`${m.id}: replaying`);
59
- for (const [i, step] of m.document.steps.entries()) {
60
- const s = step;
61
- if (s.kind === "statement") {
62
- try {
63
- await driver.statement(m, i, s);
64
- }
65
- catch (e) {
66
- return { ...base, reset: occupied.length > 0, matched, outcome: "failed", migration: m.id, step: i, error: firstLine(message(e)) };
67
- }
68
- done.statements++;
69
- continue;
62
+ const reset = occupied.length > 0;
63
+ /** Replays one migration's steps on what the database holds now, then compares; a failure, or the migration replayed. */
64
+ const replayOne = async (m) => {
65
+ const done = { id: m.id, statements: 0, ran: [], skipped: [], ...(isCheckpoint(m) ? { checkpoint: true } : {}) };
66
+ log(`${m.id}: replaying${isCheckpoint(m) ? " (a checkpoint, into an empty database)" : ""}`);
67
+ for (const [i, step] of m.document.steps.entries()) {
68
+ const s = step;
69
+ if (s.kind === "statement") {
70
+ try {
71
+ await driver.statement(m, i, s);
70
72
  }
71
- if (asBackfill(s)) {
72
- done.skipped.push(`step ${String(i)}: ${describeStep(s)} (moves data; the replayed database has none)`);
73
- continue;
73
+ catch (e) {
74
+ return { ...base, reset, matched, outcome: "failed", migration: m.id, step: i, error: firstLine(message(e)) };
74
75
  }
75
- const plan = planStep(s);
76
- const outcome = plan.run === "refused" ? { refused: plan.reason } : await driver.opStep(m, i);
77
- if ("refused" in outcome) {
78
- return { ...base, reset: occupied.length > 0, matched, outcome: "unreplayable", migration: m.id, step: i, reason: outcome.refused };
79
- }
80
- done.ran.push(`step ${String(i)}: ${describeStep(s)}${outcome.note ? ` (${outcome.note})` : ""}`);
76
+ done.statements++;
77
+ continue;
78
+ }
79
+ if (asBackfill(s)) {
80
+ done.skipped.push(`step ${String(i)}: ${describeStep(s)} (moves data; the replayed database has none)`);
81
+ continue;
81
82
  }
82
- const changes = await driver.compare(m);
83
- if (changes.length > 0) {
84
- log(`${m.id}: differs from its recorded schema (${String(changes.length)} difference${changes.length === 1 ? "" : "s"})`);
85
- return { ...base, reset: occupied.length > 0, matched, outcome: "differs", migration: done, changes };
83
+ const plan = planStep(s);
84
+ const outcome = plan.run === "refused" ? { refused: plan.reason } : await driver.opStep(m, i);
85
+ if ("refused" in outcome) {
86
+ return { ...base, reset, matched, outcome: "unreplayable", migration: m.id, step: i, reason: outcome.refused };
86
87
  }
87
- log(`${m.id}: matches its recorded schema`);
88
- matched.push(done);
88
+ done.ran.push(`step ${String(i)}: ${describeStep(s)}${outcome.note ? ` (${outcome.note})` : ""}`);
89
+ }
90
+ const changes = await driver.compare(m);
91
+ if (changes.length > 0) {
92
+ log(`${m.id}: differs from its recorded schema (${String(changes.length)} difference${changes.length === 1 ? "" : "s"})`);
93
+ return { ...base, reset, matched, outcome: "differs", migration: done, changes };
94
+ }
95
+ log(`${m.id}: matches its recorded schema`);
96
+ return done;
97
+ };
98
+ const failed = (r) => "outcome" in r;
99
+ try {
100
+ // The chain, first to newest. A checkpoint (#63) creates its parent's schema from nothing, so on top of the chain it would only fail: it is replayed on its own below.
101
+ const checkpoints = [];
102
+ for (const m of ordered) {
103
+ if (isCheckpoint(m)) {
104
+ checkpoints.push(m);
105
+ log(`${m.id}: a checkpoint; replayed on its own, into an empty database, after the chain`);
106
+ continue;
107
+ }
108
+ const r = await replayOne(m);
109
+ if (failed(r))
110
+ return r;
111
+ matched.push(r);
112
+ }
113
+ // Each checkpoint into an empty database: its statements must give its recorded schema, its parent's, which the chain was just shown to give.
114
+ for (const m of checkpoints) {
115
+ await driver.clear();
116
+ const r = await replayOne(m);
117
+ if (failed(r))
118
+ return r;
119
+ matched.push(r);
89
120
  }
90
- return { ...base, reset: occupied.length > 0, matched, outcome: "matches" };
121
+ return { ...base, reset, matched, outcome: "matches" };
91
122
  }
92
123
  finally {
93
124
  // Emptying afterwards is housekeeping: its failure is reported, never put in place of the result.
@@ -1 +1 @@
1
- {"version":3,"file":"replay.js","sourceRoot":"","sources":["../../src/replay/replay.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"replay.js","sourceRoot":"","sources":["../../src/replay/replay.ts"],"names":[],"mappings":"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"}
@@ -54,7 +54,7 @@ export function renderReplay(result) {
54
54
  lines.push(` ${result.dialect === "postgres" ? "schemas" : "databases"}: ${result.scope.join(", ")}${result.reset ? " (emptied first)" : ""}${result.kept ? " (left in place)" : ""}`);
55
55
  for (const m of result.matched) {
56
56
  const extra = [...m.ran.map((r) => `ran ${r}`), ...m.skipped.map((s) => `skipped ${s}`)];
57
- lines.push(` ok ${m.id} (${String(m.statements)} statement${m.statements === 1 ? "" : "s"}${extra.length > 0 ? `; ${extra.join("; ")}` : ""})`);
57
+ lines.push(` ok ${m.id} (${String(m.statements)} statement${m.statements === 1 ? "" : "s"}${m.checkpoint ? ", a checkpoint, from an empty database" : ""}${extra.length > 0 ? `; ${extra.join("; ")}` : ""})`);
58
58
  }
59
59
  const failure = replayFailure(result);
60
60
  if (!failure) {
@@ -1 +1 @@
1
- {"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/replay/report.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/replay/report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * The audit log (#57), derived and never written by hand: every entry comes
3
+ * from a row of an environment's history table or a line of chant's gate
4
+ * ledger (`_gates/<op>.jsonl` on the `chant/lifecycle` branch), so the log
5
+ * cannot say something those two do not. Pure: rows and ledger lines in,
6
+ * entries and gaps out.
7
+ *
8
+ * Entries, by where they come from:
9
+ *
10
+ * | kind | source |
11
+ * |----------------------|---------------------------------------------------------------|
12
+ * | `approval-requested` | a pending fact on the ledger: a run stopped at the gate |
13
+ * | `approved` | a resolution of the migrations Op's gate |
14
+ * | `override` | a resolution of an `override-<rule>` gate (`yodel override`) |
15
+ * | `silenced` | a `-- yodel:allow` silence on a migration's first started row |
16
+ * | `applied` | the migration row that first recorded a migration succeeded |
17
+ * | `refused` | a failed migration row naming a pre-migration check |
18
+ * | `failed` | any other failed migration row |
19
+ * | `repaired` | a succeeded migration row after it was applied (`yodel repair`) |
20
+ *
21
+ * Each entry's `id` is a hash of what it says and where it came from, so
22
+ * deriving again from the same sources gives the same ids, and an audit.jsonl
23
+ * written earlier can be checked against the sources now (`./jsonl.ts`).
24
+ *
25
+ * Gaps are what the sources show is missing from themselves:
26
+ *
27
+ * - `history-row`: the history's seqs run from 1 with no hole (every run
28
+ * appends at the highest seq plus one, under the lock); a hole is a row
29
+ * that was deleted.
30
+ * - `approval`: a migration applied under a plan digest that the ledger
31
+ * holds no approval of the environment's gate for. A baseline (`yodel init
32
+ * --from`, no digest) needs none. A migration a wave of the apply pipeline
33
+ * applied (#87) was approved on the wave's gate (`<op>-wave-<k>`), for the
34
+ * wave's set digest its `started` row records (`note.wave`); a wave whose
35
+ * policy at the base needed no approval records that instead, and needs
36
+ * none.
37
+ */
38
+ import type { HistoryRow } from "../history/index.js";
39
+ export declare const AUDIT_KINDS: readonly ["approval-requested", "approved", "override", "silenced", "applied", "refused", "failed", "repaired", "reverted"];
40
+ export type AuditKind = (typeof AUDIT_KINDS)[number];
41
+ export type AuditSource = {
42
+ ledger: string;
43
+ op: string;
44
+ gate: string;
45
+ } | {
46
+ history: string;
47
+ seq: number;
48
+ run: string;
49
+ };
50
+ export interface AuditEntry {
51
+ /** A hash of everything below: the same sources always give the same id. */
52
+ id: string;
53
+ /** When it happened, ISO 8601 UTC: the ledger line's timestamp, or the history row's `recorded_at`. */
54
+ at: string;
55
+ environment: string;
56
+ kind: AuditKind;
57
+ /** Who: the approver, or who ran the apply. */
58
+ by?: string;
59
+ migration?: string;
60
+ /** The plan digest it is about. */
61
+ digest?: string;
62
+ /** The silence, the override's rule and reason, the error, the repair's reason. */
63
+ detail?: string;
64
+ /** `applied` by a wave of the apply pipeline: the wave's gate, its set digest, and whether it was approved or needed no approval. */
65
+ wave?: {
66
+ gate: string;
67
+ digest: string;
68
+ status: "approved" | "not-required";
69
+ };
70
+ source: AuditSource;
71
+ }
72
+ export interface AuditGap {
73
+ environment: string;
74
+ kind: "history-row" | "approval";
75
+ detail: string;
76
+ }
77
+ /** One environment's ledger, as chant's GateLedgerPort reads it. */
78
+ export interface LedgerInput {
79
+ op: string;
80
+ gate: string;
81
+ /** Where the lines are, for the entries' source: `_gates/<op>.jsonl`. */
82
+ path: string;
83
+ pending: ReadonlyArray<{
84
+ gate: string;
85
+ timestamp: string;
86
+ planDigest?: string | undefined;
87
+ runId?: string | undefined;
88
+ }>;
89
+ resolutions: ReadonlyArray<{
90
+ gate: string;
91
+ timestamp: string;
92
+ resolvedBy: string;
93
+ planDigest?: string | undefined;
94
+ note?: string | undefined;
95
+ }>;
96
+ }
97
+ /** The apply pipeline's wave gates on the ledger (`_gates/<op>.jsonl` of the waves' op): their pending lines and resolutions. */
98
+ export interface WaveLedgerInput {
99
+ op: string;
100
+ path: string;
101
+ /** The wave gate yodel.config.ts gives the environment now, if any; the gates its history's waves recorded are read too. */
102
+ gate?: string | undefined;
103
+ pending: LedgerInput["pending"];
104
+ resolutions: LedgerInput["resolutions"];
105
+ }
106
+ export interface AuditInput {
107
+ environment: string;
108
+ /** `<database>.history`, for the entries' source. */
109
+ history: string;
110
+ rows: readonly HistoryRow[];
111
+ /** Absent when the environment has no migrations Op to read the ledger of. */
112
+ ledger?: LedgerInput | undefined;
113
+ /** The waves' gate ledger, when the project's apply pipeline runs waves. */
114
+ waves?: WaveLedgerInput | undefined;
115
+ /** Whether two digests are the same plan (chant's samePlanDigest). Default: equal strings. */
116
+ sameDigest?: (a: string | undefined, b: string | undefined) => boolean;
117
+ }
118
+ /** `2026-10-10 09:12:44.123456` (the history's UTC) as ISO 8601. An ISO time is returned as it is. */
119
+ export declare function isoTime(t: string): string;
120
+ /** A key that orders ISO times written to the millisecond (the ledger) and the microsecond (the history) together. */
121
+ export declare function timeKey(t: string): string;
122
+ /** Oldest first. */
123
+ export declare const byTime: (a: {
124
+ at: string;
125
+ }, b: {
126
+ at: string;
127
+ }) => number;
128
+ /**
129
+ * The approval an `applied` entry was let through by, among `entries`: on
130
+ * the wave's gate for the wave's set digest when a wave applied it, else
131
+ * on the migrations gate for its plan digest. Undefined when none is there.
132
+ */
133
+ export declare function approvalOf(applied: AuditEntry, entries: readonly AuditEntry[], same?: (a: string | undefined, b: string | undefined) => boolean): AuditEntry | undefined;
134
+ /** The entries one environment's history and ledger add up to, oldest first, and the gaps they show. */
135
+ export declare function deriveAudit(input: AuditInput): {
136
+ entries: AuditEntry[];
137
+ gaps: AuditGap[];
138
+ };