@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
@@ -0,0 +1,282 @@
1
+ import { describe, expect, test } from "bun:test";
2
+ import type { Change } from "../../change.types.ts";
3
+ import { compileWildcard, flattenChange } from "./flatten.ts";
4
+
5
+ describe("flattenChange", () => {
6
+ test("flattens top-level scalar properties", () => {
7
+ const change = {
8
+ objectType: "table",
9
+ operation: "create",
10
+ scope: "object",
11
+ table: { schema: "public", name: "users" },
12
+ requires: ["schema:public"],
13
+ creates: ["table:public.users"],
14
+ } as unknown as Change;
15
+
16
+ const flat = flattenChange(change);
17
+ expect(flat.objectType).toBe("table");
18
+ expect(flat.operation).toBe("create");
19
+ expect(flat.scope).toBe("object");
20
+ });
21
+
22
+ test("flattens array properties", () => {
23
+ const change = {
24
+ objectType: "table",
25
+ operation: "create",
26
+ scope: "object",
27
+ table: { schema: "public", name: "users" },
28
+ requires: ["schema:public", "role:postgres"],
29
+ creates: ["table:public.users"],
30
+ } as unknown as Change;
31
+
32
+ const flat = flattenChange(change);
33
+ expect(flat.requires).toEqual(["schema:public", "role:postgres"]);
34
+ expect(flat.creates).toEqual(["table:public.users"]);
35
+ });
36
+
37
+ test("flattens model sub-object properties with objectType prefix", () => {
38
+ const change = {
39
+ objectType: "table",
40
+ operation: "create",
41
+ scope: "object",
42
+ table: {
43
+ schema: "public",
44
+ name: "users",
45
+ owner: "postgres",
46
+ is_partition: false,
47
+ persistence: "p",
48
+ },
49
+ requires: [],
50
+ } as unknown as Change;
51
+
52
+ const flat = flattenChange(change);
53
+ expect(flat["table/schema"]).toBe("public");
54
+ expect(flat["table/name"]).toBe("users");
55
+ expect(flat["table/owner"]).toBe("postgres");
56
+ expect(flat["table/is_partition"]).toBe(false);
57
+ expect(flat["table/persistence"]).toBe("p");
58
+ });
59
+
60
+ test("includes member when present", () => {
61
+ const change = {
62
+ objectType: "role",
63
+ operation: "create",
64
+ scope: "membership",
65
+ member: "app_user",
66
+ role: { name: "admin" },
67
+ requires: [],
68
+ } as unknown as Change;
69
+
70
+ const flat = flattenChange(change);
71
+ expect(flat.member).toBe("app_user");
72
+ });
73
+
74
+ test("includes grantee when present", () => {
75
+ const change = {
76
+ objectType: "table",
77
+ operation: "create",
78
+ scope: "privilege",
79
+ grantee: "reader",
80
+ table: { schema: "public", name: "users" },
81
+ requires: [],
82
+ } as unknown as Change;
83
+
84
+ const flat = flattenChange(change);
85
+ expect(flat.grantee).toBe("reader");
86
+ });
87
+
88
+ test("skips nested objects", () => {
89
+ const change = {
90
+ objectType: "table",
91
+ operation: "create",
92
+ scope: "object",
93
+ table: {
94
+ schema: "public",
95
+ name: "users",
96
+ columns: [{ name: "id", type: "integer" }],
97
+ constraints: { pk: { type: "primary_key" } },
98
+ },
99
+ requires: [],
100
+ } as unknown as Change;
101
+
102
+ const flat = flattenChange(change);
103
+ expect(flat["table/columns"]).toBeUndefined();
104
+ expect(flat["table/constraints"]).toBeUndefined();
105
+ });
106
+
107
+ test("handles null model property values", () => {
108
+ const change = {
109
+ objectType: "procedure",
110
+ operation: "create",
111
+ scope: "object",
112
+ procedure: {
113
+ schema: "public",
114
+ name: "my_func",
115
+ binary_path: null,
116
+ language: "plpgsql",
117
+ },
118
+ requires: [],
119
+ } as unknown as Change;
120
+
121
+ const flat = flattenChange(change);
122
+ expect(flat["procedure/binary_path"]).toBeNull();
123
+ expect(flat["procedure/language"]).toBe("plpgsql");
124
+ });
125
+
126
+ test("defaults requires/creates/drops to empty arrays", () => {
127
+ const change = {
128
+ objectType: "role",
129
+ operation: "create",
130
+ scope: "object",
131
+ role: { name: "admin" },
132
+ } as unknown as Change;
133
+
134
+ const flat = flattenChange(change);
135
+ expect(flat.requires).toEqual([]);
136
+ expect(flat.creates).toEqual([]);
137
+ expect(flat.drops).toEqual([]);
138
+ });
139
+
140
+ test("normalizes schema/schema for schema changes", () => {
141
+ const change = {
142
+ objectType: "schema",
143
+ operation: "create",
144
+ scope: "object",
145
+ schema: { name: "auth" },
146
+ requires: [],
147
+ } as unknown as Change;
148
+
149
+ const flat = flattenChange(change);
150
+ expect(flat["schema/name"]).toBe("auth");
151
+ expect(flat["schema/schema"]).toBe("auth");
152
+ });
153
+
154
+ test("normalizes event_trigger/schema from function_schema", () => {
155
+ const change = {
156
+ objectType: "event_trigger",
157
+ operation: "create",
158
+ scope: "object",
159
+ eventTrigger: {
160
+ name: "my_trigger",
161
+ function_schema: "public",
162
+ function_name: "my_func",
163
+ },
164
+ requires: [],
165
+ } as unknown as Change;
166
+
167
+ const flat = flattenChange(change);
168
+ expect(flat["event_trigger/function_schema"]).toBe("public");
169
+ expect(flat["event_trigger/schema"]).toBe("public");
170
+ });
171
+
172
+ test("flattens rls_policy model properties (camelCase mapping)", () => {
173
+ const change = {
174
+ objectType: "rls_policy",
175
+ operation: "create",
176
+ scope: "object",
177
+ policy: { schema: "public", table: "users", name: "select_policy" },
178
+ requires: [],
179
+ } as unknown as Change;
180
+
181
+ const flat = flattenChange(change);
182
+ expect(flat["rls_policy/schema"]).toBe("public");
183
+ expect(flat["rls_policy/table"]).toBe("users");
184
+ expect(flat["rls_policy/name"]).toBe("select_policy");
185
+ });
186
+
187
+ test("flattens all top-level scalar properties systematically", () => {
188
+ const change = {
189
+ objectType: "role",
190
+ operation: "create",
191
+ scope: "membership",
192
+ member: "app_user",
193
+ role: { name: "admin" },
194
+ requires: [],
195
+ } as unknown as Change;
196
+
197
+ const flat = flattenChange(change);
198
+ expect(flat.member).toBe("app_user");
199
+ });
200
+
201
+ test("flattens inSchema for default_privilege changes", () => {
202
+ const change = {
203
+ objectType: "role",
204
+ operation: "create",
205
+ scope: "default_privilege",
206
+ inSchema: "public",
207
+ objtype: "table",
208
+ role: { name: "admin" },
209
+ requires: [],
210
+ } as unknown as Change;
211
+
212
+ const flat = flattenChange(change);
213
+ expect(flat.inSchema).toBe("public");
214
+ expect(flat.objtype).toBe("table");
215
+ expect(flat["role/schema"]).toBe("public");
216
+ });
217
+
218
+ test("caches results (returns same reference)", () => {
219
+ const change = {
220
+ objectType: "table",
221
+ operation: "create",
222
+ scope: "object",
223
+ table: { schema: "public", name: "t" },
224
+ requires: [],
225
+ } as unknown as Change;
226
+
227
+ const flat1 = flattenChange(change);
228
+ const flat2 = flattenChange(change);
229
+ expect(flat1).toBe(flat2);
230
+ });
231
+ });
232
+
233
+ describe("compileWildcard", () => {
234
+ test("exact match on bare key", () => {
235
+ const matcher = compileWildcard("objectType");
236
+ expect(matcher("objectType")).toBe(true);
237
+ expect(matcher("operation")).toBe(false);
238
+ expect(matcher("table/objectType")).toBe(false);
239
+ });
240
+
241
+ test("exact match on path key", () => {
242
+ const matcher = compileWildcard("table/schema");
243
+ expect(matcher("table/schema")).toBe(true);
244
+ expect(matcher("view/schema")).toBe(false);
245
+ expect(matcher("table/name")).toBe(false);
246
+ });
247
+
248
+ test("wildcard matches any single segment", () => {
249
+ const matcher = compileWildcard("*/schema");
250
+ expect(matcher("table/schema")).toBe(true);
251
+ expect(matcher("view/schema")).toBe(true);
252
+ expect(matcher("aggregate/schema")).toBe(true);
253
+ expect(matcher("schema")).toBe(false);
254
+ expect(matcher("a/b/schema")).toBe(false);
255
+ });
256
+
257
+ test("does not match different segment count", () => {
258
+ const matcher = compileWildcard("*/schema");
259
+ expect(matcher("objectType")).toBe(false);
260
+ });
261
+
262
+ test("brace expansion matches multiple alternatives", () => {
263
+ const matcher = compileWildcard("{table,view}/schema");
264
+ expect(matcher("table/schema")).toBe(true);
265
+ expect(matcher("view/schema")).toBe(true);
266
+ expect(matcher("role/schema")).toBe(false);
267
+ });
268
+
269
+ test("partial wildcard matches prefix", () => {
270
+ const matcher = compileWildcard("table/is_*");
271
+ expect(matcher("table/is_partition")).toBe(true);
272
+ expect(matcher("table/is_typed")).toBe(true);
273
+ expect(matcher("table/name")).toBe(false);
274
+ });
275
+
276
+ test("extglob negation excludes specific segment", () => {
277
+ const matcher = compileWildcard("!(role)/schema");
278
+ expect(matcher("table/schema")).toBe(true);
279
+ expect(matcher("view/schema")).toBe(true);
280
+ expect(matcher("role/schema")).toBe(false);
281
+ });
282
+ });
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Change flattening and wildcard path matching for the filter DSL.
3
+ *
4
+ * Each Change is flattened into a Record<string, FlatValue> where top-level
5
+ * scalar properties become bare keys and model sub-object properties become
6
+ * `<objectType>/<field>` paths. Wildcard patterns (e.g. `* /schema`) match
7
+ * against these flat paths.
8
+ */
9
+
10
+ import picomatch from "picomatch";
11
+ import type { Change } from "../../change.types.ts";
12
+ import { OBJECT_TYPE_TO_PROPERTY_KEY } from "../../change.types.ts";
13
+ import { getSchema } from "../../change-utils.ts";
14
+
15
+ /**
16
+ * A flat value extracted from a Change: scalar types or arrays of scalars.
17
+ *
18
+ * The filter DSL flattens every {@link Change} into a
19
+ * `Record<string, FlatValue>` before pattern matching. Only these primitive
20
+ * types survive the flattening step; nested objects are expanded into
21
+ * `<objectType>/<field>` paths.
22
+ *
23
+ * @category Filter DSL
24
+ */
25
+ export type FlatValue =
26
+ | string
27
+ | number
28
+ | boolean
29
+ | null
30
+ | Array<string | number>;
31
+
32
+ /**
33
+ * WeakMap cache to avoid re-flattening the same Change instance.
34
+ */
35
+ const flattenCache = new WeakMap<Change, Record<string, FlatValue>>();
36
+
37
+ /**
38
+ * Convert an unknown value to a FlatValue if it's a supported type.
39
+ *
40
+ * Supported types (kept in the flat record):
41
+ * - null / undefined → null (missing or explicitly null)
42
+ * - string, number, boolean → as-is
43
+ * - Array where every element is string or number → as-is
44
+ *
45
+ * Anything else (nested objects, arrays of objects, functions, …) is NOT
46
+ * representable as a flat value, so we return `undefined` to signal
47
+ * "skip this entry".
48
+ */
49
+ function toFlatValue(value: unknown): FlatValue | undefined {
50
+ if (value === null || value === undefined) return null;
51
+ if (
52
+ typeof value === "string" ||
53
+ typeof value === "number" ||
54
+ typeof value === "boolean"
55
+ )
56
+ return value;
57
+ if (
58
+ Array.isArray(value) &&
59
+ value.every((v: unknown) => typeof v === "string" || typeof v === "number")
60
+ ) {
61
+ return value as Array<string | number>;
62
+ }
63
+ return undefined;
64
+ }
65
+
66
+ /**
67
+ * Flatten a Change into a Record<string, FlatValue>.
68
+ *
69
+ * A Change object has two kinds of properties:
70
+ *
71
+ * 1. **Top-level properties** — scalars and arrays directly on the object.
72
+ * These become bare keys in the flat record.
73
+ *
74
+ * 2. **Model sub-object** — a single nested object whose JS property name is
75
+ * given by OBJECT_TYPE_TO_PROPERTY_KEY. Its scalar fields are flattened
76
+ * with an `<objectType>/` prefix.
77
+ *
78
+ * After the main loop, a schema normalization step ensures that
79
+ * `<objectType>/schema` exists for every change that logically belongs to
80
+ * a schema — even when the model stores the schema under a different name.
81
+ *
82
+ * Results are cached per Change instance (WeakMap) so repeated calls are free.
83
+ */
84
+ export function flattenChange(change: Change): Record<string, FlatValue> {
85
+ const cached = flattenCache.get(change);
86
+ if (cached) return cached;
87
+
88
+ const flat: Record<string, FlatValue> = {};
89
+
90
+ const modelKey = OBJECT_TYPE_TO_PROPERTY_KEY[change.objectType];
91
+ const prefix = change.objectType;
92
+
93
+ for (const [key, value] of Object.entries(change)) {
94
+ if (
95
+ key === modelKey &&
96
+ value &&
97
+ typeof value === "object" &&
98
+ !Array.isArray(value)
99
+ ) {
100
+ for (const [subKey, subValue] of Object.entries(
101
+ value as Record<string, unknown>,
102
+ )) {
103
+ const flatVal = toFlatValue(subValue);
104
+ if (flatVal !== undefined) {
105
+ flat[`${prefix}/${subKey}`] = flatVal;
106
+ }
107
+ }
108
+ } else {
109
+ const flatVal = toFlatValue(value);
110
+ if (flatVal !== undefined) {
111
+ flat[key] = flatVal;
112
+ }
113
+ }
114
+ }
115
+
116
+ // requires/creates/drops are prototype getters (not own properties),
117
+ // so Object.entries() above won't see them. Access them explicitly.
118
+ flat.requires = change.requires ?? [];
119
+ flat.creates = change.creates ?? [];
120
+ flat.drops = change.drops ?? [];
121
+
122
+ // Schema normalization: ensure <objectType>/schema exists for all changes
123
+ // that have a schema. Handles: schema objects (name→schema), event triggers
124
+ // (function_schema→schema), default_privilege scope (inSchema→schema).
125
+ const schemaKey = `${prefix}/schema`;
126
+ if (!(schemaKey in flat)) {
127
+ const schemaValue = getSchema(change);
128
+ if (schemaValue !== null) {
129
+ flat[schemaKey] = schemaValue;
130
+ }
131
+ }
132
+
133
+ flattenCache.set(change, flat);
134
+ return flat;
135
+ }
136
+
137
+ /**
138
+ * Compile a glob pattern string into a matcher function.
139
+ *
140
+ * Uses picomatch for full glob support:
141
+ * - `objectType` matches only `objectType`
142
+ * - `table/schema` matches only `table/schema`
143
+ * - `* /schema` matches `table/schema`, `view/schema`, etc.
144
+ * - `{table,view}/schema` matches `table/schema` and `view/schema`
145
+ * - `table/is_*` matches `table/is_partition`, `table/is_typed`, etc.
146
+ * - `!(role)/schema` matches any objectType's schema except `role`
147
+ */
148
+ export function compileWildcard(pattern: string): (path: string) => boolean {
149
+ return picomatch(pattern, { dot: true });
150
+ }
@@ -9,9 +9,25 @@ import type { FilterDSL } from "./filter/dsl.ts";
9
9
  import type { SerializeDSL } from "./serialize/dsl.ts";
10
10
 
11
11
  /**
12
- * Integration DSL - serializable representation of an integration.
12
+ * Serializable representation of a pg-delta integration.
13
+ *
14
+ * An integration combines a {@link FilterDSL} (which changes to include) with a
15
+ * {@link SerializeDSL} (how to render them as SQL) and an optional baseline
16
+ * catalog snapshot.
17
+ *
18
+ * @category Integration
13
19
  */
14
20
  export type IntegrationDSL = {
21
+ /**
22
+ * Base integration(s) to extend. Filters are AND-combined, serialize rules
23
+ * are concatenated (base rules first, higher priority in first-match-wins),
24
+ * and the most specific emptyCatalog wins.
25
+ *
26
+ * Only core integration names are accepted (e.g., "supabase").
27
+ * Can be a single name or an array of names.
28
+ * Circular extends are detected and rejected.
29
+ */
30
+ extends?: string | string[];
15
31
  /**
16
32
  * Filter DSL - determines which changes to include/exclude.
17
33
  * If not provided, all changes are included.
@@ -0,0 +1,128 @@
1
+ import { describe, expect, test } from "bun:test";
2
+ import type { IntegrationDSL } from "./integration-dsl.ts";
3
+ import { mergeIntegrations } from "./merge.ts";
4
+
5
+ describe("mergeIntegrations", () => {
6
+ test("empty list returns empty object", () => {
7
+ expect(mergeIntegrations([])).toEqual({});
8
+ });
9
+
10
+ test("single integration is returned as-is", () => {
11
+ const integration: IntegrationDSL = {
12
+ filter: { objectType: "table" },
13
+ serialize: [
14
+ {
15
+ when: { objectType: "schema" },
16
+ options: { skipAuthorization: true },
17
+ },
18
+ ],
19
+ };
20
+ expect(mergeIntegrations([integration])).toBe(integration);
21
+ });
22
+
23
+ test("filters are AND-combined", () => {
24
+ const base: IntegrationDSL = {
25
+ filter: { "*/schema": "public" },
26
+ };
27
+ const ext: IntegrationDSL = {
28
+ filter: { objectType: "table" },
29
+ };
30
+
31
+ const merged = mergeIntegrations([base, ext]);
32
+ expect(merged.filter).toEqual({
33
+ and: [{ "*/schema": "public" }, { objectType: "table" }],
34
+ });
35
+ });
36
+
37
+ test("single filter is not wrapped in and", () => {
38
+ const base: IntegrationDSL = {};
39
+ const ext: IntegrationDSL = {
40
+ filter: { objectType: "table" },
41
+ };
42
+
43
+ const merged = mergeIntegrations([base, ext]);
44
+ expect(merged.filter).toEqual({ objectType: "table" });
45
+ });
46
+
47
+ test("serialize rules are concatenated (base first)", () => {
48
+ const base: IntegrationDSL = {
49
+ serialize: [
50
+ {
51
+ when: { objectType: "schema" },
52
+ options: { skipAuthorization: true },
53
+ },
54
+ ],
55
+ };
56
+ const ext: IntegrationDSL = {
57
+ serialize: [
58
+ {
59
+ when: { objectType: "table" },
60
+ options: { skipAuthorization: false },
61
+ },
62
+ ],
63
+ };
64
+
65
+ const merged = mergeIntegrations([base, ext]);
66
+ expect(merged.serialize).toEqual([
67
+ { when: { objectType: "schema" }, options: { skipAuthorization: true } },
68
+ { when: { objectType: "table" }, options: { skipAuthorization: false } },
69
+ ]);
70
+ });
71
+
72
+ test("emptyCatalog: most-specific (last) wins", () => {
73
+ const baseCatalog = {
74
+ version: 15,
75
+ schemas: {},
76
+ } as IntegrationDSL["emptyCatalog"];
77
+ const extCatalog = {
78
+ version: 16,
79
+ schemas: {},
80
+ } as IntegrationDSL["emptyCatalog"];
81
+
82
+ const base: IntegrationDSL = { emptyCatalog: baseCatalog };
83
+ const ext: IntegrationDSL = { emptyCatalog: extCatalog };
84
+
85
+ const merged = mergeIntegrations([base, ext]);
86
+ expect(merged.emptyCatalog).toBe(extCatalog);
87
+ });
88
+
89
+ test("emptyCatalog: falls back to base if most-specific is undefined", () => {
90
+ const baseCatalog = {
91
+ version: 15,
92
+ schemas: {},
93
+ } as IntegrationDSL["emptyCatalog"];
94
+
95
+ const base: IntegrationDSL = { emptyCatalog: baseCatalog };
96
+ const ext: IntegrationDSL = {};
97
+
98
+ const merged = mergeIntegrations([base, ext]);
99
+ expect(merged.emptyCatalog).toBe(baseCatalog);
100
+ });
101
+
102
+ test("full merge combines all fields", () => {
103
+ const base: IntegrationDSL = {
104
+ filter: { "*/schema": "public" },
105
+ serialize: [
106
+ {
107
+ when: { objectType: "schema" },
108
+ options: { skipAuthorization: true },
109
+ },
110
+ ],
111
+ };
112
+ const ext: IntegrationDSL = {
113
+ filter: { not: { objectType: "role" } },
114
+ serialize: [
115
+ {
116
+ when: { objectType: "table" },
117
+ options: { skipAuthorization: false },
118
+ },
119
+ ],
120
+ };
121
+
122
+ const merged = mergeIntegrations([base, ext]);
123
+ expect(merged.filter).toEqual({
124
+ and: [{ "*/schema": "public" }, { not: { objectType: "role" } }],
125
+ });
126
+ expect(merged.serialize).toHaveLength(2);
127
+ });
128
+ });
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Integration merging — combines multiple IntegrationDSL objects.
3
+ *
4
+ * - Filters are AND-combined
5
+ * - Serialize rules are concatenated (earlier integrations first = higher priority)
6
+ * - emptyCatalog: most-specific (last) integration's value wins
7
+ */
8
+
9
+ import type { FilterDSL } from "./filter/dsl.ts";
10
+ import type { IntegrationDSL } from "./integration-dsl.ts";
11
+ import type { SerializeDSL } from "./serialize/dsl.ts";
12
+
13
+ /**
14
+ * Merge an ordered list of integrations into a single IntegrationDSL.
15
+ *
16
+ * Integrations are ordered from base (first) to most-specific (last).
17
+ * - Filters: AND-combined (all must pass)
18
+ * - Serialize: concatenated (base rules first → higher priority, first-match-wins)
19
+ * - emptyCatalog: most-specific non-undefined value wins
20
+ *
21
+ * @param integrations - Ordered list of integrations (base first, most-specific last)
22
+ * @returns A single merged IntegrationDSL
23
+ */
24
+ export function mergeIntegrations(
25
+ integrations: IntegrationDSL[],
26
+ ): IntegrationDSL {
27
+ if (integrations.length === 0) return {};
28
+ if (integrations.length === 1) return integrations[0];
29
+
30
+ // Collect all filters
31
+ const filters: FilterDSL[] = [];
32
+ for (const integration of integrations) {
33
+ if (integration.filter) {
34
+ filters.push(integration.filter);
35
+ }
36
+ }
37
+
38
+ // Collect all serialize rules (base first = higher priority)
39
+ const serializeRules: SerializeDSL = [];
40
+ for (const integration of integrations) {
41
+ if (integration.serialize) {
42
+ serializeRules.push(...integration.serialize);
43
+ }
44
+ }
45
+
46
+ // emptyCatalog: most-specific (last) non-undefined wins
47
+ let emptyCatalog: IntegrationDSL["emptyCatalog"];
48
+ for (let i = integrations.length - 1; i >= 0; i--) {
49
+ if (integrations[i].emptyCatalog !== undefined) {
50
+ emptyCatalog = integrations[i].emptyCatalog;
51
+ break;
52
+ }
53
+ }
54
+
55
+ const merged: IntegrationDSL = {};
56
+
57
+ if (filters.length === 1) {
58
+ merged.filter = filters[0];
59
+ } else if (filters.length > 1) {
60
+ merged.filter = { and: filters };
61
+ }
62
+
63
+ if (serializeRules.length > 0) {
64
+ merged.serialize = serializeRules;
65
+ }
66
+
67
+ if (emptyCatalog !== undefined) {
68
+ merged.emptyCatalog = emptyCatalog;
69
+ }
70
+
71
+ return merged;
72
+ }