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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 { diffRlsPolicies } from "../rls-policy.diff.ts";
3
4
  import { RlsPolicy, type RlsPolicyProps } from "../rls-policy.model.ts";
4
5
  import {
@@ -11,7 +12,7 @@ import { DropRlsPolicy } from "./rls-policy.drop.ts";
11
12
 
12
13
  describe.concurrent("rls-policy", () => {
13
14
  describe("alter", () => {
14
- test("change roles", () => {
15
+ test("change roles", async () => {
15
16
  const props: Omit<RlsPolicyProps, "roles"> = {
16
17
  schema: "public",
17
18
  name: "test_policy",
@@ -33,12 +34,14 @@ describe.concurrent("rls-policy", () => {
33
34
  roles: ["role1", "role2"],
34
35
  });
35
36
 
37
+ await assertValidSql(change.serialize());
38
+
36
39
  expect(change.serialize()).toBe(
37
- "ALTER POLICY public.test_policy ON public.test_table TO role1, role2",
40
+ "ALTER POLICY test_policy ON public.test_table TO role1, role2",
38
41
  );
39
42
  });
40
43
 
41
- test("change roles to PUBLIC (default)", () => {
44
+ test("change roles to PUBLIC (default)", async () => {
42
45
  const props: Omit<RlsPolicyProps, "roles"> = {
43
46
  schema: "public",
44
47
  name: "test_policy",
@@ -60,12 +63,14 @@ describe.concurrent("rls-policy", () => {
60
63
  roles: ["public"],
61
64
  });
62
65
 
66
+ await assertValidSql(change.serialize());
67
+
63
68
  expect(change.serialize()).toBe(
64
- "ALTER POLICY public.test_policy ON public.test_table TO PUBLIC",
69
+ "ALTER POLICY test_policy ON public.test_table TO PUBLIC",
65
70
  );
66
71
  });
67
72
 
68
- test("drop + create rls policy when command changes", () => {
73
+ test("drop + create rls policy when command changes", async () => {
69
74
  const props: Omit<RlsPolicyProps, "command"> = {
70
75
  schema: "public",
71
76
  name: "test_policy",
@@ -94,15 +99,17 @@ describe.concurrent("rls-policy", () => {
94
99
  expect(changes).toHaveLength(2);
95
100
  expect(changes[0]).toBeInstanceOf(DropRlsPolicy);
96
101
  expect(changes[1]).toBeInstanceOf(CreateRlsPolicy);
102
+ await assertValidSql(changes[0].serialize());
97
103
  expect(changes[0].serialize()).toBe(
98
104
  "DROP POLICY test_policy ON public.test_table",
99
105
  );
106
+ await assertValidSql(changes[1].serialize());
100
107
  expect(changes[1].serialize()).toBe(
101
108
  "CREATE POLICY test_policy ON public.test_table FOR UPDATE USING (user_id = current_user_id())",
102
109
  );
103
110
  });
104
111
 
105
- test("drop + create rls policy when permissive changes", () => {
112
+ test("drop + create rls policy when permissive changes", async () => {
106
113
  const props: Omit<RlsPolicyProps, "permissive"> = {
107
114
  schema: "public",
108
115
  name: "test_policy",
@@ -131,15 +138,17 @@ describe.concurrent("rls-policy", () => {
131
138
  expect(changes).toHaveLength(2);
132
139
  expect(changes[0]).toBeInstanceOf(DropRlsPolicy);
133
140
  expect(changes[1]).toBeInstanceOf(CreateRlsPolicy);
141
+ await assertValidSql(changes[0].serialize());
134
142
  expect(changes[0].serialize()).toBe(
135
143
  "DROP POLICY test_policy ON public.test_table",
136
144
  );
145
+ await assertValidSql(changes[1].serialize());
137
146
  expect(changes[1].serialize()).toBe(
138
147
  "CREATE POLICY test_policy ON public.test_table AS RESTRICTIVE FOR SELECT USING (user_id = current_user_id())",
139
148
  );
140
149
  });
141
150
 
142
- test("alter using expression", () => {
151
+ test("alter using expression", async () => {
143
152
  const props: Omit<RlsPolicyProps, "using_expression"> = {
144
153
  schema: "public",
145
154
  name: "test_policy",
@@ -161,12 +170,14 @@ describe.concurrent("rls-policy", () => {
161
170
  usingExpression: "new_expr",
162
171
  });
163
172
 
173
+ await assertValidSql(change.serialize());
174
+
164
175
  expect(change.serialize()).toBe(
165
- "ALTER POLICY public.test_policy ON public.test_table USING (new_expr)",
176
+ "ALTER POLICY test_policy ON public.test_table USING (new_expr)",
166
177
  );
167
178
  });
168
179
 
169
- test("clear using expression -> USING (true)", () => {
180
+ test("clear using expression -> USING (true)", async () => {
170
181
  const props: Omit<RlsPolicyProps, "using_expression"> = {
171
182
  schema: "public",
172
183
  name: "test_policy",
@@ -188,12 +199,14 @@ describe.concurrent("rls-policy", () => {
188
199
  usingExpression: null,
189
200
  });
190
201
 
202
+ await assertValidSql(change.serialize());
203
+
191
204
  expect(change.serialize()).toBe(
192
- "ALTER POLICY public.test_policy ON public.test_table USING (true)",
205
+ "ALTER POLICY test_policy ON public.test_table USING (true)",
193
206
  );
194
207
  });
195
208
 
196
- test("alter with check expression", () => {
209
+ test("alter with check expression", async () => {
197
210
  const props: Omit<RlsPolicyProps, "with_check_expression"> = {
198
211
  schema: "public",
199
212
  name: "test_policy",
@@ -215,12 +228,14 @@ describe.concurrent("rls-policy", () => {
215
228
  withCheckExpression: "new_check",
216
229
  });
217
230
 
231
+ await assertValidSql(change.serialize());
232
+
218
233
  expect(change.serialize()).toBe(
219
- "ALTER POLICY public.test_policy ON public.test_table WITH CHECK (new_check)",
234
+ "ALTER POLICY test_policy ON public.test_table WITH CHECK (new_check)",
220
235
  );
221
236
  });
222
237
 
223
- test("clear with check expression -> WITH CHECK (true)", () => {
238
+ test("clear with check expression -> WITH CHECK (true)", async () => {
224
239
  const props: Omit<RlsPolicyProps, "with_check_expression"> = {
225
240
  schema: "public",
226
241
  name: "test_policy",
@@ -242,8 +257,10 @@ describe.concurrent("rls-policy", () => {
242
257
  withCheckExpression: null,
243
258
  });
244
259
 
260
+ await assertValidSql(change.serialize());
261
+
245
262
  expect(change.serialize()).toBe(
246
- "ALTER POLICY public.test_policy ON public.test_table WITH CHECK (true)",
263
+ "ALTER POLICY test_policy ON public.test_table WITH CHECK (true)",
247
264
  );
248
265
  });
249
266
  });
@@ -47,7 +47,7 @@ export class AlterRlsPolicySetRoles extends AlterRlsPolicyChange {
47
47
 
48
48
  return [
49
49
  "ALTER POLICY",
50
- `${this.policy.schema}.${this.policy.name}`,
50
+ this.policy.name,
51
51
  "ON",
52
52
  `${this.policy.schema}.${this.policy.table_name}`,
53
53
  "TO",
@@ -78,7 +78,7 @@ export class AlterRlsPolicySetUsingExpression extends AlterRlsPolicyChange {
78
78
  const expr = this.usingExpression ?? "true";
79
79
  return [
80
80
  "ALTER POLICY",
81
- `${this.policy.schema}.${this.policy.name}`,
81
+ this.policy.name,
82
82
  "ON",
83
83
  `${this.policy.schema}.${this.policy.table_name}`,
84
84
  "USING",
@@ -112,7 +112,7 @@ export class AlterRlsPolicySetWithCheckExpression extends AlterRlsPolicyChange {
112
112
  const expr = this.withCheckExpression ?? "true";
113
113
  return [
114
114
  "ALTER POLICY",
115
- `${this.policy.schema}.${this.policy.name}`,
115
+ this.policy.name,
116
116
  "ON",
117
117
  `${this.policy.schema}.${this.policy.table_name}`,
118
118
  "WITH CHECK",
@@ -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 { RlsPolicy } from "../rls-policy.model.ts";
3
4
  import { CreateRlsPolicy } from "./rls-policy.create.ts";
4
5
 
5
6
  describe("rls-policy", () => {
6
- test("create minimal", () => {
7
+ test("create minimal", async () => {
7
8
  const policy = new RlsPolicy({
8
9
  schema: "public",
9
10
  name: "test_policy_min",
@@ -21,12 +22,14 @@ describe("rls-policy", () => {
21
22
  policy,
22
23
  });
23
24
 
25
+ await assertValidSql(change.serialize());
26
+
24
27
  expect(change.serialize()).toBe(
25
28
  "CREATE POLICY test_policy_min ON public.test_table",
26
29
  );
27
30
  });
28
31
 
29
- test("create", () => {
32
+ test("create", async () => {
30
33
  const policy = new RlsPolicy({
31
34
  schema: "public",
32
35
  name: "test_policy",
@@ -44,12 +47,14 @@ describe("rls-policy", () => {
44
47
  policy,
45
48
  });
46
49
 
50
+ await assertValidSql(change.serialize());
51
+
47
52
  expect(change.serialize()).toBe(
48
53
  "CREATE POLICY test_policy ON public.test_table FOR SELECT USING (user_id = current_user_id())",
49
54
  );
50
55
  });
51
56
 
52
- test("create with all options", () => {
57
+ test("create with all options", async () => {
53
58
  const policy = new RlsPolicy({
54
59
  schema: "public",
55
60
  name: "test_policy_all",
@@ -67,6 +72,8 @@ describe("rls-policy", () => {
67
72
  policy,
68
73
  });
69
74
 
75
+ await assertValidSql(change.serialize());
76
+
70
77
  expect(change.serialize()).toBe(
71
78
  "CREATE POLICY test_policy_all ON public.test_table AS RESTRICTIVE FOR UPDATE TO role1, role2 USING (expr1) WITH CHECK (expr2)",
72
79
  );
@@ -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 { RlsPolicy } from "../rls-policy.model.ts";
3
4
  import { DropRlsPolicy } from "./rls-policy.drop.ts";
4
5
 
5
6
  describe("rls-policy", () => {
6
- test("drop", () => {
7
+ test("drop", async () => {
7
8
  const policy = new RlsPolicy({
8
9
  schema: "public",
9
10
  name: "test_policy",
@@ -21,6 +22,8 @@ describe("rls-policy", () => {
21
22
  policy,
22
23
  });
23
24
 
25
+ await assertValidSql(change.serialize());
26
+
24
27
  expect(change.serialize()).toBe(
25
28
  "DROP POLICY test_policy ON public.test_table",
26
29
  );
@@ -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 { Role, type RoleProps } from "../role.model.ts";
3
4
  import { AlterRoleSetOptions } from "./role.alter.ts";
4
5
 
5
6
  describe.concurrent("role", () => {
6
7
  describe("alter", () => {
7
- test("alter SUPERUSER", () => {
8
+ test("alter SUPERUSER", async () => {
8
9
  const role = new Role({
9
10
  name: "r",
10
11
  is_superuser: false,
@@ -21,10 +22,11 @@ describe.concurrent("role", () => {
21
22
  default_privileges: [],
22
23
  });
23
24
  const change = new AlterRoleSetOptions({ role, options: ["SUPERUSER"] });
25
+ await assertValidSql(change.serialize());
24
26
  expect(change.serialize()).toBe("ALTER ROLE r WITH SUPERUSER");
25
27
  });
26
28
 
27
- test("alter NOSUPERUSER", () => {
29
+ test("alter NOSUPERUSER", async () => {
28
30
  const role = new Role({
29
31
  name: "r",
30
32
  is_superuser: true,
@@ -44,10 +46,11 @@ describe.concurrent("role", () => {
44
46
  role,
45
47
  options: ["NOSUPERUSER"],
46
48
  });
49
+ await assertValidSql(change.serialize());
47
50
  expect(change.serialize()).toBe("ALTER ROLE r WITH NOSUPERUSER");
48
51
  });
49
52
 
50
- test("alter NOCREATEDB", () => {
53
+ test("alter NOCREATEDB", async () => {
51
54
  const role = new Role({
52
55
  name: "r",
53
56
  is_superuser: false,
@@ -64,10 +67,11 @@ describe.concurrent("role", () => {
64
67
  default_privileges: [],
65
68
  });
66
69
  const change = new AlterRoleSetOptions({ role, options: ["NOCREATEDB"] });
70
+ await assertValidSql(change.serialize());
67
71
  expect(change.serialize()).toBe("ALTER ROLE r WITH NOCREATEDB");
68
72
  });
69
73
 
70
- test("alter NOCREATEROLE", () => {
74
+ test("alter NOCREATEROLE", async () => {
71
75
  const role = new Role({
72
76
  name: "r",
73
77
  is_superuser: false,
@@ -87,10 +91,11 @@ describe.concurrent("role", () => {
87
91
  role,
88
92
  options: ["NOCREATEROLE"],
89
93
  });
94
+ await assertValidSql(change.serialize());
90
95
  expect(change.serialize()).toBe("ALTER ROLE r WITH NOCREATEROLE");
91
96
  });
92
97
 
93
- test("alter INHERIT", () => {
98
+ test("alter INHERIT", async () => {
94
99
  const role = new Role({
95
100
  name: "r",
96
101
  is_superuser: false,
@@ -107,10 +112,11 @@ describe.concurrent("role", () => {
107
112
  default_privileges: [],
108
113
  });
109
114
  const change = new AlterRoleSetOptions({ role, options: ["INHERIT"] });
115
+ await assertValidSql(change.serialize());
110
116
  expect(change.serialize()).toBe("ALTER ROLE r WITH INHERIT");
111
117
  });
112
118
 
113
- test("alter LOGIN", () => {
119
+ test("alter LOGIN", async () => {
114
120
  const role = new Role({
115
121
  name: "r",
116
122
  is_superuser: false,
@@ -127,10 +133,11 @@ describe.concurrent("role", () => {
127
133
  default_privileges: [],
128
134
  });
129
135
  const change = new AlterRoleSetOptions({ role, options: ["LOGIN"] });
136
+ await assertValidSql(change.serialize());
130
137
  expect(change.serialize()).toBe("ALTER ROLE r WITH LOGIN");
131
138
  });
132
139
 
133
- test("alter NOREPLICATION", () => {
140
+ test("alter NOREPLICATION", async () => {
134
141
  const role = new Role({
135
142
  name: "r",
136
143
  is_superuser: false,
@@ -150,10 +157,11 @@ describe.concurrent("role", () => {
150
157
  role,
151
158
  options: ["NOREPLICATION"],
152
159
  });
160
+ await assertValidSql(change.serialize());
153
161
  expect(change.serialize()).toBe("ALTER ROLE r WITH NOREPLICATION");
154
162
  });
155
163
 
156
- test("alter NOBYPASSRLS", () => {
164
+ test("alter NOBYPASSRLS", async () => {
157
165
  const role = new Role({
158
166
  name: "r",
159
167
  is_superuser: false,
@@ -173,10 +181,11 @@ describe.concurrent("role", () => {
173
181
  role,
174
182
  options: ["NOBYPASSRLS"],
175
183
  });
184
+ await assertValidSql(change.serialize());
176
185
  expect(change.serialize()).toBe("ALTER ROLE r WITH NOBYPASSRLS");
177
186
  });
178
187
 
179
- test("alter CREATEROLE", () => {
188
+ test("alter CREATEROLE", async () => {
180
189
  const role = new Role({
181
190
  name: "r",
182
191
  is_superuser: false,
@@ -193,10 +202,11 @@ describe.concurrent("role", () => {
193
202
  default_privileges: [],
194
203
  });
195
204
  const change = new AlterRoleSetOptions({ role, options: ["CREATEROLE"] });
205
+ await assertValidSql(change.serialize());
196
206
  expect(change.serialize()).toBe("ALTER ROLE r WITH CREATEROLE");
197
207
  });
198
208
 
199
- test("alter NOINHERIT", () => {
209
+ test("alter NOINHERIT", async () => {
200
210
  const role = new Role({
201
211
  name: "r",
202
212
  is_superuser: false,
@@ -213,10 +223,11 @@ describe.concurrent("role", () => {
213
223
  default_privileges: [],
214
224
  });
215
225
  const change = new AlterRoleSetOptions({ role, options: ["NOINHERIT"] });
226
+ await assertValidSql(change.serialize());
216
227
  expect(change.serialize()).toBe("ALTER ROLE r WITH NOINHERIT");
217
228
  });
218
229
 
219
- test("alter NOLOGIN", () => {
230
+ test("alter NOLOGIN", async () => {
220
231
  const role = new Role({
221
232
  name: "r",
222
233
  is_superuser: false,
@@ -233,10 +244,11 @@ describe.concurrent("role", () => {
233
244
  default_privileges: [],
234
245
  });
235
246
  const change = new AlterRoleSetOptions({ role, options: ["NOLOGIN"] });
247
+ await assertValidSql(change.serialize());
236
248
  expect(change.serialize()).toBe("ALTER ROLE r WITH NOLOGIN");
237
249
  });
238
250
 
239
- test("alter REPLICATION", () => {
251
+ test("alter REPLICATION", async () => {
240
252
  const role = new Role({
241
253
  name: "r",
242
254
  is_superuser: false,
@@ -256,10 +268,11 @@ describe.concurrent("role", () => {
256
268
  role,
257
269
  options: ["REPLICATION"],
258
270
  });
271
+ await assertValidSql(change.serialize());
259
272
  expect(change.serialize()).toBe("ALTER ROLE r WITH REPLICATION");
260
273
  });
261
274
 
262
- test("alter BYPASSRLS", () => {
275
+ test("alter BYPASSRLS", async () => {
263
276
  const role = new Role({
264
277
  name: "r",
265
278
  is_superuser: false,
@@ -276,10 +289,11 @@ describe.concurrent("role", () => {
276
289
  default_privileges: [],
277
290
  });
278
291
  const change = new AlterRoleSetOptions({ role, options: ["BYPASSRLS"] });
292
+ await assertValidSql(change.serialize());
279
293
  expect(change.serialize()).toBe("ALTER ROLE r WITH BYPASSRLS");
280
294
  });
281
295
 
282
- test("alter multiple options ordering", () => {
296
+ test("alter multiple options ordering", async () => {
283
297
  const role = new Role({
284
298
  name: "r",
285
299
  is_superuser: false,
@@ -308,11 +322,12 @@ describe.concurrent("role", () => {
308
322
  "CONNECTION LIMIT 10",
309
323
  ],
310
324
  });
325
+ await assertValidSql(change.serialize());
311
326
  expect(change.serialize()).toBe(
312
327
  "ALTER ROLE r WITH SUPERUSER CREATEDB CREATEROLE NOINHERIT LOGIN REPLICATION BYPASSRLS CONNECTION LIMIT 10",
313
328
  );
314
329
  });
315
- test("alter flags and connection limit", () => {
330
+ test("alter flags and connection limit", async () => {
316
331
  const props: Omit<
317
332
  RoleProps,
318
333
  "can_create_databases" | "connection_limit"
@@ -338,6 +353,7 @@ describe.concurrent("role", () => {
338
353
  role,
339
354
  options: ["CREATEDB", "CONNECTION LIMIT 3"],
340
355
  });
356
+ await assertValidSql(change.serialize());
341
357
  expect(change.serialize()).toBe(
342
358
  "ALTER ROLE r WITH CREATEDB CONNECTION LIMIT 3",
343
359
  );
@@ -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 { Role } from "../role.model.ts";
3
4
  import { CreateRole } from "./role.create.ts";
4
5
 
5
6
  describe("role", () => {
6
- test("create minimal (omit defaults)", () => {
7
+ test("create minimal (omit defaults)", async () => {
7
8
  const role = new Role({
8
9
  name: "test_role",
9
10
  is_superuser: false,
@@ -24,10 +25,12 @@ describe("role", () => {
24
25
  role,
25
26
  });
26
27
 
28
+ await assertValidSql(change.serialize());
29
+
27
30
  expect(change.serialize()).toBe("CREATE ROLE test_role WITH LOGIN");
28
31
  });
29
32
 
30
- test("create with all options (non-defaults only)", () => {
33
+ test("create with all options (non-defaults only)", async () => {
31
34
  const role = new Role({
32
35
  name: "r_all",
33
36
  is_superuser: true,
@@ -45,6 +48,7 @@ describe("role", () => {
45
48
  });
46
49
 
47
50
  const change = new CreateRole({ role });
51
+ await assertValidSql(change.serialize());
48
52
  expect(change.serialize()).toBe(
49
53
  "CREATE ROLE r_all WITH SUPERUSER CREATEDB CREATEROLE NOINHERIT LOGIN REPLICATION BYPASSRLS CONNECTION LIMIT 5",
50
54
  );
@@ -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 { Role } from "../role.model.ts";
3
4
  import { DropRole } from "./role.drop.ts";
4
5
 
5
6
  describe("role", () => {
6
- test("drop", () => {
7
+ test("drop", async () => {
7
8
  const role = new Role({
8
9
  name: "test_role",
9
10
  is_superuser: false,
@@ -24,6 +25,8 @@ describe("role", () => {
24
25
  role,
25
26
  });
26
27
 
28
+ await assertValidSql(change.serialize());
29
+
27
30
  expect(change.serialize()).toBe("DROP ROLE test_role");
28
31
  });
29
32
  });