@supabase/pg-delta 1.0.0-alpha.3 → 1.0.0-alpha.4

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 (463) hide show
  1. package/README.md +22 -0
  2. package/dist/cli/bin/cli.js +0 -0
  3. package/dist/cli/commands/plan.js +21 -0
  4. package/dist/cli/utils.d.ts +2 -0
  5. package/dist/cli/utils.js +1 -1
  6. package/dist/core/objects/table/table.model.d.ts +4 -2
  7. package/dist/core/objects/table/table.model.js +3 -0
  8. package/dist/core/objects/trigger/changes/trigger.alter.js +23 -0
  9. package/dist/core/objects/trigger/changes/trigger.create.js +2 -1
  10. package/dist/core/objects/trigger/trigger.model.d.ts +1 -0
  11. package/dist/core/objects/trigger/trigger.model.js +3 -0
  12. package/dist/core/plan/apply.js +3 -3
  13. package/dist/core/plan/create.js +34 -15
  14. package/dist/core/plan/sql-format/constants.d.ts +2 -0
  15. package/dist/core/plan/sql-format/constants.js +11 -0
  16. package/dist/core/plan/sql-format/fixtures.d.ts +2 -0
  17. package/dist/core/plan/sql-format/fixtures.js +2449 -0
  18. package/dist/core/plan/sql-format/format-utils.d.ts +37 -0
  19. package/dist/core/plan/sql-format/format-utils.js +274 -0
  20. package/dist/core/plan/sql-format/formatters.d.ts +20 -0
  21. package/dist/core/plan/sql-format/formatters.js +737 -0
  22. package/dist/core/plan/sql-format/index.d.ts +2 -0
  23. package/dist/core/plan/sql-format/index.js +98 -0
  24. package/dist/core/plan/sql-format/keyword-case.d.ts +2 -0
  25. package/dist/core/plan/sql-format/keyword-case.js +868 -0
  26. package/dist/core/plan/sql-format/protect.d.ts +3 -0
  27. package/dist/core/plan/sql-format/protect.js +269 -0
  28. package/dist/core/plan/sql-format/sql-scanner.d.ts +59 -0
  29. package/dist/core/plan/sql-format/sql-scanner.js +202 -0
  30. package/dist/core/plan/sql-format/tokenizer.d.ts +22 -0
  31. package/dist/core/plan/sql-format/tokenizer.js +118 -0
  32. package/dist/core/plan/sql-format/types.d.ts +28 -0
  33. package/dist/core/plan/sql-format/types.js +1 -0
  34. package/dist/core/plan/sql-format/wrap.d.ts +2 -0
  35. package/dist/core/plan/sql-format/wrap.js +165 -0
  36. package/dist/core/plan/sql-format.d.ts +2 -0
  37. package/dist/core/plan/sql-format.js +1 -0
  38. package/dist/core/plan/statements.d.ts +2 -1
  39. package/dist/core/plan/statements.js +6 -2
  40. package/dist/core/postgres-config.d.ts +15 -0
  41. package/dist/core/postgres-config.js +30 -0
  42. package/dist/index.d.ts +2 -0
  43. package/dist/index.js +1 -0
  44. package/package.json +37 -22
  45. package/src/cli/app.ts +28 -0
  46. package/src/cli/bin/cli.ts +9 -0
  47. package/src/cli/commands/apply.ts +101 -0
  48. package/src/cli/commands/plan.ts +195 -0
  49. package/src/cli/commands/sync.ts +185 -0
  50. package/src/cli/formatters/index.ts +5 -0
  51. package/src/cli/formatters/tree/tree-builder.ts +380 -0
  52. package/src/cli/formatters/tree/tree-renderer.ts +372 -0
  53. package/src/cli/formatters/tree/tree.ts +237 -0
  54. package/src/cli/utils/integrations.ts +42 -0
  55. package/src/cli/utils.ts +231 -0
  56. package/src/core/catalog.diff.ts +246 -0
  57. package/src/core/catalog.model.ts +384 -0
  58. package/src/core/change.types.ts +44 -0
  59. package/src/core/context.ts +26 -0
  60. package/src/core/depend.ts +1870 -0
  61. package/src/core/expand-replace-dependencies.ts +380 -0
  62. package/src/core/fingerprint.ts +204 -0
  63. package/src/core/integrations/filter/dsl.ts +204 -0
  64. package/src/core/integrations/filter/extractors.ts +145 -0
  65. package/src/core/integrations/filter/filter.types.ts +3 -0
  66. package/src/core/integrations/integration-dsl.ts +24 -0
  67. package/src/core/integrations/integration.types.ts +7 -0
  68. package/src/core/integrations/serialize/dsl.ts +77 -0
  69. package/src/core/integrations/serialize/serialize.types.ts +3 -0
  70. package/src/core/integrations/supabase.ts +121 -0
  71. package/src/core/objects/aggregate/aggregate.diff.test.ts +215 -0
  72. package/src/core/objects/aggregate/aggregate.diff.ts +278 -0
  73. package/src/core/objects/aggregate/aggregate.model.ts +317 -0
  74. package/src/core/objects/aggregate/changes/aggregate.alter.test.ts +64 -0
  75. package/src/core/objects/aggregate/changes/aggregate.alter.ts +32 -0
  76. package/src/core/objects/aggregate/changes/aggregate.base.ts +20 -0
  77. package/src/core/objects/aggregate/changes/aggregate.comment.test.ts +86 -0
  78. package/src/core/objects/aggregate/changes/aggregate.comment.ts +62 -0
  79. package/src/core/objects/aggregate/changes/aggregate.create.test.ts +101 -0
  80. package/src/core/objects/aggregate/changes/aggregate.create.ts +329 -0
  81. package/src/core/objects/aggregate/changes/aggregate.drop.test.ts +78 -0
  82. package/src/core/objects/aggregate/changes/aggregate.drop.ts +32 -0
  83. package/src/core/objects/aggregate/changes/aggregate.privilege.test.ts +130 -0
  84. package/src/core/objects/aggregate/changes/aggregate.privilege.ts +146 -0
  85. package/src/core/objects/aggregate/changes/aggregate.types.ts +12 -0
  86. package/src/core/objects/base.change.ts +62 -0
  87. package/src/core/objects/base.default-privileges.ts +204 -0
  88. package/src/core/objects/base.diff.ts +20 -0
  89. package/src/core/objects/base.model.ts +82 -0
  90. package/src/core/objects/base.privilege-diff.ts +299 -0
  91. package/src/core/objects/base.privilege.ts +184 -0
  92. package/src/core/objects/collation/changes/collation.alter.test.ts +63 -0
  93. package/src/core/objects/collation/changes/collation.alter.ts +79 -0
  94. package/src/core/objects/collation/changes/collation.base.ts +20 -0
  95. package/src/core/objects/collation/changes/collation.comment.ts +68 -0
  96. package/src/core/objects/collation/changes/collation.create.test.ts +51 -0
  97. package/src/core/objects/collation/changes/collation.create.ts +106 -0
  98. package/src/core/objects/collation/changes/collation.drop.test.ts +28 -0
  99. package/src/core/objects/collation/changes/collation.drop.ts +37 -0
  100. package/src/core/objects/collation/changes/collation.types.ts +10 -0
  101. package/src/core/objects/collation/collation.diff.test.ts +100 -0
  102. package/src/core/objects/collation/collation.diff.ts +126 -0
  103. package/src/core/objects/collation/collation.model.ts +224 -0
  104. package/src/core/objects/domain/changes/domain.alter.test.ts +316 -0
  105. package/src/core/objects/domain/changes/domain.alter.ts +286 -0
  106. package/src/core/objects/domain/changes/domain.base.ts +20 -0
  107. package/src/core/objects/domain/changes/domain.comment.ts +59 -0
  108. package/src/core/objects/domain/changes/domain.create.test.ts +65 -0
  109. package/src/core/objects/domain/changes/domain.create.ts +118 -0
  110. package/src/core/objects/domain/changes/domain.drop.test.ts +30 -0
  111. package/src/core/objects/domain/changes/domain.drop.ts +34 -0
  112. package/src/core/objects/domain/changes/domain.privilege.ts +171 -0
  113. package/src/core/objects/domain/changes/domain.types.ts +12 -0
  114. package/src/core/objects/domain/domain.diff.test.ts +284 -0
  115. package/src/core/objects/domain/domain.diff.ts +358 -0
  116. package/src/core/objects/domain/domain.model.ts +190 -0
  117. package/src/core/objects/event-trigger/changes/event-trigger.alter.test.ts +50 -0
  118. package/src/core/objects/event-trigger/changes/event-trigger.alter.ts +82 -0
  119. package/src/core/objects/event-trigger/changes/event-trigger.base.ts +20 -0
  120. package/src/core/objects/event-trigger/changes/event-trigger.comment.ts +66 -0
  121. package/src/core/objects/event-trigger/changes/event-trigger.create.test.ts +24 -0
  122. package/src/core/objects/event-trigger/changes/event-trigger.create.ts +72 -0
  123. package/src/core/objects/event-trigger/changes/event-trigger.drop.test.ts +22 -0
  124. package/src/core/objects/event-trigger/changes/event-trigger.drop.ts +34 -0
  125. package/src/core/objects/event-trigger/changes/event-trigger.types.ts +10 -0
  126. package/src/core/objects/event-trigger/event-trigger.diff.test.ts +126 -0
  127. package/src/core/objects/event-trigger/event-trigger.diff.ts +126 -0
  128. package/src/core/objects/event-trigger/event-trigger.model.ts +106 -0
  129. package/src/core/objects/extension/changes/extension.alter.test.ts +58 -0
  130. package/src/core/objects/extension/changes/extension.alter.ts +78 -0
  131. package/src/core/objects/extension/changes/extension.base.ts +20 -0
  132. package/src/core/objects/extension/changes/extension.comment.ts +64 -0
  133. package/src/core/objects/extension/changes/extension.create.test.ts +25 -0
  134. package/src/core/objects/extension/changes/extension.create.ts +63 -0
  135. package/src/core/objects/extension/changes/extension.drop.test.ts +23 -0
  136. package/src/core/objects/extension/changes/extension.drop.ts +34 -0
  137. package/src/core/objects/extension/changes/extension.types.ts +10 -0
  138. package/src/core/objects/extension/extension.diff.test.ts +42 -0
  139. package/src/core/objects/extension/extension.diff.ts +90 -0
  140. package/src/core/objects/extension/extension.model.ts +280 -0
  141. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.test.ts +125 -0
  142. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.ts +101 -0
  143. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.base.ts +20 -0
  144. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.ts +72 -0
  145. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.test.ts +125 -0
  146. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.ts +95 -0
  147. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.test.ts +23 -0
  148. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.ts +36 -0
  149. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.ts +172 -0
  150. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.ts +12 -0
  151. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.test.ts +179 -0
  152. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.ts +341 -0
  153. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.ts +149 -0
  154. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.ts +10 -0
  155. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.test.ts +309 -0
  156. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.ts +341 -0
  157. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.base.ts +20 -0
  158. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.ts +72 -0
  159. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.test.ts +201 -0
  160. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.ts +81 -0
  161. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.test.ts +43 -0
  162. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.ts +37 -0
  163. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.ts +181 -0
  164. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.ts +12 -0
  165. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.test.ts +813 -0
  166. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.ts +406 -0
  167. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.ts +242 -0
  168. package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.test.ts +168 -0
  169. package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.ts +126 -0
  170. package/src/core/objects/foreign-data-wrapper/server/changes/server.base.ts +20 -0
  171. package/src/core/objects/foreign-data-wrapper/server/changes/server.comment.ts +60 -0
  172. package/src/core/objects/foreign-data-wrapper/server/changes/server.create.test.ts +131 -0
  173. package/src/core/objects/foreign-data-wrapper/server/changes/server.create.ts +81 -0
  174. package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.test.ts +24 -0
  175. package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.ts +34 -0
  176. package/src/core/objects/foreign-data-wrapper/server/changes/server.privilege.ts +164 -0
  177. package/src/core/objects/foreign-data-wrapper/server/changes/server.types.ts +12 -0
  178. package/src/core/objects/foreign-data-wrapper/server/server.diff.test.ts +167 -0
  179. package/src/core/objects/foreign-data-wrapper/server/server.diff.ts +317 -0
  180. package/src/core/objects/foreign-data-wrapper/server/server.model.ts +133 -0
  181. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.test.ts +82 -0
  182. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.ts +69 -0
  183. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.base.ts +20 -0
  184. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.test.ts +85 -0
  185. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.ts +66 -0
  186. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.test.ts +53 -0
  187. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.ts +40 -0
  188. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.ts +8 -0
  189. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.test.ts +77 -0
  190. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.ts +107 -0
  191. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.ts +96 -0
  192. package/src/core/objects/index/changes/index.alter.test.ts +200 -0
  193. package/src/core/objects/index/changes/index.alter.ts +144 -0
  194. package/src/core/objects/index/changes/index.base.ts +20 -0
  195. package/src/core/objects/index/changes/index.comment.ts +63 -0
  196. package/src/core/objects/index/changes/index.create.test.ts +66 -0
  197. package/src/core/objects/index/changes/index.create.ts +68 -0
  198. package/src/core/objects/index/changes/index.drop.test.ts +44 -0
  199. package/src/core/objects/index/changes/index.drop.ts +34 -0
  200. package/src/core/objects/index/changes/index.types.ts +6 -0
  201. package/src/core/objects/index/changes/utils.ts +16 -0
  202. package/src/core/objects/index/index.diff.test.ts +153 -0
  203. package/src/core/objects/index/index.diff.ts +243 -0
  204. package/src/core/objects/index/index.model.ts +370 -0
  205. package/src/core/objects/language/changes/language.alter.test.ts +33 -0
  206. package/src/core/objects/language/changes/language.alter.ts +53 -0
  207. package/src/core/objects/language/changes/language.base.ts +20 -0
  208. package/src/core/objects/language/changes/language.comment.ts +58 -0
  209. package/src/core/objects/language/changes/language.create.test.ts +27 -0
  210. package/src/core/objects/language/changes/language.create.ts +104 -0
  211. package/src/core/objects/language/changes/language.drop.test.ts +25 -0
  212. package/src/core/objects/language/changes/language.drop.ts +39 -0
  213. package/src/core/objects/language/changes/language.privilege.ts +172 -0
  214. package/src/core/objects/language/changes/language.types.ts +12 -0
  215. package/src/core/objects/language/language.diff.test.ts +53 -0
  216. package/src/core/objects/language/language.diff.ts +176 -0
  217. package/src/core/objects/language/language.model.ts +150 -0
  218. package/src/core/objects/materialized-view/changes/materialized-view.alter.test.ts +123 -0
  219. package/src/core/objects/materialized-view/changes/materialized-view.alter.ts +113 -0
  220. package/src/core/objects/materialized-view/changes/materialized-view.base.ts +20 -0
  221. package/src/core/objects/materialized-view/changes/materialized-view.comment.ts +176 -0
  222. package/src/core/objects/materialized-view/changes/materialized-view.create.test.ts +64 -0
  223. package/src/core/objects/materialized-view/changes/materialized-view.create.ts +93 -0
  224. package/src/core/objects/materialized-view/changes/materialized-view.drop.test.ts +34 -0
  225. package/src/core/objects/materialized-view/changes/materialized-view.drop.ts +60 -0
  226. package/src/core/objects/materialized-view/changes/materialized-view.privilege.ts +212 -0
  227. package/src/core/objects/materialized-view/changes/materialized-view.types.ts +12 -0
  228. package/src/core/objects/materialized-view/materialized-view.diff.test.ts +102 -0
  229. package/src/core/objects/materialized-view/materialized-view.diff.ts +451 -0
  230. package/src/core/objects/materialized-view/materialized-view.model.ts +258 -0
  231. package/src/core/objects/procedure/changes/procedure.alter.test.ts +1005 -0
  232. package/src/core/objects/procedure/changes/procedure.alter.ts +287 -0
  233. package/src/core/objects/procedure/changes/procedure.base.ts +20 -0
  234. package/src/core/objects/procedure/changes/procedure.comment.ts +70 -0
  235. package/src/core/objects/procedure/changes/procedure.create.test.ts +48 -0
  236. package/src/core/objects/procedure/changes/procedure.create.ts +92 -0
  237. package/src/core/objects/procedure/changes/procedure.drop.test.ts +85 -0
  238. package/src/core/objects/procedure/changes/procedure.drop.ts +49 -0
  239. package/src/core/objects/procedure/changes/procedure.privilege.ts +188 -0
  240. package/src/core/objects/procedure/changes/procedure.types.ts +12 -0
  241. package/src/core/objects/procedure/procedure.diff.test.ts +161 -0
  242. package/src/core/objects/procedure/procedure.diff.ts +404 -0
  243. package/src/core/objects/procedure/procedure.model.ts +264 -0
  244. package/src/core/objects/procedure/utils.ts +58 -0
  245. package/src/core/objects/publication/changes/publication.alter.test.ts +223 -0
  246. package/src/core/objects/publication/changes/publication.alter.ts +243 -0
  247. package/src/core/objects/publication/changes/publication.base.ts +20 -0
  248. package/src/core/objects/publication/changes/publication.comment.test.ts +70 -0
  249. package/src/core/objects/publication/changes/publication.comment.ts +64 -0
  250. package/src/core/objects/publication/changes/publication.create.test.ts +87 -0
  251. package/src/core/objects/publication/changes/publication.create.ts +82 -0
  252. package/src/core/objects/publication/changes/publication.drop.test.ts +46 -0
  253. package/src/core/objects/publication/changes/publication.drop.ts +29 -0
  254. package/src/core/objects/publication/changes/publication.types.ts +26 -0
  255. package/src/core/objects/publication/publication.diff.test.ts +292 -0
  256. package/src/core/objects/publication/publication.diff.ts +253 -0
  257. package/src/core/objects/publication/publication.model.ts +206 -0
  258. package/src/core/objects/publication/utils.ts +55 -0
  259. package/src/core/objects/rls-policy/changes/rls-policy.alter.test.ts +250 -0
  260. package/src/core/objects/rls-policy/changes/rls-policy.alter.ts +128 -0
  261. package/src/core/objects/rls-policy/changes/rls-policy.base.ts +20 -0
  262. package/src/core/objects/rls-policy/changes/rls-policy.comment.ts +69 -0
  263. package/src/core/objects/rls-policy/changes/rls-policy.create.test.ts +74 -0
  264. package/src/core/objects/rls-policy/changes/rls-policy.create.ts +100 -0
  265. package/src/core/objects/rls-policy/changes/rls-policy.drop.test.ts +28 -0
  266. package/src/core/objects/rls-policy/changes/rls-policy.drop.ts +39 -0
  267. package/src/core/objects/rls-policy/changes/rls-policy.types.ts +10 -0
  268. package/src/core/objects/rls-policy/rls-policy.diff.test.ts +79 -0
  269. package/src/core/objects/rls-policy/rls-policy.diff.ts +121 -0
  270. package/src/core/objects/rls-policy/rls-policy.model.ts +140 -0
  271. package/src/core/objects/role/changes/role.alter.test.ts +346 -0
  272. package/src/core/objects/role/changes/role.alter.ts +110 -0
  273. package/src/core/objects/role/changes/role.base.ts +24 -0
  274. package/src/core/objects/role/changes/role.comment.ts +55 -0
  275. package/src/core/objects/role/changes/role.create.test.ts +52 -0
  276. package/src/core/objects/role/changes/role.create.ts +102 -0
  277. package/src/core/objects/role/changes/role.drop.test.ts +29 -0
  278. package/src/core/objects/role/changes/role.drop.ts +34 -0
  279. package/src/core/objects/role/changes/role.privilege.ts +376 -0
  280. package/src/core/objects/role/changes/role.types.ts +12 -0
  281. package/src/core/objects/role/role.diff.test.ts +44 -0
  282. package/src/core/objects/role/role.diff.ts +479 -0
  283. package/src/core/objects/role/role.model.ts +344 -0
  284. package/src/core/objects/rule/changes/rule.alter.test.ts +78 -0
  285. package/src/core/objects/rule/changes/rule.alter.ts +72 -0
  286. package/src/core/objects/rule/changes/rule.base.ts +20 -0
  287. package/src/core/objects/rule/changes/rule.comment.test.ts +55 -0
  288. package/src/core/objects/rule/changes/rule.comment.ts +62 -0
  289. package/src/core/objects/rule/changes/rule.create.test.ts +59 -0
  290. package/src/core/objects/rule/changes/rule.create.ts +42 -0
  291. package/src/core/objects/rule/changes/rule.drop.test.ts +38 -0
  292. package/src/core/objects/rule/changes/rule.drop.ts +29 -0
  293. package/src/core/objects/rule/changes/rule.types.ts +12 -0
  294. package/src/core/objects/rule/rule.diff.test.ts +132 -0
  295. package/src/core/objects/rule/rule.diff.ts +79 -0
  296. package/src/core/objects/rule/rule.model.ts +173 -0
  297. package/src/core/objects/schema/changes/schema.alter.test.ts +28 -0
  298. package/src/core/objects/schema/changes/schema.alter.ts +45 -0
  299. package/src/core/objects/schema/changes/schema.base.ts +20 -0
  300. package/src/core/objects/schema/changes/schema.comment.ts +56 -0
  301. package/src/core/objects/schema/changes/schema.create.test.ts +22 -0
  302. package/src/core/objects/schema/changes/schema.create.ts +47 -0
  303. package/src/core/objects/schema/changes/schema.drop.test.ts +20 -0
  304. package/src/core/objects/schema/changes/schema.drop.ts +34 -0
  305. package/src/core/objects/schema/changes/schema.privilege.ts +175 -0
  306. package/src/core/objects/schema/changes/schema.types.ts +12 -0
  307. package/src/core/objects/schema/schema.diff.test.ts +42 -0
  308. package/src/core/objects/schema/schema.diff.ts +209 -0
  309. package/src/core/objects/schema/schema.model.ts +107 -0
  310. package/src/core/objects/sequence/changes/sequence.alter.test.ts +151 -0
  311. package/src/core/objects/sequence/changes/sequence.alter.ts +115 -0
  312. package/src/core/objects/sequence/changes/sequence.base.ts +20 -0
  313. package/src/core/objects/sequence/changes/sequence.comment.ts +60 -0
  314. package/src/core/objects/sequence/changes/sequence.create.test.ts +84 -0
  315. package/src/core/objects/sequence/changes/sequence.create.ts +111 -0
  316. package/src/core/objects/sequence/changes/sequence.drop.test.ts +32 -0
  317. package/src/core/objects/sequence/changes/sequence.drop.ts +37 -0
  318. package/src/core/objects/sequence/changes/sequence.privilege.ts +179 -0
  319. package/src/core/objects/sequence/changes/sequence.types.ts +12 -0
  320. package/src/core/objects/sequence/sequence.diff.test.ts +141 -0
  321. package/src/core/objects/sequence/sequence.diff.ts +359 -0
  322. package/src/core/objects/sequence/sequence.model.ts +185 -0
  323. package/src/core/objects/subscription/changes/subscription.alter.test.ts +124 -0
  324. package/src/core/objects/subscription/changes/subscription.alter.ts +110 -0
  325. package/src/core/objects/subscription/changes/subscription.base.ts +20 -0
  326. package/src/core/objects/subscription/changes/subscription.comment.test.ts +67 -0
  327. package/src/core/objects/subscription/changes/subscription.comment.ts +64 -0
  328. package/src/core/objects/subscription/changes/subscription.create.test.ts +77 -0
  329. package/src/core/objects/subscription/changes/subscription.create.ts +69 -0
  330. package/src/core/objects/subscription/changes/subscription.drop.test.ts +46 -0
  331. package/src/core/objects/subscription/changes/subscription.drop.ts +20 -0
  332. package/src/core/objects/subscription/changes/subscription.types.ts +22 -0
  333. package/src/core/objects/subscription/subscription.diff.test.ts +232 -0
  334. package/src/core/objects/subscription/subscription.diff.ts +241 -0
  335. package/src/core/objects/subscription/subscription.model.ts +190 -0
  336. package/src/core/objects/subscription/utils.ts +156 -0
  337. package/src/core/objects/table/changes/table.alter.test.ts +823 -0
  338. package/src/core/objects/table/changes/table.alter.ts +806 -0
  339. package/src/core/objects/table/changes/table.base.ts +20 -0
  340. package/src/core/objects/table/changes/table.comment.ts +266 -0
  341. package/src/core/objects/table/changes/table.create.test.ts +150 -0
  342. package/src/core/objects/table/changes/table.create.ts +188 -0
  343. package/src/core/objects/table/changes/table.drop.test.ts +34 -0
  344. package/src/core/objects/table/changes/table.drop.ts +45 -0
  345. package/src/core/objects/table/changes/table.privilege.ts +200 -0
  346. package/src/core/objects/table/changes/table.types.ts +12 -0
  347. package/src/core/objects/table/table.diff.test.ts +711 -0
  348. package/src/core/objects/table/table.diff.ts +953 -0
  349. package/src/core/objects/table/table.model.ts +460 -0
  350. package/src/core/objects/trigger/changes/trigger.alter.test.ts +46 -0
  351. package/src/core/objects/trigger/changes/trigger.alter.ts +76 -0
  352. package/src/core/objects/trigger/changes/trigger.base.ts +20 -0
  353. package/src/core/objects/trigger/changes/trigger.comment.ts +64 -0
  354. package/src/core/objects/trigger/changes/trigger.create.test.ts +43 -0
  355. package/src/core/objects/trigger/changes/trigger.create.ts +85 -0
  356. package/src/core/objects/trigger/changes/trigger.drop.test.ts +43 -0
  357. package/src/core/objects/trigger/changes/trigger.drop.ts +39 -0
  358. package/src/core/objects/trigger/changes/trigger.types.ts +10 -0
  359. package/src/core/objects/trigger/trigger.diff.test.ts +83 -0
  360. package/src/core/objects/trigger/trigger.diff.ts +116 -0
  361. package/src/core/objects/trigger/trigger.model.ts +252 -0
  362. package/src/core/objects/type/composite-type/changes/composite-type.alter.test.ts +202 -0
  363. package/src/core/objects/type/composite-type/changes/composite-type.alter.ts +174 -0
  364. package/src/core/objects/type/composite-type/changes/composite-type.base.ts +20 -0
  365. package/src/core/objects/type/composite-type/changes/composite-type.comment.ts +145 -0
  366. package/src/core/objects/type/composite-type/changes/composite-type.create.test.ts +101 -0
  367. package/src/core/objects/type/composite-type/changes/composite-type.create.ts +95 -0
  368. package/src/core/objects/type/composite-type/changes/composite-type.drop.test.ts +33 -0
  369. package/src/core/objects/type/composite-type/changes/composite-type.drop.ts +37 -0
  370. package/src/core/objects/type/composite-type/changes/composite-type.privilege.ts +175 -0
  371. package/src/core/objects/type/composite-type/changes/composite-type.types.ts +12 -0
  372. package/src/core/objects/type/composite-type/composite-type.diff.test.ts +191 -0
  373. package/src/core/objects/type/composite-type/composite-type.diff.ts +372 -0
  374. package/src/core/objects/type/composite-type/composite-type.model.ts +252 -0
  375. package/src/core/objects/type/enum/changes/enum.alter.test.ts +104 -0
  376. package/src/core/objects/type/enum/changes/enum.alter.ts +91 -0
  377. package/src/core/objects/type/enum/changes/enum.base.ts +20 -0
  378. package/src/core/objects/type/enum/changes/enum.comment.ts +64 -0
  379. package/src/core/objects/type/enum/changes/enum.create.test.ts +28 -0
  380. package/src/core/objects/type/enum/changes/enum.create.ts +56 -0
  381. package/src/core/objects/type/enum/changes/enum.drop.test.ts +25 -0
  382. package/src/core/objects/type/enum/changes/enum.drop.ts +34 -0
  383. package/src/core/objects/type/enum/changes/enum.privilege.ts +175 -0
  384. package/src/core/objects/type/enum/changes/enum.types.ts +12 -0
  385. package/src/core/objects/type/enum/enum.diff.test.ts +191 -0
  386. package/src/core/objects/type/enum/enum.diff.ts +396 -0
  387. package/src/core/objects/type/enum/enum.model.ts +194 -0
  388. package/src/core/objects/type/range/changes/range.alter.test.ts +27 -0
  389. package/src/core/objects/type/range/changes/range.alter.ts +51 -0
  390. package/src/core/objects/type/range/changes/range.base.ts +20 -0
  391. package/src/core/objects/type/range/changes/range.comment.ts +64 -0
  392. package/src/core/objects/type/range/changes/range.create.test.ts +51 -0
  393. package/src/core/objects/type/range/changes/range.create.ts +151 -0
  394. package/src/core/objects/type/range/changes/range.drop.test.ts +26 -0
  395. package/src/core/objects/type/range/changes/range.drop.ts +34 -0
  396. package/src/core/objects/type/range/changes/range.privilege.ts +175 -0
  397. package/src/core/objects/type/range/changes/range.types.ts +12 -0
  398. package/src/core/objects/type/range/range.diff.test.ts +70 -0
  399. package/src/core/objects/type/range/range.diff.ts +259 -0
  400. package/src/core/objects/type/range/range.model.ts +187 -0
  401. package/src/core/objects/type/type.types.ts +5 -0
  402. package/src/core/objects/utils.ts +171 -0
  403. package/src/core/objects/view/changes/view.alter.test.ts +110 -0
  404. package/src/core/objects/view/changes/view.alter.ts +112 -0
  405. package/src/core/objects/view/changes/view.base.ts +20 -0
  406. package/src/core/objects/view/changes/view.comment.ts +59 -0
  407. package/src/core/objects/view/changes/view.create.test.ts +65 -0
  408. package/src/core/objects/view/changes/view.create.ts +73 -0
  409. package/src/core/objects/view/changes/view.drop.test.ts +34 -0
  410. package/src/core/objects/view/changes/view.drop.ts +40 -0
  411. package/src/core/objects/view/changes/view.privilege.ts +200 -0
  412. package/src/core/objects/view/changes/view.types.ts +12 -0
  413. package/src/core/objects/view/view.diff.test.ts +91 -0
  414. package/src/core/objects/view/view.diff.ts +365 -0
  415. package/src/core/objects/view/view.model.ts +276 -0
  416. package/src/core/plan/apply.ts +190 -0
  417. package/src/core/plan/create.ts +432 -0
  418. package/src/core/plan/hierarchy.ts +574 -0
  419. package/src/core/plan/index.ts +29 -0
  420. package/src/core/plan/io.ts +20 -0
  421. package/src/core/plan/risk.ts +48 -0
  422. package/src/core/plan/serialize.ts +195 -0
  423. package/src/core/plan/sql-format/constants.ts +13 -0
  424. package/src/core/plan/sql-format/fixtures.ts +2806 -0
  425. package/src/core/plan/sql-format/format-comment-literals.test.ts +96 -0
  426. package/src/core/plan/sql-format/format-functions.test.ts +127 -0
  427. package/src/core/plan/sql-format/format-lowercase-coverage.test.ts +67 -0
  428. package/src/core/plan/sql-format/format-off.test.ts +809 -0
  429. package/src/core/plan/sql-format/format-pretty-lower-leading.test.ts +1056 -0
  430. package/src/core/plan/sql-format/format-pretty-narrow.test.ts +1283 -0
  431. package/src/core/plan/sql-format/format-pretty-preserve.test.ts +1052 -0
  432. package/src/core/plan/sql-format/format-pretty-upper.test.ts +1045 -0
  433. package/src/core/plan/sql-format/format-stress.test.ts +616 -0
  434. package/src/core/plan/sql-format/format-utils.test.ts +91 -0
  435. package/src/core/plan/sql-format/format-utils.ts +391 -0
  436. package/src/core/plan/sql-format/formatters.ts +921 -0
  437. package/src/core/plan/sql-format/index.ts +149 -0
  438. package/src/core/plan/sql-format/keyword-case.test.ts +118 -0
  439. package/src/core/plan/sql-format/keyword-case.ts +1085 -0
  440. package/src/core/plan/sql-format/protect.test.ts +127 -0
  441. package/src/core/plan/sql-format/protect.ts +337 -0
  442. package/src/core/plan/sql-format/sql-scanner.test.ts +240 -0
  443. package/src/core/plan/sql-format/sql-scanner.ts +252 -0
  444. package/src/core/plan/sql-format/tokenizer.test.ts +68 -0
  445. package/src/core/plan/sql-format/tokenizer.ts +152 -0
  446. package/src/core/plan/sql-format/types.ts +31 -0
  447. package/src/core/plan/sql-format/wrap.test.ts +119 -0
  448. package/src/core/plan/sql-format/wrap.ts +196 -0
  449. package/src/core/plan/sql-format.ts +2 -0
  450. package/src/core/plan/statements.ts +22 -0
  451. package/src/core/plan/types.ts +165 -0
  452. package/src/core/postgres-config.ts +169 -0
  453. package/src/core/sort/custom-constraints.ts +161 -0
  454. package/src/core/sort/debug-visualization.ts +239 -0
  455. package/src/core/sort/dependency-filter.ts +224 -0
  456. package/src/core/sort/graph-builder.ts +223 -0
  457. package/src/core/sort/graph-utils.ts +51 -0
  458. package/src/core/sort/logical-sort.ts +590 -0
  459. package/src/core/sort/sort-changes.ts +234 -0
  460. package/src/core/sort/topological-sort.ts +184 -0
  461. package/src/core/sort/types.ts +112 -0
  462. package/src/core/sort/utils.ts +69 -0
  463. package/src/index.ts +14 -0
package/README.md CHANGED
@@ -47,6 +47,28 @@ pg-delta plan \
47
47
  --output plan.json
48
48
  ```
49
49
 
50
+ **Plan (SQL output with formatting)** - Opt-in post-formatting for SQL scripts:
51
+
52
+ ```bash
53
+ pg-delta plan \
54
+ --source postgresql://user:pass@localhost:5432/source_db \
55
+ --target postgresql://user:pass@localhost:5432/target_db \
56
+ --format sql \
57
+ --sql-format \
58
+ --sql-format-options '{"keywordCase":"upper","maxWidth":100}'
59
+ ```
60
+
61
+ Available SQL format options (JSON):
62
+ - `keywordCase`: `upper` | `lower` | `preserve`
63
+ - `indent`: number of spaces per level
64
+ - `maxWidth`: line width for wrapping
65
+ - `commaStyle`: `trailing` | `leading`
66
+ - `alignColumns`: boolean
67
+ - `alignKeyValues`: boolean
68
+ - `preserveRoutineBodies`: boolean
69
+ - `preserveViewBodies`: boolean
70
+ - `preserveRuleBodies`: boolean
71
+
50
72
  **Apply** - Apply a previously created plan:
51
73
 
52
74
  ```bash
File without changes
@@ -69,6 +69,24 @@ export const planCommand = buildCommand({
69
69
  parse: String,
70
70
  optional: true,
71
71
  },
72
+ "sql-format": {
73
+ kind: "boolean",
74
+ brief: "Format SQL output (opt-in for --format sql or .sql output).",
75
+ optional: true,
76
+ },
77
+ "sql-format-options": {
78
+ kind: "parsed",
79
+ brief: 'SQL format options as inline JSON (e.g., \'{"keywordCase":"upper","maxWidth":100}\').',
80
+ parse: (value) => {
81
+ try {
82
+ return JSON.parse(value);
83
+ }
84
+ catch (error) {
85
+ throw new Error(`Invalid SQL format JSON: ${error instanceof Error ? error.message : String(error)}`);
86
+ }
87
+ },
88
+ optional: true,
89
+ },
72
90
  },
73
91
  aliases: {
74
92
  s: "source",
@@ -120,6 +138,9 @@ json/sql outputs are available for artifacts or piping.
120
138
  const { content, label } = formatPlanForDisplay(planResult, effectiveFormat, {
121
139
  disableColors: !!outputPath,
122
140
  showUnsafeFlagSuggestion: false,
141
+ sqlFormatOptions: flags["sql-format"] || flags["sql-format-options"]
142
+ ? (flags["sql-format-options"] ?? {})
143
+ : undefined,
123
144
  });
124
145
  if (outputPath) {
125
146
  await writeFile(outputPath, content, "utf-8");
@@ -5,6 +5,7 @@ import type { CommandContext } from "@stricli/core";
5
5
  import type { Change } from "../core/change.types.ts";
6
6
  import type { DiffContext } from "../core/context.ts";
7
7
  import { type Plan } from "../core/plan/index.ts";
8
+ import type { SqlFormatOptions } from "../core/plan/sql-format.ts";
8
9
  type ApplyPlanResult = {
9
10
  status: "invalid_plan";
10
11
  message: string;
@@ -31,6 +32,7 @@ type PlanResult = {
31
32
  interface FormatPlanOptions {
32
33
  disableColors?: boolean;
33
34
  showUnsafeFlagSuggestion?: boolean;
35
+ sqlFormatOptions?: SqlFormatOptions;
34
36
  }
35
37
  /**
36
38
  * Formats a plan result for display in various formats.
package/dist/cli/utils.js CHANGED
@@ -19,7 +19,7 @@ export function formatPlanForDisplay(planResult, format, options = {}) {
19
19
  case "sql": {
20
20
  const content = [
21
21
  `-- Risk: ${risk.level === "data_loss" ? `data-loss (${risk.statements.length})` : "safe"}`,
22
- formatSqlScript(plan.statements),
22
+ formatSqlScript(plan.statements, options.sqlFormatOptions),
23
23
  ].join("\n");
24
24
  return { content, label: "Migration script" };
25
25
  }
@@ -13,6 +13,7 @@ declare const tableConstraintPropsSchema: z.ZodObject<{
13
13
  constraint_type: z.ZodEnum<{
14
14
  f: "f";
15
15
  u: "u";
16
+ t: "t";
16
17
  p: "p";
17
18
  c: "c";
18
19
  x: "x";
@@ -114,6 +115,7 @@ declare const tablePropsSchema: z.ZodObject<{
114
115
  constraint_type: z.ZodEnum<{
115
116
  f: "f";
116
117
  u: "u";
118
+ t: "t";
117
119
  p: "p";
118
120
  c: "c";
119
121
  x: "x";
@@ -231,7 +233,7 @@ export declare class Table extends BasePgModel implements TableLikeObject {
231
233
  }[];
232
234
  constraints: {
233
235
  name: string;
234
- constraint_type: "f" | "u" | "p" | "c" | "x";
236
+ constraint_type: "f" | "u" | "t" | "p" | "c" | "x";
235
237
  deferrable: boolean;
236
238
  initially_deferred: boolean;
237
239
  validated: boolean;
@@ -292,7 +294,7 @@ export declare class Table extends BasePgModel implements TableLikeObject {
292
294
  options: string[] | null;
293
295
  constraints: {
294
296
  name: string;
295
- constraint_type: "f" | "u" | "p" | "c" | "x";
297
+ constraint_type: "f" | "u" | "t" | "p" | "c" | "x";
296
298
  deferrable: boolean;
297
299
  initially_deferred: boolean;
298
300
  validated: boolean;
@@ -33,6 +33,7 @@ const tableConstraintPropsSchema = z.object({
33
33
  "c", // CHECK constraint
34
34
  "f", // FOREIGN KEY constraint
35
35
  "p", // PRIMARY KEY constraint
36
+ "t", // TRIGGER constraint
36
37
  "u", // UNIQUE constraint
37
38
  "x", // EXCLUDE constraint
38
39
  ]),
@@ -338,6 +339,8 @@ select
338
339
  and de.refclassid = 'pg_extension'::regclass
339
340
 
340
341
  where c.conrelid = t.oid
342
+ -- Skip constraint triggers; they are modeled as triggers, not table constraints
343
+ and c.contype <> 't'
341
344
  and not c.connamespace::regnamespace::text like any(array['pg\\_%', 'information\\_schema'])
342
345
  and de.objid is null
343
346
  ),
@@ -1,5 +1,7 @@
1
+ import { quoteLiteral } from "../../base.change.js";
1
2
  import { AlterTriggerChange } from "./trigger.base.js";
2
3
  import { CreateTrigger } from "./trigger.create.js";
4
+ import { DropTrigger } from "./trigger.drop.js";
3
5
  /**
4
6
  * Replace a trigger by dropping and recreating it.
5
7
  * This is used when properties that cannot be altered via ALTER TRIGGER change.
@@ -17,6 +19,27 @@ export class ReplaceTrigger extends AlterTriggerChange {
17
19
  return [this.trigger.stableId];
18
20
  }
19
21
  serialize() {
22
+ if (this.trigger.isConstraintTrigger) {
23
+ const dropChange = new DropTrigger({ trigger: this.trigger });
24
+ const createChange = new CreateTrigger({
25
+ trigger: this.trigger,
26
+ indexableObject: this.indexableObject,
27
+ orReplace: false,
28
+ });
29
+ const commentSql = this.trigger.comment !== null
30
+ ? [
31
+ "COMMENT ON TRIGGER",
32
+ this.trigger.name,
33
+ "ON",
34
+ `${this.trigger.schema}.${this.trigger.table_name}`,
35
+ "IS",
36
+ quoteLiteral(this.trigger.comment),
37
+ ].join(" ")
38
+ : null;
39
+ return [dropChange.serialize(), createChange.serialize(), commentSql]
40
+ .filter(Boolean)
41
+ .join(";\n");
42
+ }
20
43
  const createChange = new CreateTrigger({
21
44
  trigger: this.trigger,
22
45
  indexableObject: this.indexableObject,
@@ -55,7 +55,8 @@ export class CreateTrigger extends CreateTriggerChange {
55
55
  }
56
56
  serialize() {
57
57
  let definition = this.trigger.definition.trim();
58
- definition = definition.replace(/^CREATE\s+(?:OR\s+REPLACE\s+)?/i, `CREATE ${this.orReplace ? "OR REPLACE " : ""}`);
58
+ const isConstraintTrigger = this.trigger.isConstraintTrigger;
59
+ definition = definition.replace(/^CREATE\s+(?:OR\s+REPLACE\s+)?/i, `CREATE ${this.orReplace && !isConstraintTrigger ? "OR REPLACE " : ""}`);
59
60
  return definition;
60
61
  }
61
62
  }
@@ -59,6 +59,7 @@ export declare class Trigger extends BasePgModel {
59
59
  readonly definition: TriggerProps["definition"];
60
60
  readonly comment: TriggerProps["comment"];
61
61
  constructor(props: TriggerProps);
62
+ get isConstraintTrigger(): boolean;
62
63
  get stableId(): `trigger:${string}`;
63
64
  get identityFields(): {
64
65
  schema: string;
@@ -87,6 +87,9 @@ export class Trigger extends BasePgModel {
87
87
  this.definition = props.definition;
88
88
  this.comment = props.comment;
89
89
  }
90
+ get isConstraintTrigger() {
91
+ return /^CREATE\s+CONSTRAINT\s+TRIGGER/i.test(this.definition.trim());
92
+ }
90
93
  get stableId() {
91
94
  return `trigger:${this.schema}.${this.table_name}.${this.name}`;
92
95
  }
@@ -6,7 +6,7 @@ import { diffCatalogs } from "../catalog.diff.js";
6
6
  import { extractCatalog } from "../catalog.model.js";
7
7
  import { buildPlanScopeFingerprint, hashStableIds } from "../fingerprint.js";
8
8
  import { compileFilterDSL } from "../integrations/filter/dsl.js";
9
- import { createPool } from "../postgres-config.js";
9
+ import { createPool, endPool } from "../postgres-config.js";
10
10
  import { sortChanges } from "../sort/sort-changes.js";
11
11
  /**
12
12
  * Check if a statement is a session configuration statement (standalone SET statements).
@@ -136,9 +136,9 @@ export async function applyPlan(plan, source, target, options = {}) {
136
136
  finally {
137
137
  const closers = [];
138
138
  if (shouldCloseCurrent)
139
- closers.push(currentPool.end());
139
+ closers.push(endPool(currentPool));
140
140
  if (shouldCloseDesired)
141
- closers.push(desiredPool.end());
141
+ closers.push(endPool(desiredPool));
142
142
  if (closers.length) {
143
143
  await Promise.all(closers);
144
144
  }
@@ -8,7 +8,7 @@ import { extractCatalog } from "../catalog.model.js";
8
8
  import { buildPlanScopeFingerprint, hashStableIds } from "../fingerprint.js";
9
9
  import { compileFilterDSL, } from "../integrations/filter/dsl.js";
10
10
  import { compileSerializeDSL, } from "../integrations/serialize/dsl.js";
11
- import { createPool } from "../postgres-config.js";
11
+ import { createPool, endPool } from "../postgres-config.js";
12
12
  import { sortChanges } from "../sort/sort-changes.js";
13
13
  import { classifyChangesRisk } from "./risk.js";
14
14
  /**
@@ -33,7 +33,7 @@ async function parseSslConfig(url, connectionType) {
33
33
  const cleanedUrl = urlObj.toString();
34
34
  // Handle different SSL modes
35
35
  if (sslmode === "disable") {
36
- return { cleanedUrl };
36
+ return { cleanedUrl, ssl: false };
37
37
  }
38
38
  if (sslmode === "require" ||
39
39
  sslmode === "prefer" ||
@@ -54,17 +54,27 @@ async function parseSslConfig(url, connectionType) {
54
54
  const envValue = process.env[envVarName];
55
55
  return envValue || undefined;
56
56
  };
57
- // Get CA certificate value (needed for verify-ca, verify-full, and libpq compatibility with require/prefer)
57
+ const hasExplicitVerification = sslmode === "verify-ca" || sslmode === "verify-full";
58
+ // Get CA certificate value.
59
+ // - verify-ca/verify-full: check query param first, then env var
60
+ // - require/prefer: only check query param (libpq backward compatibility
61
+ // requires an explicit root CA *file*, not a global env var)
58
62
  const caEnvVar = connectionType === "source"
59
63
  ? "PGDELTA_SOURCE_SSLROOTCERT"
60
64
  : "PGDELTA_TARGET_SSLROOTCERT";
61
- const caValue = await getCertValue(sslrootcert, caEnvVar);
65
+ let caValue;
66
+ if (sslrootcert) {
67
+ // Explicit file path in query param — always honour it
68
+ caValue = await getCertValue(sslrootcert, caEnvVar);
69
+ }
70
+ else if (hasExplicitVerification) {
71
+ // verify-ca / verify-full without file path — fall back to env var
72
+ caValue = await getCertValue(null, caEnvVar);
73
+ }
74
+ // require/prefer without sslrootcert: no CA cert, no verification
62
75
  // Determine if we should verify the CA chain
63
- // - verify-ca and verify-full: always verify CA
64
- // - require/prefer with CA cert provided: verify CA (libpq backward compatibility)
65
76
  // From PostgreSQL docs: "if a root CA file exists, the behavior of sslmode=require
66
77
  // will be the same as that of verify-ca"
67
- const hasExplicitVerification = sslmode === "verify-ca" || sslmode === "verify-full";
68
78
  const hasLibpqCompatibility = (sslmode === "require" || sslmode === "prefer") && caValue !== undefined;
69
79
  const shouldVerifyCa = hasExplicitVerification || hasLibpqCompatibility;
70
80
  // Determine if we should verify hostname
@@ -106,8 +116,8 @@ async function parseSslConfig(url, connectionType) {
106
116
  }
107
117
  return { ssl, cleanedUrl };
108
118
  }
109
- // No sslmode specified or invalid value - no SSL configuration
110
- return { cleanedUrl };
119
+ // No sslmode specified or invalid value - explicitly disable SSL
120
+ return { cleanedUrl, ssl: false };
111
121
  }
112
122
  export async function createPlan(source, target, options = {}) {
113
123
  let sourcePool;
@@ -123,7 +133,7 @@ export async function createPlan(source, target, options = {}) {
123
133
  if (typeof source === "string") {
124
134
  const sslConfig = await parseSslConfig(source, "source");
125
135
  sourcePool = createPool(sslConfig.cleanedUrl, {
126
- ...(sslConfig.ssl ? { ssl: sslConfig.ssl } : {}),
136
+ ...(sslConfig.ssl !== undefined ? { ssl: sslConfig.ssl } : {}),
127
137
  onError,
128
138
  onConnect: async (client) => {
129
139
  // Force fully qualified names in catalog queries
@@ -141,7 +151,7 @@ export async function createPlan(source, target, options = {}) {
141
151
  if (typeof target === "string") {
142
152
  const sslConfig = await parseSslConfig(target, "target");
143
153
  targetPool = createPool(sslConfig.cleanedUrl, {
144
- ...(sslConfig.ssl ? { ssl: sslConfig.ssl } : {}),
154
+ ...(sslConfig.ssl !== undefined ? { ssl: sslConfig.ssl } : {}),
145
155
  onError,
146
156
  onConnect: async (client) => {
147
157
  // Force fully qualified names in catalog queries
@@ -156,19 +166,28 @@ export async function createPlan(source, target, options = {}) {
156
166
  else {
157
167
  targetPool = target;
158
168
  }
169
+ const sourceExtraction = extractCatalog(sourcePool);
170
+ const targetExtraction = extractCatalog(targetPool);
159
171
  try {
160
172
  const [fromCatalog, toCatalog] = await Promise.all([
161
- extractCatalog(sourcePool),
162
- extractCatalog(targetPool),
173
+ sourceExtraction,
174
+ targetExtraction,
163
175
  ]);
164
176
  return buildPlanForCatalogs(fromCatalog, toCatalog, options);
165
177
  }
178
+ catch (error) {
179
+ // When one extraction fails, the other may still have in-flight queries.
180
+ // Wait for both to settle before pool cleanup to prevent unhandled
181
+ // rejections from connections being terminated mid-flight.
182
+ await Promise.allSettled([sourceExtraction, targetExtraction]);
183
+ throw error;
184
+ }
166
185
  finally {
167
186
  const closers = [];
168
187
  if (shouldCloseSource)
169
- closers.push(sourcePool.end());
188
+ closers.push(endPool(sourcePool));
170
189
  if (shouldCloseTarget)
171
- closers.push(targetPool.end());
190
+ closers.push(endPool(targetPool));
172
191
  if (closers.length) {
173
192
  await Promise.all(closers);
174
193
  }
@@ -0,0 +1,2 @@
1
+ import type { NormalizedOptions } from "./types.ts";
2
+ export declare const DEFAULT_OPTIONS: NormalizedOptions;
@@ -0,0 +1,11 @@
1
+ export const DEFAULT_OPTIONS = {
2
+ keywordCase: "preserve",
3
+ indent: 2,
4
+ maxWidth: 100,
5
+ commaStyle: "trailing",
6
+ alignColumns: true,
7
+ alignKeyValues: true,
8
+ preserveRoutineBodies: true,
9
+ preserveViewBodies: true,
10
+ preserveRuleBodies: true,
11
+ };
@@ -0,0 +1,2 @@
1
+ import type { SqlFormatOptions } from "../sql-format.ts";
2
+ export declare function renderScript(options?: SqlFormatOptions): string;