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

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 (633) 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 +245 -0
  10. package/dist/cli/commands/plan.js +40 -6
  11. package/dist/cli/exit-code.d.ts +2 -0
  12. package/dist/cli/exit-code.js +7 -0
  13. package/dist/cli/formatters/tree/tree.js +3 -2
  14. package/dist/cli/utils/apply-display.d.ts +52 -0
  15. package/dist/cli/utils/apply-display.js +183 -0
  16. package/dist/cli/utils/export-display.d.ts +43 -0
  17. package/dist/cli/utils/export-display.js +202 -0
  18. package/dist/cli/utils/resolve-input.d.ts +7 -0
  19. package/dist/cli/utils/resolve-input.js +13 -0
  20. package/dist/cli/utils.d.ts +2 -0
  21. package/dist/cli/utils.js +1 -1
  22. package/dist/core/catalog-export/index.d.ts +11 -0
  23. package/dist/core/catalog-export/index.js +10 -0
  24. package/dist/core/catalog.diff.d.ts +1 -0
  25. package/dist/core/catalog.diff.js +64 -48
  26. package/dist/core/catalog.model.d.ts +14 -1
  27. package/dist/core/catalog.model.js +103 -1
  28. package/dist/core/catalog.snapshot.d.ts +66 -0
  29. package/dist/core/catalog.snapshot.js +206 -0
  30. package/dist/core/declarative-apply/discover-sql.d.ts +18 -0
  31. package/dist/core/declarative-apply/discover-sql.js +86 -0
  32. package/dist/core/declarative-apply/extract-catalog-providers.d.ts +23 -0
  33. package/dist/core/declarative-apply/extract-catalog-providers.js +159 -0
  34. package/dist/core/declarative-apply/index.d.ts +49 -0
  35. package/dist/core/declarative-apply/index.js +134 -0
  36. package/dist/core/declarative-apply/round-apply.d.ts +100 -0
  37. package/dist/core/declarative-apply/round-apply.js +378 -0
  38. package/dist/core/export/file-mapper.d.ts +71 -0
  39. package/dist/core/export/file-mapper.js +474 -0
  40. package/dist/core/export/grouper.d.ts +13 -0
  41. package/dist/core/export/grouper.js +76 -0
  42. package/dist/core/export/index.d.ts +45 -0
  43. package/dist/core/export/index.js +63 -0
  44. package/dist/core/export/types.d.ts +84 -0
  45. package/dist/core/export/types.js +25 -0
  46. package/dist/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
  47. package/dist/core/integrations/filter/dsl.d.ts +38 -1
  48. package/dist/core/integrations/filter/dsl.js +20 -2
  49. package/dist/core/integrations/filter/extractors.js +42 -0
  50. package/dist/core/integrations/integration-dsl.d.ts +10 -0
  51. package/dist/core/integrations/supabase.d.ts +8 -0
  52. package/dist/core/integrations/supabase.js +9 -0
  53. package/dist/core/objects/aggregate/aggregate.diff.d.ts +2 -8
  54. package/dist/core/objects/aggregate/aggregate.diff.js +16 -70
  55. package/dist/core/objects/aggregate/aggregate.model.d.ts +8 -8
  56. package/dist/core/objects/aggregate/aggregate.model.js +1 -1
  57. package/dist/core/objects/aggregate/changes/aggregate.create.js +1 -1
  58. package/dist/core/objects/aggregate/changes/aggregate.drop.js +1 -1
  59. package/dist/core/objects/base.privilege-diff.d.ts +38 -13
  60. package/dist/core/objects/base.privilege-diff.js +104 -22
  61. package/dist/core/objects/base.privilege.d.ts +1 -0
  62. package/dist/core/objects/base.privilege.js +9 -2
  63. package/dist/core/objects/collation/collation.diff.d.ts +2 -3
  64. package/dist/core/objects/diff-context.d.ts +15 -0
  65. package/dist/core/objects/diff-context.js +1 -0
  66. package/dist/core/objects/domain/changes/domain.create.js +4 -2
  67. package/dist/core/objects/domain/domain.diff.d.ts +2 -8
  68. package/dist/core/objects/domain/domain.diff.js +16 -77
  69. package/dist/core/objects/domain/domain.model.js +1 -1
  70. package/dist/core/objects/event-trigger/event-trigger.diff.d.ts +2 -3
  71. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.d.ts +2 -8
  72. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.js +13 -77
  73. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.js +2 -2
  74. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.d.ts +2 -8
  75. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.js +16 -77
  76. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.js +1 -1
  77. package/dist/core/objects/foreign-data-wrapper/server/server.diff.d.ts +2 -8
  78. package/dist/core/objects/foreign-data-wrapper/server/server.diff.js +13 -77
  79. package/dist/core/objects/language/language.diff.d.ts +2 -5
  80. package/dist/core/objects/language/language.diff.js +7 -39
  81. package/dist/core/objects/materialized-view/materialized-view.diff.d.ts +2 -8
  82. package/dist/core/objects/materialized-view/materialized-view.diff.js +16 -158
  83. package/dist/core/objects/materialized-view/materialized-view.model.d.ts +3 -3
  84. package/dist/core/objects/materialized-view/materialized-view.model.js +1 -1
  85. package/dist/core/objects/procedure/changes/procedure.alter.js +12 -12
  86. package/dist/core/objects/procedure/procedure.diff.d.ts +2 -8
  87. package/dist/core/objects/procedure/procedure.diff.js +16 -77
  88. package/dist/core/objects/procedure/procedure.model.d.ts +9 -9
  89. package/dist/core/objects/procedure/procedure.model.js +1 -1
  90. package/dist/core/objects/publication/changes/publication.alter.d.ts +0 -9
  91. package/dist/core/objects/publication/changes/publication.alter.js +0 -14
  92. package/dist/core/objects/publication/changes/publication.types.d.ts +2 -2
  93. package/dist/core/objects/publication/publication.diff.d.ts +2 -3
  94. package/dist/core/objects/publication/publication.diff.js +8 -13
  95. package/dist/core/objects/rls-policy/changes/rls-policy.alter.js +3 -3
  96. package/dist/core/objects/rls-policy/rls-policy.model.d.ts +2 -2
  97. package/dist/core/objects/role/role.diff.js +22 -1
  98. package/dist/core/objects/role/role.model.d.ts +4 -3
  99. package/dist/core/objects/role/role.model.js +118 -12
  100. package/dist/core/objects/rule/rule.model.d.ts +1 -1
  101. package/dist/core/objects/schema/schema.diff.d.ts +2 -8
  102. package/dist/core/objects/schema/schema.diff.js +16 -77
  103. package/dist/core/objects/schema/schema.model.js +1 -1
  104. package/dist/core/objects/sequence/sequence.diff.d.ts +2 -8
  105. package/dist/core/objects/sequence/sequence.diff.js +16 -79
  106. package/dist/core/objects/sequence/sequence.model.js +1 -1
  107. package/dist/core/objects/subscription/subscription.diff.d.ts +2 -3
  108. package/dist/core/objects/table/changes/table.create.js +3 -0
  109. package/dist/core/objects/table/table.diff.d.ts +2 -8
  110. package/dist/core/objects/table/table.diff.js +26 -157
  111. package/dist/core/objects/table/table.model.d.ts +25 -22
  112. package/dist/core/objects/table/table.model.js +4 -1
  113. package/dist/core/objects/trigger/changes/trigger.alter.js +23 -0
  114. package/dist/core/objects/trigger/changes/trigger.create.js +4 -5
  115. package/dist/core/objects/trigger/trigger.model.d.ts +9 -0
  116. package/dist/core/objects/trigger/trigger.model.js +14 -0
  117. package/dist/core/objects/type/composite-type/composite-type.diff.d.ts +2 -8
  118. package/dist/core/objects/type/composite-type/composite-type.diff.js +16 -77
  119. package/dist/core/objects/type/composite-type/composite-type.model.d.ts +3 -3
  120. package/dist/core/objects/type/composite-type/composite-type.model.js +2 -1
  121. package/dist/core/objects/type/enum/enum.diff.d.ts +2 -8
  122. package/dist/core/objects/type/enum/enum.diff.js +25 -112
  123. package/dist/core/objects/type/enum/enum.model.js +1 -1
  124. package/dist/core/objects/type/range/changes/range.create.js +6 -3
  125. package/dist/core/objects/type/range/range.diff.d.ts +2 -8
  126. package/dist/core/objects/type/range/range.diff.js +16 -77
  127. package/dist/core/objects/type/range/range.model.js +1 -1
  128. package/dist/core/objects/view/view.diff.d.ts +2 -8
  129. package/dist/core/objects/view/view.diff.js +16 -158
  130. package/dist/core/objects/view/view.model.d.ts +18 -4
  131. package/dist/core/objects/view/view.model.js +3 -13
  132. package/dist/core/plan/apply.js +11 -28
  133. package/dist/core/plan/create.d.ts +19 -6
  134. package/dist/core/plan/create.js +134 -155
  135. package/dist/core/plan/serialize.js +16 -4
  136. package/dist/core/plan/sql-format/constants.d.ts +2 -0
  137. package/dist/core/plan/sql-format/constants.js +11 -0
  138. package/dist/core/plan/sql-format/fixtures.d.ts +2 -0
  139. package/dist/core/plan/sql-format/fixtures.js +2447 -0
  140. package/dist/core/plan/sql-format/format-utils.d.ts +37 -0
  141. package/dist/core/plan/sql-format/format-utils.js +274 -0
  142. package/dist/core/plan/sql-format/formatters.d.ts +20 -0
  143. package/dist/core/plan/sql-format/formatters.js +737 -0
  144. package/dist/core/plan/sql-format/index.d.ts +2 -0
  145. package/dist/core/plan/sql-format/index.js +98 -0
  146. package/dist/core/plan/sql-format/keyword-case.d.ts +2 -0
  147. package/dist/core/plan/sql-format/keyword-case.js +893 -0
  148. package/dist/core/plan/sql-format/protect.d.ts +3 -0
  149. package/dist/core/plan/sql-format/protect.js +269 -0
  150. package/dist/core/plan/sql-format/sql-scanner.d.ts +59 -0
  151. package/dist/core/plan/sql-format/sql-scanner.js +202 -0
  152. package/dist/core/plan/sql-format/tokenizer.d.ts +22 -0
  153. package/dist/core/plan/sql-format/tokenizer.js +118 -0
  154. package/dist/core/plan/sql-format/types.d.ts +28 -0
  155. package/dist/core/plan/sql-format/types.js +1 -0
  156. package/dist/core/plan/sql-format/wrap.d.ts +2 -0
  157. package/dist/core/plan/sql-format/wrap.js +165 -0
  158. package/dist/core/plan/sql-format.d.ts +2 -0
  159. package/dist/core/plan/sql-format.js +1 -0
  160. package/dist/core/plan/ssl-config.d.ts +32 -0
  161. package/dist/core/plan/ssl-config.js +115 -0
  162. package/dist/core/plan/statements.d.ts +2 -1
  163. package/dist/core/plan/statements.js +6 -2
  164. package/dist/core/plan/types.d.ts +6 -0
  165. package/dist/core/postgres-config.d.ts +29 -0
  166. package/dist/core/postgres-config.js +83 -2
  167. package/dist/core/sort/graph-builder.js +10 -0
  168. package/dist/core/sort/logical-sort.js +31 -23
  169. package/dist/core/test-utils/assert-valid-sql.d.ts +10 -0
  170. package/dist/core/test-utils/assert-valid-sql.js +19 -0
  171. package/dist/index.d.ts +8 -0
  172. package/dist/index.js +7 -1
  173. package/package.json +54 -22
  174. package/src/cli/app.ts +52 -0
  175. package/src/cli/bin/cli.ts +15 -0
  176. package/src/cli/commands/apply.ts +101 -0
  177. package/src/cli/commands/catalog-export.ts +78 -0
  178. package/src/cli/commands/declarative-apply.diagnostics.test.ts +77 -0
  179. package/src/cli/commands/declarative-apply.ts +380 -0
  180. package/src/cli/commands/declarative-export.ts +330 -0
  181. package/src/cli/commands/plan.ts +216 -0
  182. package/src/cli/commands/sync.ts +185 -0
  183. package/src/cli/exit-code.test.ts +19 -0
  184. package/src/cli/exit-code.ts +7 -0
  185. package/src/cli/formatters/index.ts +5 -0
  186. package/src/cli/formatters/tree/tree-builder.ts +380 -0
  187. package/src/cli/formatters/tree/tree-renderer.ts +372 -0
  188. package/src/cli/formatters/tree/tree.ts +238 -0
  189. package/src/cli/utils/apply-display.test.ts +348 -0
  190. package/src/cli/utils/apply-display.ts +238 -0
  191. package/src/cli/utils/export-display.test.ts +103 -0
  192. package/src/cli/utils/export-display.ts +275 -0
  193. package/src/cli/utils/integrations.test.ts +44 -0
  194. package/src/cli/utils/integrations.ts +42 -0
  195. package/src/cli/utils/resolve-input.test.ts +38 -0
  196. package/src/cli/utils/resolve-input.ts +17 -0
  197. package/src/cli/utils.ts +231 -0
  198. package/src/core/catalog-export/index.ts +20 -0
  199. package/src/core/catalog.diff.ts +247 -0
  200. package/src/core/catalog.model.test.ts +122 -0
  201. package/src/core/catalog.model.ts +510 -0
  202. package/src/core/catalog.snapshot.test.ts +464 -0
  203. package/src/core/catalog.snapshot.ts +289 -0
  204. package/src/core/change.types.ts +44 -0
  205. package/src/core/context.ts +26 -0
  206. package/src/core/declarative-apply/discover-sql.test.ts +103 -0
  207. package/src/core/declarative-apply/discover-sql.ts +107 -0
  208. package/src/core/declarative-apply/extract-catalog-providers.ts +220 -0
  209. package/src/core/declarative-apply/index.test.ts +67 -0
  210. package/src/core/declarative-apply/index.ts +205 -0
  211. package/src/core/declarative-apply/round-apply.test.ts +504 -0
  212. package/src/core/declarative-apply/round-apply.ts +562 -0
  213. package/src/core/depend.ts +1870 -0
  214. package/src/core/expand-replace-dependencies.test.ts +70 -0
  215. package/src/core/expand-replace-dependencies.ts +380 -0
  216. package/src/core/export/file-mapper.test.ts +816 -0
  217. package/src/core/export/file-mapper.ts +574 -0
  218. package/src/core/export/grouper.ts +108 -0
  219. package/src/core/export/index.ts +129 -0
  220. package/src/core/export/types.ts +104 -0
  221. package/src/core/fingerprint.ts +204 -0
  222. package/src/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
  223. package/src/core/integrations/filter/dsl.test.ts +211 -0
  224. package/src/core/integrations/filter/dsl.ts +266 -0
  225. package/src/core/integrations/filter/extractors.test.ts +244 -0
  226. package/src/core/integrations/filter/extractors.ts +187 -0
  227. package/src/core/integrations/filter/filter.types.ts +3 -0
  228. package/src/core/integrations/integration-dsl.ts +34 -0
  229. package/src/core/integrations/integration.types.ts +7 -0
  230. package/src/core/integrations/serialize/dsl.test.ts +91 -0
  231. package/src/core/integrations/serialize/dsl.ts +77 -0
  232. package/src/core/integrations/serialize/serialize.types.ts +3 -0
  233. package/src/core/integrations/supabase.ts +130 -0
  234. package/src/core/objects/aggregate/aggregate.diff.test.ts +215 -0
  235. package/src/core/objects/aggregate/aggregate.diff.ts +222 -0
  236. package/src/core/objects/aggregate/aggregate.model.ts +317 -0
  237. package/src/core/objects/aggregate/changes/aggregate.alter.test.ts +66 -0
  238. package/src/core/objects/aggregate/changes/aggregate.alter.ts +32 -0
  239. package/src/core/objects/aggregate/changes/aggregate.base.ts +20 -0
  240. package/src/core/objects/aggregate/changes/aggregate.comment.test.ts +89 -0
  241. package/src/core/objects/aggregate/changes/aggregate.comment.ts +62 -0
  242. package/src/core/objects/aggregate/changes/aggregate.create.test.ts +104 -0
  243. package/src/core/objects/aggregate/changes/aggregate.create.ts +329 -0
  244. package/src/core/objects/aggregate/changes/aggregate.drop.test.ts +82 -0
  245. package/src/core/objects/aggregate/changes/aggregate.drop.ts +32 -0
  246. package/src/core/objects/aggregate/changes/aggregate.privilege.test.ts +136 -0
  247. package/src/core/objects/aggregate/changes/aggregate.privilege.ts +146 -0
  248. package/src/core/objects/aggregate/changes/aggregate.types.ts +12 -0
  249. package/src/core/objects/base.change.ts +62 -0
  250. package/src/core/objects/base.default-privileges.ts +204 -0
  251. package/src/core/objects/base.diff.ts +20 -0
  252. package/src/core/objects/base.model.ts +82 -0
  253. package/src/core/objects/base.privilege-diff.ts +447 -0
  254. package/src/core/objects/base.privilege.ts +191 -0
  255. package/src/core/objects/collation/changes/collation.alter.test.ts +68 -0
  256. package/src/core/objects/collation/changes/collation.alter.ts +79 -0
  257. package/src/core/objects/collation/changes/collation.base.ts +20 -0
  258. package/src/core/objects/collation/changes/collation.comment.ts +68 -0
  259. package/src/core/objects/collation/changes/collation.create.test.ts +56 -0
  260. package/src/core/objects/collation/changes/collation.create.ts +106 -0
  261. package/src/core/objects/collation/changes/collation.drop.test.ts +31 -0
  262. package/src/core/objects/collation/changes/collation.drop.ts +37 -0
  263. package/src/core/objects/collation/changes/collation.types.ts +10 -0
  264. package/src/core/objects/collation/collation.diff.test.ts +97 -0
  265. package/src/core/objects/collation/collation.diff.ts +127 -0
  266. package/src/core/objects/collation/collation.model.ts +224 -0
  267. package/src/core/objects/diff-context.ts +16 -0
  268. package/src/core/objects/domain/changes/domain.alter.test.ts +335 -0
  269. package/src/core/objects/domain/changes/domain.alter.ts +286 -0
  270. package/src/core/objects/domain/changes/domain.base.ts +20 -0
  271. package/src/core/objects/domain/changes/domain.comment.ts +59 -0
  272. package/src/core/objects/domain/changes/domain.create.test.ts +95 -0
  273. package/src/core/objects/domain/changes/domain.create.ts +124 -0
  274. package/src/core/objects/domain/changes/domain.drop.test.ts +33 -0
  275. package/src/core/objects/domain/changes/domain.drop.ts +34 -0
  276. package/src/core/objects/domain/changes/domain.privilege.ts +171 -0
  277. package/src/core/objects/domain/changes/domain.types.ts +12 -0
  278. package/src/core/objects/domain/domain.diff.test.ts +284 -0
  279. package/src/core/objects/domain/domain.diff.ts +295 -0
  280. package/src/core/objects/domain/domain.model.ts +190 -0
  281. package/src/core/objects/event-trigger/changes/event-trigger.alter.test.ts +57 -0
  282. package/src/core/objects/event-trigger/changes/event-trigger.alter.ts +82 -0
  283. package/src/core/objects/event-trigger/changes/event-trigger.base.ts +20 -0
  284. package/src/core/objects/event-trigger/changes/event-trigger.comment.ts +66 -0
  285. package/src/core/objects/event-trigger/changes/event-trigger.create.test.ts +27 -0
  286. package/src/core/objects/event-trigger/changes/event-trigger.create.ts +72 -0
  287. package/src/core/objects/event-trigger/changes/event-trigger.drop.test.ts +25 -0
  288. package/src/core/objects/event-trigger/changes/event-trigger.drop.ts +34 -0
  289. package/src/core/objects/event-trigger/changes/event-trigger.types.ts +10 -0
  290. package/src/core/objects/event-trigger/event-trigger.diff.test.ts +131 -0
  291. package/src/core/objects/event-trigger/event-trigger.diff.ts +127 -0
  292. package/src/core/objects/event-trigger/event-trigger.model.ts +106 -0
  293. package/src/core/objects/extension/changes/extension.alter.test.ts +63 -0
  294. package/src/core/objects/extension/changes/extension.alter.ts +78 -0
  295. package/src/core/objects/extension/changes/extension.base.ts +20 -0
  296. package/src/core/objects/extension/changes/extension.comment.ts +64 -0
  297. package/src/core/objects/extension/changes/extension.create.test.ts +28 -0
  298. package/src/core/objects/extension/changes/extension.create.ts +63 -0
  299. package/src/core/objects/extension/changes/extension.drop.test.ts +26 -0
  300. package/src/core/objects/extension/changes/extension.drop.ts +34 -0
  301. package/src/core/objects/extension/changes/extension.types.ts +10 -0
  302. package/src/core/objects/extension/extension.diff.test.ts +42 -0
  303. package/src/core/objects/extension/extension.diff.ts +90 -0
  304. package/src/core/objects/extension/extension.model.test.ts +98 -0
  305. package/src/core/objects/extension/extension.model.ts +280 -0
  306. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.test.ts +136 -0
  307. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.ts +101 -0
  308. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.base.ts +20 -0
  309. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.ts +72 -0
  310. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.test.ts +160 -0
  311. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.ts +95 -0
  312. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.test.ts +26 -0
  313. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.ts +36 -0
  314. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.ts +172 -0
  315. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.ts +12 -0
  316. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.test.ts +286 -0
  317. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.ts +271 -0
  318. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.ts +149 -0
  319. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.ts +10 -0
  320. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.test.ts +340 -0
  321. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.ts +341 -0
  322. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.base.ts +20 -0
  323. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.ts +72 -0
  324. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.test.ts +210 -0
  325. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.ts +81 -0
  326. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.test.ts +46 -0
  327. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.ts +37 -0
  328. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.ts +181 -0
  329. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.ts +12 -0
  330. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.test.ts +813 -0
  331. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.ts +343 -0
  332. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.ts +242 -0
  333. package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.test.ts +183 -0
  334. package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.ts +126 -0
  335. package/src/core/objects/foreign-data-wrapper/server/changes/server.base.ts +20 -0
  336. package/src/core/objects/foreign-data-wrapper/server/changes/server.comment.ts +60 -0
  337. package/src/core/objects/foreign-data-wrapper/server/changes/server.create.test.ts +144 -0
  338. package/src/core/objects/foreign-data-wrapper/server/changes/server.create.ts +81 -0
  339. package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.test.ts +27 -0
  340. package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.ts +34 -0
  341. package/src/core/objects/foreign-data-wrapper/server/changes/server.privilege.ts +164 -0
  342. package/src/core/objects/foreign-data-wrapper/server/changes/server.types.ts +12 -0
  343. package/src/core/objects/foreign-data-wrapper/server/server.diff.test.ts +262 -0
  344. package/src/core/objects/foreign-data-wrapper/server/server.diff.ts +247 -0
  345. package/src/core/objects/foreign-data-wrapper/server/server.model.ts +133 -0
  346. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.test.ts +91 -0
  347. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.ts +69 -0
  348. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.base.ts +20 -0
  349. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.test.ts +96 -0
  350. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.ts +66 -0
  351. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.test.ts +60 -0
  352. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.ts +40 -0
  353. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.ts +8 -0
  354. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.test.ts +77 -0
  355. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.ts +107 -0
  356. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.ts +96 -0
  357. package/src/core/objects/index/changes/index.alter.test.ts +209 -0
  358. package/src/core/objects/index/changes/index.alter.ts +144 -0
  359. package/src/core/objects/index/changes/index.base.ts +20 -0
  360. package/src/core/objects/index/changes/index.comment.ts +63 -0
  361. package/src/core/objects/index/changes/index.create.test.ts +69 -0
  362. package/src/core/objects/index/changes/index.create.ts +68 -0
  363. package/src/core/objects/index/changes/index.drop.test.ts +47 -0
  364. package/src/core/objects/index/changes/index.drop.ts +34 -0
  365. package/src/core/objects/index/changes/index.types.ts +6 -0
  366. package/src/core/objects/index/changes/utils.ts +16 -0
  367. package/src/core/objects/index/index.diff.test.ts +153 -0
  368. package/src/core/objects/index/index.diff.ts +243 -0
  369. package/src/core/objects/index/index.model.ts +370 -0
  370. package/src/core/objects/language/changes/language.alter.test.ts +36 -0
  371. package/src/core/objects/language/changes/language.alter.ts +53 -0
  372. package/src/core/objects/language/changes/language.base.ts +20 -0
  373. package/src/core/objects/language/changes/language.comment.ts +58 -0
  374. package/src/core/objects/language/changes/language.create.test.ts +30 -0
  375. package/src/core/objects/language/changes/language.create.ts +104 -0
  376. package/src/core/objects/language/changes/language.drop.test.ts +28 -0
  377. package/src/core/objects/language/changes/language.drop.ts +39 -0
  378. package/src/core/objects/language/changes/language.privilege.ts +172 -0
  379. package/src/core/objects/language/changes/language.types.ts +12 -0
  380. package/src/core/objects/language/language.diff.test.ts +135 -0
  381. package/src/core/objects/language/language.diff.ts +144 -0
  382. package/src/core/objects/language/language.model.ts +150 -0
  383. package/src/core/objects/materialized-view/changes/materialized-view.alter.test.ts +130 -0
  384. package/src/core/objects/materialized-view/changes/materialized-view.alter.ts +113 -0
  385. package/src/core/objects/materialized-view/changes/materialized-view.base.ts +20 -0
  386. package/src/core/objects/materialized-view/changes/materialized-view.comment.ts +176 -0
  387. package/src/core/objects/materialized-view/changes/materialized-view.create.test.ts +69 -0
  388. package/src/core/objects/materialized-view/changes/materialized-view.create.ts +93 -0
  389. package/src/core/objects/materialized-view/changes/materialized-view.drop.test.ts +37 -0
  390. package/src/core/objects/materialized-view/changes/materialized-view.drop.ts +60 -0
  391. package/src/core/objects/materialized-view/changes/materialized-view.privilege.ts +212 -0
  392. package/src/core/objects/materialized-view/changes/materialized-view.types.ts +12 -0
  393. package/src/core/objects/materialized-view/materialized-view.diff.test.ts +264 -0
  394. package/src/core/objects/materialized-view/materialized-view.diff.ts +301 -0
  395. package/src/core/objects/materialized-view/materialized-view.model.ts +258 -0
  396. package/src/core/objects/procedure/changes/procedure.alter.test.ts +1077 -0
  397. package/src/core/objects/procedure/changes/procedure.alter.ts +290 -0
  398. package/src/core/objects/procedure/changes/procedure.base.ts +20 -0
  399. package/src/core/objects/procedure/changes/procedure.comment.ts +70 -0
  400. package/src/core/objects/procedure/changes/procedure.create.test.ts +51 -0
  401. package/src/core/objects/procedure/changes/procedure.create.ts +92 -0
  402. package/src/core/objects/procedure/changes/procedure.drop.test.ts +90 -0
  403. package/src/core/objects/procedure/changes/procedure.drop.ts +49 -0
  404. package/src/core/objects/procedure/changes/procedure.privilege.ts +188 -0
  405. package/src/core/objects/procedure/changes/procedure.types.ts +12 -0
  406. package/src/core/objects/procedure/procedure.diff.test.ts +161 -0
  407. package/src/core/objects/procedure/procedure.diff.ts +341 -0
  408. package/src/core/objects/procedure/procedure.model.ts +264 -0
  409. package/src/core/objects/procedure/utils.ts +58 -0
  410. package/src/core/objects/publication/changes/publication.alter.test.ts +217 -0
  411. package/src/core/objects/publication/changes/publication.alter.ts +225 -0
  412. package/src/core/objects/publication/changes/publication.base.ts +20 -0
  413. package/src/core/objects/publication/changes/publication.comment.test.ts +73 -0
  414. package/src/core/objects/publication/changes/publication.comment.ts +64 -0
  415. package/src/core/objects/publication/changes/publication.create.test.ts +90 -0
  416. package/src/core/objects/publication/changes/publication.create.ts +82 -0
  417. package/src/core/objects/publication/changes/publication.drop.test.ts +48 -0
  418. package/src/core/objects/publication/changes/publication.drop.ts +29 -0
  419. package/src/core/objects/publication/changes/publication.types.ts +24 -0
  420. package/src/core/objects/publication/publication.diff.test.ts +297 -0
  421. package/src/core/objects/publication/publication.diff.ts +247 -0
  422. package/src/core/objects/publication/publication.model.ts +206 -0
  423. package/src/core/objects/publication/utils.ts +55 -0
  424. package/src/core/objects/rls-policy/changes/rls-policy.alter.test.ts +267 -0
  425. package/src/core/objects/rls-policy/changes/rls-policy.alter.ts +128 -0
  426. package/src/core/objects/rls-policy/changes/rls-policy.base.ts +20 -0
  427. package/src/core/objects/rls-policy/changes/rls-policy.comment.ts +69 -0
  428. package/src/core/objects/rls-policy/changes/rls-policy.create.test.ts +81 -0
  429. package/src/core/objects/rls-policy/changes/rls-policy.create.ts +100 -0
  430. package/src/core/objects/rls-policy/changes/rls-policy.drop.test.ts +31 -0
  431. package/src/core/objects/rls-policy/changes/rls-policy.drop.ts +39 -0
  432. package/src/core/objects/rls-policy/changes/rls-policy.types.ts +10 -0
  433. package/src/core/objects/rls-policy/rls-policy.diff.test.ts +79 -0
  434. package/src/core/objects/rls-policy/rls-policy.diff.ts +121 -0
  435. package/src/core/objects/rls-policy/rls-policy.model.ts +140 -0
  436. package/src/core/objects/role/changes/role.alter.test.ts +362 -0
  437. package/src/core/objects/role/changes/role.alter.ts +110 -0
  438. package/src/core/objects/role/changes/role.base.ts +24 -0
  439. package/src/core/objects/role/changes/role.comment.ts +55 -0
  440. package/src/core/objects/role/changes/role.create.test.ts +56 -0
  441. package/src/core/objects/role/changes/role.create.ts +102 -0
  442. package/src/core/objects/role/changes/role.drop.test.ts +32 -0
  443. package/src/core/objects/role/changes/role.drop.ts +34 -0
  444. package/src/core/objects/role/changes/role.privilege.ts +376 -0
  445. package/src/core/objects/role/changes/role.types.ts +12 -0
  446. package/src/core/objects/role/role.diff.test.ts +279 -0
  447. package/src/core/objects/role/role.diff.ts +499 -0
  448. package/src/core/objects/role/role.model.ts +452 -0
  449. package/src/core/objects/rule/changes/rule.alter.test.ts +82 -0
  450. package/src/core/objects/rule/changes/rule.alter.ts +72 -0
  451. package/src/core/objects/rule/changes/rule.base.ts +20 -0
  452. package/src/core/objects/rule/changes/rule.comment.test.ts +58 -0
  453. package/src/core/objects/rule/changes/rule.comment.ts +62 -0
  454. package/src/core/objects/rule/changes/rule.create.test.ts +63 -0
  455. package/src/core/objects/rule/changes/rule.create.ts +42 -0
  456. package/src/core/objects/rule/changes/rule.drop.test.ts +40 -0
  457. package/src/core/objects/rule/changes/rule.drop.ts +29 -0
  458. package/src/core/objects/rule/changes/rule.types.ts +12 -0
  459. package/src/core/objects/rule/rule.diff.test.ts +132 -0
  460. package/src/core/objects/rule/rule.diff.ts +79 -0
  461. package/src/core/objects/rule/rule.model.ts +173 -0
  462. package/src/core/objects/schema/changes/schema.alter.test.ts +31 -0
  463. package/src/core/objects/schema/changes/schema.alter.ts +45 -0
  464. package/src/core/objects/schema/changes/schema.base.ts +20 -0
  465. package/src/core/objects/schema/changes/schema.comment.ts +56 -0
  466. package/src/core/objects/schema/changes/schema.create.test.ts +25 -0
  467. package/src/core/objects/schema/changes/schema.create.ts +47 -0
  468. package/src/core/objects/schema/changes/schema.drop.test.ts +23 -0
  469. package/src/core/objects/schema/changes/schema.drop.ts +34 -0
  470. package/src/core/objects/schema/changes/schema.privilege.ts +175 -0
  471. package/src/core/objects/schema/changes/schema.types.ts +12 -0
  472. package/src/core/objects/schema/schema.diff.test.ts +42 -0
  473. package/src/core/objects/schema/schema.diff.ts +146 -0
  474. package/src/core/objects/schema/schema.model.ts +107 -0
  475. package/src/core/objects/sequence/changes/sequence.alter.test.ts +157 -0
  476. package/src/core/objects/sequence/changes/sequence.alter.ts +115 -0
  477. package/src/core/objects/sequence/changes/sequence.base.ts +20 -0
  478. package/src/core/objects/sequence/changes/sequence.comment.ts +60 -0
  479. package/src/core/objects/sequence/changes/sequence.create.test.ts +89 -0
  480. package/src/core/objects/sequence/changes/sequence.create.ts +111 -0
  481. package/src/core/objects/sequence/changes/sequence.drop.test.ts +35 -0
  482. package/src/core/objects/sequence/changes/sequence.drop.ts +37 -0
  483. package/src/core/objects/sequence/changes/sequence.privilege.ts +179 -0
  484. package/src/core/objects/sequence/changes/sequence.types.ts +12 -0
  485. package/src/core/objects/sequence/sequence.diff.test.ts +255 -0
  486. package/src/core/objects/sequence/sequence.diff.ts +294 -0
  487. package/src/core/objects/sequence/sequence.model.ts +185 -0
  488. package/src/core/objects/subscription/changes/subscription.alter.test.ts +134 -0
  489. package/src/core/objects/subscription/changes/subscription.alter.ts +110 -0
  490. package/src/core/objects/subscription/changes/subscription.base.ts +20 -0
  491. package/src/core/objects/subscription/changes/subscription.comment.test.ts +70 -0
  492. package/src/core/objects/subscription/changes/subscription.comment.ts +64 -0
  493. package/src/core/objects/subscription/changes/subscription.create.test.ts +80 -0
  494. package/src/core/objects/subscription/changes/subscription.create.ts +69 -0
  495. package/src/core/objects/subscription/changes/subscription.drop.test.ts +48 -0
  496. package/src/core/objects/subscription/changes/subscription.drop.ts +20 -0
  497. package/src/core/objects/subscription/changes/subscription.types.ts +22 -0
  498. package/src/core/objects/subscription/subscription.diff.test.ts +237 -0
  499. package/src/core/objects/subscription/subscription.diff.ts +242 -0
  500. package/src/core/objects/subscription/subscription.model.ts +190 -0
  501. package/src/core/objects/subscription/utils.ts +156 -0
  502. package/src/core/objects/table/changes/table.alter.test.ts +846 -0
  503. package/src/core/objects/table/changes/table.alter.ts +806 -0
  504. package/src/core/objects/table/changes/table.base.ts +20 -0
  505. package/src/core/objects/table/changes/table.comment.ts +266 -0
  506. package/src/core/objects/table/changes/table.create.test.ts +188 -0
  507. package/src/core/objects/table/changes/table.create.ts +192 -0
  508. package/src/core/objects/table/changes/table.drop.test.ts +36 -0
  509. package/src/core/objects/table/changes/table.drop.ts +45 -0
  510. package/src/core/objects/table/changes/table.privilege.ts +200 -0
  511. package/src/core/objects/table/changes/table.types.ts +12 -0
  512. package/src/core/objects/table/table.diff.test.ts +868 -0
  513. package/src/core/objects/table/table.diff.ts +817 -0
  514. package/src/core/objects/table/table.model.ts +460 -0
  515. package/src/core/objects/trigger/changes/trigger.alter.test.ts +50 -0
  516. package/src/core/objects/trigger/changes/trigger.alter.ts +76 -0
  517. package/src/core/objects/trigger/changes/trigger.base.ts +20 -0
  518. package/src/core/objects/trigger/changes/trigger.comment.ts +64 -0
  519. package/src/core/objects/trigger/changes/trigger.create.test.ts +47 -0
  520. package/src/core/objects/trigger/changes/trigger.create.ts +88 -0
  521. package/src/core/objects/trigger/changes/trigger.drop.test.ts +47 -0
  522. package/src/core/objects/trigger/changes/trigger.drop.ts +39 -0
  523. package/src/core/objects/trigger/changes/trigger.types.ts +10 -0
  524. package/src/core/objects/trigger/trigger.diff.test.ts +84 -0
  525. package/src/core/objects/trigger/trigger.diff.ts +116 -0
  526. package/src/core/objects/trigger/trigger.model.ts +264 -0
  527. package/src/core/objects/type/composite-type/changes/composite-type.alter.test.ts +208 -0
  528. package/src/core/objects/type/composite-type/changes/composite-type.alter.ts +174 -0
  529. package/src/core/objects/type/composite-type/changes/composite-type.base.ts +20 -0
  530. package/src/core/objects/type/composite-type/changes/composite-type.comment.ts +145 -0
  531. package/src/core/objects/type/composite-type/changes/composite-type.create.test.ts +106 -0
  532. package/src/core/objects/type/composite-type/changes/composite-type.create.ts +95 -0
  533. package/src/core/objects/type/composite-type/changes/composite-type.drop.test.ts +36 -0
  534. package/src/core/objects/type/composite-type/changes/composite-type.drop.ts +37 -0
  535. package/src/core/objects/type/composite-type/changes/composite-type.privilege.ts +175 -0
  536. package/src/core/objects/type/composite-type/changes/composite-type.types.ts +12 -0
  537. package/src/core/objects/type/composite-type/composite-type.diff.test.ts +269 -0
  538. package/src/core/objects/type/composite-type/composite-type.diff.ts +310 -0
  539. package/src/core/objects/type/composite-type/composite-type.model.ts +253 -0
  540. package/src/core/objects/type/enum/changes/enum.alter.test.ts +113 -0
  541. package/src/core/objects/type/enum/changes/enum.alter.ts +91 -0
  542. package/src/core/objects/type/enum/changes/enum.base.ts +20 -0
  543. package/src/core/objects/type/enum/changes/enum.comment.ts +64 -0
  544. package/src/core/objects/type/enum/changes/enum.create.test.ts +31 -0
  545. package/src/core/objects/type/enum/changes/enum.create.ts +56 -0
  546. package/src/core/objects/type/enum/changes/enum.drop.test.ts +28 -0
  547. package/src/core/objects/type/enum/changes/enum.drop.ts +34 -0
  548. package/src/core/objects/type/enum/changes/enum.privilege.ts +175 -0
  549. package/src/core/objects/type/enum/changes/enum.types.ts +12 -0
  550. package/src/core/objects/type/enum/enum.diff.test.ts +372 -0
  551. package/src/core/objects/type/enum/enum.diff.ts +308 -0
  552. package/src/core/objects/type/enum/enum.model.ts +194 -0
  553. package/src/core/objects/type/range/changes/range.alter.test.ts +29 -0
  554. package/src/core/objects/type/range/changes/range.alter.ts +51 -0
  555. package/src/core/objects/type/range/changes/range.base.ts +20 -0
  556. package/src/core/objects/type/range/changes/range.comment.ts +64 -0
  557. package/src/core/objects/type/range/changes/range.create.test.ts +54 -0
  558. package/src/core/objects/type/range/changes/range.create.ts +155 -0
  559. package/src/core/objects/type/range/changes/range.drop.test.ts +28 -0
  560. package/src/core/objects/type/range/changes/range.drop.ts +34 -0
  561. package/src/core/objects/type/range/changes/range.privilege.ts +175 -0
  562. package/src/core/objects/type/range/changes/range.types.ts +12 -0
  563. package/src/core/objects/type/range/range.diff.test.ts +147 -0
  564. package/src/core/objects/type/range/range.diff.ts +197 -0
  565. package/src/core/objects/type/range/range.model.ts +187 -0
  566. package/src/core/objects/type/type.types.ts +5 -0
  567. package/src/core/objects/utils.ts +171 -0
  568. package/src/core/objects/view/changes/view.alter.test.ts +115 -0
  569. package/src/core/objects/view/changes/view.alter.ts +112 -0
  570. package/src/core/objects/view/changes/view.base.ts +20 -0
  571. package/src/core/objects/view/changes/view.comment.ts +59 -0
  572. package/src/core/objects/view/changes/view.create.test.ts +70 -0
  573. package/src/core/objects/view/changes/view.create.ts +73 -0
  574. package/src/core/objects/view/changes/view.drop.test.ts +37 -0
  575. package/src/core/objects/view/changes/view.drop.ts +40 -0
  576. package/src/core/objects/view/changes/view.privilege.ts +200 -0
  577. package/src/core/objects/view/changes/view.types.ts +12 -0
  578. package/src/core/objects/view/view.diff.test.ts +173 -0
  579. package/src/core/objects/view/view.diff.ts +215 -0
  580. package/src/core/objects/view/view.model.ts +262 -0
  581. package/src/core/plan/apply.ts +172 -0
  582. package/src/core/plan/create.ts +368 -0
  583. package/src/core/plan/hierarchy.ts +574 -0
  584. package/src/core/plan/index.ts +29 -0
  585. package/src/core/plan/io.ts +20 -0
  586. package/src/core/plan/risk.ts +48 -0
  587. package/src/core/plan/serialize.test.ts +317 -0
  588. package/src/core/plan/serialize.ts +209 -0
  589. package/src/core/plan/sql-format/constants.ts +13 -0
  590. package/src/core/plan/sql-format/fixtures.ts +2803 -0
  591. package/src/core/plan/sql-format/format-comment-literals.test.ts +96 -0
  592. package/src/core/plan/sql-format/format-functions.test.ts +127 -0
  593. package/src/core/plan/sql-format/format-lowercase-coverage.test.ts +119 -0
  594. package/src/core/plan/sql-format/format-off.test.ts +806 -0
  595. package/src/core/plan/sql-format/format-pretty-lower-leading.test.ts +1061 -0
  596. package/src/core/plan/sql-format/format-pretty-narrow.test.ts +1279 -0
  597. package/src/core/plan/sql-format/format-pretty-preserve.test.ts +1057 -0
  598. package/src/core/plan/sql-format/format-pretty-upper.test.ts +1048 -0
  599. package/src/core/plan/sql-format/format-stress.test.ts +616 -0
  600. package/src/core/plan/sql-format/format-utils.test.ts +91 -0
  601. package/src/core/plan/sql-format/format-utils.ts +391 -0
  602. package/src/core/plan/sql-format/formatters.ts +921 -0
  603. package/src/core/plan/sql-format/index.ts +149 -0
  604. package/src/core/plan/sql-format/keyword-case.test.ts +118 -0
  605. package/src/core/plan/sql-format/keyword-case.ts +1120 -0
  606. package/src/core/plan/sql-format/protect.test.ts +127 -0
  607. package/src/core/plan/sql-format/protect.ts +337 -0
  608. package/src/core/plan/sql-format/sql-scanner.test.ts +240 -0
  609. package/src/core/plan/sql-format/sql-scanner.ts +252 -0
  610. package/src/core/plan/sql-format/tokenizer.test.ts +68 -0
  611. package/src/core/plan/sql-format/tokenizer.ts +152 -0
  612. package/src/core/plan/sql-format/types.ts +31 -0
  613. package/src/core/plan/sql-format/wrap.test.ts +119 -0
  614. package/src/core/plan/sql-format/wrap.ts +196 -0
  615. package/src/core/plan/sql-format.ts +2 -0
  616. package/src/core/plan/ssl-config.ts +172 -0
  617. package/src/core/plan/statements.ts +22 -0
  618. package/src/core/plan/types.ts +171 -0
  619. package/src/core/postgres-config.ts +238 -0
  620. package/src/core/sort/custom-constraints.ts +161 -0
  621. package/src/core/sort/debug-visualization.ts +239 -0
  622. package/src/core/sort/dependency-filter.ts +224 -0
  623. package/src/core/sort/graph-builder.ts +235 -0
  624. package/src/core/sort/graph-utils.ts +51 -0
  625. package/src/core/sort/logical-sort.test.ts +371 -0
  626. package/src/core/sort/logical-sort.ts +597 -0
  627. package/src/core/sort/sort-changes.ts +234 -0
  628. package/src/core/sort/topological-sort.test.ts +275 -0
  629. package/src/core/sort/topological-sort.ts +184 -0
  630. package/src/core/sort/types.ts +112 -0
  631. package/src/core/sort/utils.ts +69 -0
  632. package/src/core/test-utils/assert-valid-sql.ts +20 -0
  633. package/src/index.ts +38 -0
@@ -0,0 +1,310 @@
1
+ import { diffObjects } from "../../base.diff.ts";
2
+ import {
3
+ diffPrivileges,
4
+ emitObjectPrivilegeChanges,
5
+ filterPublicBuiltInDefaults,
6
+ } from "../../base.privilege-diff.ts";
7
+ import type { ObjectDiffContext } from "../../diff-context.ts";
8
+ import { deepEqual, hasNonAlterableChanges } from "../../utils.ts";
9
+ import {
10
+ AlterCompositeTypeAddAttribute,
11
+ AlterCompositeTypeAlterAttributeType,
12
+ AlterCompositeTypeChangeOwner,
13
+ AlterCompositeTypeDropAttribute,
14
+ } from "./changes/composite-type.alter.ts";
15
+ import {
16
+ CreateCommentOnCompositeType,
17
+ CreateCommentOnCompositeTypeAttribute,
18
+ DropCommentOnCompositeType,
19
+ DropCommentOnCompositeTypeAttribute,
20
+ } from "./changes/composite-type.comment.ts";
21
+ import { CreateCompositeType } from "./changes/composite-type.create.ts";
22
+ import { DropCompositeType } from "./changes/composite-type.drop.ts";
23
+ import {
24
+ GrantCompositeTypePrivileges,
25
+ RevokeCompositeTypePrivileges,
26
+ RevokeGrantOptionCompositeTypePrivileges,
27
+ } from "./changes/composite-type.privilege.ts";
28
+ import type { CompositeTypeChange } from "./changes/composite-type.types.ts";
29
+ import type { CompositeType } from "./composite-type.model.ts";
30
+
31
+ /**
32
+ * Diff two sets of composite types from main and branch catalogs.
33
+ *
34
+ * @param ctx - Context containing version, currentUser, and defaultPrivilegeState
35
+ * @param main - The composite types in the main catalog.
36
+ * @param branch - The composite types in the branch catalog.
37
+ * @returns A list of changes to apply to main to make it match branch.
38
+ */
39
+ export function diffCompositeTypes(
40
+ ctx: Pick<
41
+ ObjectDiffContext,
42
+ "version" | "currentUser" | "defaultPrivilegeState"
43
+ >,
44
+ main: Record<string, CompositeType>,
45
+ branch: Record<string, CompositeType>,
46
+ ): CompositeTypeChange[] {
47
+ const { created, dropped, altered } = diffObjects(main, branch);
48
+
49
+ const changes: CompositeTypeChange[] = [];
50
+
51
+ for (const compositeTypeId of created) {
52
+ const ct = branch[compositeTypeId];
53
+ changes.push(new CreateCompositeType({ compositeType: ct }));
54
+
55
+ // OWNER: If the composite type should be owned by someone other than the current user,
56
+ // emit ALTER TYPE ... OWNER TO after creation
57
+ if (ct.owner !== ctx.currentUser) {
58
+ changes.push(
59
+ new AlterCompositeTypeChangeOwner({
60
+ compositeType: ct,
61
+ owner: ct.owner,
62
+ }),
63
+ );
64
+ }
65
+
66
+ // Type comment on creation
67
+ if (ct.comment !== null) {
68
+ changes.push(new CreateCommentOnCompositeType({ compositeType: ct }));
69
+ }
70
+ // Attribute comments on creation
71
+ for (const attr of ct.columns) {
72
+ if (attr.comment !== null) {
73
+ changes.push(
74
+ new CreateCommentOnCompositeTypeAttribute({
75
+ compositeType: ct,
76
+ attribute: attr,
77
+ }),
78
+ );
79
+ }
80
+ }
81
+
82
+ // PRIVILEGES: For created objects, compare against default privileges state
83
+ // The migration script will run ALTER DEFAULT PRIVILEGES before CREATE (via constraint spec),
84
+ // so objects are created with the default privileges state in effect.
85
+ // We compare default privileges against desired privileges to generate REVOKE/GRANT statements
86
+ // needed to reach the final desired state.
87
+ const effectiveDefaults = ctx.defaultPrivilegeState.getEffectiveDefaults(
88
+ ctx.currentUser,
89
+ "composite_type",
90
+ ct.schema ?? "",
91
+ );
92
+ const creatorFilteredDefaults =
93
+ ct.owner !== ctx.currentUser
94
+ ? effectiveDefaults.filter((p) => p.grantee !== ctx.currentUser)
95
+ : effectiveDefaults;
96
+ // Filter out PUBLIC's built-in default USAGE privilege (PostgreSQL grants it automatically)
97
+ // Reference: https://www.postgresql.org/docs/17/ddl-priv.html Table 5.2
98
+ // This prevents generating unnecessary "GRANT USAGE TO PUBLIC" statements
99
+ const desiredPrivileges = filterPublicBuiltInDefaults(
100
+ "composite_type",
101
+ ct.privileges,
102
+ );
103
+ // Filter out owner privileges - owner always has ALL privileges implicitly
104
+ // and shouldn't be compared. Use the composite type owner as the reference.
105
+ const privilegeResults = diffPrivileges(
106
+ filterPublicBuiltInDefaults("composite_type", creatorFilteredDefaults),
107
+ desiredPrivileges,
108
+ ct.owner,
109
+ );
110
+
111
+ changes.push(
112
+ ...(emitObjectPrivilegeChanges(
113
+ privilegeResults,
114
+ ct,
115
+ ct,
116
+ "compositeType",
117
+ {
118
+ Grant: GrantCompositeTypePrivileges,
119
+ Revoke: RevokeCompositeTypePrivileges,
120
+ RevokeGrantOption: RevokeGrantOptionCompositeTypePrivileges,
121
+ },
122
+ ctx.version,
123
+ ) as CompositeTypeChange[]),
124
+ );
125
+ }
126
+
127
+ for (const compositeTypeId of dropped) {
128
+ changes.push(
129
+ new DropCompositeType({ compositeType: main[compositeTypeId] }),
130
+ );
131
+ }
132
+
133
+ for (const compositeTypeId of altered) {
134
+ const mainCompositeType = main[compositeTypeId];
135
+ const branchCompositeType = branch[compositeTypeId];
136
+
137
+ // Check if non-alterable properties have changed
138
+ // These require dropping and recreating the composite type
139
+ const NON_ALTERABLE_FIELDS: Array<keyof CompositeType> = [
140
+ "row_security",
141
+ "force_row_security",
142
+ "has_indexes",
143
+ "has_rules",
144
+ "has_triggers",
145
+ "has_subclasses",
146
+ "is_populated",
147
+ "replica_identity",
148
+ "is_partition",
149
+ "options",
150
+ "partition_bound",
151
+ ];
152
+ const nonAlterablePropsChanged = hasNonAlterableChanges(
153
+ mainCompositeType,
154
+ branchCompositeType,
155
+ NON_ALTERABLE_FIELDS,
156
+ { options: deepEqual },
157
+ );
158
+
159
+ if (nonAlterablePropsChanged) {
160
+ // Replacement is not performed automatically for composite types
161
+ // to avoid destructive operations; keep changes minimal.
162
+ } else {
163
+ // Only alterable properties changed - check each one
164
+
165
+ // OWNER
166
+ if (mainCompositeType.owner !== branchCompositeType.owner) {
167
+ changes.push(
168
+ new AlterCompositeTypeChangeOwner({
169
+ compositeType: mainCompositeType,
170
+ owner: branchCompositeType.owner,
171
+ }),
172
+ );
173
+ }
174
+
175
+ // TYPE COMMENT (create/drop when comment changes)
176
+ if (mainCompositeType.comment !== branchCompositeType.comment) {
177
+ if (branchCompositeType.comment === null) {
178
+ changes.push(
179
+ new DropCommentOnCompositeType({
180
+ compositeType: mainCompositeType,
181
+ }),
182
+ );
183
+ } else {
184
+ changes.push(
185
+ new CreateCommentOnCompositeType({
186
+ compositeType: branchCompositeType,
187
+ }),
188
+ );
189
+ }
190
+ }
191
+
192
+ // ATTRIBUTE diffs
193
+ const mainAttrs = new Map(
194
+ mainCompositeType.columns.map((c) => [c.name, c]),
195
+ );
196
+ const branchAttrs = new Map(
197
+ branchCompositeType.columns.map((c) => [c.name, c]),
198
+ );
199
+
200
+ // Added attributes
201
+ for (const [name, attr] of branchAttrs) {
202
+ if (!mainAttrs.has(name)) {
203
+ changes.push(
204
+ new AlterCompositeTypeAddAttribute({
205
+ compositeType: branchCompositeType,
206
+ attribute: attr,
207
+ }),
208
+ );
209
+ if (attr.comment !== null) {
210
+ changes.push(
211
+ new CreateCommentOnCompositeTypeAttribute({
212
+ compositeType: branchCompositeType,
213
+ attribute: attr,
214
+ }),
215
+ );
216
+ }
217
+ }
218
+ }
219
+
220
+ // Dropped attributes
221
+ for (const [name, attr] of mainAttrs) {
222
+ if (!branchAttrs.has(name)) {
223
+ changes.push(
224
+ new AlterCompositeTypeDropAttribute({
225
+ compositeType: mainCompositeType,
226
+ attribute: attr,
227
+ }),
228
+ );
229
+ }
230
+ }
231
+
232
+ // Altered attribute type/collation
233
+ for (const [name, mainAttr] of mainAttrs) {
234
+ const branchAttr = branchAttrs.get(name);
235
+ if (!branchAttr) continue;
236
+ if (
237
+ mainAttr.data_type_str !== branchAttr.data_type_str ||
238
+ mainAttr.collation !== branchAttr.collation
239
+ ) {
240
+ changes.push(
241
+ new AlterCompositeTypeAlterAttributeType({
242
+ compositeType: branchCompositeType,
243
+ attribute: branchAttr,
244
+ }),
245
+ );
246
+ }
247
+
248
+ // COMMENT change on attribute
249
+ if (mainAttr.comment !== branchAttr.comment) {
250
+ if (branchAttr.comment === null) {
251
+ changes.push(
252
+ new DropCommentOnCompositeTypeAttribute({
253
+ compositeType: mainCompositeType,
254
+ attribute: mainAttr,
255
+ }),
256
+ );
257
+ } else {
258
+ changes.push(
259
+ new CreateCommentOnCompositeTypeAttribute({
260
+ compositeType: branchCompositeType,
261
+ attribute: branchAttr,
262
+ }),
263
+ );
264
+ }
265
+ }
266
+ }
267
+
268
+ // PRIVILEGES
269
+ // Filter out PUBLIC's built-in default USAGE privilege from main catalog
270
+ // (PostgreSQL grants it automatically, so we shouldn't compare it)
271
+ const mainPrivilegesFiltered = filterPublicBuiltInDefaults(
272
+ "composite_type",
273
+ mainCompositeType.privileges,
274
+ );
275
+ // Filter out PUBLIC's built-in default USAGE privilege from branch catalog
276
+ const branchPrivilegesFiltered = filterPublicBuiltInDefaults(
277
+ "composite_type",
278
+ branchCompositeType.privileges,
279
+ );
280
+ // Filter out owner privileges - owner always has ALL privileges implicitly
281
+ // and shouldn't be compared. Use branch owner as the reference.
282
+ const privilegeResults = diffPrivileges(
283
+ mainPrivilegesFiltered,
284
+ branchPrivilegesFiltered,
285
+ branchCompositeType.owner,
286
+ );
287
+
288
+ changes.push(
289
+ ...(emitObjectPrivilegeChanges(
290
+ privilegeResults,
291
+ branchCompositeType,
292
+ mainCompositeType,
293
+ "compositeType",
294
+ {
295
+ Grant: GrantCompositeTypePrivileges,
296
+ Revoke: RevokeCompositeTypePrivileges,
297
+ RevokeGrantOption: RevokeGrantOptionCompositeTypePrivileges,
298
+ },
299
+ ctx.version,
300
+ ) as CompositeTypeChange[]),
301
+ );
302
+
303
+ // Note: Composite type renaming would also use ALTER TYPE ... RENAME TO ...
304
+ // But since our CompositeType model uses 'name' as the identity field,
305
+ // a name change would be handled as drop + create by diffObjects()
306
+ }
307
+ }
308
+
309
+ return changes;
310
+ }
@@ -0,0 +1,253 @@
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
+ type TableLikeObject,
8
+ } from "../../base.model.ts";
9
+ import {
10
+ type PrivilegeProps,
11
+ privilegePropsSchema,
12
+ } from "../../base.privilege-diff.ts";
13
+ import { ReplicaIdentitySchema } from "../../table/table.model.ts";
14
+
15
+ const compositeTypePropsSchema = z.object({
16
+ schema: z.string(),
17
+ name: z.string(),
18
+ row_security: z.boolean(),
19
+ force_row_security: z.boolean(),
20
+ has_indexes: z.boolean(),
21
+ has_rules: z.boolean(),
22
+ has_triggers: z.boolean(),
23
+ has_subclasses: z.boolean(),
24
+ is_populated: z.boolean(),
25
+ replica_identity: ReplicaIdentitySchema,
26
+ is_partition: z.boolean(),
27
+ options: z.array(z.string()).nullable(),
28
+ partition_bound: z.string().nullable(),
29
+ owner: z.string(),
30
+ comment: z.string().nullable(),
31
+ columns: z.array(columnPropsSchema),
32
+ privileges: z.array(privilegePropsSchema),
33
+ });
34
+
35
+ type CompositeTypePrivilegeProps = PrivilegeProps;
36
+ export type CompositeTypeProps = z.infer<typeof compositeTypePropsSchema>;
37
+
38
+ export class CompositeType extends BasePgModel implements TableLikeObject {
39
+ public readonly schema: CompositeTypeProps["schema"];
40
+ public readonly name: CompositeTypeProps["name"];
41
+ public readonly row_security: CompositeTypeProps["row_security"];
42
+ public readonly force_row_security: CompositeTypeProps["force_row_security"];
43
+ public readonly has_indexes: CompositeTypeProps["has_indexes"];
44
+ public readonly has_rules: CompositeTypeProps["has_rules"];
45
+ public readonly has_triggers: CompositeTypeProps["has_triggers"];
46
+ public readonly has_subclasses: CompositeTypeProps["has_subclasses"];
47
+ public readonly is_populated: CompositeTypeProps["is_populated"];
48
+ public readonly replica_identity: CompositeTypeProps["replica_identity"];
49
+ public readonly is_partition: CompositeTypeProps["is_partition"];
50
+ public readonly options: CompositeTypeProps["options"];
51
+ public readonly partition_bound: CompositeTypeProps["partition_bound"];
52
+ public readonly owner: CompositeTypeProps["owner"];
53
+ public readonly comment: CompositeTypeProps["comment"];
54
+ public readonly columns: CompositeTypeProps["columns"];
55
+ public readonly privileges: CompositeTypePrivilegeProps[];
56
+
57
+ constructor(props: CompositeTypeProps) {
58
+ super();
59
+
60
+ // Identity fields
61
+ this.schema = props.schema;
62
+ this.name = props.name;
63
+
64
+ // Data fields
65
+ this.row_security = props.row_security;
66
+ this.force_row_security = props.force_row_security;
67
+ this.has_indexes = props.has_indexes;
68
+ this.has_rules = props.has_rules;
69
+ this.has_triggers = props.has_triggers;
70
+ this.has_subclasses = props.has_subclasses;
71
+ this.is_populated = props.is_populated;
72
+ this.replica_identity = props.replica_identity;
73
+ this.is_partition = props.is_partition;
74
+ this.options = props.options;
75
+ this.partition_bound = props.partition_bound;
76
+ this.owner = props.owner;
77
+ this.comment = props.comment;
78
+ this.columns = props.columns;
79
+ this.privileges = props.privileges;
80
+ }
81
+
82
+ get stableId(): `type:${string}` {
83
+ return `type:${this.schema}.${this.name}`;
84
+ }
85
+
86
+ get identityFields() {
87
+ return {
88
+ schema: this.schema,
89
+ name: this.name,
90
+ };
91
+ }
92
+
93
+ get dataFields() {
94
+ return {
95
+ row_security: this.row_security,
96
+ force_row_security: this.force_row_security,
97
+ has_indexes: this.has_indexes,
98
+ has_rules: this.has_rules,
99
+ has_triggers: this.has_triggers,
100
+ has_subclasses: this.has_subclasses,
101
+ is_populated: this.is_populated,
102
+ replica_identity: this.replica_identity,
103
+ is_partition: this.is_partition,
104
+ options: this.options,
105
+ partition_bound: this.partition_bound,
106
+ owner: this.owner,
107
+ comment: this.comment,
108
+ columns: this.columns,
109
+ privileges: this.privileges,
110
+ };
111
+ }
112
+
113
+ override stableSnapshot() {
114
+ const normalizeColumns = () =>
115
+ [...this.columns]
116
+ .map((col) => {
117
+ const { position: _pos, ...rest } = col as unknown as Record<
118
+ string,
119
+ unknown
120
+ >;
121
+ return rest;
122
+ })
123
+ .sort((a, b) => {
124
+ const nameA = (a.name as string | undefined) ?? "";
125
+ const nameB = (b.name as string | undefined) ?? "";
126
+ return nameA.localeCompare(nameB);
127
+ });
128
+
129
+ return {
130
+ identity: this.identityFields,
131
+ data: {
132
+ ...this.dataFields,
133
+ columns: normalizeColumns(),
134
+ },
135
+ };
136
+ }
137
+ }
138
+
139
+ export async function extractCompositeTypes(
140
+ pool: Pool,
141
+ ): Promise<CompositeType[]> {
142
+ const { rows: compositeTypeRows } = await pool.query<CompositeTypeProps>(sql`
143
+ WITH extension_oids AS (
144
+ SELECT objid
145
+ FROM pg_depend d
146
+ WHERE d.refclassid = 'pg_extension'::regclass
147
+ AND d.classid = 'pg_type'::regclass
148
+ ),
149
+ composite_types AS (
150
+ SELECT
151
+ c.relnamespace::regnamespace::text AS schema,
152
+ quote_ident(c.relname) AS name,
153
+ c.relrowsecurity AS row_security,
154
+ c.relforcerowsecurity AS force_row_security,
155
+ c.relhasindex AS has_indexes,
156
+ c.relhasrules AS has_rules,
157
+ c.relhastriggers AS has_triggers,
158
+ c.relhassubclass AS has_subclasses,
159
+ c.relispopulated AS is_populated,
160
+ c.relreplident AS replica_identity,
161
+ c.relispartition AS is_partition,
162
+ c.reloptions AS options,
163
+ pg_get_expr(c.relpartbound, c.oid) AS partition_bound,
164
+ c.relowner::regrole::text AS owner,
165
+ obj_description(c.reltype, 'pg_type') AS comment,
166
+ c.relacl AS relacl, -- used by privileges LATERAL
167
+ c.relowner AS relowner,
168
+ c.oid AS oid
169
+ FROM pg_catalog.pg_class c
170
+ LEFT JOIN extension_oids e ON c.reltype = e.objid
171
+ WHERE NOT c.relnamespace::regnamespace::text LIKE ANY (ARRAY['pg\\_%', 'information\\_schema'])
172
+ AND e.objid IS NULL
173
+ AND c.relkind = 'c'
174
+ )
175
+ SELECT
176
+ ct.schema,
177
+ ct.name,
178
+ ct.row_security,
179
+ ct.force_row_security,
180
+ ct.has_indexes,
181
+ ct.has_rules,
182
+ ct.has_triggers,
183
+ ct.has_subclasses,
184
+ ct.is_populated,
185
+ ct.replica_identity,
186
+ ct.is_partition,
187
+ ct.options,
188
+ ct.partition_bound,
189
+ ct.owner,
190
+ ct.comment,
191
+ COALESCE(priv.privileges, '[]') AS privileges,
192
+ COALESCE(cols.columns, '[]') AS columns
193
+ FROM composite_types ct
194
+
195
+ -- privileges as a per-row LATERAL subquery
196
+ LEFT JOIN LATERAL (
197
+ SELECT json_agg(
198
+ json_build_object(
199
+ 'grantee', CASE WHEN x.grantee = 0 THEN 'PUBLIC' ELSE x.grantee::regrole::text END,
200
+ 'privilege', x.privilege_type,
201
+ 'grantable', x.is_grantable
202
+ )
203
+ ORDER BY x.grantee, x.privilege_type
204
+ ) AS privileges
205
+ FROM LATERAL aclexplode(COALESCE(ct.relacl, acldefault('T', ct.relowner))) AS x(grantor, grantee, privilege_type, is_grantable)
206
+ ) priv ON TRUE
207
+
208
+ -- columns as a per-row LATERAL subquery (so no GROUP BY needed)
209
+ LEFT JOIN LATERAL (
210
+ SELECT json_agg(
211
+ json_build_object(
212
+ 'name', quote_ident(a.attname),
213
+ 'position', a.attnum,
214
+ 'data_type', a.atttypid::regtype::text,
215
+ 'data_type_str', format_type(a.atttypid, a.atttypmod),
216
+ 'is_custom_type', ty.typnamespace::regnamespace::text NOT IN ('pg_catalog','information_schema'),
217
+ 'custom_type_type', CASE WHEN ty.typnamespace::regnamespace::text NOT IN ('pg_catalog','information_schema') THEN ty.typtype ELSE NULL END,
218
+ 'custom_type_category', CASE WHEN ty.typnamespace::regnamespace::text NOT IN ('pg_catalog','information_schema') THEN ty.typcategory ELSE NULL END,
219
+ 'custom_type_schema', CASE WHEN ty.typnamespace::regnamespace::text NOT IN ('pg_catalog','information_schema') THEN ty.typnamespace::regnamespace ELSE NULL END,
220
+ 'custom_type_name', CASE WHEN ty.typnamespace::regnamespace::text NOT IN ('pg_catalog','information_schema') THEN quote_ident(ty.typname) ELSE NULL END,
221
+ 'not_null', a.attnotnull,
222
+ 'is_identity', a.attidentity <> '',
223
+ 'is_identity_always', a.attidentity = 'a',
224
+ 'is_generated', a.attgenerated <> '',
225
+ 'collation', (
226
+ SELECT quote_ident(c2.collname)
227
+ FROM pg_collation c2, pg_type t2
228
+ WHERE c2.oid = a.attcollation
229
+ AND t2.oid = a.atttypid
230
+ AND a.attcollation <> t2.typcollation
231
+ ),
232
+ 'default', pg_get_expr(ad.adbin, ad.adrelid),
233
+ 'comment', col_description(a.attrelid, a.attnum)
234
+ )
235
+ ORDER BY a.attnum
236
+ ) AS columns
237
+ FROM pg_attribute a
238
+ LEFT JOIN pg_attrdef ad ON a.attrelid = ad.adrelid AND a.attnum = ad.adnum
239
+ LEFT JOIN pg_type ty ON ty.oid = a.atttypid
240
+ WHERE a.attrelid = ct.oid
241
+ AND a.attnum > 0
242
+ AND NOT a.attisdropped
243
+ ) cols ON TRUE
244
+
245
+ ORDER BY ct.schema, ct.name
246
+ `);
247
+
248
+ // Validate and parse each row using the Zod schema
249
+ const validatedRows = compositeTypeRows.map((row: unknown) =>
250
+ compositeTypePropsSchema.parse(row),
251
+ );
252
+ return validatedRows.map((row: CompositeTypeProps) => new CompositeType(row));
253
+ }
@@ -0,0 +1,113 @@
1
+ import { describe, expect, test } from "bun:test";
2
+ import { assertValidSql } from "../../../../test-utils/assert-valid-sql.ts";
3
+ import { Enum, type EnumProps } from "../enum.model.ts";
4
+ import { AlterEnumAddValue, AlterEnumChangeOwner } from "./enum.alter.ts";
5
+
6
+ describe.concurrent("enum", () => {
7
+ describe("alter", () => {
8
+ test("change owner", async () => {
9
+ const props: Omit<EnumProps, "owner"> = {
10
+ schema: "public",
11
+ name: "test_enum",
12
+ labels: [
13
+ { sort_order: 1, label: "value1" },
14
+ { sort_order: 2, label: "value2" },
15
+ ],
16
+ comment: null,
17
+ privileges: [],
18
+ };
19
+ const main = new Enum({
20
+ ...props,
21
+ owner: "old_owner",
22
+ });
23
+ const change = new AlterEnumChangeOwner({
24
+ enum: main,
25
+ owner: "new_owner",
26
+ });
27
+
28
+ await assertValidSql(change.serialize());
29
+
30
+ expect(change.serialize()).toBe(
31
+ "ALTER TYPE public.test_enum OWNER TO new_owner",
32
+ );
33
+ });
34
+
35
+ test("add value", async () => {
36
+ const props: EnumProps = {
37
+ schema: "public",
38
+ name: "test_enum",
39
+ owner: "test",
40
+ labels: [
41
+ { sort_order: 1, label: "value1" },
42
+ { sort_order: 2, label: "value2" },
43
+ ],
44
+ comment: null,
45
+ privileges: [],
46
+ };
47
+ const main = new Enum(props);
48
+ const change = new AlterEnumAddValue({ enum: main, newValue: "value3" });
49
+
50
+ await assertValidSql(change.serialize());
51
+
52
+ expect(change.serialize()).toBe(
53
+ "ALTER TYPE public.test_enum ADD VALUE 'value3'",
54
+ );
55
+ });
56
+
57
+ test("add value before", async () => {
58
+ const props: EnumProps = {
59
+ schema: "public",
60
+ name: "test_enum",
61
+ owner: "test",
62
+ labels: [
63
+ { sort_order: 1, label: "value1" },
64
+ { sort_order: 2, label: "value2" },
65
+ ],
66
+ comment: null,
67
+ privileges: [],
68
+ };
69
+ const main = new Enum(props);
70
+ const change = new AlterEnumAddValue({
71
+ enum: main,
72
+ newValue: "value1_5",
73
+ position: { before: "value2" },
74
+ });
75
+
76
+ await assertValidSql(change.serialize());
77
+
78
+ expect(change.serialize()).toBe(
79
+ "ALTER TYPE public.test_enum ADD VALUE 'value1_5' BEFORE 'value2'",
80
+ );
81
+ });
82
+
83
+ test("add value after", async () => {
84
+ const props: EnumProps = {
85
+ schema: "public",
86
+ name: "test_enum",
87
+ owner: "test",
88
+ labels: [
89
+ { sort_order: 1, label: "value1" },
90
+ { sort_order: 2, label: "value2" },
91
+ ],
92
+ comment: null,
93
+ privileges: [],
94
+ };
95
+ const main = new Enum(props);
96
+ const change = new AlterEnumAddValue({
97
+ enum: main,
98
+ newValue: "value1_5",
99
+ position: { after: "value1" },
100
+ });
101
+
102
+ await assertValidSql(change.serialize());
103
+
104
+ expect(change.serialize()).toBe(
105
+ "ALTER TYPE public.test_enum ADD VALUE 'value1_5' AFTER 'value1'",
106
+ );
107
+ });
108
+
109
+ test("complex enum changes are not auto-replaced", async () => {
110
+ expect(1).toBe(1);
111
+ });
112
+ });
113
+ });