@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
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ import type { NormalizedOptions } from "./types.ts";
2
+ export declare function wrapStatement(statement: string, options: NormalizedOptions, noWrapPlaceholders: Set<string>): string;
@@ -0,0 +1,165 @@
1
+ import { indentString } from "./format-utils.js";
2
+ import { isWordChar, walkSql } from "./sql-scanner.js";
3
+ /**
4
+ * Keywords that are preferred break points when wrapping long lines.
5
+ * The wrapper will prefer to break just before one of these keywords
6
+ * rather than at an arbitrary whitespace position.
7
+ */
8
+ const WRAP_PREFERRED_KEYWORDS = new Set([
9
+ "ADD",
10
+ "CHECK",
11
+ "CONNECTION",
12
+ "CONSTRAINT",
13
+ "DEFERRABLE",
14
+ "FOREIGN",
15
+ "HANDLER",
16
+ "INCLUDE",
17
+ "INITIALLY",
18
+ "INLINE",
19
+ "MATCH",
20
+ "NOT",
21
+ "ON",
22
+ "OPTIONS",
23
+ "PUBLICATION",
24
+ "REFERENCES",
25
+ "REFERENCING",
26
+ "SET",
27
+ "USING",
28
+ "VALIDATOR",
29
+ "WHERE",
30
+ "WITH",
31
+ ]);
32
+ export function wrapStatement(statement, options, noWrapPlaceholders) {
33
+ const lines = statement.split(/\r?\n/);
34
+ const wrapped = [];
35
+ for (const line of lines) {
36
+ if (line.trim().startsWith("--")) {
37
+ wrapped.push(line);
38
+ continue;
39
+ }
40
+ if (hasNoWrapPlaceholder(line, noWrapPlaceholders)) {
41
+ wrapped.push(line);
42
+ continue;
43
+ }
44
+ wrapped.push(...wrapLine(line, options));
45
+ }
46
+ return wrapped.join("\n");
47
+ }
48
+ function hasNoWrapPlaceholder(line, placeholders) {
49
+ for (const token of placeholders) {
50
+ if (line.includes(token))
51
+ return true;
52
+ }
53
+ return false;
54
+ }
55
+ function wrapLine(line, options) {
56
+ const maxWidth = options.maxWidth;
57
+ if (maxWidth <= 0 || line.length <= maxWidth) {
58
+ return [line];
59
+ }
60
+ const indentMatch = line.match(/^\s*/);
61
+ const baseIndent = indentMatch ? indentMatch[0] : "";
62
+ const continuationIndent = `${baseIndent}${indentString(options.indent)}`;
63
+ let remaining = line;
64
+ const output = [];
65
+ while (remaining.length > maxWidth) {
66
+ const breakpoint = findWrapPosition(remaining, maxWidth);
67
+ if (breakpoint <= 0)
68
+ break;
69
+ const head = remaining.slice(0, breakpoint).trimEnd();
70
+ const tail = remaining.slice(breakpoint).trimStart();
71
+ output.push(head);
72
+ const next = `${continuationIndent}${tail}`;
73
+ if (next.length >= remaining.length) {
74
+ remaining = next;
75
+ break;
76
+ }
77
+ remaining = next;
78
+ }
79
+ output.push(remaining);
80
+ return output;
81
+ }
82
+ /** Words that should not be separated from the previous word when wrapping (e.g. CREATE PUBLICATION, COMMENT ON). */
83
+ const KEEP_WITH_PREVIOUS = new Set([
84
+ "PUBLICATION",
85
+ "TABLE",
86
+ "VIEW",
87
+ "SCHEMA",
88
+ "INDEX",
89
+ "OR", // CREATE OR REPLACE
90
+ "ON", // COMMENT ON
91
+ ]);
92
+ function getPreviousWord(text, beforeIndex) {
93
+ let end = beforeIndex - 1;
94
+ while (end >= 0 && (text[end] === " " || text[end] === "\t")) {
95
+ end -= 1;
96
+ }
97
+ if (end < 0 || !isWordChar(text[end]))
98
+ return null;
99
+ let start = end;
100
+ while (start > 0 && isWordChar(text[start - 1])) {
101
+ start -= 1;
102
+ }
103
+ return text.slice(start, end + 1).toUpperCase();
104
+ }
105
+ function findWrapPosition(text, maxWidth) {
106
+ /** Last whitespace at depth 0 (preferred — avoids splitting parenthesized expressions) */
107
+ let lastTopLevelWhitespace = -1;
108
+ /** Last whitespace at any depth (fallback when no depth-0 break exists) */
109
+ let lastAnyWhitespace = -1;
110
+ let lastKeywordBoundary = -1;
111
+ /** First (leftmost) top-level comma within maxWidth — break there so each clause gets its own line */
112
+ let firstComma = -1;
113
+ // Never break within the leading indent — that would produce an empty head line
114
+ const contentStart = text.search(/\S/);
115
+ if (contentStart < 0)
116
+ return -1; // all whitespace
117
+ walkSql(text, (index, char, depth) => {
118
+ if (index > maxWidth)
119
+ return false;
120
+ // Skip positions within leading indent
121
+ if (index < contentStart)
122
+ return true;
123
+ // Prefer breaking after the first top-level comma so comma-separated clauses (e.g. publication tables) each get their own line
124
+ if (char === "," && depth === 0 && firstComma < 0) {
125
+ firstComma = index + 1; // position after the comma
126
+ }
127
+ if (char === " " || char === "\t") {
128
+ lastAnyWhitespace = index;
129
+ if (depth === 0) {
130
+ lastTopLevelWhitespace = index;
131
+ }
132
+ // Check if the next word is a preferred keyword
133
+ const nextWordStart = index + 1;
134
+ if (nextWordStart < text.length && isWordChar(text[nextWordStart])) {
135
+ let wordEnd = nextWordStart + 1;
136
+ while (wordEnd < text.length && isWordChar(text[wordEnd])) {
137
+ wordEnd += 1;
138
+ }
139
+ const word = text.slice(nextWordStart, wordEnd).toUpperCase();
140
+ if (WRAP_PREFERRED_KEYWORDS.has(word)) {
141
+ // Don't break between CREATE and object type, COMMENT and ON, or ALL and ON (GRANT/REVOKE ALL ON)
142
+ const prev = getPreviousWord(text, index);
143
+ if (prev !== null &&
144
+ ((prev === "CREATE" && KEEP_WITH_PREVIOUS.has(word)) ||
145
+ ((prev === "COMMENT" || prev === "ALL") && word === "ON"))) {
146
+ return true;
147
+ }
148
+ lastKeywordBoundary = index;
149
+ }
150
+ }
151
+ }
152
+ return true;
153
+ }, { trackDepth: true });
154
+ // Prefer: 1) comma, 2) keyword boundary, 3) depth-0 whitespace, 4) any whitespace
155
+ if (firstComma > 0 && firstComma <= maxWidth) {
156
+ return firstComma;
157
+ }
158
+ if (lastKeywordBoundary > 0 && lastKeywordBoundary <= maxWidth) {
159
+ return lastKeywordBoundary;
160
+ }
161
+ if (lastTopLevelWhitespace > 0) {
162
+ return lastTopLevelWhitespace;
163
+ }
164
+ return lastAnyWhitespace;
165
+ }
@@ -0,0 +1,2 @@
1
+ export { formatSqlStatements } from "./sql-format/index.ts";
2
+ export type { SqlFormatOptions } from "./sql-format/types.ts";
@@ -0,0 +1 @@
1
+ export { formatSqlStatements } from "./sql-format/index.js";
@@ -1,8 +1,9 @@
1
1
  /**
2
2
  * SQL script formatting utilities.
3
3
  */
4
+ import { type SqlFormatOptions } from "./sql-format.ts";
4
5
  /**
5
6
  * Format an array of SQL statements into a single script string.
6
7
  * Statements are joined with double newlines and the script ends with a semicolon.
7
8
  */
8
- export declare function formatSqlScript(statements: string[]): string;
9
+ export declare function formatSqlScript(statements: string[], options?: SqlFormatOptions): string;
@@ -1,13 +1,17 @@
1
1
  /**
2
2
  * SQL script formatting utilities.
3
3
  */
4
+ import { formatSqlStatements } from "./sql-format.js";
4
5
  const STATEMENT_DELIMITER = ";\n\n";
5
6
  /**
6
7
  * Format an array of SQL statements into a single script string.
7
8
  * Statements are joined with double newlines and the script ends with a semicolon.
8
9
  */
9
- export function formatSqlScript(statements) {
10
+ export function formatSqlScript(statements, options) {
10
11
  if (statements.length === 0)
11
12
  return "";
12
- return `${statements.join(STATEMENT_DELIMITER)};`;
13
+ const formatted = options
14
+ ? formatSqlStatements(statements, options)
15
+ : statements;
16
+ return `${formatted.join(STATEMENT_DELIMITER)};`;
13
17
  }
@@ -20,4 +20,19 @@ interface CreatePoolOptions extends Partial<PoolConfig> {
20
20
  * Create a Pool with custom type handlers and optional event listeners.
21
21
  */
22
22
  export declare function createPool(connectionString: string, options?: CreatePoolOptions): Pool;
23
+ /**
24
+ * End a pool and wait for all client sockets to fully close.
25
+ *
26
+ * pg-pool's `pool.end()` resolves once clients are removed from its
27
+ * internal bookkeeping, but the underlying `client.end()` calls (which
28
+ * close the TCP/TLS sockets) are fired asynchronously *after* that.
29
+ * If the server (e.g. a test container) is stopped right after
30
+ * `pool.end()` resolves, the still-open sockets receive an unexpected
31
+ * RST and emit unhandled "Connection terminated unexpectedly" errors.
32
+ *
33
+ * This helper waits for every `remove` event — which pg-pool emits
34
+ * inside each `client.end()` callback — ensuring all sockets are
35
+ * truly closed before it resolves.
36
+ */
37
+ export declare function endPool(pool: Pool): Promise<void>;
23
38
  export {};
@@ -108,3 +108,33 @@ export function createPool(connectionString, options) {
108
108
  pool.on("remove", onRemove);
109
109
  return pool;
110
110
  }
111
+ /**
112
+ * End a pool and wait for all client sockets to fully close.
113
+ *
114
+ * pg-pool's `pool.end()` resolves once clients are removed from its
115
+ * internal bookkeeping, but the underlying `client.end()` calls (which
116
+ * close the TCP/TLS sockets) are fired asynchronously *after* that.
117
+ * If the server (e.g. a test container) is stopped right after
118
+ * `pool.end()` resolves, the still-open sockets receive an unexpected
119
+ * RST and emit unhandled "Connection terminated unexpectedly" errors.
120
+ *
121
+ * This helper waits for every `remove` event — which pg-pool emits
122
+ * inside each `client.end()` callback — ensuring all sockets are
123
+ * truly closed before it resolves.
124
+ */
125
+ export function endPool(pool) {
126
+ const clientCount = pool.totalCount;
127
+ if (clientCount === 0) {
128
+ return pool.end();
129
+ }
130
+ return new Promise((resolve, reject) => {
131
+ let removed = 0;
132
+ pool.on("remove", function onRemove() {
133
+ if (++removed >= clientCount) {
134
+ pool.removeListener("remove", onRemove);
135
+ resolve();
136
+ }
137
+ });
138
+ pool.end().catch(reject);
139
+ });
140
+ }
package/dist/index.d.ts CHANGED
@@ -6,4 +6,6 @@
6
6
  export type { IntegrationDSL } from "./core/integrations/integration-dsl.ts";
7
7
  export { applyPlan } from "./core/plan/apply.ts";
8
8
  export { createPlan } from "./core/plan/create.ts";
9
+ export type { SqlFormatOptions } from "./core/plan/sql-format.ts";
10
+ export { formatSqlStatements } from "./core/plan/sql-format.ts";
9
11
  export type { CreatePlanOptions, Plan } from "./core/plan/types.ts";
package/dist/index.js CHANGED
@@ -6,3 +6,4 @@
6
6
  export { applyPlan } from "./core/plan/apply.js";
7
7
  // Core operations
8
8
  export { createPlan } from "./core/plan/create.js";
9
+ export { formatSqlStatements } from "./core/plan/sql-format.js";
package/package.json CHANGED
@@ -1,18 +1,33 @@
1
1
  {
2
2
  "name": "@supabase/pg-delta",
3
- "version": "1.0.0-alpha.3",
3
+ "version": "1.0.0-alpha.4",
4
4
  "description": "PostgreSQL migrations made easy",
5
5
  "type": "module",
6
6
  "sideEffects": false,
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
7
9
  "exports": {
8
- ".": "./dist/index.js",
9
- "./integrations/supabase": "./dist/core/integrations/supabase.js"
10
+ ".": {
11
+ "bun": "./src/index.ts",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/index.js",
14
+ "types": "./dist/index.d.ts",
15
+ "default": "./dist/index.js"
16
+ },
17
+ "./integrations/supabase": {
18
+ "bun": "./src/core/integrations/supabase.ts",
19
+ "import": "./dist/core/integrations/supabase.js",
20
+ "require": "./dist/core/integrations/supabase.js",
21
+ "types": "./dist/core/integrations/supabase.d.ts",
22
+ "default": "./dist/core/integrations/supabase.js"
23
+ }
10
24
  },
11
25
  "bin": {
12
26
  "pgdelta": "./dist/cli/bin/cli.js"
13
27
  },
14
28
  "files": [
15
29
  "dist",
30
+ "src",
16
31
  "README.md",
17
32
  "LICENSE"
18
33
  ],
@@ -26,15 +41,27 @@
26
41
  ],
27
42
  "author": "Supabase",
28
43
  "license": "MIT",
29
- "homepage": "https://github.com/supabase/pg-delta",
44
+ "homepage": "https://github.com/supabase/pg-toolbelt",
30
45
  "repository": {
31
46
  "type": "git",
32
- "url": "https://github.com/supabase/pg-delta.git"
47
+ "url": "https://github.com/supabase/pg-toolbelt.git",
48
+ "directory": "packages/pg-delta"
33
49
  },
34
- "bugs": "https://github.com/supabase/pg-delta/issues",
50
+ "bugs": "https://github.com/supabase/pg-toolbelt/issues",
35
51
  "engines": {
36
52
  "node": ">=20.0.0"
37
53
  },
54
+ "scripts": {
55
+ "build": "tsc --project tsconfig.build.json",
56
+ "check-types": "tsc --noEmit",
57
+ "format-and-lint": "biome check . --error-on-warnings",
58
+ "knip": "knip",
59
+ "pgdelta": "bun src/cli/bin/cli.ts",
60
+ "test": "bun test --concurrent --timeout 15000 --preload ./tests/global-setup.ts",
61
+ "test:unit": "bun test --concurrent src/",
62
+ "test:integration": "bun test --concurrent --timeout 15000 --preload ./tests/global-setup.ts --max-concurrency=4 tests/",
63
+ "version": "changeset version && bun install --no-frozen-lockfile && bun run format-and-lint --write"
64
+ },
38
65
  "dependencies": {
39
66
  "@stricli/core": "^1.2.4",
40
67
  "@ts-safeql/sql-tag": "^0.2.0",
@@ -44,27 +71,15 @@
44
71
  "zod": "^4.2.1"
45
72
  },
46
73
  "devDependencies": {
47
- "@biomejs/biome": "2.3.10",
48
- "@types/pg": "^8.11.10",
49
- "@changesets/cli": "^2.29.8",
50
74
  "@tsconfig/node-ts": "^23.6.2",
51
75
  "@tsconfig/node24": "^24.0.3",
76
+ "@types/bun": "^1.3.9",
52
77
  "@types/debug": "^4.1.12",
53
78
  "@types/node": "^24.10.4",
54
- "@vitest/coverage-v8": "4.0.16",
79
+ "@types/pg": "^8.11.10",
55
80
  "dedent": "^1.7.1",
56
81
  "knip": "^5.75.2",
57
82
  "testcontainers": "^11.10.0",
58
- "typescript": "^5.9.3",
59
- "vitest": "^4.0.16"
60
- },
61
- "scripts": {
62
- "build": "tsc --project tsconfig.build.json",
63
- "check-types": "tsc --noEmit",
64
- "format-and-lint": "biome check . --error-on-warnings",
65
- "knip": "knip",
66
- "pgdelta": "node src/cli/bin/cli.ts",
67
- "test": "vitest",
68
- "version": "changeset version && pnpm install --no-frozen-lockfile && pnpm format-and-lint --write"
83
+ "typescript": "^5.9.3"
69
84
  }
70
- }
85
+ }
package/src/cli/app.ts ADDED
@@ -0,0 +1,28 @@
1
+ import { buildApplication, buildRouteMap } from "@stricli/core";
2
+ import { applyCommand } from "./commands/apply.ts";
3
+ import { planCommand } from "./commands/plan.ts";
4
+ import { syncCommand } from "./commands/sync.ts";
5
+
6
+ const root = buildRouteMap({
7
+ routes: {
8
+ plan: planCommand,
9
+ apply: applyCommand,
10
+ sync: syncCommand,
11
+ },
12
+ defaultCommand: "sync",
13
+ docs: {
14
+ brief: "PostgreSQL migrations made easy",
15
+ fullDescription: `
16
+ pgdelta generates migration scripts by comparing two PostgreSQL databases.
17
+
18
+ Commands:
19
+ plan - Compute schema diff and preview changes
20
+ apply - Apply a plan's migration script to a database
21
+ sync - Plan and apply changes in one go
22
+ `.trim(),
23
+ },
24
+ });
25
+
26
+ export const app = buildApplication(root, {
27
+ name: "pgdelta",
28
+ });
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { run } from "@stricli/core";
4
+ import { app } from "../app.ts";
5
+
6
+ await run(app, process.argv.slice(2), { process }).catch((error) => {
7
+ console.error(error);
8
+ process.exit(1);
9
+ });
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Apply command - apply a plan's migration script to a target database.
3
+ */
4
+
5
+ import { readFile } from "node:fs/promises";
6
+ import { buildCommand, type CommandContext } from "@stricli/core";
7
+ import { applyPlan } from "../../core/plan/apply.ts";
8
+ import { deserializePlan, type Plan } from "../../core/plan/index.ts";
9
+ import { handleApplyResult, validatePlanRisk } from "../utils.ts";
10
+
11
+ export const applyCommand = buildCommand({
12
+ parameters: {
13
+ flags: {
14
+ plan: {
15
+ kind: "parsed",
16
+ brief: "Path to plan file (JSON format)",
17
+ parse: String,
18
+ },
19
+ source: {
20
+ kind: "parsed",
21
+ brief: "Source database connection URL (current state)",
22
+ parse: String,
23
+ },
24
+ target: {
25
+ kind: "parsed",
26
+ brief: "Target database connection URL (desired state)",
27
+ parse: String,
28
+ },
29
+ unsafe: {
30
+ kind: "boolean",
31
+ brief: "Allow data-loss operations (unsafe mode)",
32
+ optional: true,
33
+ },
34
+ },
35
+ aliases: {
36
+ p: "plan",
37
+ s: "source",
38
+ t: "target",
39
+ u: "unsafe",
40
+ },
41
+ },
42
+ docs: {
43
+ brief: "Apply a plan's migration script to a database",
44
+ fullDescription: `
45
+ Apply changes from a plan file to a target database.
46
+
47
+ The plan file should be a JSON file created with "pgdelta plan --output <file>.plan.json" (or any .plan/.json path).
48
+
49
+ Safe by default: will refuse plans containing data-loss unless --unsafe is set.
50
+
51
+ Exit codes:
52
+ 0 - Success (changes applied)
53
+ 1 - Error occurred
54
+ `.trim(),
55
+ },
56
+ async func(
57
+ this: CommandContext,
58
+ flags: {
59
+ plan: string;
60
+ source: string;
61
+ target: string;
62
+ unsafe?: boolean;
63
+ },
64
+ ) {
65
+ // Read and parse plan file
66
+ let planJson: string;
67
+ try {
68
+ planJson = await readFile(flags.plan, "utf-8");
69
+ } catch (error) {
70
+ this.process.stderr.write(
71
+ `Error reading plan file: ${error instanceof Error ? error.message : String(error)}\n`,
72
+ );
73
+ process.exitCode = 1;
74
+ return;
75
+ }
76
+
77
+ let plan: Plan;
78
+ try {
79
+ plan = deserializePlan(planJson);
80
+ } catch (error) {
81
+ this.process.stderr.write(
82
+ `Error parsing plan file: ${error instanceof Error ? error.message : String(error)}\n`,
83
+ );
84
+ process.exitCode = 1;
85
+ return;
86
+ }
87
+
88
+ const validation = validatePlanRisk(plan, !!flags.unsafe, this);
89
+ if (!validation.valid) {
90
+ process.exitCode = validation.exitCode ?? 1;
91
+ return;
92
+ }
93
+
94
+ const result = await applyPlan(plan, flags.source, flags.target, {
95
+ verifyPostApply: true,
96
+ });
97
+
98
+ const { exitCode } = handleApplyResult(result, this);
99
+ process.exitCode = exitCode;
100
+ },
101
+ });