@intentius/chant-lexicon-sql 0.124.31 → 0.124.32

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 (322) hide show
  1. package/dist/change-set.js +250 -0
  2. package/dist/clickhouse/access.js +722 -0
  3. package/dist/clickhouse/apply/apply.js +243 -0
  4. package/dist/clickhouse/apply/mutations.js +66 -0
  5. package/dist/clickhouse/apply/statements.js +545 -0
  6. package/dist/clickhouse/catalog-types.js +7 -0
  7. package/dist/clickhouse/container.js +152 -0
  8. package/dist/clickhouse/engine-syntax.js +159 -0
  9. package/dist/clickhouse/entities.js +593 -0
  10. package/dist/clickhouse/expressions.js +107 -0
  11. package/dist/clickhouse/http.js +55 -0
  12. package/dist/clickhouse/import/generator.js +192 -0
  13. package/dist/clickhouse/import/inlined.js +207 -0
  14. package/dist/clickhouse/import/ir.js +160 -0
  15. package/dist/clickhouse/import/live-export.js +131 -0
  16. package/dist/clickhouse/import/parser.js +17 -0
  17. package/dist/clickhouse/live/bind.js +116 -0
  18. package/dist/clickhouse/live/catalog.js +223 -0
  19. package/dist/clickhouse/live/describe-resources.js +91 -0
  20. package/dist/clickhouse/live/undeclarable.js +59 -0
  21. package/dist/clickhouse/overlays/codecs.js +57 -0
  22. package/dist/clickhouse/overlays/engines.js +101 -0
  23. package/dist/clickhouse/overlays/kinds.js +1 -0
  24. package/dist/clickhouse/overlays/projections.js +26 -0
  25. package/dist/clickhouse/overlays/skip-indexes.js +40 -0
  26. package/dist/clickhouse/overlays/ttl.js +34 -0
  27. package/dist/clickhouse/overlays/types.js +59 -0
  28. package/dist/clickhouse/ownership.js +83 -0
  29. package/dist/clickhouse/parser.js +674 -0
  30. package/dist/clickhouse/plan/commands.js +159 -0
  31. package/dist/clickhouse/plan/deep.js +345 -0
  32. package/dist/clickhouse/plan/diff.js +312 -0
  33. package/dist/clickhouse/plan/disruption.js +73 -0
  34. package/dist/clickhouse/plan/normalize.js +545 -0
  35. package/dist/clickhouse/plan/rebuild-handoff.js +57 -0
  36. package/dist/clickhouse/plan/report.js +26 -0
  37. package/dist/clickhouse/plan/rules.js +72 -0
  38. package/dist/clickhouse/plan/schema.js +67 -0
  39. package/dist/clickhouse/plan/server-format.js +35 -0
  40. package/dist/clickhouse/rebuild/backfill.js +265 -0
  41. package/dist/clickhouse/rebuild/engines.js +146 -0
  42. package/dist/clickhouse/rebuild/observe.js +260 -0
  43. package/dist/clickhouse/rebuild/op.js +152 -0
  44. package/dist/clickhouse/rebuild/partitions.js +65 -0
  45. package/dist/clickhouse/rebuild/receipts.js +120 -0
  46. package/dist/clickhouse/rebuild/replicas.js +121 -0
  47. package/dist/clickhouse/rebuild/shards.js +76 -0
  48. package/dist/clickhouse/rebuild/steps.js +383 -0
  49. package/dist/clickhouse/rebuild/verify.js +279 -0
  50. package/dist/clickhouse/row-types.js +151 -0
  51. package/dist/clickhouse/testing/fake-server.js +47 -0
  52. package/dist/clickhouse/testing/roundtrip-schema.js +25 -0
  53. package/dist/clickhouse/testing/writable-server.js +123 -0
  54. package/dist/clickhouse/tokens.js +23 -0
  55. package/dist/clickhouse/topology.js +463 -0
  56. package/dist/clickhouse/type-syntax.js +73 -0
  57. package/dist/clickhouse.js +25 -0
  58. package/dist/codegen/classifier-page.js +93 -0
  59. package/dist/codegen/clickhouse-module.js +249 -0
  60. package/dist/codegen/coverage-page.js +70 -0
  61. package/dist/codegen/docs-cli.js +3 -0
  62. package/dist/codegen/docs.js +222 -0
  63. package/dist/codegen/generate-cli.js +13 -0
  64. package/dist/codegen/generate.js +97 -0
  65. package/dist/codegen/package.js +28 -0
  66. package/dist/codegen/postgres-classifier-page.js +95 -0
  67. package/dist/codegen/postgres-module.js +418 -0
  68. package/dist/codegen/registry.js +52 -0
  69. package/dist/composites/audit-log-table.js +35 -0
  70. package/dist/composites/catalog.js +524 -0
  71. package/dist/composites/cdc-mirror.js +32 -0
  72. package/dist/composites/clickhouse.js +6 -0
  73. package/dist/composites/events-table.js +26 -0
  74. package/dist/composites/index.js +8 -0
  75. package/dist/composites/join-table.js +25 -0
  76. package/dist/composites/postgres.js +6 -0
  77. package/dist/composites/refreshed-view.js +24 -0
  78. package/dist/composites/replacing-table.js +28 -0
  79. package/dist/composites/rollup-view.js +29 -0
  80. package/dist/composites/sharded-table.js +27 -0
  81. package/dist/composites/soft-delete-table.js +34 -0
  82. package/dist/composites/tenant-table.js +26 -0
  83. package/dist/composites/typed.js +8 -0
  84. package/dist/config.js +206 -0
  85. package/dist/core/apply.js +93 -0
  86. package/dist/core/classifier.js +115 -0
  87. package/dist/core/container.js +69 -0
  88. package/dist/core/cursor.js +261 -0
  89. package/dist/core/diff.js +48 -0
  90. package/dist/core/entity.js +58 -0
  91. package/dist/core/find-templates.js +118 -0
  92. package/dist/core/foreign-tables.js +27 -0
  93. package/dist/core/handoff.js +32 -0
  94. package/dist/core/index.js +64 -0
  95. package/dist/core/interpolation.js +191 -0
  96. package/dist/core/normalize.js +43 -0
  97. package/dist/core/ownership.js +119 -0
  98. package/dist/core/receipts.js +22 -0
  99. package/dist/core/references.js +61 -0
  100. package/dist/core/statements.js +42 -0
  101. package/dist/core/template.js +79 -0
  102. package/dist/core/testing/http-stub.js +21 -0
  103. package/dist/core/tokens.js +202 -0
  104. package/dist/core/typed.js +40 -0
  105. package/dist/core/undeclarable.js +46 -0
  106. package/dist/coverage.js +161 -0
  107. package/dist/detect.js +32 -0
  108. package/dist/dialects.js +18 -0
  109. package/dist/files/build-root.js +72 -0
  110. package/dist/files/clickhouse.js +138 -0
  111. package/dist/files/common.js +58 -0
  112. package/dist/files/postgres.js +389 -0
  113. package/dist/generated/clickhouse-types.js +5 -0
  114. package/dist/generated/clickhouse.js +4361 -0
  115. package/dist/generated/postgres-types.js +227 -0
  116. package/dist/generated/postgres.js +3667 -0
  117. package/dist/import-generator.js +14 -0
  118. package/dist/import-parser.js +71 -0
  119. package/dist/index.js +24 -0
  120. package/dist/init-templates.js +290 -0
  121. package/dist/integrity.json +2 -2
  122. package/dist/lint/audit-catalog.js +31 -0
  123. package/dist/lint/audit-lineage.js +22 -0
  124. package/dist/lint/post-synth/audit-entries.js +34 -0
  125. package/dist/lint/post-synth/clickhouse-helpers.js +79 -0
  126. package/dist/lint/post-synth/clickhouse-type-check.js +162 -0
  127. package/dist/lint/post-synth/index.js +112 -0
  128. package/dist/lint/post-synth/postgres-audit-entries.js +35 -0
  129. package/dist/lint/post-synth/postgres-helpers.js +65 -0
  130. package/dist/lint/post-synth/postgres-names.js +507 -0
  131. package/dist/lint/post-synth/sql-helpers.js +23 -0
  132. package/dist/lint/post-synth/sql101.js +59 -0
  133. package/dist/lint/post-synth/sql102.js +34 -0
  134. package/dist/lint/post-synth/sqlch101.js +34 -0
  135. package/dist/lint/post-synth/sqlch102.js +23 -0
  136. package/dist/lint/post-synth/sqlch103.js +45 -0
  137. package/dist/lint/post-synth/sqlch104.js +41 -0
  138. package/dist/lint/post-synth/sqlch105.js +36 -0
  139. package/dist/lint/post-synth/sqlch106.js +27 -0
  140. package/dist/lint/post-synth/sqlch107.js +39 -0
  141. package/dist/lint/post-synth/sqlch108.js +28 -0
  142. package/dist/lint/post-synth/sqlch109.js +21 -0
  143. package/dist/lint/post-synth/sqlch110.js +31 -0
  144. package/dist/lint/post-synth/sqlch111.js +41 -0
  145. package/dist/lint/post-synth/sqlch112.js +28 -0
  146. package/dist/lint/post-synth/sqlch113.js +19 -0
  147. package/dist/lint/post-synth/sqlch114.js +26 -0
  148. package/dist/lint/post-synth/sqlch115.js +30 -0
  149. package/dist/lint/post-synth/sqlch116.js +22 -0
  150. package/dist/lint/post-synth/sqlch117.js +26 -0
  151. package/dist/lint/post-synth/sqlch118.js +27 -0
  152. package/dist/lint/post-synth/sqlch119.js +32 -0
  153. package/dist/lint/post-synth/sqlch120.js +20 -0
  154. package/dist/lint/post-synth/sqlch121.js +11 -0
  155. package/dist/lint/post-synth/sqlch122.js +11 -0
  156. package/dist/lint/post-synth/sqlch123.js +10 -0
  157. package/dist/lint/post-synth/sqlch124.js +21 -0
  158. package/dist/lint/post-synth/sqlch125.js +55 -0
  159. package/dist/lint/post-synth/sqlch126.js +62 -0
  160. package/dist/lint/post-synth/sqlch127.js +132 -0
  161. package/dist/lint/post-synth/sqlpg101.js +25 -0
  162. package/dist/lint/post-synth/sqlpg102.js +35 -0
  163. package/dist/lint/post-synth/sqlpg103.js +23 -0
  164. package/dist/lint/post-synth/sqlpg104.js +23 -0
  165. package/dist/lint/post-synth/sqlpg105.js +22 -0
  166. package/dist/lint/post-synth/sqlpg106.js +22 -0
  167. package/dist/lint/post-synth/sqlpg107.js +22 -0
  168. package/dist/lint/post-synth/sqlpg108.js +28 -0
  169. package/dist/lint/post-synth/sqlpg109.js +39 -0
  170. package/dist/lint/post-synth/sqlpg110.js +38 -0
  171. package/dist/lint/post-synth/sqlpg111.js +23 -0
  172. package/dist/lint/post-synth/sqlpg112.js +25 -0
  173. package/dist/lint/post-synth/sqlpg113.js +29 -0
  174. package/dist/lint/post-synth/sqlpg114.js +39 -0
  175. package/dist/lint/post-synth/sqlpg115.js +48 -0
  176. package/dist/lint/post-synth/sqlpg116.js +26 -0
  177. package/dist/lint/post-synth/sqlpg117.js +24 -0
  178. package/dist/lint/post-synth/sqlpg118.js +22 -0
  179. package/dist/lint/post-synth/sqlpg119.js +41 -0
  180. package/dist/lint/post-synth/sqlpg120.js +83 -0
  181. package/dist/lint/post-synth/sqlpg121.js +33 -0
  182. package/dist/lint/post-synth/sqlpg122.js +27 -0
  183. package/dist/lint/post-synth/sqlpg123.js +69 -0
  184. package/dist/lint/post-synth/sqlpg124.js +50 -0
  185. package/dist/lint/post-synth/sqlpg125.js +41 -0
  186. package/dist/lint/post-synth/sqlpg126.js +38 -0
  187. package/dist/lint/rules/index.js +12 -0
  188. package/dist/lint/rules/postgres-templates.js +27 -0
  189. package/dist/lint/rules/sqlch001.js +79 -0
  190. package/dist/lint/rules/sqlch002.js +124 -0
  191. package/dist/lint/rules/sqlch003.js +69 -0
  192. package/dist/lint/rules/sqlch004.js +83 -0
  193. package/dist/lint/rules/sqlpg001.js +68 -0
  194. package/dist/lint/rules/sqlpg002.js +69 -0
  195. package/dist/lint/rules/sqlpg003.js +58 -0
  196. package/dist/lint/rules/sqlpg004.js +77 -0
  197. package/dist/lint/rules/sqlpg005.js +86 -0
  198. package/dist/lint/rules/templates.js +25 -0
  199. package/dist/lint/rules/typed-names.js +132 -0
  200. package/dist/live-dialect.js +32 -0
  201. package/dist/lsp/catalog.js +44 -0
  202. package/dist/lsp/completions.js +136 -0
  203. package/dist/lsp/hover.js +115 -0
  204. package/dist/lsp/postgres-catalog.js +176 -0
  205. package/dist/lsp/postgres-template.js +171 -0
  206. package/dist/lsp/postgres.js +266 -0
  207. package/dist/lsp/refs.js +60 -0
  208. package/dist/lsp/registry.d.ts.map +1 -1
  209. package/dist/lsp/registry.js +19 -0
  210. package/dist/lsp/template.js +143 -0
  211. package/dist/manifest.json +1 -1
  212. package/dist/mcp/index.d.ts.map +1 -1
  213. package/dist/mcp/index.js +293 -0
  214. package/dist/mcp/postgres.js +117 -0
  215. package/dist/migration-statements.js +243 -0
  216. package/dist/op/activities/clickhouse-apply.js +83 -0
  217. package/dist/op/activities/clickhouse-emulator.js +53 -0
  218. package/dist/op/activities/clickhouse-rebuild.js +119 -0
  219. package/dist/op/activities/index.js +26 -0
  220. package/dist/op/activities/postgres-apply.js +126 -0
  221. package/dist/op/activities/postgres-emulator.js +70 -0
  222. package/dist/op/activities/postgres-migration.js +156 -0
  223. package/dist/op/activities/sql-exec.js +57 -0
  224. package/dist/op/activity-contracts.js +103 -0
  225. package/dist/package-cli.js +14 -0
  226. package/dist/plugin.js +259 -0
  227. package/dist/postgres/access/acl.js +344 -0
  228. package/dist/postgres/access/changes.js +30 -0
  229. package/dist/postgres/access/import.js +61 -0
  230. package/dist/postgres/access/live.js +96 -0
  231. package/dist/postgres/apply/apply.js +557 -0
  232. package/dist/postgres/apply/statements.js +882 -0
  233. package/dist/postgres/catalog-types.js +18 -0
  234. package/dist/postgres/container.js +58 -0
  235. package/dist/postgres/entities.js +1390 -0
  236. package/dist/postgres/entity-types.js +28 -0
  237. package/dist/postgres/import/generator.js +283 -0
  238. package/dist/postgres/import/ir.js +53 -0
  239. package/dist/postgres/import/live-export.js +83 -0
  240. package/dist/postgres/keywords.js +32 -0
  241. package/dist/postgres/live/bind.js +130 -0
  242. package/dist/postgres/live/catalog-kinds.js +301 -0
  243. package/dist/postgres/live/catalog.js +644 -0
  244. package/dist/postgres/live/client.js +151 -0
  245. package/dist/postgres/live/describe-resources.js +135 -0
  246. package/dist/postgres/live/undeclarable.js +111 -0
  247. package/dist/postgres/migrate/backfill.js +170 -0
  248. package/dist/postgres/migrate/batches.js +122 -0
  249. package/dist/postgres/migrate/carry.js +518 -0
  250. package/dist/postgres/migrate/handoff.js +59 -0
  251. package/dist/postgres/migrate/names.js +61 -0
  252. package/dist/postgres/migrate/observe.js +360 -0
  253. package/dist/postgres/migrate/op.js +178 -0
  254. package/dist/postgres/migrate/receipts.js +117 -0
  255. package/dist/postgres/migrate/replication.js +106 -0
  256. package/dist/postgres/migrate/steps.js +514 -0
  257. package/dist/postgres/overlays/columns.js +31 -0
  258. package/dist/postgres/overlays/constraints.js +52 -0
  259. package/dist/postgres/overlays/extension-objects.js +88 -0
  260. package/dist/postgres/overlays/indexes.js +25 -0
  261. package/dist/postgres/overlays/kinds.js +2 -0
  262. package/dist/postgres/overlays/partitioning.js +23 -0
  263. package/dist/postgres/overlays/relations.js +25 -0
  264. package/dist/postgres/overlays/storage.js +65 -0
  265. package/dist/postgres/overlays/type-ddl.js +36 -0
  266. package/dist/postgres/overlays/types.js +74 -0
  267. package/dist/postgres/parser.js +1824 -0
  268. package/dist/postgres/plan/commands.js +137 -0
  269. package/dist/postgres/plan/deep.js +324 -0
  270. package/dist/postgres/plan/diff.js +499 -0
  271. package/dist/postgres/plan/disruption.js +64 -0
  272. package/dist/postgres/plan/normalize.js +889 -0
  273. package/dist/postgres/plan/report.js +21 -0
  274. package/dist/postgres/plan/rules.js +115 -0
  275. package/dist/postgres/plan/schema.js +105 -0
  276. package/dist/postgres/plan/server-normalize.js +166 -0
  277. package/dist/postgres/providers/aurora.js +44 -0
  278. package/dist/postgres/providers/azure.js +53 -0
  279. package/dist/postgres/providers/cloud-sql.js +41 -0
  280. package/dist/postgres/providers/index.js +73 -0
  281. package/dist/postgres/providers/neon.js +44 -0
  282. package/dist/postgres/providers/rds.js +47 -0
  283. package/dist/postgres/providers/supabase.js +45 -0
  284. package/dist/postgres/providers/types.js +21 -0
  285. package/dist/postgres/row-types.js +107 -0
  286. package/dist/postgres/testing/fake-client.js +34 -0
  287. package/dist/postgres/testing/migration.js +48 -0
  288. package/dist/postgres/testing/roundtrip-schema.js +64 -0
  289. package/dist/postgres/testing/server.js +47 -0
  290. package/dist/postgres/testing/writable-server.js +160 -0
  291. package/dist/postgres/tokens.js +41 -0
  292. package/dist/postgres.js +15 -0
  293. package/dist/read/clickhouse.js +82 -0
  294. package/dist/read/objects.js +44 -0
  295. package/dist/read/postgres.js +104 -0
  296. package/dist/read.js +52 -0
  297. package/dist/receipts.js +207 -0
  298. package/dist/serializer.js +172 -0
  299. package/dist/skill-defs.js +93 -0
  300. package/dist/spec/catalog.js +191 -0
  301. package/dist/spec/fetch.d.ts.map +1 -1
  302. package/dist/spec/fetch.js +90 -0
  303. package/dist/spec/pin.js +42 -0
  304. package/dist/spec/postgres-catalog.js +171 -0
  305. package/dist/spec/postgres-fetch.js +91 -0
  306. package/dist/spec/postgres-pin.js +82 -0
  307. package/dist/sql-files.js +206 -0
  308. package/dist/sql-types-command.js +97 -0
  309. package/dist/sql-types.js +323 -0
  310. package/dist/token-source.js +156 -0
  311. package/dist/validate-cli.js +5 -0
  312. package/dist/validate.js +151 -0
  313. package/dist/workspace-outputs.js +191 -0
  314. package/package.json +7 -7
  315. package/src/codegen/package.ts +2 -2
  316. package/src/lint/rules/typescript-7.test.ts +2 -1
  317. package/src/lsp/catalog.ts +2 -2
  318. package/src/lsp/postgres-catalog.ts +2 -2
  319. package/src/lsp/registry.ts +2 -1
  320. package/src/mcp/index.ts +4 -2
  321. package/src/spec/fetch.ts +2 -2
  322. package/src/spec/postgres-fetch.ts +2 -2
@@ -0,0 +1,250 @@
1
+ /**
2
+ * SQL plans as change-set parts (#3767, the document is #3181).
3
+ *
4
+ * The sql lexicon's declarative plans reach the change set through `chant
5
+ * lifecycle plan`. Two kinds of SQL plan do not, and this module is their
6
+ * adapter:
7
+ *
8
+ * - a versioned plan: the migrations a product (SQL Yodeler) would apply to
9
+ * an environment, each a list of steps in the shape `diffStatements`
10
+ * writes (`./core/statements.ts`). {@link sqlVersionedPlanPart}.
11
+ * - the plan step of the lexicon's own migration Ops, `ClickHouseRebuildOp`
12
+ * and `PostgresMigrationOp`. {@link clickhouseRebuildPart} and
13
+ * {@link postgresMigrationPart}.
14
+ *
15
+ * Each returns a part with planner `sql`, so it composes with every other
16
+ * member's in `composeChangeSet`, and a gate that binds the document gets its
17
+ * Cedar `context.plan` (#3182). A part written to a file as JSON reads back
18
+ * through core's `readChangeSetPart` with `planner: "sql"`.
19
+ *
20
+ * ## Entries
21
+ *
22
+ * One entry per object a plan touches, at the object's server name (`db.name`
23
+ * or `schema.name`), however many steps or migrations touch it. The action
24
+ * and disruption come from the change classes the steps carry, as the
25
+ * dialects' `CHANGE_CLASSES` and `PG_CHANGE_CLASSES` price them:
26
+ *
27
+ * - a `drop` class is a `delete` (`destroy`); a `create` class a `create`;
28
+ * - a `rebuild` or `expand` class, or a step a migration Op makes, is a
29
+ * `replace` (`replace`): the object, or a column of it, is built again;
30
+ * - anything else is an `update`, its disruption the worst class's
31
+ * (`metadata` in-place; `validate`, `concurrently` and `rewrite` rolling).
32
+ * A step marked destructive (a column drop) makes it `destroy`. A class
33
+ * neither dialect knows makes it `unknown`.
34
+ *
35
+ * A step may name its `action` itself, which wins over its classes.
36
+ *
37
+ * ## The import graph
38
+ *
39
+ * Like `@intentius/chant/change-set`, this module bundles small for a tool
40
+ * that runs it in CI with no TypeScript toolchain: it imports chant's plan
41
+ * hashing code and types only. `change-set.test.ts` holds that.
42
+ */
43
+ import { computePlanDigest } from "@intentius/chant/lifecycle/plan-digest";
44
+ /** The lexicon a SQL part's member and entries name. */
45
+ export const SQL_CHANGE_SET_LEXICON = "sql";
46
+ /**
47
+ * What each change class costs, both dialects together. The same values as
48
+ * `CHANGE_CLASSES.disruption` (ClickHouse) and `PG_CHANGE_CLASSES.disruption`
49
+ * (Postgres), copied so the rule tables stay out of the bundle; the test
50
+ * holds the two together.
51
+ */
52
+ export const SQL_CLASS_DISRUPTION = {
53
+ create: "in-place",
54
+ metadata: "in-place",
55
+ validate: "rolling",
56
+ concurrently: "rolling",
57
+ rewrite: "rolling",
58
+ rebuild: "replace",
59
+ expand: "replace",
60
+ drop: "destroy",
61
+ };
62
+ const RANK = { "in-place": 0, rolling: 1, unknown: 2, replace: 3, destroy: 4 };
63
+ const worst = (a, b) => (a === undefined || RANK[b] > RANK[a] ? b : a);
64
+ const ACTION_ORDER = ["delete", "replace", "create", "update", "forget", "read", "no-op"];
65
+ const unwrap = (s) => "step" in s && s.step && typeof s.step === "object" ? { ...s.step, ...(s.done ? { done: true } : {}) } : s;
66
+ function gather(steps) {
67
+ const byAddress = new Map();
68
+ for (const step of steps) {
69
+ if (step.done)
70
+ continue;
71
+ let o = byAddress.get(step.name);
72
+ if (!o) {
73
+ o = { address: step.name, type: step.type, classes: [], actions: [], destructive: false, ops: [], manual: [], sql: [], fields: new Map() };
74
+ byAddress.set(step.name, o);
75
+ }
76
+ if (step.action)
77
+ o.actions.push(step.action);
78
+ const changes = step.changes ?? [];
79
+ if (step.kind === "statement") {
80
+ o.classes.push(step.class);
81
+ o.sql.push(step.sql);
82
+ if (step.destructive)
83
+ o.destructive = true;
84
+ }
85
+ else if (step.kind === "op") {
86
+ o.ops.push(step.op);
87
+ }
88
+ else {
89
+ o.manual.push(step.detail);
90
+ }
91
+ for (const c of changes) {
92
+ o.classes.push(c.class);
93
+ if (c.destructive)
94
+ o.destructive = true;
95
+ const had = o.fields.get(c.field);
96
+ // The first step's before, the last step's after.
97
+ o.fields.set(c.field, had ? { ...c, ...(had.before !== undefined ? { before: had.before } : {}) } : c);
98
+ }
99
+ }
100
+ return [...byAddress.values()];
101
+ }
102
+ function attributesOf(o) {
103
+ const attributes = [...o.fields.values()]
104
+ .sort((a, b) => (a.field < b.field ? -1 : a.field > b.field ? 1 : 0))
105
+ .map((c) => ({
106
+ path: c.field,
107
+ ...(c.before !== undefined ? { before: c.before } : {}),
108
+ ...(c.after !== undefined ? { after: c.after } : {}),
109
+ ...(SQL_CLASS_DISRUPTION[c.class] === "replace" ? { forcesReplacement: true } : {}),
110
+ }));
111
+ if (o.sql.length > 0)
112
+ attributes.push({ path: "sql", after: o.sql });
113
+ if (o.ops.length > 0)
114
+ attributes.push({ path: "op", after: [...new Set(o.ops)] });
115
+ if (o.manual.length > 0)
116
+ attributes.push({ path: "manual", after: o.manual });
117
+ return attributes;
118
+ }
119
+ /** The action and disruption of one object's changes, as the module's header says. */
120
+ export function sqlChangeAction(o) {
121
+ let disruption;
122
+ for (const c of o.classes)
123
+ disruption = worst(disruption, SQL_CLASS_DISRUPTION[c] ?? "unknown");
124
+ if (o.ops.length > 0)
125
+ disruption = worst(disruption, "replace");
126
+ if (o.destructive)
127
+ disruption = worst(disruption, "destroy");
128
+ let action;
129
+ if (o.actions.length > 0)
130
+ action = ACTION_ORDER.find((a) => o.actions.includes(a));
131
+ else if (o.classes.includes("drop"))
132
+ action = "delete";
133
+ else if (o.classes.includes("create"))
134
+ action = "create";
135
+ else if (o.ops.length > 0 || o.classes.some((c) => SQL_CLASS_DISRUPTION[c] === "replace"))
136
+ action = "replace";
137
+ else
138
+ action = "update";
139
+ switch (action) {
140
+ case "create":
141
+ case "read":
142
+ case "no-op":
143
+ case "forget":
144
+ return { action };
145
+ case "delete":
146
+ return { action, disruption: "destroy" };
147
+ case "replace":
148
+ return { action, disruption: worst(disruption, "replace") };
149
+ default:
150
+ return { action, disruption: disruption ?? "unknown" };
151
+ }
152
+ }
153
+ function entriesOf(member, lexicon, scope, objects) {
154
+ return objects.map((o) => ({
155
+ member,
156
+ lexicon,
157
+ planner: "sql",
158
+ address: o.address,
159
+ type: o.type,
160
+ ...sqlChangeAction(o),
161
+ ...(scope !== undefined ? { scope } : {}),
162
+ attributes: attributesOf(o),
163
+ }));
164
+ }
165
+ /**
166
+ * A versioned plan's part ({@link SqlVersionedPlan}): one entry per object
167
+ * its pending steps touch, `scope` the environment. A refusal makes the
168
+ * member `failed` with no plan digest; its entries stay, for a reader.
169
+ */
170
+ export function sqlVersionedPlanPart(input) {
171
+ const { plan } = input;
172
+ const lexicon = input.lexicon ?? SQL_CHANGE_SET_LEXICON;
173
+ const migrations = (plan.migrations ?? plan.pending ?? []).map((m) => ({ id: m.id, steps: m.steps.map(unwrap) }));
174
+ const objects = gather(migrations.flatMap((m) => m.steps));
175
+ const refusal = plan.refusal === undefined ? undefined : typeof plan.refusal === "string" ? plan.refusal : plan.refusal.message;
176
+ const planDigest = refusal !== undefined
177
+ ? null
178
+ : (plan.digest ??
179
+ computePlanDigest("sql-versioned-plan", {
180
+ dialect: plan.dialect,
181
+ environment: plan.environment ?? null,
182
+ migrations: migrations.map((m) => ({ id: m.id, steps: m.steps.filter((s) => !s.done) })),
183
+ }));
184
+ return {
185
+ member: {
186
+ member: input.member,
187
+ lexicon,
188
+ planner: "sql",
189
+ ...(plan.environment !== undefined ? { scope: plan.environment } : {}),
190
+ status: refusal !== undefined ? "failed" : "planned",
191
+ ...(refusal !== undefined ? { error: refusal } : {}),
192
+ planDigest,
193
+ holes: plan.holes ?? [],
194
+ },
195
+ entries: entriesOf(input.member, lexicon, plan.environment, objects),
196
+ };
197
+ }
198
+ /** A change as a plain string, read back as far as its rule and field go. */
199
+ function changeOf(line) {
200
+ const m = /^(\S+)\s+([^\s:]+)/.exec(line);
201
+ return { rule: m?.[1] ?? line, class: "unknown", field: m?.[2] ?? line };
202
+ }
203
+ function opPart(input, op, active, address, type) {
204
+ const { plan } = input;
205
+ const lexicon = input.lexicon ?? SQL_CHANGE_SET_LEXICON;
206
+ const running = plan.state === active;
207
+ const changes = plan.classified ?? plan.changes.map(changeOf);
208
+ const objects = running
209
+ ? gather([{ kind: "op", object: address, type, name: address, op, importPath: "", options: {}, declaration: "", changes, detail: "" }])
210
+ : [];
211
+ // Swapped or done: the Op has nothing left to change in the schema; the digest says which.
212
+ const planDigest = running && plan.planDigest ? plan.planDigest : computePlanDigest("sql-op-plan", { op, address, state: plan.state, planDigest: plan.planDigest ?? null });
213
+ return {
214
+ member: {
215
+ member: input.member,
216
+ lexicon,
217
+ planner: "sql",
218
+ ...(input.environment !== undefined ? { scope: input.environment } : {}),
219
+ status: "planned",
220
+ planDigest,
221
+ holes: [],
222
+ },
223
+ entries: entriesOf(input.member, lexicon, input.environment, objects),
224
+ };
225
+ }
226
+ /**
227
+ * The part of a `ClickHouseRebuildOp`'s plan step: while the state is
228
+ * `rebuild`, one `replace` of the table, its plan digest the step's (the
229
+ * value before the verification, not the swap gate's). `swapped` and `done`
230
+ * propose nothing.
231
+ */
232
+ export function clickhouseRebuildPart(input) {
233
+ const table = input.plan.table;
234
+ if (!table)
235
+ throw new Error("clickhouseRebuildPart: the plan names no table");
236
+ return opPart(input, "ClickHouseRebuildOp", "rebuild", table, "ClickHouse::Table");
237
+ }
238
+ /**
239
+ * The part of a `PostgresMigrationOp`'s plan step: while the state is
240
+ * `migrate`, one `replace` of the table (`schema.table`) whose column it
241
+ * expands and contracts, its plan digest the step's. `switched` and `done`
242
+ * propose nothing.
243
+ */
244
+ export function postgresMigrationPart(input) {
245
+ const migration = input.plan.migration;
246
+ if (!migration)
247
+ throw new Error("postgresMigrationPart: the plan names no migration");
248
+ const table = migration.split(".").slice(0, -1).join(".") || migration;
249
+ return opPart(input, "PostgresMigrationOp", "migrate", table, "Postgres::Table");
250
+ }