@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
@@ -1,57 +1,59 @@
1
1
  /**
2
2
  * Filter DSL - A serializable domain-specific language for change filtering.
3
+ *
4
+ * Uses wildcard-based path matching on flattened change properties.
5
+ * Path patterns as keys, values as matchers. Multiple keys in one object = AND.
6
+ *
7
+ * Path convention:
8
+ * - Top-level change properties are bare keys: `objectType`, `operation`, `scope`, `member`, `grantee`
9
+ * - Model sub-object properties use `<objectType>/<field>`: `table/schema`, `role/name`
10
+ * - Wildcard `*` matches any single path segment: `* /schema` → `table/schema`, `view/schema`, etc.
11
+ * - Separator is `/`
12
+ *
13
+ * Value matching:
14
+ * - string → exact equality
15
+ * - string[] → value must be in array (inclusion)
16
+ * - boolean → exact equality
17
+ * - number → exact equality
18
+ * - { op: "regex", value: string | string[] } → regex test
19
+ *
20
+ * When the flat value is an array (e.g. `requires`), match succeeds if any element satisfies.
3
21
  */
4
22
  import type { Change } from "../../change.types.ts";
5
23
  import type { ChangeFilter } from "./filter.types.ts";
6
24
  /**
7
- * Core properties that all changes have.
25
+ * Regex operator for advanced value matching.
8
26
  */
9
- type CoreProperties = {
10
- type?: Change["objectType"];
11
- operation?: "create" | "alter" | "drop";
12
- scope?: Change["scope"];
27
+ type RegexOperator = {
28
+ op: "regex";
29
+ value: string | string[];
13
30
  };
14
31
  /**
15
- * Extracted properties that are extracted from changes via extractor functions.
16
- * String value = exact match, Array value = value must be in array
32
+ * A value matcher for a path pattern key.
17
33
  */
18
- type ExtractedProperties = {
19
- schema?: string | string[];
20
- owner?: string | string[];
21
- member?: string | string[];
22
- grantee?: string | string[];
23
- publication?: string | string[];
24
- extension?: string | string[];
25
- procedureLanguage?: string | string[];
26
- eventTriggerName?: string | string[];
27
- procedureBinaryPath?: string | string[];
28
- triggerFunctionSchema?: string | string[];
29
- };
34
+ type ValueMatcher = string | string[] | boolean | number | RegexOperator;
30
35
  /**
31
- * Special properties that use custom matching logic (not extractor-based).
32
- */
33
- type SpecialProperties = {
34
- /**
35
- * Prefix match on `change.requires`.
36
- * Matches when any element of `change.requires` starts with any of the given prefixes.
37
- * Useful for excluding changes that depend on specific schemas/types.
38
- *
39
- * @example Filter out changes that require auth or extensions types:
40
- * ```ts
41
- * { not: { requiresMatching: ["type:auth.", "type:extensions."] } }
42
- * ```
43
- */
44
- requiresMatching?: string[];
45
- };
46
- /**
47
- * Property pattern - matches against change properties.
48
- * Multiple properties are combined with AND (all must match).
36
+ * Path pattern matches against flattened change properties.
37
+ * Keys are path patterns (with optional wildcards), values are matchers.
38
+ * Multiple keys are combined with AND (all must match).
39
+ *
40
+ * Reserved keys: `and`, `or`, `not`, `cascade`.
41
+ *
42
+ * @example
43
+ * ```json
44
+ * { "objectType": "table", "operation": "create" }
45
+ * ```
46
+ *
47
+ * @example Wildcard path matching any object's schema
48
+ * ```json
49
+ * { "* /schema": "public" }
50
+ * ```
51
+ *
52
+ * @category Filter DSL
49
53
  */
50
- type PropertyPattern = CoreProperties & ExtractedProperties & SpecialProperties & {
51
- /**
52
- * When true, exclusions from this filter cascade to dependents (requires/pg_depend).
53
- * Default false for DSL filters (opt-in).
54
- */
54
+ export type PathPattern = {
55
+ [path: string]: ValueMatcher;
56
+ } & {
55
57
  cascade?: boolean;
56
58
  and?: never;
57
59
  or?: never;
@@ -59,51 +61,53 @@ type PropertyPattern = CoreProperties & ExtractedProperties & SpecialProperties
59
61
  };
60
62
  /**
61
63
  * Composition pattern - combines other patterns using logical operators.
62
- * Composition operators are exclusive - cannot be mixed with properties.
64
+ * Composition operators are exclusive - cannot be mixed with path keys.
63
65
  */
64
- type CompositionPattern = ({
66
+ type CompositionPattern = {
65
67
  and: FilterPattern[];
66
68
  cascade?: boolean;
67
69
  or?: never;
68
70
  not?: never;
69
- } & {
70
- [K in keyof CoreProperties]?: never;
71
- } & {
72
- [K in keyof ExtractedProperties]?: never;
73
- } & {
74
- [K in keyof SpecialProperties]?: never;
75
- }) | ({
71
+ } | {
76
72
  or: FilterPattern[];
77
73
  cascade?: boolean;
78
74
  and?: never;
79
75
  not?: never;
80
- } & {
81
- [K in keyof CoreProperties]?: never;
82
- } & {
83
- [K in keyof ExtractedProperties]?: never;
84
- } & {
85
- [K in keyof SpecialProperties]?: never;
86
- }) | ({
76
+ } | {
87
77
  not: FilterPattern;
88
78
  cascade?: boolean;
89
79
  and?: never;
90
80
  or?: never;
91
- } & {
92
- [K in keyof CoreProperties]?: never;
93
- } & {
94
- [K in keyof ExtractedProperties]?: never;
95
- } & {
96
- [K in keyof SpecialProperties]?: never;
97
- });
81
+ };
98
82
  /**
99
- * Filter pattern DSL.
100
- * Either a property pattern (matches against change properties) or
101
- * a composition pattern (combines other patterns using logical operators).
102
- * Composition operators are exclusive - cannot be mixed with properties.
83
+ * A single filter expression: either a {@link PathPattern} that matches against
84
+ * flattened change properties, or a composition pattern that combines other
85
+ * patterns using `and` / `or` / `not` logical operators.
86
+ *
87
+ * @example Exclude all changes in pg_catalog
88
+ * ```json
89
+ * { "not": { "* /schema": "pg_catalog" } }
90
+ * ```
91
+ *
92
+ * @category Filter DSL
103
93
  */
104
- export type FilterPattern = PropertyPattern | CompositionPattern;
94
+ export type FilterPattern = PathPattern | CompositionPattern;
105
95
  /**
106
- * Filter DSL - a single pattern expression.
96
+ * Top-level Filter DSL type a single {@link FilterPattern} expression that
97
+ * determines which changes an integration includes or excludes.
98
+ *
99
+ * @example Include only table and view creates in public
100
+ * ```json
101
+ * {
102
+ * "and": [
103
+ * { "objectType": ["table", "view"] },
104
+ * { "operation": "create" },
105
+ * { "* /schema": "public" }
106
+ * ]
107
+ * }
108
+ * ```
109
+ *
110
+ * @category Filter DSL
107
111
  */
108
112
  export type FilterDSL = FilterPattern;
109
113
  /**
@@ -121,11 +125,11 @@ export declare function evaluatePattern(pattern: FilterPattern, change: Change):
121
125
  * @returns A ChangeFilter function that evaluates the pattern
122
126
  *
123
127
  * @example
124
- * ```ts
128
+ * ```
125
129
  * const filter = compileFilterDSL({
126
130
  * or: [
127
- * { type: "schema", operation: "create" },
128
- * { schema: "public" }
131
+ * { objectType: "schema", operation: "create" },
132
+ * { "table/schema": "public" }
129
133
  * ]
130
134
  * });
131
135
  * ```
@@ -1,7 +1,73 @@
1
1
  /**
2
2
  * Filter DSL - A serializable domain-specific language for change filtering.
3
+ *
4
+ * Uses wildcard-based path matching on flattened change properties.
5
+ * Path patterns as keys, values as matchers. Multiple keys in one object = AND.
6
+ *
7
+ * Path convention:
8
+ * - Top-level change properties are bare keys: `objectType`, `operation`, `scope`, `member`, `grantee`
9
+ * - Model sub-object properties use `<objectType>/<field>`: `table/schema`, `role/name`
10
+ * - Wildcard `*` matches any single path segment: `* /schema` → `table/schema`, `view/schema`, etc.
11
+ * - Separator is `/`
12
+ *
13
+ * Value matching:
14
+ * - string → exact equality
15
+ * - string[] → value must be in array (inclusion)
16
+ * - boolean → exact equality
17
+ * - number → exact equality
18
+ * - { op: "regex", value: string | string[] } → regex test
19
+ *
20
+ * When the flat value is an array (e.g. `requires`), match succeeds if any element satisfies.
3
21
  */
4
- import { PROPERTY_EXTRACTORS } from "./extractors.js";
22
+ import { compileWildcard, flattenChange } from "./flatten.js";
23
+ // Reserved keys that are not path patterns
24
+ const RESERVED_KEYS = new Set(["and", "or", "not", "cascade"]);
25
+ /**
26
+ * Match a flat value against a value matcher.
27
+ *
28
+ * When the flat value is an array, the match succeeds if any element satisfies.
29
+ */
30
+ function matchValue(actual, expected) {
31
+ if (actual === null || actual === undefined) {
32
+ return false;
33
+ }
34
+ // String matcher → exact equality
35
+ if (typeof expected === "string") {
36
+ if (Array.isArray(actual)) {
37
+ return actual.some((v) => v === expected);
38
+ }
39
+ return actual === expected;
40
+ }
41
+ // Boolean matcher → exact equality
42
+ if (typeof expected === "boolean") {
43
+ return actual === expected;
44
+ }
45
+ // Number matcher → exact equality
46
+ if (typeof expected === "number") {
47
+ return actual === expected;
48
+ }
49
+ // Array matcher → inclusion (value must be in array)
50
+ if (Array.isArray(expected)) {
51
+ if (Array.isArray(actual)) {
52
+ return actual.some((v) => expected.includes(v));
53
+ }
54
+ return typeof actual === "string" && expected.includes(actual);
55
+ }
56
+ // Regex operator
57
+ if (typeof expected === "object" &&
58
+ expected !== null &&
59
+ "op" in expected &&
60
+ expected.op === "regex") {
61
+ const patterns = Array.isArray(expected.value)
62
+ ? expected.value
63
+ : [expected.value];
64
+ if (Array.isArray(actual)) {
65
+ return actual.some((a) => patterns.some((p) => new RegExp(p).test(String(a))));
66
+ }
67
+ return patterns.some((p) => new RegExp(p).test(String(actual)));
68
+ }
69
+ return false;
70
+ }
5
71
  /**
6
72
  * Evaluate a pattern against a change.
7
73
  *
@@ -12,94 +78,36 @@ import { PROPERTY_EXTRACTORS } from "./extractors.js";
12
78
  export function evaluatePattern(pattern, change) {
13
79
  // Handle composition operators first (they take precedence)
14
80
  // NOT operator - negate the result
15
- if (pattern.not) {
81
+ if ("not" in pattern && pattern.not) {
16
82
  return !evaluatePattern(pattern.not, change);
17
83
  }
18
84
  // AND operator - all patterns must match
19
- if (pattern.and) {
85
+ if ("and" in pattern && pattern.and) {
20
86
  return pattern.and.every((p) => evaluatePattern(p, change));
21
87
  }
22
88
  // OR operator - any pattern must match
23
- if (pattern.or) {
89
+ if ("or" in pattern && pattern.or) {
24
90
  return pattern.or.some((p) => evaluatePattern(p, change));
25
91
  }
26
- // Evaluate basic pattern matching
27
- // Multiple properties in a pattern are combined with AND (all must match)
28
- // Match objectType
29
- if (pattern.type) {
30
- if (change.objectType !== pattern.type) {
31
- return false;
32
- }
33
- }
34
- // Match operation
35
- if (pattern.operation) {
36
- if (change.operation !== pattern.operation) {
37
- return false;
38
- }
39
- }
40
- // Match scope
41
- if (pattern.scope) {
42
- if (change.scope !== pattern.scope) {
43
- return false;
44
- }
45
- }
46
- // Match requiresMatching (special property - prefix match on change.requires)
47
- if (pattern.requiresMatching) {
48
- const requires = change.requires ?? [];
49
- const prefixes = pattern.requiresMatching;
50
- const hasMatch = requires.some((r) => prefixes.some((p) => r.startsWith(p)));
51
- if (!hasMatch) {
52
- return false;
53
- }
54
- }
55
- // Match extracted properties
56
- for (const [key, value] of Object.entries(pattern)) {
57
- // Skip composition operators, core properties, special properties, and cascade
58
- if ([
59
- "and",
60
- "or",
61
- "not",
62
- "type",
63
- "operation",
64
- "scope",
65
- "requiresMatching",
66
- "cascade",
67
- ].includes(key)) {
68
- continue;
69
- }
70
- // Check if this is a registered property extractor
71
- const extractor = PROPERTY_EXTRACTORS[key];
72
- if (!extractor) {
73
- // Unknown property - ignore
92
+ // Path pattern matching: flatten the change, then for each key in the pattern,
93
+ // wildcard-match against flat map paths and compare values.
94
+ const flat = flattenChange(change);
95
+ for (const [patternKey, matcher] of Object.entries(pattern)) {
96
+ if (RESERVED_KEYS.has(patternKey))
74
97
  continue;
75
- }
76
- // Extract the actual value from the change
77
- const actualValue = extractor(change);
78
- // Property matching rules:
79
- // - String value: exact match
80
- // - Array value: value must be in array
81
- // - Missing properties (null) don't match
82
- if (actualValue === null) {
98
+ const wildcardMatcher = compileWildcard(patternKey);
99
+ // Find all flat keys that match this wildcard pattern
100
+ const matchingKeys = Object.keys(flat).filter((k) => wildcardMatcher(k));
101
+ if (matchingKeys.length === 0) {
102
+ // No flat keys match this wildcard → pattern key not satisfied
83
103
  return false;
84
104
  }
85
- if (typeof value === "string") {
86
- // Exact match
87
- if (actualValue !== value) {
88
- return false;
89
- }
90
- }
91
- else if (Array.isArray(value)) {
92
- // Value must be in array
93
- if (!value.includes(actualValue)) {
94
- return false;
95
- }
96
- }
97
- else {
98
- // Invalid value type - don't match
105
+ // At least one matching key must satisfy the value matcher
106
+ const anyMatch = matchingKeys.some((k) => matchValue(flat[k], matcher));
107
+ if (!anyMatch)
99
108
  return false;
100
- }
101
109
  }
102
- // All checks passed
110
+ // All pattern keys satisfied
103
111
  return true;
104
112
  }
105
113
  /**
@@ -109,17 +117,57 @@ export function evaluatePattern(pattern, change) {
109
117
  * @returns A ChangeFilter function that evaluates the pattern
110
118
  *
111
119
  * @example
112
- * ```ts
120
+ * ```
113
121
  * const filter = compileFilterDSL({
114
122
  * or: [
115
- * { type: "schema", operation: "create" },
116
- * { schema: "public" }
123
+ * { objectType: "schema", operation: "create" },
124
+ * { "table/schema": "public" }
117
125
  * ]
118
126
  * });
119
127
  * ```
120
128
  */
121
129
  export function compileFilterDSL(dsl) {
130
+ validateRegexPatterns(dsl);
122
131
  return (change) => {
123
132
  return evaluatePattern(dsl, change);
124
133
  };
125
134
  }
135
+ /**
136
+ * Walk the pattern tree and validate all regex patterns at compile time.
137
+ * Throws a descriptive error if any regex pattern is invalid.
138
+ */
139
+ function validateRegexPatterns(pattern) {
140
+ if ("not" in pattern && pattern.not) {
141
+ validateRegexPatterns(pattern.not);
142
+ return;
143
+ }
144
+ if ("and" in pattern && pattern.and) {
145
+ for (const p of pattern.and)
146
+ validateRegexPatterns(p);
147
+ return;
148
+ }
149
+ if ("or" in pattern && pattern.or) {
150
+ for (const p of pattern.or)
151
+ validateRegexPatterns(p);
152
+ return;
153
+ }
154
+ for (const [key, value] of Object.entries(pattern)) {
155
+ if (RESERVED_KEYS.has(key))
156
+ continue;
157
+ if (typeof value === "object" &&
158
+ value !== null &&
159
+ !Array.isArray(value) &&
160
+ "op" in value &&
161
+ value.op === "regex") {
162
+ const patterns = Array.isArray(value.value) ? value.value : [value.value];
163
+ for (const p of patterns) {
164
+ try {
165
+ new RegExp(p);
166
+ }
167
+ catch (e) {
168
+ throw new Error(`Invalid regex pattern "${p}" in filter DSL: ${e.message}`);
169
+ }
170
+ }
171
+ }
172
+ }
173
+ }
@@ -0,0 +1,51 @@
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
+ import type { Change } from "../../change.types.ts";
10
+ /**
11
+ * A flat value extracted from a Change: scalar types or arrays of scalars.
12
+ *
13
+ * The filter DSL flattens every {@link Change} into a
14
+ * `Record<string, FlatValue>` before pattern matching. Only these primitive
15
+ * types survive the flattening step; nested objects are expanded into
16
+ * `<objectType>/<field>` paths.
17
+ *
18
+ * @category Filter DSL
19
+ */
20
+ export type FlatValue = string | number | boolean | null | Array<string | number>;
21
+ /**
22
+ * Flatten a Change into a Record<string, FlatValue>.
23
+ *
24
+ * A Change object has two kinds of properties:
25
+ *
26
+ * 1. **Top-level properties** — scalars and arrays directly on the object.
27
+ * These become bare keys in the flat record.
28
+ *
29
+ * 2. **Model sub-object** — a single nested object whose JS property name is
30
+ * given by OBJECT_TYPE_TO_PROPERTY_KEY. Its scalar fields are flattened
31
+ * with an `<objectType>/` prefix.
32
+ *
33
+ * After the main loop, a schema normalization step ensures that
34
+ * `<objectType>/schema` exists for every change that logically belongs to
35
+ * a schema — even when the model stores the schema under a different name.
36
+ *
37
+ * Results are cached per Change instance (WeakMap) so repeated calls are free.
38
+ */
39
+ export declare function flattenChange(change: Change): Record<string, FlatValue>;
40
+ /**
41
+ * Compile a glob pattern string into a matcher function.
42
+ *
43
+ * Uses picomatch for full glob support:
44
+ * - `objectType` matches only `objectType`
45
+ * - `table/schema` matches only `table/schema`
46
+ * - `* /schema` matches `table/schema`, `view/schema`, etc.
47
+ * - `{table,view}/schema` matches `table/schema` and `view/schema`
48
+ * - `table/is_*` matches `table/is_partition`, `table/is_typed`, etc.
49
+ * - `!(role)/schema` matches any objectType's schema except `role`
50
+ */
51
+ export declare function compileWildcard(pattern: string): (path: string) => boolean;
@@ -0,0 +1,116 @@
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
+ import picomatch from "picomatch";
10
+ import { OBJECT_TYPE_TO_PROPERTY_KEY } from "../../change.types.js";
11
+ import { getSchema } from "../../change-utils.js";
12
+ /**
13
+ * WeakMap cache to avoid re-flattening the same Change instance.
14
+ */
15
+ const flattenCache = new WeakMap();
16
+ /**
17
+ * Convert an unknown value to a FlatValue if it's a supported type.
18
+ *
19
+ * Supported types (kept in the flat record):
20
+ * - null / undefined → null (missing or explicitly null)
21
+ * - string, number, boolean → as-is
22
+ * - Array where every element is string or number → as-is
23
+ *
24
+ * Anything else (nested objects, arrays of objects, functions, …) is NOT
25
+ * representable as a flat value, so we return `undefined` to signal
26
+ * "skip this entry".
27
+ */
28
+ function toFlatValue(value) {
29
+ if (value === null || value === undefined)
30
+ return null;
31
+ if (typeof value === "string" ||
32
+ typeof value === "number" ||
33
+ typeof value === "boolean")
34
+ return value;
35
+ if (Array.isArray(value) &&
36
+ value.every((v) => typeof v === "string" || typeof v === "number")) {
37
+ return value;
38
+ }
39
+ return undefined;
40
+ }
41
+ /**
42
+ * Flatten a Change into a Record<string, FlatValue>.
43
+ *
44
+ * A Change object has two kinds of properties:
45
+ *
46
+ * 1. **Top-level properties** — scalars and arrays directly on the object.
47
+ * These become bare keys in the flat record.
48
+ *
49
+ * 2. **Model sub-object** — a single nested object whose JS property name is
50
+ * given by OBJECT_TYPE_TO_PROPERTY_KEY. Its scalar fields are flattened
51
+ * with an `<objectType>/` prefix.
52
+ *
53
+ * After the main loop, a schema normalization step ensures that
54
+ * `<objectType>/schema` exists for every change that logically belongs to
55
+ * a schema — even when the model stores the schema under a different name.
56
+ *
57
+ * Results are cached per Change instance (WeakMap) so repeated calls are free.
58
+ */
59
+ export function flattenChange(change) {
60
+ const cached = flattenCache.get(change);
61
+ if (cached)
62
+ return cached;
63
+ const flat = {};
64
+ const modelKey = OBJECT_TYPE_TO_PROPERTY_KEY[change.objectType];
65
+ const prefix = change.objectType;
66
+ for (const [key, value] of Object.entries(change)) {
67
+ if (key === modelKey &&
68
+ value &&
69
+ typeof value === "object" &&
70
+ !Array.isArray(value)) {
71
+ for (const [subKey, subValue] of Object.entries(value)) {
72
+ const flatVal = toFlatValue(subValue);
73
+ if (flatVal !== undefined) {
74
+ flat[`${prefix}/${subKey}`] = flatVal;
75
+ }
76
+ }
77
+ }
78
+ else {
79
+ const flatVal = toFlatValue(value);
80
+ if (flatVal !== undefined) {
81
+ flat[key] = flatVal;
82
+ }
83
+ }
84
+ }
85
+ // requires/creates/drops are prototype getters (not own properties),
86
+ // so Object.entries() above won't see them. Access them explicitly.
87
+ flat.requires = change.requires ?? [];
88
+ flat.creates = change.creates ?? [];
89
+ flat.drops = change.drops ?? [];
90
+ // Schema normalization: ensure <objectType>/schema exists for all changes
91
+ // that have a schema. Handles: schema objects (name→schema), event triggers
92
+ // (function_schema→schema), default_privilege scope (inSchema→schema).
93
+ const schemaKey = `${prefix}/schema`;
94
+ if (!(schemaKey in flat)) {
95
+ const schemaValue = getSchema(change);
96
+ if (schemaValue !== null) {
97
+ flat[schemaKey] = schemaValue;
98
+ }
99
+ }
100
+ flattenCache.set(change, flat);
101
+ return flat;
102
+ }
103
+ /**
104
+ * Compile a glob pattern string into a matcher function.
105
+ *
106
+ * Uses picomatch for full glob support:
107
+ * - `objectType` matches only `objectType`
108
+ * - `table/schema` matches only `table/schema`
109
+ * - `* /schema` matches `table/schema`, `view/schema`, etc.
110
+ * - `{table,view}/schema` matches `table/schema` and `view/schema`
111
+ * - `table/is_*` matches `table/is_partition`, `table/is_typed`, etc.
112
+ * - `!(role)/schema` matches any objectType's schema except `role`
113
+ */
114
+ export function compileWildcard(pattern) {
115
+ return picomatch(pattern, { dot: true });
116
+ }
@@ -7,9 +7,25 @@ import type { CatalogSnapshot } from "../catalog.snapshot.ts";
7
7
  import type { FilterDSL } from "./filter/dsl.ts";
8
8
  import type { SerializeDSL } from "./serialize/dsl.ts";
9
9
  /**
10
- * Integration DSL - serializable representation of an integration.
10
+ * Serializable representation of a pg-delta integration.
11
+ *
12
+ * An integration combines a {@link FilterDSL} (which changes to include) with a
13
+ * {@link SerializeDSL} (how to render them as SQL) and an optional baseline
14
+ * catalog snapshot.
15
+ *
16
+ * @category Integration
11
17
  */
12
18
  export type IntegrationDSL = {
19
+ /**
20
+ * Base integration(s) to extend. Filters are AND-combined, serialize rules
21
+ * are concatenated (base rules first, higher priority in first-match-wins),
22
+ * and the most specific emptyCatalog wins.
23
+ *
24
+ * Only core integration names are accepted (e.g., "supabase").
25
+ * Can be a single name or an array of names.
26
+ * Circular extends are detected and rejected.
27
+ */
28
+ extends?: string | string[];
13
29
  /**
14
30
  * Filter DSL - determines which changes to include/exclude.
15
31
  * If not provided, all changes are included.
@@ -0,0 +1,20 @@
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
+ import type { IntegrationDSL } from "./integration-dsl.ts";
9
+ /**
10
+ * Merge an ordered list of integrations into a single IntegrationDSL.
11
+ *
12
+ * Integrations are ordered from base (first) to most-specific (last).
13
+ * - Filters: AND-combined (all must pass)
14
+ * - Serialize: concatenated (base rules first → higher priority, first-match-wins)
15
+ * - emptyCatalog: most-specific non-undefined value wins
16
+ *
17
+ * @param integrations - Ordered list of integrations (base first, most-specific last)
18
+ * @returns A single merged IntegrationDSL
19
+ */
20
+ export declare function mergeIntegrations(integrations: IntegrationDSL[]): IntegrationDSL;