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

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 (359) hide show
  1. package/README.md +40 -23
  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 +19 -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/core/catalog-export/index.d.ts +11 -0
  21. package/dist/core/catalog-export/index.js +10 -0
  22. package/dist/core/catalog.diff.d.ts +1 -0
  23. package/dist/core/catalog.diff.js +64 -48
  24. package/dist/core/catalog.model.d.ts +14 -1
  25. package/dist/core/catalog.model.js +103 -1
  26. package/dist/core/catalog.snapshot.d.ts +66 -0
  27. package/dist/core/catalog.snapshot.js +206 -0
  28. package/dist/core/declarative-apply/discover-sql.d.ts +18 -0
  29. package/dist/core/declarative-apply/discover-sql.js +86 -0
  30. package/dist/core/declarative-apply/extract-catalog-providers.d.ts +23 -0
  31. package/dist/core/declarative-apply/extract-catalog-providers.js +159 -0
  32. package/dist/core/declarative-apply/index.d.ts +49 -0
  33. package/dist/core/declarative-apply/index.js +134 -0
  34. package/dist/core/declarative-apply/round-apply.d.ts +100 -0
  35. package/dist/core/declarative-apply/round-apply.js +378 -0
  36. package/dist/core/export/file-mapper.d.ts +71 -0
  37. package/dist/core/export/file-mapper.js +474 -0
  38. package/dist/core/export/grouper.d.ts +13 -0
  39. package/dist/core/export/grouper.js +76 -0
  40. package/dist/core/export/index.d.ts +45 -0
  41. package/dist/core/export/index.js +63 -0
  42. package/dist/core/export/types.d.ts +84 -0
  43. package/dist/core/export/types.js +25 -0
  44. package/dist/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
  45. package/dist/core/integrations/filter/dsl.d.ts +38 -1
  46. package/dist/core/integrations/filter/dsl.js +20 -2
  47. package/dist/core/integrations/filter/extractors.js +42 -0
  48. package/dist/core/integrations/integration-dsl.d.ts +10 -0
  49. package/dist/core/integrations/supabase.d.ts +8 -0
  50. package/dist/core/integrations/supabase.js +9 -0
  51. package/dist/core/objects/aggregate/aggregate.diff.d.ts +2 -8
  52. package/dist/core/objects/aggregate/aggregate.diff.js +16 -70
  53. package/dist/core/objects/aggregate/aggregate.model.d.ts +8 -8
  54. package/dist/core/objects/aggregate/aggregate.model.js +1 -1
  55. package/dist/core/objects/aggregate/changes/aggregate.create.js +1 -1
  56. package/dist/core/objects/aggregate/changes/aggregate.drop.js +1 -1
  57. package/dist/core/objects/base.privilege-diff.d.ts +38 -13
  58. package/dist/core/objects/base.privilege-diff.js +104 -22
  59. package/dist/core/objects/base.privilege.d.ts +1 -0
  60. package/dist/core/objects/base.privilege.js +9 -2
  61. package/dist/core/objects/collation/collation.diff.d.ts +2 -3
  62. package/dist/core/objects/diff-context.d.ts +15 -0
  63. package/dist/core/objects/diff-context.js +1 -0
  64. package/dist/core/objects/domain/changes/domain.create.js +4 -2
  65. package/dist/core/objects/domain/domain.diff.d.ts +2 -8
  66. package/dist/core/objects/domain/domain.diff.js +16 -77
  67. package/dist/core/objects/domain/domain.model.js +1 -1
  68. package/dist/core/objects/event-trigger/event-trigger.diff.d.ts +2 -3
  69. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.d.ts +2 -8
  70. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.js +13 -77
  71. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.js +2 -2
  72. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.d.ts +2 -8
  73. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.js +16 -77
  74. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.js +1 -1
  75. package/dist/core/objects/foreign-data-wrapper/server/server.diff.d.ts +2 -8
  76. package/dist/core/objects/foreign-data-wrapper/server/server.diff.js +13 -77
  77. package/dist/core/objects/language/language.diff.d.ts +2 -5
  78. package/dist/core/objects/language/language.diff.js +7 -39
  79. package/dist/core/objects/materialized-view/materialized-view.diff.d.ts +2 -8
  80. package/dist/core/objects/materialized-view/materialized-view.diff.js +16 -158
  81. package/dist/core/objects/materialized-view/materialized-view.model.d.ts +3 -3
  82. package/dist/core/objects/materialized-view/materialized-view.model.js +1 -1
  83. package/dist/core/objects/procedure/changes/procedure.alter.js +12 -12
  84. package/dist/core/objects/procedure/procedure.diff.d.ts +2 -8
  85. package/dist/core/objects/procedure/procedure.diff.js +16 -77
  86. package/dist/core/objects/procedure/procedure.model.d.ts +9 -9
  87. package/dist/core/objects/procedure/procedure.model.js +1 -1
  88. package/dist/core/objects/publication/changes/publication.alter.d.ts +0 -9
  89. package/dist/core/objects/publication/changes/publication.alter.js +0 -14
  90. package/dist/core/objects/publication/changes/publication.types.d.ts +2 -2
  91. package/dist/core/objects/publication/publication.diff.d.ts +2 -3
  92. package/dist/core/objects/publication/publication.diff.js +8 -13
  93. package/dist/core/objects/rls-policy/changes/rls-policy.alter.js +3 -3
  94. package/dist/core/objects/rls-policy/rls-policy.model.d.ts +2 -2
  95. package/dist/core/objects/role/role.diff.js +22 -1
  96. package/dist/core/objects/role/role.model.d.ts +4 -3
  97. package/dist/core/objects/role/role.model.js +118 -12
  98. package/dist/core/objects/rule/rule.model.d.ts +1 -1
  99. package/dist/core/objects/schema/schema.diff.d.ts +2 -8
  100. package/dist/core/objects/schema/schema.diff.js +16 -77
  101. package/dist/core/objects/schema/schema.model.js +1 -1
  102. package/dist/core/objects/sequence/sequence.diff.d.ts +2 -8
  103. package/dist/core/objects/sequence/sequence.diff.js +16 -79
  104. package/dist/core/objects/sequence/sequence.model.js +1 -1
  105. package/dist/core/objects/subscription/subscription.diff.d.ts +2 -3
  106. package/dist/core/objects/table/changes/table.create.js +3 -0
  107. package/dist/core/objects/table/table.diff.d.ts +2 -8
  108. package/dist/core/objects/table/table.diff.js +26 -157
  109. package/dist/core/objects/table/table.model.d.ts +23 -22
  110. package/dist/core/objects/table/table.model.js +1 -1
  111. package/dist/core/objects/trigger/changes/trigger.create.js +2 -4
  112. package/dist/core/objects/trigger/trigger.model.d.ts +8 -0
  113. package/dist/core/objects/trigger/trigger.model.js +11 -0
  114. package/dist/core/objects/type/composite-type/composite-type.diff.d.ts +2 -8
  115. package/dist/core/objects/type/composite-type/composite-type.diff.js +16 -77
  116. package/dist/core/objects/type/composite-type/composite-type.model.d.ts +3 -3
  117. package/dist/core/objects/type/composite-type/composite-type.model.js +2 -1
  118. package/dist/core/objects/type/enum/enum.diff.d.ts +2 -8
  119. package/dist/core/objects/type/enum/enum.diff.js +25 -112
  120. package/dist/core/objects/type/enum/enum.model.js +1 -1
  121. package/dist/core/objects/type/range/changes/range.create.js +6 -3
  122. package/dist/core/objects/type/range/range.diff.d.ts +2 -8
  123. package/dist/core/objects/type/range/range.diff.js +16 -77
  124. package/dist/core/objects/type/range/range.model.js +1 -1
  125. package/dist/core/objects/view/view.diff.d.ts +2 -8
  126. package/dist/core/objects/view/view.diff.js +16 -158
  127. package/dist/core/objects/view/view.model.d.ts +18 -4
  128. package/dist/core/objects/view/view.model.js +3 -13
  129. package/dist/core/plan/apply.js +9 -26
  130. package/dist/core/plan/create.d.ts +19 -6
  131. package/dist/core/plan/create.js +134 -174
  132. package/dist/core/plan/serialize.js +16 -4
  133. package/dist/core/plan/sql-format/fixtures.js +3 -5
  134. package/dist/core/plan/sql-format/keyword-case.js +26 -1
  135. package/dist/core/plan/ssl-config.d.ts +32 -0
  136. package/dist/core/plan/ssl-config.js +115 -0
  137. package/dist/core/plan/types.d.ts +6 -0
  138. package/dist/core/postgres-config.d.ts +14 -0
  139. package/dist/core/postgres-config.js +53 -2
  140. package/dist/core/sort/graph-builder.js +10 -0
  141. package/dist/core/sort/logical-sort.js +31 -23
  142. package/dist/core/test-utils/assert-valid-sql.d.ts +10 -0
  143. package/dist/core/test-utils/assert-valid-sql.js +19 -0
  144. package/dist/index.d.ts +6 -0
  145. package/dist/index.js +6 -1
  146. package/package.json +21 -4
  147. package/src/cli/app.ts +27 -3
  148. package/src/cli/bin/cli.ts +6 -0
  149. package/src/cli/commands/catalog-export.ts +78 -0
  150. package/src/cli/commands/declarative-apply.diagnostics.test.ts +77 -0
  151. package/src/cli/commands/declarative-apply.ts +380 -0
  152. package/src/cli/commands/declarative-export.ts +330 -0
  153. package/src/cli/commands/plan.ts +28 -7
  154. package/src/cli/exit-code.test.ts +19 -0
  155. package/src/cli/exit-code.ts +7 -0
  156. package/src/cli/formatters/tree/tree.ts +3 -2
  157. package/src/cli/utils/apply-display.test.ts +348 -0
  158. package/src/cli/utils/apply-display.ts +238 -0
  159. package/src/cli/utils/export-display.test.ts +103 -0
  160. package/src/cli/utils/export-display.ts +275 -0
  161. package/src/cli/utils/integrations.test.ts +44 -0
  162. package/src/cli/utils/resolve-input.test.ts +38 -0
  163. package/src/cli/utils/resolve-input.ts +17 -0
  164. package/src/core/catalog-export/index.ts +20 -0
  165. package/src/core/catalog.diff.ts +79 -78
  166. package/src/core/catalog.model.test.ts +122 -0
  167. package/src/core/catalog.model.ts +127 -1
  168. package/src/core/catalog.snapshot.test.ts +464 -0
  169. package/src/core/catalog.snapshot.ts +289 -0
  170. package/src/core/declarative-apply/discover-sql.test.ts +103 -0
  171. package/src/core/declarative-apply/discover-sql.ts +107 -0
  172. package/src/core/declarative-apply/extract-catalog-providers.ts +220 -0
  173. package/src/core/declarative-apply/index.test.ts +67 -0
  174. package/src/core/declarative-apply/index.ts +205 -0
  175. package/src/core/declarative-apply/round-apply.test.ts +504 -0
  176. package/src/core/declarative-apply/round-apply.ts +562 -0
  177. package/src/core/expand-replace-dependencies.test.ts +70 -0
  178. package/src/core/export/file-mapper.test.ts +816 -0
  179. package/src/core/export/file-mapper.ts +574 -0
  180. package/src/core/export/grouper.ts +108 -0
  181. package/src/core/export/index.ts +129 -0
  182. package/src/core/export/types.ts +104 -0
  183. package/src/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
  184. package/src/core/integrations/filter/dsl.test.ts +211 -0
  185. package/src/core/integrations/filter/dsl.ts +65 -3
  186. package/src/core/integrations/filter/extractors.test.ts +244 -0
  187. package/src/core/integrations/filter/extractors.ts +42 -0
  188. package/src/core/integrations/integration-dsl.ts +10 -0
  189. package/src/core/integrations/serialize/dsl.test.ts +91 -0
  190. package/src/core/integrations/supabase.ts +9 -0
  191. package/src/core/objects/aggregate/aggregate.diff.ts +39 -95
  192. package/src/core/objects/aggregate/aggregate.model.ts +1 -1
  193. package/src/core/objects/aggregate/changes/aggregate.alter.test.ts +3 -1
  194. package/src/core/objects/aggregate/changes/aggregate.comment.test.ts +5 -2
  195. package/src/core/objects/aggregate/changes/aggregate.create.test.ts +6 -3
  196. package/src/core/objects/aggregate/changes/aggregate.create.ts +1 -1
  197. package/src/core/objects/aggregate/changes/aggregate.drop.test.ts +7 -3
  198. package/src/core/objects/aggregate/changes/aggregate.drop.ts +1 -1
  199. package/src/core/objects/aggregate/changes/aggregate.privilege.test.ts +9 -3
  200. package/src/core/objects/base.privilege-diff.ts +178 -30
  201. package/src/core/objects/base.privilege.ts +9 -2
  202. package/src/core/objects/collation/changes/collation.alter.test.ts +7 -2
  203. package/src/core/objects/collation/changes/collation.create.test.ts +7 -2
  204. package/src/core/objects/collation/changes/collation.drop.test.ts +4 -1
  205. package/src/core/objects/collation/collation.diff.test.ts +9 -12
  206. package/src/core/objects/collation/collation.diff.ts +2 -1
  207. package/src/core/objects/diff-context.ts +16 -0
  208. package/src/core/objects/domain/changes/domain.alter.test.ts +28 -9
  209. package/src/core/objects/domain/changes/domain.create.test.ts +32 -2
  210. package/src/core/objects/domain/changes/domain.create.ts +7 -1
  211. package/src/core/objects/domain/changes/domain.drop.test.ts +4 -1
  212. package/src/core/objects/domain/domain.diff.ts +39 -102
  213. package/src/core/objects/domain/domain.model.ts +1 -1
  214. package/src/core/objects/event-trigger/changes/event-trigger.alter.test.ts +10 -3
  215. package/src/core/objects/event-trigger/changes/event-trigger.create.test.ts +4 -1
  216. package/src/core/objects/event-trigger/changes/event-trigger.drop.test.ts +4 -1
  217. package/src/core/objects/event-trigger/event-trigger.diff.test.ts +12 -7
  218. package/src/core/objects/event-trigger/event-trigger.diff.ts +2 -1
  219. package/src/core/objects/extension/changes/extension.alter.test.ts +7 -2
  220. package/src/core/objects/extension/changes/extension.create.test.ts +4 -1
  221. package/src/core/objects/extension/changes/extension.drop.test.ts +4 -1
  222. package/src/core/objects/extension/extension.model.test.ts +98 -0
  223. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.test.ts +16 -5
  224. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.test.ts +51 -16
  225. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.test.ts +4 -1
  226. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.test.ts +111 -4
  227. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.ts +31 -101
  228. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.ts +2 -2
  229. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.test.ts +46 -15
  230. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.test.ts +13 -4
  231. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.test.ts +4 -1
  232. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.ts +39 -102
  233. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.ts +1 -1
  234. package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.test.ts +22 -7
  235. package/src/core/objects/foreign-data-wrapper/server/changes/server.create.test.ts +19 -6
  236. package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.test.ts +4 -1
  237. package/src/core/objects/foreign-data-wrapper/server/server.diff.test.ts +95 -0
  238. package/src/core/objects/foreign-data-wrapper/server/server.diff.ts +31 -101
  239. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.test.ts +13 -4
  240. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.test.ts +16 -5
  241. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.test.ts +10 -3
  242. package/src/core/objects/index/changes/index.alter.test.ts +13 -4
  243. package/src/core/objects/index/changes/index.create.test.ts +4 -1
  244. package/src/core/objects/index/changes/index.drop.test.ts +4 -1
  245. package/src/core/objects/language/changes/language.alter.test.ts +4 -1
  246. package/src/core/objects/language/changes/language.create.test.ts +4 -1
  247. package/src/core/objects/language/changes/language.drop.test.ts +4 -1
  248. package/src/core/objects/language/language.diff.test.ts +86 -4
  249. package/src/core/objects/language/language.diff.ts +17 -49
  250. package/src/core/objects/materialized-view/changes/materialized-view.alter.test.ts +10 -3
  251. package/src/core/objects/materialized-view/changes/materialized-view.create.test.ts +7 -2
  252. package/src/core/objects/materialized-view/changes/materialized-view.drop.test.ts +4 -1
  253. package/src/core/objects/materialized-view/materialized-view.diff.test.ts +162 -0
  254. package/src/core/objects/materialized-view/materialized-view.diff.ts +41 -191
  255. package/src/core/objects/materialized-view/materialized-view.model.ts +1 -1
  256. package/src/core/objects/procedure/changes/procedure.alter.test.ts +121 -49
  257. package/src/core/objects/procedure/changes/procedure.alter.ts +15 -12
  258. package/src/core/objects/procedure/changes/procedure.create.test.ts +4 -1
  259. package/src/core/objects/procedure/changes/procedure.drop.test.ts +7 -2
  260. package/src/core/objects/procedure/procedure.diff.ts +39 -102
  261. package/src/core/objects/procedure/procedure.model.ts +1 -1
  262. package/src/core/objects/publication/changes/publication.alter.test.ts +15 -21
  263. package/src/core/objects/publication/changes/publication.alter.ts +0 -18
  264. package/src/core/objects/publication/changes/publication.comment.test.ts +5 -2
  265. package/src/core/objects/publication/changes/publication.create.test.ts +5 -2
  266. package/src/core/objects/publication/changes/publication.drop.test.ts +3 -1
  267. package/src/core/objects/publication/changes/publication.types.ts +0 -2
  268. package/src/core/objects/publication/publication.diff.test.ts +24 -19
  269. package/src/core/objects/publication/publication.diff.ts +9 -15
  270. package/src/core/objects/rls-policy/changes/rls-policy.alter.test.ts +31 -14
  271. package/src/core/objects/rls-policy/changes/rls-policy.alter.ts +3 -3
  272. package/src/core/objects/rls-policy/changes/rls-policy.create.test.ts +10 -3
  273. package/src/core/objects/rls-policy/changes/rls-policy.drop.test.ts +4 -1
  274. package/src/core/objects/role/changes/role.alter.test.ts +31 -15
  275. package/src/core/objects/role/changes/role.create.test.ts +6 -2
  276. package/src/core/objects/role/changes/role.drop.test.ts +4 -1
  277. package/src/core/objects/role/role.diff.test.ts +235 -0
  278. package/src/core/objects/role/role.diff.ts +21 -1
  279. package/src/core/objects/role/role.model.ts +122 -14
  280. package/src/core/objects/rule/changes/rule.alter.test.ts +7 -3
  281. package/src/core/objects/rule/changes/rule.comment.test.ts +5 -2
  282. package/src/core/objects/rule/changes/rule.create.test.ts +6 -2
  283. package/src/core/objects/rule/changes/rule.drop.test.ts +3 -1
  284. package/src/core/objects/schema/changes/schema.alter.test.ts +4 -1
  285. package/src/core/objects/schema/changes/schema.create.test.ts +4 -1
  286. package/src/core/objects/schema/changes/schema.drop.test.ts +4 -1
  287. package/src/core/objects/schema/schema.diff.ts +39 -102
  288. package/src/core/objects/schema/schema.model.ts +1 -1
  289. package/src/core/objects/sequence/changes/sequence.alter.test.ts +11 -5
  290. package/src/core/objects/sequence/changes/sequence.create.test.ts +8 -3
  291. package/src/core/objects/sequence/changes/sequence.drop.test.ts +4 -1
  292. package/src/core/objects/sequence/sequence.diff.test.ts +114 -0
  293. package/src/core/objects/sequence/sequence.diff.ts +39 -104
  294. package/src/core/objects/sequence/sequence.model.ts +1 -1
  295. package/src/core/objects/subscription/changes/subscription.alter.test.ts +15 -5
  296. package/src/core/objects/subscription/changes/subscription.comment.test.ts +5 -2
  297. package/src/core/objects/subscription/changes/subscription.create.test.ts +5 -2
  298. package/src/core/objects/subscription/changes/subscription.drop.test.ts +3 -1
  299. package/src/core/objects/subscription/subscription.diff.test.ts +16 -11
  300. package/src/core/objects/subscription/subscription.diff.ts +2 -1
  301. package/src/core/objects/table/changes/table.alter.test.ts +38 -15
  302. package/src/core/objects/table/changes/table.create.test.ts +41 -3
  303. package/src/core/objects/table/changes/table.create.ts +4 -0
  304. package/src/core/objects/table/changes/table.drop.test.ts +3 -1
  305. package/src/core/objects/table/table.diff.test.ts +157 -0
  306. package/src/core/objects/table/table.diff.ts +54 -190
  307. package/src/core/objects/table/table.model.ts +1 -1
  308. package/src/core/objects/trigger/changes/trigger.alter.test.ts +8 -4
  309. package/src/core/objects/trigger/changes/trigger.create.test.ts +5 -1
  310. package/src/core/objects/trigger/changes/trigger.create.ts +7 -4
  311. package/src/core/objects/trigger/changes/trigger.drop.test.ts +5 -1
  312. package/src/core/objects/trigger/trigger.diff.test.ts +1 -0
  313. package/src/core/objects/trigger/trigger.model.ts +12 -0
  314. package/src/core/objects/type/composite-type/changes/composite-type.alter.test.ts +10 -4
  315. package/src/core/objects/type/composite-type/changes/composite-type.create.test.ts +7 -2
  316. package/src/core/objects/type/composite-type/changes/composite-type.drop.test.ts +4 -1
  317. package/src/core/objects/type/composite-type/composite-type.diff.test.ts +78 -0
  318. package/src/core/objects/type/composite-type/composite-type.diff.ts +39 -101
  319. package/src/core/objects/type/composite-type/composite-type.model.ts +2 -1
  320. package/src/core/objects/type/enum/changes/enum.alter.test.ts +14 -5
  321. package/src/core/objects/type/enum/changes/enum.create.test.ts +4 -1
  322. package/src/core/objects/type/enum/changes/enum.drop.test.ts +4 -1
  323. package/src/core/objects/type/enum/enum.diff.test.ts +181 -0
  324. package/src/core/objects/type/enum/enum.diff.ts +58 -146
  325. package/src/core/objects/type/enum/enum.model.ts +1 -1
  326. package/src/core/objects/type/range/changes/range.alter.test.ts +3 -1
  327. package/src/core/objects/type/range/changes/range.create.test.ts +5 -2
  328. package/src/core/objects/type/range/changes/range.create.ts +6 -2
  329. package/src/core/objects/type/range/changes/range.drop.test.ts +3 -1
  330. package/src/core/objects/type/range/range.diff.test.ts +77 -0
  331. package/src/core/objects/type/range/range.diff.ts +39 -101
  332. package/src/core/objects/type/range/range.model.ts +1 -1
  333. package/src/core/objects/view/changes/view.alter.test.ts +8 -3
  334. package/src/core/objects/view/changes/view.create.test.ts +7 -2
  335. package/src/core/objects/view/changes/view.drop.test.ts +4 -1
  336. package/src/core/objects/view/view.diff.test.ts +82 -0
  337. package/src/core/objects/view/view.diff.ts +41 -191
  338. package/src/core/objects/view/view.model.ts +3 -17
  339. package/src/core/plan/apply.ts +9 -27
  340. package/src/core/plan/create.ts +173 -237
  341. package/src/core/plan/serialize.test.ts +317 -0
  342. package/src/core/plan/serialize.ts +18 -4
  343. package/src/core/plan/sql-format/fixtures.ts +2 -5
  344. package/src/core/plan/sql-format/format-lowercase-coverage.test.ts +52 -0
  345. package/src/core/plan/sql-format/format-off.test.ts +14 -17
  346. package/src/core/plan/sql-format/format-pretty-lower-leading.test.ts +27 -22
  347. package/src/core/plan/sql-format/format-pretty-narrow.test.ts +17 -21
  348. package/src/core/plan/sql-format/format-pretty-preserve.test.ts +25 -20
  349. package/src/core/plan/sql-format/format-pretty-upper.test.ts +23 -20
  350. package/src/core/plan/sql-format/keyword-case.ts +36 -1
  351. package/src/core/plan/ssl-config.ts +172 -0
  352. package/src/core/plan/types.ts +6 -0
  353. package/src/core/postgres-config.ts +71 -2
  354. package/src/core/sort/graph-builder.ts +12 -0
  355. package/src/core/sort/logical-sort.test.ts +371 -0
  356. package/src/core/sort/logical-sort.ts +32 -25
  357. package/src/core/sort/topological-sort.test.ts +275 -0
  358. package/src/core/test-utils/assert-valid-sql.ts +20 -0
  359. package/src/index.ts +26 -2
@@ -1,4 +1,5 @@
1
1
  import { describe, expect, test } from "bun:test";
2
+ import { assertValidSql } from "../../../../test-utils/assert-valid-sql.ts";
2
3
  import {
3
4
  ForeignTable,
4
5
  type ForeignTableProps,
@@ -47,19 +48,21 @@ describe.concurrent("foreign-table", () => {
47
48
  privileges: [],
48
49
  };
49
50
 
50
- test("change owner", () => {
51
+ test("change owner", async () => {
51
52
  const foreignTable = new ForeignTable(baseTableProps);
52
53
  const change = new AlterForeignTableChangeOwner({
53
54
  foreignTable,
54
55
  owner: "new_owner",
55
56
  });
56
57
 
58
+ await assertValidSql(change.serialize());
59
+
57
60
  expect(change.serialize()).toBe(
58
61
  "ALTER FOREIGN TABLE public.test_table OWNER TO new_owner",
59
62
  );
60
63
  });
61
64
 
62
- test("add column", () => {
65
+ test("add column", async () => {
63
66
  const foreignTable = new ForeignTable(baseTableProps);
64
67
  const change = new AlterForeignTableAddColumn({
65
68
  foreignTable,
@@ -83,12 +86,14 @@ describe.concurrent("foreign-table", () => {
83
86
  },
84
87
  });
85
88
 
89
+ await assertValidSql(change.serialize());
90
+
86
91
  expect(change.serialize()).toBe(
87
92
  "ALTER FOREIGN TABLE public.test_table ADD COLUMN name text",
88
93
  );
89
94
  });
90
95
 
91
- test("add column with NOT NULL", () => {
96
+ test("add column with NOT NULL", async () => {
92
97
  const foreignTable = new ForeignTable(baseTableProps);
93
98
  const change = new AlterForeignTableAddColumn({
94
99
  foreignTable,
@@ -112,12 +117,14 @@ describe.concurrent("foreign-table", () => {
112
117
  },
113
118
  });
114
119
 
120
+ await assertValidSql(change.serialize());
121
+
115
122
  expect(change.serialize()).toBe(
116
123
  "ALTER FOREIGN TABLE public.test_table ADD COLUMN name text NOT NULL",
117
124
  );
118
125
  });
119
126
 
120
- test("add column with DEFAULT", () => {
127
+ test("add column with DEFAULT", async () => {
121
128
  const foreignTable = new ForeignTable(baseTableProps);
122
129
  const change = new AlterForeignTableAddColumn({
123
130
  foreignTable,
@@ -141,12 +148,14 @@ describe.concurrent("foreign-table", () => {
141
148
  },
142
149
  });
143
150
 
151
+ await assertValidSql(change.serialize());
152
+
144
153
  expect(change.serialize()).toBe(
145
154
  "ALTER FOREIGN TABLE public.test_table ADD COLUMN name text DEFAULT 'default_value'",
146
155
  );
147
156
  });
148
157
 
149
- test("add column with NOT NULL and DEFAULT", () => {
158
+ test("add column with NOT NULL and DEFAULT", async () => {
150
159
  const foreignTable = new ForeignTable(baseTableProps);
151
160
  const change = new AlterForeignTableAddColumn({
152
161
  foreignTable,
@@ -170,24 +179,28 @@ describe.concurrent("foreign-table", () => {
170
179
  },
171
180
  });
172
181
 
182
+ await assertValidSql(change.serialize());
183
+
173
184
  expect(change.serialize()).toBe(
174
185
  "ALTER FOREIGN TABLE public.test_table ADD COLUMN name text NOT NULL DEFAULT 'default_value'",
175
186
  );
176
187
  });
177
188
 
178
- test("drop column", () => {
189
+ test("drop column", async () => {
179
190
  const foreignTable = new ForeignTable(baseTableProps);
180
191
  const change = new AlterForeignTableDropColumn({
181
192
  foreignTable,
182
193
  columnName: "id",
183
194
  });
184
195
 
196
+ await assertValidSql(change.serialize());
197
+
185
198
  expect(change.serialize()).toBe(
186
199
  "ALTER FOREIGN TABLE public.test_table DROP COLUMN id",
187
200
  );
188
201
  });
189
202
 
190
- test("alter column type", () => {
203
+ test("alter column type", async () => {
191
204
  const foreignTable = new ForeignTable(baseTableProps);
192
205
  const change = new AlterForeignTableAlterColumnType({
193
206
  foreignTable,
@@ -195,12 +208,14 @@ describe.concurrent("foreign-table", () => {
195
208
  dataType: "bigint",
196
209
  });
197
210
 
211
+ await assertValidSql(change.serialize());
212
+
198
213
  expect(change.serialize()).toBe(
199
214
  "ALTER FOREIGN TABLE public.test_table ALTER COLUMN id TYPE bigint",
200
215
  );
201
216
  });
202
217
 
203
- test("alter column set default", () => {
218
+ test("alter column set default", async () => {
204
219
  const foreignTable = new ForeignTable(baseTableProps);
205
220
  const change = new AlterForeignTableAlterColumnSetDefault({
206
221
  foreignTable,
@@ -208,48 +223,56 @@ describe.concurrent("foreign-table", () => {
208
223
  defaultValue: "0",
209
224
  });
210
225
 
226
+ await assertValidSql(change.serialize());
227
+
211
228
  expect(change.serialize()).toBe(
212
229
  "ALTER FOREIGN TABLE public.test_table ALTER COLUMN id SET DEFAULT 0",
213
230
  );
214
231
  });
215
232
 
216
- test("alter column drop default", () => {
233
+ test("alter column drop default", async () => {
217
234
  const foreignTable = new ForeignTable(baseTableProps);
218
235
  const change = new AlterForeignTableAlterColumnDropDefault({
219
236
  foreignTable,
220
237
  columnName: "id",
221
238
  });
222
239
 
240
+ await assertValidSql(change.serialize());
241
+
223
242
  expect(change.serialize()).toBe(
224
243
  "ALTER FOREIGN TABLE public.test_table ALTER COLUMN id DROP DEFAULT",
225
244
  );
226
245
  });
227
246
 
228
- test("alter column set not null", () => {
247
+ test("alter column set not null", async () => {
229
248
  const foreignTable = new ForeignTable(baseTableProps);
230
249
  const change = new AlterForeignTableAlterColumnSetNotNull({
231
250
  foreignTable,
232
251
  columnName: "id",
233
252
  });
234
253
 
254
+ await assertValidSql(change.serialize());
255
+
235
256
  expect(change.serialize()).toBe(
236
257
  "ALTER FOREIGN TABLE public.test_table ALTER COLUMN id SET NOT NULL",
237
258
  );
238
259
  });
239
260
 
240
- test("alter column drop not null", () => {
261
+ test("alter column drop not null", async () => {
241
262
  const foreignTable = new ForeignTable(baseTableProps);
242
263
  const change = new AlterForeignTableAlterColumnDropNotNull({
243
264
  foreignTable,
244
265
  columnName: "id",
245
266
  });
246
267
 
268
+ await assertValidSql(change.serialize());
269
+
247
270
  expect(change.serialize()).toBe(
248
271
  "ALTER FOREIGN TABLE public.test_table ALTER COLUMN id DROP NOT NULL",
249
272
  );
250
273
  });
251
274
 
252
- test("set options ADD", () => {
275
+ test("set options ADD", async () => {
253
276
  const foreignTable = new ForeignTable(baseTableProps);
254
277
  const change = new AlterForeignTableSetOptions({
255
278
  foreignTable,
@@ -259,12 +282,14 @@ describe.concurrent("foreign-table", () => {
259
282
  ],
260
283
  });
261
284
 
285
+ await assertValidSql(change.serialize());
286
+
262
287
  expect(change.serialize()).toBe(
263
288
  "ALTER FOREIGN TABLE public.test_table OPTIONS (ADD schema_name 'remote_schema', ADD table_name 'remote_table')",
264
289
  );
265
290
  });
266
291
 
267
- test("set options SET", () => {
292
+ test("set options SET", async () => {
268
293
  const foreignTable = new ForeignTable(baseTableProps);
269
294
  const change = new AlterForeignTableSetOptions({
270
295
  foreignTable,
@@ -273,24 +298,28 @@ describe.concurrent("foreign-table", () => {
273
298
  ],
274
299
  });
275
300
 
301
+ await assertValidSql(change.serialize());
302
+
276
303
  expect(change.serialize()).toBe(
277
304
  "ALTER FOREIGN TABLE public.test_table OPTIONS (SET schema_name 'new_schema')",
278
305
  );
279
306
  });
280
307
 
281
- test("set options DROP", () => {
308
+ test("set options DROP", async () => {
282
309
  const foreignTable = new ForeignTable(baseTableProps);
283
310
  const change = new AlterForeignTableSetOptions({
284
311
  foreignTable,
285
312
  options: [{ action: "DROP", option: "schema_name" }],
286
313
  });
287
314
 
315
+ await assertValidSql(change.serialize());
316
+
288
317
  expect(change.serialize()).toBe(
289
318
  "ALTER FOREIGN TABLE public.test_table OPTIONS (DROP schema_name)",
290
319
  );
291
320
  });
292
321
 
293
- test("set options mixed ADD/SET/DROP", () => {
322
+ test("set options mixed ADD/SET/DROP", async () => {
294
323
  const foreignTable = new ForeignTable(baseTableProps);
295
324
  const change = new AlterForeignTableSetOptions({
296
325
  foreignTable,
@@ -301,6 +330,8 @@ describe.concurrent("foreign-table", () => {
301
330
  ],
302
331
  });
303
332
 
333
+ await assertValidSql(change.serialize());
334
+
304
335
  expect(change.serialize()).toBe(
305
336
  "ALTER FOREIGN TABLE public.test_table OPTIONS (ADD new_option 'new_value', SET existing_option 'updated_value', DROP old_option)",
306
337
  );
@@ -1,9 +1,10 @@
1
1
  import { describe, expect, test } from "bun:test";
2
+ import { assertValidSql } from "../../../../test-utils/assert-valid-sql.ts";
2
3
  import { ForeignTable } from "../foreign-table.model.ts";
3
4
  import { CreateForeignTable } from "./foreign-table.create.ts";
4
5
 
5
6
  describe("foreign-table", () => {
6
- test("create basic", () => {
7
+ test("create basic", async () => {
7
8
  const foreignTable = new ForeignTable({
8
9
  schema: "public",
9
10
  name: "test_table",
@@ -38,12 +39,14 @@ describe("foreign-table", () => {
38
39
  foreignTable,
39
40
  });
40
41
 
42
+ await assertValidSql(change.serialize());
43
+
41
44
  expect(change.serialize()).toBe(
42
45
  "CREATE FOREIGN TABLE public.test_table (id integer) SERVER test_server",
43
46
  );
44
47
  });
45
48
 
46
- test("create with multiple columns", () => {
49
+ test("create with multiple columns", async () => {
47
50
  const foreignTable = new ForeignTable({
48
51
  schema: "public",
49
52
  name: "test_table",
@@ -96,12 +99,14 @@ describe("foreign-table", () => {
96
99
  foreignTable,
97
100
  });
98
101
 
102
+ await assertValidSql(change.serialize());
103
+
99
104
  expect(change.serialize()).toBe(
100
105
  "CREATE FOREIGN TABLE public.test_table (id integer, name text) SERVER test_server",
101
106
  );
102
107
  });
103
108
 
104
- test("create with options", () => {
109
+ test("create with options", async () => {
105
110
  const foreignTable = new ForeignTable({
106
111
  schema: "public",
107
112
  name: "test_table",
@@ -136,12 +141,14 @@ describe("foreign-table", () => {
136
141
  foreignTable,
137
142
  });
138
143
 
144
+ await assertValidSql(change.serialize());
145
+
139
146
  expect(change.serialize()).toBe(
140
147
  "CREATE FOREIGN TABLE public.test_table (id integer) SERVER test_server OPTIONS (schema_name 'remote_schema', table_name 'remote_table')",
141
148
  );
142
149
  });
143
150
 
144
- test("create with all properties", () => {
151
+ test("create with all properties", async () => {
145
152
  const foreignTable = new ForeignTable({
146
153
  schema: "public",
147
154
  name: "test_table",
@@ -194,6 +201,8 @@ describe("foreign-table", () => {
194
201
  foreignTable,
195
202
  });
196
203
 
204
+ await assertValidSql(change.serialize());
205
+
197
206
  expect(change.serialize()).toBe(
198
207
  "CREATE FOREIGN TABLE public.test_table (id integer, name text) SERVER test_server OPTIONS (schema_name 'remote_schema', table_name 'remote_table')",
199
208
  );
@@ -1,9 +1,10 @@
1
1
  import { describe, expect, test } from "bun:test";
2
+ import { assertValidSql } from "../../../../test-utils/assert-valid-sql.ts";
2
3
  import { ForeignTable } from "../foreign-table.model.ts";
3
4
  import { DropForeignTable } from "./foreign-table.drop.ts";
4
5
 
5
6
  describe("foreign-table", () => {
6
- test("drop", () => {
7
+ test("drop", async () => {
7
8
  const foreignTable = new ForeignTable({
8
9
  schema: "public",
9
10
  name: "test_table",
@@ -38,6 +39,8 @@ describe("foreign-table", () => {
38
39
  foreignTable,
39
40
  });
40
41
 
42
+ await assertValidSql(change.serialize());
43
+
41
44
  expect(change.serialize()).toBe("DROP FOREIGN TABLE public.test_table");
42
45
  });
43
46
  });
@@ -1,11 +1,10 @@
1
- import type { DefaultPrivilegeState } from "../../base.default-privileges.ts";
2
1
  import { diffObjects } from "../../base.diff.ts";
3
2
  import {
4
3
  diffPrivileges,
4
+ emitObjectPrivilegeChanges,
5
5
  filterPublicBuiltInDefaults,
6
- groupPrivilegesByGrantable,
7
6
  } from "../../base.privilege-diff.ts";
8
- import type { Role } from "../../role/role.model.ts";
7
+ import type { ObjectDiffContext } from "../../diff-context.ts";
9
8
  import {
10
9
  AlterForeignTableAddColumn,
11
10
  AlterForeignTableAlterColumnDropDefault,
@@ -40,12 +39,10 @@ import type { ForeignTable } from "./foreign-table.model.ts";
40
39
  * @returns A list of changes to apply to main to make it match branch.
41
40
  */
42
41
  export function diffForeignTables(
43
- ctx: {
44
- version: number;
45
- currentUser: string;
46
- defaultPrivilegeState: DefaultPrivilegeState;
47
- mainRoles: Record<string, Role>;
48
- },
42
+ ctx: Pick<
43
+ ObjectDiffContext,
44
+ "version" | "currentUser" | "defaultPrivilegeState"
45
+ >,
49
46
  main: Record<string, ForeignTable>,
50
47
  branch: Record<string, ForeignTable>,
51
48
  ): ForeignTableChange[] {
@@ -80,62 +77,34 @@ export function diffForeignTables(
80
77
  "foreign_table",
81
78
  createdTable.schema ?? "",
82
79
  );
80
+ const creatorFilteredDefaults =
81
+ createdTable.owner !== ctx.currentUser
82
+ ? effectiveDefaults.filter((p) => p.grantee !== ctx.currentUser)
83
+ : effectiveDefaults;
83
84
  const desiredPrivileges = filterPublicBuiltInDefaults(
84
85
  "foreign_table",
85
86
  createdTable.privileges,
86
87
  );
87
88
  const privilegeResults = diffPrivileges(
88
- effectiveDefaults,
89
+ filterPublicBuiltInDefaults("foreign_table", creatorFilteredDefaults),
89
90
  desiredPrivileges,
90
91
  createdTable.owner,
91
- ctx.mainRoles,
92
92
  );
93
93
 
94
- // Generate grant changes
95
- for (const [grantee, result] of privilegeResults) {
96
- if (result.grants.length > 0) {
97
- const grantGroups = groupPrivilegesByGrantable(result.grants);
98
- for (const [grantable, list] of grantGroups) {
99
- void grantable;
100
- changes.push(
101
- new GrantForeignTablePrivileges({
102
- foreignTable: createdTable,
103
- grantee,
104
- privileges: list,
105
- version: ctx.version,
106
- }),
107
- );
108
- }
109
- }
110
-
111
- // Generate revoke changes
112
- if (result.revokes.length > 0) {
113
- const revokeGroups = groupPrivilegesByGrantable(result.revokes);
114
- for (const [grantable, list] of revokeGroups) {
115
- void grantable;
116
- changes.push(
117
- new RevokeForeignTablePrivileges({
118
- foreignTable: createdTable,
119
- grantee,
120
- privileges: list,
121
- version: ctx.version,
122
- }),
123
- );
124
- }
125
- }
126
-
127
- // Generate revoke grant option changes
128
- if (result.revokeGrantOption.length > 0) {
129
- changes.push(
130
- new RevokeGrantOptionForeignTablePrivileges({
131
- foreignTable: createdTable,
132
- grantee,
133
- privilegeNames: result.revokeGrantOption,
134
- version: ctx.version,
135
- }),
136
- );
137
- }
138
- }
94
+ changes.push(
95
+ ...(emitObjectPrivilegeChanges(
96
+ privilegeResults,
97
+ createdTable,
98
+ createdTable,
99
+ "foreignTable",
100
+ {
101
+ Grant: GrantForeignTablePrivileges,
102
+ Revoke: RevokeForeignTablePrivileges,
103
+ RevokeGrantOption: RevokeGrantOptionForeignTablePrivileges,
104
+ },
105
+ ctx.version,
106
+ ) as ForeignTableChange[]),
107
+ );
139
108
  }
140
109
 
141
110
  for (const tableId of dropped) {
@@ -293,54 +262,22 @@ export function diffForeignTables(
293
262
  mainPrivilegesFiltered,
294
263
  branchPrivilegesFiltered,
295
264
  branchTable.owner,
296
- ctx.mainRoles,
297
265
  );
298
266
 
299
- for (const [grantee, result] of privilegeResults) {
300
- // Generate grant changes
301
- if (result.grants.length > 0) {
302
- const grantGroups = groupPrivilegesByGrantable(result.grants);
303
- for (const [grantable, list] of grantGroups) {
304
- void grantable;
305
- changes.push(
306
- new GrantForeignTablePrivileges({
307
- foreignTable: branchTable,
308
- grantee,
309
- privileges: list,
310
- version: ctx.version,
311
- }),
312
- );
313
- }
314
- }
315
-
316
- // Generate revoke changes
317
- if (result.revokes.length > 0) {
318
- const revokeGroups = groupPrivilegesByGrantable(result.revokes);
319
- for (const [grantable, list] of revokeGroups) {
320
- void grantable;
321
- changes.push(
322
- new RevokeForeignTablePrivileges({
323
- foreignTable: mainTable,
324
- grantee,
325
- privileges: list,
326
- version: ctx.version,
327
- }),
328
- );
329
- }
330
- }
331
-
332
- // Generate revoke grant option changes
333
- if (result.revokeGrantOption.length > 0) {
334
- changes.push(
335
- new RevokeGrantOptionForeignTablePrivileges({
336
- foreignTable: mainTable,
337
- grantee,
338
- privilegeNames: result.revokeGrantOption,
339
- version: ctx.version,
340
- }),
341
- );
342
- }
343
- }
267
+ changes.push(
268
+ ...(emitObjectPrivilegeChanges(
269
+ privilegeResults,
270
+ branchTable,
271
+ mainTable,
272
+ "foreignTable",
273
+ {
274
+ Grant: GrantForeignTablePrivileges,
275
+ Revoke: RevokeForeignTablePrivileges,
276
+ RevokeGrantOption: RevokeGrantOptionForeignTablePrivileges,
277
+ },
278
+ ctx.version,
279
+ ) as ForeignTableChange[]),
280
+ );
344
281
 
345
282
  // Note: Foreign table renaming would also use ALTER FOREIGN TABLE ... RENAME TO ...
346
283
  // But since our ForeignTable model uses 'name' as the identity field,
@@ -196,7 +196,7 @@ export async function extractForeignTables(
196
196
  from (
197
197
  -- one row for object ACL + one row per column ACL
198
198
  select null::name as attname, ft.oid as relacl_oid, (
199
- select c_rel.relacl from pg_class c_rel where c_rel.oid = ft.oid
199
+ select COALESCE(c_rel.relacl, acldefault('r', c_rel.relowner)) from pg_class c_rel where c_rel.oid = ft.oid
200
200
  ) as acl
201
201
  union all
202
202
  select a2.attname, ft.oid as relacl_oid, a2.attacl
@@ -1,4 +1,5 @@
1
1
  import { describe, expect, test } from "bun:test";
2
+ import { assertValidSql } from "../../../../test-utils/assert-valid-sql.ts";
2
3
  import { Server, type ServerProps } from "../server.model.ts";
3
4
  import {
4
5
  AlterServerChangeOwner,
@@ -8,7 +9,7 @@ import {
8
9
 
9
10
  describe.concurrent("server", () => {
10
11
  describe("alter", () => {
11
- test("change owner", () => {
12
+ test("change owner", async () => {
12
13
  const props: ServerProps = {
13
14
  name: "test_server",
14
15
  owner: "old_owner",
@@ -25,12 +26,14 @@ describe.concurrent("server", () => {
25
26
  owner: "new_owner",
26
27
  });
27
28
 
29
+ await assertValidSql(change.serialize());
30
+
28
31
  expect(change.serialize()).toBe(
29
32
  "ALTER SERVER test_server OWNER TO new_owner",
30
33
  );
31
34
  });
32
35
 
33
- test("set version", () => {
36
+ test("set version", async () => {
34
37
  const props: ServerProps = {
35
38
  name: "test_server",
36
39
  owner: "test",
@@ -47,10 +50,12 @@ describe.concurrent("server", () => {
47
50
  version: "2.0",
48
51
  });
49
52
 
53
+ await assertValidSql(change.serialize());
54
+
50
55
  expect(change.serialize()).toBe("ALTER SERVER test_server VERSION '2.0'");
51
56
  });
52
57
 
53
- test("set version to null", () => {
58
+ test("set version to null", async () => {
54
59
  const props: ServerProps = {
55
60
  name: "test_server",
56
61
  owner: "test",
@@ -67,10 +72,12 @@ describe.concurrent("server", () => {
67
72
  version: null,
68
73
  });
69
74
 
75
+ await assertValidSql(change.serialize());
76
+
70
77
  expect(change.serialize()).toBe("ALTER SERVER test_server VERSION ''");
71
78
  });
72
79
 
73
- test("set options ADD", () => {
80
+ test("set options ADD", async () => {
74
81
  const props: ServerProps = {
75
82
  name: "test_server",
76
83
  owner: "test",
@@ -90,12 +97,14 @@ describe.concurrent("server", () => {
90
97
  ],
91
98
  });
92
99
 
100
+ await assertValidSql(change.serialize());
101
+
93
102
  expect(change.serialize()).toBe(
94
103
  "ALTER SERVER test_server OPTIONS (ADD host 'localhost', ADD port '5432')",
95
104
  );
96
105
  });
97
106
 
98
- test("set options SET", () => {
107
+ test("set options SET", async () => {
99
108
  const props: ServerProps = {
100
109
  name: "test_server",
101
110
  owner: "test",
@@ -112,12 +121,14 @@ describe.concurrent("server", () => {
112
121
  options: [{ action: "SET", option: "host", value: "newhost" }],
113
122
  });
114
123
 
124
+ await assertValidSql(change.serialize());
125
+
115
126
  expect(change.serialize()).toBe(
116
127
  "ALTER SERVER test_server OPTIONS (SET host 'newhost')",
117
128
  );
118
129
  });
119
130
 
120
- test("set options DROP", () => {
131
+ test("set options DROP", async () => {
121
132
  const props: ServerProps = {
122
133
  name: "test_server",
123
134
  owner: "test",
@@ -134,12 +145,14 @@ describe.concurrent("server", () => {
134
145
  options: [{ action: "DROP", option: "host" }],
135
146
  });
136
147
 
148
+ await assertValidSql(change.serialize());
149
+
137
150
  expect(change.serialize()).toBe(
138
151
  "ALTER SERVER test_server OPTIONS (DROP host)",
139
152
  );
140
153
  });
141
154
 
142
- test("set options mixed ADD/SET/DROP", () => {
155
+ test("set options mixed ADD/SET/DROP", async () => {
143
156
  const props: ServerProps = {
144
157
  name: "test_server",
145
158
  owner: "test",
@@ -160,6 +173,8 @@ describe.concurrent("server", () => {
160
173
  ],
161
174
  });
162
175
 
176
+ await assertValidSql(change.serialize());
177
+
163
178
  expect(change.serialize()).toBe(
164
179
  "ALTER SERVER test_server OPTIONS (ADD new_option 'new_value', SET existing_option 'updated_value', DROP old_option)",
165
180
  );