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

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 (664) hide show
  1. package/README.md +41 -2
  2. package/dist/cli/app.js +26 -3
  3. package/dist/cli/bin/cli.js +5 -0
  4. package/dist/cli/commands/catalog-export.d.ts +5 -0
  5. package/dist/cli/commands/catalog-export.js +64 -0
  6. package/dist/cli/commands/declarative-apply.d.ts +6 -0
  7. package/dist/cli/commands/declarative-apply.js +288 -0
  8. package/dist/cli/commands/declarative-export.d.ts +5 -0
  9. package/dist/cli/commands/declarative-export.js +245 -0
  10. package/dist/cli/commands/plan.js +40 -6
  11. package/dist/cli/exit-code.d.ts +2 -0
  12. package/dist/cli/exit-code.js +7 -0
  13. package/dist/cli/formatters/tree/tree.js +3 -2
  14. package/dist/cli/utils/apply-display.d.ts +52 -0
  15. package/dist/cli/utils/apply-display.js +183 -0
  16. package/dist/cli/utils/export-display.d.ts +43 -0
  17. package/dist/cli/utils/export-display.js +202 -0
  18. package/dist/cli/utils/resolve-input.d.ts +7 -0
  19. package/dist/cli/utils/resolve-input.js +13 -0
  20. package/dist/cli/utils.d.ts +2 -0
  21. package/dist/cli/utils.js +1 -1
  22. package/dist/core/catalog-export/index.d.ts +11 -0
  23. package/dist/core/catalog-export/index.js +10 -0
  24. package/dist/core/catalog.diff.d.ts +1 -0
  25. package/dist/core/catalog.diff.js +64 -48
  26. package/dist/core/catalog.model.d.ts +16 -3
  27. package/dist/core/catalog.model.js +132 -30
  28. package/dist/core/catalog.snapshot.d.ts +66 -0
  29. package/dist/core/catalog.snapshot.js +206 -0
  30. package/dist/core/context.d.ts +3 -3
  31. package/dist/core/context.js +7 -10
  32. package/dist/core/declarative-apply/discover-sql.d.ts +18 -0
  33. package/dist/core/declarative-apply/discover-sql.js +86 -0
  34. package/dist/core/declarative-apply/extract-catalog-providers.d.ts +23 -0
  35. package/dist/core/declarative-apply/extract-catalog-providers.js +159 -0
  36. package/dist/core/declarative-apply/index.d.ts +49 -0
  37. package/dist/core/declarative-apply/index.js +134 -0
  38. package/dist/core/declarative-apply/round-apply.d.ts +100 -0
  39. package/dist/core/declarative-apply/round-apply.js +378 -0
  40. package/dist/core/depend.d.ts +2 -2
  41. package/dist/core/depend.js +8 -7
  42. package/dist/core/export/file-mapper.d.ts +71 -0
  43. package/dist/core/export/file-mapper.js +474 -0
  44. package/dist/core/export/grouper.d.ts +13 -0
  45. package/dist/core/export/grouper.js +76 -0
  46. package/dist/core/export/index.d.ts +45 -0
  47. package/dist/core/export/index.js +63 -0
  48. package/dist/core/export/types.d.ts +84 -0
  49. package/dist/core/export/types.js +25 -0
  50. package/dist/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
  51. package/dist/core/integrations/filter/dsl.d.ts +38 -1
  52. package/dist/core/integrations/filter/dsl.js +20 -2
  53. package/dist/core/integrations/filter/extractors.js +42 -0
  54. package/dist/core/integrations/integration-dsl.d.ts +10 -0
  55. package/dist/core/integrations/supabase.d.ts +8 -0
  56. package/dist/core/integrations/supabase.js +11 -0
  57. package/dist/core/objects/aggregate/aggregate.diff.d.ts +2 -8
  58. package/dist/core/objects/aggregate/aggregate.diff.js +16 -70
  59. package/dist/core/objects/aggregate/aggregate.model.d.ts +10 -10
  60. package/dist/core/objects/aggregate/aggregate.model.js +8 -10
  61. package/dist/core/objects/aggregate/changes/aggregate.create.js +1 -1
  62. package/dist/core/objects/aggregate/changes/aggregate.drop.js +1 -1
  63. package/dist/core/objects/base.privilege-diff.d.ts +38 -13
  64. package/dist/core/objects/base.privilege-diff.js +104 -22
  65. package/dist/core/objects/base.privilege.d.ts +1 -0
  66. package/dist/core/objects/base.privilege.js +9 -2
  67. package/dist/core/objects/collation/collation.diff.d.ts +2 -3
  68. package/dist/core/objects/collation/collation.model.d.ts +2 -2
  69. package/dist/core/objects/collation/collation.model.js +29 -28
  70. package/dist/core/objects/diff-context.d.ts +15 -0
  71. package/dist/core/objects/diff-context.js +1 -0
  72. package/dist/core/objects/domain/changes/domain.create.js +4 -2
  73. package/dist/core/objects/domain/domain.diff.d.ts +2 -8
  74. package/dist/core/objects/domain/domain.diff.js +16 -77
  75. package/dist/core/objects/domain/domain.model.d.ts +2 -2
  76. package/dist/core/objects/domain/domain.model.js +9 -11
  77. package/dist/core/objects/event-trigger/event-trigger.diff.d.ts +2 -3
  78. package/dist/core/objects/event-trigger/event-trigger.model.d.ts +2 -2
  79. package/dist/core/objects/event-trigger/event-trigger.model.js +7 -9
  80. package/dist/core/objects/extension/extension.model.d.ts +2 -2
  81. package/dist/core/objects/extension/extension.model.js +8 -10
  82. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.d.ts +2 -8
  83. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.js +13 -77
  84. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.d.ts +2 -2
  85. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.js +22 -24
  86. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.d.ts +2 -8
  87. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.js +16 -77
  88. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.d.ts +2 -2
  89. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.js +21 -23
  90. package/dist/core/objects/foreign-data-wrapper/server/server.diff.d.ts +2 -8
  91. package/dist/core/objects/foreign-data-wrapper/server/server.diff.js +13 -77
  92. package/dist/core/objects/foreign-data-wrapper/server/server.model.d.ts +2 -2
  93. package/dist/core/objects/foreign-data-wrapper/server/server.model.js +20 -22
  94. package/dist/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.d.ts +2 -2
  95. package/dist/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.js +20 -22
  96. package/dist/core/objects/index/index.model.d.ts +4 -4
  97. package/dist/core/objects/index/index.model.js +9 -11
  98. package/dist/core/objects/language/language.diff.d.ts +2 -5
  99. package/dist/core/objects/language/language.diff.js +7 -39
  100. package/dist/core/objects/language/language.model.js +5 -7
  101. package/dist/core/objects/materialized-view/materialized-view.diff.d.ts +2 -8
  102. package/dist/core/objects/materialized-view/materialized-view.diff.js +16 -158
  103. package/dist/core/objects/materialized-view/materialized-view.model.d.ts +5 -5
  104. package/dist/core/objects/materialized-view/materialized-view.model.js +9 -11
  105. package/dist/core/objects/procedure/changes/procedure.alter.js +12 -12
  106. package/dist/core/objects/procedure/procedure.diff.d.ts +2 -8
  107. package/dist/core/objects/procedure/procedure.diff.js +16 -77
  108. package/dist/core/objects/procedure/procedure.model.d.ts +11 -11
  109. package/dist/core/objects/procedure/procedure.model.js +9 -11
  110. package/dist/core/objects/publication/changes/publication.alter.d.ts +0 -9
  111. package/dist/core/objects/publication/changes/publication.alter.js +0 -14
  112. package/dist/core/objects/publication/changes/publication.types.d.ts +2 -2
  113. package/dist/core/objects/publication/publication.diff.d.ts +2 -3
  114. package/dist/core/objects/publication/publication.diff.js +8 -13
  115. package/dist/core/objects/publication/publication.model.d.ts +2 -2
  116. package/dist/core/objects/publication/publication.model.js +7 -9
  117. package/dist/core/objects/rls-policy/changes/rls-policy.alter.js +3 -3
  118. package/dist/core/objects/rls-policy/rls-policy.model.d.ts +4 -4
  119. package/dist/core/objects/rls-policy/rls-policy.model.js +8 -10
  120. package/dist/core/objects/role/role.diff.js +22 -1
  121. package/dist/core/objects/role/role.model.d.ts +6 -5
  122. package/dist/core/objects/role/role.model.js +146 -40
  123. package/dist/core/objects/rule/rule.model.d.ts +3 -3
  124. package/dist/core/objects/rule/rule.model.js +7 -9
  125. package/dist/core/objects/schema/schema.diff.d.ts +2 -8
  126. package/dist/core/objects/schema/schema.diff.js +16 -77
  127. package/dist/core/objects/schema/schema.model.d.ts +2 -2
  128. package/dist/core/objects/schema/schema.model.js +9 -11
  129. package/dist/core/objects/sequence/sequence.diff.d.ts +2 -8
  130. package/dist/core/objects/sequence/sequence.diff.js +16 -79
  131. package/dist/core/objects/sequence/sequence.model.d.ts +2 -2
  132. package/dist/core/objects/sequence/sequence.model.js +9 -11
  133. package/dist/core/objects/subscription/subscription.diff.d.ts +2 -3
  134. package/dist/core/objects/subscription/subscription.model.d.ts +2 -2
  135. package/dist/core/objects/subscription/subscription.model.js +25 -20
  136. package/dist/core/objects/table/changes/table.create.js +3 -0
  137. package/dist/core/objects/table/table.diff.d.ts +2 -8
  138. package/dist/core/objects/table/table.diff.js +26 -157
  139. package/dist/core/objects/table/table.model.d.ts +27 -24
  140. package/dist/core/objects/table/table.model.js +12 -11
  141. package/dist/core/objects/trigger/changes/trigger.alter.js +23 -0
  142. package/dist/core/objects/trigger/changes/trigger.create.js +4 -5
  143. package/dist/core/objects/trigger/trigger.model.d.ts +11 -2
  144. package/dist/core/objects/trigger/trigger.model.js +22 -10
  145. package/dist/core/objects/type/composite-type/composite-type.diff.d.ts +2 -8
  146. package/dist/core/objects/type/composite-type/composite-type.diff.js +16 -77
  147. package/dist/core/objects/type/composite-type/composite-type.model.d.ts +5 -5
  148. package/dist/core/objects/type/composite-type/composite-type.model.js +10 -11
  149. package/dist/core/objects/type/enum/enum.diff.d.ts +2 -8
  150. package/dist/core/objects/type/enum/enum.diff.js +25 -112
  151. package/dist/core/objects/type/enum/enum.model.d.ts +2 -2
  152. package/dist/core/objects/type/enum/enum.model.js +23 -25
  153. package/dist/core/objects/type/range/changes/range.create.js +6 -3
  154. package/dist/core/objects/type/range/range.diff.d.ts +2 -8
  155. package/dist/core/objects/type/range/range.diff.js +16 -77
  156. package/dist/core/objects/type/range/range.model.d.ts +2 -2
  157. package/dist/core/objects/type/range/range.model.js +8 -10
  158. package/dist/core/objects/view/view.diff.d.ts +2 -8
  159. package/dist/core/objects/view/view.diff.js +16 -158
  160. package/dist/core/objects/view/view.model.d.ts +20 -6
  161. package/dist/core/objects/view/view.model.js +11 -23
  162. package/dist/core/plan/apply.d.ts +2 -2
  163. package/dist/core/plan/apply.js +33 -16
  164. package/dist/core/plan/create.d.ts +20 -7
  165. package/dist/core/plan/create.js +153 -112
  166. package/dist/core/plan/serialize.js +16 -4
  167. package/dist/core/plan/sql-format/constants.d.ts +2 -0
  168. package/dist/core/plan/sql-format/constants.js +11 -0
  169. package/dist/core/plan/sql-format/fixtures.d.ts +2 -0
  170. package/dist/core/plan/sql-format/fixtures.js +2447 -0
  171. package/dist/core/plan/sql-format/format-utils.d.ts +37 -0
  172. package/dist/core/plan/sql-format/format-utils.js +274 -0
  173. package/dist/core/plan/sql-format/formatters.d.ts +20 -0
  174. package/dist/core/plan/sql-format/formatters.js +737 -0
  175. package/dist/core/plan/sql-format/index.d.ts +2 -0
  176. package/dist/core/plan/sql-format/index.js +98 -0
  177. package/dist/core/plan/sql-format/keyword-case.d.ts +2 -0
  178. package/dist/core/plan/sql-format/keyword-case.js +893 -0
  179. package/dist/core/plan/sql-format/protect.d.ts +3 -0
  180. package/dist/core/plan/sql-format/protect.js +269 -0
  181. package/dist/core/plan/sql-format/sql-scanner.d.ts +59 -0
  182. package/dist/core/plan/sql-format/sql-scanner.js +202 -0
  183. package/dist/core/plan/sql-format/tokenizer.d.ts +22 -0
  184. package/dist/core/plan/sql-format/tokenizer.js +118 -0
  185. package/dist/core/plan/sql-format/types.d.ts +28 -0
  186. package/dist/core/plan/sql-format/types.js +1 -0
  187. package/dist/core/plan/sql-format/wrap.d.ts +2 -0
  188. package/dist/core/plan/sql-format/wrap.js +165 -0
  189. package/dist/core/plan/sql-format.d.ts +2 -0
  190. package/dist/core/plan/sql-format.js +1 -0
  191. package/dist/core/plan/ssl-config.d.ts +32 -0
  192. package/dist/core/plan/ssl-config.js +115 -0
  193. package/dist/core/plan/statements.d.ts +2 -1
  194. package/dist/core/plan/statements.js +6 -2
  195. package/dist/core/plan/types.d.ts +6 -0
  196. package/dist/core/postgres-config.d.ts +47 -3
  197. package/dist/core/postgres-config.js +225 -39
  198. package/dist/core/sort/graph-builder.js +10 -0
  199. package/dist/core/sort/logical-sort.js +31 -23
  200. package/dist/core/test-utils/assert-valid-sql.d.ts +10 -0
  201. package/dist/core/test-utils/assert-valid-sql.js +19 -0
  202. package/dist/index.d.ts +9 -0
  203. package/dist/index.js +9 -1
  204. package/package.json +56 -22
  205. package/src/cli/app.ts +52 -0
  206. package/src/cli/bin/cli.ts +15 -0
  207. package/src/cli/commands/apply.ts +101 -0
  208. package/src/cli/commands/catalog-export.ts +78 -0
  209. package/src/cli/commands/declarative-apply.diagnostics.test.ts +77 -0
  210. package/src/cli/commands/declarative-apply.ts +380 -0
  211. package/src/cli/commands/declarative-export.ts +330 -0
  212. package/src/cli/commands/plan.ts +216 -0
  213. package/src/cli/commands/sync.ts +185 -0
  214. package/src/cli/exit-code.test.ts +19 -0
  215. package/src/cli/exit-code.ts +7 -0
  216. package/src/cli/formatters/index.ts +5 -0
  217. package/src/cli/formatters/tree/tree-builder.ts +380 -0
  218. package/src/cli/formatters/tree/tree-renderer.ts +372 -0
  219. package/src/cli/formatters/tree/tree.ts +238 -0
  220. package/src/cli/utils/apply-display.test.ts +348 -0
  221. package/src/cli/utils/apply-display.ts +238 -0
  222. package/src/cli/utils/export-display.test.ts +103 -0
  223. package/src/cli/utils/export-display.ts +275 -0
  224. package/src/cli/utils/integrations.test.ts +44 -0
  225. package/src/cli/utils/integrations.ts +42 -0
  226. package/src/cli/utils/resolve-input.test.ts +38 -0
  227. package/src/cli/utils/resolve-input.ts +17 -0
  228. package/src/cli/utils.ts +231 -0
  229. package/src/core/catalog-export/index.ts +20 -0
  230. package/src/core/catalog.diff.ts +247 -0
  231. package/src/core/catalog.model.test.ts +122 -0
  232. package/src/core/catalog.model.ts +510 -0
  233. package/src/core/catalog.snapshot.test.ts +477 -0
  234. package/src/core/catalog.snapshot.ts +289 -0
  235. package/src/core/change.types.ts +44 -0
  236. package/src/core/context.ts +26 -0
  237. package/src/core/declarative-apply/discover-sql.test.ts +103 -0
  238. package/src/core/declarative-apply/discover-sql.ts +107 -0
  239. package/src/core/declarative-apply/extract-catalog-providers.ts +220 -0
  240. package/src/core/declarative-apply/index.test.ts +67 -0
  241. package/src/core/declarative-apply/index.ts +205 -0
  242. package/src/core/declarative-apply/round-apply.test.ts +504 -0
  243. package/src/core/declarative-apply/round-apply.ts +562 -0
  244. package/src/core/depend.ts +1870 -0
  245. package/src/core/expand-replace-dependencies.test.ts +70 -0
  246. package/src/core/expand-replace-dependencies.ts +380 -0
  247. package/src/core/export/file-mapper.test.ts +816 -0
  248. package/src/core/export/file-mapper.ts +574 -0
  249. package/src/core/export/grouper.ts +108 -0
  250. package/src/core/export/index.ts +129 -0
  251. package/src/core/export/types.ts +104 -0
  252. package/src/core/fingerprint.ts +204 -0
  253. package/src/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
  254. package/src/core/integrations/filter/dsl.test.ts +211 -0
  255. package/src/core/integrations/filter/dsl.ts +266 -0
  256. package/src/core/integrations/filter/extractors.test.ts +244 -0
  257. package/src/core/integrations/filter/extractors.ts +187 -0
  258. package/src/core/integrations/filter/filter.types.ts +3 -0
  259. package/src/core/integrations/integration-dsl.ts +34 -0
  260. package/src/core/integrations/integration.types.ts +7 -0
  261. package/src/core/integrations/serialize/dsl.test.ts +91 -0
  262. package/src/core/integrations/serialize/dsl.ts +77 -0
  263. package/src/core/integrations/serialize/serialize.types.ts +3 -0
  264. package/src/core/integrations/supabase.ts +130 -0
  265. package/src/core/objects/aggregate/aggregate.diff.test.ts +215 -0
  266. package/src/core/objects/aggregate/aggregate.diff.ts +222 -0
  267. package/src/core/objects/aggregate/aggregate.model.ts +317 -0
  268. package/src/core/objects/aggregate/changes/aggregate.alter.test.ts +66 -0
  269. package/src/core/objects/aggregate/changes/aggregate.alter.ts +32 -0
  270. package/src/core/objects/aggregate/changes/aggregate.base.ts +20 -0
  271. package/src/core/objects/aggregate/changes/aggregate.comment.test.ts +89 -0
  272. package/src/core/objects/aggregate/changes/aggregate.comment.ts +62 -0
  273. package/src/core/objects/aggregate/changes/aggregate.create.test.ts +104 -0
  274. package/src/core/objects/aggregate/changes/aggregate.create.ts +329 -0
  275. package/src/core/objects/aggregate/changes/aggregate.drop.test.ts +82 -0
  276. package/src/core/objects/aggregate/changes/aggregate.drop.ts +32 -0
  277. package/src/core/objects/aggregate/changes/aggregate.privilege.test.ts +136 -0
  278. package/src/core/objects/aggregate/changes/aggregate.privilege.ts +146 -0
  279. package/src/core/objects/aggregate/changes/aggregate.types.ts +12 -0
  280. package/src/core/objects/base.change.ts +62 -0
  281. package/src/core/objects/base.default-privileges.ts +204 -0
  282. package/src/core/objects/base.diff.ts +20 -0
  283. package/src/core/objects/base.model.ts +82 -0
  284. package/src/core/objects/base.privilege-diff.ts +447 -0
  285. package/src/core/objects/base.privilege.ts +191 -0
  286. package/src/core/objects/collation/changes/collation.alter.test.ts +68 -0
  287. package/src/core/objects/collation/changes/collation.alter.ts +79 -0
  288. package/src/core/objects/collation/changes/collation.base.ts +20 -0
  289. package/src/core/objects/collation/changes/collation.comment.ts +68 -0
  290. package/src/core/objects/collation/changes/collation.create.test.ts +56 -0
  291. package/src/core/objects/collation/changes/collation.create.ts +106 -0
  292. package/src/core/objects/collation/changes/collation.drop.test.ts +31 -0
  293. package/src/core/objects/collation/changes/collation.drop.ts +37 -0
  294. package/src/core/objects/collation/changes/collation.types.ts +10 -0
  295. package/src/core/objects/collation/collation.diff.test.ts +97 -0
  296. package/src/core/objects/collation/collation.diff.ts +127 -0
  297. package/src/core/objects/collation/collation.model.ts +224 -0
  298. package/src/core/objects/diff-context.ts +16 -0
  299. package/src/core/objects/domain/changes/domain.alter.test.ts +335 -0
  300. package/src/core/objects/domain/changes/domain.alter.ts +286 -0
  301. package/src/core/objects/domain/changes/domain.base.ts +20 -0
  302. package/src/core/objects/domain/changes/domain.comment.ts +59 -0
  303. package/src/core/objects/domain/changes/domain.create.test.ts +95 -0
  304. package/src/core/objects/domain/changes/domain.create.ts +124 -0
  305. package/src/core/objects/domain/changes/domain.drop.test.ts +33 -0
  306. package/src/core/objects/domain/changes/domain.drop.ts +34 -0
  307. package/src/core/objects/domain/changes/domain.privilege.ts +171 -0
  308. package/src/core/objects/domain/changes/domain.types.ts +12 -0
  309. package/src/core/objects/domain/domain.diff.test.ts +284 -0
  310. package/src/core/objects/domain/domain.diff.ts +295 -0
  311. package/src/core/objects/domain/domain.model.ts +190 -0
  312. package/src/core/objects/event-trigger/changes/event-trigger.alter.test.ts +57 -0
  313. package/src/core/objects/event-trigger/changes/event-trigger.alter.ts +82 -0
  314. package/src/core/objects/event-trigger/changes/event-trigger.base.ts +20 -0
  315. package/src/core/objects/event-trigger/changes/event-trigger.comment.ts +66 -0
  316. package/src/core/objects/event-trigger/changes/event-trigger.create.test.ts +27 -0
  317. package/src/core/objects/event-trigger/changes/event-trigger.create.ts +72 -0
  318. package/src/core/objects/event-trigger/changes/event-trigger.drop.test.ts +25 -0
  319. package/src/core/objects/event-trigger/changes/event-trigger.drop.ts +34 -0
  320. package/src/core/objects/event-trigger/changes/event-trigger.types.ts +10 -0
  321. package/src/core/objects/event-trigger/event-trigger.diff.test.ts +131 -0
  322. package/src/core/objects/event-trigger/event-trigger.diff.ts +127 -0
  323. package/src/core/objects/event-trigger/event-trigger.model.ts +106 -0
  324. package/src/core/objects/extension/changes/extension.alter.test.ts +63 -0
  325. package/src/core/objects/extension/changes/extension.alter.ts +78 -0
  326. package/src/core/objects/extension/changes/extension.base.ts +20 -0
  327. package/src/core/objects/extension/changes/extension.comment.ts +64 -0
  328. package/src/core/objects/extension/changes/extension.create.test.ts +28 -0
  329. package/src/core/objects/extension/changes/extension.create.ts +63 -0
  330. package/src/core/objects/extension/changes/extension.drop.test.ts +26 -0
  331. package/src/core/objects/extension/changes/extension.drop.ts +34 -0
  332. package/src/core/objects/extension/changes/extension.types.ts +10 -0
  333. package/src/core/objects/extension/extension.diff.test.ts +42 -0
  334. package/src/core/objects/extension/extension.diff.ts +90 -0
  335. package/src/core/objects/extension/extension.model.test.ts +98 -0
  336. package/src/core/objects/extension/extension.model.ts +280 -0
  337. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.test.ts +136 -0
  338. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.ts +101 -0
  339. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.base.ts +20 -0
  340. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.ts +72 -0
  341. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.test.ts +160 -0
  342. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.ts +95 -0
  343. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.test.ts +26 -0
  344. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.ts +36 -0
  345. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.ts +172 -0
  346. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.ts +12 -0
  347. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.test.ts +286 -0
  348. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.ts +271 -0
  349. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.ts +149 -0
  350. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.ts +10 -0
  351. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.test.ts +340 -0
  352. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.ts +341 -0
  353. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.base.ts +20 -0
  354. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.ts +72 -0
  355. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.test.ts +210 -0
  356. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.ts +81 -0
  357. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.test.ts +46 -0
  358. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.ts +37 -0
  359. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.ts +181 -0
  360. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.ts +12 -0
  361. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.test.ts +813 -0
  362. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.ts +343 -0
  363. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.ts +242 -0
  364. package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.test.ts +183 -0
  365. package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.ts +126 -0
  366. package/src/core/objects/foreign-data-wrapper/server/changes/server.base.ts +20 -0
  367. package/src/core/objects/foreign-data-wrapper/server/changes/server.comment.ts +60 -0
  368. package/src/core/objects/foreign-data-wrapper/server/changes/server.create.test.ts +144 -0
  369. package/src/core/objects/foreign-data-wrapper/server/changes/server.create.ts +81 -0
  370. package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.test.ts +27 -0
  371. package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.ts +34 -0
  372. package/src/core/objects/foreign-data-wrapper/server/changes/server.privilege.ts +164 -0
  373. package/src/core/objects/foreign-data-wrapper/server/changes/server.types.ts +12 -0
  374. package/src/core/objects/foreign-data-wrapper/server/server.diff.test.ts +262 -0
  375. package/src/core/objects/foreign-data-wrapper/server/server.diff.ts +247 -0
  376. package/src/core/objects/foreign-data-wrapper/server/server.model.ts +133 -0
  377. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.test.ts +91 -0
  378. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.ts +69 -0
  379. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.base.ts +20 -0
  380. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.test.ts +96 -0
  381. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.ts +66 -0
  382. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.test.ts +60 -0
  383. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.ts +40 -0
  384. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.ts +8 -0
  385. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.test.ts +77 -0
  386. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.ts +107 -0
  387. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.ts +96 -0
  388. package/src/core/objects/index/changes/index.alter.test.ts +209 -0
  389. package/src/core/objects/index/changes/index.alter.ts +144 -0
  390. package/src/core/objects/index/changes/index.base.ts +20 -0
  391. package/src/core/objects/index/changes/index.comment.ts +63 -0
  392. package/src/core/objects/index/changes/index.create.test.ts +69 -0
  393. package/src/core/objects/index/changes/index.create.ts +68 -0
  394. package/src/core/objects/index/changes/index.drop.test.ts +47 -0
  395. package/src/core/objects/index/changes/index.drop.ts +34 -0
  396. package/src/core/objects/index/changes/index.types.ts +6 -0
  397. package/src/core/objects/index/changes/utils.ts +16 -0
  398. package/src/core/objects/index/index.diff.test.ts +153 -0
  399. package/src/core/objects/index/index.diff.ts +243 -0
  400. package/src/core/objects/index/index.model.ts +370 -0
  401. package/src/core/objects/language/changes/language.alter.test.ts +36 -0
  402. package/src/core/objects/language/changes/language.alter.ts +53 -0
  403. package/src/core/objects/language/changes/language.base.ts +20 -0
  404. package/src/core/objects/language/changes/language.comment.ts +58 -0
  405. package/src/core/objects/language/changes/language.create.test.ts +30 -0
  406. package/src/core/objects/language/changes/language.create.ts +104 -0
  407. package/src/core/objects/language/changes/language.drop.test.ts +28 -0
  408. package/src/core/objects/language/changes/language.drop.ts +39 -0
  409. package/src/core/objects/language/changes/language.privilege.ts +172 -0
  410. package/src/core/objects/language/changes/language.types.ts +12 -0
  411. package/src/core/objects/language/language.diff.test.ts +135 -0
  412. package/src/core/objects/language/language.diff.ts +144 -0
  413. package/src/core/objects/language/language.model.ts +150 -0
  414. package/src/core/objects/materialized-view/changes/materialized-view.alter.test.ts +130 -0
  415. package/src/core/objects/materialized-view/changes/materialized-view.alter.ts +113 -0
  416. package/src/core/objects/materialized-view/changes/materialized-view.base.ts +20 -0
  417. package/src/core/objects/materialized-view/changes/materialized-view.comment.ts +176 -0
  418. package/src/core/objects/materialized-view/changes/materialized-view.create.test.ts +69 -0
  419. package/src/core/objects/materialized-view/changes/materialized-view.create.ts +93 -0
  420. package/src/core/objects/materialized-view/changes/materialized-view.drop.test.ts +37 -0
  421. package/src/core/objects/materialized-view/changes/materialized-view.drop.ts +60 -0
  422. package/src/core/objects/materialized-view/changes/materialized-view.privilege.ts +212 -0
  423. package/src/core/objects/materialized-view/changes/materialized-view.types.ts +12 -0
  424. package/src/core/objects/materialized-view/materialized-view.diff.test.ts +264 -0
  425. package/src/core/objects/materialized-view/materialized-view.diff.ts +301 -0
  426. package/src/core/objects/materialized-view/materialized-view.model.ts +258 -0
  427. package/src/core/objects/procedure/changes/procedure.alter.test.ts +1077 -0
  428. package/src/core/objects/procedure/changes/procedure.alter.ts +290 -0
  429. package/src/core/objects/procedure/changes/procedure.base.ts +20 -0
  430. package/src/core/objects/procedure/changes/procedure.comment.ts +70 -0
  431. package/src/core/objects/procedure/changes/procedure.create.test.ts +51 -0
  432. package/src/core/objects/procedure/changes/procedure.create.ts +92 -0
  433. package/src/core/objects/procedure/changes/procedure.drop.test.ts +90 -0
  434. package/src/core/objects/procedure/changes/procedure.drop.ts +49 -0
  435. package/src/core/objects/procedure/changes/procedure.privilege.ts +188 -0
  436. package/src/core/objects/procedure/changes/procedure.types.ts +12 -0
  437. package/src/core/objects/procedure/procedure.diff.test.ts +161 -0
  438. package/src/core/objects/procedure/procedure.diff.ts +341 -0
  439. package/src/core/objects/procedure/procedure.model.ts +264 -0
  440. package/src/core/objects/procedure/utils.ts +58 -0
  441. package/src/core/objects/publication/changes/publication.alter.test.ts +217 -0
  442. package/src/core/objects/publication/changes/publication.alter.ts +225 -0
  443. package/src/core/objects/publication/changes/publication.base.ts +20 -0
  444. package/src/core/objects/publication/changes/publication.comment.test.ts +73 -0
  445. package/src/core/objects/publication/changes/publication.comment.ts +64 -0
  446. package/src/core/objects/publication/changes/publication.create.test.ts +90 -0
  447. package/src/core/objects/publication/changes/publication.create.ts +82 -0
  448. package/src/core/objects/publication/changes/publication.drop.test.ts +48 -0
  449. package/src/core/objects/publication/changes/publication.drop.ts +29 -0
  450. package/src/core/objects/publication/changes/publication.types.ts +24 -0
  451. package/src/core/objects/publication/publication.diff.test.ts +297 -0
  452. package/src/core/objects/publication/publication.diff.ts +247 -0
  453. package/src/core/objects/publication/publication.model.ts +206 -0
  454. package/src/core/objects/publication/utils.ts +55 -0
  455. package/src/core/objects/rls-policy/changes/rls-policy.alter.test.ts +267 -0
  456. package/src/core/objects/rls-policy/changes/rls-policy.alter.ts +128 -0
  457. package/src/core/objects/rls-policy/changes/rls-policy.base.ts +20 -0
  458. package/src/core/objects/rls-policy/changes/rls-policy.comment.ts +69 -0
  459. package/src/core/objects/rls-policy/changes/rls-policy.create.test.ts +81 -0
  460. package/src/core/objects/rls-policy/changes/rls-policy.create.ts +100 -0
  461. package/src/core/objects/rls-policy/changes/rls-policy.drop.test.ts +31 -0
  462. package/src/core/objects/rls-policy/changes/rls-policy.drop.ts +39 -0
  463. package/src/core/objects/rls-policy/changes/rls-policy.types.ts +10 -0
  464. package/src/core/objects/rls-policy/rls-policy.diff.test.ts +79 -0
  465. package/src/core/objects/rls-policy/rls-policy.diff.ts +121 -0
  466. package/src/core/objects/rls-policy/rls-policy.model.ts +140 -0
  467. package/src/core/objects/role/changes/role.alter.test.ts +362 -0
  468. package/src/core/objects/role/changes/role.alter.ts +110 -0
  469. package/src/core/objects/role/changes/role.base.ts +24 -0
  470. package/src/core/objects/role/changes/role.comment.ts +55 -0
  471. package/src/core/objects/role/changes/role.create.test.ts +56 -0
  472. package/src/core/objects/role/changes/role.create.ts +102 -0
  473. package/src/core/objects/role/changes/role.drop.test.ts +32 -0
  474. package/src/core/objects/role/changes/role.drop.ts +34 -0
  475. package/src/core/objects/role/changes/role.privilege.ts +376 -0
  476. package/src/core/objects/role/changes/role.types.ts +12 -0
  477. package/src/core/objects/role/role.diff.test.ts +279 -0
  478. package/src/core/objects/role/role.diff.ts +499 -0
  479. package/src/core/objects/role/role.model.ts +452 -0
  480. package/src/core/objects/rule/changes/rule.alter.test.ts +82 -0
  481. package/src/core/objects/rule/changes/rule.alter.ts +72 -0
  482. package/src/core/objects/rule/changes/rule.base.ts +20 -0
  483. package/src/core/objects/rule/changes/rule.comment.test.ts +58 -0
  484. package/src/core/objects/rule/changes/rule.comment.ts +62 -0
  485. package/src/core/objects/rule/changes/rule.create.test.ts +63 -0
  486. package/src/core/objects/rule/changes/rule.create.ts +42 -0
  487. package/src/core/objects/rule/changes/rule.drop.test.ts +40 -0
  488. package/src/core/objects/rule/changes/rule.drop.ts +29 -0
  489. package/src/core/objects/rule/changes/rule.types.ts +12 -0
  490. package/src/core/objects/rule/rule.diff.test.ts +132 -0
  491. package/src/core/objects/rule/rule.diff.ts +79 -0
  492. package/src/core/objects/rule/rule.model.ts +173 -0
  493. package/src/core/objects/schema/changes/schema.alter.test.ts +31 -0
  494. package/src/core/objects/schema/changes/schema.alter.ts +45 -0
  495. package/src/core/objects/schema/changes/schema.base.ts +20 -0
  496. package/src/core/objects/schema/changes/schema.comment.ts +56 -0
  497. package/src/core/objects/schema/changes/schema.create.test.ts +25 -0
  498. package/src/core/objects/schema/changes/schema.create.ts +47 -0
  499. package/src/core/objects/schema/changes/schema.drop.test.ts +23 -0
  500. package/src/core/objects/schema/changes/schema.drop.ts +34 -0
  501. package/src/core/objects/schema/changes/schema.privilege.ts +175 -0
  502. package/src/core/objects/schema/changes/schema.types.ts +12 -0
  503. package/src/core/objects/schema/schema.diff.test.ts +42 -0
  504. package/src/core/objects/schema/schema.diff.ts +146 -0
  505. package/src/core/objects/schema/schema.model.ts +107 -0
  506. package/src/core/objects/sequence/changes/sequence.alter.test.ts +157 -0
  507. package/src/core/objects/sequence/changes/sequence.alter.ts +115 -0
  508. package/src/core/objects/sequence/changes/sequence.base.ts +20 -0
  509. package/src/core/objects/sequence/changes/sequence.comment.ts +60 -0
  510. package/src/core/objects/sequence/changes/sequence.create.test.ts +89 -0
  511. package/src/core/objects/sequence/changes/sequence.create.ts +111 -0
  512. package/src/core/objects/sequence/changes/sequence.drop.test.ts +35 -0
  513. package/src/core/objects/sequence/changes/sequence.drop.ts +37 -0
  514. package/src/core/objects/sequence/changes/sequence.privilege.ts +179 -0
  515. package/src/core/objects/sequence/changes/sequence.types.ts +12 -0
  516. package/src/core/objects/sequence/sequence.diff.test.ts +255 -0
  517. package/src/core/objects/sequence/sequence.diff.ts +294 -0
  518. package/src/core/objects/sequence/sequence.model.ts +185 -0
  519. package/src/core/objects/subscription/changes/subscription.alter.test.ts +134 -0
  520. package/src/core/objects/subscription/changes/subscription.alter.ts +110 -0
  521. package/src/core/objects/subscription/changes/subscription.base.ts +20 -0
  522. package/src/core/objects/subscription/changes/subscription.comment.test.ts +70 -0
  523. package/src/core/objects/subscription/changes/subscription.comment.ts +64 -0
  524. package/src/core/objects/subscription/changes/subscription.create.test.ts +80 -0
  525. package/src/core/objects/subscription/changes/subscription.create.ts +69 -0
  526. package/src/core/objects/subscription/changes/subscription.drop.test.ts +48 -0
  527. package/src/core/objects/subscription/changes/subscription.drop.ts +20 -0
  528. package/src/core/objects/subscription/changes/subscription.types.ts +22 -0
  529. package/src/core/objects/subscription/subscription.diff.test.ts +237 -0
  530. package/src/core/objects/subscription/subscription.diff.ts +242 -0
  531. package/src/core/objects/subscription/subscription.model.ts +190 -0
  532. package/src/core/objects/subscription/utils.ts +156 -0
  533. package/src/core/objects/table/changes/table.alter.test.ts +846 -0
  534. package/src/core/objects/table/changes/table.alter.ts +806 -0
  535. package/src/core/objects/table/changes/table.base.ts +20 -0
  536. package/src/core/objects/table/changes/table.comment.ts +266 -0
  537. package/src/core/objects/table/changes/table.create.test.ts +188 -0
  538. package/src/core/objects/table/changes/table.create.ts +192 -0
  539. package/src/core/objects/table/changes/table.drop.test.ts +36 -0
  540. package/src/core/objects/table/changes/table.drop.ts +45 -0
  541. package/src/core/objects/table/changes/table.privilege.ts +200 -0
  542. package/src/core/objects/table/changes/table.types.ts +12 -0
  543. package/src/core/objects/table/table.diff.test.ts +868 -0
  544. package/src/core/objects/table/table.diff.ts +817 -0
  545. package/src/core/objects/table/table.model.ts +460 -0
  546. package/src/core/objects/trigger/changes/trigger.alter.test.ts +50 -0
  547. package/src/core/objects/trigger/changes/trigger.alter.ts +76 -0
  548. package/src/core/objects/trigger/changes/trigger.base.ts +20 -0
  549. package/src/core/objects/trigger/changes/trigger.comment.ts +64 -0
  550. package/src/core/objects/trigger/changes/trigger.create.test.ts +47 -0
  551. package/src/core/objects/trigger/changes/trigger.create.ts +88 -0
  552. package/src/core/objects/trigger/changes/trigger.drop.test.ts +47 -0
  553. package/src/core/objects/trigger/changes/trigger.drop.ts +39 -0
  554. package/src/core/objects/trigger/changes/trigger.types.ts +10 -0
  555. package/src/core/objects/trigger/trigger.diff.test.ts +84 -0
  556. package/src/core/objects/trigger/trigger.diff.ts +116 -0
  557. package/src/core/objects/trigger/trigger.model.ts +264 -0
  558. package/src/core/objects/type/composite-type/changes/composite-type.alter.test.ts +208 -0
  559. package/src/core/objects/type/composite-type/changes/composite-type.alter.ts +174 -0
  560. package/src/core/objects/type/composite-type/changes/composite-type.base.ts +20 -0
  561. package/src/core/objects/type/composite-type/changes/composite-type.comment.ts +145 -0
  562. package/src/core/objects/type/composite-type/changes/composite-type.create.test.ts +106 -0
  563. package/src/core/objects/type/composite-type/changes/composite-type.create.ts +95 -0
  564. package/src/core/objects/type/composite-type/changes/composite-type.drop.test.ts +36 -0
  565. package/src/core/objects/type/composite-type/changes/composite-type.drop.ts +37 -0
  566. package/src/core/objects/type/composite-type/changes/composite-type.privilege.ts +175 -0
  567. package/src/core/objects/type/composite-type/changes/composite-type.types.ts +12 -0
  568. package/src/core/objects/type/composite-type/composite-type.diff.test.ts +269 -0
  569. package/src/core/objects/type/composite-type/composite-type.diff.ts +310 -0
  570. package/src/core/objects/type/composite-type/composite-type.model.ts +253 -0
  571. package/src/core/objects/type/enum/changes/enum.alter.test.ts +113 -0
  572. package/src/core/objects/type/enum/changes/enum.alter.ts +91 -0
  573. package/src/core/objects/type/enum/changes/enum.base.ts +20 -0
  574. package/src/core/objects/type/enum/changes/enum.comment.ts +64 -0
  575. package/src/core/objects/type/enum/changes/enum.create.test.ts +31 -0
  576. package/src/core/objects/type/enum/changes/enum.create.ts +56 -0
  577. package/src/core/objects/type/enum/changes/enum.drop.test.ts +28 -0
  578. package/src/core/objects/type/enum/changes/enum.drop.ts +34 -0
  579. package/src/core/objects/type/enum/changes/enum.privilege.ts +175 -0
  580. package/src/core/objects/type/enum/changes/enum.types.ts +12 -0
  581. package/src/core/objects/type/enum/enum.diff.test.ts +372 -0
  582. package/src/core/objects/type/enum/enum.diff.ts +308 -0
  583. package/src/core/objects/type/enum/enum.model.ts +194 -0
  584. package/src/core/objects/type/range/changes/range.alter.test.ts +29 -0
  585. package/src/core/objects/type/range/changes/range.alter.ts +51 -0
  586. package/src/core/objects/type/range/changes/range.base.ts +20 -0
  587. package/src/core/objects/type/range/changes/range.comment.ts +64 -0
  588. package/src/core/objects/type/range/changes/range.create.test.ts +54 -0
  589. package/src/core/objects/type/range/changes/range.create.ts +155 -0
  590. package/src/core/objects/type/range/changes/range.drop.test.ts +28 -0
  591. package/src/core/objects/type/range/changes/range.drop.ts +34 -0
  592. package/src/core/objects/type/range/changes/range.privilege.ts +175 -0
  593. package/src/core/objects/type/range/changes/range.types.ts +12 -0
  594. package/src/core/objects/type/range/range.diff.test.ts +147 -0
  595. package/src/core/objects/type/range/range.diff.ts +197 -0
  596. package/src/core/objects/type/range/range.model.ts +187 -0
  597. package/src/core/objects/type/type.types.ts +5 -0
  598. package/src/core/objects/utils.ts +171 -0
  599. package/src/core/objects/view/changes/view.alter.test.ts +115 -0
  600. package/src/core/objects/view/changes/view.alter.ts +112 -0
  601. package/src/core/objects/view/changes/view.base.ts +20 -0
  602. package/src/core/objects/view/changes/view.comment.ts +59 -0
  603. package/src/core/objects/view/changes/view.create.test.ts +70 -0
  604. package/src/core/objects/view/changes/view.create.ts +73 -0
  605. package/src/core/objects/view/changes/view.drop.test.ts +37 -0
  606. package/src/core/objects/view/changes/view.drop.ts +40 -0
  607. package/src/core/objects/view/changes/view.privilege.ts +200 -0
  608. package/src/core/objects/view/changes/view.types.ts +12 -0
  609. package/src/core/objects/view/view.diff.test.ts +173 -0
  610. package/src/core/objects/view/view.diff.ts +215 -0
  611. package/src/core/objects/view/view.model.ts +262 -0
  612. package/src/core/plan/apply.ts +172 -0
  613. package/src/core/plan/create.ts +384 -0
  614. package/src/core/plan/hierarchy.ts +574 -0
  615. package/src/core/plan/index.ts +29 -0
  616. package/src/core/plan/io.ts +20 -0
  617. package/src/core/plan/risk.ts +48 -0
  618. package/src/core/plan/serialize.test.ts +317 -0
  619. package/src/core/plan/serialize.ts +209 -0
  620. package/src/core/plan/sql-format/constants.ts +13 -0
  621. package/src/core/plan/sql-format/fixtures.ts +2803 -0
  622. package/src/core/plan/sql-format/format-comment-literals.test.ts +96 -0
  623. package/src/core/plan/sql-format/format-functions.test.ts +127 -0
  624. package/src/core/plan/sql-format/format-lowercase-coverage.test.ts +119 -0
  625. package/src/core/plan/sql-format/format-off.test.ts +806 -0
  626. package/src/core/plan/sql-format/format-pretty-lower-leading.test.ts +1061 -0
  627. package/src/core/plan/sql-format/format-pretty-narrow.test.ts +1279 -0
  628. package/src/core/plan/sql-format/format-pretty-preserve.test.ts +1057 -0
  629. package/src/core/plan/sql-format/format-pretty-upper.test.ts +1048 -0
  630. package/src/core/plan/sql-format/format-stress.test.ts +616 -0
  631. package/src/core/plan/sql-format/format-utils.test.ts +91 -0
  632. package/src/core/plan/sql-format/format-utils.ts +391 -0
  633. package/src/core/plan/sql-format/formatters.ts +921 -0
  634. package/src/core/plan/sql-format/index.ts +149 -0
  635. package/src/core/plan/sql-format/keyword-case.test.ts +118 -0
  636. package/src/core/plan/sql-format/keyword-case.ts +1120 -0
  637. package/src/core/plan/sql-format/protect.test.ts +127 -0
  638. package/src/core/plan/sql-format/protect.ts +337 -0
  639. package/src/core/plan/sql-format/sql-scanner.test.ts +240 -0
  640. package/src/core/plan/sql-format/sql-scanner.ts +252 -0
  641. package/src/core/plan/sql-format/tokenizer.test.ts +68 -0
  642. package/src/core/plan/sql-format/tokenizer.ts +152 -0
  643. package/src/core/plan/sql-format/types.ts +31 -0
  644. package/src/core/plan/sql-format/wrap.test.ts +119 -0
  645. package/src/core/plan/sql-format/wrap.ts +196 -0
  646. package/src/core/plan/sql-format.ts +2 -0
  647. package/src/core/plan/ssl-config.ts +172 -0
  648. package/src/core/plan/statements.ts +22 -0
  649. package/src/core/plan/types.ts +171 -0
  650. package/src/core/postgres-config.ts +293 -0
  651. package/src/core/sort/custom-constraints.ts +161 -0
  652. package/src/core/sort/debug-visualization.ts +239 -0
  653. package/src/core/sort/dependency-filter.ts +224 -0
  654. package/src/core/sort/graph-builder.ts +235 -0
  655. package/src/core/sort/graph-utils.ts +51 -0
  656. package/src/core/sort/logical-sort.test.ts +371 -0
  657. package/src/core/sort/logical-sort.ts +597 -0
  658. package/src/core/sort/sort-changes.ts +234 -0
  659. package/src/core/sort/topological-sort.test.ts +275 -0
  660. package/src/core/sort/topological-sort.ts +184 -0
  661. package/src/core/sort/types.ts +112 -0
  662. package/src/core/sort/utils.ts +69 -0
  663. package/src/core/test-utils/assert-valid-sql.ts +20 -0
  664. package/src/index.ts +41 -0
@@ -1,10 +1,4 @@
1
- import type { DefaultPrivilegeState } from "../base.default-privileges.ts";
2
- import type { Role } from "../role/role.model.ts";
1
+ import type { ObjectDiffContext } from "../diff-context.ts";
3
2
  import type { Aggregate } from "./aggregate.model.ts";
4
3
  import type { AggregateChange } from "./changes/aggregate.types.ts";
5
- export declare function diffAggregates(ctx: {
6
- version: number;
7
- currentUser: string;
8
- defaultPrivilegeState: DefaultPrivilegeState;
9
- mainRoles: Record<string, Role>;
10
- }, main: Record<string, Aggregate>, branch: Record<string, Aggregate>): AggregateChange[];
4
+ export declare function diffAggregates(ctx: Pick<ObjectDiffContext, "version" | "currentUser" | "defaultPrivilegeState">, main: Record<string, Aggregate>, branch: Record<string, Aggregate>): AggregateChange[];
@@ -1,5 +1,5 @@
1
1
  import { diffObjects } from "../base.diff.js";
2
- import { diffPrivileges, filterPublicBuiltInDefaults, groupPrivilegesByGrantable, } from "../base.privilege-diff.js";
2
+ import { diffPrivileges, emitObjectPrivilegeChanges, filterPublicBuiltInDefaults, } from "../base.privilege-diff.js";
3
3
  import { deepEqual, hasNonAlterableChanges } from "../utils.js";
4
4
  import { AlterAggregateChangeOwner } from "./changes/aggregate.alter.js";
5
5
  import { CreateCommentOnAggregate, DropCommentOnAggregate, } from "./changes/aggregate.comment.js";
@@ -29,48 +29,21 @@ export function diffAggregates(ctx, main, branch) {
29
29
  // We compare default privileges against desired privileges to generate REVOKE/GRANT statements
30
30
  // needed to reach the final desired state.
31
31
  const effectiveDefaults = ctx.defaultPrivilegeState.getEffectiveDefaults(ctx.currentUser, "aggregate", aggregate.schema ?? "");
32
+ const creatorFilteredDefaults = aggregate.owner !== ctx.currentUser
33
+ ? effectiveDefaults.filter((p) => p.grantee !== ctx.currentUser)
34
+ : effectiveDefaults;
32
35
  // Filter out PUBLIC's built-in default EXECUTE privilege (PostgreSQL grants it automatically)
33
36
  // Reference: https://www.postgresql.org/docs/17/ddl-priv.html Table 5.2
34
37
  // This prevents generating unnecessary "GRANT EXECUTE TO PUBLIC" statements
35
38
  const desiredPrivileges = filterPublicBuiltInDefaults("aggregate", aggregate.privileges);
36
39
  // Filter out owner privileges - owner always has ALL privileges implicitly
37
40
  // and shouldn't be compared. Use the aggregate owner as the reference.
38
- const privilegeResults = diffPrivileges(effectiveDefaults, desiredPrivileges, aggregate.owner, ctx.mainRoles);
39
- // Generate grant changes
40
- for (const [grantee, result] of privilegeResults) {
41
- if (result.grants.length > 0) {
42
- const grantGroups = groupPrivilegesByGrantable(result.grants);
43
- for (const [, list] of grantGroups) {
44
- changes.push(new GrantAggregatePrivileges({
45
- aggregate,
46
- grantee,
47
- privileges: list,
48
- version: ctx.version,
49
- }));
50
- }
51
- }
52
- // Generate revoke changes
53
- if (result.revokes.length > 0) {
54
- const revokeGroups = groupPrivilegesByGrantable(result.revokes);
55
- for (const [, list] of revokeGroups) {
56
- changes.push(new RevokeAggregatePrivileges({
57
- aggregate,
58
- grantee,
59
- privileges: list,
60
- version: ctx.version,
61
- }));
62
- }
63
- }
64
- // Generate revoke grant option changes
65
- if (result.revokeGrantOption.length > 0) {
66
- changes.push(new RevokeGrantOptionAggregatePrivileges({
67
- aggregate,
68
- grantee,
69
- privilegeNames: result.revokeGrantOption,
70
- version: ctx.version,
71
- }));
72
- }
73
- }
41
+ const privilegeResults = diffPrivileges(filterPublicBuiltInDefaults("aggregate", creatorFilteredDefaults), desiredPrivileges, aggregate.owner);
42
+ changes.push(...emitObjectPrivilegeChanges(privilegeResults, aggregate, aggregate, "aggregate", {
43
+ Grant: GrantAggregatePrivileges,
44
+ Revoke: RevokeAggregatePrivileges,
45
+ RevokeGrantOption: RevokeGrantOptionAggregatePrivileges,
46
+ }, ctx.version));
74
47
  }
75
48
  for (const aggregateId of dropped) {
76
49
  changes.push(new DropAggregate({ aggregate: main[aggregateId] }));
@@ -148,39 +121,12 @@ export function diffAggregates(ctx, main, branch) {
148
121
  const branchPrivilegesFiltered = filterPublicBuiltInDefaults("aggregate", branchAggregate.privileges);
149
122
  // Filter out owner privileges - owner always has ALL privileges implicitly
150
123
  // and shouldn't be compared. Use branch owner as the reference.
151
- const privilegeResults = diffPrivileges(mainPrivilegesFiltered, branchPrivilegesFiltered, branchAggregate.owner, ctx.mainRoles);
152
- for (const [grantee, result] of privilegeResults) {
153
- if (result.grants.length > 0) {
154
- const grantGroups = groupPrivilegesByGrantable(result.grants);
155
- for (const [, list] of grantGroups) {
156
- changes.push(new GrantAggregatePrivileges({
157
- aggregate: branchAggregate,
158
- grantee,
159
- privileges: list,
160
- version: ctx.version,
161
- }));
162
- }
163
- }
164
- if (result.revokes.length > 0) {
165
- const revokeGroups = groupPrivilegesByGrantable(result.revokes);
166
- for (const [, list] of revokeGroups) {
167
- changes.push(new RevokeAggregatePrivileges({
168
- aggregate: mainAggregate,
169
- grantee,
170
- privileges: list,
171
- version: ctx.version,
172
- }));
173
- }
174
- }
175
- if (result.revokeGrantOption.length > 0) {
176
- changes.push(new RevokeGrantOptionAggregatePrivileges({
177
- aggregate: mainAggregate,
178
- grantee,
179
- privilegeNames: result.revokeGrantOption,
180
- version: ctx.version,
181
- }));
182
- }
183
- }
124
+ const privilegeResults = diffPrivileges(mainPrivilegesFiltered, branchPrivilegesFiltered, branchAggregate.owner);
125
+ changes.push(...emitObjectPrivilegeChanges(privilegeResults, branchAggregate, mainAggregate, "aggregate", {
126
+ Grant: GrantAggregatePrivileges,
127
+ Revoke: RevokeAggregatePrivileges,
128
+ RevokeGrantOption: RevokeGrantOptionAggregatePrivileges,
129
+ }, ctx.version));
184
130
  }
185
131
  return changes;
186
132
  }
@@ -1,4 +1,4 @@
1
- import type { Sql } from "postgres";
1
+ import type { Pool } from "pg";
2
2
  import z from "zod";
3
3
  import { BasePgModel } from "../base.model.ts";
4
4
  import { type PrivilegeProps } from "../base.privilege-diff.ts";
@@ -16,9 +16,9 @@ declare const aggregatePropsSchema: z.ZodObject<{
16
16
  return_type: z.ZodString;
17
17
  return_type_schema: z.ZodNullable<z.ZodString>;
18
18
  parallel_safety: z.ZodEnum<{
19
- r: "r";
20
19
  u: "u";
21
20
  s: "s";
21
+ r: "r";
22
22
  }>;
23
23
  is_strict: z.ZodBoolean;
24
24
  transition_function: z.ZodString;
@@ -28,8 +28,8 @@ declare const aggregatePropsSchema: z.ZodObject<{
28
28
  final_function: z.ZodNullable<z.ZodString>;
29
29
  final_function_extra_args: z.ZodBoolean;
30
30
  final_function_modify: z.ZodNullable<z.ZodEnum<{
31
- r: "r";
32
31
  s: "s";
32
+ r: "r";
33
33
  w: "w";
34
34
  }>>;
35
35
  combine_function: z.ZodNullable<z.ZodString>;
@@ -44,8 +44,8 @@ declare const aggregatePropsSchema: z.ZodObject<{
44
44
  moving_final_function: z.ZodNullable<z.ZodString>;
45
45
  moving_final_function_extra_args: z.ZodBoolean;
46
46
  moving_final_function_modify: z.ZodNullable<z.ZodEnum<{
47
- r: "r";
48
47
  s: "s";
48
+ r: "r";
49
49
  w: "w";
50
50
  }>>;
51
51
  moving_initial_condition: z.ZodNullable<z.ZodString>;
@@ -56,8 +56,8 @@ declare const aggregatePropsSchema: z.ZodObject<{
56
56
  argument_types: z.ZodNullable<z.ZodArray<z.ZodString>>;
57
57
  all_argument_types: z.ZodNullable<z.ZodArray<z.ZodString>>;
58
58
  argument_modes: z.ZodNullable<z.ZodArray<z.ZodEnum<{
59
- o: "o";
60
59
  i: "i";
60
+ o: "o";
61
61
  b: "b";
62
62
  v: "v";
63
63
  t: "t";
@@ -129,7 +129,7 @@ export declare class Aggregate extends BasePgModel {
129
129
  num_direct_args: number;
130
130
  return_type: string;
131
131
  return_type_schema: string | null;
132
- parallel_safety: "r" | "u" | "s";
132
+ parallel_safety: "u" | "s" | "r";
133
133
  is_strict: boolean;
134
134
  transition_function: string;
135
135
  state_data_type: string;
@@ -137,7 +137,7 @@ export declare class Aggregate extends BasePgModel {
137
137
  state_data_space: number;
138
138
  final_function: string | null;
139
139
  final_function_extra_args: boolean;
140
- final_function_modify: "r" | "s" | "w" | null;
140
+ final_function_modify: "s" | "r" | "w" | null;
141
141
  combine_function: string | null;
142
142
  serial_function: string | null;
143
143
  deserial_function: string | null;
@@ -149,7 +149,7 @@ export declare class Aggregate extends BasePgModel {
149
149
  moving_state_data_space: number | null;
150
150
  moving_final_function: string | null;
151
151
  moving_final_function_extra_args: boolean;
152
- moving_final_function_modify: "r" | "s" | "w" | null;
152
+ moving_final_function_modify: "s" | "r" | "w" | null;
153
153
  moving_initial_condition: string | null;
154
154
  sort_operator: string | null;
155
155
  argument_count: number;
@@ -157,7 +157,7 @@ export declare class Aggregate extends BasePgModel {
157
157
  argument_names: string[] | null;
158
158
  argument_types: string[] | null;
159
159
  all_argument_types: string[] | null;
160
- argument_modes: ("o" | "i" | "b" | "v" | "t")[] | null;
160
+ argument_modes: ("i" | "o" | "b" | "v" | "t")[] | null;
161
161
  argument_defaults: string | null;
162
162
  identity_arguments: string;
163
163
  owner: string;
@@ -170,5 +170,5 @@ export declare class Aggregate extends BasePgModel {
170
170
  }[];
171
171
  };
172
172
  }
173
- export declare function extractAggregates(sql: Sql): Promise<Aggregate[]>;
173
+ export declare function extractAggregates(pool: Pool): Promise<Aggregate[]>;
174
174
  export {};
@@ -1,3 +1,4 @@
1
+ import { sql } from "@ts-safeql/sql-tag";
1
2
  import z from "zod";
2
3
  import { BasePgModel } from "../base.model.js";
3
4
  import { privilegePropsSchema, } from "../base.privilege-diff.js";
@@ -208,10 +209,8 @@ export class Aggregate extends BasePgModel {
208
209
  };
209
210
  }
210
211
  }
211
- export async function extractAggregates(sql) {
212
- return sql.begin(async (sql) => {
213
- await sql `set search_path = ''`;
214
- const aggregateRows = await sql `
212
+ export async function extractAggregates(pool) {
213
+ const { rows: aggregateRows } = await pool.query(sql `
215
214
  with extension_oids as (
216
215
  select
217
216
  objid
@@ -274,7 +273,7 @@ select
274
273
  )
275
274
  order by x.grantee, x.privilege_type
276
275
  )
277
- from lateral aclexplode(p.proacl) as x(grantor, grantee, privilege_type, is_grantable)
276
+ from lateral aclexplode(COALESCE(p.proacl, acldefault('f', p.proowner))) as x(grantor, grantee, privilege_type, is_grantable)
278
277
  ), '[]'
279
278
  ) as privileges
280
279
  from
@@ -289,9 +288,8 @@ where
289
288
  and not p.pronamespace::regnamespace::text like any(array['pg\\_%', 'information\\_schema'])
290
289
  and e.objid is null
291
290
  order by
292
- 1, 2, 3;
293
- `;
294
- const validatedRows = aggregateRows.map((row) => aggregatePropsSchema.parse(row));
295
- return validatedRows.map((row) => new Aggregate(row));
296
- });
291
+ 1, 2, 3
292
+ `);
293
+ const validatedRows = aggregateRows.map((row) => aggregatePropsSchema.parse(row));
294
+ return validatedRows.map((row) => new Aggregate(row));
297
295
  }
@@ -183,7 +183,7 @@ export class CreateAggregate extends CreateAggregateChange {
183
183
  clauses.push(`SORTOP = ${formatOperator(this.aggregate.sort_operator)}`);
184
184
  }
185
185
  if (this.aggregate.parallel_safety !== "u") {
186
- clauses.push(`PARALLEL ${formatParallel(this.aggregate.parallel_safety)}`);
186
+ clauses.push(`PARALLEL = ${formatParallel(this.aggregate.parallel_safety)}`);
187
187
  }
188
188
  if (this.aggregate.is_strict) {
189
189
  clauses.push("STRICT");
@@ -20,7 +20,7 @@ export class DropAggregate extends DropAggregateChange {
20
20
  serialize() {
21
21
  const signature = this.aggregate.identityArguments;
22
22
  const qualifiedName = `${this.aggregate.schema}.${this.aggregate.name}`;
23
- const withArgs = signature.length > 0 ? `(${signature})` : "()";
23
+ const withArgs = signature.length > 0 ? `(${signature})` : "(*)";
24
24
  return `DROP AGGREGATE ${qualifiedName}${withArgs}`;
25
25
  }
26
26
  }
@@ -1,6 +1,6 @@
1
1
  import z from "zod";
2
2
  import type { Change } from "../change.types.ts";
3
- import type { Role } from "./role/role.model.ts";
3
+ import type { BaseChange } from "./base.change.ts";
4
4
  /**
5
5
  * Privilege properties that all privilege objects share.
6
6
  */
@@ -19,17 +19,6 @@ interface PrivilegeDiffResult<T extends PrivilegeProps> {
19
19
  revokes: T[];
20
20
  revokeGrantOption: string[];
21
21
  }
22
- /**
23
- * Groups privileges by grantable flag for efficient SQL generation
24
- */
25
- export declare function groupPrivilegesByGrantable<T extends PrivilegeProps>(privileges: T[]): Map<boolean, T[]>;
26
- /**
27
- * Groups privileges by columns and grantable flag
28
- */
29
- export declare function groupPrivilegesByColumns<T extends PrivilegeProps>(privileges: T[]): Map<string, {
30
- columns?: string[];
31
- byGrant: Map<boolean, Set<string>>;
32
- }>;
33
22
  /**
34
23
  * Filters out PUBLIC's built-in default privileges that PostgreSQL automatically grants
35
24
  * when creating certain object types. This prevents generating unnecessary GRANT statements
@@ -50,5 +39,41 @@ export declare function filterPublicBuiltInDefaults<T extends PrivilegeProps>(ob
50
39
  /**
51
40
  * Generic privilege diffing function that works for any object type
52
41
  */
53
- export declare function diffPrivileges<T extends PrivilegeProps>(mainPrivileges: T[], branchPrivileges: T[], owner?: string, mainRoles?: Record<string, Role>): Map<string, PrivilegeDiffResult<T>>;
42
+ export declare function diffPrivileges<T extends PrivilegeProps>(mainPrivileges: T[], branchPrivileges: T[], owner?: string): Map<string, PrivilegeDiffResult<T>>;
43
+ /**
44
+ * Factory constructors for Grant / Revoke / RevokeGrantOption change classes.
45
+ * Every object type provides its own concrete classes. The `any` props type
46
+ * is intentional: the helpers build props with a computed `[objectKey]` key
47
+ * whose name varies per object type, so no single concrete type can unify
48
+ * all call sites without an unsafe cast elsewhere.
49
+ */
50
+ interface PrivilegeChangeFactories {
51
+ Grant: new (props: any) => BaseChange;
52
+ Revoke: new (props: any) => BaseChange;
53
+ RevokeGrantOption: new (props: any) => BaseChange;
54
+ }
55
+ /**
56
+ * Emit privilege changes for object-level privileges (schema, sequence,
57
+ * procedure, etc.).
58
+ *
59
+ * For each grantee in `privilegeResults` the function groups grants and revokes
60
+ * by the `grantable` flag and pushes one change per group. Revoke-grant-option
61
+ * entries produce a single change carrying `privilegeNames`.
62
+ *
63
+ * `grantTarget` is the *branch* object (the desired state) while `revokeTarget`
64
+ * is the *main* object (the current state), so that GRANTs reference the
65
+ * newly-created/altered object and REVOKEs reference the existing one.
66
+ */
67
+ export declare function emitObjectPrivilegeChanges(privilegeResults: Map<string, PrivilegeDiffResult<PrivilegeProps>>, grantTarget: unknown, revokeTarget: unknown, objectKey: string, factories: PrivilegeChangeFactories, version?: number): BaseChange[];
68
+ /**
69
+ * Emit privilege changes for column-level privileges (table, view,
70
+ * materialized view).
71
+ *
72
+ * Like {@link emitObjectPrivilegeChanges} but groups by column set (via
73
+ * `groupPrivilegesByColumns`) instead of only by grantable. For
74
+ * revoke-grant-option the column sets come from `sourcePrivileges` so that
75
+ * `REVOKE GRANT OPTION FOR` is emitted per column set that originally carried
76
+ * the privilege.
77
+ */
78
+ export declare function emitColumnPrivilegeChanges(privilegeResults: Map<string, PrivilegeDiffResult<PrivilegeProps>>, grantTarget: unknown, revokeTarget: unknown, objectKey: string, factories: PrivilegeChangeFactories, sourcePrivileges: PrivilegeProps[], version?: number): BaseChange[];
54
79
  export {};
@@ -1,5 +1,4 @@
1
1
  import z from "zod";
2
- import { stableId } from "./utils.js";
3
2
  /**
4
3
  * Privilege properties that all privilege objects share.
5
4
  */
@@ -81,7 +80,7 @@ function checkStillHasBase(targetPrivs, privilege, key) {
81
80
  /**
82
81
  * Groups privileges by grantable flag for efficient SQL generation
83
82
  */
84
- export function groupPrivilegesByGrantable(privileges) {
83
+ function groupPrivilegesByGrantable(privileges) {
85
84
  const groups = new Map();
86
85
  for (const privilege of privileges) {
87
86
  const arr = groups.get(privilege.grantable) ?? [];
@@ -93,7 +92,7 @@ export function groupPrivilegesByGrantable(privileges) {
93
92
  /**
94
93
  * Groups privileges by columns and grantable flag
95
94
  */
96
- export function groupPrivilegesByColumns(privileges) {
95
+ function groupPrivilegesByColumns(privileges) {
97
96
  const groups = new Map();
98
97
  for (const privilege of privileges) {
99
98
  const key = privilege.columns ? privilege.columns.sort().join(",") : "";
@@ -171,33 +170,17 @@ export function filterPublicBuiltInDefaults(objectType, privileges) {
171
170
  function filterOwnerPrivileges(privileges, owner) {
172
171
  return privileges.filter((p) => p.grantee !== owner);
173
172
  }
174
- /**
175
- * Filter out privileges for superuser roles, as PostgreSQL doesn't store
176
- * GRANTs to superusers in relacl (they already have all privileges implicitly).
177
- * Reference: https://www.postgresql.org/docs/current/role-attributes.html
178
- */
179
- function filterSuperuserPrivileges(privileges, mainRoles) {
180
- if (!mainRoles)
181
- return privileges;
182
- return privileges.filter((priv) => {
183
- const role = mainRoles[stableId.role(priv.grantee)];
184
- return !role?.is_superuser;
185
- });
186
- }
187
173
  /**
188
174
  * Generic privilege diffing function that works for any object type
189
175
  */
190
- export function diffPrivileges(mainPrivileges, branchPrivileges, owner, mainRoles) {
191
- // Filter out superuser privileges from branch - PostgreSQL doesn't store GRANTs
192
- // to superusers in relacl because they already have all privileges implicitly
193
- const branchPrivilegesFiltered = filterSuperuserPrivileges(branchPrivileges, mainRoles);
176
+ export function diffPrivileges(mainPrivileges, branchPrivileges, owner) {
194
177
  // Filter out owner privileges if owner is provided
195
178
  const mainFiltered = owner
196
179
  ? filterOwnerPrivileges(mainPrivileges, owner)
197
180
  : mainPrivileges;
198
181
  const branchFiltered = owner
199
- ? filterOwnerPrivileges(branchPrivilegesFiltered, owner)
200
- : branchPrivilegesFiltered;
182
+ ? filterOwnerPrivileges(branchPrivileges, owner)
183
+ : branchPrivileges;
201
184
  const mainByGrantee = groupPrivilegesByGrantee(mainFiltered);
202
185
  const branchByGrantee = groupPrivilegesByGrantee(branchFiltered);
203
186
  // Get all grantees
@@ -214,3 +197,102 @@ export function diffPrivileges(mainPrivileges, branchPrivileges, owner, mainRole
214
197
  }
215
198
  return results;
216
199
  }
200
+ /**
201
+ * Emit privilege changes for object-level privileges (schema, sequence,
202
+ * procedure, etc.).
203
+ *
204
+ * For each grantee in `privilegeResults` the function groups grants and revokes
205
+ * by the `grantable` flag and pushes one change per group. Revoke-grant-option
206
+ * entries produce a single change carrying `privilegeNames`.
207
+ *
208
+ * `grantTarget` is the *branch* object (the desired state) while `revokeTarget`
209
+ * is the *main* object (the current state), so that GRANTs reference the
210
+ * newly-created/altered object and REVOKEs reference the existing one.
211
+ */
212
+ export function emitObjectPrivilegeChanges(privilegeResults, grantTarget, revokeTarget, objectKey, factories, version) {
213
+ const changes = [];
214
+ for (const [grantee, result] of privilegeResults) {
215
+ for (const [, revokes] of groupPrivilegesByGrantable(result.revokes)) {
216
+ changes.push(new factories.Revoke({
217
+ [objectKey]: revokeTarget,
218
+ privileges: revokes,
219
+ grantee,
220
+ version,
221
+ }));
222
+ }
223
+ if (result.revokeGrantOption.length > 0) {
224
+ changes.push(new factories.RevokeGrantOption({
225
+ [objectKey]: revokeTarget,
226
+ privilegeNames: result.revokeGrantOption,
227
+ grantee,
228
+ version,
229
+ }));
230
+ }
231
+ for (const [, grants] of groupPrivilegesByGrantable(result.grants)) {
232
+ changes.push(new factories.Grant({
233
+ [objectKey]: grantTarget,
234
+ privileges: grants,
235
+ grantee,
236
+ version,
237
+ }));
238
+ }
239
+ }
240
+ return changes;
241
+ }
242
+ /**
243
+ * Emit privilege changes for column-level privileges (table, view,
244
+ * materialized view).
245
+ *
246
+ * Like {@link emitObjectPrivilegeChanges} but groups by column set (via
247
+ * `groupPrivilegesByColumns`) instead of only by grantable. For
248
+ * revoke-grant-option the column sets come from `sourcePrivileges` so that
249
+ * `REVOKE GRANT OPTION FOR` is emitted per column set that originally carried
250
+ * the privilege.
251
+ */
252
+ export function emitColumnPrivilegeChanges(privilegeResults, grantTarget, revokeTarget, objectKey, factories, sourcePrivileges, version) {
253
+ const changes = [];
254
+ for (const [grantee, result] of privilegeResults) {
255
+ for (const [, group] of groupPrivilegesByColumns(result.revokes)) {
256
+ const allPrivileges = new Set();
257
+ for (const [, privSet] of group.byGrant) {
258
+ for (const priv of privSet) {
259
+ allPrivileges.add(priv);
260
+ }
261
+ }
262
+ changes.push(new factories.Revoke({
263
+ [objectKey]: revokeTarget,
264
+ privileges: [...allPrivileges].map((p) => ({
265
+ privilege: p,
266
+ grantable: false,
267
+ })),
268
+ grantee,
269
+ columns: group.columns,
270
+ version,
271
+ }));
272
+ }
273
+ if (result.revokeGrantOption.length > 0) {
274
+ const sourcePrivsForGrantee = sourcePrivileges.filter((p) => p.grantee === grantee);
275
+ for (const [, group] of groupPrivilegesByColumns(sourcePrivsForGrantee.filter((p) => result.revokeGrantOption.includes(p.privilege)))) {
276
+ changes.push(new factories.RevokeGrantOption({
277
+ [objectKey]: revokeTarget,
278
+ privilegeNames: result.revokeGrantOption,
279
+ grantee,
280
+ columns: group.columns,
281
+ version,
282
+ }));
283
+ }
284
+ }
285
+ for (const [, group] of groupPrivilegesByColumns(result.grants)) {
286
+ for (const [grantable, privSet] of group.byGrant) {
287
+ changes.push(new factories.Grant({
288
+ [objectKey]: grantTarget,
289
+ privileges: [...privSet].map((p) => ({ privilege: p, grantable })),
290
+ grantee,
291
+ columns: group.columns,
292
+ version,
293
+ }));
294
+ }
295
+ }
296
+ }
297
+ return changes;
298
+ }
@@ -24,4 +24,5 @@ export declare function normalizePrivileges(privileges: PrivilegeProps[]): {
24
24
  grantee: string;
25
25
  privilege: string;
26
26
  grantable: boolean;
27
+ columns: string[] | null | undefined;
27
28
  }[];
@@ -149,7 +149,7 @@ export function getObjectKindPrefix(objectKind) {
149
149
  case "TYPE":
150
150
  return "ON TYPE";
151
151
  case "FOREIGN TABLE":
152
- return "ON FOREIGN TABLE";
152
+ return "ON TABLE";
153
153
  default:
154
154
  return "ON";
155
155
  }
@@ -160,10 +160,17 @@ export function normalizePrivileges(privileges) {
160
160
  grantee: privilege.grantee,
161
161
  privilege: privilege.privilege,
162
162
  grantable: privilege.grantable,
163
+ columns: privilege.columns
164
+ ? [...privilege.columns].sort()
165
+ : privilege.columns,
163
166
  }))
164
167
  .sort((a, b) => {
165
168
  if (a.grantee !== b.grantee)
166
169
  return a.grantee.localeCompare(b.grantee);
167
- return a.privilege.localeCompare(b.privilege);
170
+ if (a.privilege !== b.privilege)
171
+ return a.privilege.localeCompare(b.privilege);
172
+ const colA = a.columns?.join(",") ?? "";
173
+ const colB = b.columns?.join(",") ?? "";
174
+ return colA.localeCompare(colB);
168
175
  });
169
176
  }
@@ -1,3 +1,4 @@
1
+ import type { ObjectDiffContext } from "../diff-context.ts";
1
2
  import type { CollationChange } from "./changes/collation.types.ts";
2
3
  import type { Collation } from "./collation.model.ts";
3
4
  /**
@@ -8,6 +9,4 @@ import type { Collation } from "./collation.model.ts";
8
9
  * @param branch - The collations in the branch catalog.
9
10
  * @returns A list of changes to apply to main to make it match branch.
10
11
  */
11
- export declare function diffCollations(ctx: {
12
- currentUser: string;
13
- }, main: Record<string, Collation>, branch: Record<string, Collation>): CollationChange[];
12
+ export declare function diffCollations(ctx: Pick<ObjectDiffContext, "currentUser">, main: Record<string, Collation>, branch: Record<string, Collation>): CollationChange[];
@@ -1,4 +1,4 @@
1
- import type { Sql } from "postgres";
1
+ import type { Pool } from "pg";
2
2
  import z from "zod";
3
3
  import { BasePgModel } from "../base.model.ts";
4
4
  /**
@@ -63,5 +63,5 @@ export declare class Collation extends BasePgModel {
63
63
  comment: string | null;
64
64
  };
65
65
  }
66
- export declare function extractCollations(sql: Sql): Promise<Collation[]>;
66
+ export declare function extractCollations(pool: Pool): Promise<Collation[]>;
67
67
  export {};
@@ -1,3 +1,4 @@
1
+ import { sql } from "@ts-safeql/sql-tag";
1
2
  import z from "zod";
2
3
  import { extractVersion } from "../../context.js";
3
4
  import { BasePgModel } from "../base.model.js";
@@ -88,15 +89,13 @@ export class Collation extends BasePgModel {
88
89
  };
89
90
  }
90
91
  }
91
- export async function extractCollations(sql) {
92
- return sql.begin(async (sql) => {
93
- await sql `set search_path = ''`;
94
- const version = await extractVersion(sql);
95
- const isPostgres17OrGreater = version >= 170000;
96
- const isPostgres16OrGreater = version >= 160000;
97
- let collations;
98
- if (isPostgres17OrGreater) {
99
- collations = await sql `
92
+ export async function extractCollations(pool) {
93
+ const version = await extractVersion(pool);
94
+ const isPostgres17OrGreater = version >= 170000;
95
+ const isPostgres16OrGreater = version >= 160000;
96
+ let collationRows;
97
+ if (isPostgres17OrGreater) {
98
+ const result = await pool.query(sql `
100
99
  with extension_oids as (
101
100
  select
102
101
  objid
@@ -125,12 +124,13 @@ export async function extractCollations(sql) {
125
124
  where not c.collnamespace::regnamespace::text like any(array['pg\\_%', 'information\\_schema'])
126
125
  and e.objid is null
127
126
  order by
128
- 1, 2;
129
- `;
130
- }
131
- else if (isPostgres16OrGreater) {
132
- // On postgres 16 there colllocale column was named colliculocale
133
- collations = await sql `
127
+ 1, 2
128
+ `);
129
+ collationRows = result.rows;
130
+ }
131
+ else if (isPostgres16OrGreater) {
132
+ // On postgres 16 there colllocale column was named colliculocale
133
+ const result = await pool.query(sql `
134
134
  with extension_oids as (
135
135
  select
136
136
  objid
@@ -161,12 +161,13 @@ export async function extractCollations(sql) {
161
161
  and e.objid is null
162
162
  -- </EXCLUDE_INTERNAL>
163
163
  order by
164
- 1, 2;
165
- `;
166
- }
167
- else {
168
- // On postgres 15 icu_rules does not exist
169
- collations = await sql `
164
+ 1, 2
165
+ `);
166
+ collationRows = result.rows;
167
+ }
168
+ else {
169
+ // On postgres 15 icu_rules does not exist
170
+ const result = await pool.query(sql `
170
171
  with extension_oids as (
171
172
  select
172
173
  objid
@@ -197,11 +198,11 @@ export async function extractCollations(sql) {
197
198
  and e.objid is null
198
199
  -- </EXCLUDE_INTERNAL>
199
200
  order by
200
- 1, 2;
201
- `;
202
- }
203
- // Validate and parse each row using the Zod schema
204
- const validatedRows = collations.map((row) => collationPropsSchema.parse(row));
205
- return validatedRows.map((row) => new Collation(row));
206
- });
201
+ 1, 2
202
+ `);
203
+ collationRows = result.rows;
204
+ }
205
+ // Validate and parse each row using the Zod schema
206
+ const validatedRows = collationRows.map((row) => collationPropsSchema.parse(row));
207
+ return validatedRows.map((row) => new Collation(row));
207
208
  }