@supabase/pg-delta 1.0.0-alpha.3 → 1.0.0-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (463) hide show
  1. package/README.md +22 -0
  2. package/dist/cli/bin/cli.js +0 -0
  3. package/dist/cli/commands/plan.js +21 -0
  4. package/dist/cli/utils.d.ts +2 -0
  5. package/dist/cli/utils.js +1 -1
  6. package/dist/core/objects/table/table.model.d.ts +4 -2
  7. package/dist/core/objects/table/table.model.js +3 -0
  8. package/dist/core/objects/trigger/changes/trigger.alter.js +23 -0
  9. package/dist/core/objects/trigger/changes/trigger.create.js +2 -1
  10. package/dist/core/objects/trigger/trigger.model.d.ts +1 -0
  11. package/dist/core/objects/trigger/trigger.model.js +3 -0
  12. package/dist/core/plan/apply.js +3 -3
  13. package/dist/core/plan/create.js +34 -15
  14. package/dist/core/plan/sql-format/constants.d.ts +2 -0
  15. package/dist/core/plan/sql-format/constants.js +11 -0
  16. package/dist/core/plan/sql-format/fixtures.d.ts +2 -0
  17. package/dist/core/plan/sql-format/fixtures.js +2449 -0
  18. package/dist/core/plan/sql-format/format-utils.d.ts +37 -0
  19. package/dist/core/plan/sql-format/format-utils.js +274 -0
  20. package/dist/core/plan/sql-format/formatters.d.ts +20 -0
  21. package/dist/core/plan/sql-format/formatters.js +737 -0
  22. package/dist/core/plan/sql-format/index.d.ts +2 -0
  23. package/dist/core/plan/sql-format/index.js +98 -0
  24. package/dist/core/plan/sql-format/keyword-case.d.ts +2 -0
  25. package/dist/core/plan/sql-format/keyword-case.js +868 -0
  26. package/dist/core/plan/sql-format/protect.d.ts +3 -0
  27. package/dist/core/plan/sql-format/protect.js +269 -0
  28. package/dist/core/plan/sql-format/sql-scanner.d.ts +59 -0
  29. package/dist/core/plan/sql-format/sql-scanner.js +202 -0
  30. package/dist/core/plan/sql-format/tokenizer.d.ts +22 -0
  31. package/dist/core/plan/sql-format/tokenizer.js +118 -0
  32. package/dist/core/plan/sql-format/types.d.ts +28 -0
  33. package/dist/core/plan/sql-format/types.js +1 -0
  34. package/dist/core/plan/sql-format/wrap.d.ts +2 -0
  35. package/dist/core/plan/sql-format/wrap.js +165 -0
  36. package/dist/core/plan/sql-format.d.ts +2 -0
  37. package/dist/core/plan/sql-format.js +1 -0
  38. package/dist/core/plan/statements.d.ts +2 -1
  39. package/dist/core/plan/statements.js +6 -2
  40. package/dist/core/postgres-config.d.ts +15 -0
  41. package/dist/core/postgres-config.js +30 -0
  42. package/dist/index.d.ts +2 -0
  43. package/dist/index.js +1 -0
  44. package/package.json +37 -22
  45. package/src/cli/app.ts +28 -0
  46. package/src/cli/bin/cli.ts +9 -0
  47. package/src/cli/commands/apply.ts +101 -0
  48. package/src/cli/commands/plan.ts +195 -0
  49. package/src/cli/commands/sync.ts +185 -0
  50. package/src/cli/formatters/index.ts +5 -0
  51. package/src/cli/formatters/tree/tree-builder.ts +380 -0
  52. package/src/cli/formatters/tree/tree-renderer.ts +372 -0
  53. package/src/cli/formatters/tree/tree.ts +237 -0
  54. package/src/cli/utils/integrations.ts +42 -0
  55. package/src/cli/utils.ts +231 -0
  56. package/src/core/catalog.diff.ts +246 -0
  57. package/src/core/catalog.model.ts +384 -0
  58. package/src/core/change.types.ts +44 -0
  59. package/src/core/context.ts +26 -0
  60. package/src/core/depend.ts +1870 -0
  61. package/src/core/expand-replace-dependencies.ts +380 -0
  62. package/src/core/fingerprint.ts +204 -0
  63. package/src/core/integrations/filter/dsl.ts +204 -0
  64. package/src/core/integrations/filter/extractors.ts +145 -0
  65. package/src/core/integrations/filter/filter.types.ts +3 -0
  66. package/src/core/integrations/integration-dsl.ts +24 -0
  67. package/src/core/integrations/integration.types.ts +7 -0
  68. package/src/core/integrations/serialize/dsl.ts +77 -0
  69. package/src/core/integrations/serialize/serialize.types.ts +3 -0
  70. package/src/core/integrations/supabase.ts +121 -0
  71. package/src/core/objects/aggregate/aggregate.diff.test.ts +215 -0
  72. package/src/core/objects/aggregate/aggregate.diff.ts +278 -0
  73. package/src/core/objects/aggregate/aggregate.model.ts +317 -0
  74. package/src/core/objects/aggregate/changes/aggregate.alter.test.ts +64 -0
  75. package/src/core/objects/aggregate/changes/aggregate.alter.ts +32 -0
  76. package/src/core/objects/aggregate/changes/aggregate.base.ts +20 -0
  77. package/src/core/objects/aggregate/changes/aggregate.comment.test.ts +86 -0
  78. package/src/core/objects/aggregate/changes/aggregate.comment.ts +62 -0
  79. package/src/core/objects/aggregate/changes/aggregate.create.test.ts +101 -0
  80. package/src/core/objects/aggregate/changes/aggregate.create.ts +329 -0
  81. package/src/core/objects/aggregate/changes/aggregate.drop.test.ts +78 -0
  82. package/src/core/objects/aggregate/changes/aggregate.drop.ts +32 -0
  83. package/src/core/objects/aggregate/changes/aggregate.privilege.test.ts +130 -0
  84. package/src/core/objects/aggregate/changes/aggregate.privilege.ts +146 -0
  85. package/src/core/objects/aggregate/changes/aggregate.types.ts +12 -0
  86. package/src/core/objects/base.change.ts +62 -0
  87. package/src/core/objects/base.default-privileges.ts +204 -0
  88. package/src/core/objects/base.diff.ts +20 -0
  89. package/src/core/objects/base.model.ts +82 -0
  90. package/src/core/objects/base.privilege-diff.ts +299 -0
  91. package/src/core/objects/base.privilege.ts +184 -0
  92. package/src/core/objects/collation/changes/collation.alter.test.ts +63 -0
  93. package/src/core/objects/collation/changes/collation.alter.ts +79 -0
  94. package/src/core/objects/collation/changes/collation.base.ts +20 -0
  95. package/src/core/objects/collation/changes/collation.comment.ts +68 -0
  96. package/src/core/objects/collation/changes/collation.create.test.ts +51 -0
  97. package/src/core/objects/collation/changes/collation.create.ts +106 -0
  98. package/src/core/objects/collation/changes/collation.drop.test.ts +28 -0
  99. package/src/core/objects/collation/changes/collation.drop.ts +37 -0
  100. package/src/core/objects/collation/changes/collation.types.ts +10 -0
  101. package/src/core/objects/collation/collation.diff.test.ts +100 -0
  102. package/src/core/objects/collation/collation.diff.ts +126 -0
  103. package/src/core/objects/collation/collation.model.ts +224 -0
  104. package/src/core/objects/domain/changes/domain.alter.test.ts +316 -0
  105. package/src/core/objects/domain/changes/domain.alter.ts +286 -0
  106. package/src/core/objects/domain/changes/domain.base.ts +20 -0
  107. package/src/core/objects/domain/changes/domain.comment.ts +59 -0
  108. package/src/core/objects/domain/changes/domain.create.test.ts +65 -0
  109. package/src/core/objects/domain/changes/domain.create.ts +118 -0
  110. package/src/core/objects/domain/changes/domain.drop.test.ts +30 -0
  111. package/src/core/objects/domain/changes/domain.drop.ts +34 -0
  112. package/src/core/objects/domain/changes/domain.privilege.ts +171 -0
  113. package/src/core/objects/domain/changes/domain.types.ts +12 -0
  114. package/src/core/objects/domain/domain.diff.test.ts +284 -0
  115. package/src/core/objects/domain/domain.diff.ts +358 -0
  116. package/src/core/objects/domain/domain.model.ts +190 -0
  117. package/src/core/objects/event-trigger/changes/event-trigger.alter.test.ts +50 -0
  118. package/src/core/objects/event-trigger/changes/event-trigger.alter.ts +82 -0
  119. package/src/core/objects/event-trigger/changes/event-trigger.base.ts +20 -0
  120. package/src/core/objects/event-trigger/changes/event-trigger.comment.ts +66 -0
  121. package/src/core/objects/event-trigger/changes/event-trigger.create.test.ts +24 -0
  122. package/src/core/objects/event-trigger/changes/event-trigger.create.ts +72 -0
  123. package/src/core/objects/event-trigger/changes/event-trigger.drop.test.ts +22 -0
  124. package/src/core/objects/event-trigger/changes/event-trigger.drop.ts +34 -0
  125. package/src/core/objects/event-trigger/changes/event-trigger.types.ts +10 -0
  126. package/src/core/objects/event-trigger/event-trigger.diff.test.ts +126 -0
  127. package/src/core/objects/event-trigger/event-trigger.diff.ts +126 -0
  128. package/src/core/objects/event-trigger/event-trigger.model.ts +106 -0
  129. package/src/core/objects/extension/changes/extension.alter.test.ts +58 -0
  130. package/src/core/objects/extension/changes/extension.alter.ts +78 -0
  131. package/src/core/objects/extension/changes/extension.base.ts +20 -0
  132. package/src/core/objects/extension/changes/extension.comment.ts +64 -0
  133. package/src/core/objects/extension/changes/extension.create.test.ts +25 -0
  134. package/src/core/objects/extension/changes/extension.create.ts +63 -0
  135. package/src/core/objects/extension/changes/extension.drop.test.ts +23 -0
  136. package/src/core/objects/extension/changes/extension.drop.ts +34 -0
  137. package/src/core/objects/extension/changes/extension.types.ts +10 -0
  138. package/src/core/objects/extension/extension.diff.test.ts +42 -0
  139. package/src/core/objects/extension/extension.diff.ts +90 -0
  140. package/src/core/objects/extension/extension.model.ts +280 -0
  141. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.test.ts +125 -0
  142. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.ts +101 -0
  143. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.base.ts +20 -0
  144. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.ts +72 -0
  145. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.test.ts +125 -0
  146. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.ts +95 -0
  147. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.test.ts +23 -0
  148. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.ts +36 -0
  149. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.ts +172 -0
  150. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.ts +12 -0
  151. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.test.ts +179 -0
  152. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.ts +341 -0
  153. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.ts +149 -0
  154. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.ts +10 -0
  155. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.test.ts +309 -0
  156. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.ts +341 -0
  157. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.base.ts +20 -0
  158. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.ts +72 -0
  159. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.test.ts +201 -0
  160. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.ts +81 -0
  161. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.test.ts +43 -0
  162. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.ts +37 -0
  163. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.ts +181 -0
  164. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.ts +12 -0
  165. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.test.ts +813 -0
  166. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.ts +406 -0
  167. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.ts +242 -0
  168. package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.test.ts +168 -0
  169. package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.ts +126 -0
  170. package/src/core/objects/foreign-data-wrapper/server/changes/server.base.ts +20 -0
  171. package/src/core/objects/foreign-data-wrapper/server/changes/server.comment.ts +60 -0
  172. package/src/core/objects/foreign-data-wrapper/server/changes/server.create.test.ts +131 -0
  173. package/src/core/objects/foreign-data-wrapper/server/changes/server.create.ts +81 -0
  174. package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.test.ts +24 -0
  175. package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.ts +34 -0
  176. package/src/core/objects/foreign-data-wrapper/server/changes/server.privilege.ts +164 -0
  177. package/src/core/objects/foreign-data-wrapper/server/changes/server.types.ts +12 -0
  178. package/src/core/objects/foreign-data-wrapper/server/server.diff.test.ts +167 -0
  179. package/src/core/objects/foreign-data-wrapper/server/server.diff.ts +317 -0
  180. package/src/core/objects/foreign-data-wrapper/server/server.model.ts +133 -0
  181. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.test.ts +82 -0
  182. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.ts +69 -0
  183. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.base.ts +20 -0
  184. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.test.ts +85 -0
  185. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.ts +66 -0
  186. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.test.ts +53 -0
  187. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.ts +40 -0
  188. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.ts +8 -0
  189. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.test.ts +77 -0
  190. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.ts +107 -0
  191. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.ts +96 -0
  192. package/src/core/objects/index/changes/index.alter.test.ts +200 -0
  193. package/src/core/objects/index/changes/index.alter.ts +144 -0
  194. package/src/core/objects/index/changes/index.base.ts +20 -0
  195. package/src/core/objects/index/changes/index.comment.ts +63 -0
  196. package/src/core/objects/index/changes/index.create.test.ts +66 -0
  197. package/src/core/objects/index/changes/index.create.ts +68 -0
  198. package/src/core/objects/index/changes/index.drop.test.ts +44 -0
  199. package/src/core/objects/index/changes/index.drop.ts +34 -0
  200. package/src/core/objects/index/changes/index.types.ts +6 -0
  201. package/src/core/objects/index/changes/utils.ts +16 -0
  202. package/src/core/objects/index/index.diff.test.ts +153 -0
  203. package/src/core/objects/index/index.diff.ts +243 -0
  204. package/src/core/objects/index/index.model.ts +370 -0
  205. package/src/core/objects/language/changes/language.alter.test.ts +33 -0
  206. package/src/core/objects/language/changes/language.alter.ts +53 -0
  207. package/src/core/objects/language/changes/language.base.ts +20 -0
  208. package/src/core/objects/language/changes/language.comment.ts +58 -0
  209. package/src/core/objects/language/changes/language.create.test.ts +27 -0
  210. package/src/core/objects/language/changes/language.create.ts +104 -0
  211. package/src/core/objects/language/changes/language.drop.test.ts +25 -0
  212. package/src/core/objects/language/changes/language.drop.ts +39 -0
  213. package/src/core/objects/language/changes/language.privilege.ts +172 -0
  214. package/src/core/objects/language/changes/language.types.ts +12 -0
  215. package/src/core/objects/language/language.diff.test.ts +53 -0
  216. package/src/core/objects/language/language.diff.ts +176 -0
  217. package/src/core/objects/language/language.model.ts +150 -0
  218. package/src/core/objects/materialized-view/changes/materialized-view.alter.test.ts +123 -0
  219. package/src/core/objects/materialized-view/changes/materialized-view.alter.ts +113 -0
  220. package/src/core/objects/materialized-view/changes/materialized-view.base.ts +20 -0
  221. package/src/core/objects/materialized-view/changes/materialized-view.comment.ts +176 -0
  222. package/src/core/objects/materialized-view/changes/materialized-view.create.test.ts +64 -0
  223. package/src/core/objects/materialized-view/changes/materialized-view.create.ts +93 -0
  224. package/src/core/objects/materialized-view/changes/materialized-view.drop.test.ts +34 -0
  225. package/src/core/objects/materialized-view/changes/materialized-view.drop.ts +60 -0
  226. package/src/core/objects/materialized-view/changes/materialized-view.privilege.ts +212 -0
  227. package/src/core/objects/materialized-view/changes/materialized-view.types.ts +12 -0
  228. package/src/core/objects/materialized-view/materialized-view.diff.test.ts +102 -0
  229. package/src/core/objects/materialized-view/materialized-view.diff.ts +451 -0
  230. package/src/core/objects/materialized-view/materialized-view.model.ts +258 -0
  231. package/src/core/objects/procedure/changes/procedure.alter.test.ts +1005 -0
  232. package/src/core/objects/procedure/changes/procedure.alter.ts +287 -0
  233. package/src/core/objects/procedure/changes/procedure.base.ts +20 -0
  234. package/src/core/objects/procedure/changes/procedure.comment.ts +70 -0
  235. package/src/core/objects/procedure/changes/procedure.create.test.ts +48 -0
  236. package/src/core/objects/procedure/changes/procedure.create.ts +92 -0
  237. package/src/core/objects/procedure/changes/procedure.drop.test.ts +85 -0
  238. package/src/core/objects/procedure/changes/procedure.drop.ts +49 -0
  239. package/src/core/objects/procedure/changes/procedure.privilege.ts +188 -0
  240. package/src/core/objects/procedure/changes/procedure.types.ts +12 -0
  241. package/src/core/objects/procedure/procedure.diff.test.ts +161 -0
  242. package/src/core/objects/procedure/procedure.diff.ts +404 -0
  243. package/src/core/objects/procedure/procedure.model.ts +264 -0
  244. package/src/core/objects/procedure/utils.ts +58 -0
  245. package/src/core/objects/publication/changes/publication.alter.test.ts +223 -0
  246. package/src/core/objects/publication/changes/publication.alter.ts +243 -0
  247. package/src/core/objects/publication/changes/publication.base.ts +20 -0
  248. package/src/core/objects/publication/changes/publication.comment.test.ts +70 -0
  249. package/src/core/objects/publication/changes/publication.comment.ts +64 -0
  250. package/src/core/objects/publication/changes/publication.create.test.ts +87 -0
  251. package/src/core/objects/publication/changes/publication.create.ts +82 -0
  252. package/src/core/objects/publication/changes/publication.drop.test.ts +46 -0
  253. package/src/core/objects/publication/changes/publication.drop.ts +29 -0
  254. package/src/core/objects/publication/changes/publication.types.ts +26 -0
  255. package/src/core/objects/publication/publication.diff.test.ts +292 -0
  256. package/src/core/objects/publication/publication.diff.ts +253 -0
  257. package/src/core/objects/publication/publication.model.ts +206 -0
  258. package/src/core/objects/publication/utils.ts +55 -0
  259. package/src/core/objects/rls-policy/changes/rls-policy.alter.test.ts +250 -0
  260. package/src/core/objects/rls-policy/changes/rls-policy.alter.ts +128 -0
  261. package/src/core/objects/rls-policy/changes/rls-policy.base.ts +20 -0
  262. package/src/core/objects/rls-policy/changes/rls-policy.comment.ts +69 -0
  263. package/src/core/objects/rls-policy/changes/rls-policy.create.test.ts +74 -0
  264. package/src/core/objects/rls-policy/changes/rls-policy.create.ts +100 -0
  265. package/src/core/objects/rls-policy/changes/rls-policy.drop.test.ts +28 -0
  266. package/src/core/objects/rls-policy/changes/rls-policy.drop.ts +39 -0
  267. package/src/core/objects/rls-policy/changes/rls-policy.types.ts +10 -0
  268. package/src/core/objects/rls-policy/rls-policy.diff.test.ts +79 -0
  269. package/src/core/objects/rls-policy/rls-policy.diff.ts +121 -0
  270. package/src/core/objects/rls-policy/rls-policy.model.ts +140 -0
  271. package/src/core/objects/role/changes/role.alter.test.ts +346 -0
  272. package/src/core/objects/role/changes/role.alter.ts +110 -0
  273. package/src/core/objects/role/changes/role.base.ts +24 -0
  274. package/src/core/objects/role/changes/role.comment.ts +55 -0
  275. package/src/core/objects/role/changes/role.create.test.ts +52 -0
  276. package/src/core/objects/role/changes/role.create.ts +102 -0
  277. package/src/core/objects/role/changes/role.drop.test.ts +29 -0
  278. package/src/core/objects/role/changes/role.drop.ts +34 -0
  279. package/src/core/objects/role/changes/role.privilege.ts +376 -0
  280. package/src/core/objects/role/changes/role.types.ts +12 -0
  281. package/src/core/objects/role/role.diff.test.ts +44 -0
  282. package/src/core/objects/role/role.diff.ts +479 -0
  283. package/src/core/objects/role/role.model.ts +344 -0
  284. package/src/core/objects/rule/changes/rule.alter.test.ts +78 -0
  285. package/src/core/objects/rule/changes/rule.alter.ts +72 -0
  286. package/src/core/objects/rule/changes/rule.base.ts +20 -0
  287. package/src/core/objects/rule/changes/rule.comment.test.ts +55 -0
  288. package/src/core/objects/rule/changes/rule.comment.ts +62 -0
  289. package/src/core/objects/rule/changes/rule.create.test.ts +59 -0
  290. package/src/core/objects/rule/changes/rule.create.ts +42 -0
  291. package/src/core/objects/rule/changes/rule.drop.test.ts +38 -0
  292. package/src/core/objects/rule/changes/rule.drop.ts +29 -0
  293. package/src/core/objects/rule/changes/rule.types.ts +12 -0
  294. package/src/core/objects/rule/rule.diff.test.ts +132 -0
  295. package/src/core/objects/rule/rule.diff.ts +79 -0
  296. package/src/core/objects/rule/rule.model.ts +173 -0
  297. package/src/core/objects/schema/changes/schema.alter.test.ts +28 -0
  298. package/src/core/objects/schema/changes/schema.alter.ts +45 -0
  299. package/src/core/objects/schema/changes/schema.base.ts +20 -0
  300. package/src/core/objects/schema/changes/schema.comment.ts +56 -0
  301. package/src/core/objects/schema/changes/schema.create.test.ts +22 -0
  302. package/src/core/objects/schema/changes/schema.create.ts +47 -0
  303. package/src/core/objects/schema/changes/schema.drop.test.ts +20 -0
  304. package/src/core/objects/schema/changes/schema.drop.ts +34 -0
  305. package/src/core/objects/schema/changes/schema.privilege.ts +175 -0
  306. package/src/core/objects/schema/changes/schema.types.ts +12 -0
  307. package/src/core/objects/schema/schema.diff.test.ts +42 -0
  308. package/src/core/objects/schema/schema.diff.ts +209 -0
  309. package/src/core/objects/schema/schema.model.ts +107 -0
  310. package/src/core/objects/sequence/changes/sequence.alter.test.ts +151 -0
  311. package/src/core/objects/sequence/changes/sequence.alter.ts +115 -0
  312. package/src/core/objects/sequence/changes/sequence.base.ts +20 -0
  313. package/src/core/objects/sequence/changes/sequence.comment.ts +60 -0
  314. package/src/core/objects/sequence/changes/sequence.create.test.ts +84 -0
  315. package/src/core/objects/sequence/changes/sequence.create.ts +111 -0
  316. package/src/core/objects/sequence/changes/sequence.drop.test.ts +32 -0
  317. package/src/core/objects/sequence/changes/sequence.drop.ts +37 -0
  318. package/src/core/objects/sequence/changes/sequence.privilege.ts +179 -0
  319. package/src/core/objects/sequence/changes/sequence.types.ts +12 -0
  320. package/src/core/objects/sequence/sequence.diff.test.ts +141 -0
  321. package/src/core/objects/sequence/sequence.diff.ts +359 -0
  322. package/src/core/objects/sequence/sequence.model.ts +185 -0
  323. package/src/core/objects/subscription/changes/subscription.alter.test.ts +124 -0
  324. package/src/core/objects/subscription/changes/subscription.alter.ts +110 -0
  325. package/src/core/objects/subscription/changes/subscription.base.ts +20 -0
  326. package/src/core/objects/subscription/changes/subscription.comment.test.ts +67 -0
  327. package/src/core/objects/subscription/changes/subscription.comment.ts +64 -0
  328. package/src/core/objects/subscription/changes/subscription.create.test.ts +77 -0
  329. package/src/core/objects/subscription/changes/subscription.create.ts +69 -0
  330. package/src/core/objects/subscription/changes/subscription.drop.test.ts +46 -0
  331. package/src/core/objects/subscription/changes/subscription.drop.ts +20 -0
  332. package/src/core/objects/subscription/changes/subscription.types.ts +22 -0
  333. package/src/core/objects/subscription/subscription.diff.test.ts +232 -0
  334. package/src/core/objects/subscription/subscription.diff.ts +241 -0
  335. package/src/core/objects/subscription/subscription.model.ts +190 -0
  336. package/src/core/objects/subscription/utils.ts +156 -0
  337. package/src/core/objects/table/changes/table.alter.test.ts +823 -0
  338. package/src/core/objects/table/changes/table.alter.ts +806 -0
  339. package/src/core/objects/table/changes/table.base.ts +20 -0
  340. package/src/core/objects/table/changes/table.comment.ts +266 -0
  341. package/src/core/objects/table/changes/table.create.test.ts +150 -0
  342. package/src/core/objects/table/changes/table.create.ts +188 -0
  343. package/src/core/objects/table/changes/table.drop.test.ts +34 -0
  344. package/src/core/objects/table/changes/table.drop.ts +45 -0
  345. package/src/core/objects/table/changes/table.privilege.ts +200 -0
  346. package/src/core/objects/table/changes/table.types.ts +12 -0
  347. package/src/core/objects/table/table.diff.test.ts +711 -0
  348. package/src/core/objects/table/table.diff.ts +953 -0
  349. package/src/core/objects/table/table.model.ts +460 -0
  350. package/src/core/objects/trigger/changes/trigger.alter.test.ts +46 -0
  351. package/src/core/objects/trigger/changes/trigger.alter.ts +76 -0
  352. package/src/core/objects/trigger/changes/trigger.base.ts +20 -0
  353. package/src/core/objects/trigger/changes/trigger.comment.ts +64 -0
  354. package/src/core/objects/trigger/changes/trigger.create.test.ts +43 -0
  355. package/src/core/objects/trigger/changes/trigger.create.ts +85 -0
  356. package/src/core/objects/trigger/changes/trigger.drop.test.ts +43 -0
  357. package/src/core/objects/trigger/changes/trigger.drop.ts +39 -0
  358. package/src/core/objects/trigger/changes/trigger.types.ts +10 -0
  359. package/src/core/objects/trigger/trigger.diff.test.ts +83 -0
  360. package/src/core/objects/trigger/trigger.diff.ts +116 -0
  361. package/src/core/objects/trigger/trigger.model.ts +252 -0
  362. package/src/core/objects/type/composite-type/changes/composite-type.alter.test.ts +202 -0
  363. package/src/core/objects/type/composite-type/changes/composite-type.alter.ts +174 -0
  364. package/src/core/objects/type/composite-type/changes/composite-type.base.ts +20 -0
  365. package/src/core/objects/type/composite-type/changes/composite-type.comment.ts +145 -0
  366. package/src/core/objects/type/composite-type/changes/composite-type.create.test.ts +101 -0
  367. package/src/core/objects/type/composite-type/changes/composite-type.create.ts +95 -0
  368. package/src/core/objects/type/composite-type/changes/composite-type.drop.test.ts +33 -0
  369. package/src/core/objects/type/composite-type/changes/composite-type.drop.ts +37 -0
  370. package/src/core/objects/type/composite-type/changes/composite-type.privilege.ts +175 -0
  371. package/src/core/objects/type/composite-type/changes/composite-type.types.ts +12 -0
  372. package/src/core/objects/type/composite-type/composite-type.diff.test.ts +191 -0
  373. package/src/core/objects/type/composite-type/composite-type.diff.ts +372 -0
  374. package/src/core/objects/type/composite-type/composite-type.model.ts +252 -0
  375. package/src/core/objects/type/enum/changes/enum.alter.test.ts +104 -0
  376. package/src/core/objects/type/enum/changes/enum.alter.ts +91 -0
  377. package/src/core/objects/type/enum/changes/enum.base.ts +20 -0
  378. package/src/core/objects/type/enum/changes/enum.comment.ts +64 -0
  379. package/src/core/objects/type/enum/changes/enum.create.test.ts +28 -0
  380. package/src/core/objects/type/enum/changes/enum.create.ts +56 -0
  381. package/src/core/objects/type/enum/changes/enum.drop.test.ts +25 -0
  382. package/src/core/objects/type/enum/changes/enum.drop.ts +34 -0
  383. package/src/core/objects/type/enum/changes/enum.privilege.ts +175 -0
  384. package/src/core/objects/type/enum/changes/enum.types.ts +12 -0
  385. package/src/core/objects/type/enum/enum.diff.test.ts +191 -0
  386. package/src/core/objects/type/enum/enum.diff.ts +396 -0
  387. package/src/core/objects/type/enum/enum.model.ts +194 -0
  388. package/src/core/objects/type/range/changes/range.alter.test.ts +27 -0
  389. package/src/core/objects/type/range/changes/range.alter.ts +51 -0
  390. package/src/core/objects/type/range/changes/range.base.ts +20 -0
  391. package/src/core/objects/type/range/changes/range.comment.ts +64 -0
  392. package/src/core/objects/type/range/changes/range.create.test.ts +51 -0
  393. package/src/core/objects/type/range/changes/range.create.ts +151 -0
  394. package/src/core/objects/type/range/changes/range.drop.test.ts +26 -0
  395. package/src/core/objects/type/range/changes/range.drop.ts +34 -0
  396. package/src/core/objects/type/range/changes/range.privilege.ts +175 -0
  397. package/src/core/objects/type/range/changes/range.types.ts +12 -0
  398. package/src/core/objects/type/range/range.diff.test.ts +70 -0
  399. package/src/core/objects/type/range/range.diff.ts +259 -0
  400. package/src/core/objects/type/range/range.model.ts +187 -0
  401. package/src/core/objects/type/type.types.ts +5 -0
  402. package/src/core/objects/utils.ts +171 -0
  403. package/src/core/objects/view/changes/view.alter.test.ts +110 -0
  404. package/src/core/objects/view/changes/view.alter.ts +112 -0
  405. package/src/core/objects/view/changes/view.base.ts +20 -0
  406. package/src/core/objects/view/changes/view.comment.ts +59 -0
  407. package/src/core/objects/view/changes/view.create.test.ts +65 -0
  408. package/src/core/objects/view/changes/view.create.ts +73 -0
  409. package/src/core/objects/view/changes/view.drop.test.ts +34 -0
  410. package/src/core/objects/view/changes/view.drop.ts +40 -0
  411. package/src/core/objects/view/changes/view.privilege.ts +200 -0
  412. package/src/core/objects/view/changes/view.types.ts +12 -0
  413. package/src/core/objects/view/view.diff.test.ts +91 -0
  414. package/src/core/objects/view/view.diff.ts +365 -0
  415. package/src/core/objects/view/view.model.ts +276 -0
  416. package/src/core/plan/apply.ts +190 -0
  417. package/src/core/plan/create.ts +432 -0
  418. package/src/core/plan/hierarchy.ts +574 -0
  419. package/src/core/plan/index.ts +29 -0
  420. package/src/core/plan/io.ts +20 -0
  421. package/src/core/plan/risk.ts +48 -0
  422. package/src/core/plan/serialize.ts +195 -0
  423. package/src/core/plan/sql-format/constants.ts +13 -0
  424. package/src/core/plan/sql-format/fixtures.ts +2806 -0
  425. package/src/core/plan/sql-format/format-comment-literals.test.ts +96 -0
  426. package/src/core/plan/sql-format/format-functions.test.ts +127 -0
  427. package/src/core/plan/sql-format/format-lowercase-coverage.test.ts +67 -0
  428. package/src/core/plan/sql-format/format-off.test.ts +809 -0
  429. package/src/core/plan/sql-format/format-pretty-lower-leading.test.ts +1056 -0
  430. package/src/core/plan/sql-format/format-pretty-narrow.test.ts +1283 -0
  431. package/src/core/plan/sql-format/format-pretty-preserve.test.ts +1052 -0
  432. package/src/core/plan/sql-format/format-pretty-upper.test.ts +1045 -0
  433. package/src/core/plan/sql-format/format-stress.test.ts +616 -0
  434. package/src/core/plan/sql-format/format-utils.test.ts +91 -0
  435. package/src/core/plan/sql-format/format-utils.ts +391 -0
  436. package/src/core/plan/sql-format/formatters.ts +921 -0
  437. package/src/core/plan/sql-format/index.ts +149 -0
  438. package/src/core/plan/sql-format/keyword-case.test.ts +118 -0
  439. package/src/core/plan/sql-format/keyword-case.ts +1085 -0
  440. package/src/core/plan/sql-format/protect.test.ts +127 -0
  441. package/src/core/plan/sql-format/protect.ts +337 -0
  442. package/src/core/plan/sql-format/sql-scanner.test.ts +240 -0
  443. package/src/core/plan/sql-format/sql-scanner.ts +252 -0
  444. package/src/core/plan/sql-format/tokenizer.test.ts +68 -0
  445. package/src/core/plan/sql-format/tokenizer.ts +152 -0
  446. package/src/core/plan/sql-format/types.ts +31 -0
  447. package/src/core/plan/sql-format/wrap.test.ts +119 -0
  448. package/src/core/plan/sql-format/wrap.ts +196 -0
  449. package/src/core/plan/sql-format.ts +2 -0
  450. package/src/core/plan/statements.ts +22 -0
  451. package/src/core/plan/types.ts +165 -0
  452. package/src/core/postgres-config.ts +169 -0
  453. package/src/core/sort/custom-constraints.ts +161 -0
  454. package/src/core/sort/debug-visualization.ts +239 -0
  455. package/src/core/sort/dependency-filter.ts +224 -0
  456. package/src/core/sort/graph-builder.ts +223 -0
  457. package/src/core/sort/graph-utils.ts +51 -0
  458. package/src/core/sort/logical-sort.ts +590 -0
  459. package/src/core/sort/sort-changes.ts +234 -0
  460. package/src/core/sort/topological-sort.ts +184 -0
  461. package/src/core/sort/types.ts +112 -0
  462. package/src/core/sort/utils.ts +69 -0
  463. package/src/index.ts +14 -0
@@ -0,0 +1,204 @@
1
+ /**
2
+ * Filter DSL - A serializable domain-specific language for change filtering.
3
+ */
4
+
5
+ import type { Change } from "../../change.types.ts";
6
+ import { PROPERTY_EXTRACTORS } from "./extractors.ts";
7
+ import type { ChangeFilter } from "./filter.types.ts";
8
+
9
+ /**
10
+ * Core properties that all changes have.
11
+ */
12
+ type CoreProperties = {
13
+ type?: Change["objectType"];
14
+ operation?: "create" | "alter" | "drop";
15
+ scope?: Change["scope"];
16
+ };
17
+
18
+ /**
19
+ * Extracted properties that are extracted from changes via extractor functions.
20
+ * String value = exact match, Array value = value must be in array
21
+ */
22
+ type ExtractedProperties = {
23
+ schema?: string | string[];
24
+ owner?: string | string[];
25
+ member?: string | string[];
26
+ };
27
+
28
+ /**
29
+ * Property pattern - matches against change properties.
30
+ * Multiple properties are combined with AND (all must match).
31
+ */
32
+ type PropertyPattern = CoreProperties &
33
+ ExtractedProperties & {
34
+ // Composition operators are NOT allowed in property patterns
35
+ and?: never;
36
+ or?: never;
37
+ not?: never;
38
+ };
39
+
40
+ /**
41
+ * Composition pattern - combines other patterns using logical operators.
42
+ * Composition operators are exclusive - cannot be mixed with properties.
43
+ */
44
+ type CompositionPattern =
45
+ | ({
46
+ and: FilterPattern[];
47
+ or?: never;
48
+ not?: never;
49
+ } & {
50
+ [K in keyof CoreProperties]?: never;
51
+ } & {
52
+ [K in keyof ExtractedProperties]?: never;
53
+ })
54
+ | ({
55
+ or: FilterPattern[];
56
+ and?: never;
57
+ not?: never;
58
+ } & {
59
+ [K in keyof CoreProperties]?: never;
60
+ } & {
61
+ [K in keyof ExtractedProperties]?: never;
62
+ })
63
+ | ({
64
+ not: FilterPattern;
65
+ and?: never;
66
+ or?: never;
67
+ } & {
68
+ [K in keyof CoreProperties]?: never;
69
+ } & {
70
+ [K in keyof ExtractedProperties]?: never;
71
+ });
72
+
73
+ /**
74
+ * Filter pattern DSL.
75
+ * Either a property pattern (matches against change properties) or
76
+ * a composition pattern (combines other patterns using logical operators).
77
+ * Composition operators are exclusive - cannot be mixed with properties.
78
+ */
79
+ export type FilterPattern = PropertyPattern | CompositionPattern;
80
+
81
+ /**
82
+ * Filter DSL - a single pattern expression.
83
+ */
84
+ export type FilterDSL = FilterPattern;
85
+
86
+ /**
87
+ * Evaluate a pattern against a change.
88
+ *
89
+ * @param pattern - The pattern to evaluate
90
+ * @param change - The change to match against
91
+ * @returns true if the pattern matches, false otherwise
92
+ */
93
+ export function evaluatePattern(
94
+ pattern: FilterPattern,
95
+ change: Change,
96
+ ): boolean {
97
+ // Handle composition operators first (they take precedence)
98
+
99
+ // NOT operator - negate the result
100
+ if (pattern.not) {
101
+ return !evaluatePattern(pattern.not, change);
102
+ }
103
+
104
+ // AND operator - all patterns must match
105
+ if (pattern.and) {
106
+ return pattern.and.every((p) => evaluatePattern(p, change));
107
+ }
108
+
109
+ // OR operator - any pattern must match
110
+ if (pattern.or) {
111
+ return pattern.or.some((p) => evaluatePattern(p, change));
112
+ }
113
+
114
+ // Evaluate basic pattern matching
115
+ // Multiple properties in a pattern are combined with AND (all must match)
116
+
117
+ // Match objectType
118
+ if (pattern.type) {
119
+ if (change.objectType !== pattern.type) {
120
+ return false;
121
+ }
122
+ }
123
+
124
+ // Match operation
125
+ if (pattern.operation) {
126
+ if (change.operation !== pattern.operation) {
127
+ return false;
128
+ }
129
+ }
130
+
131
+ // Match scope
132
+ if (pattern.scope) {
133
+ if (change.scope !== pattern.scope) {
134
+ return false;
135
+ }
136
+ }
137
+
138
+ // Match extracted properties
139
+ for (const [key, value] of Object.entries(pattern)) {
140
+ // Skip composition operators and core properties
141
+ if (["and", "or", "not", "type", "operation", "scope"].includes(key)) {
142
+ continue;
143
+ }
144
+
145
+ // Check if this is a registered property extractor
146
+ const extractor = PROPERTY_EXTRACTORS[key];
147
+ if (!extractor) {
148
+ // Unknown property - ignore
149
+ continue;
150
+ }
151
+
152
+ // Extract the actual value from the change
153
+ const actualValue = extractor(change);
154
+
155
+ // Property matching rules:
156
+ // - String value: exact match
157
+ // - Array value: value must be in array
158
+ // - Missing properties (null) don't match
159
+
160
+ if (actualValue === null) {
161
+ return false;
162
+ }
163
+
164
+ if (typeof value === "string") {
165
+ // Exact match
166
+ if (actualValue !== value) {
167
+ return false;
168
+ }
169
+ } else if (Array.isArray(value)) {
170
+ // Value must be in array
171
+ if (!value.includes(actualValue)) {
172
+ return false;
173
+ }
174
+ } else {
175
+ // Invalid value type - don't match
176
+ return false;
177
+ }
178
+ }
179
+
180
+ // All checks passed
181
+ return true;
182
+ }
183
+
184
+ /**
185
+ * Compile a Filter DSL to a ChangeFilter function.
186
+ *
187
+ * @param dsl - The filter DSL pattern
188
+ * @returns A ChangeFilter function that evaluates the pattern
189
+ *
190
+ * @example
191
+ * ```ts
192
+ * const filter = compileFilterDSL({
193
+ * or: [
194
+ * { type: "schema", operation: "create" },
195
+ * { schema: "public" }
196
+ * ]
197
+ * });
198
+ * ```
199
+ */
200
+ export function compileFilterDSL(dsl: FilterDSL): ChangeFilter {
201
+ return (change: Change): boolean => {
202
+ return evaluatePattern(dsl, change);
203
+ };
204
+ }
@@ -0,0 +1,145 @@
1
+ import type { Change } from "../../change.types.ts";
2
+
3
+ /**
4
+ * Property extractor function that extracts a value from a change.
5
+ */
6
+ type PropertyExtractor = (change: Change) => string | null;
7
+
8
+ /**
9
+ * Registry of property extractors.
10
+ * Maps property names to extractor functions.
11
+ */
12
+ export const PROPERTY_EXTRACTORS: Record<string, PropertyExtractor> = {
13
+ schema: getSchema,
14
+ owner: getOwner,
15
+ member: (change: Change) => {
16
+ if (change.scope === "membership") {
17
+ return change.member;
18
+ }
19
+ return null;
20
+ },
21
+ };
22
+
23
+ export function getSchema(change: Change) {
24
+ switch (change.objectType) {
25
+ case "aggregate":
26
+ return change.aggregate.schema;
27
+ case "collation":
28
+ return change.collation.schema;
29
+ case "composite_type":
30
+ return change.compositeType.schema;
31
+ case "domain":
32
+ return change.domain.schema;
33
+ case "enum":
34
+ return change.enum.schema;
35
+ case "event_trigger":
36
+ return null;
37
+ case "extension":
38
+ return change.extension.schema;
39
+ case "index":
40
+ return change.index.schema;
41
+ case "language":
42
+ return null;
43
+ case "materialized_view":
44
+ return change.materializedView.schema;
45
+ case "procedure":
46
+ return change.procedure.schema;
47
+ case "publication":
48
+ return null;
49
+ case "range":
50
+ return change.range.schema;
51
+ case "rls_policy":
52
+ return change.policy.schema;
53
+ case "role":
54
+ return null;
55
+ case "rule":
56
+ return change.rule.schema;
57
+ case "schema":
58
+ return change.schema.name;
59
+ case "sequence":
60
+ return change.sequence.schema;
61
+ case "subscription":
62
+ return null;
63
+ case "table":
64
+ return change.table.schema;
65
+ case "trigger":
66
+ return change.trigger.schema;
67
+ case "view":
68
+ return change.view.schema;
69
+ case "foreign_data_wrapper":
70
+ return null;
71
+ case "server":
72
+ return null;
73
+ case "user_mapping":
74
+ return null;
75
+ case "foreign_table":
76
+ return change.foreignTable.schema;
77
+ default: {
78
+ // exhaustiveness check
79
+ const _exhaustive: never = change;
80
+ return _exhaustive;
81
+ }
82
+ }
83
+ }
84
+
85
+ function getOwner(change: Change) {
86
+ switch (change.objectType) {
87
+ case "aggregate":
88
+ return change.aggregate.owner;
89
+ case "collation":
90
+ return change.collation.owner;
91
+ case "composite_type":
92
+ return change.compositeType.owner;
93
+ case "domain":
94
+ return change.domain.owner;
95
+ case "enum":
96
+ return change.enum.owner;
97
+ case "event_trigger":
98
+ return change.eventTrigger.owner;
99
+ case "extension":
100
+ return change.extension.owner;
101
+ case "index":
102
+ return change.index.owner;
103
+ case "language":
104
+ return change.language.owner;
105
+ case "materialized_view":
106
+ return change.materializedView.owner;
107
+ case "procedure":
108
+ return change.procedure.owner;
109
+ case "publication":
110
+ return change.publication.owner;
111
+ case "range":
112
+ return change.range.owner;
113
+ case "rls_policy":
114
+ return change.policy.owner;
115
+ case "role":
116
+ return change.role.name;
117
+ case "rule":
118
+ return change.rule.owner;
119
+ case "schema":
120
+ return change.schema.owner;
121
+ case "sequence":
122
+ return change.sequence.owner;
123
+ case "subscription":
124
+ return change.subscription.owner;
125
+ case "table":
126
+ return change.table.owner;
127
+ case "trigger":
128
+ return change.trigger.owner;
129
+ case "view":
130
+ return change.view.owner;
131
+ case "foreign_data_wrapper":
132
+ return change.foreignDataWrapper.owner;
133
+ case "server":
134
+ return change.server.owner;
135
+ case "user_mapping":
136
+ return null;
137
+ case "foreign_table":
138
+ return change.foreignTable.owner;
139
+ default: {
140
+ // exhaustiveness check
141
+ const _exhaustive: never = change;
142
+ return _exhaustive;
143
+ }
144
+ }
145
+ }
@@ -0,0 +1,3 @@
1
+ import type { Change } from "../../change.types.ts";
2
+
3
+ export type ChangeFilter = (change: Change) => boolean;
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Integration DSL - A serializable domain-specific language for integrations.
3
+ *
4
+ * Combines filter and serialization DSLs into a single serializable structure.
5
+ */
6
+
7
+ import type { FilterDSL } from "./filter/dsl.ts";
8
+ import type { SerializeDSL } from "./serialize/dsl.ts";
9
+
10
+ /**
11
+ * Integration DSL - serializable representation of an integration.
12
+ */
13
+ export type IntegrationDSL = {
14
+ /**
15
+ * Filter DSL - determines which changes to include/exclude.
16
+ * If not provided, all changes are included.
17
+ */
18
+ filter?: FilterDSL;
19
+ /**
20
+ * Serialization DSL - customizes how changes are serialized.
21
+ * If not provided, changes are serialized with default options.
22
+ */
23
+ serialize?: SerializeDSL;
24
+ };
@@ -0,0 +1,7 @@
1
+ import type { ChangeFilter } from "./filter/filter.types.ts";
2
+ import type { ChangeSerializer } from "./serialize/serialize.types.ts";
3
+
4
+ export type Integration = {
5
+ filter?: ChangeFilter;
6
+ serialize?: ChangeSerializer;
7
+ };
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Serialization DSL - A serializable domain-specific language for customizing change serialization.
3
+ *
4
+ * Reuses the filter pattern matching logic to determine when to apply serialization options.
5
+ */
6
+
7
+ import type { Change } from "../../change.types.ts";
8
+ import { evaluatePattern, type FilterPattern } from "../filter/dsl.ts";
9
+ import type { ChangeSerializer } from "./serialize.types.ts";
10
+
11
+ /**
12
+ * Serialization options that can be passed to change.serialize().
13
+ */
14
+ type SerializeOptions = {
15
+ skipAuthorization?: boolean;
16
+ // Can be extended with more options in the future
17
+ [key: string]: unknown;
18
+ };
19
+
20
+ /**
21
+ * A serialization rule that applies options when a pattern matches.
22
+ */
23
+ type SerializeRule = {
24
+ /**
25
+ * Pattern to match against changes.
26
+ * Uses the same pattern matching logic as filters.
27
+ */
28
+ when: FilterPattern;
29
+ /**
30
+ * Serialization options to apply when the pattern matches.
31
+ */
32
+ options: SerializeOptions;
33
+ };
34
+
35
+ /**
36
+ * Serialization DSL - array of rules evaluated in order.
37
+ * First matching rule's options are applied.
38
+ */
39
+ export type SerializeDSL = SerializeRule[];
40
+
41
+ /**
42
+ * Compile a Serialization DSL to a ChangeSerializer function.
43
+ *
44
+ * Rules are evaluated in order, and the first matching rule's options are applied.
45
+ * If no rule matches, the change is serialized with default options.
46
+ *
47
+ * @param dsl - The serialization DSL
48
+ * @returns A ChangeSerializer function that applies the rules
49
+ *
50
+ * @example
51
+ * ```ts
52
+ * const serializer = compileSerializeDSL([
53
+ * {
54
+ * when: {
55
+ * type: "schema",
56
+ * operation: "create",
57
+ * owner: ["service_role"]
58
+ * },
59
+ * options: { skipAuthorization: true }
60
+ * }
61
+ * ]);
62
+ * ```
63
+ */
64
+ export function compileSerializeDSL(dsl: SerializeDSL): ChangeSerializer {
65
+ return (change: Change): string | undefined => {
66
+ // Find first matching rule
67
+ for (const rule of dsl) {
68
+ if (evaluatePattern(rule.when, change)) {
69
+ // Apply this rule's options
70
+ return change.serialize(rule.options);
71
+ }
72
+ }
73
+
74
+ // No rule matched - use default serialization
75
+ return change.serialize();
76
+ };
77
+ }
@@ -0,0 +1,3 @@
1
+ import type { Change } from "../../change.types.ts";
2
+
3
+ export type ChangeSerializer = (change: Change) => string | undefined;
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Supabase integration - filtering and serialization rules for Supabase databases.
3
+ *
4
+ * This integration:
5
+ * - Filters out Supabase system schemas and roles
6
+ * - Includes user schemas and extensions
7
+ * - Skips authorization for schema creates owned by Supabase system roles
8
+ */
9
+
10
+ import type { IntegrationDSL } from "./integration-dsl.ts";
11
+
12
+ // Supabase system schemas that should be excluded
13
+ const SUPABASE_SYSTEM_SCHEMAS = [
14
+ "_analytics",
15
+ "_realtime",
16
+ "_supavisor",
17
+ "auth",
18
+ "cron",
19
+ "extensions",
20
+ "graphql",
21
+ "graphql_public",
22
+ "information_schema",
23
+ "net",
24
+ "pgbouncer",
25
+ "pgmq",
26
+ "pgmq_public",
27
+ "pgsodium",
28
+ "pgsodium_masks",
29
+ "pgtle",
30
+ "realtime",
31
+ "storage",
32
+ "supabase_functions",
33
+ "supabase_migrations",
34
+ "vault",
35
+ ] as const;
36
+
37
+ // Supabase system roles that should be excluded
38
+ const SUPABASE_SYSTEM_ROLES = [
39
+ "anon",
40
+ "authenticated",
41
+ "authenticator",
42
+ "cli_login_postgres",
43
+ "dashboard_user",
44
+ "pgbouncer",
45
+ "pgsodium_keyholder",
46
+ "pgsodium_keyiduser",
47
+ "pgsodium_keymaker",
48
+ "pgtle_admin",
49
+ "service_role",
50
+ "supabase_admin",
51
+ "supabase_auth_admin",
52
+ "supabase_etl_admin",
53
+ "supabase_functions_admin",
54
+ "supabase_read_only_user",
55
+ "supabase_realtime_admin",
56
+ "supabase_replication_admin",
57
+ "supabase_storage_admin",
58
+ "supabase_superuser",
59
+ ] as const;
60
+
61
+ export const supabase: IntegrationDSL = {
62
+ filter: {
63
+ or: [
64
+ {
65
+ and: [
66
+ {
67
+ type: "schema",
68
+ operation: "create",
69
+ scope: "object",
70
+ },
71
+ {
72
+ not: {
73
+ schema: [...SUPABASE_SYSTEM_SCHEMAS],
74
+ },
75
+ },
76
+ ],
77
+ },
78
+ {
79
+ type: "extension",
80
+ operation: "create",
81
+ scope: "object",
82
+ },
83
+ {
84
+ not: {
85
+ or: [
86
+ {
87
+ schema: [...SUPABASE_SYSTEM_SCHEMAS],
88
+ },
89
+ {
90
+ owner: [...SUPABASE_SYSTEM_ROLES],
91
+ },
92
+ {
93
+ and: [
94
+ {
95
+ type: "role",
96
+ scope: "membership",
97
+ },
98
+ {
99
+ member: [...SUPABASE_SYSTEM_ROLES],
100
+ },
101
+ ],
102
+ },
103
+ ],
104
+ },
105
+ },
106
+ ],
107
+ },
108
+ serialize: [
109
+ {
110
+ when: {
111
+ type: "schema",
112
+ operation: "create",
113
+ scope: "object",
114
+ owner: [...SUPABASE_SYSTEM_ROLES],
115
+ },
116
+ options: {
117
+ skipAuthorization: true,
118
+ },
119
+ },
120
+ ],
121
+ };