@supabase/pg-delta 1.0.0-alpha.0 → 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 (680) 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/integrations.d.ts +4 -3
  19. package/dist/cli/utils/integrations.js +25 -16
  20. package/dist/cli/utils/resolve-input.d.ts +7 -0
  21. package/dist/cli/utils/resolve-input.js +13 -0
  22. package/dist/cli/utils.d.ts +2 -0
  23. package/dist/cli/utils.js +1 -1
  24. package/dist/core/catalog-export/index.d.ts +11 -0
  25. package/dist/core/catalog-export/index.js +10 -0
  26. package/dist/core/catalog.diff.d.ts +1 -0
  27. package/dist/core/catalog.diff.js +64 -48
  28. package/dist/core/catalog.model.d.ts +16 -3
  29. package/dist/core/catalog.model.js +132 -30
  30. package/dist/core/catalog.snapshot.d.ts +66 -0
  31. package/dist/core/catalog.snapshot.js +206 -0
  32. package/dist/core/context.d.ts +3 -3
  33. package/dist/core/context.js +7 -10
  34. package/dist/core/declarative-apply/discover-sql.d.ts +18 -0
  35. package/dist/core/declarative-apply/discover-sql.js +86 -0
  36. package/dist/core/declarative-apply/extract-catalog-providers.d.ts +23 -0
  37. package/dist/core/declarative-apply/extract-catalog-providers.js +159 -0
  38. package/dist/core/declarative-apply/index.d.ts +49 -0
  39. package/dist/core/declarative-apply/index.js +134 -0
  40. package/dist/core/declarative-apply/round-apply.d.ts +100 -0
  41. package/dist/core/declarative-apply/round-apply.js +378 -0
  42. package/dist/core/depend.d.ts +2 -2
  43. package/dist/core/depend.js +8 -7
  44. package/dist/core/export/file-mapper.d.ts +71 -0
  45. package/dist/core/export/file-mapper.js +474 -0
  46. package/dist/core/export/grouper.d.ts +13 -0
  47. package/dist/core/export/grouper.js +76 -0
  48. package/dist/core/export/index.d.ts +45 -0
  49. package/dist/core/export/index.js +63 -0
  50. package/dist/core/export/types.d.ts +84 -0
  51. package/dist/core/export/types.js +25 -0
  52. package/dist/core/fingerprint.d.ts +0 -8
  53. package/dist/core/fingerprint.js +2 -2
  54. package/dist/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
  55. package/dist/core/integrations/filter/dsl.d.ts +39 -2
  56. package/dist/core/integrations/filter/dsl.js +20 -2
  57. package/dist/core/integrations/filter/extractors.js +42 -0
  58. package/dist/core/integrations/filter/filter.types.d.ts +2 -0
  59. package/dist/core/integrations/filter/filter.types.js +1 -0
  60. package/dist/core/integrations/integration-dsl.d.ts +10 -0
  61. package/dist/core/integrations/integration.types.d.ts +2 -1
  62. package/dist/core/integrations/serialize/dsl.d.ts +1 -1
  63. package/dist/core/integrations/serialize/serialize.types.d.ts +2 -0
  64. package/dist/core/integrations/serialize/serialize.types.js +1 -0
  65. package/dist/core/integrations/supabase.d.ts +18 -0
  66. package/dist/core/integrations/supabase.js +125 -0
  67. package/dist/core/objects/aggregate/aggregate.diff.d.ts +2 -8
  68. package/dist/core/objects/aggregate/aggregate.diff.js +16 -70
  69. package/dist/core/objects/aggregate/aggregate.model.d.ts +2 -2
  70. package/dist/core/objects/aggregate/aggregate.model.js +8 -10
  71. package/dist/core/objects/aggregate/changes/aggregate.create.js +1 -1
  72. package/dist/core/objects/aggregate/changes/aggregate.drop.js +1 -1
  73. package/dist/core/objects/base.privilege-diff.d.ts +38 -13
  74. package/dist/core/objects/base.privilege-diff.js +104 -22
  75. package/dist/core/objects/base.privilege.d.ts +1 -0
  76. package/dist/core/objects/base.privilege.js +9 -2
  77. package/dist/core/objects/collation/collation.diff.d.ts +2 -3
  78. package/dist/core/objects/collation/collation.model.d.ts +2 -2
  79. package/dist/core/objects/collation/collation.model.js +29 -28
  80. package/dist/core/objects/diff-context.d.ts +15 -0
  81. package/dist/core/objects/diff-context.js +1 -0
  82. package/dist/core/objects/domain/changes/domain.create.js +4 -2
  83. package/dist/core/objects/domain/domain.diff.d.ts +2 -8
  84. package/dist/core/objects/domain/domain.diff.js +16 -77
  85. package/dist/core/objects/domain/domain.model.d.ts +2 -2
  86. package/dist/core/objects/domain/domain.model.js +9 -11
  87. package/dist/core/objects/event-trigger/event-trigger.diff.d.ts +2 -3
  88. package/dist/core/objects/event-trigger/event-trigger.model.d.ts +2 -2
  89. package/dist/core/objects/event-trigger/event-trigger.model.js +7 -9
  90. package/dist/core/objects/extension/extension.model.d.ts +2 -2
  91. package/dist/core/objects/extension/extension.model.js +8 -10
  92. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.d.ts +2 -8
  93. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.js +13 -77
  94. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.d.ts +2 -2
  95. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.js +22 -24
  96. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.d.ts +2 -8
  97. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.js +16 -77
  98. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.d.ts +2 -2
  99. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.js +21 -23
  100. package/dist/core/objects/foreign-data-wrapper/server/server.diff.d.ts +2 -8
  101. package/dist/core/objects/foreign-data-wrapper/server/server.diff.js +13 -77
  102. package/dist/core/objects/foreign-data-wrapper/server/server.model.d.ts +2 -2
  103. package/dist/core/objects/foreign-data-wrapper/server/server.model.js +20 -22
  104. package/dist/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.d.ts +2 -2
  105. package/dist/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.js +20 -22
  106. package/dist/core/objects/index/index.model.d.ts +4 -4
  107. package/dist/core/objects/index/index.model.js +9 -11
  108. package/dist/core/objects/language/language.diff.d.ts +2 -5
  109. package/dist/core/objects/language/language.diff.js +7 -39
  110. package/dist/core/objects/language/language.model.js +5 -7
  111. package/dist/core/objects/materialized-view/materialized-view.diff.d.ts +2 -8
  112. package/dist/core/objects/materialized-view/materialized-view.diff.js +16 -158
  113. package/dist/core/objects/materialized-view/materialized-view.model.d.ts +2 -2
  114. package/dist/core/objects/materialized-view/materialized-view.model.js +9 -11
  115. package/dist/core/objects/procedure/changes/procedure.alter.js +12 -12
  116. package/dist/core/objects/procedure/procedure.diff.d.ts +2 -8
  117. package/dist/core/objects/procedure/procedure.diff.js +16 -77
  118. package/dist/core/objects/procedure/procedure.model.d.ts +2 -2
  119. package/dist/core/objects/procedure/procedure.model.js +9 -11
  120. package/dist/core/objects/publication/changes/publication.alter.d.ts +0 -9
  121. package/dist/core/objects/publication/changes/publication.alter.js +0 -14
  122. package/dist/core/objects/publication/changes/publication.types.d.ts +2 -2
  123. package/dist/core/objects/publication/publication.diff.d.ts +2 -3
  124. package/dist/core/objects/publication/publication.diff.js +8 -13
  125. package/dist/core/objects/publication/publication.model.d.ts +2 -2
  126. package/dist/core/objects/publication/publication.model.js +7 -9
  127. package/dist/core/objects/rls-policy/changes/rls-policy.alter.js +3 -3
  128. package/dist/core/objects/rls-policy/rls-policy.model.d.ts +2 -2
  129. package/dist/core/objects/rls-policy/rls-policy.model.js +8 -10
  130. package/dist/core/objects/role/role.diff.js +22 -1
  131. package/dist/core/objects/role/role.model.d.ts +3 -2
  132. package/dist/core/objects/role/role.model.js +146 -40
  133. package/dist/core/objects/rule/rule.model.d.ts +2 -2
  134. package/dist/core/objects/rule/rule.model.js +7 -9
  135. package/dist/core/objects/schema/schema.diff.d.ts +2 -8
  136. package/dist/core/objects/schema/schema.diff.js +16 -77
  137. package/dist/core/objects/schema/schema.model.d.ts +2 -2
  138. package/dist/core/objects/schema/schema.model.js +9 -11
  139. package/dist/core/objects/sequence/sequence.diff.d.ts +2 -8
  140. package/dist/core/objects/sequence/sequence.diff.js +16 -79
  141. package/dist/core/objects/sequence/sequence.model.d.ts +2 -2
  142. package/dist/core/objects/sequence/sequence.model.js +9 -11
  143. package/dist/core/objects/subscription/subscription.diff.d.ts +2 -3
  144. package/dist/core/objects/subscription/subscription.model.d.ts +2 -2
  145. package/dist/core/objects/subscription/subscription.model.js +25 -20
  146. package/dist/core/objects/table/changes/table.create.js +3 -0
  147. package/dist/core/objects/table/table.diff.d.ts +2 -8
  148. package/dist/core/objects/table/table.diff.js +26 -157
  149. package/dist/core/objects/table/table.model.d.ts +7 -4
  150. package/dist/core/objects/table/table.model.js +12 -11
  151. package/dist/core/objects/trigger/changes/trigger.alter.js +23 -0
  152. package/dist/core/objects/trigger/changes/trigger.create.js +4 -5
  153. package/dist/core/objects/trigger/trigger.model.d.ts +11 -2
  154. package/dist/core/objects/trigger/trigger.model.js +22 -10
  155. package/dist/core/objects/type/composite-type/composite-type.diff.d.ts +2 -8
  156. package/dist/core/objects/type/composite-type/composite-type.diff.js +16 -77
  157. package/dist/core/objects/type/composite-type/composite-type.model.d.ts +2 -2
  158. package/dist/core/objects/type/composite-type/composite-type.model.js +10 -11
  159. package/dist/core/objects/type/enum/enum.diff.d.ts +2 -8
  160. package/dist/core/objects/type/enum/enum.diff.js +25 -112
  161. package/dist/core/objects/type/enum/enum.model.d.ts +2 -2
  162. package/dist/core/objects/type/enum/enum.model.js +23 -25
  163. package/dist/core/objects/type/range/changes/range.create.js +6 -3
  164. package/dist/core/objects/type/range/range.diff.d.ts +2 -8
  165. package/dist/core/objects/type/range/range.diff.js +16 -77
  166. package/dist/core/objects/type/range/range.model.d.ts +2 -2
  167. package/dist/core/objects/type/range/range.model.js +8 -10
  168. package/dist/core/objects/view/view.diff.d.ts +2 -8
  169. package/dist/core/objects/view/view.diff.js +16 -158
  170. package/dist/core/objects/view/view.model.d.ts +17 -3
  171. package/dist/core/objects/view/view.model.js +11 -23
  172. package/dist/core/plan/apply.d.ts +2 -2
  173. package/dist/core/plan/apply.js +33 -16
  174. package/dist/core/plan/create.d.ts +20 -7
  175. package/dist/core/plan/create.js +153 -112
  176. package/dist/core/plan/index.d.ts +1 -2
  177. package/dist/core/plan/index.js +0 -1
  178. package/dist/core/plan/serialize.js +16 -4
  179. package/dist/core/plan/sql-format/constants.d.ts +2 -0
  180. package/dist/core/plan/sql-format/constants.js +11 -0
  181. package/dist/core/plan/sql-format/fixtures.d.ts +2 -0
  182. package/dist/core/plan/sql-format/fixtures.js +2447 -0
  183. package/dist/core/plan/sql-format/format-utils.d.ts +37 -0
  184. package/dist/core/plan/sql-format/format-utils.js +274 -0
  185. package/dist/core/plan/sql-format/formatters.d.ts +20 -0
  186. package/dist/core/plan/sql-format/formatters.js +737 -0
  187. package/dist/core/plan/sql-format/index.d.ts +2 -0
  188. package/dist/core/plan/sql-format/index.js +98 -0
  189. package/dist/core/plan/sql-format/keyword-case.d.ts +2 -0
  190. package/dist/core/plan/sql-format/keyword-case.js +893 -0
  191. package/dist/core/plan/sql-format/protect.d.ts +3 -0
  192. package/dist/core/plan/sql-format/protect.js +269 -0
  193. package/dist/core/plan/sql-format/sql-scanner.d.ts +59 -0
  194. package/dist/core/plan/sql-format/sql-scanner.js +202 -0
  195. package/dist/core/plan/sql-format/tokenizer.d.ts +22 -0
  196. package/dist/core/plan/sql-format/tokenizer.js +118 -0
  197. package/dist/core/plan/sql-format/types.d.ts +28 -0
  198. package/dist/core/plan/sql-format/types.js +1 -0
  199. package/dist/core/plan/sql-format/wrap.d.ts +2 -0
  200. package/dist/core/plan/sql-format/wrap.js +165 -0
  201. package/dist/core/plan/sql-format.d.ts +2 -0
  202. package/dist/core/plan/sql-format.js +1 -0
  203. package/dist/core/plan/ssl-config.d.ts +32 -0
  204. package/dist/core/plan/ssl-config.js +115 -0
  205. package/dist/core/plan/statements.d.ts +2 -1
  206. package/dist/core/plan/statements.js +6 -2
  207. package/dist/core/plan/types.d.ts +10 -15
  208. package/dist/core/postgres-config.d.ts +47 -3
  209. package/dist/core/postgres-config.js +225 -39
  210. package/dist/core/sort/graph-builder.js +10 -0
  211. package/dist/core/sort/logical-sort.js +31 -23
  212. package/dist/core/test-utils/assert-valid-sql.d.ts +10 -0
  213. package/dist/core/test-utils/assert-valid-sql.js +19 -0
  214. package/dist/index.d.ts +18 -1
  215. package/dist/index.js +16 -1
  216. package/package.json +58 -21
  217. package/src/cli/app.ts +52 -0
  218. package/src/cli/bin/cli.ts +15 -0
  219. package/src/cli/commands/apply.ts +101 -0
  220. package/src/cli/commands/catalog-export.ts +78 -0
  221. package/src/cli/commands/declarative-apply.diagnostics.test.ts +77 -0
  222. package/src/cli/commands/declarative-apply.ts +380 -0
  223. package/src/cli/commands/declarative-export.ts +330 -0
  224. package/src/cli/commands/plan.ts +216 -0
  225. package/src/cli/commands/sync.ts +185 -0
  226. package/src/cli/exit-code.test.ts +19 -0
  227. package/src/cli/exit-code.ts +7 -0
  228. package/src/cli/formatters/index.ts +5 -0
  229. package/src/cli/formatters/tree/tree-builder.ts +380 -0
  230. package/src/cli/formatters/tree/tree-renderer.ts +372 -0
  231. package/src/cli/formatters/tree/tree.ts +238 -0
  232. package/src/cli/utils/apply-display.test.ts +348 -0
  233. package/src/cli/utils/apply-display.ts +238 -0
  234. package/src/cli/utils/export-display.test.ts +103 -0
  235. package/src/cli/utils/export-display.ts +275 -0
  236. package/src/cli/utils/integrations.test.ts +44 -0
  237. package/src/cli/utils/integrations.ts +42 -0
  238. package/src/cli/utils/resolve-input.test.ts +38 -0
  239. package/src/cli/utils/resolve-input.ts +17 -0
  240. package/src/cli/utils.ts +231 -0
  241. package/src/core/catalog-export/index.ts +20 -0
  242. package/src/core/catalog.diff.ts +247 -0
  243. package/src/core/catalog.model.test.ts +122 -0
  244. package/src/core/catalog.model.ts +510 -0
  245. package/src/core/catalog.snapshot.test.ts +477 -0
  246. package/src/core/catalog.snapshot.ts +289 -0
  247. package/src/core/change.types.ts +44 -0
  248. package/src/core/context.ts +26 -0
  249. package/src/core/declarative-apply/discover-sql.test.ts +103 -0
  250. package/src/core/declarative-apply/discover-sql.ts +107 -0
  251. package/src/core/declarative-apply/extract-catalog-providers.ts +220 -0
  252. package/src/core/declarative-apply/index.test.ts +67 -0
  253. package/src/core/declarative-apply/index.ts +205 -0
  254. package/src/core/declarative-apply/round-apply.test.ts +504 -0
  255. package/src/core/declarative-apply/round-apply.ts +562 -0
  256. package/src/core/depend.ts +1870 -0
  257. package/src/core/expand-replace-dependencies.test.ts +70 -0
  258. package/src/core/expand-replace-dependencies.ts +380 -0
  259. package/src/core/export/file-mapper.test.ts +816 -0
  260. package/src/core/export/file-mapper.ts +574 -0
  261. package/src/core/export/grouper.ts +108 -0
  262. package/src/core/export/index.ts +129 -0
  263. package/src/core/export/types.ts +104 -0
  264. package/src/core/fingerprint.ts +204 -0
  265. package/src/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
  266. package/src/core/integrations/filter/dsl.test.ts +211 -0
  267. package/src/core/integrations/filter/dsl.ts +266 -0
  268. package/src/core/integrations/filter/extractors.test.ts +244 -0
  269. package/src/core/integrations/filter/extractors.ts +187 -0
  270. package/src/core/integrations/filter/filter.types.ts +3 -0
  271. package/src/core/integrations/integration-dsl.ts +34 -0
  272. package/src/core/integrations/integration.types.ts +7 -0
  273. package/src/core/integrations/serialize/dsl.test.ts +91 -0
  274. package/src/core/integrations/serialize/dsl.ts +77 -0
  275. package/src/core/integrations/serialize/serialize.types.ts +3 -0
  276. package/src/core/integrations/supabase.ts +130 -0
  277. package/src/core/objects/aggregate/aggregate.diff.test.ts +215 -0
  278. package/src/core/objects/aggregate/aggregate.diff.ts +222 -0
  279. package/src/core/objects/aggregate/aggregate.model.ts +317 -0
  280. package/src/core/objects/aggregate/changes/aggregate.alter.test.ts +66 -0
  281. package/src/core/objects/aggregate/changes/aggregate.alter.ts +32 -0
  282. package/src/core/objects/aggregate/changes/aggregate.base.ts +20 -0
  283. package/src/core/objects/aggregate/changes/aggregate.comment.test.ts +89 -0
  284. package/src/core/objects/aggregate/changes/aggregate.comment.ts +62 -0
  285. package/src/core/objects/aggregate/changes/aggregate.create.test.ts +104 -0
  286. package/src/core/objects/aggregate/changes/aggregate.create.ts +329 -0
  287. package/src/core/objects/aggregate/changes/aggregate.drop.test.ts +82 -0
  288. package/src/core/objects/aggregate/changes/aggregate.drop.ts +32 -0
  289. package/src/core/objects/aggregate/changes/aggregate.privilege.test.ts +136 -0
  290. package/src/core/objects/aggregate/changes/aggregate.privilege.ts +146 -0
  291. package/src/core/objects/aggregate/changes/aggregate.types.ts +12 -0
  292. package/src/core/objects/base.change.ts +62 -0
  293. package/src/core/objects/base.default-privileges.ts +204 -0
  294. package/src/core/objects/base.diff.ts +20 -0
  295. package/src/core/objects/base.model.ts +82 -0
  296. package/src/core/objects/base.privilege-diff.ts +447 -0
  297. package/src/core/objects/base.privilege.ts +191 -0
  298. package/src/core/objects/collation/changes/collation.alter.test.ts +68 -0
  299. package/src/core/objects/collation/changes/collation.alter.ts +79 -0
  300. package/src/core/objects/collation/changes/collation.base.ts +20 -0
  301. package/src/core/objects/collation/changes/collation.comment.ts +68 -0
  302. package/src/core/objects/collation/changes/collation.create.test.ts +56 -0
  303. package/src/core/objects/collation/changes/collation.create.ts +106 -0
  304. package/src/core/objects/collation/changes/collation.drop.test.ts +31 -0
  305. package/src/core/objects/collation/changes/collation.drop.ts +37 -0
  306. package/src/core/objects/collation/changes/collation.types.ts +10 -0
  307. package/src/core/objects/collation/collation.diff.test.ts +97 -0
  308. package/src/core/objects/collation/collation.diff.ts +127 -0
  309. package/src/core/objects/collation/collation.model.ts +224 -0
  310. package/src/core/objects/diff-context.ts +16 -0
  311. package/src/core/objects/domain/changes/domain.alter.test.ts +335 -0
  312. package/src/core/objects/domain/changes/domain.alter.ts +286 -0
  313. package/src/core/objects/domain/changes/domain.base.ts +20 -0
  314. package/src/core/objects/domain/changes/domain.comment.ts +59 -0
  315. package/src/core/objects/domain/changes/domain.create.test.ts +95 -0
  316. package/src/core/objects/domain/changes/domain.create.ts +124 -0
  317. package/src/core/objects/domain/changes/domain.drop.test.ts +33 -0
  318. package/src/core/objects/domain/changes/domain.drop.ts +34 -0
  319. package/src/core/objects/domain/changes/domain.privilege.ts +171 -0
  320. package/src/core/objects/domain/changes/domain.types.ts +12 -0
  321. package/src/core/objects/domain/domain.diff.test.ts +284 -0
  322. package/src/core/objects/domain/domain.diff.ts +295 -0
  323. package/src/core/objects/domain/domain.model.ts +190 -0
  324. package/src/core/objects/event-trigger/changes/event-trigger.alter.test.ts +57 -0
  325. package/src/core/objects/event-trigger/changes/event-trigger.alter.ts +82 -0
  326. package/src/core/objects/event-trigger/changes/event-trigger.base.ts +20 -0
  327. package/src/core/objects/event-trigger/changes/event-trigger.comment.ts +66 -0
  328. package/src/core/objects/event-trigger/changes/event-trigger.create.test.ts +27 -0
  329. package/src/core/objects/event-trigger/changes/event-trigger.create.ts +72 -0
  330. package/src/core/objects/event-trigger/changes/event-trigger.drop.test.ts +25 -0
  331. package/src/core/objects/event-trigger/changes/event-trigger.drop.ts +34 -0
  332. package/src/core/objects/event-trigger/changes/event-trigger.types.ts +10 -0
  333. package/src/core/objects/event-trigger/event-trigger.diff.test.ts +131 -0
  334. package/src/core/objects/event-trigger/event-trigger.diff.ts +127 -0
  335. package/src/core/objects/event-trigger/event-trigger.model.ts +106 -0
  336. package/src/core/objects/extension/changes/extension.alter.test.ts +63 -0
  337. package/src/core/objects/extension/changes/extension.alter.ts +78 -0
  338. package/src/core/objects/extension/changes/extension.base.ts +20 -0
  339. package/src/core/objects/extension/changes/extension.comment.ts +64 -0
  340. package/src/core/objects/extension/changes/extension.create.test.ts +28 -0
  341. package/src/core/objects/extension/changes/extension.create.ts +63 -0
  342. package/src/core/objects/extension/changes/extension.drop.test.ts +26 -0
  343. package/src/core/objects/extension/changes/extension.drop.ts +34 -0
  344. package/src/core/objects/extension/changes/extension.types.ts +10 -0
  345. package/src/core/objects/extension/extension.diff.test.ts +42 -0
  346. package/src/core/objects/extension/extension.diff.ts +90 -0
  347. package/src/core/objects/extension/extension.model.test.ts +98 -0
  348. package/src/core/objects/extension/extension.model.ts +280 -0
  349. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.test.ts +136 -0
  350. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.ts +101 -0
  351. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.base.ts +20 -0
  352. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.ts +72 -0
  353. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.test.ts +160 -0
  354. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.ts +95 -0
  355. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.test.ts +26 -0
  356. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.ts +36 -0
  357. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.ts +172 -0
  358. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.ts +12 -0
  359. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.test.ts +286 -0
  360. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.ts +271 -0
  361. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.ts +149 -0
  362. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.ts +10 -0
  363. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.test.ts +340 -0
  364. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.ts +341 -0
  365. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.base.ts +20 -0
  366. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.ts +72 -0
  367. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.test.ts +210 -0
  368. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.ts +81 -0
  369. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.test.ts +46 -0
  370. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.ts +37 -0
  371. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.ts +181 -0
  372. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.ts +12 -0
  373. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.test.ts +813 -0
  374. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.ts +343 -0
  375. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.ts +242 -0
  376. package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.test.ts +183 -0
  377. package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.ts +126 -0
  378. package/src/core/objects/foreign-data-wrapper/server/changes/server.base.ts +20 -0
  379. package/src/core/objects/foreign-data-wrapper/server/changes/server.comment.ts +60 -0
  380. package/src/core/objects/foreign-data-wrapper/server/changes/server.create.test.ts +144 -0
  381. package/src/core/objects/foreign-data-wrapper/server/changes/server.create.ts +81 -0
  382. package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.test.ts +27 -0
  383. package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.ts +34 -0
  384. package/src/core/objects/foreign-data-wrapper/server/changes/server.privilege.ts +164 -0
  385. package/src/core/objects/foreign-data-wrapper/server/changes/server.types.ts +12 -0
  386. package/src/core/objects/foreign-data-wrapper/server/server.diff.test.ts +262 -0
  387. package/src/core/objects/foreign-data-wrapper/server/server.diff.ts +247 -0
  388. package/src/core/objects/foreign-data-wrapper/server/server.model.ts +133 -0
  389. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.test.ts +91 -0
  390. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.ts +69 -0
  391. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.base.ts +20 -0
  392. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.test.ts +96 -0
  393. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.ts +66 -0
  394. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.test.ts +60 -0
  395. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.ts +40 -0
  396. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.ts +8 -0
  397. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.test.ts +77 -0
  398. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.ts +107 -0
  399. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.ts +96 -0
  400. package/src/core/objects/index/changes/index.alter.test.ts +209 -0
  401. package/src/core/objects/index/changes/index.alter.ts +144 -0
  402. package/src/core/objects/index/changes/index.base.ts +20 -0
  403. package/src/core/objects/index/changes/index.comment.ts +63 -0
  404. package/src/core/objects/index/changes/index.create.test.ts +69 -0
  405. package/src/core/objects/index/changes/index.create.ts +68 -0
  406. package/src/core/objects/index/changes/index.drop.test.ts +47 -0
  407. package/src/core/objects/index/changes/index.drop.ts +34 -0
  408. package/src/core/objects/index/changes/index.types.ts +6 -0
  409. package/src/core/objects/index/changes/utils.ts +16 -0
  410. package/src/core/objects/index/index.diff.test.ts +153 -0
  411. package/src/core/objects/index/index.diff.ts +243 -0
  412. package/src/core/objects/index/index.model.ts +370 -0
  413. package/src/core/objects/language/changes/language.alter.test.ts +36 -0
  414. package/src/core/objects/language/changes/language.alter.ts +53 -0
  415. package/src/core/objects/language/changes/language.base.ts +20 -0
  416. package/src/core/objects/language/changes/language.comment.ts +58 -0
  417. package/src/core/objects/language/changes/language.create.test.ts +30 -0
  418. package/src/core/objects/language/changes/language.create.ts +104 -0
  419. package/src/core/objects/language/changes/language.drop.test.ts +28 -0
  420. package/src/core/objects/language/changes/language.drop.ts +39 -0
  421. package/src/core/objects/language/changes/language.privilege.ts +172 -0
  422. package/src/core/objects/language/changes/language.types.ts +12 -0
  423. package/src/core/objects/language/language.diff.test.ts +135 -0
  424. package/src/core/objects/language/language.diff.ts +144 -0
  425. package/src/core/objects/language/language.model.ts +150 -0
  426. package/src/core/objects/materialized-view/changes/materialized-view.alter.test.ts +130 -0
  427. package/src/core/objects/materialized-view/changes/materialized-view.alter.ts +113 -0
  428. package/src/core/objects/materialized-view/changes/materialized-view.base.ts +20 -0
  429. package/src/core/objects/materialized-view/changes/materialized-view.comment.ts +176 -0
  430. package/src/core/objects/materialized-view/changes/materialized-view.create.test.ts +69 -0
  431. package/src/core/objects/materialized-view/changes/materialized-view.create.ts +93 -0
  432. package/src/core/objects/materialized-view/changes/materialized-view.drop.test.ts +37 -0
  433. package/src/core/objects/materialized-view/changes/materialized-view.drop.ts +60 -0
  434. package/src/core/objects/materialized-view/changes/materialized-view.privilege.ts +212 -0
  435. package/src/core/objects/materialized-view/changes/materialized-view.types.ts +12 -0
  436. package/src/core/objects/materialized-view/materialized-view.diff.test.ts +264 -0
  437. package/src/core/objects/materialized-view/materialized-view.diff.ts +301 -0
  438. package/src/core/objects/materialized-view/materialized-view.model.ts +258 -0
  439. package/src/core/objects/procedure/changes/procedure.alter.test.ts +1077 -0
  440. package/src/core/objects/procedure/changes/procedure.alter.ts +290 -0
  441. package/src/core/objects/procedure/changes/procedure.base.ts +20 -0
  442. package/src/core/objects/procedure/changes/procedure.comment.ts +70 -0
  443. package/src/core/objects/procedure/changes/procedure.create.test.ts +51 -0
  444. package/src/core/objects/procedure/changes/procedure.create.ts +92 -0
  445. package/src/core/objects/procedure/changes/procedure.drop.test.ts +90 -0
  446. package/src/core/objects/procedure/changes/procedure.drop.ts +49 -0
  447. package/src/core/objects/procedure/changes/procedure.privilege.ts +188 -0
  448. package/src/core/objects/procedure/changes/procedure.types.ts +12 -0
  449. package/src/core/objects/procedure/procedure.diff.test.ts +161 -0
  450. package/src/core/objects/procedure/procedure.diff.ts +341 -0
  451. package/src/core/objects/procedure/procedure.model.ts +264 -0
  452. package/src/core/objects/procedure/utils.ts +58 -0
  453. package/src/core/objects/publication/changes/publication.alter.test.ts +217 -0
  454. package/src/core/objects/publication/changes/publication.alter.ts +225 -0
  455. package/src/core/objects/publication/changes/publication.base.ts +20 -0
  456. package/src/core/objects/publication/changes/publication.comment.test.ts +73 -0
  457. package/src/core/objects/publication/changes/publication.comment.ts +64 -0
  458. package/src/core/objects/publication/changes/publication.create.test.ts +90 -0
  459. package/src/core/objects/publication/changes/publication.create.ts +82 -0
  460. package/src/core/objects/publication/changes/publication.drop.test.ts +48 -0
  461. package/src/core/objects/publication/changes/publication.drop.ts +29 -0
  462. package/src/core/objects/publication/changes/publication.types.ts +24 -0
  463. package/src/core/objects/publication/publication.diff.test.ts +297 -0
  464. package/src/core/objects/publication/publication.diff.ts +247 -0
  465. package/src/core/objects/publication/publication.model.ts +206 -0
  466. package/src/core/objects/publication/utils.ts +55 -0
  467. package/src/core/objects/rls-policy/changes/rls-policy.alter.test.ts +267 -0
  468. package/src/core/objects/rls-policy/changes/rls-policy.alter.ts +128 -0
  469. package/src/core/objects/rls-policy/changes/rls-policy.base.ts +20 -0
  470. package/src/core/objects/rls-policy/changes/rls-policy.comment.ts +69 -0
  471. package/src/core/objects/rls-policy/changes/rls-policy.create.test.ts +81 -0
  472. package/src/core/objects/rls-policy/changes/rls-policy.create.ts +100 -0
  473. package/src/core/objects/rls-policy/changes/rls-policy.drop.test.ts +31 -0
  474. package/src/core/objects/rls-policy/changes/rls-policy.drop.ts +39 -0
  475. package/src/core/objects/rls-policy/changes/rls-policy.types.ts +10 -0
  476. package/src/core/objects/rls-policy/rls-policy.diff.test.ts +79 -0
  477. package/src/core/objects/rls-policy/rls-policy.diff.ts +121 -0
  478. package/src/core/objects/rls-policy/rls-policy.model.ts +140 -0
  479. package/src/core/objects/role/changes/role.alter.test.ts +362 -0
  480. package/src/core/objects/role/changes/role.alter.ts +110 -0
  481. package/src/core/objects/role/changes/role.base.ts +24 -0
  482. package/src/core/objects/role/changes/role.comment.ts +55 -0
  483. package/src/core/objects/role/changes/role.create.test.ts +56 -0
  484. package/src/core/objects/role/changes/role.create.ts +102 -0
  485. package/src/core/objects/role/changes/role.drop.test.ts +32 -0
  486. package/src/core/objects/role/changes/role.drop.ts +34 -0
  487. package/src/core/objects/role/changes/role.privilege.ts +376 -0
  488. package/src/core/objects/role/changes/role.types.ts +12 -0
  489. package/src/core/objects/role/role.diff.test.ts +279 -0
  490. package/src/core/objects/role/role.diff.ts +499 -0
  491. package/src/core/objects/role/role.model.ts +452 -0
  492. package/src/core/objects/rule/changes/rule.alter.test.ts +82 -0
  493. package/src/core/objects/rule/changes/rule.alter.ts +72 -0
  494. package/src/core/objects/rule/changes/rule.base.ts +20 -0
  495. package/src/core/objects/rule/changes/rule.comment.test.ts +58 -0
  496. package/src/core/objects/rule/changes/rule.comment.ts +62 -0
  497. package/src/core/objects/rule/changes/rule.create.test.ts +63 -0
  498. package/src/core/objects/rule/changes/rule.create.ts +42 -0
  499. package/src/core/objects/rule/changes/rule.drop.test.ts +40 -0
  500. package/src/core/objects/rule/changes/rule.drop.ts +29 -0
  501. package/src/core/objects/rule/changes/rule.types.ts +12 -0
  502. package/src/core/objects/rule/rule.diff.test.ts +132 -0
  503. package/src/core/objects/rule/rule.diff.ts +79 -0
  504. package/src/core/objects/rule/rule.model.ts +173 -0
  505. package/src/core/objects/schema/changes/schema.alter.test.ts +31 -0
  506. package/src/core/objects/schema/changes/schema.alter.ts +45 -0
  507. package/src/core/objects/schema/changes/schema.base.ts +20 -0
  508. package/src/core/objects/schema/changes/schema.comment.ts +56 -0
  509. package/src/core/objects/schema/changes/schema.create.test.ts +25 -0
  510. package/src/core/objects/schema/changes/schema.create.ts +47 -0
  511. package/src/core/objects/schema/changes/schema.drop.test.ts +23 -0
  512. package/src/core/objects/schema/changes/schema.drop.ts +34 -0
  513. package/src/core/objects/schema/changes/schema.privilege.ts +175 -0
  514. package/src/core/objects/schema/changes/schema.types.ts +12 -0
  515. package/src/core/objects/schema/schema.diff.test.ts +42 -0
  516. package/src/core/objects/schema/schema.diff.ts +146 -0
  517. package/src/core/objects/schema/schema.model.ts +107 -0
  518. package/src/core/objects/sequence/changes/sequence.alter.test.ts +157 -0
  519. package/src/core/objects/sequence/changes/sequence.alter.ts +115 -0
  520. package/src/core/objects/sequence/changes/sequence.base.ts +20 -0
  521. package/src/core/objects/sequence/changes/sequence.comment.ts +60 -0
  522. package/src/core/objects/sequence/changes/sequence.create.test.ts +89 -0
  523. package/src/core/objects/sequence/changes/sequence.create.ts +111 -0
  524. package/src/core/objects/sequence/changes/sequence.drop.test.ts +35 -0
  525. package/src/core/objects/sequence/changes/sequence.drop.ts +37 -0
  526. package/src/core/objects/sequence/changes/sequence.privilege.ts +179 -0
  527. package/src/core/objects/sequence/changes/sequence.types.ts +12 -0
  528. package/src/core/objects/sequence/sequence.diff.test.ts +255 -0
  529. package/src/core/objects/sequence/sequence.diff.ts +294 -0
  530. package/src/core/objects/sequence/sequence.model.ts +185 -0
  531. package/src/core/objects/subscription/changes/subscription.alter.test.ts +134 -0
  532. package/src/core/objects/subscription/changes/subscription.alter.ts +110 -0
  533. package/src/core/objects/subscription/changes/subscription.base.ts +20 -0
  534. package/src/core/objects/subscription/changes/subscription.comment.test.ts +70 -0
  535. package/src/core/objects/subscription/changes/subscription.comment.ts +64 -0
  536. package/src/core/objects/subscription/changes/subscription.create.test.ts +80 -0
  537. package/src/core/objects/subscription/changes/subscription.create.ts +69 -0
  538. package/src/core/objects/subscription/changes/subscription.drop.test.ts +48 -0
  539. package/src/core/objects/subscription/changes/subscription.drop.ts +20 -0
  540. package/src/core/objects/subscription/changes/subscription.types.ts +22 -0
  541. package/src/core/objects/subscription/subscription.diff.test.ts +237 -0
  542. package/src/core/objects/subscription/subscription.diff.ts +242 -0
  543. package/src/core/objects/subscription/subscription.model.ts +190 -0
  544. package/src/core/objects/subscription/utils.ts +156 -0
  545. package/src/core/objects/table/changes/table.alter.test.ts +846 -0
  546. package/src/core/objects/table/changes/table.alter.ts +806 -0
  547. package/src/core/objects/table/changes/table.base.ts +20 -0
  548. package/src/core/objects/table/changes/table.comment.ts +266 -0
  549. package/src/core/objects/table/changes/table.create.test.ts +188 -0
  550. package/src/core/objects/table/changes/table.create.ts +192 -0
  551. package/src/core/objects/table/changes/table.drop.test.ts +36 -0
  552. package/src/core/objects/table/changes/table.drop.ts +45 -0
  553. package/src/core/objects/table/changes/table.privilege.ts +200 -0
  554. package/src/core/objects/table/changes/table.types.ts +12 -0
  555. package/src/core/objects/table/table.diff.test.ts +868 -0
  556. package/src/core/objects/table/table.diff.ts +817 -0
  557. package/src/core/objects/table/table.model.ts +460 -0
  558. package/src/core/objects/trigger/changes/trigger.alter.test.ts +50 -0
  559. package/src/core/objects/trigger/changes/trigger.alter.ts +76 -0
  560. package/src/core/objects/trigger/changes/trigger.base.ts +20 -0
  561. package/src/core/objects/trigger/changes/trigger.comment.ts +64 -0
  562. package/src/core/objects/trigger/changes/trigger.create.test.ts +47 -0
  563. package/src/core/objects/trigger/changes/trigger.create.ts +88 -0
  564. package/src/core/objects/trigger/changes/trigger.drop.test.ts +47 -0
  565. package/src/core/objects/trigger/changes/trigger.drop.ts +39 -0
  566. package/src/core/objects/trigger/changes/trigger.types.ts +10 -0
  567. package/src/core/objects/trigger/trigger.diff.test.ts +84 -0
  568. package/src/core/objects/trigger/trigger.diff.ts +116 -0
  569. package/src/core/objects/trigger/trigger.model.ts +264 -0
  570. package/src/core/objects/type/composite-type/changes/composite-type.alter.test.ts +208 -0
  571. package/src/core/objects/type/composite-type/changes/composite-type.alter.ts +174 -0
  572. package/src/core/objects/type/composite-type/changes/composite-type.base.ts +20 -0
  573. package/src/core/objects/type/composite-type/changes/composite-type.comment.ts +145 -0
  574. package/src/core/objects/type/composite-type/changes/composite-type.create.test.ts +106 -0
  575. package/src/core/objects/type/composite-type/changes/composite-type.create.ts +95 -0
  576. package/src/core/objects/type/composite-type/changes/composite-type.drop.test.ts +36 -0
  577. package/src/core/objects/type/composite-type/changes/composite-type.drop.ts +37 -0
  578. package/src/core/objects/type/composite-type/changes/composite-type.privilege.ts +175 -0
  579. package/src/core/objects/type/composite-type/changes/composite-type.types.ts +12 -0
  580. package/src/core/objects/type/composite-type/composite-type.diff.test.ts +269 -0
  581. package/src/core/objects/type/composite-type/composite-type.diff.ts +310 -0
  582. package/src/core/objects/type/composite-type/composite-type.model.ts +253 -0
  583. package/src/core/objects/type/enum/changes/enum.alter.test.ts +113 -0
  584. package/src/core/objects/type/enum/changes/enum.alter.ts +91 -0
  585. package/src/core/objects/type/enum/changes/enum.base.ts +20 -0
  586. package/src/core/objects/type/enum/changes/enum.comment.ts +64 -0
  587. package/src/core/objects/type/enum/changes/enum.create.test.ts +31 -0
  588. package/src/core/objects/type/enum/changes/enum.create.ts +56 -0
  589. package/src/core/objects/type/enum/changes/enum.drop.test.ts +28 -0
  590. package/src/core/objects/type/enum/changes/enum.drop.ts +34 -0
  591. package/src/core/objects/type/enum/changes/enum.privilege.ts +175 -0
  592. package/src/core/objects/type/enum/changes/enum.types.ts +12 -0
  593. package/src/core/objects/type/enum/enum.diff.test.ts +372 -0
  594. package/src/core/objects/type/enum/enum.diff.ts +308 -0
  595. package/src/core/objects/type/enum/enum.model.ts +194 -0
  596. package/src/core/objects/type/range/changes/range.alter.test.ts +29 -0
  597. package/src/core/objects/type/range/changes/range.alter.ts +51 -0
  598. package/src/core/objects/type/range/changes/range.base.ts +20 -0
  599. package/src/core/objects/type/range/changes/range.comment.ts +64 -0
  600. package/src/core/objects/type/range/changes/range.create.test.ts +54 -0
  601. package/src/core/objects/type/range/changes/range.create.ts +155 -0
  602. package/src/core/objects/type/range/changes/range.drop.test.ts +28 -0
  603. package/src/core/objects/type/range/changes/range.drop.ts +34 -0
  604. package/src/core/objects/type/range/changes/range.privilege.ts +175 -0
  605. package/src/core/objects/type/range/changes/range.types.ts +12 -0
  606. package/src/core/objects/type/range/range.diff.test.ts +147 -0
  607. package/src/core/objects/type/range/range.diff.ts +197 -0
  608. package/src/core/objects/type/range/range.model.ts +187 -0
  609. package/src/core/objects/type/type.types.ts +5 -0
  610. package/src/core/objects/utils.ts +171 -0
  611. package/src/core/objects/view/changes/view.alter.test.ts +115 -0
  612. package/src/core/objects/view/changes/view.alter.ts +112 -0
  613. package/src/core/objects/view/changes/view.base.ts +20 -0
  614. package/src/core/objects/view/changes/view.comment.ts +59 -0
  615. package/src/core/objects/view/changes/view.create.test.ts +70 -0
  616. package/src/core/objects/view/changes/view.create.ts +73 -0
  617. package/src/core/objects/view/changes/view.drop.test.ts +37 -0
  618. package/src/core/objects/view/changes/view.drop.ts +40 -0
  619. package/src/core/objects/view/changes/view.privilege.ts +200 -0
  620. package/src/core/objects/view/changes/view.types.ts +12 -0
  621. package/src/core/objects/view/view.diff.test.ts +173 -0
  622. package/src/core/objects/view/view.diff.ts +215 -0
  623. package/src/core/objects/view/view.model.ts +262 -0
  624. package/src/core/plan/apply.ts +172 -0
  625. package/src/core/plan/create.ts +384 -0
  626. package/src/core/plan/hierarchy.ts +574 -0
  627. package/src/core/plan/index.ts +29 -0
  628. package/src/core/plan/io.ts +20 -0
  629. package/src/core/plan/risk.ts +48 -0
  630. package/src/core/plan/serialize.test.ts +317 -0
  631. package/src/core/plan/serialize.ts +209 -0
  632. package/src/core/plan/sql-format/constants.ts +13 -0
  633. package/src/core/plan/sql-format/fixtures.ts +2803 -0
  634. package/src/core/plan/sql-format/format-comment-literals.test.ts +96 -0
  635. package/src/core/plan/sql-format/format-functions.test.ts +127 -0
  636. package/src/core/plan/sql-format/format-lowercase-coverage.test.ts +119 -0
  637. package/src/core/plan/sql-format/format-off.test.ts +806 -0
  638. package/src/core/plan/sql-format/format-pretty-lower-leading.test.ts +1061 -0
  639. package/src/core/plan/sql-format/format-pretty-narrow.test.ts +1279 -0
  640. package/src/core/plan/sql-format/format-pretty-preserve.test.ts +1057 -0
  641. package/src/core/plan/sql-format/format-pretty-upper.test.ts +1048 -0
  642. package/src/core/plan/sql-format/format-stress.test.ts +616 -0
  643. package/src/core/plan/sql-format/format-utils.test.ts +91 -0
  644. package/src/core/plan/sql-format/format-utils.ts +391 -0
  645. package/src/core/plan/sql-format/formatters.ts +921 -0
  646. package/src/core/plan/sql-format/index.ts +149 -0
  647. package/src/core/plan/sql-format/keyword-case.test.ts +118 -0
  648. package/src/core/plan/sql-format/keyword-case.ts +1120 -0
  649. package/src/core/plan/sql-format/protect.test.ts +127 -0
  650. package/src/core/plan/sql-format/protect.ts +337 -0
  651. package/src/core/plan/sql-format/sql-scanner.test.ts +240 -0
  652. package/src/core/plan/sql-format/sql-scanner.ts +252 -0
  653. package/src/core/plan/sql-format/tokenizer.test.ts +68 -0
  654. package/src/core/plan/sql-format/tokenizer.ts +152 -0
  655. package/src/core/plan/sql-format/types.ts +31 -0
  656. package/src/core/plan/sql-format/wrap.test.ts +119 -0
  657. package/src/core/plan/sql-format/wrap.ts +196 -0
  658. package/src/core/plan/sql-format.ts +2 -0
  659. package/src/core/plan/ssl-config.ts +172 -0
  660. package/src/core/plan/statements.ts +22 -0
  661. package/src/core/plan/types.ts +171 -0
  662. package/src/core/postgres-config.ts +293 -0
  663. package/src/core/sort/custom-constraints.ts +161 -0
  664. package/src/core/sort/debug-visualization.ts +239 -0
  665. package/src/core/sort/dependency-filter.ts +224 -0
  666. package/src/core/sort/graph-builder.ts +235 -0
  667. package/src/core/sort/graph-utils.ts +51 -0
  668. package/src/core/sort/logical-sort.test.ts +371 -0
  669. package/src/core/sort/logical-sort.ts +597 -0
  670. package/src/core/sort/sort-changes.ts +234 -0
  671. package/src/core/sort/topological-sort.test.ts +275 -0
  672. package/src/core/sort/topological-sort.ts +184 -0
  673. package/src/core/sort/types.ts +112 -0
  674. package/src/core/sort/utils.ts +69 -0
  675. package/src/core/test-utils/assert-valid-sql.ts +20 -0
  676. package/src/index.ts +41 -0
  677. package/dist/core/index.d.ts +0 -15
  678. package/dist/core/index.js +0 -14
  679. package/dist/core/main.d.ts +0 -5
  680. package/dist/core/main.js +0 -44
@@ -1,6 +1,6 @@
1
1
  import { diffObjects } from "../base.diff.js";
2
2
  import { deepEqual } from "../utils.js";
3
- import { AlterPublicationAddSchemas, AlterPublicationAddTables, AlterPublicationDropSchemas, AlterPublicationDropTables, AlterPublicationSetForAllTables, AlterPublicationSetOptions, AlterPublicationSetOwner, } from "./changes/publication.alter.js";
3
+ import { AlterPublicationAddSchemas, AlterPublicationAddTables, AlterPublicationDropSchemas, AlterPublicationDropTables, AlterPublicationSetOptions, AlterPublicationSetOwner, } from "./changes/publication.alter.js";
4
4
  import { CreateCommentOnPublication, DropCommentOnPublication, } from "./changes/publication.comment.js";
5
5
  import { CreatePublication } from "./changes/publication.create.js";
6
6
  import { DropPublication } from "./changes/publication.drop.js";
@@ -52,21 +52,16 @@ export function diffPublications(ctx, main, branch) {
52
52
  let handledObjectLists = false;
53
53
  if (mainPublication.all_tables !== branchPublication.all_tables) {
54
54
  handledObjectLists = true;
55
- if (branchPublication.all_tables) {
56
- changes.push(new AlterPublicationSetForAllTables({
55
+ // Changing the all_tables mode requires DROP + CREATE because
56
+ // ALTER PUBLICATION does not support SET ALL TABLES.
57
+ changes.push(new DropPublication({ publication: mainPublication }));
58
+ changes.push(new CreatePublication({ publication: branchPublication }));
59
+ if (branchPublication.comment !== null) {
60
+ changes.push(new CreateCommentOnPublication({
57
61
  publication: branchPublication,
58
62
  }));
59
63
  }
60
- else {
61
- changes.push(new DropPublication({ publication: mainPublication }));
62
- changes.push(new CreatePublication({ publication: branchPublication }));
63
- if (branchPublication.comment !== null) {
64
- changes.push(new CreateCommentOnPublication({
65
- publication: branchPublication,
66
- }));
67
- }
68
- continue;
69
- }
64
+ continue;
70
65
  }
71
66
  if (!handledObjectLists && !branchPublication.all_tables) {
72
67
  const tableDiff = diffPublicationTables(mainPublication.tables, branchPublication.tables);
@@ -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 publicationTablePropsSchema: z.ZodObject<{
@@ -92,5 +92,5 @@ export declare class Publication extends BasePgModel {
92
92
  /**
93
93
  * Extract all logical replication publications from the database.
94
94
  */
95
- export declare function extractPublications(sql: Sql): Promise<Publication[]>;
95
+ export declare function extractPublications(pool: Pool): Promise<Publication[]>;
96
96
  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 publicationTablePropsSchema = z.object({
@@ -104,10 +105,8 @@ export class Publication extends BasePgModel {
104
105
  /**
105
106
  * Extract all logical replication publications from the database.
106
107
  */
107
- export async function extractPublications(sql) {
108
- return sql.begin(async (tx) => {
109
- await tx `set search_path = ''`;
110
- const rows = await tx `
108
+ export async function extractPublications(pool) {
109
+ const { rows } = await pool.query(sql `
111
110
  with extension_oids as (
112
111
  select objid
113
112
  from pg_depend d
@@ -178,9 +177,8 @@ export async function extractPublications(sql) {
178
177
  from pg_publication p
179
178
  left join extension_oids e on e.objid = p.oid
180
179
  where e.objid is null
181
- order by 1;
182
- `;
183
- const validated = rows.map((row) => publicationPropsSchema.parse(row));
184
- return validated.map((row) => new Publication(row));
185
- });
180
+ order by 1
181
+ `);
182
+ const validated = rows.map((row) => publicationPropsSchema.parse(row));
183
+ return validated.map((row) => new Publication(row));
186
184
  }
@@ -21,7 +21,7 @@ export class AlterRlsPolicySetRoles extends AlterRlsPolicyChange {
21
21
  const rolesSql = toPublic ? "PUBLIC" : targetRoles.join(", ");
22
22
  return [
23
23
  "ALTER POLICY",
24
- `${this.policy.schema}.${this.policy.name}`,
24
+ this.policy.name,
25
25
  "ON",
26
26
  `${this.policy.schema}.${this.policy.table_name}`,
27
27
  "TO",
@@ -48,7 +48,7 @@ export class AlterRlsPolicySetUsingExpression extends AlterRlsPolicyChange {
48
48
  const expr = this.usingExpression ?? "true";
49
49
  return [
50
50
  "ALTER POLICY",
51
- `${this.policy.schema}.${this.policy.name}`,
51
+ this.policy.name,
52
52
  "ON",
53
53
  `${this.policy.schema}.${this.policy.table_name}`,
54
54
  "USING",
@@ -75,7 +75,7 @@ export class AlterRlsPolicySetWithCheckExpression extends AlterRlsPolicyChange {
75
75
  const expr = this.withCheckExpression ?? "true";
76
76
  return [
77
77
  "ALTER POLICY",
78
- `${this.policy.schema}.${this.policy.name}`,
78
+ this.policy.name,
79
79
  "ON",
80
80
  `${this.policy.schema}.${this.policy.table_name}`,
81
81
  "WITH CHECK",
@@ -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 rlsPolicyPropsSchema: z.ZodObject<{
@@ -48,5 +48,5 @@ export declare class RlsPolicy extends BasePgModel {
48
48
  comment: string | null;
49
49
  };
50
50
  }
51
- export declare function extractRlsPolicies(sql: Sql): Promise<RlsPolicy[]>;
51
+ export declare function extractRlsPolicies(pool: Pool): Promise<RlsPolicy[]>;
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
  const RlsPolicyCommandSchema = z.enum([
@@ -67,10 +68,8 @@ export class RlsPolicy extends BasePgModel {
67
68
  };
68
69
  }
69
70
  }
70
- export async function extractRlsPolicies(sql) {
71
- return sql.begin(async (sql) => {
72
- await sql `set search_path = ''`;
73
- const policyRows = await sql `
71
+ export async function extractRlsPolicies(pool) {
72
+ const { rows: policyRows } = await pool.query(sql `
74
73
  with extension_policy_oids as (
75
74
  select
76
75
  objid
@@ -118,10 +117,9 @@ from
118
117
  and e_policy.objid is null
119
118
  and e_table.objid is null
120
119
  order by
121
- 1, 2;
122
- `;
123
- // Validate and parse each row using the Zod schema
124
- const validatedRows = policyRows.map((row) => rlsPolicyPropsSchema.parse(row));
125
- return validatedRows.map((row) => new RlsPolicy(row));
126
- });
120
+ 1, 2
121
+ `);
122
+ // Validate and parse each row using the Zod schema
123
+ const validatedRows = policyRows.map((row) => rlsPolicyPropsSchema.parse(row));
124
+ return validatedRows.map((row) => new RlsPolicy(row));
127
125
  }
@@ -31,8 +31,15 @@ export function diffRoles(ctx, main, branch) {
31
31
  if (role.comment !== null) {
32
32
  changes.push(new CreateCommentOnRole({ role }));
33
33
  }
34
- // MEMBERSHIPS: Grant memberships immediately after role creation
34
+ // MEMBERSHIPS: Grant memberships immediately after role creation.
35
+ // Members are already deduplicated by the Role model constructor.
35
36
  for (const membership of role.members) {
37
+ // Skip memberships where the member is the grantor (auto-created by
38
+ // CREATE ROLE — re-granting them, especially WITH ADMIN OPTION, fails
39
+ // with "ADMIN option cannot be granted back to your own grantor").
40
+ if (membership.grantor === membership.member) {
41
+ continue;
42
+ }
36
43
  changes.push(new GrantRoleMembership({
37
44
  role,
38
45
  member: membership.member,
@@ -45,6 +52,8 @@ export function diffRoles(ctx, main, branch) {
45
52
  }
46
53
  // DEFAULT PRIVILEGES: Grant default privileges immediately after role creation
47
54
  for (const defaultPriv of role.default_privileges) {
55
+ if (defaultPriv.is_implicit)
56
+ continue;
48
57
  if (defaultPriv.privileges.length === 0)
49
58
  continue;
50
59
  const grantGroups = new Map();
@@ -163,11 +172,18 @@ export function diffRoles(ctx, main, branch) {
163
172
  }
164
173
  }
165
174
  // MEMBERSHIPS
175
+ // Members are already deduplicated by the Role model constructor.
166
176
  const mainMembers = new Map(mainRole.members.map((m) => [m.member, m]));
167
177
  const branchMembers = new Map(branchRole.members.map((m) => [m.member, m]));
168
178
  // Find new members to grant
169
179
  for (const [member, membership] of branchMembers) {
170
180
  if (!mainMembers.has(member)) {
181
+ // Skip memberships where the member is the grantor (auto-created by
182
+ // CREATE ROLE — re-granting them fails with "ADMIN option cannot be
183
+ // granted back to your own grantor").
184
+ if (membership.grantor === membership.member) {
185
+ continue;
186
+ }
171
187
  changes.push(new GrantRoleMembership({
172
188
  role: branchRole,
173
189
  member: membership.member,
@@ -224,6 +240,11 @@ export function diffRoles(ctx, main, branch) {
224
240
  }));
225
241
  }
226
242
  if (toGrant.admin || toGrant.inherit || toGrant.set) {
243
+ // Skip granting options back to the grantor (same restriction as
244
+ // for newly created roles).
245
+ if (branchMembership.grantor === branchMembership.member) {
246
+ continue;
247
+ }
227
248
  changes.push(new GrantRoleMembership({
228
249
  role: branchRole,
229
250
  member: branchMembership.member,
@@ -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 rolePropsSchema: z.ZodObject<{
@@ -34,6 +34,7 @@ declare const rolePropsSchema: z.ZodObject<{
34
34
  privilege: z.ZodString;
35
35
  grantable: z.ZodBoolean;
36
36
  }, z.z.core.$strip>>;
37
+ is_implicit: z.ZodBoolean;
37
38
  }, z.z.core.$strip>>;
38
39
  }, z.z.core.$strip>;
39
40
  export type RoleProps = z.infer<typeof rolePropsSchema>;
@@ -85,5 +86,5 @@ export declare class Role extends BasePgModel {
85
86
  }[];
86
87
  };
87
88
  }
88
- export declare function extractRoles(sql: Sql): Promise<Role[]>;
89
+ export declare function extractRoles(pool: Pool): Promise<Role[]>;
89
90
  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 membershipInfoSchema = z.object({
@@ -12,6 +13,7 @@ const defaultPrivilegeSchema = z.object({
12
13
  objtype: z.enum(["r", "S", "f", "T", "n"]),
13
14
  grantee: z.string(),
14
15
  privileges: z.array(z.object({ privilege: z.string(), grantable: z.boolean() })),
16
+ is_implicit: z.boolean(),
15
17
  });
16
18
  const rolePropsSchema = z.object({
17
19
  name: z.string(),
@@ -57,7 +59,7 @@ export class Role extends BasePgModel {
57
59
  this.can_bypass_rls = props.can_bypass_rls;
58
60
  this.config = props.config;
59
61
  this.comment = props.comment;
60
- this.members = props.members;
62
+ this.members = deduplicateMembers(props.members);
61
63
  this.default_privileges = props.default_privileges;
62
64
  }
63
65
  get stableId() {
@@ -76,13 +78,16 @@ export class Role extends BasePgModel {
76
78
  Number(a.inherit_option ?? false) - Number(b.inherit_option ?? false) ||
77
79
  Number(a.set_option ?? false) - Number(b.set_option ?? false));
78
80
  });
79
- const sortedDefaultPrivs = [...this.default_privileges].map((dp) => ({
80
- ...dp,
81
- privileges: [...dp.privileges].sort((a, b) => {
82
- return (a.privilege.localeCompare(b.privilege) ||
83
- Number(a.grantable) - Number(b.grantable));
84
- }),
85
- }));
81
+ const sortedDefaultPrivs = [...this.default_privileges].map((dp) => {
82
+ const { is_implicit: _, ...rest } = dp;
83
+ return {
84
+ ...rest,
85
+ privileges: [...dp.privileges].sort((a, b) => {
86
+ return (a.privilege.localeCompare(b.privilege) ||
87
+ Number(a.grantable) - Number(b.grantable));
88
+ }),
89
+ };
90
+ });
86
91
  sortedDefaultPrivs.sort((a, b) => {
87
92
  return ((a.in_schema ?? "").localeCompare(b.in_schema ?? "") ||
88
93
  a.objtype.localeCompare(b.objtype) ||
@@ -104,11 +109,49 @@ export class Role extends BasePgModel {
104
109
  };
105
110
  }
106
111
  }
107
- export async function extractRoles(sql) {
108
- return sql.begin(async (sql) => {
109
- await sql `set search_path = ''`;
110
- // Check PostgreSQL version capabilities for membership options
111
- const [capabilities] = await sql `
112
+ /**
113
+ * Deduplicate members by member name.
114
+ *
115
+ * In PostgreSQL 16+, `pg_auth_members` can have multiple rows for the same
116
+ * (roleid, member) pair with different grantors. Merge them into a single
117
+ * entry per member, combining options with OR so the most permissive wins.
118
+ *
119
+ * When merging, prefer a non-self grantor (grantor !== member) so that
120
+ * downstream code can detect true self-grants (auto-created by CREATE ROLE)
121
+ * by checking `grantor === member`.
122
+ */
123
+ function deduplicateMembers(members) {
124
+ const map = new Map();
125
+ for (const m of members) {
126
+ const existing = map.get(m.member);
127
+ if (existing) {
128
+ // admin_option is always boolean (non-nullable in schema)
129
+ existing.admin_option = existing.admin_option || m.admin_option;
130
+ // inherit_option and set_option are nullish (only available in PG 16+)
131
+ if (m.inherit_option != null) {
132
+ existing.inherit_option =
133
+ (existing.inherit_option ?? false) || m.inherit_option;
134
+ }
135
+ if (m.set_option != null) {
136
+ existing.set_option = (existing.set_option ?? false) || m.set_option;
137
+ }
138
+ // Prefer a non-self grantor so diff can detect true self-grants.
139
+ // Once a non-self grantor is chosen the value is kept (the specific
140
+ // non-self grantor doesn't matter — only the self vs non-self
141
+ // distinction is used downstream).
142
+ if (existing.grantor === existing.member && m.grantor !== m.member) {
143
+ existing.grantor = m.grantor;
144
+ }
145
+ }
146
+ else {
147
+ map.set(m.member, { ...m });
148
+ }
149
+ }
150
+ return [...map.values()];
151
+ }
152
+ export async function extractRoles(pool) {
153
+ // Check PostgreSQL version capabilities for membership options
154
+ const { rows: capabilitiesRows } = await pool.query(sql `
112
155
  select
113
156
  exists (
114
157
  select 1
@@ -122,23 +165,25 @@ export async function extractRoles(sql) {
122
165
  where attrelid = 'pg_auth_members'::regclass
123
166
  and attname = 'set_option'
124
167
  ) as has_set
125
- `;
126
- const roleRows = capabilities?.has_inherit && capabilities?.has_set
127
- ? await sql `
168
+ `);
169
+ const capabilities = capabilitiesRows[0];
170
+ let roleRows;
171
+ if (capabilities?.has_inherit && capabilities?.has_set) {
172
+ const result = await pool.query(sql `
128
173
  WITH role_memberships AS (
129
- SELECT
174
+ SELECT
130
175
  r.rolname AS role_name,
131
176
  json_agg(
132
177
  json_build_object(
133
178
  'member', m.rolname,
134
179
  'grantor', g.rolname,
135
180
  'admin_option', am.admin_option,
136
- 'inherit_option', am.inherit_option, -- PG16+
137
- 'set_option', am.set_option -- PG16+
181
+ 'inherit_option', am.inherit_option,
182
+ 'set_option', am.set_option
138
183
  )
139
184
  ) FILTER (WHERE m.rolname IS NOT NULL) AS members
140
185
  FROM pg_catalog.pg_roles r
141
- LEFT JOIN pg_auth_members am ON am.roleid = r.oid -- roles that are members of this role
186
+ LEFT JOIN pg_auth_members am ON am.roleid = r.oid
142
187
  LEFT JOIN pg_roles m ON m.oid = am.member
143
188
  LEFT JOIN pg_roles g ON g.oid = am.grantor
144
189
  GROUP BY r.rolname
@@ -171,13 +216,15 @@ export async function extractRoles(sql) {
171
216
  THEN 'PUBLIC'
172
217
  ELSE s.grantee::regrole::text
173
218
  END,
174
- 'privileges', s.privileges
219
+ 'privileges', s.privileges,
220
+ 'is_implicit', s.is_implicit
175
221
  )
176
222
  ORDER BY s.defaclnamespace NULLS FIRST,
177
223
  s.defaclobjtype,
178
224
  s.grantee
179
225
  )
180
226
  FROM (
227
+ -- Explicit entries from pg_default_acl
181
228
  SELECT
182
229
  d.defaclnamespace,
183
230
  d.defaclobjtype,
@@ -188,12 +235,41 @@ export async function extractRoles(sql) {
188
235
  'grantable', x.is_grantable
189
236
  )
190
237
  ORDER BY x.privilege_type, x.is_grantable
191
- ) AS privileges
238
+ ) AS privileges,
239
+ false AS is_implicit
192
240
  FROM pg_default_acl d
193
241
  CROSS JOIN LATERAL aclexplode(COALESCE(d.defaclacl, ARRAY[]::aclitem[]))
194
242
  AS x(grantor, grantee, privilege_type, is_grantable)
195
243
  WHERE d.defaclrole = r.oid
196
244
  GROUP BY d.defaclnamespace, d.defaclobjtype, x.grantee
245
+ UNION ALL
246
+ -- Implicit defaults from acldefault() for objtypes without a
247
+ -- global pg_default_acl entry. PostgreSQL applies these implicit
248
+ -- defaults (e.g. PUBLIC gets EXECUTE on functions) when no
249
+ -- explicit ALTER DEFAULT PRIVILEGES has been issued. Including
250
+ -- them lets the diff detect REVOKEs of implicit grants.
251
+ SELECT
252
+ 0 AS defaclnamespace,
253
+ v.t::"char" AS defaclobjtype,
254
+ x.grantee,
255
+ json_agg(
256
+ json_build_object(
257
+ 'privilege', x.privilege_type,
258
+ 'grantable', x.is_grantable
259
+ )
260
+ ORDER BY x.privilege_type, x.is_grantable
261
+ ) AS privileges,
262
+ true AS is_implicit
263
+ FROM (VALUES ('r'), ('S'), ('f'), ('T'), ('n')) AS v(t)
264
+ CROSS JOIN LATERAL aclexplode(acldefault(v.t::"char", r.oid))
265
+ AS x(grantor, grantee, privilege_type, is_grantable)
266
+ WHERE NOT EXISTS (
267
+ SELECT 1 FROM pg_default_acl d2
268
+ WHERE d2.defaclrole = r.oid
269
+ AND d2.defaclobjtype = v.t::"char"
270
+ AND d2.defaclnamespace = 0
271
+ )
272
+ GROUP BY v.t, x.grantee
197
273
  ) AS s
198
274
  ),
199
275
  '[]'
@@ -201,9 +277,7 @@ export async function extractRoles(sql) {
201
277
  FROM pg_catalog.pg_roles r
202
278
  LEFT JOIN role_memberships rm ON rm.role_name = r.rolname
203
279
  WHERE
204
- -- 1) drop built-in/internal roles (anything starting with pg_)
205
280
  r.rolname !~ '^pg_'
206
- -- 2) drop roles directly tracked as extension members in pg_shdepend (if any)
207
281
  AND NOT EXISTS (
208
282
  SELECT 1
209
283
  FROM pg_catalog.pg_shdepend d
@@ -212,24 +286,26 @@ export async function extractRoles(sql) {
212
286
  AND d.refclassid = 'pg_extension'::regclass
213
287
  AND d.deptype IN ('e','x')
214
288
  )
215
- ORDER BY 1;
216
- `
217
- : await sql `
289
+ ORDER BY 1
290
+ `);
291
+ roleRows = result.rows;
292
+ }
293
+ else {
294
+ const result = await pool.query(sql `
218
295
  WITH role_memberships AS (
219
- SELECT
296
+ SELECT
220
297
  r.rolname AS role_name,
221
298
  json_agg(
222
299
  json_build_object(
223
300
  'member', m.rolname,
224
301
  'grantor', g.rolname,
225
302
  'admin_option', am.admin_option,
226
- -- PG15: these columns don't exist; emit them as nulls
227
303
  'inherit_option', NULL,
228
304
  'set_option', NULL
229
305
  )
230
306
  ) FILTER (WHERE m.rolname IS NOT NULL) AS members
231
307
  FROM pg_catalog.pg_roles r
232
- LEFT JOIN pg_auth_members am ON am.roleid = r.oid -- roles that are members of this role
308
+ LEFT JOIN pg_auth_members am ON am.roleid = r.oid
233
309
  LEFT JOIN pg_roles m ON m.oid = am.member
234
310
  LEFT JOIN pg_roles g ON g.oid = am.grantor
235
311
  GROUP BY r.rolname
@@ -262,13 +338,15 @@ export async function extractRoles(sql) {
262
338
  THEN 'PUBLIC'
263
339
  ELSE s.grantee::regrole::text
264
340
  END,
265
- 'privileges', s.privileges
341
+ 'privileges', s.privileges,
342
+ 'is_implicit', s.is_implicit
266
343
  )
267
344
  ORDER BY s.defaclnamespace NULLS FIRST,
268
345
  s.defaclobjtype,
269
346
  s.grantee
270
347
  )
271
348
  FROM (
349
+ -- Explicit entries from pg_default_acl
272
350
  SELECT
273
351
  d.defaclnamespace,
274
352
  d.defaclobjtype,
@@ -279,12 +357,41 @@ export async function extractRoles(sql) {
279
357
  'grantable', x.is_grantable
280
358
  )
281
359
  ORDER BY x.privilege_type, x.is_grantable
282
- ) AS privileges
360
+ ) AS privileges,
361
+ false AS is_implicit
283
362
  FROM pg_default_acl d
284
363
  CROSS JOIN LATERAL aclexplode(COALESCE(d.defaclacl, ARRAY[]::aclitem[]))
285
364
  AS x(grantor, grantee, privilege_type, is_grantable)
286
365
  WHERE d.defaclrole = r.oid
287
366
  GROUP BY d.defaclnamespace, d.defaclobjtype, x.grantee
367
+ UNION ALL
368
+ -- Implicit defaults from acldefault() for objtypes without a
369
+ -- global pg_default_acl entry. PostgreSQL applies these implicit
370
+ -- defaults (e.g. PUBLIC gets EXECUTE on functions) when no
371
+ -- explicit ALTER DEFAULT PRIVILEGES has been issued. Including
372
+ -- them lets the diff detect REVOKEs of implicit grants.
373
+ SELECT
374
+ 0 AS defaclnamespace,
375
+ v.t::"char" AS defaclobjtype,
376
+ x.grantee,
377
+ json_agg(
378
+ json_build_object(
379
+ 'privilege', x.privilege_type,
380
+ 'grantable', x.is_grantable
381
+ )
382
+ ORDER BY x.privilege_type, x.is_grantable
383
+ ) AS privileges,
384
+ true AS is_implicit
385
+ FROM (VALUES ('r'), ('S'), ('f'), ('T'), ('n')) AS v(t)
386
+ CROSS JOIN LATERAL aclexplode(acldefault(v.t::"char", r.oid))
387
+ AS x(grantor, grantee, privilege_type, is_grantable)
388
+ WHERE NOT EXISTS (
389
+ SELECT 1 FROM pg_default_acl d2
390
+ WHERE d2.defaclrole = r.oid
391
+ AND d2.defaclobjtype = v.t::"char"
392
+ AND d2.defaclnamespace = 0
393
+ )
394
+ GROUP BY v.t, x.grantee
288
395
  ) AS s
289
396
  ),
290
397
  '[]'
@@ -292,9 +399,7 @@ export async function extractRoles(sql) {
292
399
  FROM pg_catalog.pg_roles r
293
400
  LEFT JOIN role_memberships rm ON rm.role_name = r.rolname
294
401
  WHERE
295
- -- drop built-in/internal roles
296
402
  r.rolname !~ '^pg_'
297
- -- drop roles directly tracked as extension members in pg_shdepend (if any)
298
403
  AND NOT EXISTS (
299
404
  SELECT 1
300
405
  FROM pg_catalog.pg_shdepend d
@@ -303,10 +408,11 @@ export async function extractRoles(sql) {
303
408
  AND d.refclassid = 'pg_extension'::regclass
304
409
  AND d.deptype IN ('e','x')
305
410
  )
306
- ORDER BY 1;
307
- `;
308
- // Validate and parse each row using the Zod schema
309
- const validatedRows = roleRows.map((row) => rolePropsSchema.parse(row));
310
- return validatedRows.map((row) => new Role(row));
311
- });
411
+ ORDER BY 1
412
+ `);
413
+ roleRows = result.rows;
414
+ }
415
+ // Validate and parse each row using the Zod schema
416
+ const validatedRows = roleRows.map((row) => rolePropsSchema.parse(row));
417
+ return validatedRows.map((row) => new Role(row));
312
418
  }
@@ -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 RuleEnabledStateSchema: z.ZodEnum<{
@@ -68,5 +68,5 @@ export declare class Rule extends BasePgModel {
68
68
  };
69
69
  get relationStableId(): string;
70
70
  }
71
- export declare function extractRules(sql: Sql): Promise<Rule[]>;
71
+ export declare function extractRules(pool: Pool): Promise<Rule[]>;
72
72
  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 { stableId } from "../utils.js";
@@ -81,10 +82,8 @@ export class Rule extends BasePgModel {
81
82
  }
82
83
  }
83
84
  }
84
- export async function extractRules(sql) {
85
- return sql.begin(async (sql) => {
86
- await sql `set search_path = ''`;
87
- const ruleRows = await sql `
85
+ export async function extractRules(pool) {
86
+ const { rows: ruleRows } = await pool.query(sql `
88
87
  WITH extension_rule_oids AS (
89
88
  SELECT
90
89
  objid
@@ -148,9 +147,8 @@ export async function extractRules(sql) {
148
147
  AND e_rel.objid IS NULL
149
148
  AND r.rulename <> '_RETURN'
150
149
  ORDER BY
151
- 1, 3, 2;
152
- `;
153
- const validatedRows = ruleRows.map((row) => rulePropsSchema.parse(row));
154
- return validatedRows.map((row) => new Rule(row));
155
- });
150
+ 1, 3, 2
151
+ `);
152
+ const validatedRows = ruleRows.map((row) => rulePropsSchema.parse(row));
153
+ return validatedRows.map((row) => new Rule(row));
156
154
  }
@@ -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 { SchemaChange } from "./changes/schema.types.ts";
4
3
  import type { Schema } from "./schema.model.ts";
5
4
  /**
@@ -10,9 +9,4 @@ import type { Schema } from "./schema.model.ts";
10
9
  * @param branch - The schemas 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 diffSchemas(ctx: {
14
- version: number;
15
- currentUser: string;
16
- defaultPrivilegeState: DefaultPrivilegeState;
17
- mainRoles: Record<string, Role>;
18
- }, main: Record<string, Schema>, branch: Record<string, Schema>): SchemaChange[];
12
+ export declare function diffSchemas(ctx: Pick<ObjectDiffContext, "version" | "currentUser" | "defaultPrivilegeState">, main: Record<string, Schema>, branch: Record<string, Schema>): SchemaChange[];