@supabase/pg-delta 1.0.0-alpha.1 → 1.0.0-alpha.10

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 (664) hide show
  1. package/README.md +41 -2
  2. package/dist/cli/app.js +26 -3
  3. package/dist/cli/bin/cli.js +5 -0
  4. package/dist/cli/commands/catalog-export.d.ts +5 -0
  5. package/dist/cli/commands/catalog-export.js +64 -0
  6. package/dist/cli/commands/declarative-apply.d.ts +6 -0
  7. package/dist/cli/commands/declarative-apply.js +288 -0
  8. package/dist/cli/commands/declarative-export.d.ts +5 -0
  9. package/dist/cli/commands/declarative-export.js +245 -0
  10. package/dist/cli/commands/plan.js +40 -6
  11. package/dist/cli/exit-code.d.ts +2 -0
  12. package/dist/cli/exit-code.js +7 -0
  13. package/dist/cli/formatters/tree/tree.js +3 -2
  14. package/dist/cli/utils/apply-display.d.ts +52 -0
  15. package/dist/cli/utils/apply-display.js +183 -0
  16. package/dist/cli/utils/export-display.d.ts +43 -0
  17. package/dist/cli/utils/export-display.js +202 -0
  18. package/dist/cli/utils/resolve-input.d.ts +7 -0
  19. package/dist/cli/utils/resolve-input.js +13 -0
  20. package/dist/cli/utils.d.ts +2 -0
  21. package/dist/cli/utils.js +1 -1
  22. package/dist/core/catalog-export/index.d.ts +11 -0
  23. package/dist/core/catalog-export/index.js +10 -0
  24. package/dist/core/catalog.diff.d.ts +1 -0
  25. package/dist/core/catalog.diff.js +64 -48
  26. package/dist/core/catalog.model.d.ts +16 -3
  27. package/dist/core/catalog.model.js +132 -30
  28. package/dist/core/catalog.snapshot.d.ts +66 -0
  29. package/dist/core/catalog.snapshot.js +206 -0
  30. package/dist/core/context.d.ts +3 -3
  31. package/dist/core/context.js +7 -10
  32. package/dist/core/declarative-apply/discover-sql.d.ts +18 -0
  33. package/dist/core/declarative-apply/discover-sql.js +86 -0
  34. package/dist/core/declarative-apply/extract-catalog-providers.d.ts +23 -0
  35. package/dist/core/declarative-apply/extract-catalog-providers.js +159 -0
  36. package/dist/core/declarative-apply/index.d.ts +49 -0
  37. package/dist/core/declarative-apply/index.js +134 -0
  38. package/dist/core/declarative-apply/round-apply.d.ts +100 -0
  39. package/dist/core/declarative-apply/round-apply.js +378 -0
  40. package/dist/core/depend.d.ts +2 -2
  41. package/dist/core/depend.js +8 -7
  42. package/dist/core/export/file-mapper.d.ts +71 -0
  43. package/dist/core/export/file-mapper.js +474 -0
  44. package/dist/core/export/grouper.d.ts +13 -0
  45. package/dist/core/export/grouper.js +76 -0
  46. package/dist/core/export/index.d.ts +45 -0
  47. package/dist/core/export/index.js +63 -0
  48. package/dist/core/export/types.d.ts +84 -0
  49. package/dist/core/export/types.js +25 -0
  50. package/dist/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
  51. package/dist/core/integrations/filter/dsl.d.ts +38 -1
  52. package/dist/core/integrations/filter/dsl.js +20 -2
  53. package/dist/core/integrations/filter/extractors.js +42 -0
  54. package/dist/core/integrations/integration-dsl.d.ts +10 -0
  55. package/dist/core/integrations/supabase.d.ts +8 -0
  56. package/dist/core/integrations/supabase.js +11 -0
  57. package/dist/core/objects/aggregate/aggregate.diff.d.ts +2 -8
  58. package/dist/core/objects/aggregate/aggregate.diff.js +16 -70
  59. package/dist/core/objects/aggregate/aggregate.model.d.ts +10 -10
  60. package/dist/core/objects/aggregate/aggregate.model.js +8 -10
  61. package/dist/core/objects/aggregate/changes/aggregate.create.js +1 -1
  62. package/dist/core/objects/aggregate/changes/aggregate.drop.js +1 -1
  63. package/dist/core/objects/base.privilege-diff.d.ts +38 -13
  64. package/dist/core/objects/base.privilege-diff.js +104 -22
  65. package/dist/core/objects/base.privilege.d.ts +1 -0
  66. package/dist/core/objects/base.privilege.js +9 -2
  67. package/dist/core/objects/collation/collation.diff.d.ts +2 -3
  68. package/dist/core/objects/collation/collation.model.d.ts +2 -2
  69. package/dist/core/objects/collation/collation.model.js +29 -28
  70. package/dist/core/objects/diff-context.d.ts +15 -0
  71. package/dist/core/objects/diff-context.js +1 -0
  72. package/dist/core/objects/domain/changes/domain.create.js +4 -2
  73. package/dist/core/objects/domain/domain.diff.d.ts +2 -8
  74. package/dist/core/objects/domain/domain.diff.js +16 -77
  75. package/dist/core/objects/domain/domain.model.d.ts +2 -2
  76. package/dist/core/objects/domain/domain.model.js +9 -11
  77. package/dist/core/objects/event-trigger/event-trigger.diff.d.ts +2 -3
  78. package/dist/core/objects/event-trigger/event-trigger.model.d.ts +2 -2
  79. package/dist/core/objects/event-trigger/event-trigger.model.js +7 -9
  80. package/dist/core/objects/extension/extension.model.d.ts +2 -2
  81. package/dist/core/objects/extension/extension.model.js +8 -10
  82. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.d.ts +2 -8
  83. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.js +13 -77
  84. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.d.ts +2 -2
  85. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.js +22 -24
  86. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.d.ts +2 -8
  87. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.js +16 -77
  88. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.d.ts +2 -2
  89. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.js +21 -23
  90. package/dist/core/objects/foreign-data-wrapper/server/server.diff.d.ts +2 -8
  91. package/dist/core/objects/foreign-data-wrapper/server/server.diff.js +13 -77
  92. package/dist/core/objects/foreign-data-wrapper/server/server.model.d.ts +2 -2
  93. package/dist/core/objects/foreign-data-wrapper/server/server.model.js +20 -22
  94. package/dist/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.d.ts +2 -2
  95. package/dist/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.js +20 -22
  96. package/dist/core/objects/index/index.model.d.ts +4 -4
  97. package/dist/core/objects/index/index.model.js +9 -11
  98. package/dist/core/objects/language/language.diff.d.ts +2 -5
  99. package/dist/core/objects/language/language.diff.js +7 -39
  100. package/dist/core/objects/language/language.model.js +5 -7
  101. package/dist/core/objects/materialized-view/materialized-view.diff.d.ts +2 -8
  102. package/dist/core/objects/materialized-view/materialized-view.diff.js +16 -158
  103. package/dist/core/objects/materialized-view/materialized-view.model.d.ts +5 -5
  104. package/dist/core/objects/materialized-view/materialized-view.model.js +9 -11
  105. package/dist/core/objects/procedure/changes/procedure.alter.js +12 -12
  106. package/dist/core/objects/procedure/procedure.diff.d.ts +2 -8
  107. package/dist/core/objects/procedure/procedure.diff.js +16 -77
  108. package/dist/core/objects/procedure/procedure.model.d.ts +11 -11
  109. package/dist/core/objects/procedure/procedure.model.js +9 -11
  110. package/dist/core/objects/publication/changes/publication.alter.d.ts +0 -9
  111. package/dist/core/objects/publication/changes/publication.alter.js +0 -14
  112. package/dist/core/objects/publication/changes/publication.types.d.ts +2 -2
  113. package/dist/core/objects/publication/publication.diff.d.ts +2 -3
  114. package/dist/core/objects/publication/publication.diff.js +8 -13
  115. package/dist/core/objects/publication/publication.model.d.ts +2 -2
  116. package/dist/core/objects/publication/publication.model.js +7 -9
  117. package/dist/core/objects/rls-policy/changes/rls-policy.alter.js +3 -3
  118. package/dist/core/objects/rls-policy/rls-policy.model.d.ts +4 -4
  119. package/dist/core/objects/rls-policy/rls-policy.model.js +8 -10
  120. package/dist/core/objects/role/role.diff.js +22 -1
  121. package/dist/core/objects/role/role.model.d.ts +6 -5
  122. package/dist/core/objects/role/role.model.js +146 -40
  123. package/dist/core/objects/rule/rule.model.d.ts +3 -3
  124. package/dist/core/objects/rule/rule.model.js +7 -9
  125. package/dist/core/objects/schema/schema.diff.d.ts +2 -8
  126. package/dist/core/objects/schema/schema.diff.js +16 -77
  127. package/dist/core/objects/schema/schema.model.d.ts +2 -2
  128. package/dist/core/objects/schema/schema.model.js +9 -11
  129. package/dist/core/objects/sequence/sequence.diff.d.ts +2 -8
  130. package/dist/core/objects/sequence/sequence.diff.js +16 -79
  131. package/dist/core/objects/sequence/sequence.model.d.ts +2 -2
  132. package/dist/core/objects/sequence/sequence.model.js +9 -11
  133. package/dist/core/objects/subscription/subscription.diff.d.ts +2 -3
  134. package/dist/core/objects/subscription/subscription.model.d.ts +2 -2
  135. package/dist/core/objects/subscription/subscription.model.js +25 -20
  136. package/dist/core/objects/table/changes/table.create.js +3 -0
  137. package/dist/core/objects/table/table.diff.d.ts +2 -8
  138. package/dist/core/objects/table/table.diff.js +26 -157
  139. package/dist/core/objects/table/table.model.d.ts +27 -24
  140. package/dist/core/objects/table/table.model.js +12 -11
  141. package/dist/core/objects/trigger/changes/trigger.alter.js +23 -0
  142. package/dist/core/objects/trigger/changes/trigger.create.js +4 -5
  143. package/dist/core/objects/trigger/trigger.model.d.ts +11 -2
  144. package/dist/core/objects/trigger/trigger.model.js +22 -10
  145. package/dist/core/objects/type/composite-type/composite-type.diff.d.ts +2 -8
  146. package/dist/core/objects/type/composite-type/composite-type.diff.js +16 -77
  147. package/dist/core/objects/type/composite-type/composite-type.model.d.ts +5 -5
  148. package/dist/core/objects/type/composite-type/composite-type.model.js +10 -11
  149. package/dist/core/objects/type/enum/enum.diff.d.ts +2 -8
  150. package/dist/core/objects/type/enum/enum.diff.js +25 -112
  151. package/dist/core/objects/type/enum/enum.model.d.ts +2 -2
  152. package/dist/core/objects/type/enum/enum.model.js +23 -25
  153. package/dist/core/objects/type/range/changes/range.create.js +6 -3
  154. package/dist/core/objects/type/range/range.diff.d.ts +2 -8
  155. package/dist/core/objects/type/range/range.diff.js +16 -77
  156. package/dist/core/objects/type/range/range.model.d.ts +2 -2
  157. package/dist/core/objects/type/range/range.model.js +8 -10
  158. package/dist/core/objects/view/view.diff.d.ts +2 -8
  159. package/dist/core/objects/view/view.diff.js +16 -158
  160. package/dist/core/objects/view/view.model.d.ts +20 -6
  161. package/dist/core/objects/view/view.model.js +11 -23
  162. package/dist/core/plan/apply.d.ts +2 -2
  163. package/dist/core/plan/apply.js +33 -16
  164. package/dist/core/plan/create.d.ts +20 -7
  165. package/dist/core/plan/create.js +153 -112
  166. package/dist/core/plan/serialize.js +16 -4
  167. package/dist/core/plan/sql-format/constants.d.ts +2 -0
  168. package/dist/core/plan/sql-format/constants.js +11 -0
  169. package/dist/core/plan/sql-format/fixtures.d.ts +2 -0
  170. package/dist/core/plan/sql-format/fixtures.js +2447 -0
  171. package/dist/core/plan/sql-format/format-utils.d.ts +37 -0
  172. package/dist/core/plan/sql-format/format-utils.js +274 -0
  173. package/dist/core/plan/sql-format/formatters.d.ts +20 -0
  174. package/dist/core/plan/sql-format/formatters.js +737 -0
  175. package/dist/core/plan/sql-format/index.d.ts +2 -0
  176. package/dist/core/plan/sql-format/index.js +98 -0
  177. package/dist/core/plan/sql-format/keyword-case.d.ts +2 -0
  178. package/dist/core/plan/sql-format/keyword-case.js +893 -0
  179. package/dist/core/plan/sql-format/protect.d.ts +3 -0
  180. package/dist/core/plan/sql-format/protect.js +269 -0
  181. package/dist/core/plan/sql-format/sql-scanner.d.ts +59 -0
  182. package/dist/core/plan/sql-format/sql-scanner.js +202 -0
  183. package/dist/core/plan/sql-format/tokenizer.d.ts +22 -0
  184. package/dist/core/plan/sql-format/tokenizer.js +118 -0
  185. package/dist/core/plan/sql-format/types.d.ts +28 -0
  186. package/dist/core/plan/sql-format/types.js +1 -0
  187. package/dist/core/plan/sql-format/wrap.d.ts +2 -0
  188. package/dist/core/plan/sql-format/wrap.js +165 -0
  189. package/dist/core/plan/sql-format.d.ts +2 -0
  190. package/dist/core/plan/sql-format.js +1 -0
  191. package/dist/core/plan/ssl-config.d.ts +32 -0
  192. package/dist/core/plan/ssl-config.js +115 -0
  193. package/dist/core/plan/statements.d.ts +2 -1
  194. package/dist/core/plan/statements.js +6 -2
  195. package/dist/core/plan/types.d.ts +6 -0
  196. package/dist/core/postgres-config.d.ts +47 -3
  197. package/dist/core/postgres-config.js +225 -39
  198. package/dist/core/sort/graph-builder.js +10 -0
  199. package/dist/core/sort/logical-sort.js +31 -23
  200. package/dist/core/test-utils/assert-valid-sql.d.ts +10 -0
  201. package/dist/core/test-utils/assert-valid-sql.js +19 -0
  202. package/dist/index.d.ts +9 -0
  203. package/dist/index.js +9 -1
  204. package/package.json +56 -22
  205. package/src/cli/app.ts +52 -0
  206. package/src/cli/bin/cli.ts +15 -0
  207. package/src/cli/commands/apply.ts +101 -0
  208. package/src/cli/commands/catalog-export.ts +78 -0
  209. package/src/cli/commands/declarative-apply.diagnostics.test.ts +77 -0
  210. package/src/cli/commands/declarative-apply.ts +380 -0
  211. package/src/cli/commands/declarative-export.ts +330 -0
  212. package/src/cli/commands/plan.ts +216 -0
  213. package/src/cli/commands/sync.ts +185 -0
  214. package/src/cli/exit-code.test.ts +19 -0
  215. package/src/cli/exit-code.ts +7 -0
  216. package/src/cli/formatters/index.ts +5 -0
  217. package/src/cli/formatters/tree/tree-builder.ts +380 -0
  218. package/src/cli/formatters/tree/tree-renderer.ts +372 -0
  219. package/src/cli/formatters/tree/tree.ts +238 -0
  220. package/src/cli/utils/apply-display.test.ts +348 -0
  221. package/src/cli/utils/apply-display.ts +238 -0
  222. package/src/cli/utils/export-display.test.ts +103 -0
  223. package/src/cli/utils/export-display.ts +275 -0
  224. package/src/cli/utils/integrations.test.ts +44 -0
  225. package/src/cli/utils/integrations.ts +42 -0
  226. package/src/cli/utils/resolve-input.test.ts +38 -0
  227. package/src/cli/utils/resolve-input.ts +17 -0
  228. package/src/cli/utils.ts +231 -0
  229. package/src/core/catalog-export/index.ts +20 -0
  230. package/src/core/catalog.diff.ts +247 -0
  231. package/src/core/catalog.model.test.ts +122 -0
  232. package/src/core/catalog.model.ts +510 -0
  233. package/src/core/catalog.snapshot.test.ts +477 -0
  234. package/src/core/catalog.snapshot.ts +289 -0
  235. package/src/core/change.types.ts +44 -0
  236. package/src/core/context.ts +26 -0
  237. package/src/core/declarative-apply/discover-sql.test.ts +103 -0
  238. package/src/core/declarative-apply/discover-sql.ts +107 -0
  239. package/src/core/declarative-apply/extract-catalog-providers.ts +220 -0
  240. package/src/core/declarative-apply/index.test.ts +67 -0
  241. package/src/core/declarative-apply/index.ts +205 -0
  242. package/src/core/declarative-apply/round-apply.test.ts +504 -0
  243. package/src/core/declarative-apply/round-apply.ts +562 -0
  244. package/src/core/depend.ts +1870 -0
  245. package/src/core/expand-replace-dependencies.test.ts +70 -0
  246. package/src/core/expand-replace-dependencies.ts +380 -0
  247. package/src/core/export/file-mapper.test.ts +816 -0
  248. package/src/core/export/file-mapper.ts +574 -0
  249. package/src/core/export/grouper.ts +108 -0
  250. package/src/core/export/index.ts +129 -0
  251. package/src/core/export/types.ts +104 -0
  252. package/src/core/fingerprint.ts +204 -0
  253. package/src/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
  254. package/src/core/integrations/filter/dsl.test.ts +211 -0
  255. package/src/core/integrations/filter/dsl.ts +266 -0
  256. package/src/core/integrations/filter/extractors.test.ts +244 -0
  257. package/src/core/integrations/filter/extractors.ts +187 -0
  258. package/src/core/integrations/filter/filter.types.ts +3 -0
  259. package/src/core/integrations/integration-dsl.ts +34 -0
  260. package/src/core/integrations/integration.types.ts +7 -0
  261. package/src/core/integrations/serialize/dsl.test.ts +91 -0
  262. package/src/core/integrations/serialize/dsl.ts +77 -0
  263. package/src/core/integrations/serialize/serialize.types.ts +3 -0
  264. package/src/core/integrations/supabase.ts +130 -0
  265. package/src/core/objects/aggregate/aggregate.diff.test.ts +215 -0
  266. package/src/core/objects/aggregate/aggregate.diff.ts +222 -0
  267. package/src/core/objects/aggregate/aggregate.model.ts +317 -0
  268. package/src/core/objects/aggregate/changes/aggregate.alter.test.ts +66 -0
  269. package/src/core/objects/aggregate/changes/aggregate.alter.ts +32 -0
  270. package/src/core/objects/aggregate/changes/aggregate.base.ts +20 -0
  271. package/src/core/objects/aggregate/changes/aggregate.comment.test.ts +89 -0
  272. package/src/core/objects/aggregate/changes/aggregate.comment.ts +62 -0
  273. package/src/core/objects/aggregate/changes/aggregate.create.test.ts +104 -0
  274. package/src/core/objects/aggregate/changes/aggregate.create.ts +329 -0
  275. package/src/core/objects/aggregate/changes/aggregate.drop.test.ts +82 -0
  276. package/src/core/objects/aggregate/changes/aggregate.drop.ts +32 -0
  277. package/src/core/objects/aggregate/changes/aggregate.privilege.test.ts +136 -0
  278. package/src/core/objects/aggregate/changes/aggregate.privilege.ts +146 -0
  279. package/src/core/objects/aggregate/changes/aggregate.types.ts +12 -0
  280. package/src/core/objects/base.change.ts +62 -0
  281. package/src/core/objects/base.default-privileges.ts +204 -0
  282. package/src/core/objects/base.diff.ts +20 -0
  283. package/src/core/objects/base.model.ts +82 -0
  284. package/src/core/objects/base.privilege-diff.ts +447 -0
  285. package/src/core/objects/base.privilege.ts +191 -0
  286. package/src/core/objects/collation/changes/collation.alter.test.ts +68 -0
  287. package/src/core/objects/collation/changes/collation.alter.ts +79 -0
  288. package/src/core/objects/collation/changes/collation.base.ts +20 -0
  289. package/src/core/objects/collation/changes/collation.comment.ts +68 -0
  290. package/src/core/objects/collation/changes/collation.create.test.ts +56 -0
  291. package/src/core/objects/collation/changes/collation.create.ts +106 -0
  292. package/src/core/objects/collation/changes/collation.drop.test.ts +31 -0
  293. package/src/core/objects/collation/changes/collation.drop.ts +37 -0
  294. package/src/core/objects/collation/changes/collation.types.ts +10 -0
  295. package/src/core/objects/collation/collation.diff.test.ts +97 -0
  296. package/src/core/objects/collation/collation.diff.ts +127 -0
  297. package/src/core/objects/collation/collation.model.ts +224 -0
  298. package/src/core/objects/diff-context.ts +16 -0
  299. package/src/core/objects/domain/changes/domain.alter.test.ts +335 -0
  300. package/src/core/objects/domain/changes/domain.alter.ts +286 -0
  301. package/src/core/objects/domain/changes/domain.base.ts +20 -0
  302. package/src/core/objects/domain/changes/domain.comment.ts +59 -0
  303. package/src/core/objects/domain/changes/domain.create.test.ts +95 -0
  304. package/src/core/objects/domain/changes/domain.create.ts +124 -0
  305. package/src/core/objects/domain/changes/domain.drop.test.ts +33 -0
  306. package/src/core/objects/domain/changes/domain.drop.ts +34 -0
  307. package/src/core/objects/domain/changes/domain.privilege.ts +171 -0
  308. package/src/core/objects/domain/changes/domain.types.ts +12 -0
  309. package/src/core/objects/domain/domain.diff.test.ts +284 -0
  310. package/src/core/objects/domain/domain.diff.ts +295 -0
  311. package/src/core/objects/domain/domain.model.ts +190 -0
  312. package/src/core/objects/event-trigger/changes/event-trigger.alter.test.ts +57 -0
  313. package/src/core/objects/event-trigger/changes/event-trigger.alter.ts +82 -0
  314. package/src/core/objects/event-trigger/changes/event-trigger.base.ts +20 -0
  315. package/src/core/objects/event-trigger/changes/event-trigger.comment.ts +66 -0
  316. package/src/core/objects/event-trigger/changes/event-trigger.create.test.ts +27 -0
  317. package/src/core/objects/event-trigger/changes/event-trigger.create.ts +72 -0
  318. package/src/core/objects/event-trigger/changes/event-trigger.drop.test.ts +25 -0
  319. package/src/core/objects/event-trigger/changes/event-trigger.drop.ts +34 -0
  320. package/src/core/objects/event-trigger/changes/event-trigger.types.ts +10 -0
  321. package/src/core/objects/event-trigger/event-trigger.diff.test.ts +131 -0
  322. package/src/core/objects/event-trigger/event-trigger.diff.ts +127 -0
  323. package/src/core/objects/event-trigger/event-trigger.model.ts +106 -0
  324. package/src/core/objects/extension/changes/extension.alter.test.ts +63 -0
  325. package/src/core/objects/extension/changes/extension.alter.ts +78 -0
  326. package/src/core/objects/extension/changes/extension.base.ts +20 -0
  327. package/src/core/objects/extension/changes/extension.comment.ts +64 -0
  328. package/src/core/objects/extension/changes/extension.create.test.ts +28 -0
  329. package/src/core/objects/extension/changes/extension.create.ts +63 -0
  330. package/src/core/objects/extension/changes/extension.drop.test.ts +26 -0
  331. package/src/core/objects/extension/changes/extension.drop.ts +34 -0
  332. package/src/core/objects/extension/changes/extension.types.ts +10 -0
  333. package/src/core/objects/extension/extension.diff.test.ts +42 -0
  334. package/src/core/objects/extension/extension.diff.ts +90 -0
  335. package/src/core/objects/extension/extension.model.test.ts +98 -0
  336. package/src/core/objects/extension/extension.model.ts +280 -0
  337. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.test.ts +136 -0
  338. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.ts +101 -0
  339. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.base.ts +20 -0
  340. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.ts +72 -0
  341. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.test.ts +160 -0
  342. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.ts +95 -0
  343. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.test.ts +26 -0
  344. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.ts +36 -0
  345. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.ts +172 -0
  346. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.ts +12 -0
  347. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.test.ts +286 -0
  348. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.ts +271 -0
  349. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.ts +149 -0
  350. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.ts +10 -0
  351. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.test.ts +340 -0
  352. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.ts +341 -0
  353. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.base.ts +20 -0
  354. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.ts +72 -0
  355. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.test.ts +210 -0
  356. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.ts +81 -0
  357. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.test.ts +46 -0
  358. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.ts +37 -0
  359. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.ts +181 -0
  360. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.ts +12 -0
  361. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.test.ts +813 -0
  362. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.ts +343 -0
  363. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.ts +242 -0
  364. package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.test.ts +183 -0
  365. package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.ts +126 -0
  366. package/src/core/objects/foreign-data-wrapper/server/changes/server.base.ts +20 -0
  367. package/src/core/objects/foreign-data-wrapper/server/changes/server.comment.ts +60 -0
  368. package/src/core/objects/foreign-data-wrapper/server/changes/server.create.test.ts +144 -0
  369. package/src/core/objects/foreign-data-wrapper/server/changes/server.create.ts +81 -0
  370. package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.test.ts +27 -0
  371. package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.ts +34 -0
  372. package/src/core/objects/foreign-data-wrapper/server/changes/server.privilege.ts +164 -0
  373. package/src/core/objects/foreign-data-wrapper/server/changes/server.types.ts +12 -0
  374. package/src/core/objects/foreign-data-wrapper/server/server.diff.test.ts +262 -0
  375. package/src/core/objects/foreign-data-wrapper/server/server.diff.ts +247 -0
  376. package/src/core/objects/foreign-data-wrapper/server/server.model.ts +133 -0
  377. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.test.ts +91 -0
  378. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.ts +69 -0
  379. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.base.ts +20 -0
  380. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.test.ts +96 -0
  381. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.ts +66 -0
  382. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.test.ts +60 -0
  383. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.ts +40 -0
  384. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.ts +8 -0
  385. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.test.ts +77 -0
  386. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.ts +107 -0
  387. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.ts +96 -0
  388. package/src/core/objects/index/changes/index.alter.test.ts +209 -0
  389. package/src/core/objects/index/changes/index.alter.ts +144 -0
  390. package/src/core/objects/index/changes/index.base.ts +20 -0
  391. package/src/core/objects/index/changes/index.comment.ts +63 -0
  392. package/src/core/objects/index/changes/index.create.test.ts +69 -0
  393. package/src/core/objects/index/changes/index.create.ts +68 -0
  394. package/src/core/objects/index/changes/index.drop.test.ts +47 -0
  395. package/src/core/objects/index/changes/index.drop.ts +34 -0
  396. package/src/core/objects/index/changes/index.types.ts +6 -0
  397. package/src/core/objects/index/changes/utils.ts +16 -0
  398. package/src/core/objects/index/index.diff.test.ts +153 -0
  399. package/src/core/objects/index/index.diff.ts +243 -0
  400. package/src/core/objects/index/index.model.ts +370 -0
  401. package/src/core/objects/language/changes/language.alter.test.ts +36 -0
  402. package/src/core/objects/language/changes/language.alter.ts +53 -0
  403. package/src/core/objects/language/changes/language.base.ts +20 -0
  404. package/src/core/objects/language/changes/language.comment.ts +58 -0
  405. package/src/core/objects/language/changes/language.create.test.ts +30 -0
  406. package/src/core/objects/language/changes/language.create.ts +104 -0
  407. package/src/core/objects/language/changes/language.drop.test.ts +28 -0
  408. package/src/core/objects/language/changes/language.drop.ts +39 -0
  409. package/src/core/objects/language/changes/language.privilege.ts +172 -0
  410. package/src/core/objects/language/changes/language.types.ts +12 -0
  411. package/src/core/objects/language/language.diff.test.ts +135 -0
  412. package/src/core/objects/language/language.diff.ts +144 -0
  413. package/src/core/objects/language/language.model.ts +150 -0
  414. package/src/core/objects/materialized-view/changes/materialized-view.alter.test.ts +130 -0
  415. package/src/core/objects/materialized-view/changes/materialized-view.alter.ts +113 -0
  416. package/src/core/objects/materialized-view/changes/materialized-view.base.ts +20 -0
  417. package/src/core/objects/materialized-view/changes/materialized-view.comment.ts +176 -0
  418. package/src/core/objects/materialized-view/changes/materialized-view.create.test.ts +69 -0
  419. package/src/core/objects/materialized-view/changes/materialized-view.create.ts +93 -0
  420. package/src/core/objects/materialized-view/changes/materialized-view.drop.test.ts +37 -0
  421. package/src/core/objects/materialized-view/changes/materialized-view.drop.ts +60 -0
  422. package/src/core/objects/materialized-view/changes/materialized-view.privilege.ts +212 -0
  423. package/src/core/objects/materialized-view/changes/materialized-view.types.ts +12 -0
  424. package/src/core/objects/materialized-view/materialized-view.diff.test.ts +264 -0
  425. package/src/core/objects/materialized-view/materialized-view.diff.ts +301 -0
  426. package/src/core/objects/materialized-view/materialized-view.model.ts +258 -0
  427. package/src/core/objects/procedure/changes/procedure.alter.test.ts +1077 -0
  428. package/src/core/objects/procedure/changes/procedure.alter.ts +290 -0
  429. package/src/core/objects/procedure/changes/procedure.base.ts +20 -0
  430. package/src/core/objects/procedure/changes/procedure.comment.ts +70 -0
  431. package/src/core/objects/procedure/changes/procedure.create.test.ts +51 -0
  432. package/src/core/objects/procedure/changes/procedure.create.ts +92 -0
  433. package/src/core/objects/procedure/changes/procedure.drop.test.ts +90 -0
  434. package/src/core/objects/procedure/changes/procedure.drop.ts +49 -0
  435. package/src/core/objects/procedure/changes/procedure.privilege.ts +188 -0
  436. package/src/core/objects/procedure/changes/procedure.types.ts +12 -0
  437. package/src/core/objects/procedure/procedure.diff.test.ts +161 -0
  438. package/src/core/objects/procedure/procedure.diff.ts +341 -0
  439. package/src/core/objects/procedure/procedure.model.ts +264 -0
  440. package/src/core/objects/procedure/utils.ts +58 -0
  441. package/src/core/objects/publication/changes/publication.alter.test.ts +217 -0
  442. package/src/core/objects/publication/changes/publication.alter.ts +225 -0
  443. package/src/core/objects/publication/changes/publication.base.ts +20 -0
  444. package/src/core/objects/publication/changes/publication.comment.test.ts +73 -0
  445. package/src/core/objects/publication/changes/publication.comment.ts +64 -0
  446. package/src/core/objects/publication/changes/publication.create.test.ts +90 -0
  447. package/src/core/objects/publication/changes/publication.create.ts +82 -0
  448. package/src/core/objects/publication/changes/publication.drop.test.ts +48 -0
  449. package/src/core/objects/publication/changes/publication.drop.ts +29 -0
  450. package/src/core/objects/publication/changes/publication.types.ts +24 -0
  451. package/src/core/objects/publication/publication.diff.test.ts +297 -0
  452. package/src/core/objects/publication/publication.diff.ts +247 -0
  453. package/src/core/objects/publication/publication.model.ts +206 -0
  454. package/src/core/objects/publication/utils.ts +55 -0
  455. package/src/core/objects/rls-policy/changes/rls-policy.alter.test.ts +267 -0
  456. package/src/core/objects/rls-policy/changes/rls-policy.alter.ts +128 -0
  457. package/src/core/objects/rls-policy/changes/rls-policy.base.ts +20 -0
  458. package/src/core/objects/rls-policy/changes/rls-policy.comment.ts +69 -0
  459. package/src/core/objects/rls-policy/changes/rls-policy.create.test.ts +81 -0
  460. package/src/core/objects/rls-policy/changes/rls-policy.create.ts +100 -0
  461. package/src/core/objects/rls-policy/changes/rls-policy.drop.test.ts +31 -0
  462. package/src/core/objects/rls-policy/changes/rls-policy.drop.ts +39 -0
  463. package/src/core/objects/rls-policy/changes/rls-policy.types.ts +10 -0
  464. package/src/core/objects/rls-policy/rls-policy.diff.test.ts +79 -0
  465. package/src/core/objects/rls-policy/rls-policy.diff.ts +121 -0
  466. package/src/core/objects/rls-policy/rls-policy.model.ts +140 -0
  467. package/src/core/objects/role/changes/role.alter.test.ts +362 -0
  468. package/src/core/objects/role/changes/role.alter.ts +110 -0
  469. package/src/core/objects/role/changes/role.base.ts +24 -0
  470. package/src/core/objects/role/changes/role.comment.ts +55 -0
  471. package/src/core/objects/role/changes/role.create.test.ts +56 -0
  472. package/src/core/objects/role/changes/role.create.ts +102 -0
  473. package/src/core/objects/role/changes/role.drop.test.ts +32 -0
  474. package/src/core/objects/role/changes/role.drop.ts +34 -0
  475. package/src/core/objects/role/changes/role.privilege.ts +376 -0
  476. package/src/core/objects/role/changes/role.types.ts +12 -0
  477. package/src/core/objects/role/role.diff.test.ts +279 -0
  478. package/src/core/objects/role/role.diff.ts +499 -0
  479. package/src/core/objects/role/role.model.ts +452 -0
  480. package/src/core/objects/rule/changes/rule.alter.test.ts +82 -0
  481. package/src/core/objects/rule/changes/rule.alter.ts +72 -0
  482. package/src/core/objects/rule/changes/rule.base.ts +20 -0
  483. package/src/core/objects/rule/changes/rule.comment.test.ts +58 -0
  484. package/src/core/objects/rule/changes/rule.comment.ts +62 -0
  485. package/src/core/objects/rule/changes/rule.create.test.ts +63 -0
  486. package/src/core/objects/rule/changes/rule.create.ts +42 -0
  487. package/src/core/objects/rule/changes/rule.drop.test.ts +40 -0
  488. package/src/core/objects/rule/changes/rule.drop.ts +29 -0
  489. package/src/core/objects/rule/changes/rule.types.ts +12 -0
  490. package/src/core/objects/rule/rule.diff.test.ts +132 -0
  491. package/src/core/objects/rule/rule.diff.ts +79 -0
  492. package/src/core/objects/rule/rule.model.ts +173 -0
  493. package/src/core/objects/schema/changes/schema.alter.test.ts +31 -0
  494. package/src/core/objects/schema/changes/schema.alter.ts +45 -0
  495. package/src/core/objects/schema/changes/schema.base.ts +20 -0
  496. package/src/core/objects/schema/changes/schema.comment.ts +56 -0
  497. package/src/core/objects/schema/changes/schema.create.test.ts +25 -0
  498. package/src/core/objects/schema/changes/schema.create.ts +47 -0
  499. package/src/core/objects/schema/changes/schema.drop.test.ts +23 -0
  500. package/src/core/objects/schema/changes/schema.drop.ts +34 -0
  501. package/src/core/objects/schema/changes/schema.privilege.ts +175 -0
  502. package/src/core/objects/schema/changes/schema.types.ts +12 -0
  503. package/src/core/objects/schema/schema.diff.test.ts +42 -0
  504. package/src/core/objects/schema/schema.diff.ts +146 -0
  505. package/src/core/objects/schema/schema.model.ts +107 -0
  506. package/src/core/objects/sequence/changes/sequence.alter.test.ts +157 -0
  507. package/src/core/objects/sequence/changes/sequence.alter.ts +115 -0
  508. package/src/core/objects/sequence/changes/sequence.base.ts +20 -0
  509. package/src/core/objects/sequence/changes/sequence.comment.ts +60 -0
  510. package/src/core/objects/sequence/changes/sequence.create.test.ts +89 -0
  511. package/src/core/objects/sequence/changes/sequence.create.ts +111 -0
  512. package/src/core/objects/sequence/changes/sequence.drop.test.ts +35 -0
  513. package/src/core/objects/sequence/changes/sequence.drop.ts +37 -0
  514. package/src/core/objects/sequence/changes/sequence.privilege.ts +179 -0
  515. package/src/core/objects/sequence/changes/sequence.types.ts +12 -0
  516. package/src/core/objects/sequence/sequence.diff.test.ts +255 -0
  517. package/src/core/objects/sequence/sequence.diff.ts +294 -0
  518. package/src/core/objects/sequence/sequence.model.ts +185 -0
  519. package/src/core/objects/subscription/changes/subscription.alter.test.ts +134 -0
  520. package/src/core/objects/subscription/changes/subscription.alter.ts +110 -0
  521. package/src/core/objects/subscription/changes/subscription.base.ts +20 -0
  522. package/src/core/objects/subscription/changes/subscription.comment.test.ts +70 -0
  523. package/src/core/objects/subscription/changes/subscription.comment.ts +64 -0
  524. package/src/core/objects/subscription/changes/subscription.create.test.ts +80 -0
  525. package/src/core/objects/subscription/changes/subscription.create.ts +69 -0
  526. package/src/core/objects/subscription/changes/subscription.drop.test.ts +48 -0
  527. package/src/core/objects/subscription/changes/subscription.drop.ts +20 -0
  528. package/src/core/objects/subscription/changes/subscription.types.ts +22 -0
  529. package/src/core/objects/subscription/subscription.diff.test.ts +237 -0
  530. package/src/core/objects/subscription/subscription.diff.ts +242 -0
  531. package/src/core/objects/subscription/subscription.model.ts +190 -0
  532. package/src/core/objects/subscription/utils.ts +156 -0
  533. package/src/core/objects/table/changes/table.alter.test.ts +846 -0
  534. package/src/core/objects/table/changes/table.alter.ts +806 -0
  535. package/src/core/objects/table/changes/table.base.ts +20 -0
  536. package/src/core/objects/table/changes/table.comment.ts +266 -0
  537. package/src/core/objects/table/changes/table.create.test.ts +188 -0
  538. package/src/core/objects/table/changes/table.create.ts +192 -0
  539. package/src/core/objects/table/changes/table.drop.test.ts +36 -0
  540. package/src/core/objects/table/changes/table.drop.ts +45 -0
  541. package/src/core/objects/table/changes/table.privilege.ts +200 -0
  542. package/src/core/objects/table/changes/table.types.ts +12 -0
  543. package/src/core/objects/table/table.diff.test.ts +868 -0
  544. package/src/core/objects/table/table.diff.ts +817 -0
  545. package/src/core/objects/table/table.model.ts +460 -0
  546. package/src/core/objects/trigger/changes/trigger.alter.test.ts +50 -0
  547. package/src/core/objects/trigger/changes/trigger.alter.ts +76 -0
  548. package/src/core/objects/trigger/changes/trigger.base.ts +20 -0
  549. package/src/core/objects/trigger/changes/trigger.comment.ts +64 -0
  550. package/src/core/objects/trigger/changes/trigger.create.test.ts +47 -0
  551. package/src/core/objects/trigger/changes/trigger.create.ts +88 -0
  552. package/src/core/objects/trigger/changes/trigger.drop.test.ts +47 -0
  553. package/src/core/objects/trigger/changes/trigger.drop.ts +39 -0
  554. package/src/core/objects/trigger/changes/trigger.types.ts +10 -0
  555. package/src/core/objects/trigger/trigger.diff.test.ts +84 -0
  556. package/src/core/objects/trigger/trigger.diff.ts +116 -0
  557. package/src/core/objects/trigger/trigger.model.ts +264 -0
  558. package/src/core/objects/type/composite-type/changes/composite-type.alter.test.ts +208 -0
  559. package/src/core/objects/type/composite-type/changes/composite-type.alter.ts +174 -0
  560. package/src/core/objects/type/composite-type/changes/composite-type.base.ts +20 -0
  561. package/src/core/objects/type/composite-type/changes/composite-type.comment.ts +145 -0
  562. package/src/core/objects/type/composite-type/changes/composite-type.create.test.ts +106 -0
  563. package/src/core/objects/type/composite-type/changes/composite-type.create.ts +95 -0
  564. package/src/core/objects/type/composite-type/changes/composite-type.drop.test.ts +36 -0
  565. package/src/core/objects/type/composite-type/changes/composite-type.drop.ts +37 -0
  566. package/src/core/objects/type/composite-type/changes/composite-type.privilege.ts +175 -0
  567. package/src/core/objects/type/composite-type/changes/composite-type.types.ts +12 -0
  568. package/src/core/objects/type/composite-type/composite-type.diff.test.ts +269 -0
  569. package/src/core/objects/type/composite-type/composite-type.diff.ts +310 -0
  570. package/src/core/objects/type/composite-type/composite-type.model.ts +253 -0
  571. package/src/core/objects/type/enum/changes/enum.alter.test.ts +113 -0
  572. package/src/core/objects/type/enum/changes/enum.alter.ts +91 -0
  573. package/src/core/objects/type/enum/changes/enum.base.ts +20 -0
  574. package/src/core/objects/type/enum/changes/enum.comment.ts +64 -0
  575. package/src/core/objects/type/enum/changes/enum.create.test.ts +31 -0
  576. package/src/core/objects/type/enum/changes/enum.create.ts +56 -0
  577. package/src/core/objects/type/enum/changes/enum.drop.test.ts +28 -0
  578. package/src/core/objects/type/enum/changes/enum.drop.ts +34 -0
  579. package/src/core/objects/type/enum/changes/enum.privilege.ts +175 -0
  580. package/src/core/objects/type/enum/changes/enum.types.ts +12 -0
  581. package/src/core/objects/type/enum/enum.diff.test.ts +372 -0
  582. package/src/core/objects/type/enum/enum.diff.ts +308 -0
  583. package/src/core/objects/type/enum/enum.model.ts +194 -0
  584. package/src/core/objects/type/range/changes/range.alter.test.ts +29 -0
  585. package/src/core/objects/type/range/changes/range.alter.ts +51 -0
  586. package/src/core/objects/type/range/changes/range.base.ts +20 -0
  587. package/src/core/objects/type/range/changes/range.comment.ts +64 -0
  588. package/src/core/objects/type/range/changes/range.create.test.ts +54 -0
  589. package/src/core/objects/type/range/changes/range.create.ts +155 -0
  590. package/src/core/objects/type/range/changes/range.drop.test.ts +28 -0
  591. package/src/core/objects/type/range/changes/range.drop.ts +34 -0
  592. package/src/core/objects/type/range/changes/range.privilege.ts +175 -0
  593. package/src/core/objects/type/range/changes/range.types.ts +12 -0
  594. package/src/core/objects/type/range/range.diff.test.ts +147 -0
  595. package/src/core/objects/type/range/range.diff.ts +197 -0
  596. package/src/core/objects/type/range/range.model.ts +187 -0
  597. package/src/core/objects/type/type.types.ts +5 -0
  598. package/src/core/objects/utils.ts +171 -0
  599. package/src/core/objects/view/changes/view.alter.test.ts +115 -0
  600. package/src/core/objects/view/changes/view.alter.ts +112 -0
  601. package/src/core/objects/view/changes/view.base.ts +20 -0
  602. package/src/core/objects/view/changes/view.comment.ts +59 -0
  603. package/src/core/objects/view/changes/view.create.test.ts +70 -0
  604. package/src/core/objects/view/changes/view.create.ts +73 -0
  605. package/src/core/objects/view/changes/view.drop.test.ts +37 -0
  606. package/src/core/objects/view/changes/view.drop.ts +40 -0
  607. package/src/core/objects/view/changes/view.privilege.ts +200 -0
  608. package/src/core/objects/view/changes/view.types.ts +12 -0
  609. package/src/core/objects/view/view.diff.test.ts +173 -0
  610. package/src/core/objects/view/view.diff.ts +215 -0
  611. package/src/core/objects/view/view.model.ts +262 -0
  612. package/src/core/plan/apply.ts +172 -0
  613. package/src/core/plan/create.ts +384 -0
  614. package/src/core/plan/hierarchy.ts +574 -0
  615. package/src/core/plan/index.ts +29 -0
  616. package/src/core/plan/io.ts +20 -0
  617. package/src/core/plan/risk.ts +48 -0
  618. package/src/core/plan/serialize.test.ts +317 -0
  619. package/src/core/plan/serialize.ts +209 -0
  620. package/src/core/plan/sql-format/constants.ts +13 -0
  621. package/src/core/plan/sql-format/fixtures.ts +2803 -0
  622. package/src/core/plan/sql-format/format-comment-literals.test.ts +96 -0
  623. package/src/core/plan/sql-format/format-functions.test.ts +127 -0
  624. package/src/core/plan/sql-format/format-lowercase-coverage.test.ts +119 -0
  625. package/src/core/plan/sql-format/format-off.test.ts +806 -0
  626. package/src/core/plan/sql-format/format-pretty-lower-leading.test.ts +1061 -0
  627. package/src/core/plan/sql-format/format-pretty-narrow.test.ts +1279 -0
  628. package/src/core/plan/sql-format/format-pretty-preserve.test.ts +1057 -0
  629. package/src/core/plan/sql-format/format-pretty-upper.test.ts +1048 -0
  630. package/src/core/plan/sql-format/format-stress.test.ts +616 -0
  631. package/src/core/plan/sql-format/format-utils.test.ts +91 -0
  632. package/src/core/plan/sql-format/format-utils.ts +391 -0
  633. package/src/core/plan/sql-format/formatters.ts +921 -0
  634. package/src/core/plan/sql-format/index.ts +149 -0
  635. package/src/core/plan/sql-format/keyword-case.test.ts +118 -0
  636. package/src/core/plan/sql-format/keyword-case.ts +1120 -0
  637. package/src/core/plan/sql-format/protect.test.ts +127 -0
  638. package/src/core/plan/sql-format/protect.ts +337 -0
  639. package/src/core/plan/sql-format/sql-scanner.test.ts +240 -0
  640. package/src/core/plan/sql-format/sql-scanner.ts +252 -0
  641. package/src/core/plan/sql-format/tokenizer.test.ts +68 -0
  642. package/src/core/plan/sql-format/tokenizer.ts +152 -0
  643. package/src/core/plan/sql-format/types.ts +31 -0
  644. package/src/core/plan/sql-format/wrap.test.ts +119 -0
  645. package/src/core/plan/sql-format/wrap.ts +196 -0
  646. package/src/core/plan/sql-format.ts +2 -0
  647. package/src/core/plan/ssl-config.ts +172 -0
  648. package/src/core/plan/statements.ts +22 -0
  649. package/src/core/plan/types.ts +171 -0
  650. package/src/core/postgres-config.ts +293 -0
  651. package/src/core/sort/custom-constraints.ts +161 -0
  652. package/src/core/sort/debug-visualization.ts +239 -0
  653. package/src/core/sort/dependency-filter.ts +224 -0
  654. package/src/core/sort/graph-builder.ts +235 -0
  655. package/src/core/sort/graph-utils.ts +51 -0
  656. package/src/core/sort/logical-sort.test.ts +371 -0
  657. package/src/core/sort/logical-sort.ts +597 -0
  658. package/src/core/sort/sort-changes.ts +234 -0
  659. package/src/core/sort/topological-sort.test.ts +275 -0
  660. package/src/core/sort/topological-sort.ts +184 -0
  661. package/src/core/sort/types.ts +112 -0
  662. package/src/core/sort/utils.ts +69 -0
  663. package/src/core/test-utils/assert-valid-sql.ts +20 -0
  664. package/src/index.ts +41 -0
@@ -0,0 +1,215 @@
1
+ import { diffObjects } from "../base.diff.ts";
2
+ import {
3
+ diffPrivileges,
4
+ emitColumnPrivilegeChanges,
5
+ } from "../base.privilege-diff.ts";
6
+ import type { ObjectDiffContext } from "../diff-context.ts";
7
+ import { deepEqual, hasNonAlterableChanges } from "../utils.ts";
8
+ import {
9
+ AlterViewChangeOwner,
10
+ AlterViewResetOptions,
11
+ AlterViewSetOptions,
12
+ } from "./changes/view.alter.ts";
13
+ import {
14
+ CreateCommentOnView,
15
+ DropCommentOnView,
16
+ } from "./changes/view.comment.ts";
17
+ import { CreateView } from "./changes/view.create.ts";
18
+ import { DropView } from "./changes/view.drop.ts";
19
+ import {
20
+ GrantViewPrivileges,
21
+ RevokeGrantOptionViewPrivileges,
22
+ RevokeViewPrivileges,
23
+ } from "./changes/view.privilege.ts";
24
+ import type { ViewChange } from "./changes/view.types.ts";
25
+ import type { View } from "./view.model.ts";
26
+
27
+ /**
28
+ * Diff two sets of views from main and branch catalogs.
29
+ *
30
+ * @param ctx - Context containing version, currentUser, and defaultPrivilegeState
31
+ * @param main - The views in the main catalog.
32
+ * @param branch - The views in the branch catalog.
33
+ * @returns A list of changes to apply to main to make it match branch.
34
+ */
35
+ export function diffViews(
36
+ ctx: Pick<
37
+ ObjectDiffContext,
38
+ "version" | "currentUser" | "defaultPrivilegeState"
39
+ >,
40
+ main: Record<string, View>,
41
+ branch: Record<string, View>,
42
+ ): ViewChange[] {
43
+ const { created, dropped, altered } = diffObjects(main, branch);
44
+
45
+ const changes: ViewChange[] = [];
46
+
47
+ for (const viewId of created) {
48
+ const v = branch[viewId];
49
+ changes.push(new CreateView({ view: v }));
50
+
51
+ // OWNER: If the view should be owned by someone other than the current user,
52
+ // emit ALTER VIEW ... OWNER TO after creation
53
+ if (v.owner !== ctx.currentUser) {
54
+ changes.push(new AlterViewChangeOwner({ view: v, owner: v.owner }));
55
+ }
56
+
57
+ if (v.comment !== null) {
58
+ changes.push(new CreateCommentOnView({ view: v }));
59
+ }
60
+
61
+ // PRIVILEGES: For created objects, compare against default privileges state
62
+ // The migration script will run ALTER DEFAULT PRIVILEGES before CREATE (via constraint spec),
63
+ // so objects are created with the default privileges state in effect.
64
+ // We compare default privileges against desired privileges to generate REVOKE/GRANT statements
65
+ // needed to reach the final desired state.
66
+ const effectiveDefaults = ctx.defaultPrivilegeState.getEffectiveDefaults(
67
+ ctx.currentUser,
68
+ "view",
69
+ v.schema ?? "",
70
+ );
71
+ const creatorFilteredDefaults =
72
+ v.owner !== ctx.currentUser
73
+ ? effectiveDefaults.filter((p) => p.grantee !== ctx.currentUser)
74
+ : effectiveDefaults;
75
+ const desiredPrivileges = v.privileges;
76
+ // Filter out owner privileges - owner always has ALL privileges implicitly
77
+ // and shouldn't be compared. Use the view owner as the reference.
78
+ const privilegeResults = diffPrivileges(
79
+ creatorFilteredDefaults,
80
+ desiredPrivileges,
81
+ v.owner,
82
+ );
83
+
84
+ changes.push(
85
+ ...(emitColumnPrivilegeChanges(
86
+ privilegeResults,
87
+ v,
88
+ v,
89
+ "view",
90
+ {
91
+ Grant: GrantViewPrivileges,
92
+ Revoke: RevokeViewPrivileges,
93
+ RevokeGrantOption: RevokeGrantOptionViewPrivileges,
94
+ },
95
+ effectiveDefaults,
96
+ ctx.version,
97
+ ) as ViewChange[]),
98
+ );
99
+ }
100
+
101
+ for (const viewId of dropped) {
102
+ changes.push(new DropView({ view: main[viewId] }));
103
+ }
104
+
105
+ for (const viewId of altered) {
106
+ const mainView = main[viewId];
107
+ const branchView = branch[viewId];
108
+
109
+ // Check if non-alterable properties have changed
110
+ // These require dropping and recreating the view
111
+ const NON_ALTERABLE_FIELDS: Array<keyof View> = [
112
+ "definition",
113
+ "row_security",
114
+ "force_row_security",
115
+ "has_indexes",
116
+ "has_rules",
117
+ "has_triggers",
118
+ "has_subclasses",
119
+ "is_populated",
120
+ "replica_identity",
121
+ "is_partition",
122
+ "partition_bound",
123
+ ];
124
+ const nonAlterablePropsChanged = hasNonAlterableChanges(
125
+ mainView,
126
+ branchView,
127
+ NON_ALTERABLE_FIELDS,
128
+ { options: deepEqual },
129
+ );
130
+
131
+ if (nonAlterablePropsChanged) {
132
+ // Replace the entire view using CREATE OR REPLACE to avoid drop when possible
133
+ changes.push(new CreateView({ view: branchView, orReplace: true }));
134
+ } else {
135
+ // Only alterable properties changed - check each one
136
+
137
+ // OWNER
138
+ if (mainView.owner !== branchView.owner) {
139
+ changes.push(
140
+ new AlterViewChangeOwner({ view: mainView, owner: branchView.owner }),
141
+ );
142
+ }
143
+
144
+ // VIEW OPTIONS (WITH (...))
145
+ if (!deepEqual(mainView.options, branchView.options)) {
146
+ const mainOpts = mainView.options ?? [];
147
+ const branchOpts = branchView.options ?? [];
148
+
149
+ // Always set branch options when provided
150
+ if (branchOpts.length > 0) {
151
+ changes.push(
152
+ new AlterViewSetOptions({ view: mainView, options: branchOpts }),
153
+ );
154
+ }
155
+
156
+ // Reset any params that are present in main but absent in branch
157
+ if (mainOpts.length > 0) {
158
+ const mainNames = new Set(mainOpts.map((opt) => opt.split("=")[0]));
159
+ const branchNames = new Set(
160
+ branchOpts.map((opt) => opt.split("=")[0]),
161
+ );
162
+ const removed: string[] = [];
163
+ for (const name of mainNames) {
164
+ if (!branchNames.has(name)) removed.push(name);
165
+ }
166
+ if (removed.length > 0) {
167
+ changes.push(
168
+ new AlterViewResetOptions({ view: mainView, params: removed }),
169
+ );
170
+ }
171
+ }
172
+ }
173
+
174
+ // COMMENT
175
+ if (mainView.comment !== branchView.comment) {
176
+ if (branchView.comment === null) {
177
+ changes.push(new DropCommentOnView({ view: mainView }));
178
+ } else {
179
+ changes.push(new CreateCommentOnView({ view: branchView }));
180
+ }
181
+ }
182
+
183
+ // Note: View renaming would also use ALTER VIEW ... RENAME TO ...
184
+ // But since our View model uses 'name' as the identity field,
185
+ // a name change would be handled as drop + create by diffObjects()
186
+
187
+ // PRIVILEGES (unified object and column privileges)
188
+ // Filter out owner privileges - owner always has ALL privileges implicitly
189
+ // and shouldn't be compared. Use branch owner as the reference.
190
+ const privilegeResults = diffPrivileges(
191
+ mainView.privileges,
192
+ branchView.privileges,
193
+ branchView.owner,
194
+ );
195
+
196
+ changes.push(
197
+ ...(emitColumnPrivilegeChanges(
198
+ privilegeResults,
199
+ branchView,
200
+ mainView,
201
+ "view",
202
+ {
203
+ Grant: GrantViewPrivileges,
204
+ Revoke: RevokeViewPrivileges,
205
+ RevokeGrantOption: RevokeGrantOptionViewPrivileges,
206
+ },
207
+ mainView.privileges,
208
+ ctx.version,
209
+ ) as ViewChange[]),
210
+ );
211
+ }
212
+ }
213
+
214
+ return changes;
215
+ }
@@ -0,0 +1,262 @@
1
+ import { sql } from "@ts-safeql/sql-tag";
2
+ import type { Pool } from "pg";
3
+ import z from "zod";
4
+ import {
5
+ BasePgModel,
6
+ columnPropsSchema,
7
+ normalizeColumns,
8
+ type TableLikeObject,
9
+ } from "../base.model.ts";
10
+ import {
11
+ type PrivilegeProps,
12
+ privilegePropsSchema,
13
+ } from "../base.privilege-diff.ts";
14
+ import { ReplicaIdentitySchema } from "../table/table.model.ts";
15
+
16
+ const viewPropsSchema = z.object({
17
+ schema: z.string(),
18
+ name: z.string(),
19
+ definition: z.string(),
20
+ row_security: z.boolean(),
21
+ force_row_security: z.boolean(),
22
+ has_indexes: z.boolean(),
23
+ has_rules: z.boolean(),
24
+ has_triggers: z.boolean(),
25
+ has_subclasses: z.boolean(),
26
+ is_populated: z.boolean(),
27
+ replica_identity: ReplicaIdentitySchema,
28
+ is_partition: z.boolean(),
29
+ options: z.array(z.string()).nullable(),
30
+ partition_bound: z.string().nullable(),
31
+ owner: z.string(),
32
+ comment: z.string().nullable(),
33
+ columns: z.array(columnPropsSchema),
34
+ privileges: z.array(privilegePropsSchema),
35
+ });
36
+
37
+ type ViewPrivilegeProps = PrivilegeProps;
38
+ export type ViewProps = z.infer<typeof viewPropsSchema>;
39
+
40
+ export class View extends BasePgModel implements TableLikeObject {
41
+ public readonly schema: ViewProps["schema"];
42
+ public readonly name: ViewProps["name"];
43
+ public readonly definition: ViewProps["definition"];
44
+ public readonly row_security: ViewProps["row_security"];
45
+ public readonly force_row_security: ViewProps["force_row_security"];
46
+ public readonly has_indexes: ViewProps["has_indexes"];
47
+ public readonly has_rules: ViewProps["has_rules"];
48
+ public readonly has_triggers: ViewProps["has_triggers"];
49
+ public readonly has_subclasses: ViewProps["has_subclasses"];
50
+ public readonly is_populated: ViewProps["is_populated"];
51
+ public readonly replica_identity: ViewProps["replica_identity"];
52
+ public readonly is_partition: ViewProps["is_partition"];
53
+ public readonly options: ViewProps["options"];
54
+ public readonly partition_bound: ViewProps["partition_bound"];
55
+ public readonly owner: ViewProps["owner"];
56
+ public readonly comment: ViewProps["comment"];
57
+ public readonly columns: ViewProps["columns"];
58
+ public readonly privileges: ViewPrivilegeProps[];
59
+
60
+ constructor(props: ViewProps) {
61
+ super();
62
+
63
+ // Identity fields
64
+ this.schema = props.schema;
65
+ this.name = props.name;
66
+
67
+ // Data fields
68
+ this.definition = props.definition;
69
+ this.row_security = props.row_security;
70
+ this.force_row_security = props.force_row_security;
71
+ this.has_indexes = props.has_indexes;
72
+ this.has_rules = props.has_rules;
73
+ this.has_triggers = props.has_triggers;
74
+ this.has_subclasses = props.has_subclasses;
75
+ this.is_populated = props.is_populated;
76
+ this.replica_identity = props.replica_identity;
77
+ this.is_partition = props.is_partition;
78
+ this.options = props.options;
79
+ this.partition_bound = props.partition_bound;
80
+ this.owner = props.owner;
81
+ this.comment = props.comment;
82
+ this.columns = props.columns;
83
+ this.privileges = props.privileges;
84
+ }
85
+
86
+ get stableId(): `view:${string}` {
87
+ return `view:${this.schema}.${this.name}`;
88
+ }
89
+
90
+ get identityFields() {
91
+ return {
92
+ schema: this.schema,
93
+ name: this.name,
94
+ };
95
+ }
96
+
97
+ get dataFields() {
98
+ return {
99
+ definition: this.definition,
100
+ row_security: this.row_security,
101
+ force_row_security: this.force_row_security,
102
+ has_indexes: this.has_indexes,
103
+ has_rules: this.has_rules,
104
+ has_triggers: this.has_triggers,
105
+ has_subclasses: this.has_subclasses,
106
+ is_populated: this.is_populated,
107
+ replica_identity: this.replica_identity,
108
+ is_partition: this.is_partition,
109
+ options: this.options,
110
+ partition_bound: this.partition_bound,
111
+ owner: this.owner,
112
+ comment: this.comment,
113
+ columns: this.columns,
114
+ privileges: this.privileges,
115
+ };
116
+ }
117
+
118
+ override stableSnapshot() {
119
+ return {
120
+ identity: this.identityFields,
121
+ data: {
122
+ ...this.dataFields,
123
+ columns: normalizeColumns(this.columns),
124
+ },
125
+ };
126
+ }
127
+ }
128
+
129
+ export async function extractViews(pool: Pool): Promise<View[]> {
130
+ const { rows: viewRows } = await pool.query<ViewProps>(sql`
131
+ with extension_oids as (
132
+ select
133
+ objid
134
+ from
135
+ pg_depend d
136
+ where
137
+ d.refclassid = 'pg_extension'::regclass
138
+ and d.classid = 'pg_class'::regclass
139
+ ), views as (
140
+ select
141
+ c.relnamespace::regnamespace::text as schema,
142
+ quote_ident(c.relname) as name,
143
+ rtrim(pg_get_viewdef(c.oid), ';') as definition,
144
+ c.relrowsecurity as row_security,
145
+ c.relforcerowsecurity as force_row_security,
146
+ c.relhasindex as has_indexes,
147
+ c.relhasrules as has_rules,
148
+ c.relhastriggers as has_triggers,
149
+ c.relhassubclass as has_subclasses,
150
+ c.relispopulated as is_populated,
151
+ c.relreplident as replica_identity,
152
+ c.relispartition as is_partition,
153
+ c.reloptions as options,
154
+ pg_get_expr(c.relpartbound, c.oid) as partition_bound,
155
+ c.relowner::regrole::text as owner,
156
+ obj_description(c.oid, 'pg_class') as comment,
157
+ c.oid as oid
158
+ from
159
+ pg_catalog.pg_class c
160
+ left outer join extension_oids e on c.oid = e.objid
161
+ where not c.relnamespace::regnamespace::text like any(array['pg\\_%', 'information\\_schema'])
162
+ and e.objid is null
163
+ and c.relkind = 'v'
164
+ )
165
+ select
166
+ v.schema,
167
+ v.name,
168
+ v.definition,
169
+ v.row_security,
170
+ v.force_row_security,
171
+ v.has_indexes,
172
+ v.has_rules,
173
+ v.has_triggers,
174
+ v.has_subclasses,
175
+ v.is_populated,
176
+ v.replica_identity,
177
+ v.is_partition,
178
+ v.options,
179
+ v.partition_bound,
180
+ v.owner,
181
+ v.comment,
182
+ coalesce(json_agg(
183
+ case when a.attname is not null then
184
+ json_build_object(
185
+ 'name', quote_ident(a.attname),
186
+ 'position', a.attnum,
187
+ 'data_type', a.atttypid::regtype::text,
188
+ 'data_type_str', format_type(a.atttypid, a.atttypmod),
189
+ 'is_custom_type', ty.typnamespace::regnamespace::text not in ('pg_catalog', 'information_schema'),
190
+ 'custom_type_type', case when ty.typnamespace::regnamespace::text not in ('pg_catalog', 'information_schema') then ty.typtype else null end,
191
+ 'custom_type_category', case when ty.typnamespace::regnamespace::text not in ('pg_catalog', 'information_schema') then ty.typcategory else null end,
192
+ 'custom_type_schema', case when ty.typnamespace::regnamespace::text not in ('pg_catalog', 'information_schema') then ty.typnamespace::regnamespace else null end,
193
+ 'custom_type_name', case when ty.typnamespace::regnamespace::text not in ('pg_catalog', 'information_schema') then quote_ident(ty.typname) else null end,
194
+ 'not_null', a.attnotnull,
195
+ 'is_identity', a.attidentity != '',
196
+ 'is_identity_always', a.attidentity = 'a',
197
+ 'is_generated', a.attgenerated != '',
198
+ 'collation', (
199
+ select quote_ident(c2.collname)
200
+ from pg_collation c2, pg_type t2
201
+ where c2.oid = a.attcollation
202
+ and t2.oid = a.atttypid
203
+ and a.attcollation <> t2.typcollation
204
+ ),
205
+ 'default', pg_get_expr(ad.adbin, ad.adrelid),
206
+ 'comment', col_description(a.attrelid, a.attnum)
207
+ )
208
+ end
209
+ order by a.attnum
210
+ ) filter (where a.attname is not null), '[]') as columns,
211
+ coalesce((
212
+ select json_agg(
213
+ json_build_object(
214
+ 'grantee', case when grp.grantee = 0 then 'PUBLIC' else grp.grantee::regrole::text end,
215
+ 'privilege', grp.privilege_type,
216
+ 'grantable', grp.is_grantable,
217
+ 'columns', case when grp.cols is not null and array_length(grp.cols,1) > 0
218
+ then grp.cols
219
+ else null end
220
+ )
221
+ order by grp.grantee, grp.privilege_type
222
+ )
223
+ from (
224
+ select
225
+ x.grantee,
226
+ x.privilege_type,
227
+ bool_or(x.is_grantable) as is_grantable,
228
+ array_agg(quote_ident(src.attname) order by src.attname)
229
+ filter (where src.attname is not null) as cols
230
+ from (
231
+ -- one row for object ACL + one row per column ACL
232
+ select null::name as attname, v.oid as relacl_oid, (
233
+ select COALESCE(c_rel.relacl, acldefault('r', c_rel.relowner)) from pg_class c_rel where c_rel.oid = v.oid
234
+ ) as acl
235
+ union all
236
+ select a2.attname, v.oid as relacl_oid, a2.attacl
237
+ from pg_attribute a2
238
+ where a2.attrelid = v.oid
239
+ and a2.attnum > 0
240
+ and not a2.attisdropped
241
+ and a2.attacl is not null
242
+ ) as src
243
+ join lateral aclexplode(src.acl) as x(grantor, grantee, privilege_type, is_grantable) on true
244
+ group by x.grantee, x.privilege_type
245
+ ) as grp
246
+ ), '[]') as privileges
247
+ from
248
+ views v
249
+ left join pg_attribute a on a.attrelid = v.oid and a.attnum > 0 and not a.attisdropped
250
+ left join pg_attrdef ad on a.attrelid = ad.adrelid and a.attnum = ad.adnum
251
+ left join pg_type ty on ty.oid = a.atttypid
252
+ group by
253
+ v.oid, v.schema, v.name, v.definition, v.row_security, v.force_row_security, v.has_indexes, v.has_rules, v.has_triggers, v.has_subclasses, v.is_populated, v.replica_identity, v.is_partition, v.options, v.partition_bound, v.owner, v.comment
254
+ order by
255
+ v.schema, v.name
256
+ `);
257
+ // Validate and parse each row using the Zod schema
258
+ const validatedRows = viewRows.map((row: unknown) =>
259
+ viewPropsSchema.parse(row),
260
+ );
261
+ return validatedRows.map((row: ViewProps) => new View(row));
262
+ }
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Plan application - execute migration plans against target databases.
3
+ */
4
+
5
+ import type { Pool } from "pg";
6
+ import { diffCatalogs } from "../catalog.diff.ts";
7
+ import { extractCatalog } from "../catalog.model.ts";
8
+ import type { DiffContext } from "../context.ts";
9
+ import { buildPlanScopeFingerprint, hashStableIds } from "../fingerprint.ts";
10
+ import { compileFilterDSL } from "../integrations/filter/dsl.ts";
11
+ import { createManagedPool, endPool } from "../postgres-config.ts";
12
+ import { sortChanges } from "../sort/sort-changes.ts";
13
+ import type { Plan } from "./types.ts";
14
+
15
+ type ApplyPlanResult =
16
+ | { status: "invalid_plan"; message: string }
17
+ | { status: "fingerprint_mismatch"; current: string; expected: string }
18
+ | { status: "already_applied" }
19
+ | { status: "applied"; statements: number; warnings?: string[] }
20
+ | { status: "failed"; error: unknown; script: string };
21
+
22
+ interface ApplyPlanOptions {
23
+ verifyPostApply?: boolean;
24
+ }
25
+
26
+ type ConnectionInput = string | Pool;
27
+
28
+ /**
29
+ * Check if a statement is a session configuration statement (standalone SET statements).
30
+ * These statements should not be counted as changes.
31
+ */
32
+ function isSessionStatement(statement: string): boolean {
33
+ return statement.trim().startsWith("SET ");
34
+ }
35
+
36
+ /**
37
+ * Apply a plan's SQL statements to a target database with integrity checks.
38
+ * Validates fingerprints before and after application to ensure plan integrity.
39
+ */
40
+
41
+ export async function applyPlan(
42
+ plan: Plan,
43
+ source: ConnectionInput,
44
+ target: ConnectionInput,
45
+ options: ApplyPlanOptions = {},
46
+ ): Promise<ApplyPlanResult> {
47
+ if (!plan.statements || plan.statements.length === 0) {
48
+ return {
49
+ status: "invalid_plan",
50
+ message: "Plan contains no SQL statements to execute.",
51
+ };
52
+ }
53
+
54
+ let currentPool: Pool;
55
+ let desiredPool: Pool;
56
+ let shouldCloseCurrent = false;
57
+ let shouldCloseDesired = false;
58
+
59
+ if (typeof source === "string") {
60
+ const managed = await createManagedPool(source, {
61
+ role: plan.role,
62
+ label: "source",
63
+ });
64
+ currentPool = managed.pool;
65
+ shouldCloseCurrent = true;
66
+ } else {
67
+ currentPool = source;
68
+ }
69
+
70
+ if (typeof target === "string") {
71
+ const managed = await createManagedPool(target, {
72
+ role: plan.role,
73
+ label: "target",
74
+ });
75
+ desiredPool = managed.pool;
76
+ shouldCloseDesired = true;
77
+ } else {
78
+ desiredPool = target;
79
+ }
80
+
81
+ try {
82
+ // Recompute stableIds and fingerprints from current and desired catalogs
83
+ const [currentCatalog, desiredCatalog] = await Promise.all([
84
+ extractCatalog(currentPool),
85
+ extractCatalog(desiredPool),
86
+ ]);
87
+
88
+ const changes = diffCatalogs(currentCatalog, desiredCatalog);
89
+ const ctx: DiffContext = {
90
+ mainCatalog: currentCatalog,
91
+ branchCatalog: desiredCatalog,
92
+ };
93
+
94
+ // Apply the same filter that was used to create the plan (if any)
95
+ let filteredChanges = changes;
96
+ if (plan.filter) {
97
+ const filterFn = compileFilterDSL(plan.filter);
98
+ filteredChanges = filteredChanges.filter((change) => filterFn(change));
99
+ }
100
+
101
+ const sortedChanges = sortChanges(ctx, filteredChanges);
102
+ const { hash: fingerprintFrom, stableIds } = buildPlanScopeFingerprint(
103
+ ctx.mainCatalog,
104
+ sortedChanges,
105
+ );
106
+ // We intentionally recompute target fingerprint only after applying.
107
+
108
+ // Pre-apply fingerprint validation
109
+ if (fingerprintFrom === plan.target.fingerprint) {
110
+ return { status: "already_applied" };
111
+ }
112
+
113
+ if (fingerprintFrom !== plan.source.fingerprint) {
114
+ return {
115
+ status: "fingerprint_mismatch",
116
+ current: fingerprintFrom,
117
+ expected: plan.source.fingerprint,
118
+ };
119
+ }
120
+
121
+ // Execute the SQL script
122
+ // TODO: mark statements that can't be run within a transaction
123
+ const statements = plan.statements;
124
+
125
+ const script = (() => {
126
+ const joined = statements.join(";\n");
127
+ return joined.endsWith(";") ? joined : `${joined};`;
128
+ })();
129
+
130
+ try {
131
+ await currentPool.query(script);
132
+ } catch (error) {
133
+ return { status: "failed", error, script };
134
+ }
135
+
136
+ const warnings: string[] = [];
137
+
138
+ if (options.verifyPostApply !== false) {
139
+ try {
140
+ const updatedCatalog = await extractCatalog(currentPool);
141
+ const updatedFingerprint = hashStableIds(updatedCatalog, stableIds);
142
+ if (updatedFingerprint !== plan.target.fingerprint) {
143
+ warnings.push(
144
+ "Post-apply fingerprint does not match the plan target fingerprint.",
145
+ );
146
+ }
147
+ } catch (error) {
148
+ warnings.push(
149
+ `Could not verify post-apply fingerprint: ${error instanceof Error ? error.message : String(error)}`,
150
+ );
151
+ }
152
+ }
153
+
154
+ // Count only actual changes, excluding session configuration statements
155
+ const changeStatements = statements.filter(
156
+ (stmt) => !isSessionStatement(stmt),
157
+ );
158
+
159
+ return {
160
+ status: "applied",
161
+ statements: changeStatements.length,
162
+ warnings: warnings.length ? warnings : undefined,
163
+ };
164
+ } finally {
165
+ const closers: Promise<unknown>[] = [];
166
+ if (shouldCloseCurrent) closers.push(endPool(currentPool));
167
+ if (shouldCloseDesired) closers.push(endPool(desiredPool));
168
+ if (closers.length) {
169
+ await Promise.all(closers);
170
+ }
171
+ }
172
+ }