@supabase/pg-delta 1.0.0-alpha.11 → 1.0.0-alpha.13

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 (397) hide show
  1. package/dist/core/expand-replace-dependencies.js +23 -0
  2. package/dist/core/export/index.d.ts +2 -2
  3. package/dist/core/export/index.js +4 -1
  4. package/dist/core/integrations/integration.types.d.ts +26 -1
  5. package/dist/core/integrations/integration.types.js +31 -1
  6. package/dist/core/integrations/serialize/dsl.d.ts +1 -8
  7. package/dist/core/integrations/serialize/serialize.types.d.ts +31 -0
  8. package/dist/core/integrations/supabase.js +19 -0
  9. package/dist/core/objects/aggregate/changes/aggregate.alter.d.ts +2 -1
  10. package/dist/core/objects/aggregate/changes/aggregate.alter.js +1 -1
  11. package/dist/core/objects/aggregate/changes/aggregate.comment.d.ts +3 -2
  12. package/dist/core/objects/aggregate/changes/aggregate.comment.js +2 -2
  13. package/dist/core/objects/aggregate/changes/aggregate.create.d.ts +2 -1
  14. package/dist/core/objects/aggregate/changes/aggregate.create.js +1 -1
  15. package/dist/core/objects/aggregate/changes/aggregate.drop.d.ts +2 -1
  16. package/dist/core/objects/aggregate/changes/aggregate.drop.js +1 -1
  17. package/dist/core/objects/aggregate/changes/aggregate.privilege.d.ts +4 -3
  18. package/dist/core/objects/aggregate/changes/aggregate.privilege.js +3 -3
  19. package/dist/core/objects/base.change.d.ts +2 -1
  20. package/dist/core/objects/collation/changes/collation.alter.d.ts +3 -2
  21. package/dist/core/objects/collation/changes/collation.alter.js +2 -2
  22. package/dist/core/objects/collation/changes/collation.comment.d.ts +3 -2
  23. package/dist/core/objects/collation/changes/collation.comment.js +2 -2
  24. package/dist/core/objects/collation/changes/collation.create.d.ts +2 -1
  25. package/dist/core/objects/collation/changes/collation.create.js +1 -1
  26. package/dist/core/objects/collation/changes/collation.drop.d.ts +2 -1
  27. package/dist/core/objects/collation/changes/collation.drop.js +1 -1
  28. package/dist/core/objects/domain/changes/domain.alter.d.ts +9 -8
  29. package/dist/core/objects/domain/changes/domain.alter.js +8 -8
  30. package/dist/core/objects/domain/changes/domain.comment.d.ts +3 -2
  31. package/dist/core/objects/domain/changes/domain.comment.js +2 -2
  32. package/dist/core/objects/domain/changes/domain.create.d.ts +2 -1
  33. package/dist/core/objects/domain/changes/domain.create.js +1 -1
  34. package/dist/core/objects/domain/changes/domain.drop.d.ts +2 -1
  35. package/dist/core/objects/domain/changes/domain.drop.js +1 -1
  36. package/dist/core/objects/domain/changes/domain.privilege.d.ts +4 -3
  37. package/dist/core/objects/domain/changes/domain.privilege.js +3 -3
  38. package/dist/core/objects/event-trigger/changes/event-trigger.alter.d.ts +3 -2
  39. package/dist/core/objects/event-trigger/changes/event-trigger.alter.js +2 -2
  40. package/dist/core/objects/event-trigger/changes/event-trigger.comment.d.ts +3 -2
  41. package/dist/core/objects/event-trigger/changes/event-trigger.comment.js +2 -2
  42. package/dist/core/objects/event-trigger/changes/event-trigger.create.d.ts +2 -1
  43. package/dist/core/objects/event-trigger/changes/event-trigger.create.js +1 -1
  44. package/dist/core/objects/event-trigger/changes/event-trigger.drop.d.ts +2 -1
  45. package/dist/core/objects/event-trigger/changes/event-trigger.drop.js +1 -1
  46. package/dist/core/objects/extension/changes/extension.alter.d.ts +3 -2
  47. package/dist/core/objects/extension/changes/extension.alter.js +2 -2
  48. package/dist/core/objects/extension/changes/extension.comment.d.ts +3 -2
  49. package/dist/core/objects/extension/changes/extension.comment.js +2 -2
  50. package/dist/core/objects/extension/changes/extension.create.d.ts +2 -1
  51. package/dist/core/objects/extension/changes/extension.create.js +4 -2
  52. package/dist/core/objects/extension/changes/extension.drop.d.ts +2 -1
  53. package/dist/core/objects/extension/changes/extension.drop.js +1 -1
  54. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.d.ts +3 -2
  55. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.js +2 -2
  56. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.d.ts +3 -2
  57. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.js +2 -2
  58. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.d.ts +2 -1
  59. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.js +1 -1
  60. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.d.ts +2 -1
  61. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.js +1 -1
  62. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.d.ts +4 -3
  63. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.js +3 -3
  64. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.d.ts +10 -9
  65. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.js +9 -9
  66. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.d.ts +3 -2
  67. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.js +2 -2
  68. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.d.ts +2 -1
  69. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.js +1 -1
  70. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.d.ts +2 -1
  71. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.js +1 -1
  72. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.d.ts +4 -3
  73. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.js +3 -3
  74. package/dist/core/objects/foreign-data-wrapper/server/changes/server.alter.d.ts +4 -3
  75. package/dist/core/objects/foreign-data-wrapper/server/changes/server.alter.js +3 -3
  76. package/dist/core/objects/foreign-data-wrapper/server/changes/server.comment.d.ts +3 -2
  77. package/dist/core/objects/foreign-data-wrapper/server/changes/server.comment.js +2 -2
  78. package/dist/core/objects/foreign-data-wrapper/server/changes/server.create.d.ts +2 -1
  79. package/dist/core/objects/foreign-data-wrapper/server/changes/server.create.js +1 -1
  80. package/dist/core/objects/foreign-data-wrapper/server/changes/server.drop.d.ts +2 -1
  81. package/dist/core/objects/foreign-data-wrapper/server/changes/server.drop.js +1 -1
  82. package/dist/core/objects/foreign-data-wrapper/server/changes/server.privilege.d.ts +4 -3
  83. package/dist/core/objects/foreign-data-wrapper/server/changes/server.privilege.js +3 -3
  84. package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.d.ts +2 -1
  85. package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.js +1 -1
  86. package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.d.ts +2 -1
  87. package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.js +1 -1
  88. package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.d.ts +2 -1
  89. package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.js +1 -1
  90. package/dist/core/objects/index/changes/index.alter.d.ts +4 -3
  91. package/dist/core/objects/index/changes/index.alter.js +3 -3
  92. package/dist/core/objects/index/changes/index.comment.d.ts +3 -2
  93. package/dist/core/objects/index/changes/index.comment.js +2 -2
  94. package/dist/core/objects/index/changes/index.create.d.ts +2 -1
  95. package/dist/core/objects/index/changes/index.create.js +1 -1
  96. package/dist/core/objects/index/changes/index.drop.d.ts +2 -1
  97. package/dist/core/objects/index/changes/index.drop.js +1 -1
  98. package/dist/core/objects/language/changes/language.alter.d.ts +2 -1
  99. package/dist/core/objects/language/changes/language.alter.js +1 -1
  100. package/dist/core/objects/language/changes/language.comment.d.ts +3 -2
  101. package/dist/core/objects/language/changes/language.comment.js +2 -2
  102. package/dist/core/objects/language/changes/language.create.d.ts +2 -1
  103. package/dist/core/objects/language/changes/language.create.js +1 -1
  104. package/dist/core/objects/language/changes/language.drop.d.ts +2 -1
  105. package/dist/core/objects/language/changes/language.drop.js +1 -1
  106. package/dist/core/objects/language/changes/language.privilege.d.ts +4 -3
  107. package/dist/core/objects/language/changes/language.privilege.js +3 -3
  108. package/dist/core/objects/materialized-view/changes/materialized-view.alter.d.ts +3 -2
  109. package/dist/core/objects/materialized-view/changes/materialized-view.alter.js +2 -2
  110. package/dist/core/objects/materialized-view/changes/materialized-view.comment.d.ts +5 -4
  111. package/dist/core/objects/materialized-view/changes/materialized-view.comment.js +4 -4
  112. package/dist/core/objects/materialized-view/changes/materialized-view.create.d.ts +2 -1
  113. package/dist/core/objects/materialized-view/changes/materialized-view.create.js +1 -1
  114. package/dist/core/objects/materialized-view/changes/materialized-view.drop.d.ts +2 -1
  115. package/dist/core/objects/materialized-view/changes/materialized-view.drop.js +1 -1
  116. package/dist/core/objects/materialized-view/changes/materialized-view.privilege.d.ts +4 -3
  117. package/dist/core/objects/materialized-view/changes/materialized-view.privilege.js +3 -3
  118. package/dist/core/objects/procedure/changes/procedure.alter.d.ts +8 -7
  119. package/dist/core/objects/procedure/changes/procedure.alter.js +7 -7
  120. package/dist/core/objects/procedure/changes/procedure.comment.d.ts +3 -2
  121. package/dist/core/objects/procedure/changes/procedure.comment.js +2 -2
  122. package/dist/core/objects/procedure/changes/procedure.create.d.ts +2 -1
  123. package/dist/core/objects/procedure/changes/procedure.create.js +1 -1
  124. package/dist/core/objects/procedure/changes/procedure.drop.d.ts +2 -1
  125. package/dist/core/objects/procedure/changes/procedure.drop.js +1 -1
  126. package/dist/core/objects/procedure/changes/procedure.privilege.d.ts +4 -3
  127. package/dist/core/objects/procedure/changes/procedure.privilege.js +3 -3
  128. package/dist/core/objects/publication/changes/publication.alter.d.ts +9 -7
  129. package/dist/core/objects/publication/changes/publication.alter.js +12 -7
  130. package/dist/core/objects/publication/changes/publication.comment.d.ts +3 -2
  131. package/dist/core/objects/publication/changes/publication.comment.js +2 -2
  132. package/dist/core/objects/publication/changes/publication.create.d.ts +2 -1
  133. package/dist/core/objects/publication/changes/publication.create.js +1 -1
  134. package/dist/core/objects/publication/changes/publication.drop.d.ts +2 -1
  135. package/dist/core/objects/publication/changes/publication.drop.js +1 -1
  136. package/dist/core/objects/rls-policy/changes/rls-policy.alter.d.ts +4 -3
  137. package/dist/core/objects/rls-policy/changes/rls-policy.alter.js +3 -3
  138. package/dist/core/objects/rls-policy/changes/rls-policy.comment.d.ts +3 -2
  139. package/dist/core/objects/rls-policy/changes/rls-policy.comment.js +2 -2
  140. package/dist/core/objects/rls-policy/changes/rls-policy.create.d.ts +2 -1
  141. package/dist/core/objects/rls-policy/changes/rls-policy.create.js +1 -1
  142. package/dist/core/objects/rls-policy/changes/rls-policy.drop.d.ts +2 -1
  143. package/dist/core/objects/rls-policy/changes/rls-policy.drop.js +1 -1
  144. package/dist/core/objects/role/changes/role.alter.d.ts +3 -2
  145. package/dist/core/objects/role/changes/role.alter.js +2 -2
  146. package/dist/core/objects/role/changes/role.comment.d.ts +3 -2
  147. package/dist/core/objects/role/changes/role.comment.js +2 -2
  148. package/dist/core/objects/role/changes/role.create.d.ts +2 -1
  149. package/dist/core/objects/role/changes/role.create.js +1 -1
  150. package/dist/core/objects/role/changes/role.drop.d.ts +2 -1
  151. package/dist/core/objects/role/changes/role.drop.js +1 -1
  152. package/dist/core/objects/role/changes/role.privilege.d.ts +6 -5
  153. package/dist/core/objects/role/changes/role.privilege.js +5 -5
  154. package/dist/core/objects/rule/changes/rule.alter.d.ts +3 -2
  155. package/dist/core/objects/rule/changes/rule.alter.js +2 -2
  156. package/dist/core/objects/rule/changes/rule.comment.d.ts +3 -2
  157. package/dist/core/objects/rule/changes/rule.comment.js +2 -2
  158. package/dist/core/objects/rule/changes/rule.create.d.ts +2 -1
  159. package/dist/core/objects/rule/changes/rule.create.js +1 -1
  160. package/dist/core/objects/rule/changes/rule.drop.d.ts +2 -1
  161. package/dist/core/objects/rule/changes/rule.drop.js +1 -1
  162. package/dist/core/objects/schema/changes/schema.alter.d.ts +2 -1
  163. package/dist/core/objects/schema/changes/schema.alter.js +1 -1
  164. package/dist/core/objects/schema/changes/schema.comment.d.ts +3 -2
  165. package/dist/core/objects/schema/changes/schema.comment.js +2 -2
  166. package/dist/core/objects/schema/changes/schema.create.d.ts +3 -5
  167. package/dist/core/objects/schema/changes/schema.drop.d.ts +2 -1
  168. package/dist/core/objects/schema/changes/schema.drop.js +1 -1
  169. package/dist/core/objects/schema/changes/schema.privilege.d.ts +4 -3
  170. package/dist/core/objects/schema/changes/schema.privilege.js +3 -3
  171. package/dist/core/objects/sequence/changes/sequence.alter.d.ts +3 -2
  172. package/dist/core/objects/sequence/changes/sequence.alter.js +2 -2
  173. package/dist/core/objects/sequence/changes/sequence.comment.d.ts +3 -2
  174. package/dist/core/objects/sequence/changes/sequence.comment.js +2 -2
  175. package/dist/core/objects/sequence/changes/sequence.create.d.ts +2 -1
  176. package/dist/core/objects/sequence/changes/sequence.create.js +1 -1
  177. package/dist/core/objects/sequence/changes/sequence.drop.d.ts +2 -1
  178. package/dist/core/objects/sequence/changes/sequence.drop.js +11 -3
  179. package/dist/core/objects/sequence/changes/sequence.privilege.d.ts +4 -3
  180. package/dist/core/objects/sequence/changes/sequence.privilege.js +3 -3
  181. package/dist/core/objects/sequence/sequence.diff.d.ts +4 -1
  182. package/dist/core/objects/sequence/sequence.diff.js +12 -0
  183. package/dist/core/objects/subscription/changes/subscription.alter.d.ts +7 -6
  184. package/dist/core/objects/subscription/changes/subscription.alter.js +6 -6
  185. package/dist/core/objects/subscription/changes/subscription.comment.d.ts +3 -2
  186. package/dist/core/objects/subscription/changes/subscription.comment.js +2 -2
  187. package/dist/core/objects/subscription/changes/subscription.create.d.ts +2 -1
  188. package/dist/core/objects/subscription/changes/subscription.create.js +1 -1
  189. package/dist/core/objects/subscription/changes/subscription.drop.d.ts +2 -1
  190. package/dist/core/objects/subscription/changes/subscription.drop.js +1 -1
  191. package/dist/core/objects/table/changes/table.alter.d.ts +65 -22
  192. package/dist/core/objects/table/changes/table.alter.js +107 -22
  193. package/dist/core/objects/table/changes/table.comment.d.ts +7 -6
  194. package/dist/core/objects/table/changes/table.comment.js +6 -6
  195. package/dist/core/objects/table/changes/table.create.d.ts +2 -1
  196. package/dist/core/objects/table/changes/table.create.js +1 -1
  197. package/dist/core/objects/table/changes/table.drop.d.ts +4 -3
  198. package/dist/core/objects/table/changes/table.drop.js +7 -1
  199. package/dist/core/objects/table/changes/table.privilege.d.ts +4 -3
  200. package/dist/core/objects/table/changes/table.privilege.js +3 -3
  201. package/dist/core/objects/table/table.diff.js +46 -1
  202. package/dist/core/objects/trigger/changes/trigger.alter.d.ts +2 -1
  203. package/dist/core/objects/trigger/changes/trigger.alter.js +1 -1
  204. package/dist/core/objects/trigger/changes/trigger.comment.d.ts +3 -2
  205. package/dist/core/objects/trigger/changes/trigger.comment.js +2 -2
  206. package/dist/core/objects/trigger/changes/trigger.create.d.ts +2 -1
  207. package/dist/core/objects/trigger/changes/trigger.create.js +1 -1
  208. package/dist/core/objects/trigger/changes/trigger.drop.d.ts +2 -1
  209. package/dist/core/objects/trigger/changes/trigger.drop.js +1 -1
  210. package/dist/core/objects/type/composite-type/changes/composite-type.alter.d.ts +5 -4
  211. package/dist/core/objects/type/composite-type/changes/composite-type.alter.js +4 -4
  212. package/dist/core/objects/type/composite-type/changes/composite-type.comment.d.ts +5 -4
  213. package/dist/core/objects/type/composite-type/changes/composite-type.comment.js +4 -4
  214. package/dist/core/objects/type/composite-type/changes/composite-type.create.d.ts +2 -1
  215. package/dist/core/objects/type/composite-type/changes/composite-type.create.js +1 -1
  216. package/dist/core/objects/type/composite-type/changes/composite-type.drop.d.ts +2 -1
  217. package/dist/core/objects/type/composite-type/changes/composite-type.drop.js +1 -1
  218. package/dist/core/objects/type/composite-type/changes/composite-type.privilege.d.ts +4 -3
  219. package/dist/core/objects/type/composite-type/changes/composite-type.privilege.js +3 -3
  220. package/dist/core/objects/type/enum/changes/enum.alter.d.ts +3 -2
  221. package/dist/core/objects/type/enum/changes/enum.alter.js +2 -2
  222. package/dist/core/objects/type/enum/changes/enum.comment.d.ts +3 -2
  223. package/dist/core/objects/type/enum/changes/enum.comment.js +2 -2
  224. package/dist/core/objects/type/enum/changes/enum.create.d.ts +2 -1
  225. package/dist/core/objects/type/enum/changes/enum.create.js +1 -1
  226. package/dist/core/objects/type/enum/changes/enum.drop.d.ts +2 -1
  227. package/dist/core/objects/type/enum/changes/enum.drop.js +1 -1
  228. package/dist/core/objects/type/enum/changes/enum.privilege.d.ts +4 -3
  229. package/dist/core/objects/type/enum/changes/enum.privilege.js +3 -3
  230. package/dist/core/objects/type/range/changes/range.alter.d.ts +2 -1
  231. package/dist/core/objects/type/range/changes/range.alter.js +1 -1
  232. package/dist/core/objects/type/range/changes/range.comment.d.ts +3 -2
  233. package/dist/core/objects/type/range/changes/range.comment.js +2 -2
  234. package/dist/core/objects/type/range/changes/range.create.d.ts +2 -1
  235. package/dist/core/objects/type/range/changes/range.create.js +1 -1
  236. package/dist/core/objects/type/range/changes/range.drop.d.ts +2 -1
  237. package/dist/core/objects/type/range/changes/range.drop.js +1 -1
  238. package/dist/core/objects/type/range/changes/range.privilege.d.ts +4 -3
  239. package/dist/core/objects/type/range/changes/range.privilege.js +3 -3
  240. package/dist/core/objects/view/changes/view.alter.d.ts +4 -3
  241. package/dist/core/objects/view/changes/view.alter.js +3 -3
  242. package/dist/core/objects/view/changes/view.comment.d.ts +3 -2
  243. package/dist/core/objects/view/changes/view.comment.js +2 -2
  244. package/dist/core/objects/view/changes/view.create.d.ts +2 -1
  245. package/dist/core/objects/view/changes/view.create.js +1 -1
  246. package/dist/core/objects/view/changes/view.drop.d.ts +2 -1
  247. package/dist/core/objects/view/changes/view.drop.js +1 -1
  248. package/dist/core/objects/view/changes/view.privilege.d.ts +4 -3
  249. package/dist/core/objects/view/changes/view.privilege.js +3 -3
  250. package/dist/core/plan/create.js +5 -17
  251. package/dist/core/plan/types.d.ts +3 -6
  252. package/dist/core/sort/custom-constraints.js +64 -0
  253. package/package.json +1 -1
  254. package/src/core/expand-replace-dependencies.test.ts +126 -1
  255. package/src/core/expand-replace-dependencies.ts +50 -0
  256. package/src/core/export/index.ts +13 -4
  257. package/src/core/integrations/integration.types.ts +59 -1
  258. package/src/core/integrations/serialize/dsl.test.ts +20 -1
  259. package/src/core/integrations/serialize/dsl.ts +1 -10
  260. package/src/core/integrations/serialize/serialize.types.ts +37 -0
  261. package/src/core/integrations/supabase.ts +19 -0
  262. package/src/core/objects/aggregate/changes/aggregate.alter.ts +2 -1
  263. package/src/core/objects/aggregate/changes/aggregate.comment.ts +3 -2
  264. package/src/core/objects/aggregate/changes/aggregate.create.ts +2 -1
  265. package/src/core/objects/aggregate/changes/aggregate.drop.ts +2 -1
  266. package/src/core/objects/aggregate/changes/aggregate.privilege.ts +4 -3
  267. package/src/core/objects/base.change.ts +3 -1
  268. package/src/core/objects/collation/changes/collation.alter.ts +3 -2
  269. package/src/core/objects/collation/changes/collation.comment.ts +3 -2
  270. package/src/core/objects/collation/changes/collation.create.ts +2 -1
  271. package/src/core/objects/collation/changes/collation.drop.ts +2 -1
  272. package/src/core/objects/domain/changes/domain.alter.ts +9 -8
  273. package/src/core/objects/domain/changes/domain.comment.ts +3 -2
  274. package/src/core/objects/domain/changes/domain.create.ts +2 -1
  275. package/src/core/objects/domain/changes/domain.drop.ts +2 -1
  276. package/src/core/objects/domain/changes/domain.privilege.ts +4 -3
  277. package/src/core/objects/event-trigger/changes/event-trigger.alter.ts +3 -2
  278. package/src/core/objects/event-trigger/changes/event-trigger.comment.ts +3 -2
  279. package/src/core/objects/event-trigger/changes/event-trigger.create.ts +2 -1
  280. package/src/core/objects/event-trigger/changes/event-trigger.drop.ts +2 -1
  281. package/src/core/objects/extension/changes/extension.alter.ts +3 -2
  282. package/src/core/objects/extension/changes/extension.comment.ts +3 -2
  283. package/src/core/objects/extension/changes/extension.create.test.ts +22 -0
  284. package/src/core/objects/extension/changes/extension.create.ts +5 -2
  285. package/src/core/objects/extension/changes/extension.drop.ts +2 -1
  286. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.ts +3 -2
  287. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.ts +3 -2
  288. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.ts +2 -1
  289. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.ts +2 -1
  290. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.ts +4 -3
  291. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.ts +10 -9
  292. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.ts +3 -2
  293. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.ts +2 -1
  294. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.ts +2 -1
  295. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.ts +4 -3
  296. package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.ts +4 -3
  297. package/src/core/objects/foreign-data-wrapper/server/changes/server.comment.ts +3 -2
  298. package/src/core/objects/foreign-data-wrapper/server/changes/server.create.ts +2 -1
  299. package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.ts +2 -1
  300. package/src/core/objects/foreign-data-wrapper/server/changes/server.privilege.ts +4 -3
  301. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.ts +2 -1
  302. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.ts +2 -1
  303. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.ts +2 -1
  304. package/src/core/objects/index/changes/index.alter.ts +4 -3
  305. package/src/core/objects/index/changes/index.comment.ts +3 -2
  306. package/src/core/objects/index/changes/index.create.ts +2 -1
  307. package/src/core/objects/index/changes/index.drop.ts +2 -1
  308. package/src/core/objects/language/changes/language.alter.ts +2 -1
  309. package/src/core/objects/language/changes/language.comment.ts +3 -2
  310. package/src/core/objects/language/changes/language.create.ts +2 -1
  311. package/src/core/objects/language/changes/language.drop.ts +2 -1
  312. package/src/core/objects/language/changes/language.privilege.ts +4 -3
  313. package/src/core/objects/materialized-view/changes/materialized-view.alter.ts +3 -2
  314. package/src/core/objects/materialized-view/changes/materialized-view.comment.ts +5 -4
  315. package/src/core/objects/materialized-view/changes/materialized-view.create.ts +2 -1
  316. package/src/core/objects/materialized-view/changes/materialized-view.drop.ts +2 -1
  317. package/src/core/objects/materialized-view/changes/materialized-view.privilege.ts +4 -3
  318. package/src/core/objects/procedure/changes/procedure.alter.ts +8 -7
  319. package/src/core/objects/procedure/changes/procedure.comment.ts +3 -2
  320. package/src/core/objects/procedure/changes/procedure.create.ts +2 -1
  321. package/src/core/objects/procedure/changes/procedure.drop.ts +2 -1
  322. package/src/core/objects/procedure/changes/procedure.privilege.ts +4 -3
  323. package/src/core/objects/publication/changes/publication.alter.test.ts +4 -0
  324. package/src/core/objects/publication/changes/publication.alter.ts +14 -7
  325. package/src/core/objects/publication/changes/publication.comment.ts +3 -2
  326. package/src/core/objects/publication/changes/publication.create.ts +2 -1
  327. package/src/core/objects/publication/changes/publication.drop.ts +2 -1
  328. package/src/core/objects/rls-policy/changes/rls-policy.alter.ts +4 -3
  329. package/src/core/objects/rls-policy/changes/rls-policy.comment.ts +3 -2
  330. package/src/core/objects/rls-policy/changes/rls-policy.create.ts +2 -1
  331. package/src/core/objects/rls-policy/changes/rls-policy.drop.ts +2 -1
  332. package/src/core/objects/role/changes/role.alter.ts +3 -2
  333. package/src/core/objects/role/changes/role.comment.ts +3 -2
  334. package/src/core/objects/role/changes/role.create.ts +2 -1
  335. package/src/core/objects/role/changes/role.drop.ts +2 -1
  336. package/src/core/objects/role/changes/role.privilege.ts +6 -5
  337. package/src/core/objects/rule/changes/rule.alter.ts +3 -2
  338. package/src/core/objects/rule/changes/rule.comment.ts +3 -2
  339. package/src/core/objects/rule/changes/rule.create.ts +2 -1
  340. package/src/core/objects/rule/changes/rule.drop.ts +2 -1
  341. package/src/core/objects/schema/changes/schema.alter.ts +2 -1
  342. package/src/core/objects/schema/changes/schema.comment.ts +3 -2
  343. package/src/core/objects/schema/changes/schema.create.ts +3 -3
  344. package/src/core/objects/schema/changes/schema.drop.ts +2 -1
  345. package/src/core/objects/schema/changes/schema.privilege.ts +4 -3
  346. package/src/core/objects/sequence/changes/sequence.alter.ts +3 -2
  347. package/src/core/objects/sequence/changes/sequence.comment.ts +3 -2
  348. package/src/core/objects/sequence/changes/sequence.create.ts +2 -1
  349. package/src/core/objects/sequence/changes/sequence.drop.ts +16 -3
  350. package/src/core/objects/sequence/changes/sequence.privilege.ts +4 -3
  351. package/src/core/objects/sequence/sequence.diff.test.ts +73 -1
  352. package/src/core/objects/sequence/sequence.diff.ts +24 -2
  353. package/src/core/objects/subscription/changes/subscription.alter.ts +7 -6
  354. package/src/core/objects/subscription/changes/subscription.comment.ts +3 -2
  355. package/src/core/objects/subscription/changes/subscription.create.ts +2 -1
  356. package/src/core/objects/subscription/changes/subscription.drop.ts +2 -1
  357. package/src/core/objects/table/changes/table.alter.test.ts +38 -0
  358. package/src/core/objects/table/changes/table.alter.ts +123 -22
  359. package/src/core/objects/table/changes/table.comment.ts +7 -6
  360. package/src/core/objects/table/changes/table.create.ts +2 -1
  361. package/src/core/objects/table/changes/table.drop.ts +20 -1
  362. package/src/core/objects/table/changes/table.privilege.ts +4 -3
  363. package/src/core/objects/table/table.diff.test.ts +121 -0
  364. package/src/core/objects/table/table.diff.ts +64 -1
  365. package/src/core/objects/trigger/changes/trigger.alter.ts +2 -1
  366. package/src/core/objects/trigger/changes/trigger.comment.ts +3 -2
  367. package/src/core/objects/trigger/changes/trigger.create.ts +2 -1
  368. package/src/core/objects/trigger/changes/trigger.drop.ts +2 -1
  369. package/src/core/objects/type/composite-type/changes/composite-type.alter.ts +5 -4
  370. package/src/core/objects/type/composite-type/changes/composite-type.comment.ts +5 -4
  371. package/src/core/objects/type/composite-type/changes/composite-type.create.ts +2 -1
  372. package/src/core/objects/type/composite-type/changes/composite-type.drop.ts +2 -1
  373. package/src/core/objects/type/composite-type/changes/composite-type.privilege.ts +4 -3
  374. package/src/core/objects/type/enum/changes/enum.alter.ts +3 -2
  375. package/src/core/objects/type/enum/changes/enum.comment.ts +3 -2
  376. package/src/core/objects/type/enum/changes/enum.create.ts +2 -1
  377. package/src/core/objects/type/enum/changes/enum.drop.ts +2 -1
  378. package/src/core/objects/type/enum/changes/enum.privilege.ts +4 -3
  379. package/src/core/objects/type/range/changes/range.alter.ts +2 -1
  380. package/src/core/objects/type/range/changes/range.comment.ts +3 -2
  381. package/src/core/objects/type/range/changes/range.create.ts +2 -1
  382. package/src/core/objects/type/range/changes/range.drop.ts +2 -1
  383. package/src/core/objects/type/range/changes/range.privilege.ts +4 -3
  384. package/src/core/objects/view/changes/view.alter.ts +4 -3
  385. package/src/core/objects/view/changes/view.comment.ts +3 -2
  386. package/src/core/objects/view/changes/view.create.ts +2 -1
  387. package/src/core/objects/view/changes/view.drop.ts +2 -1
  388. package/src/core/objects/view/changes/view.privilege.ts +4 -3
  389. package/src/core/plan/create.ts +11 -27
  390. package/src/core/plan/sql-format/format-off.test.ts +1 -1
  391. package/src/core/plan/sql-format/format-pretty-lower-leading.test.ts +1 -1
  392. package/src/core/plan/sql-format/format-pretty-narrow.test.ts +1 -1
  393. package/src/core/plan/sql-format/format-pretty-preserve.test.ts +1 -1
  394. package/src/core/plan/sql-format/format-pretty-upper.test.ts +1 -1
  395. package/src/core/plan/types.ts +3 -6
  396. package/src/core/sort/custom-constraints.ts +74 -0
  397. package/src/typedoc.ts +5 -0
@@ -1,5 +1,6 @@
1
1
  import { getSchema } from "../change-utils.js";
2
2
  import { GrantRoleDefaultPrivileges, RevokeRoleDefaultPrivileges, } from "../objects/role/changes/role.privilege.js";
3
+ import { AlterTableAlterColumnAddIdentity, AlterTableAlterColumnDropDefault, AlterTableAlterColumnDropIdentity, AlterTableAlterColumnSetDefault, } from "../objects/table/changes/table.alter.js";
3
4
  /**
4
5
  * Maps object type names to PostgreSQL default privilege objtype codes.
5
6
  * This mirrors the mapping in base.default-privileges.ts.
@@ -116,11 +117,74 @@ function generateDefaultPrivilegeConstraints(changes) {
116
117
  }
117
118
  return constraints;
118
119
  }
120
+ function generateIdentityTransitionConstraints(changes) {
121
+ const constraints = [];
122
+ const dropDefaultByColumn = new Map();
123
+ const dropIdentityByColumn = new Map();
124
+ const addIdentityByColumn = new Map();
125
+ const setDefaultByColumn = new Map();
126
+ for (let i = 0; i < changes.length; i++) {
127
+ const change = changes[i];
128
+ const columnKey = "table" in change && "column" in change
129
+ ? `${change.table.schema}.${change.table.name}.${change.column.name}`
130
+ : null;
131
+ if (!columnKey)
132
+ continue;
133
+ if (change instanceof AlterTableAlterColumnDropDefault) {
134
+ const entries = dropDefaultByColumn.get(columnKey) ?? [];
135
+ entries.push(i);
136
+ dropDefaultByColumn.set(columnKey, entries);
137
+ }
138
+ else if (change instanceof AlterTableAlterColumnAddIdentity) {
139
+ const entries = addIdentityByColumn.get(columnKey) ?? [];
140
+ entries.push(i);
141
+ addIdentityByColumn.set(columnKey, entries);
142
+ }
143
+ else if (change instanceof AlterTableAlterColumnDropIdentity) {
144
+ const entries = dropIdentityByColumn.get(columnKey) ?? [];
145
+ entries.push(i);
146
+ dropIdentityByColumn.set(columnKey, entries);
147
+ }
148
+ else if (change instanceof AlterTableAlterColumnSetDefault) {
149
+ const entries = setDefaultByColumn.get(columnKey) ?? [];
150
+ entries.push(i);
151
+ setDefaultByColumn.set(columnKey, entries);
152
+ }
153
+ }
154
+ // These rules only order same-column ALTERs inside the create/alter phase.
155
+ // Sequence drops are handled separately in the earlier drop phase.
156
+ for (const [columnKey, dropDefaultIndexes] of dropDefaultByColumn) {
157
+ const addIdentityIndexes = addIdentityByColumn.get(columnKey) ?? [];
158
+ for (const sourceIndex of dropDefaultIndexes) {
159
+ for (const targetIndex of addIdentityIndexes) {
160
+ constraints.push({
161
+ sourceChangeIndex: sourceIndex,
162
+ targetChangeIndex: targetIndex,
163
+ source: "custom",
164
+ });
165
+ }
166
+ }
167
+ }
168
+ for (const [columnKey, dropIdentityIndexes] of dropIdentityByColumn) {
169
+ const setDefaultIndexes = setDefaultByColumn.get(columnKey) ?? [];
170
+ for (const sourceIndex of dropIdentityIndexes) {
171
+ for (const targetIndex of setDefaultIndexes) {
172
+ constraints.push({
173
+ sourceChangeIndex: sourceIndex,
174
+ targetChangeIndex: targetIndex,
175
+ source: "custom",
176
+ });
177
+ }
178
+ }
179
+ }
180
+ return constraints;
181
+ }
119
182
  /**
120
183
  * All custom constraint generators.
121
184
  */
122
185
  const customConstraintGenerators = [
123
186
  generateDefaultPrivilegeConstraints,
187
+ generateIdentityTransitionConstraints,
124
188
  ];
125
189
  /**
126
190
  * Generate Constraints from custom constraint generators.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@supabase/pg-delta",
3
- "version": "1.0.0-alpha.11",
3
+ "version": "1.0.0-alpha.13",
4
4
  "description": "PostgreSQL migrations made easy",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -1,7 +1,16 @@
1
1
  import { describe, expect, test } from "bun:test";
2
- import { createEmptyCatalog } from "./catalog.model.ts";
2
+ import { Catalog, createEmptyCatalog } from "./catalog.model.ts";
3
3
  import type { Change } from "./change.types.ts";
4
4
  import { expandReplaceDependencies } from "./expand-replace-dependencies.ts";
5
+ import { DefaultPrivilegeState } from "./objects/base.default-privileges.ts";
6
+ import { CreateSequence } from "./objects/sequence/changes/sequence.create.ts";
7
+ import { DropSequence } from "./objects/sequence/changes/sequence.drop.ts";
8
+ import { diffSequences } from "./objects/sequence/sequence.diff.ts";
9
+ import { Sequence } from "./objects/sequence/sequence.model.ts";
10
+ import { AlterTableAlterColumnSetDefault } from "./objects/table/changes/table.alter.ts";
11
+ import { CreateTable } from "./objects/table/changes/table.create.ts";
12
+ import { DropTable } from "./objects/table/changes/table.drop.ts";
13
+ import { Table } from "./objects/table/table.model.ts";
5
14
 
6
15
  function mockChange(overrides: {
7
16
  creates?: string[];
@@ -67,4 +76,120 @@ describe("expandReplaceDependencies", () => {
67
76
  });
68
77
  expect(result).toBe(changes);
69
78
  });
79
+
80
+ test("does not replace the owning table for an owned sequence recreation", async () => {
81
+ const baseline = await createEmptyCatalog(170000, "postgres");
82
+ const mainSequence = new Sequence({
83
+ schema: "public",
84
+ name: "user_id_seq",
85
+ data_type: "integer",
86
+ start_value: 1,
87
+ minimum_value: 1n,
88
+ maximum_value: 2147483647n,
89
+ increment: 1,
90
+ cycle_option: false,
91
+ cache_size: 1,
92
+ persistence: "p",
93
+ owned_by_schema: "public",
94
+ owned_by_table: "users",
95
+ owned_by_column: "id",
96
+ comment: null,
97
+ privileges: [],
98
+ owner: "postgres",
99
+ });
100
+ const branchSequence = new Sequence({
101
+ ...mainSequence,
102
+ data_type: "bigint",
103
+ maximum_value: 9223372036854775807n,
104
+ });
105
+ const usersTable = new Table({
106
+ schema: "public",
107
+ name: "users",
108
+ persistence: "p",
109
+ row_security: false,
110
+ force_row_security: false,
111
+ has_indexes: false,
112
+ has_rules: false,
113
+ has_triggers: false,
114
+ has_subclasses: false,
115
+ is_populated: true,
116
+ replica_identity: "d",
117
+ is_partition: false,
118
+ options: null,
119
+ partition_bound: null,
120
+ partition_by: null,
121
+ owner: "postgres",
122
+ comment: null,
123
+ parent_schema: null,
124
+ parent_name: null,
125
+ columns: [
126
+ {
127
+ name: "id",
128
+ position: 1,
129
+ data_type: "bigint",
130
+ data_type_str: "bigint",
131
+ is_custom_type: false,
132
+ custom_type_type: null,
133
+ custom_type_category: null,
134
+ custom_type_schema: null,
135
+ custom_type_name: null,
136
+ not_null: true,
137
+ is_identity: false,
138
+ is_identity_always: false,
139
+ is_generated: false,
140
+ collation: null,
141
+ default: "nextval('public.user_id_seq'::regclass)",
142
+ comment: null,
143
+ },
144
+ ],
145
+ privileges: [],
146
+ });
147
+ const changes = diffSequences(
148
+ {
149
+ version: 170000,
150
+ currentUser: "postgres",
151
+ defaultPrivilegeState: new DefaultPrivilegeState({}),
152
+ },
153
+ { [mainSequence.stableId]: mainSequence },
154
+ { [branchSequence.stableId]: branchSequence },
155
+ { [usersTable.stableId]: usersTable },
156
+ );
157
+ const mainCatalog = new Catalog({
158
+ ...baseline,
159
+ sequences: { [mainSequence.stableId]: mainSequence },
160
+ tables: { [usersTable.stableId]: usersTable },
161
+ depends: [
162
+ {
163
+ dependent_stable_id: mainSequence.stableId,
164
+ referenced_stable_id: "column:public.users.id",
165
+ deptype: "a",
166
+ },
167
+ {
168
+ dependent_stable_id: "column:public.users.id",
169
+ referenced_stable_id: mainSequence.stableId,
170
+ deptype: "n",
171
+ },
172
+ ],
173
+ });
174
+ const branchCatalog = new Catalog({
175
+ ...baseline,
176
+ sequences: { [branchSequence.stableId]: branchSequence },
177
+ tables: { [usersTable.stableId]: usersTable },
178
+ depends: [],
179
+ });
180
+
181
+ const expanded = expandReplaceDependencies({
182
+ changes,
183
+ mainCatalog,
184
+ branchCatalog,
185
+ });
186
+
187
+ expect(changes[0]).toBeInstanceOf(DropSequence);
188
+ expect(changes[1]).toBeInstanceOf(CreateSequence);
189
+ expect(changes[3]).toBeInstanceOf(AlterTableAlterColumnSetDefault);
190
+ expect(expanded.some((change) => change instanceof DropTable)).toBe(false);
191
+ expect(expanded.some((change) => change instanceof CreateTable)).toBe(
192
+ false,
193
+ );
194
+ });
70
195
  });
@@ -19,6 +19,7 @@ import { CreateEnum } from "./objects/type/enum/changes/enum.create.ts";
19
19
  import { DropEnum } from "./objects/type/enum/changes/enum.drop.ts";
20
20
  import { CreateRange } from "./objects/type/range/changes/range.create.ts";
21
21
  import { DropRange } from "./objects/type/range/changes/range.drop.ts";
22
+ import { stableId } from "./objects/utils.ts";
22
23
  import { CreateView } from "./objects/view/changes/view.create.ts";
23
24
  import { DropView } from "./objects/view/changes/view.drop.ts";
24
25
 
@@ -121,6 +122,17 @@ export function expandReplaceDependencies({
121
122
  if (!dependents) continue;
122
123
 
123
124
  for (const dependentRaw of dependents) {
125
+ if (
126
+ isOwnedSequenceColumnDependency(
127
+ refId,
128
+ dependentRaw,
129
+ mainCatalog,
130
+ branchCatalog,
131
+ )
132
+ ) {
133
+ continue;
134
+ }
135
+
124
136
  // Continue traversing the dependency graph from the raw dependent id.
125
137
  if (!visitedRefs.has(dependentRaw)) {
126
138
  visitedRefs.add(dependentRaw);
@@ -181,6 +193,44 @@ export function expandReplaceDependencies({
181
193
  return [...changes, ...additions];
182
194
  }
183
195
 
196
+ function isOwnedSequenceColumnDependency(
197
+ referencedId: string,
198
+ dependentId: string,
199
+ mainCatalog: Catalog,
200
+ branchCatalog: Catalog,
201
+ ): boolean {
202
+ // When a sequence replace root is still OWNED BY the same column, the
203
+ // sequence->column pg_depend edge is bookkeeping for ownership, not a signal
204
+ // that the whole owning table needs to be replaced. Skipping that edge keeps
205
+ // expandReplaceDependencies focused on recreating the sequence itself.
206
+ if (
207
+ !referencedId.startsWith("sequence:") ||
208
+ !dependentId.startsWith("column:")
209
+ ) {
210
+ return false;
211
+ }
212
+
213
+ const sequence =
214
+ branchCatalog.sequences[referencedId] ??
215
+ mainCatalog.sequences[referencedId];
216
+ if (
217
+ !sequence?.owned_by_schema ||
218
+ !sequence.owned_by_table ||
219
+ !sequence.owned_by_column
220
+ ) {
221
+ return false;
222
+ }
223
+
224
+ return (
225
+ dependentId ===
226
+ stableId.column(
227
+ sequence.owned_by_schema,
228
+ sequence.owned_by_table,
229
+ sequence.owned_by_column,
230
+ )
231
+ );
232
+ }
233
+
184
234
  function normalizeDependentId(dependentId: string): string | null {
185
235
  let id = dependentId;
186
236
 
@@ -4,7 +4,11 @@
4
4
 
5
5
  import type { Change } from "../change.types.ts";
6
6
  import { buildPlanScopeFingerprint, hashStableIds } from "../fingerprint.ts";
7
- import type { Integration } from "../integrations/integration.types.ts";
7
+ import {
8
+ type Integration,
9
+ type ResolvedIntegration,
10
+ resolveIntegration,
11
+ } from "../integrations/integration.types.ts";
8
12
  import type { createPlan } from "../plan/create.ts";
9
13
  import { DEFAULT_OPTIONS } from "../plan/sql-format/constants.ts";
10
14
  import type { SqlFormatOptions } from "../plan/sql-format/types.ts";
@@ -29,7 +33,7 @@ type PlanResult = NonNullable<Awaited<ReturnType<typeof createPlan>>>;
29
33
 
30
34
  export interface ExportOptions {
31
35
  /** Integration for custom serialization */
32
- integration?: Integration;
36
+ integration?: Pick<Integration, "serialize">;
33
37
  /**
34
38
  * SQL formatter options to control the output style.
35
39
  * Merged on top of the default export options (maxWidth: 180, keywordCase: "upper").
@@ -64,7 +68,9 @@ export function exportDeclarativeSchema(
64
68
  options?: ExportOptions,
65
69
  ): DeclarativeSchemaOutput {
66
70
  const { ctx, sortedChanges } = planResult;
67
- const integration = options?.integration;
71
+ const integration = options?.integration
72
+ ? resolveIntegration(options?.integration)
73
+ : {};
68
74
  const formatOptions: SqlFormatOptions | undefined =
69
75
  options?.formatOptions === null
70
76
  ? undefined
@@ -108,7 +114,10 @@ export function exportDeclarativeSchema(
108
114
  };
109
115
  }
110
116
 
111
- function serializeChange(change: Change, integration?: Integration): string {
117
+ function serializeChange(
118
+ change: Change,
119
+ integration?: ResolvedIntegration,
120
+ ): string {
112
121
  return integration?.serialize?.(change) ?? change.serialize();
113
122
  }
114
123
 
@@ -1,7 +1,65 @@
1
+ import { compileFilterDSL, type FilterDSL } from "./filter/dsl.ts";
1
2
  import type { ChangeFilter } from "./filter/filter.types.ts";
3
+ import { compileSerializeDSL, type SerializeDSL } from "./serialize/dsl.ts";
2
4
  import type { ChangeSerializer } from "./serialize/serialize.types.ts";
3
5
 
4
- export type Integration = {
6
+ /**
7
+ * A resolved integration is an integration that has been compiled to a function.
8
+ */
9
+ export type ResolvedIntegration = {
5
10
  filter?: ChangeFilter;
6
11
  serialize?: ChangeSerializer;
7
12
  };
13
+
14
+ /**
15
+ * A raw integration is an integration that has not been compiled to a function.
16
+ */
17
+ export type IntegrationDSL = {
18
+ filter?: FilterDSL;
19
+ serialize?: SerializeDSL;
20
+ };
21
+
22
+ /**
23
+ * An integration is a raw integration that has not been compiled to a function.
24
+ */
25
+ export type Integration = {
26
+ filter?: ResolvedIntegration["filter"] | IntegrationDSL["filter"];
27
+ serialize?: ResolvedIntegration["serialize"] | IntegrationDSL["serialize"];
28
+ };
29
+
30
+ /**
31
+ * Resolve an integration either DSL or already resovled into a ResolvedIntegration.
32
+ * @param integration - The integration to resolve.
33
+ * @returns The resolved integration.
34
+ */
35
+ export function resolveIntegration(
36
+ integration: Integration,
37
+ ): ResolvedIntegration | undefined {
38
+ // Determine if filter/serialize are DSL or functions, and extract DSL for storage
39
+ const isFilterDSL =
40
+ integration.filter && typeof integration.filter !== "function";
41
+ const isSerializeDSL =
42
+ integration.serialize && typeof integration.serialize !== "function";
43
+ const filterDSL = isFilterDSL ? (integration.filter as FilterDSL) : undefined;
44
+ const serializeDSL = isSerializeDSL
45
+ ? (integration.serialize as SerializeDSL)
46
+ : undefined;
47
+
48
+ // Build final integration: compile DSL if needed, use functions directly otherwise
49
+ if (integration.filter || integration.serialize) {
50
+ return {
51
+ filter:
52
+ typeof integration.filter === "function"
53
+ ? integration.filter
54
+ : filterDSL
55
+ ? compileFilterDSL(filterDSL)
56
+ : undefined,
57
+ serialize:
58
+ typeof integration.serialize === "function"
59
+ ? integration.serialize
60
+ : serializeDSL
61
+ ? compileSerializeDSL(serializeDSL)
62
+ : undefined,
63
+ };
64
+ }
65
+ }
@@ -1,22 +1,41 @@
1
1
  import { describe, expect, test } from "bun:test";
2
2
  import type { Change } from "../../change.types.ts";
3
3
  import { compileSerializeDSL } from "./dsl.ts";
4
+ import type { SerializeOptions } from "./serialize.types.ts";
4
5
 
5
6
  function makeChange(
6
7
  type: string,
7
8
  operation: string,
8
- serializeFn: (opts?: Record<string, unknown>) => string,
9
+ serializeFn: (opts?: SerializeOptions) => string,
9
10
  ): Change {
10
11
  return {
11
12
  objectType: type,
12
13
  operation,
13
14
  scope: "object",
14
15
  schema: { name: "test" },
16
+ extension: { schema: "pgmq" },
15
17
  serialize: serializeFn,
16
18
  } as unknown as Change;
17
19
  }
18
20
 
19
21
  describe("compileSerializeDSL", () => {
22
+ test("matching extension rule can skip schema serialization", () => {
23
+ const serializer = compileSerializeDSL([
24
+ {
25
+ when: { objectType: "extension", operation: "create" },
26
+ options: { skipSchema: true },
27
+ },
28
+ ]);
29
+
30
+ const change = makeChange("extension", "create", (opts) =>
31
+ opts?.skipSchema
32
+ ? "CREATE EXTENSION pgmq"
33
+ : "CREATE EXTENSION pgmq WITH SCHEMA pgmq",
34
+ );
35
+
36
+ expect(serializer(change)).toBe("CREATE EXTENSION pgmq");
37
+ });
38
+
20
39
  test("matching rule applies its options", () => {
21
40
  const serializer = compileSerializeDSL([
22
41
  {
@@ -6,16 +6,7 @@
6
6
 
7
7
  import type { Change } from "../../change.types.ts";
8
8
  import { evaluatePattern, type FilterPattern } from "../filter/dsl.ts";
9
- import type { ChangeSerializer } from "./serialize.types.ts";
10
-
11
- /**
12
- * Serialization options that can be passed to change.serialize().
13
- */
14
- type SerializeOptions = {
15
- skipAuthorization?: boolean;
16
- // Can be extended with more options in the future
17
- [key: string]: unknown;
18
- };
9
+ import type { ChangeSerializer, SerializeOptions } from "./serialize.types.ts";
19
10
 
20
11
  /**
21
12
  * A serialization rule that applies options when a pattern matches.
@@ -1,3 +1,40 @@
1
1
  import type { Change } from "../../change.types.ts";
2
2
 
3
+ /**
4
+ * Shared serialization options passed to `change.serialize(options)`.
5
+ *
6
+ * This is the global source of truth for serialize-option flags used by the
7
+ * integration serialization DSL and concrete change serializers.
8
+ *
9
+ * @category Integration
10
+ */
11
+ export type SerializeOptions = {
12
+ /** Skip `AUTHORIZATION` when serializing schema creation. */
13
+ skipAuthorization?: boolean;
14
+ /** Skip `WITH SCHEMA ...` when serializing extension creation. */
15
+ skipSchema?: boolean;
16
+ };
17
+
18
+ /**
19
+ * Schema-specific view of {@link SerializeOptions}.
20
+ *
21
+ * @category Integration
22
+ */
23
+ export type SchemaSerializeOptions = Pick<
24
+ SerializeOptions,
25
+ "skipAuthorization"
26
+ >;
27
+
28
+ /**
29
+ * Extension-specific view of {@link SerializeOptions}.
30
+ *
31
+ * @category Integration
32
+ */
33
+ export type ExtensionSerializeOptions = Pick<SerializeOptions, "skipSchema">;
34
+
35
+ /**
36
+ * Compiled serializer function used during plan/declarative export rendering.
37
+ *
38
+ * @category Integration
39
+ */
3
40
  export type ChangeSerializer = (change: Change) => string | undefined;
@@ -92,6 +92,12 @@ export const supabase: IntegrationDSL = {
92
92
  operation: "create",
93
93
  scope: "object",
94
94
  },
95
+ // Include extension DROPs used to disable some extensions (eg: pg-net)
96
+ {
97
+ objectType: "extension",
98
+ operation: "drop",
99
+ scope: "object",
100
+ },
95
101
  // Exclude system objects
96
102
  {
97
103
  not: {
@@ -141,5 +147,18 @@ export const supabase: IntegrationDSL = {
141
147
  skipAuthorization: true,
142
148
  },
143
149
  },
150
+ // pgmq extensions creates it's own schema on install doing a `CREATE EXTENSION pgmq WITH SCHEMA pgmq;`
151
+ // will cause an error because the schema will create extension and extension refer to unexisting schema
152
+ {
153
+ when: {
154
+ objectType: "extension",
155
+ operation: "create",
156
+ scope: "object",
157
+ "extension/schema": ["pgmq"],
158
+ },
159
+ options: {
160
+ skipSchema: true,
161
+ },
162
+ },
144
163
  ],
145
164
  };
@@ -1,3 +1,4 @@
1
+ import type { SerializeOptions } from "../../../integrations/serialize/serialize.types.ts";
1
2
  import type { Aggregate } from "../aggregate.model.ts";
2
3
  import { AlterAggregateChange } from "./aggregate.base.ts";
3
4
 
@@ -23,7 +24,7 @@ export class AlterAggregateChangeOwner extends AlterAggregateChange {
23
24
  return [this.aggregate.stableId];
24
25
  }
25
26
 
26
- serialize(): string {
27
+ serialize(_options?: SerializeOptions): string {
27
28
  const signature = this.aggregate.identityArguments;
28
29
  const qualifiedName = `${this.aggregate.schema}.${this.aggregate.name}`;
29
30
  const withArgs = signature.length > 0 ? `(${signature})` : "()";
@@ -1,3 +1,4 @@
1
+ import type { SerializeOptions } from "../../../integrations/serialize/serialize.types.ts";
1
2
  import { quoteLiteral } from "../../base.change.ts";
2
3
  import { stableId } from "../../utils.ts";
3
4
  import type { Aggregate } from "../aggregate.model.ts";
@@ -27,7 +28,7 @@ export class CreateCommentOnAggregate extends CreateAggregateChange {
27
28
  return [this.aggregate.stableId];
28
29
  }
29
30
 
30
- serialize(): string {
31
+ serialize(_options?: SerializeOptions): string {
31
32
  const signature = this.aggregate.identityArguments;
32
33
  const qualifiedName = `${this.aggregate.schema}.${this.aggregate.name}`;
33
34
  const withArgs = signature.length > 0 ? `(${signature})` : "()";
@@ -53,7 +54,7 @@ export class DropCommentOnAggregate extends DropAggregateChange {
53
54
  return [stableId.comment(this.aggregate.stableId), this.aggregate.stableId];
54
55
  }
55
56
 
56
- serialize(): string {
57
+ serialize(_options?: SerializeOptions): string {
57
58
  const signature = this.aggregate.identityArguments;
58
59
  const qualifiedName = `${this.aggregate.schema}.${this.aggregate.name}`;
59
60
  const withArgs = signature.length > 0 ? `(${signature})` : "()";
@@ -1,3 +1,4 @@
1
+ import type { SerializeOptions } from "../../../integrations/serialize/serialize.types.ts";
1
2
  import { quoteLiteral } from "../../base.change.ts";
2
3
  import {
3
4
  parseProcedureReference,
@@ -166,7 +167,7 @@ export class CreateAggregate extends CreateAggregateChange {
166
167
  return Array.from(dependencies);
167
168
  }
168
169
 
169
- serialize(): string {
170
+ serialize(_options?: SerializeOptions): string {
170
171
  const signature = this.aggregate.identityArguments;
171
172
  const qualifiedName = `${this.aggregate.schema}.${this.aggregate.name}`;
172
173
  const head = [
@@ -1,3 +1,4 @@
1
+ import type { SerializeOptions } from "../../../integrations/serialize/serialize.types.ts";
1
2
  import type { Aggregate } from "../aggregate.model.ts";
2
3
  import { DropAggregateChange } from "./aggregate.base.ts";
3
4
 
@@ -23,7 +24,7 @@ export class DropAggregate extends DropAggregateChange {
23
24
  return [this.aggregate.stableId];
24
25
  }
25
26
 
26
- serialize(): string {
27
+ serialize(_options?: SerializeOptions): string {
27
28
  const signature = this.aggregate.identityArguments;
28
29
  const qualifiedName = `${this.aggregate.schema}.${this.aggregate.name}`;
29
30
  const withArgs = signature.length > 0 ? `(${signature})` : "(*)";
@@ -1,3 +1,4 @@
1
+ import type { SerializeOptions } from "../../../integrations/serialize/serialize.types.ts";
1
2
  import {
2
3
  formatObjectPrivilegeList,
3
4
  getObjectKindPrefix,
@@ -39,7 +40,7 @@ export class GrantAggregatePrivileges extends AlterAggregateChange {
39
40
  return [this.aggregate.stableId, stableId.role(this.grantee)];
40
41
  }
41
42
 
42
- serialize(): string {
43
+ serialize(_options?: SerializeOptions): string {
43
44
  const hasGrantable = this.privileges.some((p) => p.grantable);
44
45
  const hasBase = this.privileges.some((p) => !p.grantable);
45
46
  if (hasGrantable && hasBase) {
@@ -92,7 +93,7 @@ export class RevokeAggregatePrivileges extends AlterAggregateChange {
92
93
  ];
93
94
  }
94
95
 
95
- serialize(): string {
96
+ serialize(_options?: SerializeOptions): string {
96
97
  const kindPrefix = getObjectKindPrefix("FUNCTION");
97
98
  const list = this.privileges.map((p) => p.privilege);
98
99
  const privSql = formatObjectPrivilegeList("FUNCTION", list, this.version);
@@ -131,7 +132,7 @@ export class RevokeGrantOptionAggregatePrivileges extends AlterAggregateChange {
131
132
  ];
132
133
  }
133
134
 
134
- serialize(): string {
135
+ serialize(_options?: SerializeOptions): string {
135
136
  const kindPrefix = getObjectKindPrefix("FUNCTION");
136
137
  const privSql = formatObjectPrivilegeList(
137
138
  "FUNCTION",
@@ -1,3 +1,5 @@
1
+ import type { SerializeOptions } from "../integrations/serialize/serialize.types.ts";
2
+
1
3
  type ChangeOperation = "create" | "alter" | "drop";
2
4
 
3
5
  /**
@@ -61,7 +63,7 @@ export abstract class BaseChange {
61
63
  /**
62
64
  * Serialize the change into a single SQL statement.
63
65
  */
64
- abstract serialize(options?: Record<string, unknown>): string;
66
+ abstract serialize(options?: SerializeOptions): string;
65
67
  }
66
68
 
67
69
  /**