@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,5 +1,5 @@
1
1
  import { diffObjects } from "../base.diff.js";
2
- import { diffPrivileges, groupPrivilegesByColumns, } from "../base.privilege-diff.js";
2
+ import { diffPrivileges, emitColumnPrivilegeChanges, } from "../base.privilege-diff.js";
3
3
  import { deepEqual } from "../utils.js";
4
4
  import { AlterTableAddColumn, AlterTableAddConstraint, AlterTableAlterColumnDropDefault, AlterTableAlterColumnDropNotNull, AlterTableAlterColumnSetDefault, AlterTableAlterColumnSetNotNull, AlterTableAlterColumnType, AlterTableAttachPartition, AlterTableChangeOwner, AlterTableDetachPartition, AlterTableDisableRowLevelSecurity, AlterTableDropColumn, AlterTableDropConstraint, AlterTableEnableRowLevelSecurity, AlterTableForceRowLevelSecurity, AlterTableNoForceRowLevelSecurity, AlterTableResetStorageParams, AlterTableSetLogged, AlterTableSetReplicaIdentity, AlterTableSetStorageParams, AlterTableSetUnlogged, AlterTableValidateConstraint, } from "./changes/table.alter.js";
5
5
  import { CreateCommentOnColumn, CreateCommentOnConstraint, CreateCommentOnTable, DropCommentOnColumn, DropCommentOnConstraint, DropCommentOnTable, } from "./changes/table.comment.js";
@@ -149,6 +149,16 @@ export function diffTables(ctx, main, branch) {
149
149
  if (branchTable.force_row_security) {
150
150
  changes.push(new AlterTableForceRowLevelSecurity({ table: branchTable }));
151
151
  }
152
+ // REPLICA IDENTITY: If non-default, emit ALTER TABLE ... REPLICA IDENTITY
153
+ if (branchTable.replica_identity !== "d") {
154
+ // Skip 'i' (USING INDEX) — handled by index changes
155
+ if (branchTable.replica_identity !== "i") {
156
+ changes.push(new AlterTableSetReplicaIdentity({
157
+ table: branchTable,
158
+ mode: branchTable.replica_identity,
159
+ }));
160
+ }
161
+ }
152
162
  changes.push(...createAlterConstraintChange(
153
163
  // Create a dummy table with no constraints do diff constraints against
154
164
  new Table({
@@ -171,86 +181,18 @@ export function diffTables(ctx, main, branch) {
171
181
  // We compare default privileges against desired privileges to generate REVOKE/GRANT statements
172
182
  // needed to reach the final desired state.
173
183
  const effectiveDefaults = ctx.defaultPrivilegeState.getEffectiveDefaults(ctx.currentUser, "table", branchTable.schema ?? "");
184
+ const creatorFilteredDefaults = branchTable.owner !== ctx.currentUser
185
+ ? effectiveDefaults.filter((p) => p.grantee !== ctx.currentUser)
186
+ : effectiveDefaults;
174
187
  const desiredPrivileges = branchTable.privileges;
175
188
  // Filter out owner privileges - owner always has ALL privileges implicitly
176
189
  // and shouldn't be compared. Use the table owner as the reference.
177
- const privilegeResults = diffPrivileges(effectiveDefaults, desiredPrivileges, branchTable.owner, ctx.mainRoles);
178
- // Generate grant changes
179
- for (const [grantee, result] of privilegeResults) {
180
- if (result.grants.length > 0) {
181
- const grantGroups = groupPrivilegesByColumns(result.grants);
182
- for (const [, group] of grantGroups) {
183
- for (const [grantable, privSet] of group.byGrant) {
184
- const privileges = Array.from(privSet).map((priv) => ({
185
- privilege: priv,
186
- grantable,
187
- }));
188
- changes.push(new GrantTablePrivileges({
189
- table: branchTable,
190
- grantee,
191
- privileges,
192
- columns: group.columns,
193
- version: ctx.version,
194
- }));
195
- }
196
- }
197
- }
198
- // Generate revoke changes
199
- if (result.revokes.length > 0) {
200
- const revokeGroups = groupPrivilegesByColumns(result.revokes);
201
- for (const [, group] of revokeGroups) {
202
- const allPrivileges = new Set();
203
- for (const [, privSet] of group.byGrant) {
204
- for (const priv of privSet) {
205
- allPrivileges.add(priv);
206
- }
207
- }
208
- const privileges = Array.from(allPrivileges).map((priv) => ({
209
- privilege: priv,
210
- grantable: false,
211
- }));
212
- changes.push(new RevokeTablePrivileges({
213
- table: branchTable,
214
- grantee,
215
- privileges,
216
- columns: group.columns,
217
- version: ctx.version,
218
- }));
219
- }
220
- }
221
- // Generate revoke grant option changes
222
- if (result.revokeGrantOption.length > 0) {
223
- const revokeGrantGroups = new Map();
224
- for (const r of result.revokeGrantOption) {
225
- const originalPriv = effectiveDefaults.find((p) => p.grantee === grantee && p.privilege === r);
226
- const key = originalPriv?.columns
227
- ? originalPriv.columns.sort().join(",")
228
- : "";
229
- if (!revokeGrantGroups.has(key)) {
230
- revokeGrantGroups.set(key, {
231
- columns: originalPriv?.columns
232
- ? [...originalPriv.columns]
233
- : undefined,
234
- privileges: new Set(),
235
- });
236
- }
237
- const group = revokeGrantGroups.get(key);
238
- if (!group)
239
- continue;
240
- group.privileges.add(r);
241
- }
242
- for (const [, group] of revokeGrantGroups) {
243
- const privilegeNames = Array.from(group.privileges);
244
- changes.push(new RevokeGrantOptionTablePrivileges({
245
- table: branchTable,
246
- grantee,
247
- privilegeNames,
248
- columns: group.columns,
249
- version: ctx.version,
250
- }));
251
- }
252
- }
253
- }
190
+ const privilegeResults = diffPrivileges(creatorFilteredDefaults, desiredPrivileges, branchTable.owner);
191
+ changes.push(...emitColumnPrivilegeChanges(privilegeResults, branchTable, branchTable, "table", {
192
+ Grant: GrantTablePrivileges,
193
+ Revoke: RevokeTablePrivileges,
194
+ RevokeGrantOption: RevokeGrantOptionTablePrivileges,
195
+ }, effectiveDefaults, ctx.version));
254
196
  }
255
197
  for (const tableId of dropped) {
256
198
  changes.push(new DropTable({ table: main[tableId] }));
@@ -584,85 +526,12 @@ export function diffTables(ctx, main, branch) {
584
526
  // PRIVILEGES (unified object and column privileges)
585
527
  // Filter out owner privileges - owner always has ALL privileges implicitly
586
528
  // and shouldn't be compared. Use branch owner as the reference.
587
- const privilegeResults = diffPrivileges(mainTable.privileges, branchTable.privileges, branchTable.owner, ctx.mainRoles);
588
- for (const [grantee, result] of privilegeResults) {
589
- // Generate grant changes
590
- if (result.grants.length > 0) {
591
- const grantGroups = groupPrivilegesByColumns(result.grants);
592
- for (const [, group] of grantGroups) {
593
- for (const [grantable, privSet] of group.byGrant) {
594
- const privileges = Array.from(privSet).map((priv) => ({
595
- privilege: priv,
596
- grantable,
597
- }));
598
- changes.push(new GrantTablePrivileges({
599
- table: branchTable,
600
- grantee,
601
- privileges,
602
- columns: group.columns,
603
- version: ctx.version,
604
- }));
605
- }
606
- }
607
- }
608
- // Generate revoke changes
609
- if (result.revokes.length > 0) {
610
- const revokeGroups = groupPrivilegesByColumns(result.revokes);
611
- for (const [, group] of revokeGroups) {
612
- // Collapse all grantable groups into a single revoke (grantable: false)
613
- const allPrivileges = new Set();
614
- for (const [, privSet] of group.byGrant) {
615
- for (const priv of privSet) {
616
- allPrivileges.add(priv);
617
- }
618
- }
619
- const privileges = Array.from(allPrivileges).map((priv) => ({
620
- privilege: priv,
621
- grantable: false,
622
- }));
623
- changes.push(new RevokeTablePrivileges({
624
- table: mainTable,
625
- grantee,
626
- privileges,
627
- columns: group.columns,
628
- version: ctx.version,
629
- }));
630
- }
631
- }
632
- // Generate revoke grant option changes
633
- if (result.revokeGrantOption.length > 0) {
634
- const revokeGrantGroups = new Map();
635
- for (const r of result.revokeGrantOption) {
636
- // For revoke grant option, we need to find the columns from the original privilege
637
- const originalPriv = mainTable.privileges.find((p) => p.grantee === grantee && p.privilege === r);
638
- const key = originalPriv?.columns
639
- ? originalPriv.columns.sort().join(",")
640
- : "";
641
- if (!revokeGrantGroups.has(key)) {
642
- revokeGrantGroups.set(key, {
643
- columns: originalPriv?.columns
644
- ? [...originalPriv.columns]
645
- : undefined,
646
- privileges: new Set(),
647
- });
648
- }
649
- const group = revokeGrantGroups.get(key);
650
- if (!group)
651
- continue;
652
- group.privileges.add(r);
653
- }
654
- for (const [, group] of revokeGrantGroups) {
655
- const privilegeNames = Array.from(group.privileges);
656
- changes.push(new RevokeGrantOptionTablePrivileges({
657
- table: mainTable,
658
- grantee,
659
- privilegeNames,
660
- columns: group.columns,
661
- version: ctx.version,
662
- }));
663
- }
664
- }
665
- }
529
+ const privilegeResults = diffPrivileges(mainTable.privileges, branchTable.privileges, branchTable.owner);
530
+ changes.push(...emitColumnPrivilegeChanges(privilegeResults, branchTable, mainTable, "table", {
531
+ Grant: GrantTablePrivileges,
532
+ Revoke: RevokeTablePrivileges,
533
+ RevokeGrantOption: RevokeGrantOptionTablePrivileges,
534
+ }, mainTable.privileges, ctx.version));
666
535
  }
667
536
  return changes;
668
537
  }
@@ -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, type TableLikeObject } from "../base.model.ts";
4
4
  import { type PrivilegeProps } from "../base.privilege-diff.ts";
@@ -12,6 +12,7 @@ declare const tableConstraintPropsSchema: z.ZodObject<{
12
12
  name: z.ZodString;
13
13
  constraint_type: z.ZodEnum<{
14
14
  u: "u";
15
+ t: "t";
15
16
  c: "c";
16
17
  p: "p";
17
18
  f: "f";
@@ -113,6 +114,7 @@ declare const tablePropsSchema: z.ZodObject<{
113
114
  name: z.ZodString;
114
115
  constraint_type: z.ZodEnum<{
115
116
  u: "u";
117
+ t: "t";
116
118
  c: "c";
117
119
  p: "p";
118
120
  f: "f";
@@ -231,7 +233,7 @@ export declare class Table extends BasePgModel implements TableLikeObject {
231
233
  }[];
232
234
  constraints: {
233
235
  name: string;
234
- constraint_type: "u" | "c" | "p" | "f" | "x";
236
+ constraint_type: "u" | "t" | "c" | "p" | "f" | "x";
235
237
  deferrable: boolean;
236
238
  initially_deferred: boolean;
237
239
  validated: boolean;
@@ -292,7 +294,7 @@ export declare class Table extends BasePgModel implements TableLikeObject {
292
294
  options: string[] | null;
293
295
  constraints: {
294
296
  name: string;
295
- constraint_type: "u" | "c" | "p" | "f" | "x";
297
+ constraint_type: "u" | "t" | "c" | "p" | "f" | "x";
296
298
  deferrable: boolean;
297
299
  initially_deferred: boolean;
298
300
  validated: boolean;
@@ -324,6 +326,7 @@ export declare class Table extends BasePgModel implements TableLikeObject {
324
326
  grantee: string;
325
327
  privilege: string;
326
328
  grantable: boolean;
329
+ columns: string[] | null | undefined;
327
330
  }[];
328
331
  persistence: "u" | "t" | "p";
329
332
  row_security: boolean;
@@ -337,5 +340,5 @@ export declare class Table extends BasePgModel implements TableLikeObject {
337
340
  };
338
341
  };
339
342
  }
340
- export declare function extractTables(sql: Sql): Promise<Table[]>;
343
+ export declare function extractTables(pool: Pool): Promise<Table[]>;
341
344
  export {};
@@ -1,3 +1,4 @@
1
+ import { sql } from "@ts-safeql/sql-tag";
1
2
  import z from "zod";
2
3
  import { BasePgModel, columnPropsSchema, normalizeColumns, } from "../base.model.js";
3
4
  import { normalizePrivileges } from "../base.privilege.js";
@@ -32,6 +33,7 @@ const tableConstraintPropsSchema = z.object({
32
33
  "c", // CHECK constraint
33
34
  "f", // FOREIGN KEY constraint
34
35
  "p", // PRIMARY KEY constraint
36
+ "t", // TRIGGER constraint
35
37
  "u", // UNIQUE constraint
36
38
  "x", // EXCLUDE constraint
37
39
  ]),
@@ -182,10 +184,8 @@ export class Table extends BasePgModel {
182
184
  };
183
185
  }
184
186
  }
185
- export async function extractTables(sql) {
186
- return sql.begin(async (sql) => {
187
- await sql `set search_path = ''`;
188
- const tableRows = await sql `
187
+ export async function extractTables(pool) {
188
+ const { rows: tableRows } = await pool.query(sql `
189
189
  with extension_oids as (
190
190
  select objid
191
191
  from pg_depend d
@@ -339,6 +339,8 @@ select
339
339
  and de.refclassid = 'pg_extension'::regclass
340
340
 
341
341
  where c.conrelid = t.oid
342
+ -- Skip constraint triggers and PG18 NOT NULL constraints; they are modeled elsewhere
343
+ and c.contype not in ('t', 'n')
342
344
  and not c.connamespace::regnamespace::text like any(array['pg\\_%', 'information\\_schema'])
343
345
  and de.objid is null
344
346
  ),
@@ -395,7 +397,7 @@ select
395
397
  from (
396
398
  -- one row for object ACL + one row per column ACL
397
399
  select null::name as attname, t.oid as relacl_oid, (
398
- select c_rel.relacl from pg_class c_rel where c_rel.oid = t.oid
400
+ select COALESCE(c_rel.relacl, acldefault('r', c_rel.relowner)) from pg_class c_rel where c_rel.oid = t.oid
399
401
  ) as acl
400
402
  union all
401
403
  select a2.attname, t.oid as relacl_oid, a2.attacl
@@ -417,10 +419,9 @@ from
417
419
  group by
418
420
  t.oid, t.schema, t.name, t.persistence, t.row_security, t.force_row_security, t.has_indexes, t.has_rules, t.has_triggers, t.has_subclasses, t.is_populated, t.replica_identity, t.is_partition, t.options, t.partition_bound, t.partition_by, t.owner, t.parent_schema, t.parent_name
419
421
  order by
420
- t.schema, t.name;
421
- `;
422
- // Validate and parse each row using the Zod schema
423
- const validatedRows = tableRows.map((row) => tablePropsSchema.parse(row));
424
- return validatedRows.map((row) => new Table(row));
425
- });
422
+ t.schema, t.name
423
+ `);
424
+ // Validate and parse each row using the Zod schema
425
+ const validatedRows = tableRows.map((row) => tablePropsSchema.parse(row));
426
+ return validatedRows.map((row) => new Table(row));
426
427
  }
@@ -1,5 +1,7 @@
1
+ import { quoteLiteral } from "../../base.change.js";
1
2
  import { AlterTriggerChange } from "./trigger.base.js";
2
3
  import { CreateTrigger } from "./trigger.create.js";
4
+ import { DropTrigger } from "./trigger.drop.js";
3
5
  /**
4
6
  * Replace a trigger by dropping and recreating it.
5
7
  * This is used when properties that cannot be altered via ALTER TRIGGER change.
@@ -17,6 +19,27 @@ export class ReplaceTrigger extends AlterTriggerChange {
17
19
  return [this.trigger.stableId];
18
20
  }
19
21
  serialize() {
22
+ if (this.trigger.isConstraintTrigger) {
23
+ const dropChange = new DropTrigger({ trigger: this.trigger });
24
+ const createChange = new CreateTrigger({
25
+ trigger: this.trigger,
26
+ indexableObject: this.indexableObject,
27
+ orReplace: false,
28
+ });
29
+ const commentSql = this.trigger.comment !== null
30
+ ? [
31
+ "COMMENT ON TRIGGER",
32
+ this.trigger.name,
33
+ "ON",
34
+ `${this.trigger.schema}.${this.trigger.table_name}`,
35
+ "IS",
36
+ quoteLiteral(this.trigger.comment),
37
+ ].join(" ")
38
+ : null;
39
+ return [dropChange.serialize(), createChange.serialize(), commentSql]
40
+ .filter(Boolean)
41
+ .join(";\n");
42
+ }
20
43
  const createChange = new CreateTrigger({
21
44
  trigger: this.trigger,
22
45
  indexableObject: this.indexableObject,
@@ -45,17 +45,16 @@ export class CreateTrigger extends CreateTriggerChange {
45
45
  // Table dependency
46
46
  dependencies.add(stableId.table(this.trigger.schema, this.trigger.table_name));
47
47
  // Function dependency
48
- // Note: We can't build the exact procedure stableId without argument types.
49
- // The trigger definition contains the full function call, but parsing it would be complex.
50
- // For now, we rely on pg_depend extraction for procedure dependencies.
51
- // If needed, we could parse the trigger definition to extract the full function signature.
48
+ // Trigger functions always have signature () RETURNS trigger, so no arguments.
49
+ dependencies.add(stableId.procedure(this.trigger.function_schema, this.trigger.function_name));
52
50
  // Owner dependency
53
51
  dependencies.add(stableId.role(this.trigger.owner));
54
52
  return Array.from(dependencies);
55
53
  }
56
54
  serialize() {
57
55
  let definition = this.trigger.definition.trim();
58
- definition = definition.replace(/^CREATE\s+(?:OR\s+REPLACE\s+)?/i, `CREATE ${this.orReplace ? "OR REPLACE " : ""}`);
56
+ const isConstraintTrigger = this.trigger.isConstraintTrigger;
57
+ definition = definition.replace(/^CREATE\s+(?:OR\s+REPLACE\s+)?/i, `CREATE ${this.orReplace && !isConstraintTrigger ? "OR REPLACE " : ""}`);
59
58
  return definition;
60
59
  }
61
60
  }
@@ -1,10 +1,17 @@
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 triggerPropsSchema: z.ZodObject<{
5
5
  schema: z.ZodString;
6
6
  name: z.ZodString;
7
7
  table_name: z.ZodString;
8
+ table_relkind: z.ZodEnum<{
9
+ r: "r";
10
+ v: "v";
11
+ m: "m";
12
+ p: "p";
13
+ f: "f";
14
+ }>;
8
15
  function_schema: z.ZodString;
9
16
  function_name: z.ZodString;
10
17
  trigger_type: z.ZodNumber;
@@ -37,6 +44,7 @@ export declare class Trigger extends BasePgModel {
37
44
  readonly schema: TriggerProps["schema"];
38
45
  readonly name: TriggerProps["name"];
39
46
  readonly table_name: TriggerProps["table_name"];
47
+ readonly table_relkind: TriggerProps["table_relkind"];
40
48
  readonly function_schema: TriggerProps["function_schema"];
41
49
  readonly function_name: TriggerProps["function_name"];
42
50
  readonly trigger_type: TriggerProps["trigger_type"];
@@ -59,6 +67,7 @@ export declare class Trigger extends BasePgModel {
59
67
  readonly definition: TriggerProps["definition"];
60
68
  readonly comment: TriggerProps["comment"];
61
69
  constructor(props: TriggerProps);
70
+ get isConstraintTrigger(): boolean;
62
71
  get stableId(): `trigger:${string}`;
63
72
  get identityFields(): {
64
73
  schema: string;
@@ -88,5 +97,5 @@ export declare class Trigger extends BasePgModel {
88
97
  comment: string | null;
89
98
  };
90
99
  }
91
- export declare function extractTriggers(sql: Sql): Promise<Trigger[]>;
100
+ export declare function extractTriggers(pool: Pool): Promise<Trigger[]>;
92
101
  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 TriggerEnabledSchema = z.enum([
@@ -6,10 +7,18 @@ const TriggerEnabledSchema = z.enum([
6
7
  "R", // REPLICA - trigger fires only in "replica" mode
7
8
  "A", // ALWAYS - trigger fires regardless of replication mode
8
9
  ]);
10
+ const TriggerTableRelkindSchema = z.enum([
11
+ "r", // ordinary table
12
+ "p", // partitioned table
13
+ "f", // foreign table
14
+ "v", // view
15
+ "m", // materialized view
16
+ ]);
9
17
  const triggerPropsSchema = z.object({
10
18
  schema: z.string(),
11
19
  name: z.string(),
12
20
  table_name: z.string(),
21
+ table_relkind: TriggerTableRelkindSchema,
13
22
  function_schema: z.string(),
14
23
  function_name: z.string(),
15
24
  trigger_type: z.number(),
@@ -36,6 +45,7 @@ export class Trigger extends BasePgModel {
36
45
  schema;
37
46
  name;
38
47
  table_name;
48
+ table_relkind;
39
49
  function_schema;
40
50
  function_name;
41
51
  trigger_type;
@@ -63,6 +73,7 @@ export class Trigger extends BasePgModel {
63
73
  this.schema = props.schema;
64
74
  this.name = props.name;
65
75
  this.table_name = props.table_name;
76
+ this.table_relkind = props.table_relkind;
66
77
  // Data fields
67
78
  this.function_schema = props.function_schema;
68
79
  this.function_name = props.function_name;
@@ -86,6 +97,9 @@ export class Trigger extends BasePgModel {
86
97
  this.definition = props.definition;
87
98
  this.comment = props.comment;
88
99
  }
100
+ get isConstraintTrigger() {
101
+ return /^CREATE\s+CONSTRAINT\s+TRIGGER/i.test(this.definition.trim());
102
+ }
89
103
  get stableId() {
90
104
  return `trigger:${this.schema}.${this.table_name}.${this.name}`;
91
105
  }
@@ -121,10 +135,8 @@ export class Trigger extends BasePgModel {
121
135
  };
122
136
  }
123
137
  }
124
- export async function extractTriggers(sql) {
125
- return sql.begin(async (sql) => {
126
- await sql `set search_path = ''`;
127
- const triggerRows = await sql `
138
+ export async function extractTriggers(pool) {
139
+ const { rows: triggerRows } = await pool.query(sql `
128
140
  with extension_trigger_oids as (
129
141
  select objid
130
142
  from pg_depend d
@@ -148,6 +160,7 @@ export async function extractTriggers(sql) {
148
160
  tc.relnamespace::regnamespace::text as schema,
149
161
  quote_ident(t.tgname) as name,
150
162
  quote_ident(tc.relname) as table_name,
163
+ tc.relkind as table_relkind,
151
164
 
152
165
  fc.pronamespace::regnamespace::text as function_schema,
153
166
  quote_ident(fc.proname) as function_name,
@@ -226,10 +239,9 @@ export async function extractTriggers(sql) {
226
239
  and e_function.objid is null
227
240
  and not t.tgisinternal
228
241
 
229
- order by 1, 2;
230
- `;
231
- // Validate and parse each row using the Zod schema
232
- const validatedRows = triggerRows.map((row) => triggerPropsSchema.parse(row));
233
- return validatedRows.map((row) => new Trigger(row));
234
- });
242
+ order by 1, 2
243
+ `);
244
+ // Validate and parse each row using the Zod schema
245
+ const validatedRows = triggerRows.map((row) => triggerPropsSchema.parse(row));
246
+ return validatedRows.map((row) => new Trigger(row));
235
247
  }
@@ -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 { CompositeTypeChange } from "./changes/composite-type.types.ts";
4
3
  import type { CompositeType } from "./composite-type.model.ts";
5
4
  /**
@@ -10,9 +9,4 @@ import type { CompositeType } from "./composite-type.model.ts";
10
9
  * @param branch - The composite types 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 diffCompositeTypes(ctx: {
14
- version: number;
15
- currentUser: string;
16
- defaultPrivilegeState: DefaultPrivilegeState;
17
- mainRoles: Record<string, Role>;
18
- }, main: Record<string, CompositeType>, branch: Record<string, CompositeType>): CompositeTypeChange[];
12
+ export declare function diffCompositeTypes(ctx: Pick<ObjectDiffContext, "version" | "currentUser" | "defaultPrivilegeState">, main: Record<string, CompositeType>, branch: Record<string, CompositeType>): CompositeTypeChange[];
@@ -1,5 +1,5 @@
1
1
  import { diffObjects } from "../../base.diff.js";
2
- import { diffPrivileges, filterPublicBuiltInDefaults, groupPrivilegesByGrantable, } from "../../base.privilege-diff.js";
2
+ import { diffPrivileges, emitObjectPrivilegeChanges, filterPublicBuiltInDefaults, } from "../../base.privilege-diff.js";
3
3
  import { deepEqual, hasNonAlterableChanges } from "../../utils.js";
4
4
  import { AlterCompositeTypeAddAttribute, AlterCompositeTypeAlterAttributeType, AlterCompositeTypeChangeOwner, AlterCompositeTypeDropAttribute, } from "./changes/composite-type.alter.js";
5
5
  import { CreateCommentOnCompositeType, CreateCommentOnCompositeTypeAttribute, DropCommentOnCompositeType, DropCommentOnCompositeTypeAttribute, } from "./changes/composite-type.comment.js";
@@ -47,50 +47,21 @@ export function diffCompositeTypes(ctx, main, branch) {
47
47
  // We compare default privileges against desired privileges to generate REVOKE/GRANT statements
48
48
  // needed to reach the final desired state.
49
49
  const effectiveDefaults = ctx.defaultPrivilegeState.getEffectiveDefaults(ctx.currentUser, "composite_type", ct.schema ?? "");
50
+ const creatorFilteredDefaults = ct.owner !== ctx.currentUser
51
+ ? effectiveDefaults.filter((p) => p.grantee !== ctx.currentUser)
52
+ : effectiveDefaults;
50
53
  // Filter out PUBLIC's built-in default USAGE privilege (PostgreSQL grants it automatically)
51
54
  // Reference: https://www.postgresql.org/docs/17/ddl-priv.html Table 5.2
52
55
  // This prevents generating unnecessary "GRANT USAGE TO PUBLIC" statements
53
56
  const desiredPrivileges = filterPublicBuiltInDefaults("composite_type", ct.privileges);
54
57
  // Filter out owner privileges - owner always has ALL privileges implicitly
55
58
  // and shouldn't be compared. Use the composite type owner as the reference.
56
- const privilegeResults = diffPrivileges(effectiveDefaults, desiredPrivileges, ct.owner);
57
- // Generate grant changes
58
- for (const [grantee, result] of privilegeResults) {
59
- if (result.grants.length > 0) {
60
- const grantGroups = groupPrivilegesByGrantable(result.grants);
61
- for (const [grantable, list] of grantGroups) {
62
- void grantable;
63
- changes.push(new GrantCompositeTypePrivileges({
64
- compositeType: ct,
65
- grantee,
66
- privileges: list,
67
- version: ctx.version,
68
- }));
69
- }
70
- }
71
- // Generate revoke changes
72
- if (result.revokes.length > 0) {
73
- const revokeGroups = groupPrivilegesByGrantable(result.revokes);
74
- for (const [grantable, list] of revokeGroups) {
75
- void grantable;
76
- changes.push(new RevokeCompositeTypePrivileges({
77
- compositeType: ct,
78
- grantee,
79
- privileges: list,
80
- version: ctx.version,
81
- }));
82
- }
83
- }
84
- // Generate revoke grant option changes
85
- if (result.revokeGrantOption.length > 0) {
86
- changes.push(new RevokeGrantOptionCompositeTypePrivileges({
87
- compositeType: ct,
88
- grantee,
89
- privilegeNames: result.revokeGrantOption,
90
- version: ctx.version,
91
- }));
92
- }
93
- }
59
+ const privilegeResults = diffPrivileges(filterPublicBuiltInDefaults("composite_type", creatorFilteredDefaults), desiredPrivileges, ct.owner);
60
+ changes.push(...emitObjectPrivilegeChanges(privilegeResults, ct, ct, "compositeType", {
61
+ Grant: GrantCompositeTypePrivileges,
62
+ Revoke: RevokeCompositeTypePrivileges,
63
+ RevokeGrantOption: RevokeGrantOptionCompositeTypePrivileges,
64
+ }, ctx.version));
94
65
  }
95
66
  for (const compositeTypeId of dropped) {
96
67
  changes.push(new DropCompositeType({ compositeType: main[compositeTypeId] }));
@@ -203,44 +174,12 @@ export function diffCompositeTypes(ctx, main, branch) {
203
174
  const branchPrivilegesFiltered = filterPublicBuiltInDefaults("composite_type", branchCompositeType.privileges);
204
175
  // Filter out owner privileges - owner always has ALL privileges implicitly
205
176
  // and shouldn't be compared. Use branch owner as the reference.
206
- const privilegeResults = diffPrivileges(mainPrivilegesFiltered, branchPrivilegesFiltered, branchCompositeType.owner, ctx.mainRoles);
207
- for (const [grantee, result] of privilegeResults) {
208
- // Generate grant changes
209
- if (result.grants.length > 0) {
210
- const grantGroups = groupPrivilegesByGrantable(result.grants);
211
- for (const [grantable, list] of grantGroups) {
212
- void grantable;
213
- changes.push(new GrantCompositeTypePrivileges({
214
- compositeType: branchCompositeType,
215
- grantee,
216
- privileges: list,
217
- version: ctx.version,
218
- }));
219
- }
220
- }
221
- // Generate revoke changes
222
- if (result.revokes.length > 0) {
223
- const revokeGroups = groupPrivilegesByGrantable(result.revokes);
224
- for (const [grantable, list] of revokeGroups) {
225
- void grantable;
226
- changes.push(new RevokeCompositeTypePrivileges({
227
- compositeType: mainCompositeType,
228
- grantee,
229
- privileges: list,
230
- version: ctx.version,
231
- }));
232
- }
233
- }
234
- // Generate revoke grant option changes
235
- if (result.revokeGrantOption.length > 0) {
236
- changes.push(new RevokeGrantOptionCompositeTypePrivileges({
237
- compositeType: mainCompositeType,
238
- grantee,
239
- privilegeNames: result.revokeGrantOption,
240
- version: ctx.version,
241
- }));
242
- }
243
- }
177
+ const privilegeResults = diffPrivileges(mainPrivilegesFiltered, branchPrivilegesFiltered, branchCompositeType.owner);
178
+ changes.push(...emitObjectPrivilegeChanges(privilegeResults, branchCompositeType, mainCompositeType, "compositeType", {
179
+ Grant: GrantCompositeTypePrivileges,
180
+ Revoke: RevokeCompositeTypePrivileges,
181
+ RevokeGrantOption: RevokeGrantOptionCompositeTypePrivileges,
182
+ }, ctx.version));
244
183
  // Note: Composite type renaming would also use ALTER TYPE ... RENAME TO ...
245
184
  // But since our CompositeType model uses 'name' as the identity field,
246
185
  // 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, type TableLikeObject } from "../../base.model.ts";
4
4
  import { type PrivilegeProps } from "../../base.privilege-diff.ts";
@@ -144,5 +144,5 @@ export declare class CompositeType extends BasePgModel implements TableLikeObjec
144
144
  };
145
145
  };
146
146
  }
147
- export declare function extractCompositeTypes(sql: Sql): Promise<CompositeType[]>;
147
+ export declare function extractCompositeTypes(pool: Pool): Promise<CompositeType[]>;
148
148
  export {};