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

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 (496) hide show
  1. package/dist/cli/commands/declarative-export.js +12 -17
  2. package/dist/cli/commands/plan.js +10 -13
  3. package/dist/cli/commands/sync.js +8 -12
  4. package/dist/cli/utils/integrations.d.ts +30 -6
  5. package/dist/cli/utils/integrations.js +98 -6
  6. package/dist/core/change-utils.d.ts +9 -0
  7. package/dist/core/change-utils.js +71 -0
  8. package/dist/core/change.types.d.ts +22 -0
  9. package/dist/core/change.types.js +37 -1
  10. package/dist/core/depend.js +25 -0
  11. package/dist/core/expand-replace-dependencies.js +23 -0
  12. package/dist/core/export/file-mapper.d.ts +2 -2
  13. package/dist/core/integrations/filter/dsl.d.ts +78 -74
  14. package/dist/core/integrations/filter/dsl.js +127 -79
  15. package/dist/core/integrations/filter/flatten.d.ts +51 -0
  16. package/dist/core/integrations/filter/flatten.js +116 -0
  17. package/dist/core/integrations/integration-dsl.d.ts +17 -1
  18. package/dist/core/integrations/merge.d.ts +20 -0
  19. package/dist/core/integrations/merge.js +60 -0
  20. package/dist/core/integrations/serialize/dsl.d.ts +8 -12
  21. package/dist/core/integrations/serialize/dsl.js +2 -2
  22. package/dist/core/integrations/serialize/serialize.types.d.ts +31 -0
  23. package/dist/core/integrations/supabase.js +42 -8
  24. package/dist/core/objects/aggregate/changes/aggregate.alter.d.ts +2 -1
  25. package/dist/core/objects/aggregate/changes/aggregate.alter.js +1 -1
  26. package/dist/core/objects/aggregate/changes/aggregate.comment.d.ts +3 -2
  27. package/dist/core/objects/aggregate/changes/aggregate.comment.js +2 -2
  28. package/dist/core/objects/aggregate/changes/aggregate.create.d.ts +2 -1
  29. package/dist/core/objects/aggregate/changes/aggregate.create.js +1 -1
  30. package/dist/core/objects/aggregate/changes/aggregate.drop.d.ts +2 -1
  31. package/dist/core/objects/aggregate/changes/aggregate.drop.js +1 -1
  32. package/dist/core/objects/aggregate/changes/aggregate.privilege.d.ts +4 -3
  33. package/dist/core/objects/aggregate/changes/aggregate.privilege.js +3 -3
  34. package/dist/core/objects/aggregate/changes/aggregate.types.d.ts +1 -0
  35. package/dist/core/objects/base.change.d.ts +12 -1
  36. package/dist/core/objects/base.change.js +10 -0
  37. package/dist/core/objects/base.model.d.ts +4 -1
  38. package/dist/core/objects/base.model.js +5 -2
  39. package/dist/core/objects/collation/changes/collation.alter.d.ts +3 -2
  40. package/dist/core/objects/collation/changes/collation.alter.js +2 -2
  41. package/dist/core/objects/collation/changes/collation.comment.d.ts +3 -2
  42. package/dist/core/objects/collation/changes/collation.comment.js +2 -2
  43. package/dist/core/objects/collation/changes/collation.create.d.ts +2 -1
  44. package/dist/core/objects/collation/changes/collation.create.js +1 -1
  45. package/dist/core/objects/collation/changes/collation.drop.d.ts +2 -1
  46. package/dist/core/objects/collation/changes/collation.drop.js +1 -1
  47. package/dist/core/objects/collation/changes/collation.types.d.ts +1 -0
  48. package/dist/core/objects/domain/changes/domain.alter.d.ts +9 -8
  49. package/dist/core/objects/domain/changes/domain.alter.js +8 -8
  50. package/dist/core/objects/domain/changes/domain.comment.d.ts +3 -2
  51. package/dist/core/objects/domain/changes/domain.comment.js +2 -2
  52. package/dist/core/objects/domain/changes/domain.create.d.ts +3 -2
  53. package/dist/core/objects/domain/changes/domain.create.js +8 -2
  54. package/dist/core/objects/domain/changes/domain.drop.d.ts +2 -1
  55. package/dist/core/objects/domain/changes/domain.drop.js +1 -1
  56. package/dist/core/objects/domain/changes/domain.privilege.d.ts +4 -3
  57. package/dist/core/objects/domain/changes/domain.privilege.js +3 -3
  58. package/dist/core/objects/domain/changes/domain.types.d.ts +1 -0
  59. package/dist/core/objects/event-trigger/changes/event-trigger.alter.d.ts +3 -2
  60. package/dist/core/objects/event-trigger/changes/event-trigger.alter.js +2 -2
  61. package/dist/core/objects/event-trigger/changes/event-trigger.comment.d.ts +3 -2
  62. package/dist/core/objects/event-trigger/changes/event-trigger.comment.js +2 -2
  63. package/dist/core/objects/event-trigger/changes/event-trigger.create.d.ts +2 -1
  64. package/dist/core/objects/event-trigger/changes/event-trigger.create.js +1 -1
  65. package/dist/core/objects/event-trigger/changes/event-trigger.drop.d.ts +2 -1
  66. package/dist/core/objects/event-trigger/changes/event-trigger.drop.js +1 -1
  67. package/dist/core/objects/event-trigger/changes/event-trigger.types.d.ts +1 -0
  68. package/dist/core/objects/extension/changes/extension.alter.d.ts +3 -2
  69. package/dist/core/objects/extension/changes/extension.alter.js +2 -2
  70. package/dist/core/objects/extension/changes/extension.comment.d.ts +3 -2
  71. package/dist/core/objects/extension/changes/extension.comment.js +2 -2
  72. package/dist/core/objects/extension/changes/extension.create.d.ts +2 -1
  73. package/dist/core/objects/extension/changes/extension.create.js +4 -2
  74. package/dist/core/objects/extension/changes/extension.drop.d.ts +2 -1
  75. package/dist/core/objects/extension/changes/extension.drop.js +1 -1
  76. package/dist/core/objects/extension/changes/extension.types.d.ts +1 -0
  77. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.d.ts +3 -2
  78. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.js +2 -2
  79. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.d.ts +3 -2
  80. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.js +2 -2
  81. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.d.ts +2 -1
  82. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.js +1 -1
  83. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.d.ts +2 -1
  84. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.js +1 -1
  85. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.d.ts +4 -3
  86. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.js +3 -3
  87. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.d.ts +1 -0
  88. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.d.ts +1 -0
  89. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.d.ts +10 -9
  90. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.js +9 -9
  91. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.d.ts +3 -2
  92. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.js +2 -2
  93. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.d.ts +2 -1
  94. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.js +1 -1
  95. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.d.ts +2 -1
  96. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.js +1 -1
  97. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.d.ts +4 -3
  98. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.js +3 -3
  99. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.d.ts +1 -0
  100. package/dist/core/objects/foreign-data-wrapper/server/changes/server.alter.d.ts +4 -3
  101. package/dist/core/objects/foreign-data-wrapper/server/changes/server.alter.js +3 -3
  102. package/dist/core/objects/foreign-data-wrapper/server/changes/server.comment.d.ts +3 -2
  103. package/dist/core/objects/foreign-data-wrapper/server/changes/server.comment.js +2 -2
  104. package/dist/core/objects/foreign-data-wrapper/server/changes/server.create.d.ts +2 -1
  105. package/dist/core/objects/foreign-data-wrapper/server/changes/server.create.js +1 -1
  106. package/dist/core/objects/foreign-data-wrapper/server/changes/server.drop.d.ts +2 -1
  107. package/dist/core/objects/foreign-data-wrapper/server/changes/server.drop.js +1 -1
  108. package/dist/core/objects/foreign-data-wrapper/server/changes/server.privilege.d.ts +4 -3
  109. package/dist/core/objects/foreign-data-wrapper/server/changes/server.privilege.js +3 -3
  110. package/dist/core/objects/foreign-data-wrapper/server/changes/server.types.d.ts +1 -0
  111. package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.d.ts +2 -1
  112. package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.js +1 -1
  113. package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.d.ts +2 -1
  114. package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.js +1 -1
  115. package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.d.ts +2 -1
  116. package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.js +1 -1
  117. package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.d.ts +1 -0
  118. package/dist/core/objects/index/changes/index.alter.d.ts +4 -3
  119. package/dist/core/objects/index/changes/index.alter.js +3 -3
  120. package/dist/core/objects/index/changes/index.comment.d.ts +3 -2
  121. package/dist/core/objects/index/changes/index.comment.js +2 -2
  122. package/dist/core/objects/index/changes/index.create.d.ts +2 -1
  123. package/dist/core/objects/index/changes/index.create.js +1 -1
  124. package/dist/core/objects/index/changes/index.drop.d.ts +2 -1
  125. package/dist/core/objects/index/changes/index.drop.js +1 -1
  126. package/dist/core/objects/index/changes/index.types.d.ts +1 -0
  127. package/dist/core/objects/language/changes/language.alter.d.ts +2 -1
  128. package/dist/core/objects/language/changes/language.alter.js +1 -1
  129. package/dist/core/objects/language/changes/language.comment.d.ts +3 -2
  130. package/dist/core/objects/language/changes/language.comment.js +2 -2
  131. package/dist/core/objects/language/changes/language.create.d.ts +2 -1
  132. package/dist/core/objects/language/changes/language.create.js +1 -1
  133. package/dist/core/objects/language/changes/language.drop.d.ts +2 -1
  134. package/dist/core/objects/language/changes/language.drop.js +1 -1
  135. package/dist/core/objects/language/changes/language.privilege.d.ts +4 -3
  136. package/dist/core/objects/language/changes/language.privilege.js +3 -3
  137. package/dist/core/objects/language/changes/language.types.d.ts +1 -0
  138. package/dist/core/objects/materialized-view/changes/materialized-view.alter.d.ts +3 -2
  139. package/dist/core/objects/materialized-view/changes/materialized-view.alter.js +2 -2
  140. package/dist/core/objects/materialized-view/changes/materialized-view.comment.d.ts +5 -4
  141. package/dist/core/objects/materialized-view/changes/materialized-view.comment.js +4 -4
  142. package/dist/core/objects/materialized-view/changes/materialized-view.create.d.ts +2 -1
  143. package/dist/core/objects/materialized-view/changes/materialized-view.create.js +1 -1
  144. package/dist/core/objects/materialized-view/changes/materialized-view.drop.d.ts +2 -1
  145. package/dist/core/objects/materialized-view/changes/materialized-view.drop.js +1 -1
  146. package/dist/core/objects/materialized-view/changes/materialized-view.privilege.d.ts +4 -3
  147. package/dist/core/objects/materialized-view/changes/materialized-view.privilege.js +3 -3
  148. package/dist/core/objects/materialized-view/changes/materialized-view.types.d.ts +1 -0
  149. package/dist/core/objects/procedure/changes/procedure.alter.d.ts +8 -7
  150. package/dist/core/objects/procedure/changes/procedure.alter.js +7 -7
  151. package/dist/core/objects/procedure/changes/procedure.comment.d.ts +3 -2
  152. package/dist/core/objects/procedure/changes/procedure.comment.js +2 -2
  153. package/dist/core/objects/procedure/changes/procedure.create.d.ts +2 -1
  154. package/dist/core/objects/procedure/changes/procedure.create.js +1 -1
  155. package/dist/core/objects/procedure/changes/procedure.drop.d.ts +2 -1
  156. package/dist/core/objects/procedure/changes/procedure.drop.js +1 -1
  157. package/dist/core/objects/procedure/changes/procedure.privilege.d.ts +4 -3
  158. package/dist/core/objects/procedure/changes/procedure.privilege.js +3 -3
  159. package/dist/core/objects/procedure/changes/procedure.types.d.ts +1 -0
  160. package/dist/core/objects/publication/changes/publication.alter.d.ts +9 -7
  161. package/dist/core/objects/publication/changes/publication.alter.js +12 -7
  162. package/dist/core/objects/publication/changes/publication.comment.d.ts +3 -2
  163. package/dist/core/objects/publication/changes/publication.comment.js +2 -2
  164. package/dist/core/objects/publication/changes/publication.create.d.ts +2 -1
  165. package/dist/core/objects/publication/changes/publication.create.js +1 -1
  166. package/dist/core/objects/publication/changes/publication.drop.d.ts +2 -1
  167. package/dist/core/objects/publication/changes/publication.drop.js +1 -1
  168. package/dist/core/objects/publication/changes/publication.types.d.ts +1 -0
  169. package/dist/core/objects/rls-policy/changes/rls-policy.alter.d.ts +4 -3
  170. package/dist/core/objects/rls-policy/changes/rls-policy.alter.js +3 -3
  171. package/dist/core/objects/rls-policy/changes/rls-policy.comment.d.ts +3 -2
  172. package/dist/core/objects/rls-policy/changes/rls-policy.comment.js +2 -2
  173. package/dist/core/objects/rls-policy/changes/rls-policy.create.d.ts +2 -1
  174. package/dist/core/objects/rls-policy/changes/rls-policy.create.js +1 -1
  175. package/dist/core/objects/rls-policy/changes/rls-policy.drop.d.ts +2 -1
  176. package/dist/core/objects/rls-policy/changes/rls-policy.drop.js +1 -1
  177. package/dist/core/objects/rls-policy/changes/rls-policy.types.d.ts +1 -0
  178. package/dist/core/objects/role/changes/role.alter.d.ts +3 -2
  179. package/dist/core/objects/role/changes/role.alter.js +2 -2
  180. package/dist/core/objects/role/changes/role.comment.d.ts +3 -2
  181. package/dist/core/objects/role/changes/role.comment.js +2 -2
  182. package/dist/core/objects/role/changes/role.create.d.ts +2 -1
  183. package/dist/core/objects/role/changes/role.create.js +1 -1
  184. package/dist/core/objects/role/changes/role.drop.d.ts +2 -1
  185. package/dist/core/objects/role/changes/role.drop.js +1 -1
  186. package/dist/core/objects/role/changes/role.privilege.d.ts +6 -5
  187. package/dist/core/objects/role/changes/role.privilege.js +5 -5
  188. package/dist/core/objects/role/changes/role.types.d.ts +1 -0
  189. package/dist/core/objects/rule/changes/rule.alter.d.ts +3 -2
  190. package/dist/core/objects/rule/changes/rule.alter.js +2 -2
  191. package/dist/core/objects/rule/changes/rule.comment.d.ts +3 -2
  192. package/dist/core/objects/rule/changes/rule.comment.js +2 -2
  193. package/dist/core/objects/rule/changes/rule.create.d.ts +2 -1
  194. package/dist/core/objects/rule/changes/rule.create.js +1 -1
  195. package/dist/core/objects/rule/changes/rule.drop.d.ts +2 -1
  196. package/dist/core/objects/rule/changes/rule.drop.js +1 -1
  197. package/dist/core/objects/rule/changes/rule.types.d.ts +1 -0
  198. package/dist/core/objects/schema/changes/schema.alter.d.ts +2 -1
  199. package/dist/core/objects/schema/changes/schema.alter.js +1 -1
  200. package/dist/core/objects/schema/changes/schema.comment.d.ts +3 -2
  201. package/dist/core/objects/schema/changes/schema.comment.js +2 -2
  202. package/dist/core/objects/schema/changes/schema.create.d.ts +3 -5
  203. package/dist/core/objects/schema/changes/schema.drop.d.ts +2 -1
  204. package/dist/core/objects/schema/changes/schema.drop.js +1 -1
  205. package/dist/core/objects/schema/changes/schema.privilege.d.ts +4 -3
  206. package/dist/core/objects/schema/changes/schema.privilege.js +3 -3
  207. package/dist/core/objects/schema/changes/schema.types.d.ts +1 -0
  208. package/dist/core/objects/sequence/changes/sequence.alter.d.ts +3 -2
  209. package/dist/core/objects/sequence/changes/sequence.alter.js +2 -2
  210. package/dist/core/objects/sequence/changes/sequence.comment.d.ts +3 -2
  211. package/dist/core/objects/sequence/changes/sequence.comment.js +2 -2
  212. package/dist/core/objects/sequence/changes/sequence.create.d.ts +2 -1
  213. package/dist/core/objects/sequence/changes/sequence.create.js +1 -1
  214. package/dist/core/objects/sequence/changes/sequence.drop.d.ts +2 -1
  215. package/dist/core/objects/sequence/changes/sequence.drop.js +11 -3
  216. package/dist/core/objects/sequence/changes/sequence.privilege.d.ts +4 -3
  217. package/dist/core/objects/sequence/changes/sequence.privilege.js +3 -3
  218. package/dist/core/objects/sequence/changes/sequence.types.d.ts +1 -0
  219. package/dist/core/objects/sequence/sequence.diff.d.ts +4 -1
  220. package/dist/core/objects/sequence/sequence.diff.js +12 -0
  221. package/dist/core/objects/subscription/changes/subscription.alter.d.ts +7 -6
  222. package/dist/core/objects/subscription/changes/subscription.alter.js +6 -6
  223. package/dist/core/objects/subscription/changes/subscription.comment.d.ts +3 -2
  224. package/dist/core/objects/subscription/changes/subscription.comment.js +2 -2
  225. package/dist/core/objects/subscription/changes/subscription.create.d.ts +2 -1
  226. package/dist/core/objects/subscription/changes/subscription.create.js +1 -1
  227. package/dist/core/objects/subscription/changes/subscription.drop.d.ts +2 -1
  228. package/dist/core/objects/subscription/changes/subscription.drop.js +1 -1
  229. package/dist/core/objects/subscription/changes/subscription.types.d.ts +1 -0
  230. package/dist/core/objects/table/changes/table.alter.d.ts +65 -22
  231. package/dist/core/objects/table/changes/table.alter.js +107 -22
  232. package/dist/core/objects/table/changes/table.comment.d.ts +7 -6
  233. package/dist/core/objects/table/changes/table.comment.js +6 -6
  234. package/dist/core/objects/table/changes/table.create.d.ts +2 -1
  235. package/dist/core/objects/table/changes/table.create.js +1 -1
  236. package/dist/core/objects/table/changes/table.drop.d.ts +4 -3
  237. package/dist/core/objects/table/changes/table.drop.js +7 -1
  238. package/dist/core/objects/table/changes/table.privilege.d.ts +4 -3
  239. package/dist/core/objects/table/changes/table.privilege.js +3 -3
  240. package/dist/core/objects/table/changes/table.types.d.ts +1 -0
  241. package/dist/core/objects/table/table.diff.js +46 -1
  242. package/dist/core/objects/trigger/changes/trigger.alter.d.ts +2 -1
  243. package/dist/core/objects/trigger/changes/trigger.alter.js +1 -1
  244. package/dist/core/objects/trigger/changes/trigger.comment.d.ts +3 -2
  245. package/dist/core/objects/trigger/changes/trigger.comment.js +2 -2
  246. package/dist/core/objects/trigger/changes/trigger.create.d.ts +2 -1
  247. package/dist/core/objects/trigger/changes/trigger.create.js +1 -1
  248. package/dist/core/objects/trigger/changes/trigger.drop.d.ts +2 -1
  249. package/dist/core/objects/trigger/changes/trigger.drop.js +1 -1
  250. package/dist/core/objects/trigger/changes/trigger.types.d.ts +1 -0
  251. package/dist/core/objects/type/composite-type/changes/composite-type.alter.d.ts +5 -4
  252. package/dist/core/objects/type/composite-type/changes/composite-type.alter.js +4 -4
  253. package/dist/core/objects/type/composite-type/changes/composite-type.comment.d.ts +5 -4
  254. package/dist/core/objects/type/composite-type/changes/composite-type.comment.js +4 -4
  255. package/dist/core/objects/type/composite-type/changes/composite-type.create.d.ts +2 -1
  256. package/dist/core/objects/type/composite-type/changes/composite-type.create.js +1 -1
  257. package/dist/core/objects/type/composite-type/changes/composite-type.drop.d.ts +2 -1
  258. package/dist/core/objects/type/composite-type/changes/composite-type.drop.js +1 -1
  259. package/dist/core/objects/type/composite-type/changes/composite-type.privilege.d.ts +4 -3
  260. package/dist/core/objects/type/composite-type/changes/composite-type.privilege.js +3 -3
  261. package/dist/core/objects/type/composite-type/changes/composite-type.types.d.ts +1 -0
  262. package/dist/core/objects/type/enum/changes/enum.alter.d.ts +3 -2
  263. package/dist/core/objects/type/enum/changes/enum.alter.js +2 -2
  264. package/dist/core/objects/type/enum/changes/enum.comment.d.ts +3 -2
  265. package/dist/core/objects/type/enum/changes/enum.comment.js +2 -2
  266. package/dist/core/objects/type/enum/changes/enum.create.d.ts +2 -1
  267. package/dist/core/objects/type/enum/changes/enum.create.js +1 -1
  268. package/dist/core/objects/type/enum/changes/enum.drop.d.ts +2 -1
  269. package/dist/core/objects/type/enum/changes/enum.drop.js +1 -1
  270. package/dist/core/objects/type/enum/changes/enum.privilege.d.ts +4 -3
  271. package/dist/core/objects/type/enum/changes/enum.privilege.js +3 -3
  272. package/dist/core/objects/type/enum/changes/enum.types.d.ts +1 -0
  273. package/dist/core/objects/type/range/changes/range.alter.d.ts +2 -1
  274. package/dist/core/objects/type/range/changes/range.alter.js +1 -1
  275. package/dist/core/objects/type/range/changes/range.comment.d.ts +3 -2
  276. package/dist/core/objects/type/range/changes/range.comment.js +2 -2
  277. package/dist/core/objects/type/range/changes/range.create.d.ts +2 -1
  278. package/dist/core/objects/type/range/changes/range.create.js +1 -1
  279. package/dist/core/objects/type/range/changes/range.drop.d.ts +2 -1
  280. package/dist/core/objects/type/range/changes/range.drop.js +1 -1
  281. package/dist/core/objects/type/range/changes/range.privilege.d.ts +4 -3
  282. package/dist/core/objects/type/range/changes/range.privilege.js +3 -3
  283. package/dist/core/objects/type/range/changes/range.types.d.ts +1 -0
  284. package/dist/core/objects/type/type.types.d.ts +1 -0
  285. package/dist/core/objects/view/changes/view.alter.d.ts +4 -3
  286. package/dist/core/objects/view/changes/view.alter.js +3 -3
  287. package/dist/core/objects/view/changes/view.comment.d.ts +3 -2
  288. package/dist/core/objects/view/changes/view.comment.js +2 -2
  289. package/dist/core/objects/view/changes/view.create.d.ts +2 -1
  290. package/dist/core/objects/view/changes/view.create.js +1 -1
  291. package/dist/core/objects/view/changes/view.drop.d.ts +2 -1
  292. package/dist/core/objects/view/changes/view.drop.js +1 -1
  293. package/dist/core/objects/view/changes/view.privilege.d.ts +4 -3
  294. package/dist/core/objects/view/changes/view.privilege.js +3 -3
  295. package/dist/core/objects/view/changes/view.types.d.ts +1 -0
  296. package/dist/core/objects/view/view.diff.js +24 -13
  297. package/dist/core/postgres-config.d.ts +2 -2
  298. package/dist/core/sort/custom-constraints.js +65 -1
  299. package/dist/core/sort/logical-sort.js +3 -24
  300. package/package.json +5 -1
  301. package/src/cli/commands/declarative-export.ts +19 -27
  302. package/src/cli/commands/plan.ts +14 -20
  303. package/src/cli/commands/sync.ts +8 -15
  304. package/src/cli/utils/integrations.test.ts +210 -3
  305. package/src/cli/utils/integrations.ts +134 -6
  306. package/src/core/catalog.snapshot.test.ts +11 -2
  307. package/src/core/change-utils.test.ts +61 -0
  308. package/src/core/change-utils.ts +73 -0
  309. package/src/core/change.types.ts +50 -0
  310. package/src/core/depend.ts +25 -0
  311. package/src/core/expand-replace-dependencies.test.ts +126 -1
  312. package/src/core/expand-replace-dependencies.ts +50 -0
  313. package/src/core/export/file-mapper.ts +7 -2
  314. package/src/core/integrations/filter/dsl.test.ts +299 -60
  315. package/src/core/integrations/filter/dsl.ts +208 -169
  316. package/src/core/integrations/filter/flatten.test.ts +282 -0
  317. package/src/core/integrations/filter/flatten.ts +150 -0
  318. package/src/core/integrations/integration-dsl.ts +17 -1
  319. package/src/core/integrations/merge.test.ts +128 -0
  320. package/src/core/integrations/merge.ts +72 -0
  321. package/src/core/integrations/serialize/dsl.test.ts +26 -7
  322. package/src/core/integrations/serialize/dsl.ts +8 -14
  323. package/src/core/integrations/serialize/serialize.types.ts +37 -0
  324. package/src/core/integrations/supabase.ts +42 -8
  325. package/src/core/objects/aggregate/changes/aggregate.alter.ts +2 -1
  326. package/src/core/objects/aggregate/changes/aggregate.comment.ts +3 -2
  327. package/src/core/objects/aggregate/changes/aggregate.create.ts +2 -1
  328. package/src/core/objects/aggregate/changes/aggregate.drop.ts +2 -1
  329. package/src/core/objects/aggregate/changes/aggregate.privilege.ts +4 -3
  330. package/src/core/objects/aggregate/changes/aggregate.types.ts +1 -0
  331. package/src/core/objects/base.change.ts +13 -1
  332. package/src/core/objects/base.model.test.ts +43 -0
  333. package/src/core/objects/base.model.ts +5 -2
  334. package/src/core/objects/collation/changes/collation.alter.ts +3 -2
  335. package/src/core/objects/collation/changes/collation.comment.ts +3 -2
  336. package/src/core/objects/collation/changes/collation.create.ts +2 -1
  337. package/src/core/objects/collation/changes/collation.drop.ts +2 -1
  338. package/src/core/objects/collation/changes/collation.types.ts +1 -0
  339. package/src/core/objects/domain/changes/domain.alter.ts +9 -8
  340. package/src/core/objects/domain/changes/domain.comment.ts +3 -2
  341. package/src/core/objects/domain/changes/domain.create.ts +19 -2
  342. package/src/core/objects/domain/changes/domain.drop.ts +2 -1
  343. package/src/core/objects/domain/changes/domain.privilege.ts +4 -3
  344. package/src/core/objects/domain/changes/domain.types.ts +1 -0
  345. package/src/core/objects/event-trigger/changes/event-trigger.alter.ts +3 -2
  346. package/src/core/objects/event-trigger/changes/event-trigger.comment.ts +3 -2
  347. package/src/core/objects/event-trigger/changes/event-trigger.create.ts +2 -1
  348. package/src/core/objects/event-trigger/changes/event-trigger.drop.ts +2 -1
  349. package/src/core/objects/event-trigger/changes/event-trigger.types.ts +1 -0
  350. package/src/core/objects/extension/changes/extension.alter.ts +3 -2
  351. package/src/core/objects/extension/changes/extension.comment.ts +3 -2
  352. package/src/core/objects/extension/changes/extension.create.test.ts +22 -0
  353. package/src/core/objects/extension/changes/extension.create.ts +5 -2
  354. package/src/core/objects/extension/changes/extension.drop.ts +2 -1
  355. package/src/core/objects/extension/changes/extension.types.ts +1 -0
  356. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.ts +3 -2
  357. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.ts +3 -2
  358. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.ts +2 -1
  359. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.ts +2 -1
  360. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.ts +4 -3
  361. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.ts +1 -0
  362. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.ts +1 -0
  363. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.ts +10 -9
  364. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.ts +3 -2
  365. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.ts +2 -1
  366. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.ts +2 -1
  367. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.ts +4 -3
  368. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.ts +1 -0
  369. package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.ts +4 -3
  370. package/src/core/objects/foreign-data-wrapper/server/changes/server.comment.ts +3 -2
  371. package/src/core/objects/foreign-data-wrapper/server/changes/server.create.ts +2 -1
  372. package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.ts +2 -1
  373. package/src/core/objects/foreign-data-wrapper/server/changes/server.privilege.ts +4 -3
  374. package/src/core/objects/foreign-data-wrapper/server/changes/server.types.ts +1 -0
  375. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.ts +2 -1
  376. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.ts +2 -1
  377. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.ts +2 -1
  378. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.ts +1 -0
  379. package/src/core/objects/index/changes/index.alter.ts +4 -3
  380. package/src/core/objects/index/changes/index.comment.ts +3 -2
  381. package/src/core/objects/index/changes/index.create.ts +2 -1
  382. package/src/core/objects/index/changes/index.drop.ts +2 -1
  383. package/src/core/objects/index/changes/index.types.ts +1 -0
  384. package/src/core/objects/language/changes/language.alter.ts +2 -1
  385. package/src/core/objects/language/changes/language.comment.ts +3 -2
  386. package/src/core/objects/language/changes/language.create.ts +2 -1
  387. package/src/core/objects/language/changes/language.drop.ts +2 -1
  388. package/src/core/objects/language/changes/language.privilege.ts +4 -3
  389. package/src/core/objects/language/changes/language.types.ts +1 -0
  390. package/src/core/objects/materialized-view/changes/materialized-view.alter.ts +3 -2
  391. package/src/core/objects/materialized-view/changes/materialized-view.comment.ts +5 -4
  392. package/src/core/objects/materialized-view/changes/materialized-view.create.ts +2 -1
  393. package/src/core/objects/materialized-view/changes/materialized-view.drop.ts +2 -1
  394. package/src/core/objects/materialized-view/changes/materialized-view.privilege.ts +4 -3
  395. package/src/core/objects/materialized-view/changes/materialized-view.types.ts +1 -0
  396. package/src/core/objects/procedure/changes/procedure.alter.ts +8 -7
  397. package/src/core/objects/procedure/changes/procedure.comment.ts +3 -2
  398. package/src/core/objects/procedure/changes/procedure.create.ts +2 -1
  399. package/src/core/objects/procedure/changes/procedure.drop.ts +2 -1
  400. package/src/core/objects/procedure/changes/procedure.privilege.ts +4 -3
  401. package/src/core/objects/procedure/changes/procedure.types.ts +1 -0
  402. package/src/core/objects/publication/changes/publication.alter.test.ts +4 -0
  403. package/src/core/objects/publication/changes/publication.alter.ts +14 -7
  404. package/src/core/objects/publication/changes/publication.comment.ts +3 -2
  405. package/src/core/objects/publication/changes/publication.create.ts +2 -1
  406. package/src/core/objects/publication/changes/publication.drop.ts +2 -1
  407. package/src/core/objects/publication/changes/publication.types.ts +1 -0
  408. package/src/core/objects/rls-policy/changes/rls-policy.alter.ts +4 -3
  409. package/src/core/objects/rls-policy/changes/rls-policy.comment.ts +3 -2
  410. package/src/core/objects/rls-policy/changes/rls-policy.create.ts +2 -1
  411. package/src/core/objects/rls-policy/changes/rls-policy.drop.ts +2 -1
  412. package/src/core/objects/rls-policy/changes/rls-policy.types.ts +1 -0
  413. package/src/core/objects/role/changes/role.alter.ts +3 -2
  414. package/src/core/objects/role/changes/role.comment.ts +3 -2
  415. package/src/core/objects/role/changes/role.create.ts +2 -1
  416. package/src/core/objects/role/changes/role.drop.ts +2 -1
  417. package/src/core/objects/role/changes/role.privilege.ts +6 -5
  418. package/src/core/objects/role/changes/role.types.ts +1 -0
  419. package/src/core/objects/rule/changes/rule.alter.ts +3 -2
  420. package/src/core/objects/rule/changes/rule.comment.ts +3 -2
  421. package/src/core/objects/rule/changes/rule.create.ts +2 -1
  422. package/src/core/objects/rule/changes/rule.drop.ts +2 -1
  423. package/src/core/objects/rule/changes/rule.types.ts +1 -0
  424. package/src/core/objects/schema/changes/schema.alter.ts +2 -1
  425. package/src/core/objects/schema/changes/schema.comment.ts +3 -2
  426. package/src/core/objects/schema/changes/schema.create.ts +3 -3
  427. package/src/core/objects/schema/changes/schema.drop.ts +2 -1
  428. package/src/core/objects/schema/changes/schema.privilege.ts +4 -3
  429. package/src/core/objects/schema/changes/schema.types.ts +1 -0
  430. package/src/core/objects/sequence/changes/sequence.alter.ts +3 -2
  431. package/src/core/objects/sequence/changes/sequence.comment.ts +3 -2
  432. package/src/core/objects/sequence/changes/sequence.create.ts +2 -1
  433. package/src/core/objects/sequence/changes/sequence.drop.ts +16 -3
  434. package/src/core/objects/sequence/changes/sequence.privilege.ts +4 -3
  435. package/src/core/objects/sequence/changes/sequence.types.ts +1 -0
  436. package/src/core/objects/sequence/sequence.diff.test.ts +73 -1
  437. package/src/core/objects/sequence/sequence.diff.ts +24 -2
  438. package/src/core/objects/subscription/changes/subscription.alter.ts +7 -6
  439. package/src/core/objects/subscription/changes/subscription.comment.ts +3 -2
  440. package/src/core/objects/subscription/changes/subscription.create.ts +2 -1
  441. package/src/core/objects/subscription/changes/subscription.drop.ts +2 -1
  442. package/src/core/objects/subscription/changes/subscription.types.ts +1 -0
  443. package/src/core/objects/table/changes/table.alter.test.ts +38 -0
  444. package/src/core/objects/table/changes/table.alter.ts +123 -22
  445. package/src/core/objects/table/changes/table.comment.ts +7 -6
  446. package/src/core/objects/table/changes/table.create.ts +2 -1
  447. package/src/core/objects/table/changes/table.drop.ts +20 -1
  448. package/src/core/objects/table/changes/table.privilege.ts +4 -3
  449. package/src/core/objects/table/changes/table.types.ts +1 -0
  450. package/src/core/objects/table/table.diff.test.ts +121 -0
  451. package/src/core/objects/table/table.diff.ts +64 -1
  452. package/src/core/objects/trigger/changes/trigger.alter.ts +2 -1
  453. package/src/core/objects/trigger/changes/trigger.comment.ts +3 -2
  454. package/src/core/objects/trigger/changes/trigger.create.ts +2 -1
  455. package/src/core/objects/trigger/changes/trigger.drop.ts +2 -1
  456. package/src/core/objects/trigger/changes/trigger.types.ts +1 -0
  457. package/src/core/objects/type/composite-type/changes/composite-type.alter.ts +5 -4
  458. package/src/core/objects/type/composite-type/changes/composite-type.comment.ts +5 -4
  459. package/src/core/objects/type/composite-type/changes/composite-type.create.ts +2 -1
  460. package/src/core/objects/type/composite-type/changes/composite-type.drop.ts +2 -1
  461. package/src/core/objects/type/composite-type/changes/composite-type.privilege.ts +4 -3
  462. package/src/core/objects/type/composite-type/changes/composite-type.types.ts +1 -0
  463. package/src/core/objects/type/enum/changes/enum.alter.ts +3 -2
  464. package/src/core/objects/type/enum/changes/enum.comment.ts +3 -2
  465. package/src/core/objects/type/enum/changes/enum.create.ts +2 -1
  466. package/src/core/objects/type/enum/changes/enum.drop.ts +2 -1
  467. package/src/core/objects/type/enum/changes/enum.privilege.ts +4 -3
  468. package/src/core/objects/type/enum/changes/enum.types.ts +1 -0
  469. package/src/core/objects/type/range/changes/range.alter.ts +2 -1
  470. package/src/core/objects/type/range/changes/range.comment.ts +3 -2
  471. package/src/core/objects/type/range/changes/range.create.ts +2 -1
  472. package/src/core/objects/type/range/changes/range.drop.ts +2 -1
  473. package/src/core/objects/type/range/changes/range.privilege.ts +4 -3
  474. package/src/core/objects/type/range/changes/range.types.ts +1 -0
  475. package/src/core/objects/type/type.types.ts +1 -0
  476. package/src/core/objects/view/changes/view.alter.ts +4 -3
  477. package/src/core/objects/view/changes/view.comment.ts +3 -2
  478. package/src/core/objects/view/changes/view.create.ts +2 -1
  479. package/src/core/objects/view/changes/view.drop.ts +2 -1
  480. package/src/core/objects/view/changes/view.privilege.ts +4 -3
  481. package/src/core/objects/view/changes/view.types.ts +1 -0
  482. package/src/core/objects/view/view.diff.test.ts +96 -0
  483. package/src/core/objects/view/view.diff.ts +30 -15
  484. package/src/core/plan/sql-format/format-off.test.ts +1 -1
  485. package/src/core/plan/sql-format/format-pretty-lower-leading.test.ts +1 -1
  486. package/src/core/plan/sql-format/format-pretty-narrow.test.ts +1 -1
  487. package/src/core/plan/sql-format/format-pretty-preserve.test.ts +1 -1
  488. package/src/core/plan/sql-format/format-pretty-upper.test.ts +1 -1
  489. package/src/core/postgres-config.ts +2 -2
  490. package/src/core/sort/custom-constraints.ts +75 -1
  491. package/src/core/sort/logical-sort.ts +3 -27
  492. package/src/typedoc.ts +253 -0
  493. package/dist/core/integrations/filter/extractors.d.ts +0 -12
  494. package/dist/core/integrations/filter/extractors.js +0 -178
  495. package/src/core/integrations/filter/extractors.test.ts +0 -244
  496. package/src/core/integrations/filter/extractors.ts +0 -187
@@ -4,14 +4,13 @@
4
4
 
5
5
  import { writeFile } from "node:fs/promises";
6
6
  import { buildCommand, type CommandContext } from "@stricli/core";
7
+ import { deserializeCatalog } from "../../core/catalog.snapshot.ts";
7
8
  import type { FilterDSL } from "../../core/integrations/filter/dsl.ts";
8
- import type { ChangeFilter } from "../../core/integrations/filter/filter.types.ts";
9
9
  import type { SerializeDSL } from "../../core/integrations/serialize/dsl.ts";
10
- import type { ChangeSerializer } from "../../core/integrations/serialize/serialize.types.ts";
11
10
  import { createPlan } from "../../core/plan/index.ts";
12
11
  import type { SqlFormatOptions } from "../../core/plan/sql-format.ts";
13
12
  import { setCommandExitCode } from "../exit-code.ts";
14
- import { loadIntegrationDSL } from "../utils/integrations.ts";
13
+ import { resolveIntegrationOptions } from "../utils/integrations.ts";
15
14
  import { isPostgresUrl, loadCatalogFromFile } from "../utils/resolve-input.ts";
16
15
  import { formatPlanForDisplay } from "../utils.ts";
17
16
 
@@ -138,27 +137,22 @@ json/sql outputs are available for artifacts or piping.
138
137
  "sql-format-options"?: SqlFormatOptions;
139
138
  },
140
139
  ) {
141
- let filterOption: FilterDSL | ChangeFilter | undefined = flags.filter;
142
- let serializeOption: SerializeDSL | ChangeSerializer | undefined =
143
- flags.serialize;
144
- let integrationEmptyCatalog:
145
- | import("../../core/catalog.snapshot.ts").CatalogSnapshot
146
- | undefined;
147
- if (flags.integration) {
148
- const integrationDSL = await loadIntegrationDSL(flags.integration);
149
- filterOption = filterOption ?? integrationDSL.filter;
150
- serializeOption = serializeOption ?? integrationDSL.serialize;
151
- integrationEmptyCatalog = integrationDSL.emptyCatalog;
152
- }
140
+ const {
141
+ filter,
142
+ serialize,
143
+ emptyCatalog: integrationEmptyCatalog,
144
+ } = await resolveIntegrationOptions({
145
+ filter: flags.filter,
146
+ serialize: flags.serialize,
147
+ integration: flags.integration,
148
+ });
153
149
 
154
150
  const resolvedSource = flags.source
155
151
  ? isPostgresUrl(flags.source)
156
152
  ? flags.source
157
153
  : await loadCatalogFromFile(flags.source)
158
154
  : integrationEmptyCatalog
159
- ? (await import("../../core/catalog.snapshot.ts")).deserializeCatalog(
160
- integrationEmptyCatalog,
161
- )
155
+ ? deserializeCatalog(integrationEmptyCatalog)
162
156
  : null;
163
157
 
164
158
  const resolvedTarget = isPostgresUrl(flags.target)
@@ -167,8 +161,8 @@ json/sql outputs are available for artifacts or piping.
167
161
 
168
162
  const planResult = await createPlan(resolvedSource, resolvedTarget, {
169
163
  role: flags.role,
170
- filter: filterOption,
171
- serialize: serializeOption,
164
+ filter,
165
+ serialize,
172
166
  });
173
167
  if (!planResult) {
174
168
  this.process.stdout.write("No changes detected.\n");
@@ -4,12 +4,10 @@
4
4
 
5
5
  import { buildCommand, type CommandContext } from "@stricli/core";
6
6
  import type { FilterDSL } from "../../core/integrations/filter/dsl.ts";
7
- import type { ChangeFilter } from "../../core/integrations/filter/filter.types.ts";
8
7
  import type { SerializeDSL } from "../../core/integrations/serialize/dsl.ts";
9
- import type { ChangeSerializer } from "../../core/integrations/serialize/serialize.types.ts";
10
8
  import { applyPlan } from "../../core/plan/apply.ts";
11
9
  import { createPlan } from "../../core/plan/index.ts";
12
- import { loadIntegrationDSL } from "../utils/integrations.ts";
10
+ import { resolveIntegrationOptions } from "../utils/integrations.ts";
13
11
  import {
14
12
  formatPlanForDisplay,
15
13
  handleApplyResult,
@@ -120,22 +118,17 @@ Exit codes:
120
118
  integration?: string;
121
119
  },
122
120
  ) {
123
- // Load integration if provided and extract filter/serialize DSL
124
- let filterOption: FilterDSL | ChangeFilter | undefined = flags.filter;
125
- let serializeOption: SerializeDSL | ChangeSerializer | undefined =
126
- flags.serialize;
127
- if (flags.integration) {
128
- const integrationDSL = await loadIntegrationDSL(flags.integration);
129
- // Use integration DSL if explicit flags not provided
130
- filterOption = filterOption ?? integrationDSL.filter;
131
- serializeOption = serializeOption ?? integrationDSL.serialize;
132
- }
121
+ const { filter, serialize } = await resolveIntegrationOptions({
122
+ filter: flags.filter,
123
+ serialize: flags.serialize,
124
+ integration: flags.integration,
125
+ });
133
126
 
134
127
  // 1. Create the plan
135
128
  const planResult = await createPlan(flags.source, flags.target, {
136
129
  role: flags.role,
137
- filter: filterOption,
138
- serialize: serializeOption,
130
+ filter,
131
+ serialize,
139
132
  });
140
133
  if (!planResult) {
141
134
  this.process.stdout.write("No changes detected.\n");
@@ -2,7 +2,12 @@ import { describe, expect, test } from "bun:test";
2
2
  import { mkdtemp, rm, writeFile } from "node:fs/promises";
3
3
  import { tmpdir } from "node:os";
4
4
  import path from "node:path";
5
- import { loadIntegrationDSL } from "./integrations.ts";
5
+ import type { FilterDSL } from "../../core/integrations/filter/dsl.ts";
6
+ import type { SerializeDSL } from "../../core/integrations/serialize/dsl.ts";
7
+ import {
8
+ loadIntegrationDSL,
9
+ resolveIntegrationOptions,
10
+ } from "./integrations.ts";
6
11
 
7
12
  describe("loadIntegrationDSL", () => {
8
13
  test("loads from .json file path", async () => {
@@ -12,12 +17,12 @@ describe("loadIntegrationDSL", () => {
12
17
  await writeFile(
13
18
  jsonPath,
14
19
  JSON.stringify({
15
- filter: { schema: "app" },
20
+ filter: { "*/schema": "app" },
16
21
  }),
17
22
  );
18
23
  const dsl = await loadIntegrationDSL(jsonPath);
19
24
  expect(dsl).toBeDefined();
20
- expect(dsl.filter).toEqual({ schema: "app" });
25
+ expect(dsl.filter).toEqual({ "*/schema": "app" });
21
26
  } finally {
22
27
  await rm(dir, { recursive: true, force: true });
23
28
  }
@@ -42,3 +47,205 @@ describe("loadIntegrationDSL", () => {
42
47
  }
43
48
  });
44
49
  });
50
+
51
+ describe("extends resolution", () => {
52
+ test('extends: "supabase" → resolves and merges successfully', async () => {
53
+ const dir = await mkdtemp(path.join(tmpdir(), "pgd-extends-"));
54
+ const jsonPath = path.join(dir, "custom.json");
55
+ try {
56
+ await writeFile(
57
+ jsonPath,
58
+ JSON.stringify({
59
+ extends: "supabase",
60
+ serialize: [
61
+ {
62
+ when: { objectType: "table" },
63
+ options: { skipAuthorization: true },
64
+ },
65
+ ],
66
+ }),
67
+ );
68
+ const dsl = await loadIntegrationDSL(jsonPath);
69
+ expect(dsl).toBeDefined();
70
+ // Should have the supabase filter merged in
71
+ expect(dsl.filter).toBeDefined();
72
+ // Should have both supabase serialize rules and our custom one
73
+ expect(dsl.serialize).toBeDefined();
74
+ expect(dsl.serialize?.length).toBeGreaterThan(1);
75
+ } finally {
76
+ await rm(dir, { recursive: true, force: true });
77
+ }
78
+ });
79
+
80
+ test('extends: "./some-file.json" → throws error about core integrations only', async () => {
81
+ const dir = await mkdtemp(path.join(tmpdir(), "pgd-extends-"));
82
+ const filePath = path.join(dir, "child.json");
83
+ const parentPath = path.join(dir, "parent.json");
84
+ try {
85
+ await writeFile(
86
+ parentPath,
87
+ JSON.stringify({ filter: { "*/schema": "app" } }),
88
+ );
89
+ await writeFile(
90
+ filePath,
91
+ JSON.stringify({
92
+ extends: parentPath,
93
+ filter: { "*/schema": "public" },
94
+ }),
95
+ );
96
+ expect(loadIntegrationDSL(filePath)).rejects.toThrow(
97
+ /extends only supports core integration names/,
98
+ );
99
+ } finally {
100
+ await rm(dir, { recursive: true, force: true });
101
+ }
102
+ });
103
+
104
+ test('extends: "nonexistent" → throws error about unknown core integration', async () => {
105
+ const dir = await mkdtemp(path.join(tmpdir(), "pgd-extends-"));
106
+ const jsonPath = path.join(dir, "custom.json");
107
+ try {
108
+ await writeFile(jsonPath, JSON.stringify({ extends: "nonexistent" }));
109
+ expect(loadIntegrationDSL(jsonPath)).rejects.toThrow(
110
+ /Unknown core integration: "nonexistent"/,
111
+ );
112
+ } finally {
113
+ await rm(dir, { recursive: true, force: true });
114
+ }
115
+ });
116
+ });
117
+
118
+ describe("resolveIntegrationOptions", () => {
119
+ test("no integration, no CLI flags → all undefined", async () => {
120
+ const result = await resolveIntegrationOptions({});
121
+ expect(result).toEqual({
122
+ filter: undefined,
123
+ serialize: undefined,
124
+ });
125
+ });
126
+
127
+ test("CLI flags only → passed through unchanged", async () => {
128
+ const filter: FilterDSL = { "*/schema": "public" };
129
+ const serialize: SerializeDSL = [
130
+ { when: { objectType: "schema" }, options: { skipAuthorization: true } },
131
+ ];
132
+ const result = await resolveIntegrationOptions({ filter, serialize });
133
+ expect(result.filter).toEqual(filter);
134
+ expect(result.serialize).toEqual(serialize);
135
+ expect(result.emptyCatalog).toBeUndefined();
136
+ });
137
+
138
+ test("integration only → integration values returned", async () => {
139
+ const dir = await mkdtemp(path.join(tmpdir(), "pgd-resolve-"));
140
+ const jsonPath = path.join(dir, "int.json");
141
+ try {
142
+ await writeFile(
143
+ jsonPath,
144
+ JSON.stringify({
145
+ filter: { "*/schema": "app" },
146
+ serialize: [{ when: { objectType: "table" }, options: {} }],
147
+ }),
148
+ );
149
+ const result = await resolveIntegrationOptions({
150
+ integration: jsonPath,
151
+ });
152
+ expect(result.filter).toEqual({ "*/schema": "app" });
153
+ expect(result.serialize).toEqual([
154
+ { when: { objectType: "table" }, options: {} },
155
+ ]);
156
+ } finally {
157
+ await rm(dir, { recursive: true, force: true });
158
+ }
159
+ });
160
+
161
+ test("both filter + integration filter → AND-combined", async () => {
162
+ const dir = await mkdtemp(path.join(tmpdir(), "pgd-resolve-"));
163
+ const jsonPath = path.join(dir, "int.json");
164
+ try {
165
+ await writeFile(
166
+ jsonPath,
167
+ JSON.stringify({
168
+ filter: { "*/schema": "app" },
169
+ }),
170
+ );
171
+ const cliFilter: FilterDSL = { objectType: "table" };
172
+ const result = await resolveIntegrationOptions({
173
+ filter: cliFilter,
174
+ integration: jsonPath,
175
+ });
176
+ expect(result.filter).toEqual({
177
+ and: [{ "*/schema": "app" }, { objectType: "table" }],
178
+ });
179
+ } finally {
180
+ await rm(dir, { recursive: true, force: true });
181
+ }
182
+ });
183
+
184
+ test("both serialize + integration serialize → concatenated (integration first)", async () => {
185
+ const dir = await mkdtemp(path.join(tmpdir(), "pgd-resolve-"));
186
+ const jsonPath = path.join(dir, "int.json");
187
+ try {
188
+ const intSerialize: SerializeDSL = [
189
+ {
190
+ when: { objectType: "schema" },
191
+ options: { skipAuthorization: true },
192
+ },
193
+ ];
194
+ const cliSerialize: SerializeDSL = [
195
+ { when: { objectType: "table" }, options: {} },
196
+ ];
197
+ await writeFile(jsonPath, JSON.stringify({ serialize: intSerialize }));
198
+ const result = await resolveIntegrationOptions({
199
+ serialize: cliSerialize,
200
+ integration: jsonPath,
201
+ });
202
+ expect(result.serialize).toEqual([...intSerialize, ...cliSerialize]);
203
+ } finally {
204
+ await rm(dir, { recursive: true, force: true });
205
+ }
206
+ });
207
+
208
+ test("emptyCatalog returned from integration", async () => {
209
+ const dir = await mkdtemp(path.join(tmpdir(), "pgd-resolve-"));
210
+ const jsonPath = path.join(dir, "int.json");
211
+ try {
212
+ const emptyCatalog = {
213
+ version: 1,
214
+ currentUser: "postgres",
215
+ aggregates: {},
216
+ collations: {},
217
+ compositeTypes: {},
218
+ domains: {},
219
+ enums: {},
220
+ extensions: {},
221
+ procedures: {},
222
+ indexes: {},
223
+ materializedViews: {},
224
+ subscriptions: {},
225
+ publications: {},
226
+ rlsPolicies: {},
227
+ roles: {},
228
+ schemas: {},
229
+ sequences: {},
230
+ tables: {},
231
+ triggers: {},
232
+ eventTriggers: {},
233
+ rules: {},
234
+ ranges: {},
235
+ views: {},
236
+ foreignDataWrappers: {},
237
+ servers: {},
238
+ userMappings: {},
239
+ foreignTables: {},
240
+ depends: [],
241
+ };
242
+ await writeFile(jsonPath, JSON.stringify({ emptyCatalog }));
243
+ const result = await resolveIntegrationOptions({
244
+ integration: jsonPath,
245
+ });
246
+ expect(result.emptyCatalog).toEqual(emptyCatalog);
247
+ } finally {
248
+ await rm(dir, { recursive: true, force: true });
249
+ }
250
+ });
251
+ });
@@ -3,18 +3,19 @@
3
3
  */
4
4
 
5
5
  import { readFile } from "node:fs/promises";
6
+ import type { CatalogSnapshot } from "../../core/catalog.snapshot.ts";
7
+ import type { FilterDSL } from "../../core/integrations/filter/dsl.ts";
6
8
  import type { IntegrationDSL } from "../../core/integrations/integration-dsl.ts";
9
+ import { mergeIntegrations } from "../../core/integrations/merge.ts";
10
+ import type { SerializeDSL } from "../../core/integrations/serialize/dsl.ts";
7
11
 
8
12
  /**
9
- * Load an integration DSL from a file or core integration.
10
- * If the path ends with .json, treats it as a JSON file path directly.
11
- * Otherwise, tries to load from core integrations (TypeScript) first,
12
- * then falls back to treating as a JSON file path.
13
+ * Load a raw integration DSL from a file or core integration (without resolving extends).
13
14
  *
14
15
  * @param nameOrPath - Integration name (e.g., "supabase") or file path (e.g., "./my-integration.json")
15
- * @returns The loaded IntegrationDSL
16
+ * @returns The loaded IntegrationDSL (unresolved)
16
17
  */
17
- export async function loadIntegrationDSL(
18
+ async function loadRawIntegrationDSL(
18
19
  nameOrPath: string,
19
20
  ): Promise<IntegrationDSL> {
20
21
  // If path ends with .json, treat it as a JSON file path directly
@@ -40,3 +41,130 @@ export async function loadIntegrationDSL(
40
41
  const content = await readFile(nameOrPath, "utf-8");
41
42
  return JSON.parse(content) as IntegrationDSL;
42
43
  }
44
+
45
+ /**
46
+ * Load a core integration DSL by name only (no file path fallback).
47
+ *
48
+ * Used for resolving `extends` chains, which only support core integration names
49
+ * (e.g., "supabase"), not file paths.
50
+ *
51
+ * @param name - Core integration name (e.g., "supabase")
52
+ * @returns The loaded IntegrationDSL (unresolved)
53
+ */
54
+ async function loadCoreIntegrationDSL(name: string): Promise<IntegrationDSL> {
55
+ try {
56
+ const module = await import(`../../core/integrations/${name}.ts`);
57
+ if (name in module) {
58
+ return module[name] as IntegrationDSL;
59
+ }
60
+ } catch {
61
+ // Module not found
62
+ }
63
+ throw new Error(
64
+ `Unknown core integration: "${name}". extends only supports core integration names (e.g., "supabase").`,
65
+ );
66
+ }
67
+
68
+ /**
69
+ * Load an integration DSL, recursively resolving `extends` chains.
70
+ *
71
+ * When an integration has `extends`, the referenced integration(s) are loaded
72
+ * and merged: filters are AND-combined, serialize rules concatenated (base first),
73
+ * and emptyCatalog uses the most-specific value.
74
+ *
75
+ * Circular extends are detected and rejected with a descriptive error.
76
+ *
77
+ * @param nameOrPath - Integration name (e.g., "supabase") or file path
78
+ * @returns The fully resolved IntegrationDSL
79
+ */
80
+ export async function loadIntegrationDSL(
81
+ nameOrPath: string,
82
+ ): Promise<IntegrationDSL> {
83
+ return resolveIntegration(nameOrPath, new Set());
84
+ }
85
+
86
+ async function resolveIntegration(
87
+ nameOrPath: string,
88
+ visited: Set<string>,
89
+ preloadedRaw?: IntegrationDSL,
90
+ ): Promise<IntegrationDSL> {
91
+ if (visited.has(nameOrPath)) {
92
+ throw new Error(
93
+ `Circular extends detected: ${[...visited, nameOrPath].join(" → ")}`,
94
+ );
95
+ }
96
+ visited.add(nameOrPath);
97
+
98
+ const raw = preloadedRaw ?? (await loadRawIntegrationDSL(nameOrPath));
99
+
100
+ if (!raw.extends) {
101
+ return raw;
102
+ }
103
+
104
+ // Resolve base integrations (extends only supports core integration names)
105
+ const extendsArray = Array.isArray(raw.extends) ? raw.extends : [raw.extends];
106
+
107
+ const baseIntegrations: IntegrationDSL[] = [];
108
+ for (const baseName of extendsArray) {
109
+ const baseRaw = await loadCoreIntegrationDSL(baseName);
110
+ baseIntegrations.push(
111
+ await resolveIntegration(baseName, new Set(visited), baseRaw),
112
+ );
113
+ }
114
+
115
+ // Remove extends from the current integration before merging
116
+ const { extends: _, ...current } = raw;
117
+
118
+ // Merge: bases first (higher priority serialize), then current (most-specific)
119
+ return mergeIntegrations([...baseIntegrations, current]);
120
+ }
121
+
122
+ interface ResolvedIntegrationOptions {
123
+ filter?: FilterDSL;
124
+ serialize?: SerializeDSL;
125
+ emptyCatalog?: CatalogSnapshot;
126
+ }
127
+
128
+ /**
129
+ * Load an integration (if provided) and merge its filter/serialize with CLI flags.
130
+ *
131
+ * - Filters are AND-combined (integration ∧ CLI flag)
132
+ * - Serialize rules are concatenated (integration first = higher priority)
133
+ * - emptyCatalog is extracted from the integration
134
+ */
135
+ export async function resolveIntegrationOptions(options: {
136
+ filter?: FilterDSL;
137
+ serialize?: SerializeDSL;
138
+ integration?: string;
139
+ }): Promise<ResolvedIntegrationOptions> {
140
+ if (!options.integration) {
141
+ return {
142
+ filter: options.filter,
143
+ serialize: options.serialize,
144
+ };
145
+ }
146
+
147
+ const integrationDSL = await loadIntegrationDSL(options.integration);
148
+
149
+ // AND-combine integration filter with CLI --filter
150
+ let filter: FilterDSL | undefined;
151
+ if (integrationDSL.filter && options.filter) {
152
+ filter = { and: [integrationDSL.filter, options.filter] };
153
+ } else {
154
+ filter = options.filter ?? integrationDSL.filter;
155
+ }
156
+
157
+ // Concatenate serialize rules (integration first = higher priority)
158
+ let serialize: SerializeDSL | undefined;
159
+ if (integrationDSL.serialize && options.serialize) {
160
+ serialize = [...integrationDSL.serialize, ...options.serialize];
161
+ } else {
162
+ serialize = options.serialize ?? integrationDSL.serialize;
163
+ }
164
+
165
+ return {
166
+ filter,
167
+ serialize,
168
+ emptyCatalog: integrationDSL.emptyCatalog,
169
+ };
170
+ }
@@ -452,7 +452,11 @@ describe("catalog snapshot serde", () => {
452
452
 
453
453
  // Filter out auth schema (no cascade): procedure is excluded but policy stays
454
454
  const resultNoCascade = await createPlan(null, target, {
455
- filter: { not: { schema: ["auth"] } },
455
+ filter: {
456
+ not: {
457
+ or: [{ "*/schema": ["auth"] }, { "schema/name": ["auth"] }],
458
+ },
459
+ },
456
460
  });
457
461
  expect(resultNoCascade).not.toBeNull();
458
462
  if (resultNoCascade) {
@@ -464,7 +468,12 @@ describe("catalog snapshot serde", () => {
464
468
 
465
469
  // Filter out auth schema with cascade: true: policy is also excluded (depends on auth.uid())
466
470
  const resultCascade = await createPlan(null, target, {
467
- filter: { not: { schema: ["auth"] }, cascade: true },
471
+ filter: {
472
+ not: {
473
+ or: [{ "*/schema": ["auth"] }, { "schema/name": ["auth"] }],
474
+ },
475
+ cascade: true,
476
+ },
468
477
  });
469
478
  expect(resultCascade).not.toBeNull();
470
479
  if (resultCascade) {
@@ -0,0 +1,61 @@
1
+ import { describe, expect, test } from "bun:test";
2
+ import type { Change } from "./change.types.ts";
3
+ import { getSchema } from "./change-utils.ts";
4
+
5
+ describe("getSchema", () => {
6
+ test("returns schema for table", () => {
7
+ const change = {
8
+ objectType: "table",
9
+ table: { schema: "public" },
10
+ } as unknown as Change;
11
+ expect(getSchema(change)).toBe("public");
12
+ });
13
+
14
+ test("returns schema for view", () => {
15
+ const change = {
16
+ objectType: "view",
17
+ view: { schema: "app" },
18
+ } as unknown as Change;
19
+ expect(getSchema(change)).toBe("app");
20
+ });
21
+
22
+ test("returns schema for enum", () => {
23
+ const change = {
24
+ objectType: "enum",
25
+ enum: { schema: "types" },
26
+ } as unknown as Change;
27
+ expect(getSchema(change)).toBe("types");
28
+ });
29
+
30
+ test("returns schema.name for schema type", () => {
31
+ const change = {
32
+ objectType: "schema",
33
+ schema: { name: "auth" },
34
+ } as unknown as Change;
35
+ expect(getSchema(change)).toBe("auth");
36
+ });
37
+
38
+ test("returns null for role", () => {
39
+ const change = {
40
+ objectType: "role",
41
+ role: { name: "admin" },
42
+ } as unknown as Change;
43
+ expect(getSchema(change)).toBeNull();
44
+ });
45
+
46
+ test("returns null for publication", () => {
47
+ const change = {
48
+ objectType: "publication",
49
+ publication: { name: "pub1" },
50
+ } as unknown as Change;
51
+ expect(getSchema(change)).toBeNull();
52
+ });
53
+
54
+ test("returns null for language", () => {
55
+ const change = {
56
+ objectType: "language",
57
+ language: { name: "plpgsql" },
58
+ } as unknown as Change;
59
+ expect(getSchema(change)).toBeNull();
60
+ });
61
+ });
@@ -0,0 +1,73 @@
1
+ import type { Change } from "./change.types.ts";
2
+
3
+ /**
4
+ * Extract the schema name from a Change using the model sub-object.
5
+ *
6
+ * This is a convenience function used by the filter DSL (for schema
7
+ * normalization) and the sort module. It reads the `schema` (or `name`
8
+ * for schema objectType) from the model sub-object.
9
+ */
10
+ export function getSchema(change: Change): string | null {
11
+ if (change.scope === "default_privilege") {
12
+ return change.inSchema;
13
+ }
14
+ switch (change.objectType) {
15
+ case "aggregate":
16
+ return change.aggregate.schema;
17
+ case "collation":
18
+ return change.collation.schema;
19
+ case "composite_type":
20
+ return change.compositeType.schema;
21
+ case "domain":
22
+ return change.domain.schema;
23
+ case "enum":
24
+ return change.enum.schema;
25
+ case "event_trigger":
26
+ return change.eventTrigger.function_schema;
27
+ case "extension":
28
+ return change.extension.schema;
29
+ case "index":
30
+ return change.index.schema;
31
+ case "language":
32
+ return null;
33
+ case "materialized_view":
34
+ return change.materializedView.schema;
35
+ case "procedure":
36
+ return change.procedure.schema;
37
+ case "publication":
38
+ return null;
39
+ case "range":
40
+ return change.range.schema;
41
+ case "rls_policy":
42
+ return change.policy.schema;
43
+ case "role":
44
+ return null;
45
+ case "rule":
46
+ return change.rule.schema;
47
+ case "schema":
48
+ return change.schema.name;
49
+ case "sequence":
50
+ return change.sequence.schema;
51
+ case "subscription":
52
+ return null;
53
+ case "table":
54
+ return change.table.schema;
55
+ case "trigger":
56
+ return change.trigger.schema;
57
+ case "view":
58
+ return change.view.schema;
59
+ case "foreign_data_wrapper":
60
+ return null;
61
+ case "server":
62
+ return null;
63
+ case "user_mapping":
64
+ return null;
65
+ case "foreign_table":
66
+ return change.foreignTable.schema;
67
+ default: {
68
+ // exhaustiveness check
69
+ const _exhaustive: never = change;
70
+ return _exhaustive;
71
+ }
72
+ }
73
+ }