@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,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 { Server } from "../server.model.ts";
3
4
  import { CreateServer } from "./server.create.ts";
4
5
 
5
6
  describe("server", () => {
6
- test("create basic", () => {
7
+ test("create basic", async () => {
7
8
  const server = new Server({
8
9
  name: "test_server",
9
10
  owner: "test",
@@ -19,12 +20,14 @@ describe("server", () => {
19
20
  server,
20
21
  });
21
22
 
23
+ await assertValidSql(change.serialize());
24
+
22
25
  expect(change.serialize()).toBe(
23
26
  "CREATE SERVER test_server FOREIGN DATA WRAPPER test_fdw",
24
27
  );
25
28
  });
26
29
 
27
- test("create with type", () => {
30
+ test("create with type", async () => {
28
31
  const server = new Server({
29
32
  name: "test_server",
30
33
  owner: "test",
@@ -40,12 +43,14 @@ describe("server", () => {
40
43
  server,
41
44
  });
42
45
 
46
+ await assertValidSql(change.serialize());
47
+
43
48
  expect(change.serialize()).toBe(
44
49
  "CREATE SERVER test_server TYPE 'postgres_fdw' FOREIGN DATA WRAPPER test_fdw",
45
50
  );
46
51
  });
47
52
 
48
- test("create with version", () => {
53
+ test("create with version", async () => {
49
54
  const server = new Server({
50
55
  name: "test_server",
51
56
  owner: "test",
@@ -61,12 +66,14 @@ describe("server", () => {
61
66
  server,
62
67
  });
63
68
 
69
+ await assertValidSql(change.serialize());
70
+
64
71
  expect(change.serialize()).toBe(
65
72
  "CREATE SERVER test_server VERSION '1.0' FOREIGN DATA WRAPPER test_fdw",
66
73
  );
67
74
  });
68
75
 
69
- test("create with type and version", () => {
76
+ test("create with type and version", async () => {
70
77
  const server = new Server({
71
78
  name: "test_server",
72
79
  owner: "test",
@@ -82,12 +89,14 @@ describe("server", () => {
82
89
  server,
83
90
  });
84
91
 
92
+ await assertValidSql(change.serialize());
93
+
85
94
  expect(change.serialize()).toBe(
86
95
  "CREATE SERVER test_server TYPE 'postgres_fdw' VERSION '1.0' FOREIGN DATA WRAPPER test_fdw",
87
96
  );
88
97
  });
89
98
 
90
- test("create with options", () => {
99
+ test("create with options", async () => {
91
100
  const server = new Server({
92
101
  name: "test_server",
93
102
  owner: "test",
@@ -103,12 +112,14 @@ describe("server", () => {
103
112
  server,
104
113
  });
105
114
 
115
+ await assertValidSql(change.serialize());
116
+
106
117
  expect(change.serialize()).toBe(
107
118
  "CREATE SERVER test_server FOREIGN DATA WRAPPER test_fdw OPTIONS (host 'localhost', port '5432')",
108
119
  );
109
120
  });
110
121
 
111
- test("create with all properties", () => {
122
+ test("create with all properties", async () => {
112
123
  const server = new Server({
113
124
  name: "test_server",
114
125
  owner: "test",
@@ -124,6 +135,8 @@ describe("server", () => {
124
135
  server,
125
136
  });
126
137
 
138
+ await assertValidSql(change.serialize());
139
+
127
140
  expect(change.serialize()).toBe(
128
141
  "CREATE SERVER test_server TYPE 'postgres_fdw' VERSION '1.0' FOREIGN DATA WRAPPER test_fdw OPTIONS (host 'localhost', port '5432')",
129
142
  );
@@ -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 { Server } from "../server.model.ts";
3
4
  import { DropServer } from "./server.drop.ts";
4
5
 
5
6
  describe("server", () => {
6
- test("drop", () => {
7
+ test("drop", async () => {
7
8
  const server = new Server({
8
9
  name: "test_server",
9
10
  owner: "test",
@@ -19,6 +20,8 @@ describe("server", () => {
19
20
  server,
20
21
  });
21
22
 
23
+ await assertValidSql(change.serialize());
24
+
22
25
  expect(change.serialize()).toBe("DROP SERVER test_server");
23
26
  });
24
27
  });
@@ -5,8 +5,17 @@ import {
5
5
  AlterServerSetOptions,
6
6
  AlterServerSetVersion,
7
7
  } from "./changes/server.alter.ts";
8
+ import {
9
+ CreateCommentOnServer,
10
+ DropCommentOnServer,
11
+ } from "./changes/server.comment.ts";
8
12
  import { CreateServer } from "./changes/server.create.ts";
9
13
  import { DropServer } from "./changes/server.drop.ts";
14
+ import {
15
+ GrantServerPrivileges,
16
+ RevokeGrantOptionServerPrivileges,
17
+ RevokeServerPrivileges,
18
+ } from "./changes/server.privilege.ts";
10
19
  import { diffServers } from "./server.diff.ts";
11
20
  import { Server, type ServerProps } from "./server.model.ts";
12
21
 
@@ -164,4 +173,90 @@ describe.concurrent("server.diff", () => {
164
173
  expect(changes.some((c) => c instanceof DropServer)).toBe(true);
165
174
  expect(changes.some((c) => c instanceof CreateServer)).toBe(true);
166
175
  });
176
+
177
+ test("created with privileges emits grant", () => {
178
+ const server = new Server({
179
+ name: "srv1",
180
+ owner: "o1",
181
+ foreign_data_wrapper: "fdw1",
182
+ type: null,
183
+ version: null,
184
+ options: null,
185
+ comment: null,
186
+ privileges: [
187
+ { grantee: "role_usage", privilege: "USAGE", grantable: false },
188
+ ],
189
+ });
190
+ const changes = diffServers(testContext, {}, { [server.stableId]: server });
191
+ expect(changes[0]).toBeInstanceOf(CreateServer);
192
+ expect(changes.some((c) => c instanceof GrantServerPrivileges)).toBe(true);
193
+ });
194
+
195
+ test("altered comment emits create/drop comment", () => {
196
+ const base: ServerProps = {
197
+ name: "srv1",
198
+ owner: "o1",
199
+ foreign_data_wrapper: "fdw1",
200
+ type: null,
201
+ version: null,
202
+ options: null,
203
+ comment: null,
204
+ privileges: [],
205
+ };
206
+ const main = new Server(base);
207
+ const withComment = new Server({ ...base, comment: "my server" });
208
+
209
+ const addComment = diffServers(
210
+ testContext,
211
+ { [main.stableId]: main },
212
+ { [withComment.stableId]: withComment },
213
+ );
214
+ expect(addComment[0]).toBeInstanceOf(CreateCommentOnServer);
215
+
216
+ const dropComment = diffServers(
217
+ testContext,
218
+ { [withComment.stableId]: withComment },
219
+ { [main.stableId]: main },
220
+ );
221
+ expect(dropComment[0]).toBeInstanceOf(DropCommentOnServer);
222
+ });
223
+
224
+ test("altered privileges emit grant, revoke, and revoke grant option", () => {
225
+ const base: ServerProps = {
226
+ name: "srv1",
227
+ owner: "o1",
228
+ foreign_data_wrapper: "fdw1",
229
+ type: null,
230
+ version: null,
231
+ options: null,
232
+ comment: null,
233
+ privileges: [],
234
+ };
235
+ const main = new Server({
236
+ ...base,
237
+ privileges: [
238
+ { grantee: "role_usage", privilege: "USAGE", grantable: false },
239
+ { grantee: "role_with_option", privilege: "USAGE", grantable: true },
240
+ { grantee: "role_removed", privilege: "USAGE", grantable: false },
241
+ ],
242
+ });
243
+ const branch = new Server({
244
+ ...base,
245
+ privileges: [
246
+ { grantee: "role_usage", privilege: "USAGE", grantable: true },
247
+ { grantee: "role_with_option", privilege: "USAGE", grantable: false },
248
+ { grantee: "role_new", privilege: "USAGE", grantable: false },
249
+ ],
250
+ });
251
+ const changes = diffServers(
252
+ testContext,
253
+ { [main.stableId]: main },
254
+ { [branch.stableId]: branch },
255
+ );
256
+ expect(changes.some((c) => c instanceof GrantServerPrivileges)).toBe(true);
257
+ expect(changes.some((c) => c instanceof RevokeServerPrivileges)).toBe(true);
258
+ expect(
259
+ changes.some((c) => c instanceof RevokeGrantOptionServerPrivileges),
260
+ ).toBe(true);
261
+ });
167
262
  });
@@ -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
  AlterServerChangeOwner,
11
10
  AlterServerSetOptions,
@@ -34,12 +33,7 @@ import type { Server } from "./server.model.ts";
34
33
  * @returns A list of changes to apply to main to make it match branch.
35
34
  */
36
35
  export function diffServers(
37
- ctx: {
38
- version: number;
39
- currentUser: string;
40
- defaultPrivilegeState: DefaultPrivilegeState;
41
- mainRoles: Record<string, Role>;
42
- },
36
+ ctx: Pick<ObjectDiffContext, "version" | "currentUser">,
43
37
  main: Record<string, Server>,
44
38
  branch: Record<string, Server>,
45
39
  ): ServerChange[] {
@@ -80,54 +74,22 @@ export function diffServers(
80
74
  effectiveDefaults,
81
75
  desiredPrivileges,
82
76
  createdServer.owner,
83
- ctx.mainRoles,
84
77
  );
85
78
 
86
- // Generate grant changes
87
- for (const [grantee, result] of privilegeResults) {
88
- if (result.grants.length > 0) {
89
- const grantGroups = groupPrivilegesByGrantable(result.grants);
90
- for (const [grantable, list] of grantGroups) {
91
- void grantable;
92
- changes.push(
93
- new GrantServerPrivileges({
94
- server: createdServer,
95
- grantee,
96
- privileges: list,
97
- version: ctx.version,
98
- }),
99
- );
100
- }
101
- }
102
-
103
- // Generate revoke changes
104
- if (result.revokes.length > 0) {
105
- const revokeGroups = groupPrivilegesByGrantable(result.revokes);
106
- for (const [grantable, list] of revokeGroups) {
107
- void grantable;
108
- changes.push(
109
- new RevokeServerPrivileges({
110
- server: createdServer,
111
- grantee,
112
- privileges: list,
113
- version: ctx.version,
114
- }),
115
- );
116
- }
117
- }
118
-
119
- // Generate revoke grant option changes
120
- if (result.revokeGrantOption.length > 0) {
121
- changes.push(
122
- new RevokeGrantOptionServerPrivileges({
123
- server: createdServer,
124
- grantee,
125
- privilegeNames: result.revokeGrantOption,
126
- version: ctx.version,
127
- }),
128
- );
129
- }
130
- }
79
+ changes.push(
80
+ ...(emitObjectPrivilegeChanges(
81
+ privilegeResults,
82
+ createdServer,
83
+ createdServer,
84
+ "server",
85
+ {
86
+ Grant: GrantServerPrivileges,
87
+ Revoke: RevokeServerPrivileges,
88
+ RevokeGrantOption: RevokeGrantOptionServerPrivileges,
89
+ },
90
+ ctx.version,
91
+ ) as ServerChange[]),
92
+ );
131
93
  }
132
94
 
133
95
  for (const serverId of dropped) {
@@ -204,54 +166,22 @@ export function diffServers(
204
166
  mainPrivilegesFiltered,
205
167
  branchPrivilegesFiltered,
206
168
  branchServer.owner,
207
- ctx.mainRoles,
208
169
  );
209
170
 
210
- for (const [grantee, result] of privilegeResults) {
211
- // Generate grant changes
212
- if (result.grants.length > 0) {
213
- const grantGroups = groupPrivilegesByGrantable(result.grants);
214
- for (const [grantable, list] of grantGroups) {
215
- void grantable;
216
- changes.push(
217
- new GrantServerPrivileges({
218
- server: branchServer,
219
- grantee,
220
- privileges: list,
221
- version: ctx.version,
222
- }),
223
- );
224
- }
225
- }
226
-
227
- // Generate revoke changes
228
- if (result.revokes.length > 0) {
229
- const revokeGroups = groupPrivilegesByGrantable(result.revokes);
230
- for (const [grantable, list] of revokeGroups) {
231
- void grantable;
232
- changes.push(
233
- new RevokeServerPrivileges({
234
- server: mainServer,
235
- grantee,
236
- privileges: list,
237
- version: ctx.version,
238
- }),
239
- );
240
- }
241
- }
242
-
243
- // Generate revoke grant option changes
244
- if (result.revokeGrantOption.length > 0) {
245
- changes.push(
246
- new RevokeGrantOptionServerPrivileges({
247
- server: mainServer,
248
- grantee,
249
- privilegeNames: result.revokeGrantOption,
250
- version: ctx.version,
251
- }),
252
- );
253
- }
254
- }
171
+ changes.push(
172
+ ...(emitObjectPrivilegeChanges(
173
+ privilegeResults,
174
+ branchServer,
175
+ mainServer,
176
+ "server",
177
+ {
178
+ Grant: GrantServerPrivileges,
179
+ Revoke: RevokeServerPrivileges,
180
+ RevokeGrantOption: RevokeGrantOptionServerPrivileges,
181
+ },
182
+ ctx.version,
183
+ ) as ServerChange[]),
184
+ );
255
185
 
256
186
  // Note: Server renaming would also use ALTER SERVER ... RENAME TO ...
257
187
  // But since our Server model uses 'name' as the identity field,
@@ -1,10 +1,11 @@
1
1
  import { describe, expect, test } from "bun:test";
2
+ import { assertValidSql } from "../../../../test-utils/assert-valid-sql.ts";
2
3
  import { UserMapping, type UserMappingProps } from "../user-mapping.model.ts";
3
4
  import { AlterUserMappingSetOptions } from "./user-mapping.alter.ts";
4
5
 
5
6
  describe.concurrent("user-mapping", () => {
6
7
  describe("alter", () => {
7
- test("set options ADD", () => {
8
+ test("set options ADD", async () => {
8
9
  const props: UserMappingProps = {
9
10
  user: "test_user",
10
11
  server: "test_server",
@@ -19,12 +20,14 @@ describe.concurrent("user-mapping", () => {
19
20
  ],
20
21
  });
21
22
 
23
+ await assertValidSql(change.serialize());
24
+
22
25
  expect(change.serialize()).toBe(
23
26
  "ALTER USER MAPPING FOR test_user SERVER test_server OPTIONS (ADD user 'remote_user', ADD password 'secret')",
24
27
  );
25
28
  });
26
29
 
27
- test("set options SET", () => {
30
+ test("set options SET", async () => {
28
31
  const props: UserMappingProps = {
29
32
  user: "test_user",
30
33
  server: "test_server",
@@ -36,12 +39,14 @@ describe.concurrent("user-mapping", () => {
36
39
  options: [{ action: "SET", option: "password", value: "new_secret" }],
37
40
  });
38
41
 
42
+ await assertValidSql(change.serialize());
43
+
39
44
  expect(change.serialize()).toBe(
40
45
  "ALTER USER MAPPING FOR test_user SERVER test_server OPTIONS (SET password 'new_secret')",
41
46
  );
42
47
  });
43
48
 
44
- test("set options DROP", () => {
49
+ test("set options DROP", async () => {
45
50
  const props: UserMappingProps = {
46
51
  user: "test_user",
47
52
  server: "test_server",
@@ -53,12 +58,14 @@ describe.concurrent("user-mapping", () => {
53
58
  options: [{ action: "DROP", option: "password" }],
54
59
  });
55
60
 
61
+ await assertValidSql(change.serialize());
62
+
56
63
  expect(change.serialize()).toBe(
57
64
  "ALTER USER MAPPING FOR test_user SERVER test_server OPTIONS (DROP password)",
58
65
  );
59
66
  });
60
67
 
61
- test("set options mixed ADD/SET/DROP", () => {
68
+ test("set options mixed ADD/SET/DROP", async () => {
62
69
  const props: UserMappingProps = {
63
70
  user: "PUBLIC",
64
71
  server: "test_server",
@@ -74,6 +81,8 @@ describe.concurrent("user-mapping", () => {
74
81
  ],
75
82
  });
76
83
 
84
+ await assertValidSql(change.serialize());
85
+
77
86
  expect(change.serialize()).toBe(
78
87
  "ALTER USER MAPPING FOR PUBLIC SERVER test_server OPTIONS (ADD new_option 'new_value', SET existing_option 'updated_value', DROP old_option)",
79
88
  );
@@ -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 { UserMapping } from "../user-mapping.model.ts";
3
4
  import { CreateUserMapping } from "./user-mapping.create.ts";
4
5
 
5
6
  describe("user-mapping", () => {
6
- test("create basic", () => {
7
+ test("create basic", async () => {
7
8
  const userMapping = new UserMapping({
8
9
  user: "test_user",
9
10
  server: "test_server",
@@ -14,12 +15,14 @@ describe("user-mapping", () => {
14
15
  userMapping,
15
16
  });
16
17
 
18
+ await assertValidSql(change.serialize());
19
+
17
20
  expect(change.serialize()).toBe(
18
21
  "CREATE USER MAPPING FOR test_user SERVER test_server",
19
22
  );
20
23
  });
21
24
 
22
- test("create with PUBLIC user", () => {
25
+ test("create with PUBLIC user", async () => {
23
26
  const userMapping = new UserMapping({
24
27
  user: "PUBLIC",
25
28
  server: "test_server",
@@ -30,12 +33,14 @@ describe("user-mapping", () => {
30
33
  userMapping,
31
34
  });
32
35
 
36
+ await assertValidSql(change.serialize());
37
+
33
38
  expect(change.serialize()).toBe(
34
39
  "CREATE USER MAPPING FOR PUBLIC SERVER test_server",
35
40
  );
36
41
  });
37
42
 
38
- test("create with CURRENT_USER", () => {
43
+ test("create with CURRENT_USER", async () => {
39
44
  const userMapping = new UserMapping({
40
45
  user: "CURRENT_USER",
41
46
  server: "test_server",
@@ -46,12 +51,14 @@ describe("user-mapping", () => {
46
51
  userMapping,
47
52
  });
48
53
 
54
+ await assertValidSql(change.serialize());
55
+
49
56
  expect(change.serialize()).toBe(
50
57
  "CREATE USER MAPPING FOR CURRENT_USER SERVER test_server",
51
58
  );
52
59
  });
53
60
 
54
- test("create with options", () => {
61
+ test("create with options", async () => {
55
62
  const userMapping = new UserMapping({
56
63
  user: "test_user",
57
64
  server: "test_server",
@@ -62,12 +69,14 @@ describe("user-mapping", () => {
62
69
  userMapping,
63
70
  });
64
71
 
72
+ await assertValidSql(change.serialize());
73
+
65
74
  expect(change.serialize()).toBe(
66
75
  "CREATE USER MAPPING FOR test_user SERVER test_server OPTIONS (user 'remote_user', password 'secret')",
67
76
  );
68
77
  });
69
78
 
70
- test("create with all properties", () => {
79
+ test("create with all properties", async () => {
71
80
  const userMapping = new UserMapping({
72
81
  user: "PUBLIC",
73
82
  server: "test_server",
@@ -78,6 +87,8 @@ describe("user-mapping", () => {
78
87
  userMapping,
79
88
  });
80
89
 
90
+ await assertValidSql(change.serialize());
91
+
81
92
  expect(change.serialize()).toBe(
82
93
  "CREATE USER MAPPING FOR PUBLIC SERVER test_server OPTIONS (user 'remote_user', password 'secret')",
83
94
  );
@@ -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 { UserMapping } from "../user-mapping.model.ts";
3
4
  import { DropUserMapping } from "./user-mapping.drop.ts";
4
5
 
5
6
  describe("user-mapping", () => {
6
- test("drop", () => {
7
+ test("drop", async () => {
7
8
  const userMapping = new UserMapping({
8
9
  user: "test_user",
9
10
  server: "test_server",
@@ -14,12 +15,14 @@ describe("user-mapping", () => {
14
15
  userMapping,
15
16
  });
16
17
 
18
+ await assertValidSql(change.serialize());
19
+
17
20
  expect(change.serialize()).toBe(
18
21
  "DROP USER MAPPING FOR test_user SERVER test_server",
19
22
  );
20
23
  });
21
24
 
22
- test("drop PUBLIC user mapping", () => {
25
+ test("drop PUBLIC user mapping", async () => {
23
26
  const userMapping = new UserMapping({
24
27
  user: "PUBLIC",
25
28
  server: "test_server",
@@ -30,12 +33,14 @@ describe("user-mapping", () => {
30
33
  userMapping,
31
34
  });
32
35
 
36
+ await assertValidSql(change.serialize());
37
+
33
38
  expect(change.serialize()).toBe(
34
39
  "DROP USER MAPPING FOR PUBLIC SERVER test_server",
35
40
  );
36
41
  });
37
42
 
38
- test("drop CURRENT_USER mapping", () => {
43
+ test("drop CURRENT_USER mapping", async () => {
39
44
  const userMapping = new UserMapping({
40
45
  user: "CURRENT_USER",
41
46
  server: "test_server",
@@ -46,6 +51,8 @@ describe("user-mapping", () => {
46
51
  userMapping,
47
52
  });
48
53
 
54
+ await assertValidSql(change.serialize());
55
+
49
56
  expect(change.serialize()).toBe(
50
57
  "DROP USER MAPPING FOR CURRENT_USER SERVER test_server",
51
58
  );
@@ -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 { Index, type IndexProps } from "../index.model.ts";
3
4
  import {
4
5
  AlterIndexSetStatistics,
@@ -8,7 +9,7 @@ import {
8
9
 
9
10
  describe.concurrent("index", () => {
10
11
  describe("alter", () => {
11
- test("set storage params", () => {
12
+ test("set storage params", async () => {
12
13
  const props: Omit<IndexProps, "storage_params"> = {
13
14
  schema: "public",
14
15
  table_name: "test_table",
@@ -50,12 +51,14 @@ describe.concurrent("index", () => {
50
51
  keysToReset: [],
51
52
  });
52
53
 
54
+ await assertValidSql(change.serialize());
55
+
53
56
  expect(change.serialize()).toBe(
54
57
  "ALTER INDEX public.test_index SET (fillfactor=90)",
55
58
  );
56
59
  });
57
60
 
58
- test("reset and set storage params", () => {
61
+ test("reset and set storage params", async () => {
59
62
  const props: Omit<IndexProps, "storage_params"> = {
60
63
  schema: "public",
61
64
  table_name: "test_table",
@@ -97,6 +100,8 @@ describe.concurrent("index", () => {
97
100
  keysToReset: ["fastupdate"],
98
101
  });
99
102
 
103
+ await assertValidSql(change.serialize());
104
+
100
105
  expect(change.serialize()).toBe(
101
106
  [
102
107
  "ALTER INDEX public.test_index RESET (fastupdate)",
@@ -105,7 +110,7 @@ describe.concurrent("index", () => {
105
110
  );
106
111
  });
107
112
 
108
- test("set statistics", () => {
113
+ test("set statistics", async () => {
109
114
  const props: Omit<IndexProps, "statistics_target"> = {
110
115
  schema: "public",
111
116
  table_name: "test_table",
@@ -146,12 +151,14 @@ describe.concurrent("index", () => {
146
151
  columnTargets: [{ columnNumber: 1, statistics: 100 }],
147
152
  });
148
153
 
154
+ await assertValidSql(change.serialize());
155
+
149
156
  expect(change.serialize()).toBe(
150
157
  "ALTER INDEX public.test_index ALTER COLUMN 1 SET STATISTICS 100",
151
158
  );
152
159
  });
153
160
 
154
- test("set tablespace", () => {
161
+ test("set tablespace", async () => {
155
162
  const props: Omit<IndexProps, "tablespace"> = {
156
163
  schema: "public",
157
164
  table_name: "test_table",
@@ -192,6 +199,8 @@ describe.concurrent("index", () => {
192
199
  tablespace: "fast_space",
193
200
  });
194
201
 
202
+ await assertValidSql(change.serialize());
203
+
195
204
  expect(change.serialize()).toBe(
196
205
  "ALTER INDEX public.test_index SET TABLESPACE fast_space",
197
206
  );