@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
@@ -0,0 +1,15 @@
1
+ import type { DefaultPrivilegeState } from "./base.default-privileges.ts";
2
+ import type { Role } from "./role/role.model.ts";
3
+ /**
4
+ * Unified context built by `diffCatalogs` and passed to per-object diff
5
+ * functions. Each diff declares only the keys it reads via
6
+ * `Pick<ObjectDiffContext, …>`, so every signature documents its actual
7
+ * requirements. The full object is always assignable to every narrower Pick.
8
+ */
9
+ export interface ObjectDiffContext {
10
+ version: number;
11
+ currentUser: string;
12
+ defaultPrivilegeState: DefaultPrivilegeState;
13
+ mainRoles: Record<string, Role>;
14
+ skipDefaultPrivilegeSubtraction?: boolean;
15
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -1,4 +1,4 @@
1
- import { isUserDefinedTypeSchema, stableId } from "../../utils.js";
1
+ import { isUserDefinedTypeSchema, parseTypeString, stableId, } from "../../utils.js";
2
2
  import { CreateDomainChange } from "./domain.base.js";
3
3
  /**
4
4
  * Create a domain.
@@ -58,7 +58,9 @@ export class CreateDomain extends CreateDomainChange {
58
58
  const domainName = `${this.domain.schema}.${this.domain.name}`;
59
59
  // Base type (use formatted string for type+typmod and add schema if needed)
60
60
  let baseType = this.domain.base_type_str;
61
- if (this.domain.base_type_schema &&
61
+ const alreadyQualified = parseTypeString(baseType);
62
+ if (!alreadyQualified &&
63
+ this.domain.base_type_schema &&
62
64
  this.domain.base_type_schema !== "pg_catalog") {
63
65
  baseType = `${this.domain.base_type_schema}.${baseType}`;
64
66
  }
@@ -1,5 +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 { DomainChange } from "./changes/domain.types.ts";
4
3
  import type { Domain } from "./domain.model.ts";
5
4
  /**
@@ -10,9 +9,4 @@ import type { Domain } from "./domain.model.ts";
10
9
  * @param branch - The domains in the branch catalog.
11
10
  * @returns A list of changes to apply to main to make it match branch.
12
11
  */
13
- export declare function diffDomains(ctx: {
14
- version: number;
15
- currentUser: string;
16
- defaultPrivilegeState: DefaultPrivilegeState;
17
- mainRoles: Record<string, Role>;
18
- }, main: Record<string, Domain>, branch: Record<string, Domain>): DomainChange[];
12
+ export declare function diffDomains(ctx: Pick<ObjectDiffContext, "version" | "currentUser" | "defaultPrivilegeState">, main: Record<string, Domain>, branch: Record<string, Domain>): DomainChange[];
@@ -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 { AlterDomainAddConstraint, AlterDomainChangeOwner, AlterDomainDropConstraint, AlterDomainDropDefault, AlterDomainDropNotNull, AlterDomainSetDefault, AlterDomainSetNotNull, AlterDomainValidateConstraint, } from "./changes/domain.alter.js";
4
4
  import { CreateCommentOnDomain, DropCommentOnDomain, } from "./changes/domain.comment.js";
5
5
  import { CreateDomain } from "./changes/domain.create.js";
@@ -50,50 +50,21 @@ export function diffDomains(ctx, main, branch) {
50
50
  // We compare default privileges against desired privileges to generate REVOKE/GRANT statements
51
51
  // needed to reach the final desired state.
52
52
  const effectiveDefaults = ctx.defaultPrivilegeState.getEffectiveDefaults(ctx.currentUser, "domain", newDomain.schema ?? "");
53
+ const creatorFilteredDefaults = newDomain.owner !== ctx.currentUser
54
+ ? effectiveDefaults.filter((p) => p.grantee !== ctx.currentUser)
55
+ : effectiveDefaults;
53
56
  // Filter out PUBLIC's built-in default USAGE privilege (PostgreSQL grants it automatically)
54
57
  // Reference: https://www.postgresql.org/docs/17/ddl-priv.html Table 5.2
55
58
  // This prevents generating unnecessary "GRANT USAGE TO PUBLIC" statements
56
59
  const desiredPrivileges = filterPublicBuiltInDefaults("domain", newDomain.privileges);
57
60
  // Filter out owner privileges - owner always has ALL privileges implicitly
58
61
  // and shouldn't be compared. Use the domain owner as the reference.
59
- const privilegeResults = diffPrivileges(effectiveDefaults, desiredPrivileges, newDomain.owner, ctx.mainRoles);
60
- // Generate grant changes
61
- for (const [grantee, result] of privilegeResults) {
62
- if (result.grants.length > 0) {
63
- const grantGroups = groupPrivilegesByGrantable(result.grants);
64
- for (const [grantable, list] of grantGroups) {
65
- void grantable;
66
- changes.push(new GrantDomainPrivileges({
67
- domain: newDomain,
68
- grantee,
69
- privileges: list,
70
- version: ctx.version,
71
- }));
72
- }
73
- }
74
- // Generate revoke changes
75
- if (result.revokes.length > 0) {
76
- const revokeGroups = groupPrivilegesByGrantable(result.revokes);
77
- for (const [grantable, list] of revokeGroups) {
78
- void grantable;
79
- changes.push(new RevokeDomainPrivileges({
80
- domain: newDomain,
81
- grantee,
82
- privileges: list,
83
- version: ctx.version,
84
- }));
85
- }
86
- }
87
- // Generate revoke grant option changes
88
- if (result.revokeGrantOption.length > 0) {
89
- changes.push(new RevokeGrantOptionDomainPrivileges({
90
- domain: newDomain,
91
- grantee,
92
- privilegeNames: result.revokeGrantOption,
93
- version: ctx.version,
94
- }));
95
- }
96
- }
62
+ const privilegeResults = diffPrivileges(filterPublicBuiltInDefaults("domain", creatorFilteredDefaults), desiredPrivileges, newDomain.owner);
63
+ changes.push(...emitObjectPrivilegeChanges(privilegeResults, newDomain, newDomain, "domain", {
64
+ Grant: GrantDomainPrivileges,
65
+ Revoke: RevokeDomainPrivileges,
66
+ RevokeGrantOption: RevokeGrantOptionDomainPrivileges,
67
+ }, ctx.version));
97
68
  }
98
69
  for (const domainId of dropped) {
99
70
  changes.push(new DropDomain({ domain: main[domainId] }));
@@ -201,44 +172,12 @@ export function diffDomains(ctx, main, branch) {
201
172
  const branchPrivilegesFiltered = filterPublicBuiltInDefaults("domain", branchDomain.privileges);
202
173
  // Filter out owner privileges - owner always has ALL privileges implicitly
203
174
  // and shouldn't be compared. Use branch owner as the reference.
204
- const privilegeResults = diffPrivileges(mainPrivilegesFiltered, branchPrivilegesFiltered, branchDomain.owner, ctx.mainRoles);
205
- for (const [grantee, result] of privilegeResults) {
206
- // Generate grant changes
207
- if (result.grants.length > 0) {
208
- const grantGroups = groupPrivilegesByGrantable(result.grants);
209
- for (const [grantable, list] of grantGroups) {
210
- void grantable;
211
- changes.push(new GrantDomainPrivileges({
212
- domain: branchDomain,
213
- grantee,
214
- privileges: list,
215
- version: ctx.version,
216
- }));
217
- }
218
- }
219
- // Generate revoke changes
220
- if (result.revokes.length > 0) {
221
- const revokeGroups = groupPrivilegesByGrantable(result.revokes);
222
- for (const [grantable, list] of revokeGroups) {
223
- void grantable;
224
- changes.push(new RevokeDomainPrivileges({
225
- domain: mainDomain,
226
- grantee,
227
- privileges: list,
228
- version: ctx.version,
229
- }));
230
- }
231
- }
232
- // Generate revoke grant option changes
233
- if (result.revokeGrantOption.length > 0) {
234
- changes.push(new RevokeGrantOptionDomainPrivileges({
235
- domain: mainDomain,
236
- grantee,
237
- privilegeNames: result.revokeGrantOption,
238
- version: ctx.version,
239
- }));
240
- }
241
- }
175
+ const privilegeResults = diffPrivileges(mainPrivilegesFiltered, branchPrivilegesFiltered, branchDomain.owner);
176
+ changes.push(...emitObjectPrivilegeChanges(privilegeResults, branchDomain, mainDomain, "domain", {
177
+ Grant: GrantDomainPrivileges,
178
+ Revoke: RevokeDomainPrivileges,
179
+ RevokeGrantOption: RevokeGrantOptionDomainPrivileges,
180
+ }, ctx.version));
242
181
  }
243
182
  return changes;
244
183
  }
@@ -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";
@@ -99,5 +99,5 @@ export declare class Domain extends BasePgModel {
99
99
  * @param sql - The SQL client.
100
100
  * @returns A list of domains.
101
101
  */
102
- export declare function extractDomains(sql: Sql): Promise<Domain[]>;
102
+ export declare function extractDomains(pool: Pool): Promise<Domain[]>;
103
103
  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";
@@ -98,10 +99,8 @@ export class Domain extends BasePgModel {
98
99
  * @param sql - The SQL client.
99
100
  * @returns A list of domains.
100
101
  */
101
- export async function extractDomains(sql) {
102
- return sql.begin(async (sql) => {
103
- await sql `set search_path = ''`;
104
- const domainRows = await sql `
102
+ export async function extractDomains(pool) {
103
+ const { rows: domainRows } = await pool.query(sql `
105
104
  with extension_oids as (
106
105
  select
107
106
  objid
@@ -151,7 +150,7 @@ export async function extractDomains(sql) {
151
150
  )
152
151
  order by x.grantee, x.privilege_type
153
152
  )
154
- from lateral aclexplode(t.typacl) as x(grantor, grantee, privilege_type, is_grantable)
153
+ from lateral aclexplode(COALESCE(t.typacl, acldefault('T', t.typowner))) as x(grantor, grantee, privilege_type, is_grantable)
155
154
  ), '[]'
156
155
  ) as privileges
157
156
  from
@@ -163,10 +162,9 @@ export async function extractDomains(sql) {
163
162
  and e.objid is null
164
163
  and t.typtype = 'd'
165
164
  order by
166
- 1, 2;
167
- `;
168
- // Validate and parse each row using the Zod schema
169
- const validatedRows = domainRows.map((row) => domainPropsSchema.parse(row));
170
- return validatedRows.map((row) => new Domain(row));
171
- });
165
+ 1, 2
166
+ `);
167
+ // Validate and parse each row using the Zod schema
168
+ const validatedRows = domainRows.map((row) => domainPropsSchema.parse(row));
169
+ return validatedRows.map((row) => new Domain(row));
172
170
  }
@@ -1,3 +1,4 @@
1
+ import type { ObjectDiffContext } from "../diff-context.ts";
1
2
  import type { EventTriggerChange } from "./changes/event-trigger.types.ts";
2
3
  import type { EventTrigger } from "./event-trigger.model.ts";
3
4
  /**
@@ -8,6 +9,4 @@ import type { EventTrigger } from "./event-trigger.model.ts";
8
9
  * @param branch - The event triggers 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 diffEventTriggers(ctx: {
12
- currentUser: string;
13
- }, main: Record<string, EventTrigger>, branch: Record<string, EventTrigger>): EventTriggerChange[];
12
+ export declare function diffEventTriggers(ctx: Pick<ObjectDiffContext, "currentUser">, main: Record<string, EventTrigger>, branch: Record<string, EventTrigger>): EventTriggerChange[];
@@ -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
  declare const eventTriggerPropsSchema: z.ZodObject<{
@@ -41,5 +41,5 @@ export declare class EventTrigger extends BasePgModel {
41
41
  comment: string | null;
42
42
  };
43
43
  }
44
- export declare function extractEventTriggers(sql: Sql): Promise<EventTrigger[]>;
44
+ export declare function extractEventTriggers(pool: Pool): Promise<EventTrigger[]>;
45
45
  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
  const EventTriggerEnabledSchema = z.enum([
@@ -58,10 +59,8 @@ export class EventTrigger extends BasePgModel {
58
59
  };
59
60
  }
60
61
  }
61
- export async function extractEventTriggers(sql) {
62
- return sql.begin(async (sql) => {
63
- await sql `set search_path = ''`;
64
- const rows = await sql `
62
+ export async function extractEventTriggers(pool) {
63
+ const { rows } = await pool.query(sql `
65
64
  with extension_oids as (
66
65
  select objid
67
66
  from pg_depend d
@@ -81,9 +80,8 @@ from pg_catalog.pg_event_trigger et
81
80
  join pg_catalog.pg_proc p on p.oid = et.evtfoid
82
81
  left join extension_oids e on e.objid = et.oid
83
82
  where e.objid is null
84
- order by 1;
85
- `;
86
- const validatedRows = rows.map((row) => eventTriggerPropsSchema.parse(row));
87
- return validatedRows.map((row) => new EventTrigger(row));
88
- });
83
+ order by 1
84
+ `);
85
+ const validatedRows = rows.map((row) => eventTriggerPropsSchema.parse(row));
86
+ return validatedRows.map((row) => new EventTrigger(row));
89
87
  }
@@ -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
  /**
@@ -48,5 +48,5 @@ export declare class Extension extends BasePgModel {
48
48
  comment: string | null;
49
49
  };
50
50
  }
51
- export declare function extractExtensions(sql: Sql): Promise<Extension[]>;
51
+ export declare function extractExtensions(pool: Pool): Promise<Extension[]>;
52
52
  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
  /**
@@ -65,10 +66,8 @@ export class Extension extends BasePgModel {
65
66
  }
66
67
  }
67
68
  // TODO: fetch extension dependencies so we can determine when to use CASCADE on creation
68
- export async function extractExtensions(sql) {
69
- return sql.begin(async (sql) => {
70
- await sql `set search_path = ''`;
71
- const extensionRows = await sql `
69
+ export async function extractExtensions(pool) {
70
+ const { rows: extensionRows } = await pool.query(sql `
72
71
  with extension_rows as (
73
72
  select
74
73
  e.oid,
@@ -259,10 +258,9 @@ export async function extractExtensions(sql) {
259
258
  ) as members
260
259
  from extension_rows er
261
260
  order by
262
- er.name;
263
- `;
264
- // Validate and parse each row using the Zod schema
265
- const validatedRows = extensionRows.map((row) => extensionPropsSchema.parse(row));
266
- return validatedRows.map((row) => new Extension(row));
267
- });
261
+ er.name
262
+ `);
263
+ // Validate and parse each row using the Zod schema
264
+ const validatedRows = extensionRows.map((row) => extensionPropsSchema.parse(row));
265
+ return validatedRows.map((row) => new Extension(row));
268
266
  }
@@ -1,5 +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 { ForeignDataWrapperChange } from "./changes/foreign-data-wrapper.types.ts";
4
3
  import type { ForeignDataWrapper } from "./foreign-data-wrapper.model.ts";
5
4
  /**
@@ -10,9 +9,4 @@ import type { ForeignDataWrapper } from "./foreign-data-wrapper.model.ts";
10
9
  * @param branch - The foreign data wrappers in the branch catalog.
11
10
  * @returns A list of changes to apply to main to make it match branch.
12
11
  */
13
- export declare function diffForeignDataWrappers(ctx: {
14
- version: number;
15
- currentUser: string;
16
- defaultPrivilegeState: DefaultPrivilegeState;
17
- mainRoles: Record<string, Role>;
18
- }, main: Record<string, ForeignDataWrapper>, branch: Record<string, ForeignDataWrapper>): ForeignDataWrapperChange[];
12
+ export declare function diffForeignDataWrappers(ctx: Pick<ObjectDiffContext, "version" | "currentUser">, main: Record<string, ForeignDataWrapper>, branch: Record<string, ForeignDataWrapper>): ForeignDataWrapperChange[];
@@ -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 { AlterForeignDataWrapperChangeOwner, AlterForeignDataWrapperSetOptions, } from "./changes/foreign-data-wrapper.alter.js";
4
4
  import { CreateCommentOnForeignDataWrapper, DropCommentOnForeignDataWrapper, } from "./changes/foreign-data-wrapper.comment.js";
5
5
  import { CreateForeignDataWrapper } from "./changes/foreign-data-wrapper.create.js";
@@ -37,44 +37,12 @@ export function diffForeignDataWrappers(ctx, main, branch) {
37
37
  const effectiveDefaults = [];
38
38
  const desiredPrivileges = filterPublicBuiltInDefaults("foreign_data_wrapper", createdFdw.privileges);
39
39
  // Filter out owner privileges - owner always has ALL privileges implicitly
40
- const privilegeResults = diffPrivileges(effectiveDefaults, desiredPrivileges, createdFdw.owner, ctx.mainRoles);
41
- // Generate grant changes
42
- for (const [grantee, result] of privilegeResults) {
43
- if (result.grants.length > 0) {
44
- const grantGroups = groupPrivilegesByGrantable(result.grants);
45
- for (const [grantable, list] of grantGroups) {
46
- void grantable;
47
- changes.push(new GrantForeignDataWrapperPrivileges({
48
- foreignDataWrapper: createdFdw,
49
- grantee,
50
- privileges: list,
51
- version: ctx.version,
52
- }));
53
- }
54
- }
55
- // Generate revoke changes
56
- if (result.revokes.length > 0) {
57
- const revokeGroups = groupPrivilegesByGrantable(result.revokes);
58
- for (const [grantable, list] of revokeGroups) {
59
- void grantable;
60
- changes.push(new RevokeForeignDataWrapperPrivileges({
61
- foreignDataWrapper: createdFdw,
62
- grantee,
63
- privileges: list,
64
- version: ctx.version,
65
- }));
66
- }
67
- }
68
- // Generate revoke grant option changes
69
- if (result.revokeGrantOption.length > 0) {
70
- changes.push(new RevokeGrantOptionForeignDataWrapperPrivileges({
71
- foreignDataWrapper: createdFdw,
72
- grantee,
73
- privilegeNames: result.revokeGrantOption,
74
- version: ctx.version,
75
- }));
76
- }
77
- }
40
+ const privilegeResults = diffPrivileges(effectiveDefaults, desiredPrivileges, createdFdw.owner);
41
+ changes.push(...emitObjectPrivilegeChanges(privilegeResults, createdFdw, createdFdw, "foreignDataWrapper", {
42
+ Grant: GrantForeignDataWrapperPrivileges,
43
+ Revoke: RevokeForeignDataWrapperPrivileges,
44
+ RevokeGrantOption: RevokeGrantOptionForeignDataWrapperPrivileges,
45
+ }, ctx.version));
78
46
  }
79
47
  for (const fdwId of dropped) {
80
48
  changes.push(new DropForeignDataWrapper({ foreignDataWrapper: main[fdwId] }));
@@ -133,44 +101,12 @@ export function diffForeignDataWrappers(ctx, main, branch) {
133
101
  // PRIVILEGES
134
102
  const mainPrivilegesFiltered = filterPublicBuiltInDefaults("foreign_data_wrapper", mainFdw.privileges);
135
103
  const branchPrivilegesFiltered = filterPublicBuiltInDefaults("foreign_data_wrapper", branchFdw.privileges);
136
- const privilegeResults = diffPrivileges(mainPrivilegesFiltered, branchPrivilegesFiltered, branchFdw.owner, ctx.mainRoles);
137
- for (const [grantee, result] of privilegeResults) {
138
- // Generate grant changes
139
- if (result.grants.length > 0) {
140
- const grantGroups = groupPrivilegesByGrantable(result.grants);
141
- for (const [grantable, list] of grantGroups) {
142
- void grantable;
143
- changes.push(new GrantForeignDataWrapperPrivileges({
144
- foreignDataWrapper: branchFdw,
145
- grantee,
146
- privileges: list,
147
- version: ctx.version,
148
- }));
149
- }
150
- }
151
- // Generate revoke changes
152
- if (result.revokes.length > 0) {
153
- const revokeGroups = groupPrivilegesByGrantable(result.revokes);
154
- for (const [grantable, list] of revokeGroups) {
155
- void grantable;
156
- changes.push(new RevokeForeignDataWrapperPrivileges({
157
- foreignDataWrapper: mainFdw,
158
- grantee,
159
- privileges: list,
160
- version: ctx.version,
161
- }));
162
- }
163
- }
164
- // Generate revoke grant option changes
165
- if (result.revokeGrantOption.length > 0) {
166
- changes.push(new RevokeGrantOptionForeignDataWrapperPrivileges({
167
- foreignDataWrapper: mainFdw,
168
- grantee,
169
- privilegeNames: result.revokeGrantOption,
170
- version: ctx.version,
171
- }));
172
- }
173
- }
104
+ const privilegeResults = diffPrivileges(mainPrivilegesFiltered, branchPrivilegesFiltered, branchFdw.owner);
105
+ changes.push(...emitObjectPrivilegeChanges(privilegeResults, branchFdw, mainFdw, "foreignDataWrapper", {
106
+ Grant: GrantForeignDataWrapperPrivileges,
107
+ Revoke: RevokeForeignDataWrapperPrivileges,
108
+ RevokeGrantOption: RevokeGrantOptionForeignDataWrapperPrivileges,
109
+ }, ctx.version));
174
110
  // Note: FDW renaming would also use ALTER FOREIGN DATA WRAPPER ... RENAME TO ...
175
111
  // But since our ForeignDataWrapper model uses 'name' as the identity field,
176
112
  // a name change would be handled as drop + create by diffObjects()
@@ -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";
@@ -55,5 +55,5 @@ export declare class ForeignDataWrapper extends BasePgModel {
55
55
  }[];
56
56
  };
57
57
  }
58
- export declare function extractForeignDataWrappers(sql: Sql): Promise<ForeignDataWrapper[]>;
58
+ export declare function extractForeignDataWrappers(pool: Pool): Promise<ForeignDataWrapper[]>;
59
59
  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";
@@ -59,10 +60,8 @@ export class ForeignDataWrapper extends BasePgModel {
59
60
  };
60
61
  }
61
62
  }
62
- export async function extractForeignDataWrappers(sql) {
63
- return sql.begin(async (sql) => {
64
- await sql `set search_path = ''`;
65
- const fdwRows = await sql `
63
+ export async function extractForeignDataWrappers(pool) {
64
+ const { rows: fdwRows } = await pool.query(sql `
66
65
  with extension_oids as (
67
66
  select objid
68
67
  from pg_depend d
@@ -74,11 +73,11 @@ export async function extractForeignDataWrappers(sql) {
74
73
  fdw.fdwowner::regrole::text as owner,
75
74
  case
76
75
  when fdw.fdwhandler = 0 then null
77
- else p_handler.pronamespace::regnamespace::text || '.' || quote_ident(p_handler.proname) || '(' || pg_get_function_identity_arguments(fdw.fdwhandler) || ')'
76
+ else p_handler.pronamespace::regnamespace::text || '.' || quote_ident(p_handler.proname)
78
77
  end as handler,
79
78
  case
80
79
  when fdw.fdwvalidator = 0 then null
81
- else p_validator.pronamespace::regnamespace::text || '.' || quote_ident(p_validator.proname) || '(' || pg_get_function_identity_arguments(fdw.fdwvalidator) || ')'
80
+ else p_validator.pronamespace::regnamespace::text || '.' || quote_ident(p_validator.proname)
82
81
  end as validator,
83
82
  coalesce(fdw.fdwoptions, array[]::text[]) as options,
84
83
  obj_description(fdw.oid, 'pg_foreign_data_wrapper') as comment,
@@ -104,25 +103,24 @@ export async function extractForeignDataWrappers(sql) {
104
103
  not fdw.fdwname like any(array['pg\\_%'])
105
104
  and e.objid is null
106
105
  order by
107
- fdw.fdwname;
108
- `;
109
- // Validate and parse each row using the Zod schema
110
- const validatedRows = fdwRows.map((row) => {
111
- const parsed = foreignDataWrapperPropsSchema.parse(row);
112
- // Parse options from PostgreSQL format ['key=value'] to ['key', 'value']
113
- if (parsed.options && parsed.options.length > 0) {
114
- const parsedOptions = [];
115
- for (const opt of parsed.options) {
116
- const eqIndex = opt.indexOf("=");
117
- if (eqIndex > 0) {
118
- parsedOptions.push(opt.substring(0, eqIndex));
119
- parsedOptions.push(opt.substring(eqIndex + 1));
120
- }
106
+ fdw.fdwname
107
+ `);
108
+ // Validate and parse each row using the Zod schema
109
+ const validatedRows = fdwRows.map((row) => {
110
+ const parsed = foreignDataWrapperPropsSchema.parse(row);
111
+ // Parse options from PostgreSQL format ['key=value'] to ['key', 'value']
112
+ if (parsed.options && parsed.options.length > 0) {
113
+ const parsedOptions = [];
114
+ for (const opt of parsed.options) {
115
+ const eqIndex = opt.indexOf("=");
116
+ if (eqIndex > 0) {
117
+ parsedOptions.push(opt.substring(0, eqIndex));
118
+ parsedOptions.push(opt.substring(eqIndex + 1));
121
119
  }
122
- parsed.options = parsedOptions.length > 0 ? parsedOptions : null;
123
120
  }
124
- return parsed;
125
- });
126
- return validatedRows.map((row) => new ForeignDataWrapper(row));
121
+ parsed.options = parsedOptions.length > 0 ? parsedOptions : null;
122
+ }
123
+ return parsed;
127
124
  });
125
+ return validatedRows.map((row) => new ForeignDataWrapper(row));
128
126
  }
@@ -1,5 +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 { ForeignTableChange } from "./changes/foreign-table.types.ts";
4
3
  import type { ForeignTable } from "./foreign-table.model.ts";
5
4
  /**
@@ -10,9 +9,4 @@ import type { ForeignTable } from "./foreign-table.model.ts";
10
9
  * @param branch - The foreign tables in the branch catalog.
11
10
  * @returns A list of changes to apply to main to make it match branch.
12
11
  */
13
- export declare function diffForeignTables(ctx: {
14
- version: number;
15
- currentUser: string;
16
- defaultPrivilegeState: DefaultPrivilegeState;
17
- mainRoles: Record<string, Role>;
18
- }, main: Record<string, ForeignTable>, branch: Record<string, ForeignTable>): ForeignTableChange[];
12
+ export declare function diffForeignTables(ctx: Pick<ObjectDiffContext, "version" | "currentUser" | "defaultPrivilegeState">, main: Record<string, ForeignTable>, branch: Record<string, ForeignTable>): ForeignTableChange[];