@intentius/sql-yodeler 0.3.0 → 0.5.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 (220) hide show
  1. package/README.md +2 -2
  2. package/dist/apply-steps/index.d.ts +65 -0
  3. package/dist/apply-steps/index.js +106 -0
  4. package/dist/apply-steps/index.js.map +1 -0
  5. package/dist/approval-mode/index.d.ts +78 -0
  6. package/dist/approval-mode/index.js +105 -0
  7. package/dist/approval-mode/index.js.map +1 -0
  8. package/dist/chant/access.d.ts +84 -0
  9. package/dist/chant/access.js +155 -0
  10. package/dist/chant/access.js.map +1 -0
  11. package/dist/chant/drift.d.ts +17 -1
  12. package/dist/chant/drift.js +55 -2
  13. package/dist/chant/drift.js.map +1 -1
  14. package/dist/chant/plan.d.ts +18 -2
  15. package/dist/chant/plan.js +21 -3
  16. package/dist/chant/plan.js.map +1 -1
  17. package/dist/ci/login.d.ts +78 -0
  18. package/dist/ci/login.js +199 -0
  19. package/dist/ci/login.js.map +1 -0
  20. package/dist/ci/render.d.ts +64 -10
  21. package/dist/ci/render.js +385 -88
  22. package/dist/ci/render.js.map +1 -1
  23. package/dist/cleanup/index.d.ts +92 -0
  24. package/dist/cleanup/index.js +213 -0
  25. package/dist/cleanup/index.js.map +1 -0
  26. package/dist/commands/apply.js +178 -20
  27. package/dist/commands/apply.js.map +1 -1
  28. package/dist/commands/approve.d.ts +13 -0
  29. package/dist/commands/approve.js +206 -24
  30. package/dist/commands/approve.js.map +1 -1
  31. package/dist/commands/ci.js +12 -0
  32. package/dist/commands/ci.js.map +1 -1
  33. package/dist/commands/cleanup.d.ts +13 -0
  34. package/dist/commands/cleanup.js +158 -0
  35. package/dist/commands/cleanup.js.map +1 -0
  36. package/dist/commands/config.d.ts +3 -0
  37. package/dist/commands/config.js +136 -0
  38. package/dist/commands/config.js.map +1 -0
  39. package/dist/commands/drift.js +33 -3
  40. package/dist/commands/drift.js.map +1 -1
  41. package/dist/commands/index.js +6 -0
  42. package/dist/commands/index.js.map +1 -1
  43. package/dist/commands/init.d.ts +11 -0
  44. package/dist/commands/init.js +98 -10
  45. package/dist/commands/init.js.map +1 -1
  46. package/dist/commands/lint.js +67 -10
  47. package/dist/commands/lint.js.map +1 -1
  48. package/dist/commands/new.js +135 -54
  49. package/dist/commands/new.js.map +1 -1
  50. package/dist/commands/plan.js +39 -5
  51. package/dist/commands/plan.js.map +1 -1
  52. package/dist/commands/test.d.ts +3 -0
  53. package/dist/commands/test.js +164 -0
  54. package/dist/commands/test.js.map +1 -0
  55. package/dist/config/define.d.ts +175 -2
  56. package/dist/config/define.js +2 -0
  57. package/dist/config/define.js.map +1 -1
  58. package/dist/config/load.js +78 -10
  59. package/dist/config/load.js.map +1 -1
  60. package/dist/config/settings.d.ts +20 -0
  61. package/dist/config/settings.js +28 -0
  62. package/dist/config/settings.js.map +1 -1
  63. package/dist/credentials.d.ts +119 -0
  64. package/dist/credentials.js +119 -0
  65. package/dist/credentials.js.map +1 -0
  66. package/dist/exit.js +1 -1
  67. package/dist/exit.js.map +1 -1
  68. package/dist/index.d.ts +5 -1
  69. package/dist/index.js +2 -0
  70. package/dist/index.js.map +1 -1
  71. package/dist/init/adopt.js +1 -1
  72. package/dist/init/adopt.js.map +1 -1
  73. package/dist/init/clickhouse-access.d.ts +64 -0
  74. package/dist/init/clickhouse-access.js +211 -0
  75. package/dist/init/clickhouse-access.js.map +1 -0
  76. package/dist/init/index.d.ts +2 -0
  77. package/dist/init/index.js +2 -0
  78. package/dist/init/index.js.map +1 -1
  79. package/dist/init/live.d.ts +4 -0
  80. package/dist/init/live.js +16 -0
  81. package/dist/init/live.js.map +1 -1
  82. package/dist/init/second.d.ts +70 -0
  83. package/dist/init/second.js +149 -0
  84. package/dist/init/second.js.map +1 -0
  85. package/dist/lint/access.d.ts +18 -0
  86. package/dist/lint/access.js +34 -0
  87. package/dist/lint/access.js.map +1 -0
  88. package/dist/lint/annotations.d.ts +49 -0
  89. package/dist/lint/annotations.js +82 -0
  90. package/dist/lint/annotations.js.map +1 -0
  91. package/dist/lint/check.js +25 -7
  92. package/dist/lint/check.js.map +1 -1
  93. package/dist/lint/config.d.ts +7 -1
  94. package/dist/lint/config.js +11 -5
  95. package/dist/lint/config.js.map +1 -1
  96. package/dist/lint/index.d.ts +4 -0
  97. package/dist/lint/index.js +4 -0
  98. package/dist/lint/index.js.map +1 -1
  99. package/dist/lint/naming.d.ts +62 -0
  100. package/dist/lint/naming.js +138 -0
  101. package/dist/lint/naming.js.map +1 -0
  102. package/dist/lint/rules.d.ts +37 -4
  103. package/dist/lint/rules.js +16 -4
  104. package/dist/lint/rules.js.map +1 -1
  105. package/dist/lint/schema-checks.d.ts +63 -0
  106. package/dist/lint/schema-checks.js +128 -0
  107. package/dist/lint/schema-checks.js.map +1 -0
  108. package/dist/lint/statements.d.ts +22 -1
  109. package/dist/lint/statements.js +40 -1
  110. package/dist/lint/statements.js.map +1 -1
  111. package/dist/mcp/tools.d.ts +1 -1
  112. package/dist/mcp/tools.js +1 -1
  113. package/dist/mcp/tools.js.map +1 -1
  114. package/dist/migrations/checkpoint.js +0 -2
  115. package/dist/migrations/checkpoint.js.map +1 -1
  116. package/dist/migrations/checks.d.ts +19 -1
  117. package/dist/migrations/checks.js +15 -0
  118. package/dist/migrations/checks.js.map +1 -1
  119. package/dist/migrations/create.d.ts +13 -4
  120. package/dist/migrations/create.js +24 -9
  121. package/dist/migrations/create.js.map +1 -1
  122. package/dist/migrations/routines.d.ts +5 -15
  123. package/dist/migrations/routines.js +5 -30
  124. package/dist/migrations/routines.js.map +1 -1
  125. package/dist/pr/model.d.ts +4 -1
  126. package/dist/pr/model.js +13 -5
  127. package/dist/pr/model.js.map +1 -1
  128. package/dist/pr/render.d.ts +4 -1
  129. package/dist/pr/render.js +22 -8
  130. package/dist/pr/render.js.map +1 -1
  131. package/dist/pr/tenants.d.ts +37 -0
  132. package/dist/pr/tenants.js +138 -0
  133. package/dist/pr/tenants.js.map +1 -0
  134. package/dist/probe.d.ts +27 -0
  135. package/dist/probe.js +106 -0
  136. package/dist/probe.js.map +1 -0
  137. package/dist/project.d.ts +16 -0
  138. package/dist/project.js +29 -1
  139. package/dist/project.js.map +1 -1
  140. package/dist/replay/clickhouse.d.ts +31 -0
  141. package/dist/replay/clickhouse.js +103 -6
  142. package/dist/replay/clickhouse.js.map +1 -1
  143. package/dist/replay/replay.d.ts +5 -2
  144. package/dist/replay/replay.js.map +1 -1
  145. package/dist/report/audit.d.ts +1 -1
  146. package/dist/report/audit.js +20 -3
  147. package/dist/report/audit.js.map +1 -1
  148. package/dist/schemas.d.ts +3 -1
  149. package/dist/schemas.js +2 -0
  150. package/dist/schemas.js.map +1 -1
  151. package/dist/sources/ddl.d.ts +15 -20
  152. package/dist/sources/ddl.js +34 -328
  153. package/dist/sources/ddl.js.map +1 -1
  154. package/dist/sources/index.js +2 -2
  155. package/dist/sources/index.js.map +1 -1
  156. package/dist/steps/backfill.d.ts +40 -5
  157. package/dist/steps/backfill.js +128 -8
  158. package/dist/steps/backfill.js.map +1 -1
  159. package/dist/steps/index.d.ts +19 -1
  160. package/dist/steps/index.js +34 -7
  161. package/dist/steps/index.js.map +1 -1
  162. package/dist/steps/kinds.d.ts +42 -4
  163. package/dist/steps/kinds.js +88 -14
  164. package/dist/steps/kinds.js.map +1 -1
  165. package/dist/steps/postgres-migration.d.ts +3 -0
  166. package/dist/steps/postgres-migration.js +7 -3
  167. package/dist/steps/postgres-migration.js.map +1 -1
  168. package/dist/steps/rebuild.d.ts +15 -6
  169. package/dist/steps/rebuild.js +12 -9
  170. package/dist/steps/rebuild.js.map +1 -1
  171. package/dist/tenants/index.d.ts +2 -1
  172. package/dist/tenants/index.js +3 -4
  173. package/dist/tenants/index.js.map +1 -1
  174. package/dist/tenants/wave.d.ts +128 -0
  175. package/dist/tenants/wave.js +254 -0
  176. package/dist/tenants/wave.js.map +1 -0
  177. package/dist/testing/define.d.ts +62 -0
  178. package/dist/testing/define.js +32 -0
  179. package/dist/testing/define.js.map +1 -0
  180. package/dist/testing/files.d.ts +5 -0
  181. package/dist/testing/files.js +18 -0
  182. package/dist/testing/files.js.map +1 -0
  183. package/dist/testing/report.d.ts +14 -0
  184. package/dist/testing/report.js +83 -0
  185. package/dist/testing/report.js.map +1 -0
  186. package/dist/testing/run.d.ts +104 -0
  187. package/dist/testing/run.js +328 -0
  188. package/dist/testing/run.js.map +1 -0
  189. package/dist/versioned/approval.d.ts +6 -0
  190. package/dist/versioned/approval.js +11 -5
  191. package/dist/versioned/approval.js.map +1 -1
  192. package/dist/versioned/checks.d.ts +8 -2
  193. package/dist/versioned/checks.js +34 -13
  194. package/dist/versioned/checks.js.map +1 -1
  195. package/dist/versioned/driver.d.ts +2 -2
  196. package/dist/versioned/engine.d.ts +10 -0
  197. package/dist/versioned/engine.js +8 -4
  198. package/dist/versioned/engine.js.map +1 -1
  199. package/dist/versioned/explain.d.ts +2 -0
  200. package/dist/versioned/explain.js +3 -1
  201. package/dist/versioned/explain.js.map +1 -1
  202. package/dist/versioned/op.d.ts +4 -0
  203. package/dist/versioned/op.js +5 -2
  204. package/dist/versioned/op.js.map +1 -1
  205. package/dist/versioned/state.js +1 -1
  206. package/dist/versioned/state.js.map +1 -1
  207. package/dist/waves/index.d.ts +58 -13
  208. package/dist/waves/index.js +109 -24
  209. package/dist/waves/index.js.map +1 -1
  210. package/dist/waves/record.d.ts +10 -0
  211. package/dist/waves/record.js.map +1 -1
  212. package/package.json +8 -7
  213. package/schemas/apply.schema.json +1 -1
  214. package/schemas/cleanup.schema.json +40 -0
  215. package/schemas/init.schema.json +51 -22
  216. package/schemas/lint-rules.schema.json +4 -0
  217. package/schemas/new.schema.json +41 -3
  218. package/schemas/plan.schema.json +39 -0
  219. package/schemas/report.schema.json +1 -1
  220. package/schemas/test.schema.json +41 -0
@@ -0,0 +1,149 @@
1
+ /**
2
+ * `yodel init --baseline <env>` (#115): records the project's baseline
3
+ * applied in another environment that already holds its schema (staging,
4
+ * prod), without running it.
5
+ *
6
+ * The baseline is the project's first migration. The environment's live
7
+ * schema is planned against the schema the baseline records, offline from
8
+ * `migration.json`: the plan must be empty. A difference refuses (exit 4),
9
+ * naming each object and what differs, and nothing is recorded.
10
+ *
11
+ * The record goes through the environment's migrations Op, as `yodel
12
+ * revert` does (`../versioned/revert.ts`), with the baseline's id in
13
+ * `YODEL_BASELINE`: its Plan step (`yodel apply <env> --digest`) compares
14
+ * again and prints the baseline's digest (the baseline, the empty history
15
+ * and the live schema), the gate binds the approval to it, and its Apply
16
+ * step (`yodel apply <env> --execute`) takes the lock, checks that the
17
+ * history is still empty, compares again, refuses if the digest moved,
18
+ * checks the approval in chant's gate ledger and appends the one history
19
+ * row ({@link baselineRow}), with the digest it was approved under.
20
+ */
21
+ import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
22
+ import { tmpdir } from "node:os";
23
+ import { join } from "node:path";
24
+ import { randomUUID } from "node:crypto";
25
+ import { YodelError } from "../project.js";
26
+ import { EXIT_REFUSED } from "../exit.js";
27
+ import { planEnvironment, renderPlan, unreadableOf } from "../chant/plan.js";
28
+ import { declarativeRefusal } from "../config/settings.js";
29
+ import { appliedBy, withLock } from "../history/index.js";
30
+ import { sameDigest } from "../versioned/digest.js";
31
+ import { BASELINE_ENV } from "../versioned/op.js";
32
+ import { baselineRow, historyRefusal } from "./baseline.js";
33
+ /** chant's plan-digest kind for recording a baseline: never an apply's or a revert's. */
34
+ export const BASELINE_DIGEST_KIND = "yodel-baseline";
35
+ /** The note a baseline row recorded by `yodel init --baseline` carries. */
36
+ export const recordedBaselineNote = (environment) => `baseline: recorded by yodel init --baseline ${environment}, whose live schema matched the schema it records; its statements were not run`;
37
+ /** The project's baseline: its first migration. Refuses a project with none. */
38
+ export function projectBaseline(ordered) {
39
+ const first = ordered[0];
40
+ if (!first) {
41
+ throw new YodelError("refused: the project has no migrations, so there is no baseline to record; adopt an environment with yodel init --from <env> first. Nothing was recorded.", EXIT_REFUSED);
42
+ }
43
+ return first;
44
+ }
45
+ /** The refusals before anything is read: the same as yodel drift's, since the comparison is a plan of a recorded schema. */
46
+ export function baselineConfigRefusal(project, env) {
47
+ return declarativeRefusal(project, env.name);
48
+ }
49
+ /** A recorded schema as a build file the planner reads, in a temporary directory its dispose removes. */
50
+ function recordedBuild(schema) {
51
+ const dir = mkdtempSync(join(tmpdir(), "yodel-baseline-"));
52
+ const path = join(dir, "schema.json");
53
+ writeFileSync(path, JSON.stringify(schema));
54
+ return { path, output: schema, dispose: () => { rmSync(dir, { recursive: true, force: true }); } };
55
+ }
56
+ /** One difference between the environment and the baseline, as a person reads it. */
57
+ export function describeChange(c) {
58
+ const values = c.before !== undefined || c.after !== undefined ? `: ${c.before ?? "(none)"} in the environment, ${c.after ?? "(none)"} in the baseline` : "";
59
+ return `${c.object} ${c.field}${values} (${c.rule})`;
60
+ }
61
+ /**
62
+ * Plans the baseline's recorded schema against `env`'s live database. Every
63
+ * change counts: an object the baseline declares that differs or is
64
+ * missing, and an object the environment has in the project's databases or
65
+ * schemas that the baseline does not declare.
66
+ */
67
+ export async function compareBaseline(project, env, baseline, processEnv = process.env) {
68
+ const build = recordedBuild(baseline.document.schema);
69
+ try {
70
+ const plan = await planEnvironment(project, env, build, { env: processEnv });
71
+ const changes = [...plan.diff.changes, ...plan.refused];
72
+ const differences = [
73
+ ...changes.map(describeChange),
74
+ ...unreadableOf(plan).map((u) => `${u.object}: ${u.type} that chant cannot read (${u.reason})`),
75
+ ];
76
+ if (differences.length === 0)
77
+ return { differences };
78
+ return { differences: [...new Set(differences)], plan: await renderPlan(plan, `Plan of ${baseline.id} against ${env.name}`) };
79
+ }
80
+ finally {
81
+ build.dispose();
82
+ }
83
+ }
84
+ /** The refusal for a difference: names each one, and records nothing. */
85
+ export function differenceRefusal(env, baseline, cmp) {
86
+ return new YodelError(`refused: ${env}'s live schema is not the schema ${baseline} records, so the baseline cannot be recorded applied there. ` +
87
+ `${String(cmp.differences.length)} difference${cmp.differences.length === 1 ? "" : "s"}:\n${cmp.differences.map((d) => ` ${d}`).join("\n")}\n` +
88
+ `Make ${env} hold the baseline's schema (or empty it, and let yodel apply run the baseline), then run yodel init --baseline ${env} again. Nothing was recorded.`, EXIT_REFUSED);
89
+ }
90
+ /** Refuses when `env`'s history records anything: the baseline is the first thing a history records. */
91
+ async function historyEmpty(venv) {
92
+ const refusal = historyRefusal(await venv.store.state(), `${venv.location.database}.history`);
93
+ if (refusal)
94
+ throw refusal;
95
+ }
96
+ /** The record's plan digest: the baseline, where the history is, and the live schema, as chant computes digests. */
97
+ export async function baselineDigest(venv, baseline) {
98
+ const { computePlanDigest } = await import("@intentius/chant/lifecycle/plan-digest");
99
+ const live = await venv.driver.liveFingerprint();
100
+ return computePlanDigest(BASELINE_DIGEST_KIND, {
101
+ environment: venv.environment,
102
+ historyDatabase: venv.location.database,
103
+ topology: venv.topology ?? { kind: "single" },
104
+ baseline: { id: baseline.id, checksum: baseline.checksum },
105
+ live,
106
+ });
107
+ }
108
+ /**
109
+ * The Plan step's half (and `yodel init --baseline` before the Op): refuses
110
+ * a history that records anything and a live schema that differs, and
111
+ * returns the digest the gate binds.
112
+ */
113
+ export async function planBaseline(project, env, venv, baseline, processEnv = process.env) {
114
+ const refusal = baselineConfigRefusal(project, env);
115
+ if (refusal)
116
+ throw refusal;
117
+ await historyEmpty(venv);
118
+ const cmp = await compareBaseline(project, env, baseline, processEnv);
119
+ if (cmp.differences.length > 0)
120
+ throw differenceRefusal(env.name, baseline.id, cmp);
121
+ return baselineDigest(venv, baseline);
122
+ }
123
+ /** The Apply step's half: under the lock, plans again, checks the digest and the approval, and appends the baseline's row. */
124
+ export async function executeBaseline(project, env, venv, baseline, options) {
125
+ const processEnv = options.processEnv ?? process.env;
126
+ const by = appliedBy(processEnv);
127
+ const lock = await venv.driver.acquireLock(by);
128
+ if (lock.notice)
129
+ options.log(`lock: ${lock.notice}`);
130
+ return withLock(lock, venv.lockTtlMs, async () => {
131
+ const digest = await planBaseline(project, env, venv, baseline, processEnv);
132
+ if (!(await sameDigest(digest, options.approvedDigest))) {
133
+ throw new YodelError(`the baseline's plan moved since it was approved (approved ${options.approvedDigest}, now ${digest}); nothing was recorded. Run yodel init --baseline ${env.name} again.`);
134
+ }
135
+ await options.approve(digest);
136
+ await venv.store.ensure();
137
+ const state = await venv.store.state();
138
+ const refusal = historyRefusal(state, `${venv.location.database}.history`);
139
+ if (refusal)
140
+ throw refusal;
141
+ const row = { ...baselineRow(baseline, { seq: state.maxSeq + 1, runId: randomUUID(), appliedBy: by, environment: env.name }), plan_digest: digest, note: recordedBaselineNote(env.name) };
142
+ await venv.store.append([row]);
143
+ options.log(`recorded ${baseline.id} applied in ${venv.location.database}.history as a baseline; none of its statements was run`);
144
+ return row;
145
+ });
146
+ }
147
+ /** The baseline `yodel init --baseline` asked the Op to record, from its environment. */
148
+ export const baselineFromEnv = (env) => env[BASELINE_ENV] || undefined;
149
+ //# sourceMappingURL=second.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"second.js","sourceRoot":"","sources":["../../src/init/second.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAkC,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAmB,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE5D,yFAAyF;AACzF,MAAM,CAAC,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;AAErD,2EAA2E;AAC3E,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,WAAmB,EAAU,EAAE,CAClE,+CAA+C,WAAW,gFAAgF,CAAC;AAE7I,gFAAgF;AAChF,MAAM,UAAU,eAAe,CAAC,OAA6B;IAC3D,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACzB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,UAAU,CAClB,2JAA2J,EAC3J,YAAY,CACb,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,4HAA4H;AAC5H,MAAM,UAAU,qBAAqB,CAAC,OAAgB,EAAE,GAAgB;IACtE,OAAO,kBAAkB,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;AAC/C,CAAC;AAED,yGAAyG;AACzG,SAAS,aAAa,CAAC,MAAmB;IACxC,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IACtC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACrG,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,cAAc,CAAC,CAAmB;IAChD,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,IAAI,QAAQ,wBAAwB,CAAC,CAAC,KAAK,IAAI,QAAQ,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7J,OAAO,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,GAAG,MAAM,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC;AACvD,CAAC;AASD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAgB,EAAE,GAAgB,EAAE,QAAmB,EAAE,aAAgC,OAAO,CAAC,GAAG;IACxI,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACtD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC;QAC7E,MAAM,OAAO,GAAuB,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5E,MAAM,WAAW,GAAG;YAClB,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;YAC9B,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,IAAI,4BAA4B,CAAC,CAAC,MAAM,GAAG,CAAC;SAChG,CAAC;QACF,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,WAAW,EAAE,CAAC;QACrD,OAAO,EAAE,WAAW,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC,IAAI,EAAE,WAAW,QAAQ,CAAC,EAAE,YAAY,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;IAChI,CAAC;YAAS,CAAC;QACT,KAAK,CAAC,OAAO,EAAE,CAAC;IAClB,CAAC;AACH,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,iBAAiB,CAAC,GAAW,EAAE,QAAgB,EAAE,GAAuB;IACtF,OAAO,IAAI,UAAU,CACnB,YAAY,GAAG,oCAAoC,QAAQ,8DAA8D;QACvH,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,cAAc,GAAG,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;QAC/I,QAAQ,GAAG,mHAAmH,GAAG,+BAA+B,EAClK,YAAY,CACb,CAAC;AACJ,CAAC;AAED,wGAAwG;AACxG,KAAK,UAAU,YAAY,CAAC,IAAkB;IAC5C,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,UAAU,CAAC,CAAC;IAC9F,IAAI,OAAO;QAAE,MAAM,OAAO,CAAC;AAC7B,CAAC;AAED,oHAAoH;AACpH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAkB,EAAE,QAA4C;IACnG,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,wCAAwC,CAAC,CAAC;IACrF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;IACjD,OAAO,iBAAiB,CAAC,oBAAoB,EAAE;QAC7C,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,eAAe,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ;QACvC,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC7C,QAAQ,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE;QAC1D,IAAI;KACL,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAgB,EAAE,GAAgB,EAAE,IAAkB,EAAE,QAAmB,EAAE,aAAgC,OAAO,CAAC,GAAG;IACzJ,MAAM,OAAO,GAAG,qBAAqB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACpD,IAAI,OAAO;QAAE,MAAM,OAAO,CAAC;IAC3B,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;IACzB,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;IACtE,IAAI,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,iBAAiB,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACpF,OAAO,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACxC,CAAC;AAWD,8HAA8H;AAC9H,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAgB,EAAE,GAAgB,EAAE,IAAkB,EAAE,QAAmB,EAAE,OAA8B;IAC/I,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC;IACrD,MAAM,EAAE,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IAC/C,IAAI,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACrD,OAAO,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC5E,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC;YACxD,MAAM,IAAI,UAAU,CAAC,6DAA6D,OAAO,CAAC,cAAc,SAAS,MAAM,sDAAsD,GAAG,CAAC,IAAI,SAAS,CAAC,CAAC;QAClM,CAAC;QACD,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC9B,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,UAAU,CAAC,CAAC;QAC3E,IAAI,OAAO;YAAE,MAAM,OAAO,CAAC;QAC3B,MAAM,GAAG,GAAG,EAAE,GAAG,WAAW,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,WAAW,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1L,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,YAAY,QAAQ,CAAC,EAAE,eAAe,IAAI,CAAC,QAAQ,CAAC,QAAQ,wDAAwD,CAAC,CAAC;QAClI,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;AACL,CAAC;AAED,yFAAyF;AACzF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,GAAsB,EAAsB,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,SAAS,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * `pg-rls-not-forced` (#45): a migration that turns row-level security on
3
+ * for a table its recorded schema does not also force it on. Postgres does
4
+ * not apply a table's policies to the table's owner unless the table has
5
+ * `FORCE ROW LEVEL SECURITY`, and the owner is usually the role that
6
+ * applies the migrations, so a query run as that role sees every row.
7
+ *
8
+ * Read from the migration's steps and its recorded schema, no server. Each
9
+ * table is reported once, at the step that enables its row-level security.
10
+ */
11
+ import type { MigrationDocument } from "../migrations/index.js";
12
+ export interface AccessFinding {
13
+ rule: "pg-rls-not-forced";
14
+ step: number;
15
+ message: string;
16
+ }
17
+ /** The row-level-security findings of one Postgres migration. */
18
+ export declare function accessFindings(doc: Pick<MigrationDocument, "steps" | "schema" | "defaultSchema">): AccessFinding[];
@@ -0,0 +1,34 @@
1
+ /**
2
+ * `pg-rls-not-forced` (#45): a migration that turns row-level security on
3
+ * for a table its recorded schema does not also force it on. Postgres does
4
+ * not apply a table's policies to the table's owner unless the table has
5
+ * `FORCE ROW LEVEL SECURITY`, and the owner is usually the role that
6
+ * applies the migrations, so a query run as that role sees every row.
7
+ *
8
+ * Read from the migration's steps and its recorded schema, no server. Each
9
+ * table is reported once, at the step that enables its row-level security.
10
+ */
11
+ import { pgObjects } from "../migrations/routines.js";
12
+ const ENABLE = /\bENABLE\s+ROW\s+LEVEL\s+SECURITY\b/i;
13
+ /** The row-level-security findings of one Postgres migration. */
14
+ export function accessFindings(doc) {
15
+ const out = [];
16
+ let tables;
17
+ const seen = new Set();
18
+ doc.steps.forEach((s, i) => {
19
+ if (s.kind !== "statement" || s.type !== "Postgres::Table" || !ENABLE.test(s.sql) || seen.has(s.name))
20
+ return;
21
+ seen.add(s.name);
22
+ tables ??= new Map(pgObjects(doc.schema, doc.defaultSchema).filter((o) => o.kind === "table").map((o) => [o.qualified, o.fields]));
23
+ const fields = tables.get(s.name);
24
+ if (fields === undefined || fields.forceRowSecurity === true)
25
+ return;
26
+ out.push({
27
+ rule: "pg-rls-not-forced",
28
+ step: i,
29
+ message: `step ${String(i)}: ${s.name} has row-level security enabled but not forced, so its owner (often the role that applies) is not held to its policies; add ALTER TABLE ... FORCE ROW LEVEL SECURITY to its declaration`,
30
+ });
31
+ });
32
+ return out;
33
+ }
34
+ //# sourceMappingURL=access.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access.js","sourceRoot":"","sources":["../../src/lint/access.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAQtD,MAAM,MAAM,GAAG,sCAAsC,CAAC;AAEtD,iEAAiE;AACjE,MAAM,UAAU,cAAc,CAAC,GAAkE;IAC/F,MAAM,GAAG,GAAoB,EAAE,CAAC;IAChC,IAAI,MAAwD,CAAC;IAC7D,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAgB,EAAE,CAAC,EAAE,EAAE;QACxC,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,IAAI,KAAK,iBAAiB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,OAAO;QAC9G,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACjB,MAAM,KAAK,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACnI,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,gBAAgB,KAAK,IAAI;YAAE,OAAO;QACrE,GAAG,CAAC,IAAI,CAAC;YACP,IAAI,EAAE,mBAAmB;YACzB,IAAI,EAAE,CAAC;YACP,OAAO,EAAE,QAAQ,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,yLAAyL;SAC/N,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * `yodel lint`'s findings where a forge shows them to reviewers (#129):
3
+ *
4
+ * workflowCommands(report, root) GitHub and Forgejo Actions: one
5
+ * `::error file=...,line=...::` line per
6
+ * finding, which the forge shows on the file
7
+ * codeQuality(report, root) GitLab: the code quality report, kept as
8
+ * the job's `artifacts:reports:codequality`
9
+ *
10
+ * A finding in a migration points at its migration.sql, on the statement's
11
+ * line when the rule knows it (line 1 otherwise); a finding about the whole
12
+ * directory points at no file. Paths are relative to `root`, the
13
+ * repository's checkout (GITHUB_WORKSPACE, CI_PROJECT_DIR), with `/`.
14
+ */
15
+ import type { Finding, LintReport } from "./check.js";
16
+ /** The formats `yodel lint --format` prints. */
17
+ export declare const LINT_FORMATS: readonly ["text", "json", "github", "gitlab"];
18
+ export type LintFormat = (typeof LINT_FORMATS)[number];
19
+ /** Where `yodel lint --format gitlab` writes the code quality report, unless --output says otherwise. */
20
+ export declare const CODE_QUALITY_FILE = "gl-code-quality-report.json";
21
+ /** The file a finding is about, relative to `root`; undefined for one about the directory as a whole. */
22
+ export declare function findingPath(report: Pick<LintReport, "dir">, f: Pick<Finding, "migration">, root: string): string | undefined;
23
+ /**
24
+ * One workflow command per finding: `error` and `warning` at the finding's
25
+ * level, `notice` for a silenced one (it fails nothing, but a reviewer sees
26
+ * the reason beside the statement).
27
+ */
28
+ export declare function workflowCommands(report: LintReport, root: string): string;
29
+ /** One entry of GitLab's code quality report. */
30
+ export interface CodeQualityIssue {
31
+ description: string;
32
+ check_name: string;
33
+ fingerprint: string;
34
+ severity: "info" | "minor" | "major" | "critical" | "blocker";
35
+ location: {
36
+ path: string;
37
+ lines: {
38
+ begin: number;
39
+ };
40
+ };
41
+ }
42
+ /**
43
+ * GitLab's code quality report: an error is `major`, a warning `minor` and
44
+ * a silenced finding `info`. A finding about the directory as a whole is
45
+ * placed on the migrations directory. The fingerprint is the rule, the
46
+ * place and the message, so the same finding on two pipelines is one issue
47
+ * to GitLab and a fixed one shows as resolved.
48
+ */
49
+ export declare function codeQuality(report: LintReport, root: string): CodeQualityIssue[];
@@ -0,0 +1,82 @@
1
+ /**
2
+ * `yodel lint`'s findings where a forge shows them to reviewers (#129):
3
+ *
4
+ * workflowCommands(report, root) GitHub and Forgejo Actions: one
5
+ * `::error file=...,line=...::` line per
6
+ * finding, which the forge shows on the file
7
+ * codeQuality(report, root) GitLab: the code quality report, kept as
8
+ * the job's `artifacts:reports:codequality`
9
+ *
10
+ * A finding in a migration points at its migration.sql, on the statement's
11
+ * line when the rule knows it (line 1 otherwise); a finding about the whole
12
+ * directory points at no file. Paths are relative to `root`, the
13
+ * repository's checkout (GITHUB_WORKSPACE, CI_PROJECT_DIR), with `/`.
14
+ */
15
+ import { createHash } from "node:crypto";
16
+ import { realpathSync } from "node:fs";
17
+ import { join, relative, sep } from "node:path";
18
+ import { MIGRATION_SQL } from "../migrations/index.js";
19
+ /** The formats `yodel lint --format` prints. */
20
+ export const LINT_FORMATS = ["text", "json", "github", "gitlab"];
21
+ /** Where `yodel lint --format gitlab` writes the code quality report, unless --output says otherwise. */
22
+ export const CODE_QUALITY_FILE = "gl-code-quality-report.json";
23
+ /** `p` with its symbolic links resolved, so a checkout reached through one (macOS's /var, /tmp) still contains the project; `p` itself when it does not exist. */
24
+ function real(p) {
25
+ try {
26
+ return realpathSync(p);
27
+ }
28
+ catch {
29
+ return p;
30
+ }
31
+ }
32
+ /** `to` relative to `root`, with `/`. */
33
+ const fromRoot = (root, to) => relative(real(root), real(to)).split(sep).join("/");
34
+ /** The file a finding is about, relative to `root`; undefined for one about the directory as a whole. */
35
+ export function findingPath(report, f, root) {
36
+ if (f.migration === undefined)
37
+ return undefined;
38
+ return `${fromRoot(root, join(report.dir, f.migration))}/${MIGRATION_SQL}`;
39
+ }
40
+ // A workflow command's message and properties are escaped as the runner unescapes them.
41
+ const escapeData = (s) => s.replace(/%/g, "%25").replace(/\r/g, "%0D").replace(/\n/g, "%0A");
42
+ const escapeProperty = (s) => escapeData(s).replace(/:/g, "%3A").replace(/,/g, "%2C");
43
+ /**
44
+ * One workflow command per finding: `error` and `warning` at the finding's
45
+ * level, `notice` for a silenced one (it fails nothing, but a reviewer sees
46
+ * the reason beside the statement).
47
+ */
48
+ export function workflowCommands(report, root) {
49
+ const lines = report.findings.map((f) => {
50
+ const command = f.silenced !== undefined ? "notice" : f.level;
51
+ const file = findingPath(report, f, root);
52
+ const props = [
53
+ ...(file !== undefined ? [`file=${escapeProperty(file)}`, `line=${String(f.line ?? 1)}`] : []),
54
+ `title=${escapeProperty(`yodel lint ${f.rule}`)}`,
55
+ ];
56
+ const message = f.silenced !== undefined ? `${f.message} (silenced: ${f.silenced})` : f.message;
57
+ return `::${command} ${props.join(",")}::${escapeData(message)}`;
58
+ });
59
+ return lines.length > 0 ? `${lines.join("\n")}\n` : "";
60
+ }
61
+ /**
62
+ * GitLab's code quality report: an error is `major`, a warning `minor` and
63
+ * a silenced finding `info`. A finding about the directory as a whole is
64
+ * placed on the migrations directory. The fingerprint is the rule, the
65
+ * place and the message, so the same finding on two pipelines is one issue
66
+ * to GitLab and a fixed one shows as resolved.
67
+ */
68
+ export function codeQuality(report, root) {
69
+ return report.findings.map((f) => {
70
+ const path = findingPath(report, f, root) ?? fromRoot(root, report.dir);
71
+ const begin = f.line ?? 1;
72
+ const severity = f.silenced !== undefined ? "info" : f.level === "error" ? "major" : "minor";
73
+ return {
74
+ description: f.silenced !== undefined ? `${f.message} (silenced: ${f.silenced})` : f.message,
75
+ check_name: f.rule,
76
+ fingerprint: createHash("sha256").update(`${f.rule}\0${path}\0${String(begin)}\0${f.message}`).digest("hex"),
77
+ severity,
78
+ location: { path, lines: { begin } },
79
+ };
80
+ });
81
+ }
82
+ //# sourceMappingURL=annotations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"annotations.js","sourceRoot":"","sources":["../../src/lint/annotations.ts"],"names":[],"mappings":"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"}
@@ -12,8 +12,11 @@ import { checkpointProblems, computeChecksum, emptyBuild, scanMigrations } from
12
12
  import { levelOf } from "./config.js";
13
13
  import { LINT_RULES } from "./rules.js";
14
14
  import { mapMigrationSql } from "./silences.js";
15
- import { refusedStep, stepFindings, unreadableStep } from "./statements.js";
15
+ import { createdObjects, refusedStep, stepFindings, unreadableStep } from "./statements.js";
16
16
  import { routineFindings } from "./routines.js";
17
+ import { accessFindings } from "./access.js";
18
+ import { namingFindings } from "./naming.js";
19
+ import { SCHEMA_RULES, schemaFindings } from "./schema-checks.js";
17
20
  const message = (e) => (e instanceof Error ? e.message : String(e)).split("\n")[0] ?? "";
18
21
  const UPDATE = "if it is not applied in any environment, record its new checksum with yodel lint --update-checksum <id>; if it is, undo the edit, or record it with yodel repair <id> --reason ... <env>";
19
22
  /** The `-- yodel:allow` lines silences.ts reads. */
@@ -36,7 +39,8 @@ function directoryFindings(problems, history, migrations = []) {
36
39
  switch (p.kind) {
37
40
  case "fork":
38
41
  // The rule already says "fork"; the directory problem's own "fork: " prefix would say it twice.
39
- out.push({ rule: "fork", message: p.message.replace(/^fork: /, "") });
42
+ // Placed on the newest child, the migration a rebase moves: the one a forge annotates (#129).
43
+ out.push({ rule: "fork", message: p.message.replace(/^fork: /, ""), ...(p.children.length > 0 ? { migration: p.children[p.children.length - 1] } : {}) });
40
44
  break;
41
45
  case "checksum": {
42
46
  if (history) {
@@ -98,7 +102,7 @@ function unreadableObjects(schema, options) {
98
102
  * object it cannot read is reported once, in the first migration that
99
103
  * records it; a failure no single object explains is reported whole.
100
104
  */
101
- function schemaFindings(migrations, dialect) {
105
+ function recordedSchemaFindings(migrations, dialect) {
102
106
  const out = [];
103
107
  const byId = new Map(migrations.map((m) => [m.id, m]));
104
108
  const reported = new Set();
@@ -153,9 +157,16 @@ const stepName = (s) => (typeof s.name === "string" ? s.name : undefined);
153
157
  export async function lintMigrations(dir, options = {}) {
154
158
  const scan = scanMigrations(dir);
155
159
  const extra = options.rules ?? [];
156
- const rules = { ...LINT_RULES, ...Object.fromEntries(extra.map((r) => [r.rule.id, r.rule])) };
160
+ const rules = { ...LINT_RULES, ...SCHEMA_RULES, ...Object.fromEntries(extra.map((r) => [r.rule.id, r.rule])) };
157
161
  const dialect = options.dialect;
158
- const raw = [...directoryFindings(scan.problems, options.history, scan.migrations), ...schemaFindings(scan.migrations, dialect), ...checkpointFindings(scan.migrations)];
162
+ const raw = [...directoryFindings(scan.problems, options.history, scan.migrations), ...recordedSchemaFindings(scan.migrations, dialect), ...checkpointFindings(scan.migrations)];
163
+ // Over the recorded schemas (#51): the lexicon's schema checks and the naming rules, each at a step a silence can name.
164
+ const chantRules = options.project?.config?.lint?.rules;
165
+ const configured = new Set(Object.keys(options.settings?.levels ?? {}));
166
+ const bySchema = new Map();
167
+ for (const f of [...schemaFindings(scan.migrations, { dialect, configured, chantRules }), ...namingFindings(scan.migrations, options.settings?.naming ?? {})]) {
168
+ bySchema.set(f.migration, [...(bySchema.get(f.migration) ?? []), f]);
169
+ }
159
170
  const silenceable = new Set(Object.values(rules).filter((r) => r.silenceable).map((r) => r.id));
160
171
  const silences = {};
161
172
  const used = new Set();
@@ -169,6 +180,7 @@ export async function lintMigrations(dir, options = {}) {
169
180
  silences[m.id] = map.silences;
170
181
  for (const p of map.problems)
171
182
  raw.push({ rule: p.rule, migration: m.id, message: p.message, ...(p.step !== undefined ? { step: p.step } : {}), ...(p.line !== undefined ? { line: p.line } : {}) });
183
+ const created = d === "postgres" ? createdObjects(steps) : undefined;
172
184
  steps.forEach((step, i) => {
173
185
  const name = stepName(step);
174
186
  const where = { migration: m.id, step: i, ...(name !== undefined ? { object: name } : {}) };
@@ -180,7 +192,7 @@ export async function lintMigrations(dir, options = {}) {
180
192
  const refused = refusedStep(step);
181
193
  if (refused)
182
194
  raw.push({ rule: "refused-step", ...where, message: `step ${String(i)}: yodel apply refuses ${refused}` });
183
- for (const f of stepFindings(d, step)) {
195
+ for (const f of stepFindings(d, step, created ? { created } : {})) {
184
196
  const rule = rules[f.rule];
185
197
  if (rule?.dialect !== undefined && rule.dialect !== d)
186
198
  continue;
@@ -191,7 +203,7 @@ export async function lintMigrations(dir, options = {}) {
191
203
  }
192
204
  });
193
205
  if (d === "postgres") {
194
- for (const f of routineFindings(m.document)) {
206
+ for (const f of [...routineFindings(m.document), ...accessFindings(m.document)]) {
195
207
  const name = stepName(steps[f.step]);
196
208
  const silence = map.silences.find((s) => s.step === f.step && s.rule === f.rule);
197
209
  if (silence)
@@ -199,6 +211,12 @@ export async function lintMigrations(dir, options = {}) {
199
211
  statementRaw.push({ rule: f.rule, migration: m.id, step: f.step, ...(name !== undefined ? { object: name } : {}), message: f.message, ...(silence ? { silence } : {}) });
200
212
  }
201
213
  }
214
+ for (const f of bySchema.get(m.id) ?? []) {
215
+ const silence = f.step === undefined ? undefined : map.silences.find((s) => s.step === f.step && s.rule === f.rule);
216
+ if (silence)
217
+ used.add(silence);
218
+ statementRaw.push({ ...f, ...(silence ? { silence } : {}) });
219
+ }
202
220
  for (const s of map.silences) {
203
221
  if (used.has(s))
204
222
  continue;
@@ -1 +1 @@
1
- {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/lint/check.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/lint/check.ts"],"names":[],"mappings":"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"}
@@ -9,11 +9,17 @@
9
9
  *
10
10
  * A level is `error` (fails the run), `warning` (reported, does not fail)
11
11
  * or `off`. The integrity rules (`fork`, `directory`, `checksum`,
12
- * `unreadable-object`) are always errors and cannot be set.
12
+ * `unreadable-object`) are always errors and cannot be set. A schema
13
+ * check's id (`SQLPG101`) is a rule like any other.
14
+ *
15
+ * `lint.naming` sets the naming rules (`./naming.ts`).
13
16
  */
17
+ import { type NamingSettings } from "./naming.js";
14
18
  import type { LevelSetting, LintRule } from "./rules.js";
15
19
  export interface LintSettings {
16
20
  levels: Record<string, LevelSetting>;
21
+ /** `lint.naming`, compiled; absent when it sets none. */
22
+ naming?: NamingSettings;
17
23
  }
18
24
  /** Checks `lint` from `yodel.config.ts` against the rules there are. `where` names the file in errors. */
19
25
  export declare function lintSettings(raw: Record<string, unknown> | undefined, rules: Readonly<Record<string, LintRule>>, where?: string): LintSettings;
@@ -9,9 +9,13 @@
9
9
  *
10
10
  * A level is `error` (fails the run), `warning` (reported, does not fail)
11
11
  * or `off`. The integrity rules (`fork`, `directory`, `checksum`,
12
- * `unreadable-object`) are always errors and cannot be set.
12
+ * `unreadable-object`) are always errors and cannot be set. A schema
13
+ * check's id (`SQLPG101`) is a rule like any other.
14
+ *
15
+ * `lint.naming` sets the naming rules (`./naming.ts`).
13
16
  */
14
17
  import { YodelError } from "../project.js";
18
+ import { namingSettings } from "./naming.js";
15
19
  const isRecord = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
16
20
  const LEVELS = ["error", "warning", "off"];
17
21
  /** Checks `lint` from `yodel.config.ts` against the rules there are. `where` names the file in errors. */
@@ -20,10 +24,12 @@ export function lintSettings(raw, rules, where = "yodel.config.ts") {
20
24
  if (raw === undefined)
21
25
  return { levels };
22
26
  for (const k of Object.keys(raw))
23
- if (k !== "rules")
24
- throw new YodelError(`${where}: lint.${k}: unknown setting (expected rules)`);
27
+ if (k !== "rules" && k !== "naming")
28
+ throw new YodelError(`${where}: lint.${k}: unknown setting (expected rules, naming)`);
29
+ const naming = namingSettings(raw.naming, where);
30
+ const withNaming = (s) => (Object.keys(naming).length > 0 ? { ...s, naming } : s);
25
31
  if (raw.rules === undefined)
26
- return { levels };
32
+ return withNaming({ levels });
27
33
  if (!isRecord(raw.rules))
28
34
  throw new YodelError(`${where}: lint.rules: expected an object of rule: "error" | "warning" | "off"`);
29
35
  for (const [id, level] of Object.entries(raw.rules)) {
@@ -36,7 +42,7 @@ export function lintSettings(raw, rules, where = "yodel.config.ts") {
36
42
  throw new YodelError(`${where}: lint.rules.${id}: ${id} is an integrity rule and is always an error`);
37
43
  levels[id] = level;
38
44
  }
39
- return { levels };
45
+ return withNaming({ levels });
40
46
  }
41
47
  /** The level a rule runs at. */
42
48
  export const levelOf = (rule, settings) => settings?.levels[rule.id] ?? rule.level;
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lint/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAO3C,MAAM,QAAQ,GAAG,CAAC,CAAU,EAAgC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACxH,MAAM,MAAM,GAAsB,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;AAE9D,0GAA0G;AAC1G,MAAM,UAAU,YAAY,CAAC,GAAwC,EAAE,KAAyC,EAAE,KAAK,GAAG,iBAAiB;IACzI,MAAM,MAAM,GAAiC,EAAE,CAAC;IAChD,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IACzC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,IAAI,CAAC,KAAK,OAAO;YAAE,MAAM,IAAI,UAAU,CAAC,GAAG,KAAK,UAAU,CAAC,oCAAoC,CAAC,CAAC;IACnI,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAC/C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,GAAG,KAAK,uEAAuE,CAAC,CAAC;IAChI,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;QACvB,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,UAAU,CAAC,GAAG,KAAK,gBAAgB,EAAE,8BAA8B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1H,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,UAAU,CAAC,GAAG,KAAK,gBAAgB,EAAE,wCAAwC,CAAC,CAAC;QACnJ,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,KAAK,KAAK,OAAO;YAAE,MAAM,IAAI,UAAU,CAAC,GAAG,KAAK,gBAAgB,EAAE,KAAK,EAAE,8CAA8C,CAAC,CAAC;QACnJ,MAAM,CAAC,EAAE,CAAC,GAAG,KAAqB,CAAC;IACrC,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,CAAC;AACpB,CAAC;AAED,gCAAgC;AAChC,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,IAAc,EAAE,QAAkC,EAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lint/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAuB,MAAM,aAAa,CAAC;AASlE,MAAM,QAAQ,GAAG,CAAC,CAAU,EAAgC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACxH,MAAM,MAAM,GAAsB,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;AAE9D,0GAA0G;AAC1G,MAAM,UAAU,YAAY,CAAC,GAAwC,EAAE,KAAyC,EAAE,KAAK,GAAG,iBAAiB;IACzI,MAAM,MAAM,GAAiC,EAAE,CAAC;IAChD,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IACzC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,QAAQ;YAAE,MAAM,IAAI,UAAU,CAAC,GAAG,KAAK,UAAU,CAAC,4CAA4C,CAAC,CAAC;IAC7J,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,CAAC,CAAe,EAAgB,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9G,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS;QAAE,OAAO,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3D,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,GAAG,KAAK,uEAAuE,CAAC,CAAC;IAChI,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;QACvB,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,UAAU,CAAC,GAAG,KAAK,gBAAgB,EAAE,8BAA8B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1H,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,UAAU,CAAC,GAAG,KAAK,gBAAgB,EAAE,wCAAwC,CAAC,CAAC;QACnJ,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,KAAK,KAAK,OAAO;YAAE,MAAM,IAAI,UAAU,CAAC,GAAG,KAAK,gBAAgB,EAAE,KAAK,EAAE,8CAA8C,CAAC,CAAC;QACnJ,MAAM,CAAC,EAAE,CAAC,GAAG,KAAqB,CAAC;IACrC,CAAC;IACD,OAAO,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;AAChC,CAAC;AAED,gCAAgC;AAChC,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,IAAc,EAAE,QAAkC,EAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC"}
@@ -5,17 +5,21 @@
5
5
  * migrationSilences(m) a migration's `-- yodel:allow` lines, as the history records them
6
6
  * updateChecksum(m) writes migration.json's checksum to match its files
7
7
  * renderLint / lintJson the output; lintExitCode the exit code
8
+ * workflowCommands / codeQuality the findings as forge annotations (#129)
8
9
  *
9
10
  * The rules are in `./rules.ts`, how a silence is read in `./silences.ts`.
10
11
  */
11
12
  import { type Migration } from "../migrations/index.js";
12
13
  import { type Silence } from "./silences.js";
14
+ export * from "./annotations.js";
13
15
  export * from "./check.js";
14
16
  export * from "./config.js";
15
17
  export * from "./report.js";
16
18
  export * from "./rules.js";
17
19
  export * from "./silences.js";
18
20
  export * from "./statements.js";
21
+ export * from "./naming.js";
22
+ export { SCHEMA_RULES, isSchemaRule, schemaDiagnostics, chantLevel, type SchemaDiagnostic } from "./schema-checks.js";
19
23
  /** The well-formed `-- yodel:allow` lines of a migration, each with the step it is above. */
20
24
  export declare function silencesOf(m: Pick<Migration, "files" | "document">): Silence[];
21
25
  /** {@link silencesOf} as the history's `silences` field holds it: a JSON array of `{ step, rule, reason }`. */