@supabase/pg-delta 1.0.0-alpha.1 → 1.0.0-alpha.11

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 (717) hide show
  1. package/README.md +41 -2
  2. package/dist/cli/app.js +26 -3
  3. package/dist/cli/bin/cli.js +5 -0
  4. package/dist/cli/commands/catalog-export.d.ts +5 -0
  5. package/dist/cli/commands/catalog-export.js +64 -0
  6. package/dist/cli/commands/declarative-apply.d.ts +6 -0
  7. package/dist/cli/commands/declarative-apply.js +288 -0
  8. package/dist/cli/commands/declarative-export.d.ts +5 -0
  9. package/dist/cli/commands/declarative-export.js +240 -0
  10. package/dist/cli/commands/plan.js +47 -16
  11. package/dist/cli/commands/sync.js +8 -12
  12. package/dist/cli/exit-code.d.ts +2 -0
  13. package/dist/cli/exit-code.js +7 -0
  14. package/dist/cli/formatters/tree/tree.js +3 -2
  15. package/dist/cli/utils/apply-display.d.ts +52 -0
  16. package/dist/cli/utils/apply-display.js +183 -0
  17. package/dist/cli/utils/export-display.d.ts +43 -0
  18. package/dist/cli/utils/export-display.js +202 -0
  19. package/dist/cli/utils/integrations.d.ts +30 -6
  20. package/dist/cli/utils/integrations.js +98 -6
  21. package/dist/cli/utils/resolve-input.d.ts +7 -0
  22. package/dist/cli/utils/resolve-input.js +13 -0
  23. package/dist/cli/utils.d.ts +2 -0
  24. package/dist/cli/utils.js +1 -1
  25. package/dist/core/catalog-export/index.d.ts +11 -0
  26. package/dist/core/catalog-export/index.js +10 -0
  27. package/dist/core/catalog.diff.d.ts +1 -0
  28. package/dist/core/catalog.diff.js +64 -48
  29. package/dist/core/catalog.model.d.ts +16 -3
  30. package/dist/core/catalog.model.js +132 -30
  31. package/dist/core/catalog.snapshot.d.ts +66 -0
  32. package/dist/core/catalog.snapshot.js +206 -0
  33. package/dist/core/change-utils.d.ts +9 -0
  34. package/dist/core/change-utils.js +71 -0
  35. package/dist/core/change.types.d.ts +22 -0
  36. package/dist/core/change.types.js +37 -1
  37. package/dist/core/context.d.ts +3 -3
  38. package/dist/core/context.js +7 -10
  39. package/dist/core/declarative-apply/discover-sql.d.ts +18 -0
  40. package/dist/core/declarative-apply/discover-sql.js +86 -0
  41. package/dist/core/declarative-apply/extract-catalog-providers.d.ts +23 -0
  42. package/dist/core/declarative-apply/extract-catalog-providers.js +159 -0
  43. package/dist/core/declarative-apply/index.d.ts +49 -0
  44. package/dist/core/declarative-apply/index.js +134 -0
  45. package/dist/core/declarative-apply/round-apply.d.ts +100 -0
  46. package/dist/core/declarative-apply/round-apply.js +378 -0
  47. package/dist/core/depend.d.ts +2 -2
  48. package/dist/core/depend.js +33 -7
  49. package/dist/core/export/file-mapper.d.ts +71 -0
  50. package/dist/core/export/file-mapper.js +474 -0
  51. package/dist/core/export/grouper.d.ts +13 -0
  52. package/dist/core/export/grouper.js +76 -0
  53. package/dist/core/export/index.d.ts +45 -0
  54. package/dist/core/export/index.js +63 -0
  55. package/dist/core/export/types.d.ts +84 -0
  56. package/dist/core/export/types.js +25 -0
  57. package/dist/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
  58. package/dist/core/integrations/filter/dsl.d.ts +82 -41
  59. package/dist/core/integrations/filter/dsl.js +127 -61
  60. package/dist/core/integrations/filter/flatten.d.ts +51 -0
  61. package/dist/core/integrations/filter/flatten.js +116 -0
  62. package/dist/core/integrations/integration-dsl.d.ts +27 -1
  63. package/dist/core/integrations/merge.d.ts +20 -0
  64. package/dist/core/integrations/merge.js +60 -0
  65. package/dist/core/integrations/serialize/dsl.d.ts +7 -4
  66. package/dist/core/integrations/serialize/dsl.js +2 -2
  67. package/dist/core/integrations/supabase.d.ts +8 -0
  68. package/dist/core/integrations/supabase.js +34 -8
  69. package/dist/core/objects/aggregate/aggregate.diff.d.ts +2 -8
  70. package/dist/core/objects/aggregate/aggregate.diff.js +16 -70
  71. package/dist/core/objects/aggregate/aggregate.model.d.ts +10 -10
  72. package/dist/core/objects/aggregate/aggregate.model.js +8 -10
  73. package/dist/core/objects/aggregate/changes/aggregate.create.js +1 -1
  74. package/dist/core/objects/aggregate/changes/aggregate.drop.js +1 -1
  75. package/dist/core/objects/aggregate/changes/aggregate.types.d.ts +1 -0
  76. package/dist/core/objects/base.change.d.ts +10 -0
  77. package/dist/core/objects/base.change.js +10 -0
  78. package/dist/core/objects/base.model.d.ts +4 -1
  79. package/dist/core/objects/base.model.js +5 -2
  80. package/dist/core/objects/base.privilege-diff.d.ts +38 -13
  81. package/dist/core/objects/base.privilege-diff.js +104 -22
  82. package/dist/core/objects/base.privilege.d.ts +1 -0
  83. package/dist/core/objects/base.privilege.js +9 -2
  84. package/dist/core/objects/collation/changes/collation.types.d.ts +1 -0
  85. package/dist/core/objects/collation/collation.diff.d.ts +2 -3
  86. package/dist/core/objects/collation/collation.model.d.ts +2 -2
  87. package/dist/core/objects/collation/collation.model.js +29 -28
  88. package/dist/core/objects/diff-context.d.ts +15 -0
  89. package/dist/core/objects/diff-context.js +1 -0
  90. package/dist/core/objects/domain/changes/domain.create.d.ts +1 -1
  91. package/dist/core/objects/domain/changes/domain.create.js +11 -3
  92. package/dist/core/objects/domain/changes/domain.types.d.ts +1 -0
  93. package/dist/core/objects/domain/domain.diff.d.ts +2 -8
  94. package/dist/core/objects/domain/domain.diff.js +16 -77
  95. package/dist/core/objects/domain/domain.model.d.ts +2 -2
  96. package/dist/core/objects/domain/domain.model.js +9 -11
  97. package/dist/core/objects/event-trigger/changes/event-trigger.types.d.ts +1 -0
  98. package/dist/core/objects/event-trigger/event-trigger.diff.d.ts +2 -3
  99. package/dist/core/objects/event-trigger/event-trigger.model.d.ts +2 -2
  100. package/dist/core/objects/event-trigger/event-trigger.model.js +7 -9
  101. package/dist/core/objects/extension/changes/extension.types.d.ts +1 -0
  102. package/dist/core/objects/extension/extension.model.d.ts +2 -2
  103. package/dist/core/objects/extension/extension.model.js +8 -10
  104. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.d.ts +1 -0
  105. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.d.ts +2 -8
  106. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.js +13 -77
  107. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.d.ts +2 -2
  108. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.js +22 -24
  109. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.d.ts +1 -0
  110. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.d.ts +1 -0
  111. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.d.ts +2 -8
  112. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.js +16 -77
  113. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.d.ts +2 -2
  114. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.js +21 -23
  115. package/dist/core/objects/foreign-data-wrapper/server/changes/server.types.d.ts +1 -0
  116. package/dist/core/objects/foreign-data-wrapper/server/server.diff.d.ts +2 -8
  117. package/dist/core/objects/foreign-data-wrapper/server/server.diff.js +13 -77
  118. package/dist/core/objects/foreign-data-wrapper/server/server.model.d.ts +2 -2
  119. package/dist/core/objects/foreign-data-wrapper/server/server.model.js +20 -22
  120. package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.d.ts +1 -0
  121. package/dist/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.d.ts +2 -2
  122. package/dist/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.js +20 -22
  123. package/dist/core/objects/index/changes/index.types.d.ts +1 -0
  124. package/dist/core/objects/index/index.model.d.ts +4 -4
  125. package/dist/core/objects/index/index.model.js +9 -11
  126. package/dist/core/objects/language/changes/language.types.d.ts +1 -0
  127. package/dist/core/objects/language/language.diff.d.ts +2 -5
  128. package/dist/core/objects/language/language.diff.js +7 -39
  129. package/dist/core/objects/language/language.model.js +5 -7
  130. package/dist/core/objects/materialized-view/changes/materialized-view.types.d.ts +1 -0
  131. package/dist/core/objects/materialized-view/materialized-view.diff.d.ts +2 -8
  132. package/dist/core/objects/materialized-view/materialized-view.diff.js +16 -158
  133. package/dist/core/objects/materialized-view/materialized-view.model.d.ts +5 -5
  134. package/dist/core/objects/materialized-view/materialized-view.model.js +9 -11
  135. package/dist/core/objects/procedure/changes/procedure.alter.js +12 -12
  136. package/dist/core/objects/procedure/changes/procedure.types.d.ts +1 -0
  137. package/dist/core/objects/procedure/procedure.diff.d.ts +2 -8
  138. package/dist/core/objects/procedure/procedure.diff.js +16 -77
  139. package/dist/core/objects/procedure/procedure.model.d.ts +11 -11
  140. package/dist/core/objects/procedure/procedure.model.js +9 -11
  141. package/dist/core/objects/publication/changes/publication.alter.d.ts +0 -9
  142. package/dist/core/objects/publication/changes/publication.alter.js +0 -14
  143. package/dist/core/objects/publication/changes/publication.types.d.ts +3 -2
  144. package/dist/core/objects/publication/publication.diff.d.ts +2 -3
  145. package/dist/core/objects/publication/publication.diff.js +8 -13
  146. package/dist/core/objects/publication/publication.model.d.ts +2 -2
  147. package/dist/core/objects/publication/publication.model.js +7 -9
  148. package/dist/core/objects/rls-policy/changes/rls-policy.alter.js +3 -3
  149. package/dist/core/objects/rls-policy/changes/rls-policy.types.d.ts +1 -0
  150. package/dist/core/objects/rls-policy/rls-policy.model.d.ts +4 -4
  151. package/dist/core/objects/rls-policy/rls-policy.model.js +8 -10
  152. package/dist/core/objects/role/changes/role.types.d.ts +1 -0
  153. package/dist/core/objects/role/role.diff.js +22 -1
  154. package/dist/core/objects/role/role.model.d.ts +6 -5
  155. package/dist/core/objects/role/role.model.js +146 -40
  156. package/dist/core/objects/rule/changes/rule.types.d.ts +1 -0
  157. package/dist/core/objects/rule/rule.model.d.ts +3 -3
  158. package/dist/core/objects/rule/rule.model.js +7 -9
  159. package/dist/core/objects/schema/changes/schema.types.d.ts +1 -0
  160. package/dist/core/objects/schema/schema.diff.d.ts +2 -8
  161. package/dist/core/objects/schema/schema.diff.js +16 -77
  162. package/dist/core/objects/schema/schema.model.d.ts +2 -2
  163. package/dist/core/objects/schema/schema.model.js +9 -11
  164. package/dist/core/objects/sequence/changes/sequence.types.d.ts +1 -0
  165. package/dist/core/objects/sequence/sequence.diff.d.ts +2 -8
  166. package/dist/core/objects/sequence/sequence.diff.js +16 -79
  167. package/dist/core/objects/sequence/sequence.model.d.ts +2 -2
  168. package/dist/core/objects/sequence/sequence.model.js +9 -11
  169. package/dist/core/objects/subscription/changes/subscription.types.d.ts +1 -0
  170. package/dist/core/objects/subscription/subscription.diff.d.ts +2 -3
  171. package/dist/core/objects/subscription/subscription.model.d.ts +2 -2
  172. package/dist/core/objects/subscription/subscription.model.js +25 -20
  173. package/dist/core/objects/table/changes/table.create.js +3 -0
  174. package/dist/core/objects/table/changes/table.types.d.ts +1 -0
  175. package/dist/core/objects/table/table.diff.d.ts +2 -8
  176. package/dist/core/objects/table/table.diff.js +26 -157
  177. package/dist/core/objects/table/table.model.d.ts +27 -24
  178. package/dist/core/objects/table/table.model.js +12 -11
  179. package/dist/core/objects/trigger/changes/trigger.alter.js +23 -0
  180. package/dist/core/objects/trigger/changes/trigger.create.js +4 -5
  181. package/dist/core/objects/trigger/changes/trigger.types.d.ts +1 -0
  182. package/dist/core/objects/trigger/trigger.model.d.ts +11 -2
  183. package/dist/core/objects/trigger/trigger.model.js +22 -10
  184. package/dist/core/objects/type/composite-type/changes/composite-type.types.d.ts +1 -0
  185. package/dist/core/objects/type/composite-type/composite-type.diff.d.ts +2 -8
  186. package/dist/core/objects/type/composite-type/composite-type.diff.js +16 -77
  187. package/dist/core/objects/type/composite-type/composite-type.model.d.ts +5 -5
  188. package/dist/core/objects/type/composite-type/composite-type.model.js +10 -11
  189. package/dist/core/objects/type/enum/changes/enum.types.d.ts +1 -0
  190. package/dist/core/objects/type/enum/enum.diff.d.ts +2 -8
  191. package/dist/core/objects/type/enum/enum.diff.js +25 -112
  192. package/dist/core/objects/type/enum/enum.model.d.ts +2 -2
  193. package/dist/core/objects/type/enum/enum.model.js +23 -25
  194. package/dist/core/objects/type/range/changes/range.create.js +6 -3
  195. package/dist/core/objects/type/range/changes/range.types.d.ts +1 -0
  196. package/dist/core/objects/type/range/range.diff.d.ts +2 -8
  197. package/dist/core/objects/type/range/range.diff.js +16 -77
  198. package/dist/core/objects/type/range/range.model.d.ts +2 -2
  199. package/dist/core/objects/type/range/range.model.js +8 -10
  200. package/dist/core/objects/type/type.types.d.ts +1 -0
  201. package/dist/core/objects/view/changes/view.types.d.ts +1 -0
  202. package/dist/core/objects/view/view.diff.d.ts +2 -8
  203. package/dist/core/objects/view/view.diff.js +37 -168
  204. package/dist/core/objects/view/view.model.d.ts +20 -6
  205. package/dist/core/objects/view/view.model.js +11 -23
  206. package/dist/core/plan/apply.d.ts +2 -2
  207. package/dist/core/plan/apply.js +33 -16
  208. package/dist/core/plan/create.d.ts +20 -7
  209. package/dist/core/plan/create.js +153 -112
  210. package/dist/core/plan/serialize.js +16 -4
  211. package/dist/core/plan/sql-format/constants.d.ts +2 -0
  212. package/dist/core/plan/sql-format/constants.js +11 -0
  213. package/dist/core/plan/sql-format/fixtures.d.ts +2 -0
  214. package/dist/core/plan/sql-format/fixtures.js +2447 -0
  215. package/dist/core/plan/sql-format/format-utils.d.ts +37 -0
  216. package/dist/core/plan/sql-format/format-utils.js +274 -0
  217. package/dist/core/plan/sql-format/formatters.d.ts +20 -0
  218. package/dist/core/plan/sql-format/formatters.js +737 -0
  219. package/dist/core/plan/sql-format/index.d.ts +2 -0
  220. package/dist/core/plan/sql-format/index.js +98 -0
  221. package/dist/core/plan/sql-format/keyword-case.d.ts +2 -0
  222. package/dist/core/plan/sql-format/keyword-case.js +893 -0
  223. package/dist/core/plan/sql-format/protect.d.ts +3 -0
  224. package/dist/core/plan/sql-format/protect.js +269 -0
  225. package/dist/core/plan/sql-format/sql-scanner.d.ts +59 -0
  226. package/dist/core/plan/sql-format/sql-scanner.js +202 -0
  227. package/dist/core/plan/sql-format/tokenizer.d.ts +22 -0
  228. package/dist/core/plan/sql-format/tokenizer.js +118 -0
  229. package/dist/core/plan/sql-format/types.d.ts +28 -0
  230. package/dist/core/plan/sql-format/types.js +1 -0
  231. package/dist/core/plan/sql-format/wrap.d.ts +2 -0
  232. package/dist/core/plan/sql-format/wrap.js +165 -0
  233. package/dist/core/plan/sql-format.d.ts +2 -0
  234. package/dist/core/plan/sql-format.js +1 -0
  235. package/dist/core/plan/ssl-config.d.ts +32 -0
  236. package/dist/core/plan/ssl-config.js +115 -0
  237. package/dist/core/plan/statements.d.ts +2 -1
  238. package/dist/core/plan/statements.js +6 -2
  239. package/dist/core/plan/types.d.ts +6 -0
  240. package/dist/core/postgres-config.d.ts +47 -3
  241. package/dist/core/postgres-config.js +225 -39
  242. package/dist/core/sort/custom-constraints.js +1 -1
  243. package/dist/core/sort/graph-builder.js +10 -0
  244. package/dist/core/sort/logical-sort.js +34 -47
  245. package/dist/core/test-utils/assert-valid-sql.d.ts +10 -0
  246. package/dist/core/test-utils/assert-valid-sql.js +19 -0
  247. package/dist/index.d.ts +9 -0
  248. package/dist/index.js +9 -1
  249. package/package.json +60 -22
  250. package/src/cli/app.ts +52 -0
  251. package/src/cli/bin/cli.ts +15 -0
  252. package/src/cli/commands/apply.ts +101 -0
  253. package/src/cli/commands/catalog-export.ts +78 -0
  254. package/src/cli/commands/declarative-apply.diagnostics.test.ts +77 -0
  255. package/src/cli/commands/declarative-apply.ts +380 -0
  256. package/src/cli/commands/declarative-export.ts +322 -0
  257. package/src/cli/commands/plan.ts +210 -0
  258. package/src/cli/commands/sync.ts +178 -0
  259. package/src/cli/exit-code.test.ts +19 -0
  260. package/src/cli/exit-code.ts +7 -0
  261. package/src/cli/formatters/index.ts +5 -0
  262. package/src/cli/formatters/tree/tree-builder.ts +380 -0
  263. package/src/cli/formatters/tree/tree-renderer.ts +372 -0
  264. package/src/cli/formatters/tree/tree.ts +238 -0
  265. package/src/cli/utils/apply-display.test.ts +348 -0
  266. package/src/cli/utils/apply-display.ts +238 -0
  267. package/src/cli/utils/export-display.test.ts +103 -0
  268. package/src/cli/utils/export-display.ts +275 -0
  269. package/src/cli/utils/integrations.test.ts +251 -0
  270. package/src/cli/utils/integrations.ts +170 -0
  271. package/src/cli/utils/resolve-input.test.ts +38 -0
  272. package/src/cli/utils/resolve-input.ts +17 -0
  273. package/src/cli/utils.ts +231 -0
  274. package/src/core/catalog-export/index.ts +20 -0
  275. package/src/core/catalog.diff.ts +247 -0
  276. package/src/core/catalog.model.test.ts +122 -0
  277. package/src/core/catalog.model.ts +510 -0
  278. package/src/core/catalog.snapshot.test.ts +486 -0
  279. package/src/core/catalog.snapshot.ts +289 -0
  280. package/src/core/change-utils.test.ts +61 -0
  281. package/src/core/change-utils.ts +73 -0
  282. package/src/core/change.types.ts +94 -0
  283. package/src/core/context.ts +26 -0
  284. package/src/core/declarative-apply/discover-sql.test.ts +103 -0
  285. package/src/core/declarative-apply/discover-sql.ts +107 -0
  286. package/src/core/declarative-apply/extract-catalog-providers.ts +220 -0
  287. package/src/core/declarative-apply/index.test.ts +67 -0
  288. package/src/core/declarative-apply/index.ts +205 -0
  289. package/src/core/declarative-apply/round-apply.test.ts +504 -0
  290. package/src/core/declarative-apply/round-apply.ts +562 -0
  291. package/src/core/depend.ts +1895 -0
  292. package/src/core/expand-replace-dependencies.test.ts +70 -0
  293. package/src/core/expand-replace-dependencies.ts +380 -0
  294. package/src/core/export/file-mapper.test.ts +816 -0
  295. package/src/core/export/file-mapper.ts +579 -0
  296. package/src/core/export/grouper.ts +108 -0
  297. package/src/core/export/index.ts +129 -0
  298. package/src/core/export/types.ts +104 -0
  299. package/src/core/fingerprint.ts +204 -0
  300. package/src/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
  301. package/src/core/integrations/filter/dsl.test.ts +450 -0
  302. package/src/core/integrations/filter/dsl.ts +305 -0
  303. package/src/core/integrations/filter/filter.types.ts +3 -0
  304. package/src/core/integrations/filter/flatten.test.ts +282 -0
  305. package/src/core/integrations/filter/flatten.ts +150 -0
  306. package/src/core/integrations/integration-dsl.ts +50 -0
  307. package/src/core/integrations/integration.types.ts +7 -0
  308. package/src/core/integrations/merge.test.ts +128 -0
  309. package/src/core/integrations/merge.ts +72 -0
  310. package/src/core/integrations/serialize/dsl.test.ts +91 -0
  311. package/src/core/integrations/serialize/dsl.ts +80 -0
  312. package/src/core/integrations/serialize/serialize.types.ts +3 -0
  313. package/src/core/integrations/supabase.ts +145 -0
  314. package/src/core/objects/aggregate/aggregate.diff.test.ts +215 -0
  315. package/src/core/objects/aggregate/aggregate.diff.ts +222 -0
  316. package/src/core/objects/aggregate/aggregate.model.ts +317 -0
  317. package/src/core/objects/aggregate/changes/aggregate.alter.test.ts +66 -0
  318. package/src/core/objects/aggregate/changes/aggregate.alter.ts +32 -0
  319. package/src/core/objects/aggregate/changes/aggregate.base.ts +20 -0
  320. package/src/core/objects/aggregate/changes/aggregate.comment.test.ts +89 -0
  321. package/src/core/objects/aggregate/changes/aggregate.comment.ts +62 -0
  322. package/src/core/objects/aggregate/changes/aggregate.create.test.ts +104 -0
  323. package/src/core/objects/aggregate/changes/aggregate.create.ts +329 -0
  324. package/src/core/objects/aggregate/changes/aggregate.drop.test.ts +82 -0
  325. package/src/core/objects/aggregate/changes/aggregate.drop.ts +32 -0
  326. package/src/core/objects/aggregate/changes/aggregate.privilege.test.ts +136 -0
  327. package/src/core/objects/aggregate/changes/aggregate.privilege.ts +146 -0
  328. package/src/core/objects/aggregate/changes/aggregate.types.ts +13 -0
  329. package/src/core/objects/base.change.ts +72 -0
  330. package/src/core/objects/base.default-privileges.ts +204 -0
  331. package/src/core/objects/base.diff.ts +20 -0
  332. package/src/core/objects/base.model.test.ts +43 -0
  333. package/src/core/objects/base.model.ts +85 -0
  334. package/src/core/objects/base.privilege-diff.ts +447 -0
  335. package/src/core/objects/base.privilege.ts +191 -0
  336. package/src/core/objects/collation/changes/collation.alter.test.ts +68 -0
  337. package/src/core/objects/collation/changes/collation.alter.ts +79 -0
  338. package/src/core/objects/collation/changes/collation.base.ts +20 -0
  339. package/src/core/objects/collation/changes/collation.comment.ts +68 -0
  340. package/src/core/objects/collation/changes/collation.create.test.ts +56 -0
  341. package/src/core/objects/collation/changes/collation.create.ts +106 -0
  342. package/src/core/objects/collation/changes/collation.drop.test.ts +31 -0
  343. package/src/core/objects/collation/changes/collation.drop.ts +37 -0
  344. package/src/core/objects/collation/changes/collation.types.ts +11 -0
  345. package/src/core/objects/collation/collation.diff.test.ts +97 -0
  346. package/src/core/objects/collation/collation.diff.ts +127 -0
  347. package/src/core/objects/collation/collation.model.ts +224 -0
  348. package/src/core/objects/diff-context.ts +16 -0
  349. package/src/core/objects/domain/changes/domain.alter.test.ts +335 -0
  350. package/src/core/objects/domain/changes/domain.alter.ts +286 -0
  351. package/src/core/objects/domain/changes/domain.base.ts +20 -0
  352. package/src/core/objects/domain/changes/domain.comment.ts +59 -0
  353. package/src/core/objects/domain/changes/domain.create.test.ts +95 -0
  354. package/src/core/objects/domain/changes/domain.create.ts +140 -0
  355. package/src/core/objects/domain/changes/domain.drop.test.ts +33 -0
  356. package/src/core/objects/domain/changes/domain.drop.ts +34 -0
  357. package/src/core/objects/domain/changes/domain.privilege.ts +171 -0
  358. package/src/core/objects/domain/changes/domain.types.ts +13 -0
  359. package/src/core/objects/domain/domain.diff.test.ts +284 -0
  360. package/src/core/objects/domain/domain.diff.ts +295 -0
  361. package/src/core/objects/domain/domain.model.ts +190 -0
  362. package/src/core/objects/event-trigger/changes/event-trigger.alter.test.ts +57 -0
  363. package/src/core/objects/event-trigger/changes/event-trigger.alter.ts +82 -0
  364. package/src/core/objects/event-trigger/changes/event-trigger.base.ts +20 -0
  365. package/src/core/objects/event-trigger/changes/event-trigger.comment.ts +66 -0
  366. package/src/core/objects/event-trigger/changes/event-trigger.create.test.ts +27 -0
  367. package/src/core/objects/event-trigger/changes/event-trigger.create.ts +72 -0
  368. package/src/core/objects/event-trigger/changes/event-trigger.drop.test.ts +25 -0
  369. package/src/core/objects/event-trigger/changes/event-trigger.drop.ts +34 -0
  370. package/src/core/objects/event-trigger/changes/event-trigger.types.ts +11 -0
  371. package/src/core/objects/event-trigger/event-trigger.diff.test.ts +131 -0
  372. package/src/core/objects/event-trigger/event-trigger.diff.ts +127 -0
  373. package/src/core/objects/event-trigger/event-trigger.model.ts +106 -0
  374. package/src/core/objects/extension/changes/extension.alter.test.ts +63 -0
  375. package/src/core/objects/extension/changes/extension.alter.ts +78 -0
  376. package/src/core/objects/extension/changes/extension.base.ts +20 -0
  377. package/src/core/objects/extension/changes/extension.comment.ts +64 -0
  378. package/src/core/objects/extension/changes/extension.create.test.ts +28 -0
  379. package/src/core/objects/extension/changes/extension.create.ts +63 -0
  380. package/src/core/objects/extension/changes/extension.drop.test.ts +26 -0
  381. package/src/core/objects/extension/changes/extension.drop.ts +34 -0
  382. package/src/core/objects/extension/changes/extension.types.ts +11 -0
  383. package/src/core/objects/extension/extension.diff.test.ts +42 -0
  384. package/src/core/objects/extension/extension.diff.ts +90 -0
  385. package/src/core/objects/extension/extension.model.test.ts +98 -0
  386. package/src/core/objects/extension/extension.model.ts +280 -0
  387. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.test.ts +136 -0
  388. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.ts +101 -0
  389. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.base.ts +20 -0
  390. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.ts +72 -0
  391. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.test.ts +160 -0
  392. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.ts +95 -0
  393. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.test.ts +26 -0
  394. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.ts +36 -0
  395. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.ts +172 -0
  396. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.ts +13 -0
  397. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.test.ts +286 -0
  398. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.ts +271 -0
  399. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.ts +149 -0
  400. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.ts +11 -0
  401. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.test.ts +340 -0
  402. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.ts +341 -0
  403. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.base.ts +20 -0
  404. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.ts +72 -0
  405. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.test.ts +210 -0
  406. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.ts +81 -0
  407. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.test.ts +46 -0
  408. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.ts +37 -0
  409. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.ts +181 -0
  410. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.ts +13 -0
  411. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.test.ts +813 -0
  412. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.ts +343 -0
  413. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.ts +242 -0
  414. package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.test.ts +183 -0
  415. package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.ts +126 -0
  416. package/src/core/objects/foreign-data-wrapper/server/changes/server.base.ts +20 -0
  417. package/src/core/objects/foreign-data-wrapper/server/changes/server.comment.ts +60 -0
  418. package/src/core/objects/foreign-data-wrapper/server/changes/server.create.test.ts +144 -0
  419. package/src/core/objects/foreign-data-wrapper/server/changes/server.create.ts +81 -0
  420. package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.test.ts +27 -0
  421. package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.ts +34 -0
  422. package/src/core/objects/foreign-data-wrapper/server/changes/server.privilege.ts +164 -0
  423. package/src/core/objects/foreign-data-wrapper/server/changes/server.types.ts +13 -0
  424. package/src/core/objects/foreign-data-wrapper/server/server.diff.test.ts +262 -0
  425. package/src/core/objects/foreign-data-wrapper/server/server.diff.ts +247 -0
  426. package/src/core/objects/foreign-data-wrapper/server/server.model.ts +133 -0
  427. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.test.ts +91 -0
  428. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.ts +69 -0
  429. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.base.ts +20 -0
  430. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.test.ts +96 -0
  431. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.ts +66 -0
  432. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.test.ts +60 -0
  433. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.ts +40 -0
  434. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.ts +9 -0
  435. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.test.ts +77 -0
  436. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.ts +107 -0
  437. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.ts +96 -0
  438. package/src/core/objects/index/changes/index.alter.test.ts +209 -0
  439. package/src/core/objects/index/changes/index.alter.ts +144 -0
  440. package/src/core/objects/index/changes/index.base.ts +20 -0
  441. package/src/core/objects/index/changes/index.comment.ts +63 -0
  442. package/src/core/objects/index/changes/index.create.test.ts +69 -0
  443. package/src/core/objects/index/changes/index.create.ts +68 -0
  444. package/src/core/objects/index/changes/index.drop.test.ts +47 -0
  445. package/src/core/objects/index/changes/index.drop.ts +34 -0
  446. package/src/core/objects/index/changes/index.types.ts +7 -0
  447. package/src/core/objects/index/changes/utils.ts +16 -0
  448. package/src/core/objects/index/index.diff.test.ts +153 -0
  449. package/src/core/objects/index/index.diff.ts +243 -0
  450. package/src/core/objects/index/index.model.ts +370 -0
  451. package/src/core/objects/language/changes/language.alter.test.ts +36 -0
  452. package/src/core/objects/language/changes/language.alter.ts +53 -0
  453. package/src/core/objects/language/changes/language.base.ts +20 -0
  454. package/src/core/objects/language/changes/language.comment.ts +58 -0
  455. package/src/core/objects/language/changes/language.create.test.ts +30 -0
  456. package/src/core/objects/language/changes/language.create.ts +104 -0
  457. package/src/core/objects/language/changes/language.drop.test.ts +28 -0
  458. package/src/core/objects/language/changes/language.drop.ts +39 -0
  459. package/src/core/objects/language/changes/language.privilege.ts +172 -0
  460. package/src/core/objects/language/changes/language.types.ts +13 -0
  461. package/src/core/objects/language/language.diff.test.ts +135 -0
  462. package/src/core/objects/language/language.diff.ts +144 -0
  463. package/src/core/objects/language/language.model.ts +150 -0
  464. package/src/core/objects/materialized-view/changes/materialized-view.alter.test.ts +130 -0
  465. package/src/core/objects/materialized-view/changes/materialized-view.alter.ts +113 -0
  466. package/src/core/objects/materialized-view/changes/materialized-view.base.ts +20 -0
  467. package/src/core/objects/materialized-view/changes/materialized-view.comment.ts +176 -0
  468. package/src/core/objects/materialized-view/changes/materialized-view.create.test.ts +69 -0
  469. package/src/core/objects/materialized-view/changes/materialized-view.create.ts +93 -0
  470. package/src/core/objects/materialized-view/changes/materialized-view.drop.test.ts +37 -0
  471. package/src/core/objects/materialized-view/changes/materialized-view.drop.ts +60 -0
  472. package/src/core/objects/materialized-view/changes/materialized-view.privilege.ts +212 -0
  473. package/src/core/objects/materialized-view/changes/materialized-view.types.ts +13 -0
  474. package/src/core/objects/materialized-view/materialized-view.diff.test.ts +264 -0
  475. package/src/core/objects/materialized-view/materialized-view.diff.ts +301 -0
  476. package/src/core/objects/materialized-view/materialized-view.model.ts +258 -0
  477. package/src/core/objects/procedure/changes/procedure.alter.test.ts +1077 -0
  478. package/src/core/objects/procedure/changes/procedure.alter.ts +290 -0
  479. package/src/core/objects/procedure/changes/procedure.base.ts +20 -0
  480. package/src/core/objects/procedure/changes/procedure.comment.ts +70 -0
  481. package/src/core/objects/procedure/changes/procedure.create.test.ts +51 -0
  482. package/src/core/objects/procedure/changes/procedure.create.ts +92 -0
  483. package/src/core/objects/procedure/changes/procedure.drop.test.ts +90 -0
  484. package/src/core/objects/procedure/changes/procedure.drop.ts +49 -0
  485. package/src/core/objects/procedure/changes/procedure.privilege.ts +188 -0
  486. package/src/core/objects/procedure/changes/procedure.types.ts +13 -0
  487. package/src/core/objects/procedure/procedure.diff.test.ts +161 -0
  488. package/src/core/objects/procedure/procedure.diff.ts +341 -0
  489. package/src/core/objects/procedure/procedure.model.ts +264 -0
  490. package/src/core/objects/procedure/utils.ts +58 -0
  491. package/src/core/objects/publication/changes/publication.alter.test.ts +217 -0
  492. package/src/core/objects/publication/changes/publication.alter.ts +225 -0
  493. package/src/core/objects/publication/changes/publication.base.ts +20 -0
  494. package/src/core/objects/publication/changes/publication.comment.test.ts +73 -0
  495. package/src/core/objects/publication/changes/publication.comment.ts +64 -0
  496. package/src/core/objects/publication/changes/publication.create.test.ts +90 -0
  497. package/src/core/objects/publication/changes/publication.create.ts +82 -0
  498. package/src/core/objects/publication/changes/publication.drop.test.ts +48 -0
  499. package/src/core/objects/publication/changes/publication.drop.ts +29 -0
  500. package/src/core/objects/publication/changes/publication.types.ts +25 -0
  501. package/src/core/objects/publication/publication.diff.test.ts +297 -0
  502. package/src/core/objects/publication/publication.diff.ts +247 -0
  503. package/src/core/objects/publication/publication.model.ts +206 -0
  504. package/src/core/objects/publication/utils.ts +55 -0
  505. package/src/core/objects/rls-policy/changes/rls-policy.alter.test.ts +267 -0
  506. package/src/core/objects/rls-policy/changes/rls-policy.alter.ts +128 -0
  507. package/src/core/objects/rls-policy/changes/rls-policy.base.ts +20 -0
  508. package/src/core/objects/rls-policy/changes/rls-policy.comment.ts +69 -0
  509. package/src/core/objects/rls-policy/changes/rls-policy.create.test.ts +81 -0
  510. package/src/core/objects/rls-policy/changes/rls-policy.create.ts +100 -0
  511. package/src/core/objects/rls-policy/changes/rls-policy.drop.test.ts +31 -0
  512. package/src/core/objects/rls-policy/changes/rls-policy.drop.ts +39 -0
  513. package/src/core/objects/rls-policy/changes/rls-policy.types.ts +11 -0
  514. package/src/core/objects/rls-policy/rls-policy.diff.test.ts +79 -0
  515. package/src/core/objects/rls-policy/rls-policy.diff.ts +121 -0
  516. package/src/core/objects/rls-policy/rls-policy.model.ts +140 -0
  517. package/src/core/objects/role/changes/role.alter.test.ts +362 -0
  518. package/src/core/objects/role/changes/role.alter.ts +110 -0
  519. package/src/core/objects/role/changes/role.base.ts +24 -0
  520. package/src/core/objects/role/changes/role.comment.ts +55 -0
  521. package/src/core/objects/role/changes/role.create.test.ts +56 -0
  522. package/src/core/objects/role/changes/role.create.ts +102 -0
  523. package/src/core/objects/role/changes/role.drop.test.ts +32 -0
  524. package/src/core/objects/role/changes/role.drop.ts +34 -0
  525. package/src/core/objects/role/changes/role.privilege.ts +376 -0
  526. package/src/core/objects/role/changes/role.types.ts +13 -0
  527. package/src/core/objects/role/role.diff.test.ts +279 -0
  528. package/src/core/objects/role/role.diff.ts +499 -0
  529. package/src/core/objects/role/role.model.ts +452 -0
  530. package/src/core/objects/rule/changes/rule.alter.test.ts +82 -0
  531. package/src/core/objects/rule/changes/rule.alter.ts +72 -0
  532. package/src/core/objects/rule/changes/rule.base.ts +20 -0
  533. package/src/core/objects/rule/changes/rule.comment.test.ts +58 -0
  534. package/src/core/objects/rule/changes/rule.comment.ts +62 -0
  535. package/src/core/objects/rule/changes/rule.create.test.ts +63 -0
  536. package/src/core/objects/rule/changes/rule.create.ts +42 -0
  537. package/src/core/objects/rule/changes/rule.drop.test.ts +40 -0
  538. package/src/core/objects/rule/changes/rule.drop.ts +29 -0
  539. package/src/core/objects/rule/changes/rule.types.ts +13 -0
  540. package/src/core/objects/rule/rule.diff.test.ts +132 -0
  541. package/src/core/objects/rule/rule.diff.ts +79 -0
  542. package/src/core/objects/rule/rule.model.ts +173 -0
  543. package/src/core/objects/schema/changes/schema.alter.test.ts +31 -0
  544. package/src/core/objects/schema/changes/schema.alter.ts +45 -0
  545. package/src/core/objects/schema/changes/schema.base.ts +20 -0
  546. package/src/core/objects/schema/changes/schema.comment.ts +56 -0
  547. package/src/core/objects/schema/changes/schema.create.test.ts +25 -0
  548. package/src/core/objects/schema/changes/schema.create.ts +47 -0
  549. package/src/core/objects/schema/changes/schema.drop.test.ts +23 -0
  550. package/src/core/objects/schema/changes/schema.drop.ts +34 -0
  551. package/src/core/objects/schema/changes/schema.privilege.ts +175 -0
  552. package/src/core/objects/schema/changes/schema.types.ts +13 -0
  553. package/src/core/objects/schema/schema.diff.test.ts +42 -0
  554. package/src/core/objects/schema/schema.diff.ts +146 -0
  555. package/src/core/objects/schema/schema.model.ts +107 -0
  556. package/src/core/objects/sequence/changes/sequence.alter.test.ts +157 -0
  557. package/src/core/objects/sequence/changes/sequence.alter.ts +115 -0
  558. package/src/core/objects/sequence/changes/sequence.base.ts +20 -0
  559. package/src/core/objects/sequence/changes/sequence.comment.ts +60 -0
  560. package/src/core/objects/sequence/changes/sequence.create.test.ts +89 -0
  561. package/src/core/objects/sequence/changes/sequence.create.ts +111 -0
  562. package/src/core/objects/sequence/changes/sequence.drop.test.ts +35 -0
  563. package/src/core/objects/sequence/changes/sequence.drop.ts +37 -0
  564. package/src/core/objects/sequence/changes/sequence.privilege.ts +179 -0
  565. package/src/core/objects/sequence/changes/sequence.types.ts +13 -0
  566. package/src/core/objects/sequence/sequence.diff.test.ts +255 -0
  567. package/src/core/objects/sequence/sequence.diff.ts +294 -0
  568. package/src/core/objects/sequence/sequence.model.ts +185 -0
  569. package/src/core/objects/subscription/changes/subscription.alter.test.ts +134 -0
  570. package/src/core/objects/subscription/changes/subscription.alter.ts +110 -0
  571. package/src/core/objects/subscription/changes/subscription.base.ts +20 -0
  572. package/src/core/objects/subscription/changes/subscription.comment.test.ts +70 -0
  573. package/src/core/objects/subscription/changes/subscription.comment.ts +64 -0
  574. package/src/core/objects/subscription/changes/subscription.create.test.ts +80 -0
  575. package/src/core/objects/subscription/changes/subscription.create.ts +69 -0
  576. package/src/core/objects/subscription/changes/subscription.drop.test.ts +48 -0
  577. package/src/core/objects/subscription/changes/subscription.drop.ts +20 -0
  578. package/src/core/objects/subscription/changes/subscription.types.ts +23 -0
  579. package/src/core/objects/subscription/subscription.diff.test.ts +237 -0
  580. package/src/core/objects/subscription/subscription.diff.ts +242 -0
  581. package/src/core/objects/subscription/subscription.model.ts +190 -0
  582. package/src/core/objects/subscription/utils.ts +156 -0
  583. package/src/core/objects/table/changes/table.alter.test.ts +846 -0
  584. package/src/core/objects/table/changes/table.alter.ts +806 -0
  585. package/src/core/objects/table/changes/table.base.ts +20 -0
  586. package/src/core/objects/table/changes/table.comment.ts +266 -0
  587. package/src/core/objects/table/changes/table.create.test.ts +188 -0
  588. package/src/core/objects/table/changes/table.create.ts +192 -0
  589. package/src/core/objects/table/changes/table.drop.test.ts +36 -0
  590. package/src/core/objects/table/changes/table.drop.ts +45 -0
  591. package/src/core/objects/table/changes/table.privilege.ts +200 -0
  592. package/src/core/objects/table/changes/table.types.ts +13 -0
  593. package/src/core/objects/table/table.diff.test.ts +868 -0
  594. package/src/core/objects/table/table.diff.ts +817 -0
  595. package/src/core/objects/table/table.model.ts +460 -0
  596. package/src/core/objects/trigger/changes/trigger.alter.test.ts +50 -0
  597. package/src/core/objects/trigger/changes/trigger.alter.ts +76 -0
  598. package/src/core/objects/trigger/changes/trigger.base.ts +20 -0
  599. package/src/core/objects/trigger/changes/trigger.comment.ts +64 -0
  600. package/src/core/objects/trigger/changes/trigger.create.test.ts +47 -0
  601. package/src/core/objects/trigger/changes/trigger.create.ts +88 -0
  602. package/src/core/objects/trigger/changes/trigger.drop.test.ts +47 -0
  603. package/src/core/objects/trigger/changes/trigger.drop.ts +39 -0
  604. package/src/core/objects/trigger/changes/trigger.types.ts +11 -0
  605. package/src/core/objects/trigger/trigger.diff.test.ts +84 -0
  606. package/src/core/objects/trigger/trigger.diff.ts +116 -0
  607. package/src/core/objects/trigger/trigger.model.ts +264 -0
  608. package/src/core/objects/type/composite-type/changes/composite-type.alter.test.ts +208 -0
  609. package/src/core/objects/type/composite-type/changes/composite-type.alter.ts +174 -0
  610. package/src/core/objects/type/composite-type/changes/composite-type.base.ts +20 -0
  611. package/src/core/objects/type/composite-type/changes/composite-type.comment.ts +145 -0
  612. package/src/core/objects/type/composite-type/changes/composite-type.create.test.ts +106 -0
  613. package/src/core/objects/type/composite-type/changes/composite-type.create.ts +95 -0
  614. package/src/core/objects/type/composite-type/changes/composite-type.drop.test.ts +36 -0
  615. package/src/core/objects/type/composite-type/changes/composite-type.drop.ts +37 -0
  616. package/src/core/objects/type/composite-type/changes/composite-type.privilege.ts +175 -0
  617. package/src/core/objects/type/composite-type/changes/composite-type.types.ts +13 -0
  618. package/src/core/objects/type/composite-type/composite-type.diff.test.ts +269 -0
  619. package/src/core/objects/type/composite-type/composite-type.diff.ts +310 -0
  620. package/src/core/objects/type/composite-type/composite-type.model.ts +253 -0
  621. package/src/core/objects/type/enum/changes/enum.alter.test.ts +113 -0
  622. package/src/core/objects/type/enum/changes/enum.alter.ts +91 -0
  623. package/src/core/objects/type/enum/changes/enum.base.ts +20 -0
  624. package/src/core/objects/type/enum/changes/enum.comment.ts +64 -0
  625. package/src/core/objects/type/enum/changes/enum.create.test.ts +31 -0
  626. package/src/core/objects/type/enum/changes/enum.create.ts +56 -0
  627. package/src/core/objects/type/enum/changes/enum.drop.test.ts +28 -0
  628. package/src/core/objects/type/enum/changes/enum.drop.ts +34 -0
  629. package/src/core/objects/type/enum/changes/enum.privilege.ts +175 -0
  630. package/src/core/objects/type/enum/changes/enum.types.ts +13 -0
  631. package/src/core/objects/type/enum/enum.diff.test.ts +372 -0
  632. package/src/core/objects/type/enum/enum.diff.ts +308 -0
  633. package/src/core/objects/type/enum/enum.model.ts +194 -0
  634. package/src/core/objects/type/range/changes/range.alter.test.ts +29 -0
  635. package/src/core/objects/type/range/changes/range.alter.ts +51 -0
  636. package/src/core/objects/type/range/changes/range.base.ts +20 -0
  637. package/src/core/objects/type/range/changes/range.comment.ts +64 -0
  638. package/src/core/objects/type/range/changes/range.create.test.ts +54 -0
  639. package/src/core/objects/type/range/changes/range.create.ts +155 -0
  640. package/src/core/objects/type/range/changes/range.drop.test.ts +28 -0
  641. package/src/core/objects/type/range/changes/range.drop.ts +34 -0
  642. package/src/core/objects/type/range/changes/range.privilege.ts +175 -0
  643. package/src/core/objects/type/range/changes/range.types.ts +13 -0
  644. package/src/core/objects/type/range/range.diff.test.ts +147 -0
  645. package/src/core/objects/type/range/range.diff.ts +197 -0
  646. package/src/core/objects/type/range/range.model.ts +187 -0
  647. package/src/core/objects/type/type.types.ts +6 -0
  648. package/src/core/objects/utils.ts +171 -0
  649. package/src/core/objects/view/changes/view.alter.test.ts +115 -0
  650. package/src/core/objects/view/changes/view.alter.ts +112 -0
  651. package/src/core/objects/view/changes/view.base.ts +20 -0
  652. package/src/core/objects/view/changes/view.comment.ts +59 -0
  653. package/src/core/objects/view/changes/view.create.test.ts +70 -0
  654. package/src/core/objects/view/changes/view.create.ts +73 -0
  655. package/src/core/objects/view/changes/view.drop.test.ts +37 -0
  656. package/src/core/objects/view/changes/view.drop.ts +40 -0
  657. package/src/core/objects/view/changes/view.privilege.ts +200 -0
  658. package/src/core/objects/view/changes/view.types.ts +13 -0
  659. package/src/core/objects/view/view.diff.test.ts +269 -0
  660. package/src/core/objects/view/view.diff.ts +230 -0
  661. package/src/core/objects/view/view.model.ts +262 -0
  662. package/src/core/plan/apply.ts +172 -0
  663. package/src/core/plan/create.ts +384 -0
  664. package/src/core/plan/hierarchy.ts +574 -0
  665. package/src/core/plan/index.ts +29 -0
  666. package/src/core/plan/io.ts +20 -0
  667. package/src/core/plan/risk.ts +48 -0
  668. package/src/core/plan/serialize.test.ts +317 -0
  669. package/src/core/plan/serialize.ts +209 -0
  670. package/src/core/plan/sql-format/constants.ts +13 -0
  671. package/src/core/plan/sql-format/fixtures.ts +2803 -0
  672. package/src/core/plan/sql-format/format-comment-literals.test.ts +96 -0
  673. package/src/core/plan/sql-format/format-functions.test.ts +127 -0
  674. package/src/core/plan/sql-format/format-lowercase-coverage.test.ts +119 -0
  675. package/src/core/plan/sql-format/format-off.test.ts +806 -0
  676. package/src/core/plan/sql-format/format-pretty-lower-leading.test.ts +1061 -0
  677. package/src/core/plan/sql-format/format-pretty-narrow.test.ts +1279 -0
  678. package/src/core/plan/sql-format/format-pretty-preserve.test.ts +1057 -0
  679. package/src/core/plan/sql-format/format-pretty-upper.test.ts +1048 -0
  680. package/src/core/plan/sql-format/format-stress.test.ts +616 -0
  681. package/src/core/plan/sql-format/format-utils.test.ts +91 -0
  682. package/src/core/plan/sql-format/format-utils.ts +391 -0
  683. package/src/core/plan/sql-format/formatters.ts +921 -0
  684. package/src/core/plan/sql-format/index.ts +149 -0
  685. package/src/core/plan/sql-format/keyword-case.test.ts +118 -0
  686. package/src/core/plan/sql-format/keyword-case.ts +1120 -0
  687. package/src/core/plan/sql-format/protect.test.ts +127 -0
  688. package/src/core/plan/sql-format/protect.ts +337 -0
  689. package/src/core/plan/sql-format/sql-scanner.test.ts +240 -0
  690. package/src/core/plan/sql-format/sql-scanner.ts +252 -0
  691. package/src/core/plan/sql-format/tokenizer.test.ts +68 -0
  692. package/src/core/plan/sql-format/tokenizer.ts +152 -0
  693. package/src/core/plan/sql-format/types.ts +31 -0
  694. package/src/core/plan/sql-format/wrap.test.ts +119 -0
  695. package/src/core/plan/sql-format/wrap.ts +196 -0
  696. package/src/core/plan/sql-format.ts +2 -0
  697. package/src/core/plan/ssl-config.ts +172 -0
  698. package/src/core/plan/statements.ts +22 -0
  699. package/src/core/plan/types.ts +171 -0
  700. package/src/core/postgres-config.ts +293 -0
  701. package/src/core/sort/custom-constraints.ts +161 -0
  702. package/src/core/sort/debug-visualization.ts +239 -0
  703. package/src/core/sort/dependency-filter.ts +224 -0
  704. package/src/core/sort/graph-builder.ts +235 -0
  705. package/src/core/sort/graph-utils.ts +51 -0
  706. package/src/core/sort/logical-sort.test.ts +371 -0
  707. package/src/core/sort/logical-sort.ts +573 -0
  708. package/src/core/sort/sort-changes.ts +234 -0
  709. package/src/core/sort/topological-sort.test.ts +275 -0
  710. package/src/core/sort/topological-sort.ts +184 -0
  711. package/src/core/sort/types.ts +112 -0
  712. package/src/core/sort/utils.ts +69 -0
  713. package/src/core/test-utils/assert-valid-sql.ts +20 -0
  714. package/src/index.ts +41 -0
  715. package/src/typedoc.ts +248 -0
  716. package/dist/core/integrations/filter/extractors.d.ts +0 -12
  717. package/dist/core/integrations/filter/extractors.js +0 -136
@@ -0,0 +1,460 @@
1
+ import { sql } from "@ts-safeql/sql-tag";
2
+ import type { Pool } from "pg";
3
+ import z from "zod";
4
+ import {
5
+ BasePgModel,
6
+ columnPropsSchema,
7
+ normalizeColumns,
8
+ type TableLikeObject,
9
+ } from "../base.model.ts";
10
+ import { normalizePrivileges } from "../base.privilege.ts";
11
+ import {
12
+ type PrivilegeProps,
13
+ privilegePropsSchema,
14
+ } from "../base.privilege-diff.ts";
15
+
16
+ const RelationPersistenceSchema = z.enum([
17
+ "p", // permanent
18
+ "u", // unlogged
19
+ "t", // temporary
20
+ ]);
21
+
22
+ export const ReplicaIdentitySchema = z.enum([
23
+ "d", // DEFAULT (use default key)
24
+ "n", // NOTHING (no replica identity)
25
+ "f", // FULL (all columns)
26
+ "i", // INDEX (specific index)
27
+ ]);
28
+
29
+ const ForeignKeyActionSchema = z.enum([
30
+ "a", // NO ACTION
31
+ "r", // RESTRICT
32
+ "c", // CASCADE
33
+ "n", // SET NULL
34
+ "d", // SET DEFAULT
35
+ ]);
36
+
37
+ const ForeignKeyMatchTypeSchema = z.enum([
38
+ "f", // FULL
39
+ "p", // PARTIAL
40
+ "s", // SIMPLE
41
+ "u", // UNSPECIFIED (default)
42
+ ]);
43
+
44
+ const tableConstraintPropsSchema = z.object({
45
+ name: z.string(),
46
+ constraint_type: z.enum([
47
+ "c", // CHECK constraint
48
+ "f", // FOREIGN KEY constraint
49
+ "p", // PRIMARY KEY constraint
50
+ "t", // TRIGGER constraint
51
+ "u", // UNIQUE constraint
52
+ "x", // EXCLUDE constraint
53
+ ]),
54
+ deferrable: z.boolean(),
55
+ initially_deferred: z.boolean(),
56
+ validated: z.boolean(),
57
+ is_local: z.boolean(),
58
+ no_inherit: z.boolean(),
59
+ is_partition_clone: z.boolean(),
60
+ parent_constraint_schema: z.string().nullable(),
61
+ parent_constraint_name: z.string().nullable(),
62
+ parent_table_schema: z.string().nullable(),
63
+ parent_table_name: z.string().nullable(),
64
+ key_columns: z.array(z.string()),
65
+ foreign_key_columns: z.array(z.string()).nullable(),
66
+ foreign_key_table: z.string().nullable(),
67
+ foreign_key_schema: z.string().nullable(),
68
+ foreign_key_table_is_partition: z.boolean().nullable(),
69
+ foreign_key_parent_schema: z.string().nullable(),
70
+ foreign_key_parent_table: z.string().nullable(),
71
+ foreign_key_effective_schema: z.string().nullable(),
72
+ foreign_key_effective_table: z.string().nullable(),
73
+ on_update: ForeignKeyActionSchema.nullable(),
74
+ on_delete: ForeignKeyActionSchema.nullable(),
75
+ match_type: ForeignKeyMatchTypeSchema.nullable(),
76
+ check_expression: z.string().nullable(),
77
+ owner: z.string(),
78
+ definition: z.string(),
79
+ comment: z.string().nullable().optional(),
80
+ });
81
+
82
+ export type TableConstraintProps = z.infer<typeof tableConstraintPropsSchema>;
83
+
84
+ const tablePropsSchema = z.object({
85
+ schema: z.string(),
86
+ name: z.string(),
87
+ persistence: RelationPersistenceSchema,
88
+ row_security: z.boolean(),
89
+ force_row_security: z.boolean(),
90
+ has_indexes: z.boolean(),
91
+ has_rules: z.boolean(),
92
+ has_triggers: z.boolean(),
93
+ has_subclasses: z.boolean(),
94
+ is_populated: z.boolean(),
95
+ replica_identity: ReplicaIdentitySchema,
96
+ is_partition: z.boolean(),
97
+ options: z.array(z.string()).nullable(),
98
+ partition_bound: z.string().nullable(),
99
+ partition_by: z.string().nullable(),
100
+ owner: z.string(),
101
+ comment: z.string().nullable().optional(),
102
+ parent_schema: z.string().nullable(),
103
+ parent_name: z.string().nullable(),
104
+ columns: z.array(columnPropsSchema),
105
+ constraints: z.array(tableConstraintPropsSchema).optional(),
106
+ privileges: z.array(privilegePropsSchema),
107
+ });
108
+
109
+ type TablePrivilegeProps = PrivilegeProps;
110
+ export type TableProps = z.infer<typeof tablePropsSchema>;
111
+
112
+ export class Table extends BasePgModel implements TableLikeObject {
113
+ public readonly schema: TableProps["schema"];
114
+ public readonly name: TableProps["name"];
115
+ public readonly persistence: TableProps["persistence"];
116
+ public readonly row_security: TableProps["row_security"];
117
+ public readonly force_row_security: TableProps["force_row_security"];
118
+ public readonly has_indexes: TableProps["has_indexes"];
119
+ public readonly has_rules: TableProps["has_rules"];
120
+ public readonly has_triggers: TableProps["has_triggers"];
121
+ public readonly has_subclasses: TableProps["has_subclasses"];
122
+ public readonly is_populated: TableProps["is_populated"];
123
+ public readonly replica_identity: TableProps["replica_identity"];
124
+ public readonly is_partition: TableProps["is_partition"];
125
+ public readonly options: TableProps["options"];
126
+ public readonly partition_bound: TableProps["partition_bound"];
127
+ public readonly partition_by: TableProps["partition_by"];
128
+ public readonly owner: TableProps["owner"];
129
+ public readonly comment: TableProps["comment"];
130
+ public readonly parent_schema: TableProps["parent_schema"];
131
+ public readonly parent_name: TableProps["parent_name"];
132
+ public readonly columns: TableProps["columns"];
133
+ public readonly constraints: TableConstraintProps[];
134
+ public readonly privileges: TablePrivilegeProps[];
135
+
136
+ constructor(props: TableProps) {
137
+ super();
138
+
139
+ // Identity fields
140
+ this.schema = props.schema;
141
+ this.name = props.name;
142
+
143
+ // Data fields
144
+ this.persistence = props.persistence;
145
+ this.row_security = props.row_security;
146
+ this.force_row_security = props.force_row_security;
147
+ this.has_indexes = props.has_indexes;
148
+ this.has_rules = props.has_rules;
149
+ this.has_triggers = props.has_triggers;
150
+ this.has_subclasses = props.has_subclasses;
151
+ this.is_populated = props.is_populated;
152
+ this.replica_identity = props.replica_identity;
153
+ this.is_partition = props.is_partition;
154
+ this.options = props.options;
155
+ this.partition_bound = props.partition_bound;
156
+ this.partition_by = props.partition_by;
157
+ this.owner = props.owner;
158
+ this.comment = props.comment;
159
+ this.parent_schema = props.parent_schema;
160
+ this.parent_name = props.parent_name;
161
+ this.columns = props.columns;
162
+ this.constraints = props.constraints ?? [];
163
+ this.privileges = props.privileges;
164
+ }
165
+
166
+ get stableId(): `table:${string}` {
167
+ return `table:${this.schema}.${this.name}`;
168
+ }
169
+
170
+ get identityFields() {
171
+ return {
172
+ schema: this.schema,
173
+ name: this.name,
174
+ };
175
+ }
176
+
177
+ get dataFields() {
178
+ return {
179
+ // Only include fields that can be managed via ALTER safely
180
+ persistence: this.persistence,
181
+ row_security: this.row_security,
182
+ force_row_security: this.force_row_security,
183
+ replica_identity: this.replica_identity,
184
+ options: this.options,
185
+ // Partition membership can be altered via ATTACH/DETACH
186
+ parent_schema: this.parent_schema,
187
+ parent_name: this.parent_name,
188
+ partition_bound: this.partition_bound,
189
+ owner: this.owner,
190
+ comment: this.comment,
191
+ columns: this.columns,
192
+ constraints: this.constraints,
193
+ privileges: this.privileges,
194
+ };
195
+ }
196
+
197
+ override stableSnapshot() {
198
+ const normalizeConstraints = () =>
199
+ [...this.constraints].sort((a, b) => {
200
+ const nameA = (a.name as string | undefined) ?? "";
201
+ const nameB = (b.name as string | undefined) ?? "";
202
+ return nameA.localeCompare(nameB);
203
+ });
204
+
205
+ return {
206
+ identity: this.identityFields,
207
+ data: {
208
+ ...this.dataFields,
209
+ columns: normalizeColumns(this.columns),
210
+ options: this.options ? [...this.options].sort() : this.options,
211
+ constraints: normalizeConstraints(),
212
+ privileges: normalizePrivileges(this.privileges),
213
+ },
214
+ };
215
+ }
216
+ }
217
+
218
+ export async function extractTables(pool: Pool): Promise<Table[]> {
219
+ const { rows: tableRows } = await pool.query<TableProps>(sql`
220
+ with extension_oids as (
221
+ select objid
222
+ from pg_depend d
223
+ where d.refclassid = 'pg_extension'::regclass
224
+ and d.classid = 'pg_class'::regclass
225
+ ), tables as (
226
+ select
227
+ c.relnamespace::regnamespace::text as schema,
228
+ quote_ident(c.relname) as name,
229
+ c.relpersistence as persistence,
230
+ c.relrowsecurity as row_security,
231
+ c.relforcerowsecurity as force_row_security,
232
+ c.relhasindex as has_indexes,
233
+ c.relhasrules as has_rules,
234
+ c.relhastriggers as has_triggers,
235
+ c.relhassubclass as has_subclasses,
236
+ c.relispopulated as is_populated,
237
+ c.relreplident as replica_identity,
238
+ c.relispartition as is_partition,
239
+ c.reloptions as options,
240
+ pg_get_expr(c.relpartbound, c.oid) as partition_bound,
241
+ pg_get_partkeydef(c.oid) as partition_by,
242
+ c.relowner::regrole::text as owner,
243
+ c_parent.relnamespace::regnamespace as parent_schema,
244
+ quote_ident(c_parent.relname) as parent_name,
245
+ c.oid as oid
246
+ from
247
+ pg_class c
248
+ left join extension_oids e1 on c.oid = e1.objid
249
+ left join pg_inherits i on i.inhrelid = c.oid
250
+ left join pg_class c_parent on i.inhparent = c_parent.oid
251
+ where
252
+ c.relkind in ('r', 'p')
253
+ and not c.relnamespace::regnamespace::text like any(array['pg\\_%', 'information\\_schema'])
254
+ and e1.objid is null
255
+ )
256
+ select
257
+ t.schema,
258
+ t.name,
259
+ t.persistence,
260
+ t.row_security,
261
+ t.force_row_security,
262
+ t.has_indexes,
263
+ t.has_rules,
264
+ t.has_triggers,
265
+ t.has_subclasses,
266
+ t.is_populated,
267
+ t.replica_identity,
268
+ t.is_partition,
269
+ t.options,
270
+ t.partition_bound,
271
+ t.partition_by,
272
+ t.owner,
273
+ obj_description(t.oid, 'pg_class') as comment,
274
+ t.parent_schema,
275
+ t.parent_name,
276
+ coalesce(
277
+ (
278
+ select json_agg(
279
+ json_build_object(
280
+ 'name', quote_ident(c.conname),
281
+ 'constraint_type', c.contype,
282
+ 'deferrable', c.condeferrable,
283
+ 'initially_deferred', c.condeferred,
284
+ 'validated', c.convalidated,
285
+ 'is_local', c.conislocal,
286
+ 'no_inherit', c.connoinherit,
287
+
288
+ -- NEW: propagated-to-partition tagging (PG15+)
289
+ 'is_partition_clone', (c.conparentid <> 0::oid),
290
+ 'parent_constraint_schema', case when c.conparentid <> 0::oid then pc.connamespace::regnamespace::text end,
291
+ 'parent_constraint_name', case when c.conparentid <> 0::oid then quote_ident(pc.conname) end,
292
+ 'parent_table_schema', case when c.conparentid <> 0::oid then pc_rel.relnamespace::regnamespace::text end,
293
+ 'parent_table_name', case when c.conparentid <> 0::oid then quote_ident(pc_rel.relname) end,
294
+
295
+ 'key_columns',
296
+ case
297
+ when c.conkey is not null then (
298
+ select json_agg(quote_ident(att.attname) order by pk.ordinality)
299
+ from unnest(c.conkey) with ordinality as pk(attnum, ordinality)
300
+ join pg_attribute att
301
+ on att.attrelid = c.conrelid
302
+ and att.attnum = pk.attnum
303
+ and att.attisdropped = false
304
+ )
305
+ else '[]'::json
306
+ end,
307
+
308
+ 'foreign_key_columns',
309
+ case
310
+ when c.contype = 'f' then (
311
+ select json_agg(quote_ident(att.attname) order by fk.ordinality)
312
+ from unnest(c.confkey) with ordinality as fk(attnum, ordinality)
313
+ join pg_attribute att
314
+ on att.attrelid = c.confrelid
315
+ and att.attnum = fk.attnum
316
+ and att.attisdropped = false
317
+ )
318
+ else null
319
+ end,
320
+
321
+ -- existing FK target
322
+ 'foreign_key_table', quote_ident(ftc.relname),
323
+ 'foreign_key_schema', ftc.relnamespace::regnamespace::text,
324
+
325
+ -- NEW: if FK points at a *partition*, expose its parent + an "effective" target
326
+ 'foreign_key_table_is_partition',
327
+ case when c.contype = 'f' then coalesce(ftc.relispartition, false) else null end,
328
+ 'foreign_key_parent_schema',
329
+ case when c.contype = 'f' and ftc.relispartition then ftc_parent.relnamespace::regnamespace::text else null end,
330
+ 'foreign_key_parent_table',
331
+ case when c.contype = 'f' and ftc.relispartition then quote_ident(ftc_parent.relname) else null end,
332
+ 'foreign_key_effective_schema',
333
+ case
334
+ when c.contype <> 'f' then null
335
+ when ftc.relispartition then ftc_parent.relnamespace::regnamespace::text
336
+ else ftc.relnamespace::regnamespace::text
337
+ end,
338
+ 'foreign_key_effective_table',
339
+ case
340
+ when c.contype <> 'f' then null
341
+ when ftc.relispartition then quote_ident(ftc_parent.relname)
342
+ else quote_ident(ftc.relname)
343
+ end,
344
+
345
+ 'on_update', case when c.contype = 'f' then c.confupdtype else null end,
346
+ 'on_delete', case when c.contype = 'f' then c.confdeltype else null end,
347
+ 'match_type', case when c.contype = 'f' then c.confmatchtype else null end,
348
+
349
+ 'check_expression', pg_get_expr(c.conbin, c.conrelid),
350
+ 'owner', t.owner,
351
+ 'definition', pg_get_constraintdef(c.oid, true),
352
+ 'comment', obj_description(c.oid, 'pg_constraint')
353
+ )
354
+ order by c.conname
355
+ )
356
+ from pg_catalog.pg_constraint c
357
+
358
+ -- NEW: parent constraint/table lookup (for propagated constraints)
359
+ left join pg_catalog.pg_constraint pc on pc.oid = c.conparentid
360
+ left join pg_catalog.pg_class pc_rel on pc_rel.oid = pc.conrelid
361
+
362
+ -- FK referenced table + parent table if it’s a partition
363
+ left join pg_catalog.pg_class ftc on ftc.oid = c.confrelid
364
+ left join pg_catalog.pg_inherits fi on fi.inhrelid = ftc.oid
365
+ left join pg_catalog.pg_class ftc_parent on ftc_parent.oid = fi.inhparent
366
+
367
+ left join pg_depend de
368
+ on de.classid = 'pg_constraint'::regclass
369
+ and de.objid = c.oid
370
+ and de.refclassid = 'pg_extension'::regclass
371
+
372
+ where c.conrelid = t.oid
373
+ -- Skip constraint triggers and PG18 NOT NULL constraints; they are modeled elsewhere
374
+ and c.contype not in ('t', 'n')
375
+ and not c.connamespace::regnamespace::text like any(array['pg\\_%', 'information\\_schema'])
376
+ and de.objid is null
377
+ ),
378
+ '[]'
379
+ ) as constraints,
380
+ coalesce(json_agg(
381
+ case when a.attname is not null then
382
+ json_build_object(
383
+ 'name', quote_ident(a.attname),
384
+ 'position', a.attnum,
385
+ 'data_type', a.atttypid::regtype::text,
386
+ 'data_type_str', format_type(a.atttypid, a.atttypmod),
387
+ 'is_custom_type', ty.typnamespace::regnamespace::text not in ('pg_catalog', 'information_schema'),
388
+ 'custom_type_type', case when ty.typnamespace::regnamespace::text not in ('pg_catalog', 'information_schema') then ty.typtype else null end,
389
+ 'custom_type_category', case when ty.typnamespace::regnamespace::text not in ('pg_catalog', 'information_schema') then ty.typcategory else null end,
390
+ 'custom_type_schema', case when ty.typnamespace::regnamespace::text not in ('pg_catalog', 'information_schema') then ty.typnamespace::regnamespace else null end,
391
+ 'custom_type_name', case when ty.typnamespace::regnamespace::text not in ('pg_catalog', 'information_schema') then quote_ident(ty.typname) else null end,
392
+ 'not_null', a.attnotnull,
393
+ 'is_identity', a.attidentity != '',
394
+ 'is_identity_always', a.attidentity = 'a',
395
+ 'is_generated', a.attgenerated != '',
396
+ 'collation', (
397
+ select quote_ident(c2.collname)
398
+ from pg_collation c2, pg_type t2
399
+ where c2.oid = a.attcollation
400
+ and t2.oid = a.atttypid
401
+ and a.attcollation <> t2.typcollation
402
+ ),
403
+ 'default', pg_get_expr(ad.adbin, ad.adrelid),
404
+ 'comment', col_description(a.attrelid, a.attnum)
405
+ )
406
+ end
407
+ order by a.attnum
408
+ ) filter (where a.attname is not null), '[]') as columns,
409
+ coalesce((
410
+ select json_agg(
411
+ json_build_object(
412
+ 'grantee', case when grp.grantee = 0 then 'PUBLIC' else grp.grantee::regrole::text end,
413
+ 'privilege', grp.privilege_type,
414
+ 'grantable', grp.is_grantable,
415
+ 'columns', case when grp.cols is not null and array_length(grp.cols,1) > 0
416
+ then grp.cols
417
+ else null end
418
+ )
419
+ order by grp.grantee, grp.privilege_type
420
+ )
421
+ from (
422
+ select
423
+ x.grantee,
424
+ x.privilege_type,
425
+ bool_or(x.is_grantable) as is_grantable,
426
+ array_agg(quote_ident(src.attname) order by src.attname)
427
+ filter (where src.attname is not null) as cols
428
+ from (
429
+ -- one row for object ACL + one row per column ACL
430
+ select null::name as attname, t.oid as relacl_oid, (
431
+ select COALESCE(c_rel.relacl, acldefault('r', c_rel.relowner)) from pg_class c_rel where c_rel.oid = t.oid
432
+ ) as acl
433
+ union all
434
+ select a2.attname, t.oid as relacl_oid, a2.attacl
435
+ from pg_attribute a2
436
+ where a2.attrelid = t.oid
437
+ and a2.attnum > 0
438
+ and not a2.attisdropped
439
+ and a2.attacl is not null
440
+ ) as src
441
+ join lateral aclexplode(src.acl) as x(grantor, grantee, privilege_type, is_grantable) on true
442
+ group by x.grantee, x.privilege_type
443
+ ) as grp
444
+ ), '[]') as privileges
445
+ from
446
+ tables t
447
+ left join pg_attribute a on a.attrelid = t.oid and a.attnum > 0 and not a.attisdropped
448
+ left join pg_attrdef ad on a.attrelid = ad.adrelid and a.attnum = ad.adnum
449
+ left join pg_type ty on ty.oid = a.atttypid
450
+ group by
451
+ t.oid, t.schema, t.name, t.persistence, t.row_security, t.force_row_security, t.has_indexes, t.has_rules, t.has_triggers, t.has_subclasses, t.is_populated, t.replica_identity, t.is_partition, t.options, t.partition_bound, t.partition_by, t.owner, t.parent_schema, t.parent_name
452
+ order by
453
+ t.schema, t.name
454
+ `);
455
+ // Validate and parse each row using the Zod schema
456
+ const validatedRows = tableRows.map((row: unknown) =>
457
+ tablePropsSchema.parse(row),
458
+ );
459
+ return validatedRows.map((row: TableProps) => new Table(row));
460
+ }
@@ -0,0 +1,50 @@
1
+ import { describe, expect, test } from "bun:test";
2
+ import { assertValidSql } from "../../../test-utils/assert-valid-sql.ts";
3
+ import { Trigger, type TriggerProps } from "../trigger.model.ts";
4
+ import { ReplaceTrigger } from "./trigger.alter.ts";
5
+
6
+ describe.concurrent("trigger", () => {
7
+ describe("alter", () => {
8
+ test("replace trigger", async () => {
9
+ const props: Omit<TriggerProps, "enabled"> = {
10
+ schema: "public",
11
+ name: "test_trigger",
12
+ table_name: "test_table",
13
+ table_relkind: "r",
14
+ function_schema: "public",
15
+ function_name: "test_function",
16
+ trigger_type: 1 << 4, // UPDATE (1<<4) = 16, AFTER is default (0), STATEMENT is default (0)
17
+ is_internal: false,
18
+ deferrable: false,
19
+ initially_deferred: false,
20
+ argument_count: 0,
21
+ column_numbers: null,
22
+ arguments: [],
23
+ when_condition: null,
24
+ old_table: null,
25
+ new_table: null,
26
+ is_partition_clone: false,
27
+ parent_trigger_name: null,
28
+ parent_table_schema: null,
29
+ parent_table_name: null,
30
+ is_on_partitioned_table: false,
31
+ owner: "test",
32
+ definition:
33
+ "CREATE TRIGGER test_trigger AFTER UPDATE ON public.test_table EXECUTE FUNCTION public.test_function()",
34
+ comment: null,
35
+ };
36
+ const branch = new Trigger({
37
+ ...props,
38
+ enabled: "D",
39
+ });
40
+
41
+ const change = new ReplaceTrigger({ trigger: branch });
42
+
43
+ await assertValidSql(change.serialize());
44
+
45
+ expect(change.serialize()).toBe(
46
+ "CREATE OR REPLACE TRIGGER test_trigger AFTER UPDATE ON public.test_table EXECUTE FUNCTION public.test_function()",
47
+ );
48
+ });
49
+ });
50
+ });
@@ -0,0 +1,76 @@
1
+ import { quoteLiteral } from "../../base.change.ts";
2
+ import type { TableLikeObject } from "../../base.model.ts";
3
+ import type { Trigger } from "../trigger.model.ts";
4
+ import { AlterTriggerChange } from "./trigger.base.ts";
5
+ import { CreateTrigger } from "./trigger.create.ts";
6
+ import { DropTrigger } from "./trigger.drop.ts";
7
+
8
+ /**
9
+ * Alter a trigger.
10
+ *
11
+ * @see https://www.postgresql.org/docs/17/sql-altertrigger.html
12
+ *
13
+ * Synopsis
14
+ * ```sql
15
+ * ALTER TRIGGER name ON table_name RENAME TO new_name
16
+ * ```
17
+ */
18
+
19
+ export type AlterTrigger = ReplaceTrigger;
20
+
21
+ /**
22
+ * Replace a trigger by dropping and recreating it.
23
+ * This is used when properties that cannot be altered via ALTER TRIGGER change.
24
+ */
25
+ export class ReplaceTrigger extends AlterTriggerChange {
26
+ public readonly trigger: Trigger;
27
+ public readonly indexableObject?: TableLikeObject;
28
+ public readonly scope = "object" as const;
29
+
30
+ constructor(props: {
31
+ trigger: Trigger;
32
+ indexableObject?: TableLikeObject;
33
+ }) {
34
+ super();
35
+ this.trigger = props.trigger;
36
+ this.indexableObject = props.indexableObject;
37
+ }
38
+
39
+ get requires() {
40
+ return [this.trigger.stableId];
41
+ }
42
+
43
+ serialize(): string {
44
+ if (this.trigger.isConstraintTrigger) {
45
+ const dropChange = new DropTrigger({ trigger: this.trigger });
46
+ const createChange = new CreateTrigger({
47
+ trigger: this.trigger,
48
+ indexableObject: this.indexableObject,
49
+ orReplace: false,
50
+ });
51
+ const commentSql =
52
+ this.trigger.comment !== null
53
+ ? [
54
+ "COMMENT ON TRIGGER",
55
+ this.trigger.name,
56
+ "ON",
57
+ `${this.trigger.schema}.${this.trigger.table_name}`,
58
+ "IS",
59
+ quoteLiteral(this.trigger.comment),
60
+ ].join(" ")
61
+ : null;
62
+
63
+ return [dropChange.serialize(), createChange.serialize(), commentSql]
64
+ .filter(Boolean)
65
+ .join(";\n");
66
+ }
67
+
68
+ const createChange = new CreateTrigger({
69
+ trigger: this.trigger,
70
+ indexableObject: this.indexableObject,
71
+ orReplace: true,
72
+ });
73
+
74
+ return createChange.serialize();
75
+ }
76
+ }
@@ -0,0 +1,20 @@
1
+ import { BaseChange } from "../../base.change.ts";
2
+ import type { Trigger } from "../trigger.model.ts";
3
+
4
+ abstract class BaseTriggerChange extends BaseChange {
5
+ abstract readonly trigger: Trigger;
6
+ abstract readonly scope: "object" | "comment";
7
+ readonly objectType: "trigger" = "trigger";
8
+ }
9
+
10
+ export abstract class CreateTriggerChange extends BaseTriggerChange {
11
+ readonly operation = "create" as const;
12
+ }
13
+
14
+ export abstract class AlterTriggerChange extends BaseTriggerChange {
15
+ readonly operation = "alter" as const;
16
+ }
17
+
18
+ export abstract class DropTriggerChange extends BaseTriggerChange {
19
+ readonly operation = "drop" as const;
20
+ }
@@ -0,0 +1,64 @@
1
+ import { quoteLiteral } from "../../base.change.ts";
2
+ import { stableId } from "../../utils.ts";
3
+ import type { Trigger } from "../trigger.model.ts";
4
+ import { CreateTriggerChange, DropTriggerChange } from "./trigger.base.ts";
5
+
6
+ export type CommentTrigger = CreateCommentOnTrigger | DropCommentOnTrigger;
7
+
8
+ export class CreateCommentOnTrigger extends CreateTriggerChange {
9
+ public readonly trigger: Trigger;
10
+ public readonly scope = "comment" as const;
11
+
12
+ constructor(props: { trigger: Trigger }) {
13
+ super();
14
+ this.trigger = props.trigger;
15
+ }
16
+
17
+ get creates() {
18
+ return [stableId.comment(this.trigger.stableId)];
19
+ }
20
+
21
+ get requires() {
22
+ return [this.trigger.stableId];
23
+ }
24
+
25
+ serialize(): string {
26
+ return [
27
+ "COMMENT ON TRIGGER",
28
+ this.trigger.name,
29
+ "ON",
30
+ `${this.trigger.schema}.${this.trigger.table_name}`,
31
+ "IS",
32
+ // biome-ignore lint/style/noNonNullAssertion: trigger comment is not nullable in this case
33
+ quoteLiteral(this.trigger.comment!),
34
+ ].join(" ");
35
+ }
36
+ }
37
+
38
+ export class DropCommentOnTrigger extends DropTriggerChange {
39
+ public readonly trigger: Trigger;
40
+ public readonly scope = "comment" as const;
41
+
42
+ constructor(props: { trigger: Trigger }) {
43
+ super();
44
+ this.trigger = props.trigger;
45
+ }
46
+
47
+ get drops() {
48
+ return [stableId.comment(this.trigger.stableId)];
49
+ }
50
+
51
+ get requires() {
52
+ return [stableId.comment(this.trigger.stableId), this.trigger.stableId];
53
+ }
54
+
55
+ serialize(): string {
56
+ return [
57
+ "COMMENT ON TRIGGER",
58
+ this.trigger.name,
59
+ "ON",
60
+ `${this.trigger.schema}.${this.trigger.table_name}`,
61
+ "IS NULL",
62
+ ].join(" ");
63
+ }
64
+ }