@supabase/pg-delta 1.0.0-alpha.2 → 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 (464) 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/integrations/supabase.js +2 -0
  7. package/dist/core/objects/table/table.model.d.ts +4 -2
  8. package/dist/core/objects/table/table.model.js +3 -0
  9. package/dist/core/objects/trigger/changes/trigger.alter.js +23 -0
  10. package/dist/core/objects/trigger/changes/trigger.create.js +2 -1
  11. package/dist/core/objects/trigger/trigger.model.d.ts +1 -0
  12. package/dist/core/objects/trigger/trigger.model.js +3 -0
  13. package/dist/core/plan/apply.js +3 -3
  14. package/dist/core/plan/create.js +34 -15
  15. package/dist/core/plan/sql-format/constants.d.ts +2 -0
  16. package/dist/core/plan/sql-format/constants.js +11 -0
  17. package/dist/core/plan/sql-format/fixtures.d.ts +2 -0
  18. package/dist/core/plan/sql-format/fixtures.js +2449 -0
  19. package/dist/core/plan/sql-format/format-utils.d.ts +37 -0
  20. package/dist/core/plan/sql-format/format-utils.js +274 -0
  21. package/dist/core/plan/sql-format/formatters.d.ts +20 -0
  22. package/dist/core/plan/sql-format/formatters.js +737 -0
  23. package/dist/core/plan/sql-format/index.d.ts +2 -0
  24. package/dist/core/plan/sql-format/index.js +98 -0
  25. package/dist/core/plan/sql-format/keyword-case.d.ts +2 -0
  26. package/dist/core/plan/sql-format/keyword-case.js +868 -0
  27. package/dist/core/plan/sql-format/protect.d.ts +3 -0
  28. package/dist/core/plan/sql-format/protect.js +269 -0
  29. package/dist/core/plan/sql-format/sql-scanner.d.ts +59 -0
  30. package/dist/core/plan/sql-format/sql-scanner.js +202 -0
  31. package/dist/core/plan/sql-format/tokenizer.d.ts +22 -0
  32. package/dist/core/plan/sql-format/tokenizer.js +118 -0
  33. package/dist/core/plan/sql-format/types.d.ts +28 -0
  34. package/dist/core/plan/sql-format/types.js +1 -0
  35. package/dist/core/plan/sql-format/wrap.d.ts +2 -0
  36. package/dist/core/plan/sql-format/wrap.js +165 -0
  37. package/dist/core/plan/sql-format.d.ts +2 -0
  38. package/dist/core/plan/sql-format.js +1 -0
  39. package/dist/core/plan/statements.d.ts +2 -1
  40. package/dist/core/plan/statements.js +6 -2
  41. package/dist/core/postgres-config.d.ts +15 -0
  42. package/dist/core/postgres-config.js +30 -0
  43. package/dist/index.d.ts +2 -0
  44. package/dist/index.js +1 -0
  45. package/package.json +37 -22
  46. package/src/cli/app.ts +28 -0
  47. package/src/cli/bin/cli.ts +9 -0
  48. package/src/cli/commands/apply.ts +101 -0
  49. package/src/cli/commands/plan.ts +195 -0
  50. package/src/cli/commands/sync.ts +185 -0
  51. package/src/cli/formatters/index.ts +5 -0
  52. package/src/cli/formatters/tree/tree-builder.ts +380 -0
  53. package/src/cli/formatters/tree/tree-renderer.ts +372 -0
  54. package/src/cli/formatters/tree/tree.ts +237 -0
  55. package/src/cli/utils/integrations.ts +42 -0
  56. package/src/cli/utils.ts +231 -0
  57. package/src/core/catalog.diff.ts +246 -0
  58. package/src/core/catalog.model.ts +384 -0
  59. package/src/core/change.types.ts +44 -0
  60. package/src/core/context.ts +26 -0
  61. package/src/core/depend.ts +1870 -0
  62. package/src/core/expand-replace-dependencies.ts +380 -0
  63. package/src/core/fingerprint.ts +204 -0
  64. package/src/core/integrations/filter/dsl.ts +204 -0
  65. package/src/core/integrations/filter/extractors.ts +145 -0
  66. package/src/core/integrations/filter/filter.types.ts +3 -0
  67. package/src/core/integrations/integration-dsl.ts +24 -0
  68. package/src/core/integrations/integration.types.ts +7 -0
  69. package/src/core/integrations/serialize/dsl.ts +77 -0
  70. package/src/core/integrations/serialize/serialize.types.ts +3 -0
  71. package/src/core/integrations/supabase.ts +121 -0
  72. package/src/core/objects/aggregate/aggregate.diff.test.ts +215 -0
  73. package/src/core/objects/aggregate/aggregate.diff.ts +278 -0
  74. package/src/core/objects/aggregate/aggregate.model.ts +317 -0
  75. package/src/core/objects/aggregate/changes/aggregate.alter.test.ts +64 -0
  76. package/src/core/objects/aggregate/changes/aggregate.alter.ts +32 -0
  77. package/src/core/objects/aggregate/changes/aggregate.base.ts +20 -0
  78. package/src/core/objects/aggregate/changes/aggregate.comment.test.ts +86 -0
  79. package/src/core/objects/aggregate/changes/aggregate.comment.ts +62 -0
  80. package/src/core/objects/aggregate/changes/aggregate.create.test.ts +101 -0
  81. package/src/core/objects/aggregate/changes/aggregate.create.ts +329 -0
  82. package/src/core/objects/aggregate/changes/aggregate.drop.test.ts +78 -0
  83. package/src/core/objects/aggregate/changes/aggregate.drop.ts +32 -0
  84. package/src/core/objects/aggregate/changes/aggregate.privilege.test.ts +130 -0
  85. package/src/core/objects/aggregate/changes/aggregate.privilege.ts +146 -0
  86. package/src/core/objects/aggregate/changes/aggregate.types.ts +12 -0
  87. package/src/core/objects/base.change.ts +62 -0
  88. package/src/core/objects/base.default-privileges.ts +204 -0
  89. package/src/core/objects/base.diff.ts +20 -0
  90. package/src/core/objects/base.model.ts +82 -0
  91. package/src/core/objects/base.privilege-diff.ts +299 -0
  92. package/src/core/objects/base.privilege.ts +184 -0
  93. package/src/core/objects/collation/changes/collation.alter.test.ts +63 -0
  94. package/src/core/objects/collation/changes/collation.alter.ts +79 -0
  95. package/src/core/objects/collation/changes/collation.base.ts +20 -0
  96. package/src/core/objects/collation/changes/collation.comment.ts +68 -0
  97. package/src/core/objects/collation/changes/collation.create.test.ts +51 -0
  98. package/src/core/objects/collation/changes/collation.create.ts +106 -0
  99. package/src/core/objects/collation/changes/collation.drop.test.ts +28 -0
  100. package/src/core/objects/collation/changes/collation.drop.ts +37 -0
  101. package/src/core/objects/collation/changes/collation.types.ts +10 -0
  102. package/src/core/objects/collation/collation.diff.test.ts +100 -0
  103. package/src/core/objects/collation/collation.diff.ts +126 -0
  104. package/src/core/objects/collation/collation.model.ts +224 -0
  105. package/src/core/objects/domain/changes/domain.alter.test.ts +316 -0
  106. package/src/core/objects/domain/changes/domain.alter.ts +286 -0
  107. package/src/core/objects/domain/changes/domain.base.ts +20 -0
  108. package/src/core/objects/domain/changes/domain.comment.ts +59 -0
  109. package/src/core/objects/domain/changes/domain.create.test.ts +65 -0
  110. package/src/core/objects/domain/changes/domain.create.ts +118 -0
  111. package/src/core/objects/domain/changes/domain.drop.test.ts +30 -0
  112. package/src/core/objects/domain/changes/domain.drop.ts +34 -0
  113. package/src/core/objects/domain/changes/domain.privilege.ts +171 -0
  114. package/src/core/objects/domain/changes/domain.types.ts +12 -0
  115. package/src/core/objects/domain/domain.diff.test.ts +284 -0
  116. package/src/core/objects/domain/domain.diff.ts +358 -0
  117. package/src/core/objects/domain/domain.model.ts +190 -0
  118. package/src/core/objects/event-trigger/changes/event-trigger.alter.test.ts +50 -0
  119. package/src/core/objects/event-trigger/changes/event-trigger.alter.ts +82 -0
  120. package/src/core/objects/event-trigger/changes/event-trigger.base.ts +20 -0
  121. package/src/core/objects/event-trigger/changes/event-trigger.comment.ts +66 -0
  122. package/src/core/objects/event-trigger/changes/event-trigger.create.test.ts +24 -0
  123. package/src/core/objects/event-trigger/changes/event-trigger.create.ts +72 -0
  124. package/src/core/objects/event-trigger/changes/event-trigger.drop.test.ts +22 -0
  125. package/src/core/objects/event-trigger/changes/event-trigger.drop.ts +34 -0
  126. package/src/core/objects/event-trigger/changes/event-trigger.types.ts +10 -0
  127. package/src/core/objects/event-trigger/event-trigger.diff.test.ts +126 -0
  128. package/src/core/objects/event-trigger/event-trigger.diff.ts +126 -0
  129. package/src/core/objects/event-trigger/event-trigger.model.ts +106 -0
  130. package/src/core/objects/extension/changes/extension.alter.test.ts +58 -0
  131. package/src/core/objects/extension/changes/extension.alter.ts +78 -0
  132. package/src/core/objects/extension/changes/extension.base.ts +20 -0
  133. package/src/core/objects/extension/changes/extension.comment.ts +64 -0
  134. package/src/core/objects/extension/changes/extension.create.test.ts +25 -0
  135. package/src/core/objects/extension/changes/extension.create.ts +63 -0
  136. package/src/core/objects/extension/changes/extension.drop.test.ts +23 -0
  137. package/src/core/objects/extension/changes/extension.drop.ts +34 -0
  138. package/src/core/objects/extension/changes/extension.types.ts +10 -0
  139. package/src/core/objects/extension/extension.diff.test.ts +42 -0
  140. package/src/core/objects/extension/extension.diff.ts +90 -0
  141. package/src/core/objects/extension/extension.model.ts +280 -0
  142. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.test.ts +125 -0
  143. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.ts +101 -0
  144. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.base.ts +20 -0
  145. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.ts +72 -0
  146. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.test.ts +125 -0
  147. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.ts +95 -0
  148. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.test.ts +23 -0
  149. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.ts +36 -0
  150. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.ts +172 -0
  151. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.ts +12 -0
  152. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.test.ts +179 -0
  153. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.ts +341 -0
  154. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.ts +149 -0
  155. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.ts +10 -0
  156. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.test.ts +309 -0
  157. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.ts +341 -0
  158. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.base.ts +20 -0
  159. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.ts +72 -0
  160. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.test.ts +201 -0
  161. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.ts +81 -0
  162. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.test.ts +43 -0
  163. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.ts +37 -0
  164. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.ts +181 -0
  165. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.ts +12 -0
  166. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.test.ts +813 -0
  167. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.ts +406 -0
  168. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.ts +242 -0
  169. package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.test.ts +168 -0
  170. package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.ts +126 -0
  171. package/src/core/objects/foreign-data-wrapper/server/changes/server.base.ts +20 -0
  172. package/src/core/objects/foreign-data-wrapper/server/changes/server.comment.ts +60 -0
  173. package/src/core/objects/foreign-data-wrapper/server/changes/server.create.test.ts +131 -0
  174. package/src/core/objects/foreign-data-wrapper/server/changes/server.create.ts +81 -0
  175. package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.test.ts +24 -0
  176. package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.ts +34 -0
  177. package/src/core/objects/foreign-data-wrapper/server/changes/server.privilege.ts +164 -0
  178. package/src/core/objects/foreign-data-wrapper/server/changes/server.types.ts +12 -0
  179. package/src/core/objects/foreign-data-wrapper/server/server.diff.test.ts +167 -0
  180. package/src/core/objects/foreign-data-wrapper/server/server.diff.ts +317 -0
  181. package/src/core/objects/foreign-data-wrapper/server/server.model.ts +133 -0
  182. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.test.ts +82 -0
  183. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.ts +69 -0
  184. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.base.ts +20 -0
  185. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.test.ts +85 -0
  186. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.ts +66 -0
  187. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.test.ts +53 -0
  188. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.ts +40 -0
  189. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.ts +8 -0
  190. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.test.ts +77 -0
  191. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.ts +107 -0
  192. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.ts +96 -0
  193. package/src/core/objects/index/changes/index.alter.test.ts +200 -0
  194. package/src/core/objects/index/changes/index.alter.ts +144 -0
  195. package/src/core/objects/index/changes/index.base.ts +20 -0
  196. package/src/core/objects/index/changes/index.comment.ts +63 -0
  197. package/src/core/objects/index/changes/index.create.test.ts +66 -0
  198. package/src/core/objects/index/changes/index.create.ts +68 -0
  199. package/src/core/objects/index/changes/index.drop.test.ts +44 -0
  200. package/src/core/objects/index/changes/index.drop.ts +34 -0
  201. package/src/core/objects/index/changes/index.types.ts +6 -0
  202. package/src/core/objects/index/changes/utils.ts +16 -0
  203. package/src/core/objects/index/index.diff.test.ts +153 -0
  204. package/src/core/objects/index/index.diff.ts +243 -0
  205. package/src/core/objects/index/index.model.ts +370 -0
  206. package/src/core/objects/language/changes/language.alter.test.ts +33 -0
  207. package/src/core/objects/language/changes/language.alter.ts +53 -0
  208. package/src/core/objects/language/changes/language.base.ts +20 -0
  209. package/src/core/objects/language/changes/language.comment.ts +58 -0
  210. package/src/core/objects/language/changes/language.create.test.ts +27 -0
  211. package/src/core/objects/language/changes/language.create.ts +104 -0
  212. package/src/core/objects/language/changes/language.drop.test.ts +25 -0
  213. package/src/core/objects/language/changes/language.drop.ts +39 -0
  214. package/src/core/objects/language/changes/language.privilege.ts +172 -0
  215. package/src/core/objects/language/changes/language.types.ts +12 -0
  216. package/src/core/objects/language/language.diff.test.ts +53 -0
  217. package/src/core/objects/language/language.diff.ts +176 -0
  218. package/src/core/objects/language/language.model.ts +150 -0
  219. package/src/core/objects/materialized-view/changes/materialized-view.alter.test.ts +123 -0
  220. package/src/core/objects/materialized-view/changes/materialized-view.alter.ts +113 -0
  221. package/src/core/objects/materialized-view/changes/materialized-view.base.ts +20 -0
  222. package/src/core/objects/materialized-view/changes/materialized-view.comment.ts +176 -0
  223. package/src/core/objects/materialized-view/changes/materialized-view.create.test.ts +64 -0
  224. package/src/core/objects/materialized-view/changes/materialized-view.create.ts +93 -0
  225. package/src/core/objects/materialized-view/changes/materialized-view.drop.test.ts +34 -0
  226. package/src/core/objects/materialized-view/changes/materialized-view.drop.ts +60 -0
  227. package/src/core/objects/materialized-view/changes/materialized-view.privilege.ts +212 -0
  228. package/src/core/objects/materialized-view/changes/materialized-view.types.ts +12 -0
  229. package/src/core/objects/materialized-view/materialized-view.diff.test.ts +102 -0
  230. package/src/core/objects/materialized-view/materialized-view.diff.ts +451 -0
  231. package/src/core/objects/materialized-view/materialized-view.model.ts +258 -0
  232. package/src/core/objects/procedure/changes/procedure.alter.test.ts +1005 -0
  233. package/src/core/objects/procedure/changes/procedure.alter.ts +287 -0
  234. package/src/core/objects/procedure/changes/procedure.base.ts +20 -0
  235. package/src/core/objects/procedure/changes/procedure.comment.ts +70 -0
  236. package/src/core/objects/procedure/changes/procedure.create.test.ts +48 -0
  237. package/src/core/objects/procedure/changes/procedure.create.ts +92 -0
  238. package/src/core/objects/procedure/changes/procedure.drop.test.ts +85 -0
  239. package/src/core/objects/procedure/changes/procedure.drop.ts +49 -0
  240. package/src/core/objects/procedure/changes/procedure.privilege.ts +188 -0
  241. package/src/core/objects/procedure/changes/procedure.types.ts +12 -0
  242. package/src/core/objects/procedure/procedure.diff.test.ts +161 -0
  243. package/src/core/objects/procedure/procedure.diff.ts +404 -0
  244. package/src/core/objects/procedure/procedure.model.ts +264 -0
  245. package/src/core/objects/procedure/utils.ts +58 -0
  246. package/src/core/objects/publication/changes/publication.alter.test.ts +223 -0
  247. package/src/core/objects/publication/changes/publication.alter.ts +243 -0
  248. package/src/core/objects/publication/changes/publication.base.ts +20 -0
  249. package/src/core/objects/publication/changes/publication.comment.test.ts +70 -0
  250. package/src/core/objects/publication/changes/publication.comment.ts +64 -0
  251. package/src/core/objects/publication/changes/publication.create.test.ts +87 -0
  252. package/src/core/objects/publication/changes/publication.create.ts +82 -0
  253. package/src/core/objects/publication/changes/publication.drop.test.ts +46 -0
  254. package/src/core/objects/publication/changes/publication.drop.ts +29 -0
  255. package/src/core/objects/publication/changes/publication.types.ts +26 -0
  256. package/src/core/objects/publication/publication.diff.test.ts +292 -0
  257. package/src/core/objects/publication/publication.diff.ts +253 -0
  258. package/src/core/objects/publication/publication.model.ts +206 -0
  259. package/src/core/objects/publication/utils.ts +55 -0
  260. package/src/core/objects/rls-policy/changes/rls-policy.alter.test.ts +250 -0
  261. package/src/core/objects/rls-policy/changes/rls-policy.alter.ts +128 -0
  262. package/src/core/objects/rls-policy/changes/rls-policy.base.ts +20 -0
  263. package/src/core/objects/rls-policy/changes/rls-policy.comment.ts +69 -0
  264. package/src/core/objects/rls-policy/changes/rls-policy.create.test.ts +74 -0
  265. package/src/core/objects/rls-policy/changes/rls-policy.create.ts +100 -0
  266. package/src/core/objects/rls-policy/changes/rls-policy.drop.test.ts +28 -0
  267. package/src/core/objects/rls-policy/changes/rls-policy.drop.ts +39 -0
  268. package/src/core/objects/rls-policy/changes/rls-policy.types.ts +10 -0
  269. package/src/core/objects/rls-policy/rls-policy.diff.test.ts +79 -0
  270. package/src/core/objects/rls-policy/rls-policy.diff.ts +121 -0
  271. package/src/core/objects/rls-policy/rls-policy.model.ts +140 -0
  272. package/src/core/objects/role/changes/role.alter.test.ts +346 -0
  273. package/src/core/objects/role/changes/role.alter.ts +110 -0
  274. package/src/core/objects/role/changes/role.base.ts +24 -0
  275. package/src/core/objects/role/changes/role.comment.ts +55 -0
  276. package/src/core/objects/role/changes/role.create.test.ts +52 -0
  277. package/src/core/objects/role/changes/role.create.ts +102 -0
  278. package/src/core/objects/role/changes/role.drop.test.ts +29 -0
  279. package/src/core/objects/role/changes/role.drop.ts +34 -0
  280. package/src/core/objects/role/changes/role.privilege.ts +376 -0
  281. package/src/core/objects/role/changes/role.types.ts +12 -0
  282. package/src/core/objects/role/role.diff.test.ts +44 -0
  283. package/src/core/objects/role/role.diff.ts +479 -0
  284. package/src/core/objects/role/role.model.ts +344 -0
  285. package/src/core/objects/rule/changes/rule.alter.test.ts +78 -0
  286. package/src/core/objects/rule/changes/rule.alter.ts +72 -0
  287. package/src/core/objects/rule/changes/rule.base.ts +20 -0
  288. package/src/core/objects/rule/changes/rule.comment.test.ts +55 -0
  289. package/src/core/objects/rule/changes/rule.comment.ts +62 -0
  290. package/src/core/objects/rule/changes/rule.create.test.ts +59 -0
  291. package/src/core/objects/rule/changes/rule.create.ts +42 -0
  292. package/src/core/objects/rule/changes/rule.drop.test.ts +38 -0
  293. package/src/core/objects/rule/changes/rule.drop.ts +29 -0
  294. package/src/core/objects/rule/changes/rule.types.ts +12 -0
  295. package/src/core/objects/rule/rule.diff.test.ts +132 -0
  296. package/src/core/objects/rule/rule.diff.ts +79 -0
  297. package/src/core/objects/rule/rule.model.ts +173 -0
  298. package/src/core/objects/schema/changes/schema.alter.test.ts +28 -0
  299. package/src/core/objects/schema/changes/schema.alter.ts +45 -0
  300. package/src/core/objects/schema/changes/schema.base.ts +20 -0
  301. package/src/core/objects/schema/changes/schema.comment.ts +56 -0
  302. package/src/core/objects/schema/changes/schema.create.test.ts +22 -0
  303. package/src/core/objects/schema/changes/schema.create.ts +47 -0
  304. package/src/core/objects/schema/changes/schema.drop.test.ts +20 -0
  305. package/src/core/objects/schema/changes/schema.drop.ts +34 -0
  306. package/src/core/objects/schema/changes/schema.privilege.ts +175 -0
  307. package/src/core/objects/schema/changes/schema.types.ts +12 -0
  308. package/src/core/objects/schema/schema.diff.test.ts +42 -0
  309. package/src/core/objects/schema/schema.diff.ts +209 -0
  310. package/src/core/objects/schema/schema.model.ts +107 -0
  311. package/src/core/objects/sequence/changes/sequence.alter.test.ts +151 -0
  312. package/src/core/objects/sequence/changes/sequence.alter.ts +115 -0
  313. package/src/core/objects/sequence/changes/sequence.base.ts +20 -0
  314. package/src/core/objects/sequence/changes/sequence.comment.ts +60 -0
  315. package/src/core/objects/sequence/changes/sequence.create.test.ts +84 -0
  316. package/src/core/objects/sequence/changes/sequence.create.ts +111 -0
  317. package/src/core/objects/sequence/changes/sequence.drop.test.ts +32 -0
  318. package/src/core/objects/sequence/changes/sequence.drop.ts +37 -0
  319. package/src/core/objects/sequence/changes/sequence.privilege.ts +179 -0
  320. package/src/core/objects/sequence/changes/sequence.types.ts +12 -0
  321. package/src/core/objects/sequence/sequence.diff.test.ts +141 -0
  322. package/src/core/objects/sequence/sequence.diff.ts +359 -0
  323. package/src/core/objects/sequence/sequence.model.ts +185 -0
  324. package/src/core/objects/subscription/changes/subscription.alter.test.ts +124 -0
  325. package/src/core/objects/subscription/changes/subscription.alter.ts +110 -0
  326. package/src/core/objects/subscription/changes/subscription.base.ts +20 -0
  327. package/src/core/objects/subscription/changes/subscription.comment.test.ts +67 -0
  328. package/src/core/objects/subscription/changes/subscription.comment.ts +64 -0
  329. package/src/core/objects/subscription/changes/subscription.create.test.ts +77 -0
  330. package/src/core/objects/subscription/changes/subscription.create.ts +69 -0
  331. package/src/core/objects/subscription/changes/subscription.drop.test.ts +46 -0
  332. package/src/core/objects/subscription/changes/subscription.drop.ts +20 -0
  333. package/src/core/objects/subscription/changes/subscription.types.ts +22 -0
  334. package/src/core/objects/subscription/subscription.diff.test.ts +232 -0
  335. package/src/core/objects/subscription/subscription.diff.ts +241 -0
  336. package/src/core/objects/subscription/subscription.model.ts +190 -0
  337. package/src/core/objects/subscription/utils.ts +156 -0
  338. package/src/core/objects/table/changes/table.alter.test.ts +823 -0
  339. package/src/core/objects/table/changes/table.alter.ts +806 -0
  340. package/src/core/objects/table/changes/table.base.ts +20 -0
  341. package/src/core/objects/table/changes/table.comment.ts +266 -0
  342. package/src/core/objects/table/changes/table.create.test.ts +150 -0
  343. package/src/core/objects/table/changes/table.create.ts +188 -0
  344. package/src/core/objects/table/changes/table.drop.test.ts +34 -0
  345. package/src/core/objects/table/changes/table.drop.ts +45 -0
  346. package/src/core/objects/table/changes/table.privilege.ts +200 -0
  347. package/src/core/objects/table/changes/table.types.ts +12 -0
  348. package/src/core/objects/table/table.diff.test.ts +711 -0
  349. package/src/core/objects/table/table.diff.ts +953 -0
  350. package/src/core/objects/table/table.model.ts +460 -0
  351. package/src/core/objects/trigger/changes/trigger.alter.test.ts +46 -0
  352. package/src/core/objects/trigger/changes/trigger.alter.ts +76 -0
  353. package/src/core/objects/trigger/changes/trigger.base.ts +20 -0
  354. package/src/core/objects/trigger/changes/trigger.comment.ts +64 -0
  355. package/src/core/objects/trigger/changes/trigger.create.test.ts +43 -0
  356. package/src/core/objects/trigger/changes/trigger.create.ts +85 -0
  357. package/src/core/objects/trigger/changes/trigger.drop.test.ts +43 -0
  358. package/src/core/objects/trigger/changes/trigger.drop.ts +39 -0
  359. package/src/core/objects/trigger/changes/trigger.types.ts +10 -0
  360. package/src/core/objects/trigger/trigger.diff.test.ts +83 -0
  361. package/src/core/objects/trigger/trigger.diff.ts +116 -0
  362. package/src/core/objects/trigger/trigger.model.ts +252 -0
  363. package/src/core/objects/type/composite-type/changes/composite-type.alter.test.ts +202 -0
  364. package/src/core/objects/type/composite-type/changes/composite-type.alter.ts +174 -0
  365. package/src/core/objects/type/composite-type/changes/composite-type.base.ts +20 -0
  366. package/src/core/objects/type/composite-type/changes/composite-type.comment.ts +145 -0
  367. package/src/core/objects/type/composite-type/changes/composite-type.create.test.ts +101 -0
  368. package/src/core/objects/type/composite-type/changes/composite-type.create.ts +95 -0
  369. package/src/core/objects/type/composite-type/changes/composite-type.drop.test.ts +33 -0
  370. package/src/core/objects/type/composite-type/changes/composite-type.drop.ts +37 -0
  371. package/src/core/objects/type/composite-type/changes/composite-type.privilege.ts +175 -0
  372. package/src/core/objects/type/composite-type/changes/composite-type.types.ts +12 -0
  373. package/src/core/objects/type/composite-type/composite-type.diff.test.ts +191 -0
  374. package/src/core/objects/type/composite-type/composite-type.diff.ts +372 -0
  375. package/src/core/objects/type/composite-type/composite-type.model.ts +252 -0
  376. package/src/core/objects/type/enum/changes/enum.alter.test.ts +104 -0
  377. package/src/core/objects/type/enum/changes/enum.alter.ts +91 -0
  378. package/src/core/objects/type/enum/changes/enum.base.ts +20 -0
  379. package/src/core/objects/type/enum/changes/enum.comment.ts +64 -0
  380. package/src/core/objects/type/enum/changes/enum.create.test.ts +28 -0
  381. package/src/core/objects/type/enum/changes/enum.create.ts +56 -0
  382. package/src/core/objects/type/enum/changes/enum.drop.test.ts +25 -0
  383. package/src/core/objects/type/enum/changes/enum.drop.ts +34 -0
  384. package/src/core/objects/type/enum/changes/enum.privilege.ts +175 -0
  385. package/src/core/objects/type/enum/changes/enum.types.ts +12 -0
  386. package/src/core/objects/type/enum/enum.diff.test.ts +191 -0
  387. package/src/core/objects/type/enum/enum.diff.ts +396 -0
  388. package/src/core/objects/type/enum/enum.model.ts +194 -0
  389. package/src/core/objects/type/range/changes/range.alter.test.ts +27 -0
  390. package/src/core/objects/type/range/changes/range.alter.ts +51 -0
  391. package/src/core/objects/type/range/changes/range.base.ts +20 -0
  392. package/src/core/objects/type/range/changes/range.comment.ts +64 -0
  393. package/src/core/objects/type/range/changes/range.create.test.ts +51 -0
  394. package/src/core/objects/type/range/changes/range.create.ts +151 -0
  395. package/src/core/objects/type/range/changes/range.drop.test.ts +26 -0
  396. package/src/core/objects/type/range/changes/range.drop.ts +34 -0
  397. package/src/core/objects/type/range/changes/range.privilege.ts +175 -0
  398. package/src/core/objects/type/range/changes/range.types.ts +12 -0
  399. package/src/core/objects/type/range/range.diff.test.ts +70 -0
  400. package/src/core/objects/type/range/range.diff.ts +259 -0
  401. package/src/core/objects/type/range/range.model.ts +187 -0
  402. package/src/core/objects/type/type.types.ts +5 -0
  403. package/src/core/objects/utils.ts +171 -0
  404. package/src/core/objects/view/changes/view.alter.test.ts +110 -0
  405. package/src/core/objects/view/changes/view.alter.ts +112 -0
  406. package/src/core/objects/view/changes/view.base.ts +20 -0
  407. package/src/core/objects/view/changes/view.comment.ts +59 -0
  408. package/src/core/objects/view/changes/view.create.test.ts +65 -0
  409. package/src/core/objects/view/changes/view.create.ts +73 -0
  410. package/src/core/objects/view/changes/view.drop.test.ts +34 -0
  411. package/src/core/objects/view/changes/view.drop.ts +40 -0
  412. package/src/core/objects/view/changes/view.privilege.ts +200 -0
  413. package/src/core/objects/view/changes/view.types.ts +12 -0
  414. package/src/core/objects/view/view.diff.test.ts +91 -0
  415. package/src/core/objects/view/view.diff.ts +365 -0
  416. package/src/core/objects/view/view.model.ts +276 -0
  417. package/src/core/plan/apply.ts +190 -0
  418. package/src/core/plan/create.ts +432 -0
  419. package/src/core/plan/hierarchy.ts +574 -0
  420. package/src/core/plan/index.ts +29 -0
  421. package/src/core/plan/io.ts +20 -0
  422. package/src/core/plan/risk.ts +48 -0
  423. package/src/core/plan/serialize.ts +195 -0
  424. package/src/core/plan/sql-format/constants.ts +13 -0
  425. package/src/core/plan/sql-format/fixtures.ts +2806 -0
  426. package/src/core/plan/sql-format/format-comment-literals.test.ts +96 -0
  427. package/src/core/plan/sql-format/format-functions.test.ts +127 -0
  428. package/src/core/plan/sql-format/format-lowercase-coverage.test.ts +67 -0
  429. package/src/core/plan/sql-format/format-off.test.ts +809 -0
  430. package/src/core/plan/sql-format/format-pretty-lower-leading.test.ts +1056 -0
  431. package/src/core/plan/sql-format/format-pretty-narrow.test.ts +1283 -0
  432. package/src/core/plan/sql-format/format-pretty-preserve.test.ts +1052 -0
  433. package/src/core/plan/sql-format/format-pretty-upper.test.ts +1045 -0
  434. package/src/core/plan/sql-format/format-stress.test.ts +616 -0
  435. package/src/core/plan/sql-format/format-utils.test.ts +91 -0
  436. package/src/core/plan/sql-format/format-utils.ts +391 -0
  437. package/src/core/plan/sql-format/formatters.ts +921 -0
  438. package/src/core/plan/sql-format/index.ts +149 -0
  439. package/src/core/plan/sql-format/keyword-case.test.ts +118 -0
  440. package/src/core/plan/sql-format/keyword-case.ts +1085 -0
  441. package/src/core/plan/sql-format/protect.test.ts +127 -0
  442. package/src/core/plan/sql-format/protect.ts +337 -0
  443. package/src/core/plan/sql-format/sql-scanner.test.ts +240 -0
  444. package/src/core/plan/sql-format/sql-scanner.ts +252 -0
  445. package/src/core/plan/sql-format/tokenizer.test.ts +68 -0
  446. package/src/core/plan/sql-format/tokenizer.ts +152 -0
  447. package/src/core/plan/sql-format/types.ts +31 -0
  448. package/src/core/plan/sql-format/wrap.test.ts +119 -0
  449. package/src/core/plan/sql-format/wrap.ts +196 -0
  450. package/src/core/plan/sql-format.ts +2 -0
  451. package/src/core/plan/statements.ts +22 -0
  452. package/src/core/plan/types.ts +165 -0
  453. package/src/core/postgres-config.ts +169 -0
  454. package/src/core/sort/custom-constraints.ts +161 -0
  455. package/src/core/sort/debug-visualization.ts +239 -0
  456. package/src/core/sort/dependency-filter.ts +224 -0
  457. package/src/core/sort/graph-builder.ts +223 -0
  458. package/src/core/sort/graph-utils.ts +51 -0
  459. package/src/core/sort/logical-sort.ts +590 -0
  460. package/src/core/sort/sort-changes.ts +234 -0
  461. package/src/core/sort/topological-sort.ts +184 -0
  462. package/src/core/sort/types.ts +112 -0
  463. package/src/core/sort/utils.ts +69 -0
  464. package/src/index.ts +14 -0
@@ -0,0 +1,2449 @@
1
+ import { Aggregate } from "../../objects/aggregate/aggregate.model.js";
2
+ import { AlterAggregateChangeOwner } from "../../objects/aggregate/changes/aggregate.alter.js";
3
+ import { CreateCommentOnAggregate, DropCommentOnAggregate, } from "../../objects/aggregate/changes/aggregate.comment.js";
4
+ // ── Aggregate changes ───────────────────────────────────────────────────────
5
+ import { CreateAggregate } from "../../objects/aggregate/changes/aggregate.create.js";
6
+ import { DropAggregate } from "../../objects/aggregate/changes/aggregate.drop.js";
7
+ import { GrantAggregatePrivileges, RevokeAggregatePrivileges, RevokeGrantOptionAggregatePrivileges, } from "../../objects/aggregate/changes/aggregate.privilege.js";
8
+ import { AlterCollationChangeOwner, AlterCollationRefreshVersion, } from "../../objects/collation/changes/collation.alter.js";
9
+ import { CreateCommentOnCollation, DropCommentOnCollation, } from "../../objects/collation/changes/collation.comment.js";
10
+ // ── Collation changes ───────────────────────────────────────────────────────
11
+ import { CreateCollation } from "../../objects/collation/changes/collation.create.js";
12
+ import { DropCollation } from "../../objects/collation/changes/collation.drop.js";
13
+ // ── Models ──────────────────────────────────────────────────────────────────
14
+ import { Collation } from "../../objects/collation/collation.model.js";
15
+ import { AlterDomainAddConstraint, AlterDomainChangeOwner, AlterDomainDropConstraint, AlterDomainDropDefault, AlterDomainDropNotNull, AlterDomainSetDefault, AlterDomainSetNotNull, AlterDomainValidateConstraint, } from "../../objects/domain/changes/domain.alter.js";
16
+ import { CreateCommentOnDomain, DropCommentOnDomain, } from "../../objects/domain/changes/domain.comment.js";
17
+ // ── Domain changes ──────────────────────────────────────────────────────────
18
+ import { CreateDomain } from "../../objects/domain/changes/domain.create.js";
19
+ import { DropDomain } from "../../objects/domain/changes/domain.drop.js";
20
+ import { GrantDomainPrivileges, RevokeDomainPrivileges, RevokeGrantOptionDomainPrivileges, } from "../../objects/domain/changes/domain.privilege.js";
21
+ import { Domain, } from "../../objects/domain/domain.model.js";
22
+ import { AlterEventTriggerChangeOwner, AlterEventTriggerSetEnabled, } from "../../objects/event-trigger/changes/event-trigger.alter.js";
23
+ import { CreateCommentOnEventTrigger, DropCommentOnEventTrigger, } from "../../objects/event-trigger/changes/event-trigger.comment.js";
24
+ // ── Event Trigger changes ───────────────────────────────────────────────────
25
+ import { CreateEventTrigger } from "../../objects/event-trigger/changes/event-trigger.create.js";
26
+ import { DropEventTrigger } from "../../objects/event-trigger/changes/event-trigger.drop.js";
27
+ import { EventTrigger } from "../../objects/event-trigger/event-trigger.model.js";
28
+ import { AlterExtensionSetSchema, AlterExtensionUpdateVersion, } from "../../objects/extension/changes/extension.alter.js";
29
+ import { CreateCommentOnExtension, DropCommentOnExtension, } from "../../objects/extension/changes/extension.comment.js";
30
+ // ── Extension changes ───────────────────────────────────────────────────────
31
+ import { CreateExtension } from "../../objects/extension/changes/extension.create.js";
32
+ import { DropExtension } from "../../objects/extension/changes/extension.drop.js";
33
+ import { Extension } from "../../objects/extension/extension.model.js";
34
+ import { AlterForeignDataWrapperChangeOwner, AlterForeignDataWrapperSetOptions, } from "../../objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.js";
35
+ import { CreateCommentOnForeignDataWrapper, DropCommentOnForeignDataWrapper, } from "../../objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.js";
36
+ // ── Foreign Data Wrapper changes ────────────────────────────────────────────
37
+ import { CreateForeignDataWrapper } from "../../objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.js";
38
+ import { DropForeignDataWrapper } from "../../objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.js";
39
+ import { GrantForeignDataWrapperPrivileges, RevokeForeignDataWrapperPrivileges, RevokeGrantOptionForeignDataWrapperPrivileges, } from "../../objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.js";
40
+ import { ForeignDataWrapper } from "../../objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.js";
41
+ import { AlterForeignTableAddColumn, AlterForeignTableAlterColumnDropDefault, AlterForeignTableAlterColumnDropNotNull, AlterForeignTableAlterColumnSetDefault, AlterForeignTableAlterColumnSetNotNull, AlterForeignTableAlterColumnType, AlterForeignTableChangeOwner, AlterForeignTableDropColumn, AlterForeignTableSetOptions, } from "../../objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.js";
42
+ import { CreateCommentOnForeignTable, DropCommentOnForeignTable, } from "../../objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.js";
43
+ // ── Foreign Table changes ───────────────────────────────────────────────────
44
+ import { CreateForeignTable } from "../../objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.js";
45
+ import { DropForeignTable } from "../../objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.js";
46
+ import { GrantForeignTablePrivileges, RevokeForeignTablePrivileges, RevokeGrantOptionForeignTablePrivileges, } from "../../objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.js";
47
+ import { ForeignTable } from "../../objects/foreign-data-wrapper/foreign-table/foreign-table.model.js";
48
+ import { AlterServerChangeOwner, AlterServerSetOptions, AlterServerSetVersion, } from "../../objects/foreign-data-wrapper/server/changes/server.alter.js";
49
+ import { CreateCommentOnServer, DropCommentOnServer, } from "../../objects/foreign-data-wrapper/server/changes/server.comment.js";
50
+ // ── Server changes ──────────────────────────────────────────────────────────
51
+ import { CreateServer } from "../../objects/foreign-data-wrapper/server/changes/server.create.js";
52
+ import { DropServer } from "../../objects/foreign-data-wrapper/server/changes/server.drop.js";
53
+ import { GrantServerPrivileges, RevokeGrantOptionServerPrivileges, RevokeServerPrivileges, } from "../../objects/foreign-data-wrapper/server/changes/server.privilege.js";
54
+ import { Server } from "../../objects/foreign-data-wrapper/server/server.model.js";
55
+ import { AlterUserMappingSetOptions } from "../../objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.js";
56
+ // ── User Mapping changes ────────────────────────────────────────────────────
57
+ import { CreateUserMapping } from "../../objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.js";
58
+ import { DropUserMapping } from "../../objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.js";
59
+ import { UserMapping } from "../../objects/foreign-data-wrapper/user-mapping/user-mapping.model.js";
60
+ import { AlterIndexSetStatistics, AlterIndexSetStorageParams, } from "../../objects/index/changes/index.alter.js";
61
+ import { CreateCommentOnIndex, DropCommentOnIndex, } from "../../objects/index/changes/index.comment.js";
62
+ // ── Index changes ───────────────────────────────────────────────────────────
63
+ import { CreateIndex } from "../../objects/index/changes/index.create.js";
64
+ import { DropIndex } from "../../objects/index/changes/index.drop.js";
65
+ import { Index } from "../../objects/index/index.model.js";
66
+ import { AlterLanguageChangeOwner } from "../../objects/language/changes/language.alter.js";
67
+ import { CreateCommentOnLanguage, DropCommentOnLanguage, } from "../../objects/language/changes/language.comment.js";
68
+ // ── Language changes ────────────────────────────────────────────────────────
69
+ import { CreateLanguage } from "../../objects/language/changes/language.create.js";
70
+ import { DropLanguage } from "../../objects/language/changes/language.drop.js";
71
+ import { GrantLanguagePrivileges, RevokeGrantOptionLanguagePrivileges, RevokeLanguagePrivileges, } from "../../objects/language/changes/language.privilege.js";
72
+ import { Language } from "../../objects/language/language.model.js";
73
+ import { AlterMaterializedViewChangeOwner, AlterMaterializedViewSetStorageParams, } from "../../objects/materialized-view/changes/materialized-view.alter.js";
74
+ import { CreateCommentOnMaterializedView, CreateCommentOnMaterializedViewColumn, DropCommentOnMaterializedView, DropCommentOnMaterializedViewColumn, } from "../../objects/materialized-view/changes/materialized-view.comment.js";
75
+ // ── Materialized View changes ───────────────────────────────────────────────
76
+ import { CreateMaterializedView } from "../../objects/materialized-view/changes/materialized-view.create.js";
77
+ import { DropMaterializedView } from "../../objects/materialized-view/changes/materialized-view.drop.js";
78
+ import { GrantMaterializedViewPrivileges, RevokeGrantOptionMaterializedViewPrivileges, RevokeMaterializedViewPrivileges, } from "../../objects/materialized-view/changes/materialized-view.privilege.js";
79
+ import { MaterializedView } from "../../objects/materialized-view/materialized-view.model.js";
80
+ import { AlterProcedureChangeOwner, AlterProcedureSetConfig, AlterProcedureSetLeakproof, AlterProcedureSetParallel, AlterProcedureSetSecurity, AlterProcedureSetStrictness, AlterProcedureSetVolatility, } from "../../objects/procedure/changes/procedure.alter.js";
81
+ import { CreateCommentOnProcedure, DropCommentOnProcedure, } from "../../objects/procedure/changes/procedure.comment.js";
82
+ // ── Procedure / Function changes ────────────────────────────────────────────
83
+ import { CreateProcedure } from "../../objects/procedure/changes/procedure.create.js";
84
+ import { DropProcedure } from "../../objects/procedure/changes/procedure.drop.js";
85
+ import { GrantProcedurePrivileges, RevokeGrantOptionProcedurePrivileges, RevokeProcedurePrivileges, } from "../../objects/procedure/changes/procedure.privilege.js";
86
+ import { Procedure } from "../../objects/procedure/procedure.model.js";
87
+ import { AlterPublicationAddSchemas, AlterPublicationAddTables, AlterPublicationDropSchemas, AlterPublicationDropTables, AlterPublicationSetForAllTables, AlterPublicationSetList, AlterPublicationSetOptions, AlterPublicationSetOwner, } from "../../objects/publication/changes/publication.alter.js";
88
+ import { CreateCommentOnPublication, DropCommentOnPublication, } from "../../objects/publication/changes/publication.comment.js";
89
+ // ── Publication changes ─────────────────────────────────────────────────────
90
+ import { CreatePublication } from "../../objects/publication/changes/publication.create.js";
91
+ import { DropPublication } from "../../objects/publication/changes/publication.drop.js";
92
+ import { Publication } from "../../objects/publication/publication.model.js";
93
+ import { AlterRlsPolicySetRoles, AlterRlsPolicySetUsingExpression, AlterRlsPolicySetWithCheckExpression, } from "../../objects/rls-policy/changes/rls-policy.alter.js";
94
+ import { CreateCommentOnRlsPolicy, DropCommentOnRlsPolicy, } from "../../objects/rls-policy/changes/rls-policy.comment.js";
95
+ // ── RLS Policy changes ──────────────────────────────────────────────────────
96
+ import { CreateRlsPolicy } from "../../objects/rls-policy/changes/rls-policy.create.js";
97
+ import { DropRlsPolicy } from "../../objects/rls-policy/changes/rls-policy.drop.js";
98
+ import { RlsPolicy } from "../../objects/rls-policy/rls-policy.model.js";
99
+ import { AlterRoleSetConfig, AlterRoleSetOptions, } from "../../objects/role/changes/role.alter.js";
100
+ import { CreateCommentOnRole, DropCommentOnRole, } from "../../objects/role/changes/role.comment.js";
101
+ // ── Role changes ────────────────────────────────────────────────────────────
102
+ import { CreateRole } from "../../objects/role/changes/role.create.js";
103
+ import { DropRole } from "../../objects/role/changes/role.drop.js";
104
+ import { GrantRoleDefaultPrivileges, GrantRoleMembership, RevokeRoleDefaultPrivileges, RevokeRoleMembership, RevokeRoleMembershipOptions, } from "../../objects/role/changes/role.privilege.js";
105
+ import { Role } from "../../objects/role/role.model.js";
106
+ import { ReplaceRule, SetRuleEnabledState, } from "../../objects/rule/changes/rule.alter.js";
107
+ import { CreateCommentOnRule, DropCommentOnRule, } from "../../objects/rule/changes/rule.comment.js";
108
+ // ── Rule changes ────────────────────────────────────────────────────────────
109
+ import { CreateRule } from "../../objects/rule/changes/rule.create.js";
110
+ import { DropRule } from "../../objects/rule/changes/rule.drop.js";
111
+ import { Rule } from "../../objects/rule/rule.model.js";
112
+ import { AlterSchemaChangeOwner } from "../../objects/schema/changes/schema.alter.js";
113
+ import { CreateCommentOnSchema, DropCommentOnSchema, } from "../../objects/schema/changes/schema.comment.js";
114
+ // ── Schema changes ──────────────────────────────────────────────────────────
115
+ import { CreateSchema } from "../../objects/schema/changes/schema.create.js";
116
+ import { DropSchema } from "../../objects/schema/changes/schema.drop.js";
117
+ import { GrantSchemaPrivileges, RevokeGrantOptionSchemaPrivileges, RevokeSchemaPrivileges, } from "../../objects/schema/changes/schema.privilege.js";
118
+ import { Schema } from "../../objects/schema/schema.model.js";
119
+ import { AlterSequenceSetOptions, AlterSequenceSetOwnedBy, } from "../../objects/sequence/changes/sequence.alter.js";
120
+ import { CreateCommentOnSequence, DropCommentOnSequence, } from "../../objects/sequence/changes/sequence.comment.js";
121
+ // ── Sequence changes ────────────────────────────────────────────────────────
122
+ import { CreateSequence } from "../../objects/sequence/changes/sequence.create.js";
123
+ import { DropSequence } from "../../objects/sequence/changes/sequence.drop.js";
124
+ import { GrantSequencePrivileges, RevokeGrantOptionSequencePrivileges, RevokeSequencePrivileges, } from "../../objects/sequence/changes/sequence.privilege.js";
125
+ import { Sequence } from "../../objects/sequence/sequence.model.js";
126
+ import { AlterSubscriptionDisable, AlterSubscriptionEnable, AlterSubscriptionSetConnection, AlterSubscriptionSetOptions, AlterSubscriptionSetOwner, AlterSubscriptionSetPublication, } from "../../objects/subscription/changes/subscription.alter.js";
127
+ import { CreateCommentOnSubscription, DropCommentOnSubscription, } from "../../objects/subscription/changes/subscription.comment.js";
128
+ // ── Subscription changes ────────────────────────────────────────────────────
129
+ import { CreateSubscription } from "../../objects/subscription/changes/subscription.create.js";
130
+ import { DropSubscription } from "../../objects/subscription/changes/subscription.drop.js";
131
+ import { Subscription } from "../../objects/subscription/subscription.model.js";
132
+ import { AlterTableAddColumn, AlterTableAddConstraint, AlterTableAlterColumnDropDefault, AlterTableAlterColumnDropNotNull, AlterTableAlterColumnSetDefault, AlterTableAlterColumnSetNotNull, AlterTableAlterColumnType, AlterTableAttachPartition, AlterTableChangeOwner, AlterTableDetachPartition, AlterTableDisableRowLevelSecurity, AlterTableDropColumn, AlterTableDropConstraint, AlterTableEnableRowLevelSecurity, AlterTableForceRowLevelSecurity, AlterTableNoForceRowLevelSecurity, AlterTableResetStorageParams, AlterTableSetLogged, AlterTableSetReplicaIdentity, AlterTableSetStorageParams, AlterTableSetUnlogged, AlterTableValidateConstraint, } from "../../objects/table/changes/table.alter.js";
133
+ import { CreateCommentOnColumn, CreateCommentOnConstraint, CreateCommentOnTable, DropCommentOnColumn, DropCommentOnConstraint, DropCommentOnTable, } from "../../objects/table/changes/table.comment.js";
134
+ // ── Table changes ───────────────────────────────────────────────────────────
135
+ import { CreateTable } from "../../objects/table/changes/table.create.js";
136
+ import { DropTable } from "../../objects/table/changes/table.drop.js";
137
+ import { GrantTablePrivileges, RevokeGrantOptionTablePrivileges, RevokeTablePrivileges, } from "../../objects/table/changes/table.privilege.js";
138
+ import { Table } from "../../objects/table/table.model.js";
139
+ import { ReplaceTrigger } from "../../objects/trigger/changes/trigger.alter.js";
140
+ import { CreateCommentOnTrigger, DropCommentOnTrigger, } from "../../objects/trigger/changes/trigger.comment.js";
141
+ // ── Trigger changes ─────────────────────────────────────────────────────────
142
+ import { CreateTrigger } from "../../objects/trigger/changes/trigger.create.js";
143
+ import { DropTrigger } from "../../objects/trigger/changes/trigger.drop.js";
144
+ import { Trigger } from "../../objects/trigger/trigger.model.js";
145
+ import { AlterCompositeTypeAddAttribute, AlterCompositeTypeAlterAttributeType, AlterCompositeTypeChangeOwner, AlterCompositeTypeDropAttribute, } from "../../objects/type/composite-type/changes/composite-type.alter.js";
146
+ import { CreateCommentOnCompositeType, CreateCommentOnCompositeTypeAttribute, DropCommentOnCompositeType, DropCommentOnCompositeTypeAttribute, } from "../../objects/type/composite-type/changes/composite-type.comment.js";
147
+ // ── Composite type changes ──────────────────────────────────────────────────
148
+ import { CreateCompositeType } from "../../objects/type/composite-type/changes/composite-type.create.js";
149
+ import { DropCompositeType } from "../../objects/type/composite-type/changes/composite-type.drop.js";
150
+ import { GrantCompositeTypePrivileges, RevokeCompositeTypePrivileges, RevokeGrantOptionCompositeTypePrivileges, } from "../../objects/type/composite-type/changes/composite-type.privilege.js";
151
+ import { CompositeType } from "../../objects/type/composite-type/composite-type.model.js";
152
+ import { AlterEnumAddValue, AlterEnumChangeOwner, } from "../../objects/type/enum/changes/enum.alter.js";
153
+ import { CreateCommentOnEnum, DropCommentOnEnum, } from "../../objects/type/enum/changes/enum.comment.js";
154
+ // ── Enum changes ────────────────────────────────────────────────────────────
155
+ import { CreateEnum } from "../../objects/type/enum/changes/enum.create.js";
156
+ import { DropEnum } from "../../objects/type/enum/changes/enum.drop.js";
157
+ import { GrantEnumPrivileges, RevokeEnumPrivileges, RevokeGrantOptionEnumPrivileges, } from "../../objects/type/enum/changes/enum.privilege.js";
158
+ import { Enum } from "../../objects/type/enum/enum.model.js";
159
+ import { AlterRangeChangeOwner } from "../../objects/type/range/changes/range.alter.js";
160
+ import { CreateCommentOnRange, DropCommentOnRange, } from "../../objects/type/range/changes/range.comment.js";
161
+ // ── Range changes ───────────────────────────────────────────────────────────
162
+ import { CreateRange } from "../../objects/type/range/changes/range.create.js";
163
+ import { DropRange } from "../../objects/type/range/changes/range.drop.js";
164
+ import { GrantRangePrivileges, RevokeGrantOptionRangePrivileges, RevokeRangePrivileges, } from "../../objects/type/range/changes/range.privilege.js";
165
+ import { Range } from "../../objects/type/range/range.model.js";
166
+ import { AlterViewChangeOwner, AlterViewResetOptions, AlterViewSetOptions, } from "../../objects/view/changes/view.alter.js";
167
+ import { CreateCommentOnView, DropCommentOnView, } from "../../objects/view/changes/view.comment.js";
168
+ // ── View changes ────────────────────────────────────────────────────────────
169
+ import { CreateView } from "../../objects/view/changes/view.create.js";
170
+ import { DropView } from "../../objects/view/changes/view.drop.js";
171
+ import { GrantViewPrivileges, RevokeGrantOptionViewPrivileges, RevokeViewPrivileges, } from "../../objects/view/changes/view.privilege.js";
172
+ import { View } from "../../objects/view/view.model.js";
173
+ import { formatSqlScript } from "../statements.js";
174
+ const column = (overrides = {}) => ({
175
+ name: "id",
176
+ position: 1,
177
+ data_type: "integer",
178
+ data_type_str: "integer",
179
+ is_custom_type: false,
180
+ custom_type_type: null,
181
+ custom_type_category: null,
182
+ custom_type_schema: null,
183
+ custom_type_name: null,
184
+ not_null: false,
185
+ is_identity: false,
186
+ is_identity_always: false,
187
+ is_generated: false,
188
+ collation: null,
189
+ default: null,
190
+ comment: null,
191
+ ...overrides,
192
+ });
193
+ // ── Model objects ───────────────────────────────────────────────────────────
194
+ const domainConstraint = {
195
+ name: "domain_chk",
196
+ validated: true,
197
+ is_local: true,
198
+ no_inherit: false,
199
+ check_expression: "VALUE <> ''",
200
+ };
201
+ const domainConstraint2 = {
202
+ name: "domain_len_chk",
203
+ validated: false,
204
+ is_local: true,
205
+ no_inherit: true,
206
+ check_expression: "char_length(VALUE) <= 255",
207
+ };
208
+ const domain = new Domain({
209
+ schema: "public",
210
+ name: "test_domain_all",
211
+ base_type: "text",
212
+ base_type_schema: "custom",
213
+ base_type_str: "text",
214
+ not_null: true,
215
+ type_modifier: null,
216
+ array_dimensions: 2,
217
+ collation: "mycoll",
218
+ default_bin: null,
219
+ default_value: "'hello'",
220
+ owner: "test",
221
+ comment: "domain comment",
222
+ constraints: [domainConstraint],
223
+ privileges: [],
224
+ });
225
+ const enumType = new Enum({
226
+ schema: "public",
227
+ name: "test_enum",
228
+ owner: "test",
229
+ labels: [
230
+ { sort_order: 1, label: "value1" },
231
+ { sort_order: 2, label: "value2" },
232
+ { sort_order: 3, label: "value3" },
233
+ ],
234
+ comment: "enum comment",
235
+ privileges: [],
236
+ });
237
+ const compositeType = new CompositeType({
238
+ schema: "public",
239
+ name: "test_type",
240
+ row_security: false,
241
+ force_row_security: false,
242
+ has_indexes: false,
243
+ has_rules: false,
244
+ has_triggers: false,
245
+ has_subclasses: false,
246
+ is_populated: false,
247
+ replica_identity: "d",
248
+ is_partition: false,
249
+ options: null,
250
+ partition_bound: null,
251
+ owner: "test",
252
+ comment: "composite comment",
253
+ columns: [
254
+ column({ name: "id", data_type_str: "integer", comment: "attr comment" }),
255
+ column({ name: "name", data_type_str: "text", collation: '"en_US"' }),
256
+ ],
257
+ privileges: [],
258
+ });
259
+ const rangeType = new Range({
260
+ schema: "public",
261
+ name: "daterange_custom",
262
+ owner: "owner1",
263
+ subtype_schema: "pg_catalog",
264
+ subtype_str: "date",
265
+ collation: '"en_US"',
266
+ canonical_function_schema: "public",
267
+ canonical_function_name: "canon_fn",
268
+ subtype_diff_schema: "public",
269
+ subtype_diff_name: "diff_fn",
270
+ subtype_opclass_schema: "public",
271
+ subtype_opclass_name: "date_ops",
272
+ comment: "range comment",
273
+ privileges: [],
274
+ });
275
+ const collation = new Collation({
276
+ schema: "public",
277
+ name: "test",
278
+ provider: "i",
279
+ is_deterministic: false,
280
+ encoding: 1,
281
+ collate: "en_US",
282
+ locale: "en_US",
283
+ version: "1.0",
284
+ ctype: "en_US",
285
+ icu_rules: "& A < a <<< à",
286
+ owner: "owner",
287
+ comment: "collation comment",
288
+ });
289
+ const pkConstraint = {
290
+ name: "pk_t_fmt",
291
+ constraint_type: "p",
292
+ deferrable: false,
293
+ initially_deferred: false,
294
+ validated: true,
295
+ is_local: true,
296
+ no_inherit: false,
297
+ is_partition_clone: false,
298
+ parent_constraint_schema: null,
299
+ parent_constraint_name: null,
300
+ parent_table_schema: null,
301
+ parent_table_name: null,
302
+ key_columns: ["id"],
303
+ foreign_key_columns: null,
304
+ foreign_key_table: null,
305
+ foreign_key_schema: null,
306
+ foreign_key_table_is_partition: null,
307
+ foreign_key_parent_schema: null,
308
+ foreign_key_parent_table: null,
309
+ foreign_key_effective_schema: null,
310
+ foreign_key_effective_table: null,
311
+ on_update: null,
312
+ on_delete: null,
313
+ match_type: null,
314
+ check_expression: null,
315
+ owner: "owner1",
316
+ definition: "PRIMARY KEY (id)",
317
+ comment: "primary key",
318
+ };
319
+ const uniqueConstraint = {
320
+ name: "uq_t_fmt_status",
321
+ constraint_type: "u",
322
+ deferrable: false,
323
+ initially_deferred: false,
324
+ validated: true,
325
+ is_local: true,
326
+ no_inherit: false,
327
+ is_partition_clone: false,
328
+ parent_constraint_schema: null,
329
+ parent_constraint_name: null,
330
+ parent_table_schema: null,
331
+ parent_table_name: null,
332
+ key_columns: ["status"],
333
+ foreign_key_columns: null,
334
+ foreign_key_table: null,
335
+ foreign_key_schema: null,
336
+ foreign_key_table_is_partition: null,
337
+ foreign_key_parent_schema: null,
338
+ foreign_key_parent_table: null,
339
+ foreign_key_effective_schema: null,
340
+ foreign_key_effective_table: null,
341
+ on_update: null,
342
+ on_delete: null,
343
+ match_type: null,
344
+ check_expression: null,
345
+ owner: "owner1",
346
+ definition: "UNIQUE (status)",
347
+ };
348
+ const fkConstraint = {
349
+ name: "fk_t_fmt_ref",
350
+ constraint_type: "f",
351
+ deferrable: true,
352
+ initially_deferred: true,
353
+ validated: true,
354
+ is_local: true,
355
+ no_inherit: false,
356
+ is_partition_clone: false,
357
+ parent_constraint_schema: null,
358
+ parent_constraint_name: null,
359
+ parent_table_schema: null,
360
+ parent_table_name: null,
361
+ key_columns: ["ref_id"],
362
+ foreign_key_columns: ["id"],
363
+ foreign_key_table: "other_table",
364
+ foreign_key_schema: "public",
365
+ foreign_key_table_is_partition: false,
366
+ foreign_key_parent_schema: null,
367
+ foreign_key_parent_table: null,
368
+ foreign_key_effective_schema: "public",
369
+ foreign_key_effective_table: "other_table",
370
+ on_update: "n",
371
+ on_delete: "c",
372
+ match_type: "f",
373
+ check_expression: null,
374
+ owner: "owner1",
375
+ definition: "FOREIGN KEY (ref_id) REFERENCES public.other_table(id) MATCH FULL ON UPDATE SET NULL ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED",
376
+ };
377
+ const checkConstraint = {
378
+ name: "chk_t_fmt_status",
379
+ constraint_type: "c",
380
+ deferrable: false,
381
+ initially_deferred: false,
382
+ validated: true,
383
+ is_local: true,
384
+ no_inherit: true,
385
+ is_partition_clone: false,
386
+ parent_constraint_schema: null,
387
+ parent_constraint_name: null,
388
+ parent_table_schema: null,
389
+ parent_table_name: null,
390
+ key_columns: [],
391
+ foreign_key_columns: null,
392
+ foreign_key_table: null,
393
+ foreign_key_schema: null,
394
+ foreign_key_table_is_partition: null,
395
+ foreign_key_parent_schema: null,
396
+ foreign_key_parent_table: null,
397
+ foreign_key_effective_schema: null,
398
+ foreign_key_effective_table: null,
399
+ on_update: null,
400
+ on_delete: null,
401
+ match_type: null,
402
+ check_expression: "status <> '' AND created_at > '2020-01-01'::timestamptz",
403
+ owner: "owner1",
404
+ definition: "CHECK (status <> '' AND created_at > '2020-01-01'::timestamptz) NO INHERIT",
405
+ comment: "check constraint comment",
406
+ };
407
+ const table = new Table({
408
+ schema: "public",
409
+ name: "table_with_very_long_name_for_formatting_and_wrapping_test",
410
+ persistence: "p",
411
+ row_security: false,
412
+ force_row_security: false,
413
+ has_indexes: false,
414
+ has_rules: false,
415
+ has_triggers: false,
416
+ has_subclasses: false,
417
+ is_populated: true,
418
+ replica_identity: "d",
419
+ is_partition: false,
420
+ options: ["fillfactor=70", "autovacuum_enabled=false"],
421
+ partition_bound: null,
422
+ partition_by: null,
423
+ owner: "owner1",
424
+ comment: "table comment",
425
+ parent_schema: null,
426
+ parent_name: null,
427
+ columns: [
428
+ column({
429
+ name: "id",
430
+ data_type: "bigint",
431
+ data_type_str: "bigint",
432
+ not_null: true,
433
+ is_identity: true,
434
+ is_identity_always: true,
435
+ comment: "id column",
436
+ }),
437
+ column({
438
+ name: "status",
439
+ data_type: "text",
440
+ data_type_str: "text",
441
+ default: "'pending'",
442
+ collation: '"en_US"',
443
+ comment: "status column",
444
+ }),
445
+ column({
446
+ name: "created_at",
447
+ data_type: "timestamptz",
448
+ data_type_str: "timestamptz",
449
+ default: "now()",
450
+ }),
451
+ column({
452
+ name: "ref_id",
453
+ data_type: "bigint",
454
+ data_type_str: "bigint",
455
+ }),
456
+ column({
457
+ name: "computed",
458
+ data_type: "bigint",
459
+ data_type_str: "bigint",
460
+ is_generated: true,
461
+ default: "id * 2",
462
+ }),
463
+ ],
464
+ constraints: [pkConstraint, uniqueConstraint, fkConstraint, checkConstraint],
465
+ privileges: [],
466
+ });
467
+ const partitionedTable = new Table({
468
+ schema: "public",
469
+ name: "events",
470
+ persistence: "p",
471
+ row_security: false,
472
+ force_row_security: false,
473
+ has_indexes: false,
474
+ has_rules: false,
475
+ has_triggers: false,
476
+ has_subclasses: true,
477
+ is_populated: true,
478
+ replica_identity: "d",
479
+ is_partition: false,
480
+ options: null,
481
+ partition_bound: null,
482
+ partition_by: "RANGE (created_at)",
483
+ owner: "owner1",
484
+ comment: null,
485
+ parent_schema: null,
486
+ parent_name: null,
487
+ columns: [
488
+ column({
489
+ name: "id",
490
+ data_type: "bigint",
491
+ data_type_str: "bigint",
492
+ not_null: true,
493
+ }),
494
+ column({
495
+ name: "created_at",
496
+ data_type: "timestamptz",
497
+ data_type_str: "timestamptz",
498
+ not_null: true,
499
+ }),
500
+ ],
501
+ constraints: [],
502
+ privileges: [],
503
+ });
504
+ const partitionChild = new Table({
505
+ schema: "public",
506
+ name: "events_2024",
507
+ persistence: "p",
508
+ row_security: false,
509
+ force_row_security: false,
510
+ has_indexes: false,
511
+ has_rules: false,
512
+ has_triggers: false,
513
+ has_subclasses: false,
514
+ is_populated: true,
515
+ replica_identity: "d",
516
+ is_partition: true,
517
+ options: null,
518
+ partition_bound: "FOR VALUES FROM ('2024-01-01') TO ('2025-01-01')",
519
+ partition_by: null,
520
+ owner: "owner1",
521
+ comment: null,
522
+ parent_schema: "public",
523
+ parent_name: "events",
524
+ columns: [
525
+ column({
526
+ name: "id",
527
+ data_type: "bigint",
528
+ data_type_str: "bigint",
529
+ not_null: true,
530
+ }),
531
+ column({
532
+ name: "created_at",
533
+ data_type: "timestamptz",
534
+ data_type_str: "timestamptz",
535
+ not_null: true,
536
+ }),
537
+ ],
538
+ constraints: [],
539
+ privileges: [],
540
+ });
541
+ const publication = new Publication({
542
+ name: "pub_custom",
543
+ owner: "owner1",
544
+ comment: "publication comment",
545
+ all_tables: false,
546
+ publish_insert: true,
547
+ publish_update: true,
548
+ publish_delete: true,
549
+ publish_truncate: true,
550
+ publish_via_partition_root: false,
551
+ tables: [
552
+ {
553
+ schema: "public",
554
+ name: "articles_with_a_very_long_name_very_very_long_name_that_will_go_above_the_wrapping_limit",
555
+ columns: ["id", "title"],
556
+ row_filter: "(published = true)",
557
+ },
558
+ {
559
+ schema: "public",
560
+ name: "comments_a_little_smaller_name_than_the_previous_one",
561
+ columns: null,
562
+ row_filter: null,
563
+ },
564
+ ],
565
+ schemas: ["analytics"],
566
+ });
567
+ const view = new View({
568
+ schema: "public",
569
+ name: "test_view",
570
+ definition: "SELECT *\nFROM test_table",
571
+ row_security: false,
572
+ force_row_security: false,
573
+ has_indexes: false,
574
+ has_rules: false,
575
+ has_triggers: false,
576
+ has_subclasses: false,
577
+ is_populated: false,
578
+ replica_identity: "d",
579
+ is_partition: false,
580
+ options: ["security_barrier=true", "check_option=local"],
581
+ partition_bound: null,
582
+ owner: "test",
583
+ comment: "view comment",
584
+ columns: [],
585
+ privileges: [],
586
+ });
587
+ const rule = new Rule({
588
+ schema: "public",
589
+ table_name: "test_table",
590
+ name: "test_rule",
591
+ relation_kind: "r",
592
+ event: "INSERT",
593
+ enabled: "O",
594
+ is_instead: true,
595
+ definition: "CREATE RULE test_rule AS ON INSERT TO public.test_table DO INSTEAD NOTHING",
596
+ columns: [],
597
+ comment: "rule comment",
598
+ owner: "test",
599
+ });
600
+ const procedure = new Procedure({
601
+ schema: "public",
602
+ name: "test_procedure",
603
+ kind: "p",
604
+ return_type: "void",
605
+ return_type_schema: "pg_catalog",
606
+ language: "plpgsql",
607
+ security_definer: false,
608
+ volatility: "v",
609
+ parallel_safety: "u",
610
+ execution_cost: 0,
611
+ result_rows: 0,
612
+ is_strict: false,
613
+ leakproof: false,
614
+ returns_set: false,
615
+ argument_count: 0,
616
+ argument_default_count: 0,
617
+ argument_names: null,
618
+ argument_types: null,
619
+ all_argument_types: null,
620
+ argument_modes: null,
621
+ argument_defaults: null,
622
+ source_code: "BEGIN RETURN; END;",
623
+ binary_path: null,
624
+ sql_body: null,
625
+ owner: "test",
626
+ comment: "procedure comment",
627
+ privileges: [],
628
+ definition: "CREATE PROCEDURE public.test_procedure() LANGUAGE plpgsql AS $$ begin null; end; $$",
629
+ config: null,
630
+ });
631
+ const complexFunction = new Procedure({
632
+ schema: "public",
633
+ name: "calculate_metrics_for_analytics_dashboard_with_extended_name",
634
+ kind: "f",
635
+ return_type: "TABLE(total bigint, average numeric)",
636
+ return_type_schema: "pg_catalog",
637
+ language: "plpgsql",
638
+ security_definer: true,
639
+ volatility: "s",
640
+ parallel_safety: "s",
641
+ execution_cost: 100,
642
+ result_rows: 10,
643
+ is_strict: true,
644
+ leakproof: false,
645
+ returns_set: true,
646
+ argument_count: 3,
647
+ argument_default_count: 1,
648
+ argument_names: [
649
+ '"p_schema_name_for_analytics"',
650
+ '"p_table_name_for_metrics"',
651
+ '"p_limit_count_default"',
652
+ ],
653
+ argument_types: ["text", "text", "integer"],
654
+ all_argument_types: ["text", "text", "integer"],
655
+ argument_modes: ["i", "i", "i"],
656
+ argument_defaults: "100",
657
+ source_code: "BEGIN\n RETURN QUERY SELECT count(*)::bigint, avg(value)::numeric FROM ...\nEND;",
658
+ binary_path: null,
659
+ sql_body: null,
660
+ owner: "admin",
661
+ comment: "Calculate metrics for a given table",
662
+ privileges: [],
663
+ definition: 'CREATE OR REPLACE FUNCTION public.calculate_metrics_for_analytics_dashboard_with_extended_name("p_schema_name_for_analytics" text, "p_table_name_for_metrics" text, "p_limit_count_default" integer DEFAULT 100) RETURNS TABLE(total bigint, average numeric) LANGUAGE plpgsql STABLE SECURITY DEFINER PARALLEL SAFE COST 100 ROWS 10 STRICT SET search_path TO \'pg_catalog\', \'public\' AS $function$ BEGIN RETURN QUERY SELECT count(*)::bigint, avg(value)::numeric FROM generate_series(1, p_limit_count_default); END; $function$',
664
+ config: ["search_path TO 'pg_catalog', 'public'"],
665
+ });
666
+ const sequence = new Sequence({
667
+ schema: "public",
668
+ name: "table_with_very_long_name_for_formatting_and_wrapping_test_id_seq",
669
+ data_type: "bigint",
670
+ start_value: 1,
671
+ minimum_value: BigInt(1),
672
+ maximum_value: BigInt("9223372036854775807"),
673
+ increment: 1,
674
+ cycle_option: false,
675
+ cache_size: 1,
676
+ persistence: "p",
677
+ owned_by_schema: "public",
678
+ owned_by_table: "table_with_very_long_name_for_formatting_and_wrapping_test",
679
+ owned_by_column: "id",
680
+ comment: "sequence for table_with_very_long_name_for_formatting_and_wrapping_test.id",
681
+ privileges: [],
682
+ owner: "owner1",
683
+ });
684
+ const rlsPolicy = new RlsPolicy({
685
+ schema: "public",
686
+ name: "allow_select_own",
687
+ table_name: "table_with_very_long_name_for_formatting_and_wrapping_test",
688
+ command: "r",
689
+ permissive: true,
690
+ roles: ["authenticated"],
691
+ using_expression: "auth.uid() = user_id",
692
+ with_check_expression: null,
693
+ owner: "owner1",
694
+ comment: "rls policy comment",
695
+ });
696
+ const rlsPolicyRestrictive = new RlsPolicy({
697
+ schema: "public",
698
+ name: "restrict_delete",
699
+ table_name: "table_with_very_long_name_for_formatting_and_wrapping_test",
700
+ command: "d",
701
+ permissive: false,
702
+ roles: ["authenticated", "service_role"],
703
+ using_expression: "auth.uid() = owner_id",
704
+ with_check_expression: "status <> 'locked'",
705
+ owner: "owner1",
706
+ comment: null,
707
+ });
708
+ const index = new Index({
709
+ schema: "public",
710
+ table_name: "table_with_very_long_name_for_formatting_and_wrapping_test",
711
+ name: "idx_t_fmt_status",
712
+ storage_params: ["fillfactor=90"],
713
+ statistics_target: [100],
714
+ index_type: "btree",
715
+ tablespace: null,
716
+ is_unique: true,
717
+ is_primary: false,
718
+ is_exclusion: false,
719
+ nulls_not_distinct: false,
720
+ immediate: true,
721
+ is_clustered: false,
722
+ is_replica_identity: false,
723
+ key_columns: [2],
724
+ column_collations: [null],
725
+ operator_classes: ["default"],
726
+ column_options: [0],
727
+ index_expressions: null,
728
+ partial_predicate: "status <> 'archived'",
729
+ is_owned_by_constraint: false,
730
+ table_relkind: "r",
731
+ is_partitioned_index: false,
732
+ is_index_partition: false,
733
+ parent_index_name: null,
734
+ definition: "CREATE UNIQUE INDEX idx_t_fmt_status ON public.table_with_very_long_name_for_formatting_and_wrapping_test USING btree (status) WITH (fillfactor='90') WHERE (status <> 'archived'::text)",
735
+ comment: "index comment",
736
+ owner: "owner1",
737
+ });
738
+ const ginIndex = new Index({
739
+ schema: "public",
740
+ table_name: "table_with_very_long_name_for_formatting_and_wrapping_test",
741
+ name: "idx_t_fmt_search",
742
+ storage_params: [],
743
+ statistics_target: [],
744
+ index_type: "gin",
745
+ tablespace: null,
746
+ is_unique: false,
747
+ is_primary: false,
748
+ is_exclusion: false,
749
+ nulls_not_distinct: false,
750
+ immediate: true,
751
+ is_clustered: false,
752
+ is_replica_identity: false,
753
+ key_columns: [],
754
+ column_collations: [],
755
+ operator_classes: [],
756
+ column_options: [],
757
+ index_expressions: "to_tsvector('english', status)",
758
+ partial_predicate: null,
759
+ is_owned_by_constraint: false,
760
+ table_relkind: "r",
761
+ is_partitioned_index: false,
762
+ is_index_partition: false,
763
+ parent_index_name: null,
764
+ definition: "CREATE INDEX idx_t_fmt_search ON public.table_with_very_long_name_for_formatting_and_wrapping_test USING gin (to_tsvector('english'::regconfig, status))",
765
+ comment: null,
766
+ owner: "owner1",
767
+ });
768
+ const trigger = new Trigger({
769
+ schema: "public",
770
+ name: "trg_audit",
771
+ table_name: "table_with_very_long_name_for_formatting_and_wrapping_test",
772
+ function_schema: "public",
773
+ function_name: "audit_trigger_fn",
774
+ trigger_type: 7,
775
+ enabled: "O",
776
+ is_internal: false,
777
+ deferrable: true,
778
+ initially_deferred: true,
779
+ argument_count: 2,
780
+ column_numbers: null,
781
+ arguments: ["arg1", "arg2"],
782
+ when_condition: "(NEW.status IS DISTINCT FROM OLD.status)",
783
+ old_table: "old_rows",
784
+ new_table: "new_rows",
785
+ is_partition_clone: false,
786
+ parent_trigger_name: null,
787
+ parent_table_schema: null,
788
+ parent_table_name: null,
789
+ is_on_partitioned_table: false,
790
+ owner: "owner1",
791
+ definition: "CREATE TRIGGER trg_audit AFTER INSERT OR UPDATE ON public.table_with_very_long_name_for_formatting_and_wrapping_test REFERENCING OLD TABLE AS old_rows NEW TABLE AS new_rows FOR EACH ROW WHEN ((NEW.status IS DISTINCT FROM OLD.status)) EXECUTE FUNCTION public.audit_trigger_fn('arg1', 'arg2')",
792
+ comment: "trigger comment",
793
+ });
794
+ // ── New object models ───────────────────────────────────────────────────────
795
+ const schema = new Schema({
796
+ name: "application_schema_with_very_long_name_for_wrapping_tests",
797
+ owner: "admin",
798
+ comment: "application schema",
799
+ privileges: [],
800
+ });
801
+ const extension = new Extension({
802
+ name: "pgcrypto",
803
+ schema: "extensions",
804
+ relocatable: true,
805
+ version: "1.3",
806
+ owner: "postgres",
807
+ comment: "cryptographic functions",
808
+ members: [],
809
+ });
810
+ const materializedView = new MaterializedView({
811
+ schema: "analytics",
812
+ name: "daily_stats",
813
+ definition: "SELECT date_trunc('day', created_at) AS day, count(*) AS total\nFROM public.events\nGROUP BY 1",
814
+ row_security: false,
815
+ force_row_security: false,
816
+ has_indexes: false,
817
+ has_rules: false,
818
+ has_triggers: false,
819
+ has_subclasses: false,
820
+ is_populated: true,
821
+ replica_identity: "d",
822
+ is_partition: false,
823
+ options: ["fillfactor=70"],
824
+ partition_bound: null,
825
+ owner: "admin",
826
+ comment: "daily aggregation",
827
+ columns: [
828
+ column({
829
+ name: "day",
830
+ data_type: "timestamptz",
831
+ data_type_str: "timestamptz",
832
+ comment: "day bucket",
833
+ }),
834
+ column({
835
+ name: "total",
836
+ position: 2,
837
+ data_type: "bigint",
838
+ data_type_str: "bigint",
839
+ }),
840
+ ],
841
+ privileges: [],
842
+ });
843
+ const aggregate = new Aggregate({
844
+ schema: "public",
845
+ name: "array_cat_agg",
846
+ identity_arguments: "anycompatiblearray",
847
+ kind: "a",
848
+ aggkind: "n",
849
+ num_direct_args: 0,
850
+ return_type: "anycompatiblearray",
851
+ return_type_schema: "pg_catalog",
852
+ parallel_safety: "s",
853
+ is_strict: true,
854
+ transition_function: "array_cat(anycompatiblearray,anycompatiblearray)",
855
+ state_data_type: "anycompatiblearray",
856
+ state_data_type_schema: "pg_catalog",
857
+ state_data_space: 0,
858
+ final_function: null,
859
+ final_function_extra_args: false,
860
+ final_function_modify: null,
861
+ combine_function: "array_cat(anycompatiblearray,anycompatiblearray)",
862
+ serial_function: null,
863
+ deserial_function: null,
864
+ initial_condition: "{}",
865
+ moving_transition_function: null,
866
+ moving_inverse_function: null,
867
+ moving_state_data_type: null,
868
+ moving_state_data_type_schema: null,
869
+ moving_state_data_space: null,
870
+ moving_final_function: null,
871
+ moving_final_function_extra_args: false,
872
+ moving_final_function_modify: null,
873
+ moving_initial_condition: null,
874
+ sort_operator: null,
875
+ argument_count: 1,
876
+ argument_default_count: 0,
877
+ argument_names: null,
878
+ argument_types: ["anycompatiblearray"],
879
+ all_argument_types: null,
880
+ argument_modes: null,
881
+ argument_defaults: null,
882
+ owner: "postgres",
883
+ comment: "concatenate arrays aggregate",
884
+ privileges: [],
885
+ });
886
+ const eventTrigger = new EventTrigger({
887
+ name: "prevent_drop",
888
+ event: "sql_drop",
889
+ function_schema: "public",
890
+ function_name: "prevent_drop_fn",
891
+ enabled: "O",
892
+ tags: ["DROP TABLE", "DROP SCHEMA"],
893
+ owner: "postgres",
894
+ comment: "prevent accidental drops",
895
+ });
896
+ const language = new Language({
897
+ name: "plv8",
898
+ is_trusted: true,
899
+ is_procedural: true,
900
+ call_handler: "plv8_call_handler",
901
+ inline_handler: "plv8_inline_handler",
902
+ validator: "plv8_call_validator",
903
+ owner: "postgres",
904
+ comment: "PL/V8 trusted procedural language",
905
+ privileges: [],
906
+ });
907
+ const role = new Role({
908
+ name: "app_user",
909
+ is_superuser: false,
910
+ can_inherit: true,
911
+ can_create_roles: false,
912
+ can_create_databases: false,
913
+ can_login: true,
914
+ can_replicate: false,
915
+ connection_limit: 100,
916
+ can_bypass_rls: false,
917
+ config: ["statement_timeout=30000", "search_path=public,app_schema"],
918
+ comment: "application user role",
919
+ members: [
920
+ {
921
+ member: "dev_user",
922
+ grantor: "postgres",
923
+ admin_option: true,
924
+ inherit_option: true,
925
+ set_option: true,
926
+ },
927
+ ],
928
+ default_privileges: [
929
+ {
930
+ in_schema: "public",
931
+ objtype: "r",
932
+ grantee: "app_reader",
933
+ privileges: [{ privilege: "SELECT", grantable: false }],
934
+ },
935
+ ],
936
+ });
937
+ const subscription = new Subscription({
938
+ name: "sub_replica",
939
+ raw_name: "sub_replica",
940
+ owner: "postgres",
941
+ comment: "replication subscription",
942
+ enabled: true,
943
+ binary: true,
944
+ streaming: "parallel",
945
+ two_phase: false,
946
+ disable_on_error: true,
947
+ password_required: true,
948
+ run_as_owner: false,
949
+ failover: true,
950
+ conninfo: "host=primary.db port=5432 dbname=mydb",
951
+ slot_name: "sub_replica_slot",
952
+ slot_is_none: false,
953
+ replication_slot_created: true,
954
+ synchronous_commit: "remote_apply",
955
+ publications: ["pub_custom"],
956
+ origin: "any",
957
+ });
958
+ const foreignDataWrapper = new ForeignDataWrapper({
959
+ name: "postgres_fdw",
960
+ owner: "postgres",
961
+ handler: "postgres_fdw_handler",
962
+ validator: "postgres_fdw_validator",
963
+ options: ["debug", "true"],
964
+ comment: "PostgreSQL foreign data wrapper",
965
+ privileges: [],
966
+ });
967
+ const foreignTable = new ForeignTable({
968
+ schema: "public",
969
+ name: "remote_users",
970
+ owner: "postgres",
971
+ server: "remote_server",
972
+ options: ["schema_name", "public", "table_name", "users"],
973
+ comment: "remote users table",
974
+ columns: [
975
+ column({
976
+ name: "id",
977
+ data_type: "integer",
978
+ data_type_str: "integer",
979
+ not_null: true,
980
+ }),
981
+ column({
982
+ name: "email",
983
+ data_type: "text",
984
+ data_type_str: "text",
985
+ position: 2,
986
+ }),
987
+ ],
988
+ privileges: [],
989
+ });
990
+ const server = new Server({
991
+ name: "remote_server",
992
+ owner: "postgres",
993
+ foreign_data_wrapper: "postgres_fdw",
994
+ type: "postgresql",
995
+ version: "16.0",
996
+ options: ["host", "remote.host", "port", "5432", "dbname", "remote_db"],
997
+ comment: "remote PostgreSQL server",
998
+ privileges: [],
999
+ });
1000
+ const userMapping = new UserMapping({
1001
+ user: "app_user",
1002
+ server: "remote_server",
1003
+ options: ["user", "remote_app", "password", "secret123"],
1004
+ });
1005
+ // ── Change cases ────────────────────────────────────────────────────────────
1006
+ const changeCases = [
1007
+ // ── Schema ──
1008
+ { label: "schema.create", change: new CreateSchema({ schema }) },
1009
+ { label: "schema.drop", change: new DropSchema({ schema }) },
1010
+ {
1011
+ label: "schema.alter.change_owner",
1012
+ change: new AlterSchemaChangeOwner({ schema, owner: "new_admin" }),
1013
+ },
1014
+ { label: "schema.comment", change: new CreateCommentOnSchema({ schema }) },
1015
+ { label: "schema.drop_comment", change: new DropCommentOnSchema({ schema }) },
1016
+ {
1017
+ label: "schema.grant",
1018
+ change: new GrantSchemaPrivileges({
1019
+ schema,
1020
+ grantee: "app_user",
1021
+ privileges: [
1022
+ { privilege: "USAGE", grantable: true },
1023
+ { privilege: "CREATE", grantable: true },
1024
+ ],
1025
+ }),
1026
+ },
1027
+ {
1028
+ label: "schema.revoke",
1029
+ change: new RevokeSchemaPrivileges({
1030
+ schema,
1031
+ grantee: "app_user",
1032
+ privileges: [{ privilege: "CREATE", grantable: false }],
1033
+ }),
1034
+ },
1035
+ {
1036
+ label: "schema.revoke_grant_option",
1037
+ change: new RevokeGrantOptionSchemaPrivileges({
1038
+ schema,
1039
+ grantee: "app_user",
1040
+ privilegeNames: ["USAGE"],
1041
+ }),
1042
+ },
1043
+ // ── Extension ──
1044
+ { label: "extension.create", change: new CreateExtension({ extension }) },
1045
+ { label: "extension.drop", change: new DropExtension({ extension }) },
1046
+ {
1047
+ label: "extension.alter.update_version",
1048
+ change: new AlterExtensionUpdateVersion({ extension, version: "1.4" }),
1049
+ },
1050
+ {
1051
+ label: "extension.alter.set_schema",
1052
+ change: new AlterExtensionSetSchema({ extension, schema: "public" }),
1053
+ },
1054
+ {
1055
+ label: "extension.comment",
1056
+ change: new CreateCommentOnExtension({ extension }),
1057
+ },
1058
+ {
1059
+ label: "extension.drop_comment",
1060
+ change: new DropCommentOnExtension({ extension }),
1061
+ },
1062
+ // ── Domain ──
1063
+ { label: "domain.create", change: new CreateDomain({ domain }) },
1064
+ { label: "domain.drop", change: new DropDomain({ domain }) },
1065
+ {
1066
+ label: "domain.alter.set_default",
1067
+ change: new AlterDomainSetDefault({ domain, defaultValue: "'world'" }),
1068
+ },
1069
+ {
1070
+ label: "domain.alter.drop_default",
1071
+ change: new AlterDomainDropDefault({ domain }),
1072
+ },
1073
+ {
1074
+ label: "domain.alter.set_not_null",
1075
+ change: new AlterDomainSetNotNull({ domain }),
1076
+ },
1077
+ {
1078
+ label: "domain.alter.drop_not_null",
1079
+ change: new AlterDomainDropNotNull({ domain }),
1080
+ },
1081
+ {
1082
+ label: "domain.alter.change_owner",
1083
+ change: new AlterDomainChangeOwner({ domain, owner: "new_owner" }),
1084
+ },
1085
+ {
1086
+ label: "domain.alter.add_constraint",
1087
+ change: new AlterDomainAddConstraint({
1088
+ domain,
1089
+ constraint: domainConstraint2,
1090
+ }),
1091
+ },
1092
+ {
1093
+ label: "domain.alter.drop_constraint",
1094
+ change: new AlterDomainDropConstraint({
1095
+ domain,
1096
+ constraint: domainConstraint,
1097
+ }),
1098
+ },
1099
+ {
1100
+ label: "domain.alter.validate_constraint",
1101
+ change: new AlterDomainValidateConstraint({
1102
+ domain,
1103
+ constraint: domainConstraint2,
1104
+ }),
1105
+ },
1106
+ { label: "domain.comment", change: new CreateCommentOnDomain({ domain }) },
1107
+ { label: "domain.drop_comment", change: new DropCommentOnDomain({ domain }) },
1108
+ {
1109
+ label: "domain.grant",
1110
+ change: new GrantDomainPrivileges({
1111
+ domain,
1112
+ grantee: "app_user",
1113
+ privileges: [{ privilege: "USAGE", grantable: false }],
1114
+ }),
1115
+ },
1116
+ {
1117
+ label: "domain.revoke",
1118
+ change: new RevokeDomainPrivileges({
1119
+ domain,
1120
+ grantee: "app_user",
1121
+ privileges: [{ privilege: "USAGE", grantable: false }],
1122
+ }),
1123
+ },
1124
+ {
1125
+ label: "domain.revoke_grant_option",
1126
+ change: new RevokeGrantOptionDomainPrivileges({
1127
+ domain,
1128
+ grantee: "app_user",
1129
+ privilegeNames: ["USAGE"],
1130
+ }),
1131
+ },
1132
+ // ── Enum ──
1133
+ { label: "type.enum.create", change: new CreateEnum({ enum: enumType }) },
1134
+ { label: "type.enum.drop", change: new DropEnum({ enum: enumType }) },
1135
+ {
1136
+ label: "type.enum.alter.change_owner",
1137
+ change: new AlterEnumChangeOwner({ enum: enumType, owner: "new_owner" }),
1138
+ },
1139
+ {
1140
+ label: "type.enum.alter.add_value",
1141
+ change: new AlterEnumAddValue({
1142
+ enum: enumType,
1143
+ newValue: "value4",
1144
+ position: { after: "value2" },
1145
+ }),
1146
+ },
1147
+ {
1148
+ label: "type.enum.comment",
1149
+ change: new CreateCommentOnEnum({ enum: enumType }),
1150
+ },
1151
+ {
1152
+ label: "type.enum.drop_comment",
1153
+ change: new DropCommentOnEnum({ enum: enumType }),
1154
+ },
1155
+ {
1156
+ label: "type.enum.grant",
1157
+ change: new GrantEnumPrivileges({
1158
+ enum: enumType,
1159
+ grantee: "app_user",
1160
+ privileges: [{ privilege: "USAGE", grantable: false }],
1161
+ }),
1162
+ },
1163
+ {
1164
+ label: "type.enum.revoke",
1165
+ change: new RevokeEnumPrivileges({
1166
+ enum: enumType,
1167
+ grantee: "app_user",
1168
+ privileges: [{ privilege: "USAGE", grantable: false }],
1169
+ }),
1170
+ },
1171
+ {
1172
+ label: "type.enum.revoke_grant_option",
1173
+ change: new RevokeGrantOptionEnumPrivileges({
1174
+ enum: enumType,
1175
+ grantee: "app_user",
1176
+ privilegeNames: ["USAGE"],
1177
+ }),
1178
+ },
1179
+ // ── Composite type ──
1180
+ {
1181
+ label: "type.composite.create",
1182
+ change: new CreateCompositeType({ compositeType }),
1183
+ },
1184
+ {
1185
+ label: "type.composite.drop",
1186
+ change: new DropCompositeType({ compositeType }),
1187
+ },
1188
+ {
1189
+ label: "type.composite.alter.change_owner",
1190
+ change: new AlterCompositeTypeChangeOwner({
1191
+ compositeType,
1192
+ owner: "new_owner",
1193
+ }),
1194
+ },
1195
+ {
1196
+ label: "type.composite.alter.add_attribute",
1197
+ change: new AlterCompositeTypeAddAttribute({
1198
+ compositeType,
1199
+ attribute: column({ name: "age", data_type_str: "integer" }),
1200
+ }),
1201
+ },
1202
+ {
1203
+ label: "type.composite.alter.drop_attribute",
1204
+ change: new AlterCompositeTypeDropAttribute({
1205
+ compositeType,
1206
+ attribute: column({ name: "name", data_type_str: "text" }),
1207
+ }),
1208
+ },
1209
+ {
1210
+ label: "type.composite.alter.alter_attr_type",
1211
+ change: new AlterCompositeTypeAlterAttributeType({
1212
+ compositeType,
1213
+ attribute: column({
1214
+ name: "name",
1215
+ data_type_str: "varchar(255)",
1216
+ collation: '"C"',
1217
+ }),
1218
+ }),
1219
+ },
1220
+ {
1221
+ label: "type.composite.comment",
1222
+ change: new CreateCommentOnCompositeType({ compositeType }),
1223
+ },
1224
+ {
1225
+ label: "type.composite.drop_comment",
1226
+ change: new DropCommentOnCompositeType({ compositeType }),
1227
+ },
1228
+ {
1229
+ label: "type.composite.attr_comment",
1230
+ change: new CreateCommentOnCompositeTypeAttribute({
1231
+ compositeType,
1232
+ attribute: column({
1233
+ name: "id",
1234
+ data_type_str: "integer",
1235
+ comment: "attr comment",
1236
+ }),
1237
+ }),
1238
+ },
1239
+ {
1240
+ label: "type.composite.drop_attr_comment",
1241
+ change: new DropCommentOnCompositeTypeAttribute({
1242
+ compositeType,
1243
+ attribute: column({ name: "id", data_type_str: "integer" }),
1244
+ }),
1245
+ },
1246
+ {
1247
+ label: "type.composite.grant",
1248
+ change: new GrantCompositeTypePrivileges({
1249
+ compositeType,
1250
+ grantee: "app_user",
1251
+ privileges: [{ privilege: "USAGE", grantable: false }],
1252
+ }),
1253
+ },
1254
+ {
1255
+ label: "type.composite.revoke",
1256
+ change: new RevokeCompositeTypePrivileges({
1257
+ compositeType,
1258
+ grantee: "app_user",
1259
+ privileges: [{ privilege: "USAGE", grantable: false }],
1260
+ }),
1261
+ },
1262
+ {
1263
+ label: "type.composite.revoke_grant_option",
1264
+ change: new RevokeGrantOptionCompositeTypePrivileges({
1265
+ compositeType,
1266
+ grantee: "app_user",
1267
+ privilegeNames: ["USAGE"],
1268
+ }),
1269
+ },
1270
+ // ── Range ──
1271
+ { label: "type.range.create", change: new CreateRange({ range: rangeType }) },
1272
+ { label: "type.range.drop", change: new DropRange({ range: rangeType }) },
1273
+ {
1274
+ label: "type.range.alter.change_owner",
1275
+ change: new AlterRangeChangeOwner({ range: rangeType, owner: "new_owner" }),
1276
+ },
1277
+ {
1278
+ label: "type.range.comment",
1279
+ change: new CreateCommentOnRange({ range: rangeType }),
1280
+ },
1281
+ {
1282
+ label: "type.range.drop_comment",
1283
+ change: new DropCommentOnRange({ range: rangeType }),
1284
+ },
1285
+ {
1286
+ label: "type.range.grant",
1287
+ change: new GrantRangePrivileges({
1288
+ range: rangeType,
1289
+ grantee: "app_user",
1290
+ privileges: [{ privilege: "USAGE", grantable: false }],
1291
+ }),
1292
+ },
1293
+ {
1294
+ label: "type.range.revoke",
1295
+ change: new RevokeRangePrivileges({
1296
+ range: rangeType,
1297
+ grantee: "app_user",
1298
+ privileges: [{ privilege: "USAGE", grantable: false }],
1299
+ }),
1300
+ },
1301
+ {
1302
+ label: "type.range.revoke_grant_option",
1303
+ change: new RevokeGrantOptionRangePrivileges({
1304
+ range: rangeType,
1305
+ grantee: "app_user",
1306
+ privilegeNames: ["USAGE"],
1307
+ }),
1308
+ },
1309
+ // ── Collation ──
1310
+ { label: "collation.create", change: new CreateCollation({ collation }) },
1311
+ { label: "collation.drop", change: new DropCollation({ collation }) },
1312
+ {
1313
+ label: "collation.alter.change_owner",
1314
+ change: new AlterCollationChangeOwner({ collation, owner: "new_owner" }),
1315
+ },
1316
+ {
1317
+ label: "collation.alter.refresh_version",
1318
+ change: new AlterCollationRefreshVersion({ collation }),
1319
+ },
1320
+ {
1321
+ label: "collation.comment",
1322
+ change: new CreateCommentOnCollation({ collation }),
1323
+ },
1324
+ {
1325
+ label: "collation.drop_comment",
1326
+ change: new DropCommentOnCollation({ collation }),
1327
+ },
1328
+ // ── Table ──
1329
+ { label: "table.create", change: new CreateTable({ table }) },
1330
+ { label: "table.drop", change: new DropTable({ table }) },
1331
+ {
1332
+ label: "table.alter.add_column",
1333
+ change: new AlterTableAddColumn({
1334
+ table,
1335
+ column: column({
1336
+ name: "email",
1337
+ data_type: "text",
1338
+ data_type_str: "text",
1339
+ not_null: true,
1340
+ default: "'user@example.com'",
1341
+ collation: '"en_US"',
1342
+ }),
1343
+ }),
1344
+ },
1345
+ {
1346
+ label: "table.alter.drop_column",
1347
+ change: new AlterTableDropColumn({
1348
+ table,
1349
+ column: column({
1350
+ name: "computed",
1351
+ data_type: "bigint",
1352
+ data_type_str: "bigint",
1353
+ }),
1354
+ }),
1355
+ },
1356
+ {
1357
+ label: "table.alter.column_type",
1358
+ change: new AlterTableAlterColumnType({
1359
+ table,
1360
+ column: column({
1361
+ name: "status",
1362
+ data_type: "varchar",
1363
+ data_type_str: "character varying(255)",
1364
+ collation: '"C"',
1365
+ }),
1366
+ }),
1367
+ },
1368
+ {
1369
+ label: "table.alter.column_set_default",
1370
+ change: new AlterTableAlterColumnSetDefault({
1371
+ table,
1372
+ column: column({
1373
+ name: "status",
1374
+ data_type: "text",
1375
+ data_type_str: "text",
1376
+ default: "'active'",
1377
+ }),
1378
+ }),
1379
+ },
1380
+ {
1381
+ label: "table.alter.column_drop_default",
1382
+ change: new AlterTableAlterColumnDropDefault({
1383
+ table,
1384
+ column: column({
1385
+ name: "status",
1386
+ data_type: "text",
1387
+ data_type_str: "text",
1388
+ }),
1389
+ }),
1390
+ },
1391
+ {
1392
+ label: "table.alter.column_set_not_null",
1393
+ change: new AlterTableAlterColumnSetNotNull({
1394
+ table,
1395
+ column: column({
1396
+ name: "status",
1397
+ data_type: "text",
1398
+ data_type_str: "text",
1399
+ }),
1400
+ }),
1401
+ },
1402
+ {
1403
+ label: "table.alter.column_drop_not_null",
1404
+ change: new AlterTableAlterColumnDropNotNull({
1405
+ table,
1406
+ column: column({
1407
+ name: "status",
1408
+ data_type: "text",
1409
+ data_type_str: "text",
1410
+ }),
1411
+ }),
1412
+ },
1413
+ {
1414
+ label: "table.alter.add_constraint",
1415
+ change: new AlterTableAddConstraint({
1416
+ table,
1417
+ constraint: uniqueConstraint,
1418
+ }),
1419
+ },
1420
+ {
1421
+ label: "table.alter.add_fk_constraint",
1422
+ change: new AlterTableAddConstraint({ table, constraint: fkConstraint }),
1423
+ },
1424
+ {
1425
+ label: "table.alter.drop_constraint",
1426
+ change: new AlterTableDropConstraint({
1427
+ table,
1428
+ constraint: uniqueConstraint,
1429
+ }),
1430
+ },
1431
+ {
1432
+ label: "table.alter.validate_constraint",
1433
+ change: new AlterTableValidateConstraint({
1434
+ table,
1435
+ constraint: checkConstraint,
1436
+ }),
1437
+ },
1438
+ {
1439
+ label: "table.alter.change_owner",
1440
+ change: new AlterTableChangeOwner({ table, owner: "new_owner" }),
1441
+ },
1442
+ {
1443
+ label: "table.alter.set_logged",
1444
+ change: new AlterTableSetLogged({ table }),
1445
+ },
1446
+ {
1447
+ label: "table.alter.set_unlogged",
1448
+ change: new AlterTableSetUnlogged({ table }),
1449
+ },
1450
+ {
1451
+ label: "table.alter.enable_rls",
1452
+ change: new AlterTableEnableRowLevelSecurity({ table }),
1453
+ },
1454
+ {
1455
+ label: "table.alter.disable_rls",
1456
+ change: new AlterTableDisableRowLevelSecurity({ table }),
1457
+ },
1458
+ {
1459
+ label: "table.alter.force_rls",
1460
+ change: new AlterTableForceRowLevelSecurity({ table }),
1461
+ },
1462
+ {
1463
+ label: "table.alter.no_force_rls",
1464
+ change: new AlterTableNoForceRowLevelSecurity({ table }),
1465
+ },
1466
+ {
1467
+ label: "table.alter.set_storage_params",
1468
+ change: new AlterTableSetStorageParams({
1469
+ table,
1470
+ options: ["fillfactor=80", "autovacuum_enabled=true"],
1471
+ }),
1472
+ },
1473
+ {
1474
+ label: "table.alter.reset_storage_params",
1475
+ change: new AlterTableResetStorageParams({
1476
+ table,
1477
+ params: ["fillfactor", "autovacuum_enabled"],
1478
+ }),
1479
+ },
1480
+ {
1481
+ label: "table.alter.replica_identity",
1482
+ change: new AlterTableSetReplicaIdentity({ table, mode: "f" }),
1483
+ },
1484
+ {
1485
+ label: "table.alter.attach_partition",
1486
+ change: new AlterTableAttachPartition({
1487
+ table: partitionedTable,
1488
+ partition: partitionChild,
1489
+ }),
1490
+ },
1491
+ {
1492
+ label: "table.alter.detach_partition",
1493
+ change: new AlterTableDetachPartition({
1494
+ table: partitionedTable,
1495
+ partition: partitionChild,
1496
+ }),
1497
+ },
1498
+ { label: "table.comment", change: new CreateCommentOnTable({ table }) },
1499
+ { label: "table.drop_comment", change: new DropCommentOnTable({ table }) },
1500
+ {
1501
+ label: "table.column_comment",
1502
+ change: new CreateCommentOnColumn({
1503
+ table,
1504
+ column: column({
1505
+ name: "id",
1506
+ data_type: "bigint",
1507
+ data_type_str: "bigint",
1508
+ comment: "id column",
1509
+ }),
1510
+ }),
1511
+ },
1512
+ {
1513
+ label: "table.drop_column_comment",
1514
+ change: new DropCommentOnColumn({
1515
+ table,
1516
+ column: column({
1517
+ name: "id",
1518
+ data_type: "bigint",
1519
+ data_type_str: "bigint",
1520
+ }),
1521
+ }),
1522
+ },
1523
+ {
1524
+ label: "table.constraint_comment",
1525
+ change: new CreateCommentOnConstraint({ table, constraint: pkConstraint }),
1526
+ },
1527
+ {
1528
+ label: "table.drop_constraint_comment",
1529
+ change: new DropCommentOnConstraint({ table, constraint: checkConstraint }),
1530
+ },
1531
+ {
1532
+ label: "table.grant",
1533
+ change: new GrantTablePrivileges({
1534
+ table,
1535
+ grantee: "app_reader",
1536
+ privileges: [
1537
+ { privilege: "SELECT", grantable: false },
1538
+ { privilege: "INSERT", grantable: false },
1539
+ ],
1540
+ }),
1541
+ },
1542
+ {
1543
+ label: "table.revoke",
1544
+ change: new RevokeTablePrivileges({
1545
+ table,
1546
+ grantee: "app_reader",
1547
+ privileges: [
1548
+ { privilege: "DELETE", grantable: false },
1549
+ { privilege: "UPDATE", grantable: false },
1550
+ ],
1551
+ }),
1552
+ },
1553
+ {
1554
+ label: "table.revoke_grant_option",
1555
+ change: new RevokeGrantOptionTablePrivileges({
1556
+ table,
1557
+ grantee: "app_reader",
1558
+ privilegeNames: ["SELECT", "INSERT"],
1559
+ }),
1560
+ },
1561
+ // ── Publication ──
1562
+ {
1563
+ label: "publication.create",
1564
+ change: new CreatePublication({ publication }),
1565
+ },
1566
+ { label: "publication.drop", change: new DropPublication({ publication }) },
1567
+ {
1568
+ label: "publication.alter.set_options",
1569
+ change: new AlterPublicationSetOptions({
1570
+ publication,
1571
+ setPublish: true,
1572
+ setPublishViaPartitionRoot: true,
1573
+ }),
1574
+ },
1575
+ {
1576
+ label: "publication.alter.set_all_tables",
1577
+ change: new AlterPublicationSetForAllTables({ publication }),
1578
+ },
1579
+ {
1580
+ label: "publication.alter.set_list",
1581
+ change: new AlterPublicationSetList({ publication }),
1582
+ },
1583
+ {
1584
+ label: "publication.alter.add_tables",
1585
+ change: new AlterPublicationAddTables({
1586
+ publication,
1587
+ tables: [
1588
+ {
1589
+ schema: "public",
1590
+ name: "new_table_with_very_long_name_for_formatting_and_wrapping_test",
1591
+ columns: null,
1592
+ row_filter: null,
1593
+ },
1594
+ ],
1595
+ }),
1596
+ },
1597
+ {
1598
+ label: "publication.alter.drop_tables",
1599
+ change: new AlterPublicationDropTables({
1600
+ publication,
1601
+ tables: [
1602
+ {
1603
+ schema: "public",
1604
+ name: "comments_a_little_smaller_name_than_the_previous_one",
1605
+ columns: null,
1606
+ row_filter: null,
1607
+ },
1608
+ ],
1609
+ }),
1610
+ },
1611
+ {
1612
+ label: "publication.alter.add_schemas",
1613
+ change: new AlterPublicationAddSchemas({
1614
+ publication,
1615
+ schemas: ["staging"],
1616
+ }),
1617
+ },
1618
+ {
1619
+ label: "publication.alter.drop_schemas",
1620
+ change: new AlterPublicationDropSchemas({
1621
+ publication,
1622
+ schemas: ["analytics"],
1623
+ }),
1624
+ },
1625
+ {
1626
+ label: "publication.alter.set_owner",
1627
+ change: new AlterPublicationSetOwner({ publication, owner: "new_owner" }),
1628
+ },
1629
+ {
1630
+ label: "publication.comment",
1631
+ change: new CreateCommentOnPublication({ publication }),
1632
+ },
1633
+ {
1634
+ label: "publication.drop_comment",
1635
+ change: new DropCommentOnPublication({ publication }),
1636
+ },
1637
+ // ── View ──
1638
+ { label: "view.create", change: new CreateView({ view }) },
1639
+ { label: "view.drop", change: new DropView({ view }) },
1640
+ {
1641
+ label: "view.alter.change_owner",
1642
+ change: new AlterViewChangeOwner({ view, owner: "new_owner" }),
1643
+ },
1644
+ {
1645
+ label: "view.alter.set_options",
1646
+ change: new AlterViewSetOptions({
1647
+ view,
1648
+ options: ["security_barrier=true", "check_option=cascaded"],
1649
+ }),
1650
+ },
1651
+ {
1652
+ label: "view.alter.reset_options",
1653
+ change: new AlterViewResetOptions({ view, params: ["security_barrier"] }),
1654
+ },
1655
+ { label: "view.comment", change: new CreateCommentOnView({ view }) },
1656
+ { label: "view.drop_comment", change: new DropCommentOnView({ view }) },
1657
+ {
1658
+ label: "view.grant",
1659
+ change: new GrantViewPrivileges({
1660
+ view,
1661
+ grantee: "app_reader",
1662
+ privileges: [{ privilege: "SELECT", grantable: true }],
1663
+ }),
1664
+ },
1665
+ {
1666
+ label: "view.revoke",
1667
+ change: new RevokeViewPrivileges({
1668
+ view,
1669
+ grantee: "app_reader",
1670
+ privileges: [{ privilege: "SELECT", grantable: false }],
1671
+ }),
1672
+ },
1673
+ {
1674
+ label: "view.revoke_grant_option",
1675
+ change: new RevokeGrantOptionViewPrivileges({
1676
+ view,
1677
+ grantee: "app_reader",
1678
+ privilegeNames: ["SELECT"],
1679
+ }),
1680
+ },
1681
+ // ── Rule ──
1682
+ { label: "rule.create", change: new CreateRule({ rule }) },
1683
+ { label: "rule.drop", change: new DropRule({ rule }) },
1684
+ { label: "rule.replace", change: new ReplaceRule({ rule }) },
1685
+ {
1686
+ label: "rule.alter.set_enabled",
1687
+ change: new SetRuleEnabledState({ rule, enabled: "D" }),
1688
+ },
1689
+ { label: "rule.comment", change: new CreateCommentOnRule({ rule }) },
1690
+ { label: "rule.drop_comment", change: new DropCommentOnRule({ rule }) },
1691
+ // ── Procedure ──
1692
+ { label: "procedure.create", change: new CreateProcedure({ procedure }) },
1693
+ { label: "procedure.drop", change: new DropProcedure({ procedure }) },
1694
+ // ── Function ──
1695
+ {
1696
+ label: "function.create",
1697
+ change: new CreateProcedure({ procedure: complexFunction }),
1698
+ },
1699
+ {
1700
+ label: "function.drop",
1701
+ change: new DropProcedure({ procedure: complexFunction }),
1702
+ },
1703
+ {
1704
+ label: "function.alter.change_owner",
1705
+ change: new AlterProcedureChangeOwner({
1706
+ procedure: complexFunction,
1707
+ owner: "new_admin",
1708
+ }),
1709
+ },
1710
+ {
1711
+ label: "function.alter.set_security",
1712
+ change: new AlterProcedureSetSecurity({
1713
+ procedure: complexFunction,
1714
+ securityDefiner: false,
1715
+ }),
1716
+ },
1717
+ {
1718
+ label: "function.alter.set_config",
1719
+ change: new AlterProcedureSetConfig({
1720
+ procedure: complexFunction,
1721
+ action: "set",
1722
+ key: "work_mem",
1723
+ value: "'256MB'",
1724
+ }),
1725
+ },
1726
+ {
1727
+ label: "function.alter.set_volatility",
1728
+ change: new AlterProcedureSetVolatility({
1729
+ procedure: complexFunction,
1730
+ volatility: "i",
1731
+ }),
1732
+ },
1733
+ {
1734
+ label: "function.alter.set_strictness",
1735
+ change: new AlterProcedureSetStrictness({
1736
+ procedure: complexFunction,
1737
+ isStrict: false,
1738
+ }),
1739
+ },
1740
+ {
1741
+ label: "function.alter.set_leakproof",
1742
+ change: new AlterProcedureSetLeakproof({
1743
+ procedure: complexFunction,
1744
+ leakproof: true,
1745
+ }),
1746
+ },
1747
+ {
1748
+ label: "function.alter.set_parallel",
1749
+ change: new AlterProcedureSetParallel({
1750
+ procedure: complexFunction,
1751
+ parallelSafety: "r",
1752
+ }),
1753
+ },
1754
+ {
1755
+ label: "function.comment",
1756
+ change: new CreateCommentOnProcedure({ procedure: complexFunction }),
1757
+ },
1758
+ {
1759
+ label: "function.drop_comment",
1760
+ change: new DropCommentOnProcedure({ procedure: complexFunction }),
1761
+ },
1762
+ {
1763
+ label: "function.grant",
1764
+ change: new GrantProcedurePrivileges({
1765
+ procedure: complexFunction,
1766
+ grantee: "app_user",
1767
+ privileges: [{ privilege: "EXECUTE", grantable: true }],
1768
+ }),
1769
+ },
1770
+ {
1771
+ label: "function.revoke",
1772
+ change: new RevokeProcedurePrivileges({
1773
+ procedure: complexFunction,
1774
+ grantee: "app_user",
1775
+ privileges: [{ privilege: "EXECUTE", grantable: false }],
1776
+ }),
1777
+ },
1778
+ {
1779
+ label: "function.revoke_grant_option",
1780
+ change: new RevokeGrantOptionProcedurePrivileges({
1781
+ procedure: complexFunction,
1782
+ grantee: "app_user",
1783
+ privilegeNames: ["EXECUTE"],
1784
+ }),
1785
+ },
1786
+ // ── Sequence ──
1787
+ { label: "sequence.create", change: new CreateSequence({ sequence }) },
1788
+ { label: "sequence.drop", change: new DropSequence({ sequence }) },
1789
+ {
1790
+ label: "sequence.alter.set_owned_by",
1791
+ change: new AlterSequenceSetOwnedBy({
1792
+ sequence,
1793
+ ownedBy: {
1794
+ schema: "public",
1795
+ table: "table_with_very_long_name_for_formatting_and_wrapping_test",
1796
+ column: "id",
1797
+ },
1798
+ }),
1799
+ },
1800
+ {
1801
+ label: "sequence.alter.set_options",
1802
+ change: new AlterSequenceSetOptions({
1803
+ sequence,
1804
+ options: [
1805
+ "INCREMENT BY 10",
1806
+ "MINVALUE 1",
1807
+ "MAXVALUE 1000000",
1808
+ "CACHE 5",
1809
+ "CYCLE",
1810
+ ],
1811
+ }),
1812
+ },
1813
+ {
1814
+ label: "sequence.comment",
1815
+ change: new CreateCommentOnSequence({ sequence }),
1816
+ },
1817
+ {
1818
+ label: "sequence.drop_comment",
1819
+ change: new DropCommentOnSequence({ sequence }),
1820
+ },
1821
+ {
1822
+ label: "sequence.grant",
1823
+ change: new GrantSequencePrivileges({
1824
+ sequence,
1825
+ grantee: "app_user",
1826
+ privileges: [
1827
+ { privilege: "USAGE", grantable: false },
1828
+ { privilege: "SELECT", grantable: false },
1829
+ ],
1830
+ }),
1831
+ },
1832
+ {
1833
+ label: "sequence.revoke",
1834
+ change: new RevokeSequencePrivileges({
1835
+ sequence,
1836
+ grantee: "app_user",
1837
+ privileges: [{ privilege: "USAGE", grantable: false }],
1838
+ }),
1839
+ },
1840
+ {
1841
+ label: "sequence.revoke_grant_option",
1842
+ change: new RevokeGrantOptionSequencePrivileges({
1843
+ sequence,
1844
+ grantee: "app_user",
1845
+ privilegeNames: ["USAGE"],
1846
+ }),
1847
+ },
1848
+ // ── RLS Policy ──
1849
+ {
1850
+ label: "policy.create",
1851
+ change: new CreateRlsPolicy({ policy: rlsPolicy }),
1852
+ },
1853
+ {
1854
+ label: "policy.create_restrictive",
1855
+ change: new CreateRlsPolicy({ policy: rlsPolicyRestrictive }),
1856
+ },
1857
+ { label: "policy.drop", change: new DropRlsPolicy({ policy: rlsPolicy }) },
1858
+ {
1859
+ label: "policy.alter.set_roles",
1860
+ change: new AlterRlsPolicySetRoles({
1861
+ policy: rlsPolicy,
1862
+ roles: ["authenticated", "anon"],
1863
+ }),
1864
+ },
1865
+ {
1866
+ label: "policy.alter.set_using",
1867
+ change: new AlterRlsPolicySetUsingExpression({
1868
+ policy: rlsPolicy,
1869
+ usingExpression: "auth.uid() = user_id AND status = 'active'",
1870
+ }),
1871
+ },
1872
+ {
1873
+ label: "policy.alter.set_with_check",
1874
+ change: new AlterRlsPolicySetWithCheckExpression({
1875
+ policy: rlsPolicy,
1876
+ withCheckExpression: "auth.uid() = user_id",
1877
+ }),
1878
+ },
1879
+ {
1880
+ label: "policy.comment",
1881
+ change: new CreateCommentOnRlsPolicy({ policy: rlsPolicy }),
1882
+ },
1883
+ {
1884
+ label: "policy.drop_comment",
1885
+ change: new DropCommentOnRlsPolicy({ policy: rlsPolicy }),
1886
+ },
1887
+ // ── Index ──
1888
+ {
1889
+ label: "index.create",
1890
+ change: new CreateIndex({ index, indexableObject: table }),
1891
+ },
1892
+ {
1893
+ label: "index.create_gin",
1894
+ change: new CreateIndex({ index: ginIndex, indexableObject: table }),
1895
+ },
1896
+ { label: "index.drop", change: new DropIndex({ index }) },
1897
+ {
1898
+ label: "index.alter.set_storage_params",
1899
+ change: new AlterIndexSetStorageParams({
1900
+ index,
1901
+ paramsToSet: ["fillfactor=80"],
1902
+ keysToReset: ["deduplicate_items"],
1903
+ }),
1904
+ },
1905
+ {
1906
+ label: "index.alter.set_statistics",
1907
+ change: new AlterIndexSetStatistics({
1908
+ index,
1909
+ columnTargets: [{ columnNumber: 1, statistics: 500 }],
1910
+ }),
1911
+ },
1912
+ { label: "index.comment", change: new CreateCommentOnIndex({ index }) },
1913
+ { label: "index.drop_comment", change: new DropCommentOnIndex({ index }) },
1914
+ // ── Trigger ──
1915
+ { label: "trigger.create", change: new CreateTrigger({ trigger }) },
1916
+ { label: "trigger.drop", change: new DropTrigger({ trigger }) },
1917
+ { label: "trigger.replace", change: new ReplaceTrigger({ trigger }) },
1918
+ { label: "trigger.comment", change: new CreateCommentOnTrigger({ trigger }) },
1919
+ {
1920
+ label: "trigger.drop_comment",
1921
+ change: new DropCommentOnTrigger({ trigger }),
1922
+ },
1923
+ // ── Materialized View ──
1924
+ {
1925
+ label: "matview.create",
1926
+ change: new CreateMaterializedView({ materializedView }),
1927
+ },
1928
+ {
1929
+ label: "matview.drop",
1930
+ change: new DropMaterializedView({ materializedView }),
1931
+ },
1932
+ {
1933
+ label: "matview.alter.change_owner",
1934
+ change: new AlterMaterializedViewChangeOwner({
1935
+ materializedView,
1936
+ owner: "new_owner",
1937
+ }),
1938
+ },
1939
+ {
1940
+ label: "matview.alter.set_storage",
1941
+ change: new AlterMaterializedViewSetStorageParams({
1942
+ materializedView,
1943
+ paramsToSet: ["fillfactor=80"],
1944
+ keysToReset: ["autovacuum_enabled"],
1945
+ }),
1946
+ },
1947
+ {
1948
+ label: "matview.comment",
1949
+ change: new CreateCommentOnMaterializedView({ materializedView }),
1950
+ },
1951
+ {
1952
+ label: "matview.drop_comment",
1953
+ change: new DropCommentOnMaterializedView({ materializedView }),
1954
+ },
1955
+ {
1956
+ label: "matview.column_comment",
1957
+ change: new CreateCommentOnMaterializedViewColumn({
1958
+ materializedView,
1959
+ column: column({
1960
+ name: "day",
1961
+ data_type: "timestamptz",
1962
+ data_type_str: "timestamptz",
1963
+ comment: "day bucket",
1964
+ }),
1965
+ }),
1966
+ },
1967
+ {
1968
+ label: "matview.drop_column_comment",
1969
+ change: new DropCommentOnMaterializedViewColumn({
1970
+ materializedView,
1971
+ column: column({
1972
+ name: "day",
1973
+ data_type: "timestamptz",
1974
+ data_type_str: "timestamptz",
1975
+ }),
1976
+ }),
1977
+ },
1978
+ {
1979
+ label: "matview.grant",
1980
+ change: new GrantMaterializedViewPrivileges({
1981
+ materializedView,
1982
+ grantee: "app_reader",
1983
+ privileges: [{ privilege: "SELECT", grantable: false }],
1984
+ }),
1985
+ },
1986
+ {
1987
+ label: "matview.revoke",
1988
+ change: new RevokeMaterializedViewPrivileges({
1989
+ materializedView,
1990
+ grantee: "app_reader",
1991
+ privileges: [{ privilege: "SELECT", grantable: false }],
1992
+ }),
1993
+ },
1994
+ {
1995
+ label: "matview.revoke_grant_option",
1996
+ change: new RevokeGrantOptionMaterializedViewPrivileges({
1997
+ materializedView,
1998
+ grantee: "app_reader",
1999
+ privilegeNames: ["SELECT"],
2000
+ }),
2001
+ },
2002
+ // ── Aggregate ──
2003
+ { label: "aggregate.create", change: new CreateAggregate({ aggregate }) },
2004
+ { label: "aggregate.drop", change: new DropAggregate({ aggregate }) },
2005
+ {
2006
+ label: "aggregate.alter.change_owner",
2007
+ change: new AlterAggregateChangeOwner({ aggregate, owner: "new_owner" }),
2008
+ },
2009
+ {
2010
+ label: "aggregate.comment",
2011
+ change: new CreateCommentOnAggregate({ aggregate }),
2012
+ },
2013
+ {
2014
+ label: "aggregate.drop_comment",
2015
+ change: new DropCommentOnAggregate({ aggregate }),
2016
+ },
2017
+ {
2018
+ label: "aggregate.grant",
2019
+ change: new GrantAggregatePrivileges({
2020
+ aggregate,
2021
+ grantee: "app_user",
2022
+ privileges: [{ privilege: "EXECUTE", grantable: false }],
2023
+ }),
2024
+ },
2025
+ {
2026
+ label: "aggregate.revoke",
2027
+ change: new RevokeAggregatePrivileges({
2028
+ aggregate,
2029
+ grantee: "app_user",
2030
+ privileges: [{ privilege: "EXECUTE", grantable: false }],
2031
+ }),
2032
+ },
2033
+ {
2034
+ label: "aggregate.revoke_grant_option",
2035
+ change: new RevokeGrantOptionAggregatePrivileges({
2036
+ aggregate,
2037
+ grantee: "app_user",
2038
+ privilegeNames: ["EXECUTE"],
2039
+ }),
2040
+ },
2041
+ // ── Event Trigger ──
2042
+ {
2043
+ label: "event_trigger.create",
2044
+ change: new CreateEventTrigger({ eventTrigger }),
2045
+ },
2046
+ {
2047
+ label: "event_trigger.drop",
2048
+ change: new DropEventTrigger({ eventTrigger }),
2049
+ },
2050
+ {
2051
+ label: "event_trigger.alter.change_owner",
2052
+ change: new AlterEventTriggerChangeOwner({
2053
+ eventTrigger,
2054
+ owner: "new_owner",
2055
+ }),
2056
+ },
2057
+ {
2058
+ label: "event_trigger.alter.set_enabled",
2059
+ change: new AlterEventTriggerSetEnabled({ eventTrigger, enabled: "D" }),
2060
+ },
2061
+ {
2062
+ label: "event_trigger.comment",
2063
+ change: new CreateCommentOnEventTrigger({ eventTrigger }),
2064
+ },
2065
+ {
2066
+ label: "event_trigger.drop_comment",
2067
+ change: new DropCommentOnEventTrigger({ eventTrigger }),
2068
+ },
2069
+ // ── Language ──
2070
+ { label: "language.create", change: new CreateLanguage({ language }) },
2071
+ { label: "language.drop", change: new DropLanguage({ language }) },
2072
+ {
2073
+ label: "language.alter.change_owner",
2074
+ change: new AlterLanguageChangeOwner({ language, owner: "new_owner" }),
2075
+ },
2076
+ {
2077
+ label: "language.comment",
2078
+ change: new CreateCommentOnLanguage({ language }),
2079
+ },
2080
+ {
2081
+ label: "language.drop_comment",
2082
+ change: new DropCommentOnLanguage({ language }),
2083
+ },
2084
+ {
2085
+ label: "language.grant",
2086
+ change: new GrantLanguagePrivileges({
2087
+ language,
2088
+ grantee: "app_user",
2089
+ privileges: [{ privilege: "USAGE", grantable: true }],
2090
+ }),
2091
+ },
2092
+ {
2093
+ label: "language.revoke",
2094
+ change: new RevokeLanguagePrivileges({
2095
+ language,
2096
+ grantee: "app_user",
2097
+ privileges: [{ privilege: "USAGE", grantable: false }],
2098
+ }),
2099
+ },
2100
+ {
2101
+ label: "language.revoke_grant_option",
2102
+ change: new RevokeGrantOptionLanguagePrivileges({
2103
+ language,
2104
+ grantee: "app_user",
2105
+ privilegeNames: ["USAGE"],
2106
+ }),
2107
+ },
2108
+ // ── Role ──
2109
+ { label: "role.create", change: new CreateRole({ role }) },
2110
+ { label: "role.drop", change: new DropRole({ role }) },
2111
+ {
2112
+ label: "role.alter.set_options",
2113
+ change: new AlterRoleSetOptions({
2114
+ role,
2115
+ options: ["NOSUPERUSER", "CREATEDB"],
2116
+ }),
2117
+ },
2118
+ {
2119
+ label: "role.alter.set_config",
2120
+ change: new AlterRoleSetConfig({
2121
+ role,
2122
+ action: "set",
2123
+ key: "statement_timeout",
2124
+ value: "'60000'",
2125
+ }),
2126
+ },
2127
+ { label: "role.comment", change: new CreateCommentOnRole({ role }) },
2128
+ { label: "role.drop_comment", change: new DropCommentOnRole({ role }) },
2129
+ {
2130
+ label: "role.grant_membership",
2131
+ change: new GrantRoleMembership({
2132
+ role,
2133
+ member: "dev_user",
2134
+ options: { admin: true, inherit: true, set: true },
2135
+ }),
2136
+ },
2137
+ {
2138
+ label: "role.revoke_membership",
2139
+ change: new RevokeRoleMembership({ role, member: "dev_user" }),
2140
+ },
2141
+ {
2142
+ label: "role.revoke_membership_options",
2143
+ change: new RevokeRoleMembershipOptions({
2144
+ role,
2145
+ member: "dev_user",
2146
+ admin: true,
2147
+ }),
2148
+ },
2149
+ {
2150
+ label: "role.grant_default_privileges",
2151
+ change: new GrantRoleDefaultPrivileges({
2152
+ role,
2153
+ inSchema: "public",
2154
+ objtype: "r",
2155
+ grantee: "app_reader",
2156
+ privileges: [{ privilege: "SELECT", grantable: false }],
2157
+ version: 1,
2158
+ }),
2159
+ },
2160
+ {
2161
+ label: "role.revoke_default_privileges",
2162
+ change: new RevokeRoleDefaultPrivileges({
2163
+ role,
2164
+ inSchema: "public",
2165
+ objtype: "r",
2166
+ grantee: "app_reader",
2167
+ privileges: [{ privilege: "SELECT", grantable: false }],
2168
+ version: 1,
2169
+ }),
2170
+ },
2171
+ // ── Subscription ──
2172
+ {
2173
+ label: "subscription.create",
2174
+ change: new CreateSubscription({ subscription }),
2175
+ },
2176
+ {
2177
+ label: "subscription.drop",
2178
+ change: new DropSubscription({ subscription }),
2179
+ },
2180
+ {
2181
+ label: "subscription.alter.set_connection",
2182
+ change: new AlterSubscriptionSetConnection({ subscription }),
2183
+ },
2184
+ {
2185
+ label: "subscription.alter.set_publication",
2186
+ change: new AlterSubscriptionSetPublication({ subscription }),
2187
+ },
2188
+ {
2189
+ label: "subscription.alter.enable",
2190
+ change: new AlterSubscriptionEnable({ subscription }),
2191
+ },
2192
+ {
2193
+ label: "subscription.alter.disable",
2194
+ change: new AlterSubscriptionDisable({ subscription }),
2195
+ },
2196
+ {
2197
+ label: "subscription.alter.set_options",
2198
+ change: new AlterSubscriptionSetOptions({
2199
+ subscription,
2200
+ options: ["binary", "streaming", "synchronous_commit"],
2201
+ }),
2202
+ },
2203
+ {
2204
+ label: "subscription.alter.set_owner",
2205
+ change: new AlterSubscriptionSetOwner({ subscription, owner: "new_owner" }),
2206
+ },
2207
+ {
2208
+ label: "subscription.comment",
2209
+ change: new CreateCommentOnSubscription({ subscription }),
2210
+ },
2211
+ {
2212
+ label: "subscription.drop_comment",
2213
+ change: new DropCommentOnSubscription({ subscription }),
2214
+ },
2215
+ // ── Foreign Data Wrapper ──
2216
+ {
2217
+ label: "fdw.create",
2218
+ change: new CreateForeignDataWrapper({ foreignDataWrapper }),
2219
+ },
2220
+ {
2221
+ label: "fdw.drop",
2222
+ change: new DropForeignDataWrapper({ foreignDataWrapper }),
2223
+ },
2224
+ {
2225
+ label: "fdw.alter.change_owner",
2226
+ change: new AlterForeignDataWrapperChangeOwner({
2227
+ foreignDataWrapper,
2228
+ owner: "new_owner",
2229
+ }),
2230
+ },
2231
+ {
2232
+ label: "fdw.alter.set_options",
2233
+ change: new AlterForeignDataWrapperSetOptions({
2234
+ foreignDataWrapper,
2235
+ options: [
2236
+ { action: "SET", option: "debug", value: "false" },
2237
+ { action: "ADD", option: "use_remote_estimate" },
2238
+ ],
2239
+ }),
2240
+ },
2241
+ {
2242
+ label: "fdw.comment",
2243
+ change: new CreateCommentOnForeignDataWrapper({ foreignDataWrapper }),
2244
+ },
2245
+ {
2246
+ label: "fdw.drop_comment",
2247
+ change: new DropCommentOnForeignDataWrapper({ foreignDataWrapper }),
2248
+ },
2249
+ {
2250
+ label: "fdw.grant",
2251
+ change: new GrantForeignDataWrapperPrivileges({
2252
+ foreignDataWrapper,
2253
+ grantee: "app_user",
2254
+ privileges: [{ privilege: "USAGE", grantable: false }],
2255
+ }),
2256
+ },
2257
+ {
2258
+ label: "fdw.revoke",
2259
+ change: new RevokeForeignDataWrapperPrivileges({
2260
+ foreignDataWrapper,
2261
+ grantee: "app_user",
2262
+ privileges: [{ privilege: "USAGE", grantable: false }],
2263
+ }),
2264
+ },
2265
+ {
2266
+ label: "fdw.revoke_grant_option",
2267
+ change: new RevokeGrantOptionForeignDataWrapperPrivileges({
2268
+ foreignDataWrapper,
2269
+ grantee: "app_user",
2270
+ privilegeNames: ["USAGE"],
2271
+ }),
2272
+ },
2273
+ // ── Foreign Table ──
2274
+ {
2275
+ label: "foreign_table.create",
2276
+ change: new CreateForeignTable({ foreignTable }),
2277
+ },
2278
+ {
2279
+ label: "foreign_table.drop",
2280
+ change: new DropForeignTable({ foreignTable }),
2281
+ },
2282
+ {
2283
+ label: "foreign_table.alter.change_owner",
2284
+ change: new AlterForeignTableChangeOwner({
2285
+ foreignTable,
2286
+ owner: "new_owner",
2287
+ }),
2288
+ },
2289
+ {
2290
+ label: "foreign_table.alter.add_column",
2291
+ change: new AlterForeignTableAddColumn({
2292
+ foreignTable,
2293
+ column: column({
2294
+ name: "name",
2295
+ data_type: "text",
2296
+ data_type_str: "text",
2297
+ not_null: true,
2298
+ default: "'unknown'",
2299
+ }),
2300
+ }),
2301
+ },
2302
+ {
2303
+ label: "foreign_table.alter.drop_column",
2304
+ change: new AlterForeignTableDropColumn({
2305
+ foreignTable,
2306
+ columnName: "email",
2307
+ }),
2308
+ },
2309
+ {
2310
+ label: "foreign_table.alter.column_type",
2311
+ change: new AlterForeignTableAlterColumnType({
2312
+ foreignTable,
2313
+ columnName: "id",
2314
+ dataType: "bigint",
2315
+ }),
2316
+ },
2317
+ {
2318
+ label: "foreign_table.alter.column_set_default",
2319
+ change: new AlterForeignTableAlterColumnSetDefault({
2320
+ foreignTable,
2321
+ columnName: "email",
2322
+ defaultValue: "'nobody@example.com'",
2323
+ }),
2324
+ },
2325
+ {
2326
+ label: "foreign_table.alter.column_drop_default",
2327
+ change: new AlterForeignTableAlterColumnDropDefault({
2328
+ foreignTable,
2329
+ columnName: "email",
2330
+ }),
2331
+ },
2332
+ {
2333
+ label: "foreign_table.alter.column_set_not_null",
2334
+ change: new AlterForeignTableAlterColumnSetNotNull({
2335
+ foreignTable,
2336
+ columnName: "email",
2337
+ }),
2338
+ },
2339
+ {
2340
+ label: "foreign_table.alter.column_drop_not_null",
2341
+ change: new AlterForeignTableAlterColumnDropNotNull({
2342
+ foreignTable,
2343
+ columnName: "email",
2344
+ }),
2345
+ },
2346
+ {
2347
+ label: "foreign_table.alter.set_options",
2348
+ change: new AlterForeignTableSetOptions({
2349
+ foreignTable,
2350
+ options: [{ action: "SET", option: "fetch_size", value: "1000" }],
2351
+ }),
2352
+ },
2353
+ {
2354
+ label: "foreign_table.comment",
2355
+ change: new CreateCommentOnForeignTable({ foreignTable }),
2356
+ },
2357
+ {
2358
+ label: "foreign_table.drop_comment",
2359
+ change: new DropCommentOnForeignTable({ foreignTable }),
2360
+ },
2361
+ {
2362
+ label: "foreign_table.grant",
2363
+ change: new GrantForeignTablePrivileges({
2364
+ foreignTable,
2365
+ grantee: "app_reader",
2366
+ privileges: [{ privilege: "SELECT", grantable: false }],
2367
+ }),
2368
+ },
2369
+ {
2370
+ label: "foreign_table.revoke",
2371
+ change: new RevokeForeignTablePrivileges({
2372
+ foreignTable,
2373
+ grantee: "app_reader",
2374
+ privileges: [{ privilege: "SELECT", grantable: false }],
2375
+ }),
2376
+ },
2377
+ {
2378
+ label: "foreign_table.revoke_grant_option",
2379
+ change: new RevokeGrantOptionForeignTablePrivileges({
2380
+ foreignTable,
2381
+ grantee: "app_reader",
2382
+ privilegeNames: ["SELECT"],
2383
+ }),
2384
+ },
2385
+ // ── Server ──
2386
+ { label: "server.create", change: new CreateServer({ server }) },
2387
+ { label: "server.drop", change: new DropServer({ server }) },
2388
+ {
2389
+ label: "server.alter.change_owner",
2390
+ change: new AlterServerChangeOwner({ server, owner: "new_owner" }),
2391
+ },
2392
+ {
2393
+ label: "server.alter.set_version",
2394
+ change: new AlterServerSetVersion({ server, version: "17.0" }),
2395
+ },
2396
+ {
2397
+ label: "server.alter.set_options",
2398
+ change: new AlterServerSetOptions({
2399
+ server,
2400
+ options: [
2401
+ { action: "SET", option: "host", value: "new.host" },
2402
+ { action: "DROP", option: "port" },
2403
+ ],
2404
+ }),
2405
+ },
2406
+ { label: "server.comment", change: new CreateCommentOnServer({ server }) },
2407
+ { label: "server.drop_comment", change: new DropCommentOnServer({ server }) },
2408
+ {
2409
+ label: "server.grant",
2410
+ change: new GrantServerPrivileges({
2411
+ server,
2412
+ grantee: "app_user",
2413
+ privileges: [{ privilege: "USAGE", grantable: false }],
2414
+ }),
2415
+ },
2416
+ {
2417
+ label: "server.revoke",
2418
+ change: new RevokeServerPrivileges({
2419
+ server,
2420
+ grantee: "app_user",
2421
+ privileges: [{ privilege: "USAGE", grantable: false }],
2422
+ }),
2423
+ },
2424
+ {
2425
+ label: "server.revoke_grant_option",
2426
+ change: new RevokeGrantOptionServerPrivileges({
2427
+ server,
2428
+ grantee: "app_user",
2429
+ privilegeNames: ["USAGE"],
2430
+ }),
2431
+ },
2432
+ // ── User Mapping ──
2433
+ {
2434
+ label: "user_mapping.create",
2435
+ change: new CreateUserMapping({ userMapping }),
2436
+ },
2437
+ { label: "user_mapping.drop", change: new DropUserMapping({ userMapping }) },
2438
+ {
2439
+ label: "user_mapping.alter.set_options",
2440
+ change: new AlterUserMappingSetOptions({
2441
+ userMapping,
2442
+ options: [{ action: "SET", option: "password", value: "new_secret" }],
2443
+ }),
2444
+ },
2445
+ ];
2446
+ const renderChanges = (changes) => changes.map(({ label, change }) => `-- ${label}\n${change.serialize()}`);
2447
+ export function renderScript(options) {
2448
+ return formatSqlScript(renderChanges(changeCases), options);
2449
+ }