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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (633) hide show
  1. package/README.md +41 -2
  2. package/dist/cli/app.js +26 -3
  3. package/dist/cli/bin/cli.js +5 -0
  4. package/dist/cli/commands/catalog-export.d.ts +5 -0
  5. package/dist/cli/commands/catalog-export.js +64 -0
  6. package/dist/cli/commands/declarative-apply.d.ts +6 -0
  7. package/dist/cli/commands/declarative-apply.js +288 -0
  8. package/dist/cli/commands/declarative-export.d.ts +5 -0
  9. package/dist/cli/commands/declarative-export.js +245 -0
  10. package/dist/cli/commands/plan.js +40 -6
  11. package/dist/cli/exit-code.d.ts +2 -0
  12. package/dist/cli/exit-code.js +7 -0
  13. package/dist/cli/formatters/tree/tree.js +3 -2
  14. package/dist/cli/utils/apply-display.d.ts +52 -0
  15. package/dist/cli/utils/apply-display.js +183 -0
  16. package/dist/cli/utils/export-display.d.ts +43 -0
  17. package/dist/cli/utils/export-display.js +202 -0
  18. package/dist/cli/utils/resolve-input.d.ts +7 -0
  19. package/dist/cli/utils/resolve-input.js +13 -0
  20. package/dist/cli/utils.d.ts +2 -0
  21. package/dist/cli/utils.js +1 -1
  22. package/dist/core/catalog-export/index.d.ts +11 -0
  23. package/dist/core/catalog-export/index.js +10 -0
  24. package/dist/core/catalog.diff.d.ts +1 -0
  25. package/dist/core/catalog.diff.js +64 -48
  26. package/dist/core/catalog.model.d.ts +14 -1
  27. package/dist/core/catalog.model.js +103 -1
  28. package/dist/core/catalog.snapshot.d.ts +66 -0
  29. package/dist/core/catalog.snapshot.js +206 -0
  30. package/dist/core/declarative-apply/discover-sql.d.ts +18 -0
  31. package/dist/core/declarative-apply/discover-sql.js +86 -0
  32. package/dist/core/declarative-apply/extract-catalog-providers.d.ts +23 -0
  33. package/dist/core/declarative-apply/extract-catalog-providers.js +159 -0
  34. package/dist/core/declarative-apply/index.d.ts +49 -0
  35. package/dist/core/declarative-apply/index.js +134 -0
  36. package/dist/core/declarative-apply/round-apply.d.ts +100 -0
  37. package/dist/core/declarative-apply/round-apply.js +378 -0
  38. package/dist/core/export/file-mapper.d.ts +71 -0
  39. package/dist/core/export/file-mapper.js +474 -0
  40. package/dist/core/export/grouper.d.ts +13 -0
  41. package/dist/core/export/grouper.js +76 -0
  42. package/dist/core/export/index.d.ts +45 -0
  43. package/dist/core/export/index.js +63 -0
  44. package/dist/core/export/types.d.ts +84 -0
  45. package/dist/core/export/types.js +25 -0
  46. package/dist/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
  47. package/dist/core/integrations/filter/dsl.d.ts +38 -1
  48. package/dist/core/integrations/filter/dsl.js +20 -2
  49. package/dist/core/integrations/filter/extractors.js +42 -0
  50. package/dist/core/integrations/integration-dsl.d.ts +10 -0
  51. package/dist/core/integrations/supabase.d.ts +8 -0
  52. package/dist/core/integrations/supabase.js +9 -0
  53. package/dist/core/objects/aggregate/aggregate.diff.d.ts +2 -8
  54. package/dist/core/objects/aggregate/aggregate.diff.js +16 -70
  55. package/dist/core/objects/aggregate/aggregate.model.d.ts +8 -8
  56. package/dist/core/objects/aggregate/aggregate.model.js +1 -1
  57. package/dist/core/objects/aggregate/changes/aggregate.create.js +1 -1
  58. package/dist/core/objects/aggregate/changes/aggregate.drop.js +1 -1
  59. package/dist/core/objects/base.privilege-diff.d.ts +38 -13
  60. package/dist/core/objects/base.privilege-diff.js +104 -22
  61. package/dist/core/objects/base.privilege.d.ts +1 -0
  62. package/dist/core/objects/base.privilege.js +9 -2
  63. package/dist/core/objects/collation/collation.diff.d.ts +2 -3
  64. package/dist/core/objects/diff-context.d.ts +15 -0
  65. package/dist/core/objects/diff-context.js +1 -0
  66. package/dist/core/objects/domain/changes/domain.create.js +4 -2
  67. package/dist/core/objects/domain/domain.diff.d.ts +2 -8
  68. package/dist/core/objects/domain/domain.diff.js +16 -77
  69. package/dist/core/objects/domain/domain.model.js +1 -1
  70. package/dist/core/objects/event-trigger/event-trigger.diff.d.ts +2 -3
  71. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.d.ts +2 -8
  72. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.js +13 -77
  73. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.js +2 -2
  74. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.d.ts +2 -8
  75. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.js +16 -77
  76. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.js +1 -1
  77. package/dist/core/objects/foreign-data-wrapper/server/server.diff.d.ts +2 -8
  78. package/dist/core/objects/foreign-data-wrapper/server/server.diff.js +13 -77
  79. package/dist/core/objects/language/language.diff.d.ts +2 -5
  80. package/dist/core/objects/language/language.diff.js +7 -39
  81. package/dist/core/objects/materialized-view/materialized-view.diff.d.ts +2 -8
  82. package/dist/core/objects/materialized-view/materialized-view.diff.js +16 -158
  83. package/dist/core/objects/materialized-view/materialized-view.model.d.ts +3 -3
  84. package/dist/core/objects/materialized-view/materialized-view.model.js +1 -1
  85. package/dist/core/objects/procedure/changes/procedure.alter.js +12 -12
  86. package/dist/core/objects/procedure/procedure.diff.d.ts +2 -8
  87. package/dist/core/objects/procedure/procedure.diff.js +16 -77
  88. package/dist/core/objects/procedure/procedure.model.d.ts +9 -9
  89. package/dist/core/objects/procedure/procedure.model.js +1 -1
  90. package/dist/core/objects/publication/changes/publication.alter.d.ts +0 -9
  91. package/dist/core/objects/publication/changes/publication.alter.js +0 -14
  92. package/dist/core/objects/publication/changes/publication.types.d.ts +2 -2
  93. package/dist/core/objects/publication/publication.diff.d.ts +2 -3
  94. package/dist/core/objects/publication/publication.diff.js +8 -13
  95. package/dist/core/objects/rls-policy/changes/rls-policy.alter.js +3 -3
  96. package/dist/core/objects/rls-policy/rls-policy.model.d.ts +2 -2
  97. package/dist/core/objects/role/role.diff.js +22 -1
  98. package/dist/core/objects/role/role.model.d.ts +4 -3
  99. package/dist/core/objects/role/role.model.js +118 -12
  100. package/dist/core/objects/rule/rule.model.d.ts +1 -1
  101. package/dist/core/objects/schema/schema.diff.d.ts +2 -8
  102. package/dist/core/objects/schema/schema.diff.js +16 -77
  103. package/dist/core/objects/schema/schema.model.js +1 -1
  104. package/dist/core/objects/sequence/sequence.diff.d.ts +2 -8
  105. package/dist/core/objects/sequence/sequence.diff.js +16 -79
  106. package/dist/core/objects/sequence/sequence.model.js +1 -1
  107. package/dist/core/objects/subscription/subscription.diff.d.ts +2 -3
  108. package/dist/core/objects/table/changes/table.create.js +3 -0
  109. package/dist/core/objects/table/table.diff.d.ts +2 -8
  110. package/dist/core/objects/table/table.diff.js +26 -157
  111. package/dist/core/objects/table/table.model.d.ts +25 -22
  112. package/dist/core/objects/table/table.model.js +4 -1
  113. package/dist/core/objects/trigger/changes/trigger.alter.js +23 -0
  114. package/dist/core/objects/trigger/changes/trigger.create.js +4 -5
  115. package/dist/core/objects/trigger/trigger.model.d.ts +9 -0
  116. package/dist/core/objects/trigger/trigger.model.js +14 -0
  117. package/dist/core/objects/type/composite-type/composite-type.diff.d.ts +2 -8
  118. package/dist/core/objects/type/composite-type/composite-type.diff.js +16 -77
  119. package/dist/core/objects/type/composite-type/composite-type.model.d.ts +3 -3
  120. package/dist/core/objects/type/composite-type/composite-type.model.js +2 -1
  121. package/dist/core/objects/type/enum/enum.diff.d.ts +2 -8
  122. package/dist/core/objects/type/enum/enum.diff.js +25 -112
  123. package/dist/core/objects/type/enum/enum.model.js +1 -1
  124. package/dist/core/objects/type/range/changes/range.create.js +6 -3
  125. package/dist/core/objects/type/range/range.diff.d.ts +2 -8
  126. package/dist/core/objects/type/range/range.diff.js +16 -77
  127. package/dist/core/objects/type/range/range.model.js +1 -1
  128. package/dist/core/objects/view/view.diff.d.ts +2 -8
  129. package/dist/core/objects/view/view.diff.js +16 -158
  130. package/dist/core/objects/view/view.model.d.ts +18 -4
  131. package/dist/core/objects/view/view.model.js +3 -13
  132. package/dist/core/plan/apply.js +11 -28
  133. package/dist/core/plan/create.d.ts +19 -6
  134. package/dist/core/plan/create.js +134 -155
  135. package/dist/core/plan/serialize.js +16 -4
  136. package/dist/core/plan/sql-format/constants.d.ts +2 -0
  137. package/dist/core/plan/sql-format/constants.js +11 -0
  138. package/dist/core/plan/sql-format/fixtures.d.ts +2 -0
  139. package/dist/core/plan/sql-format/fixtures.js +2447 -0
  140. package/dist/core/plan/sql-format/format-utils.d.ts +37 -0
  141. package/dist/core/plan/sql-format/format-utils.js +274 -0
  142. package/dist/core/plan/sql-format/formatters.d.ts +20 -0
  143. package/dist/core/plan/sql-format/formatters.js +737 -0
  144. package/dist/core/plan/sql-format/index.d.ts +2 -0
  145. package/dist/core/plan/sql-format/index.js +98 -0
  146. package/dist/core/plan/sql-format/keyword-case.d.ts +2 -0
  147. package/dist/core/plan/sql-format/keyword-case.js +893 -0
  148. package/dist/core/plan/sql-format/protect.d.ts +3 -0
  149. package/dist/core/plan/sql-format/protect.js +269 -0
  150. package/dist/core/plan/sql-format/sql-scanner.d.ts +59 -0
  151. package/dist/core/plan/sql-format/sql-scanner.js +202 -0
  152. package/dist/core/plan/sql-format/tokenizer.d.ts +22 -0
  153. package/dist/core/plan/sql-format/tokenizer.js +118 -0
  154. package/dist/core/plan/sql-format/types.d.ts +28 -0
  155. package/dist/core/plan/sql-format/types.js +1 -0
  156. package/dist/core/plan/sql-format/wrap.d.ts +2 -0
  157. package/dist/core/plan/sql-format/wrap.js +165 -0
  158. package/dist/core/plan/sql-format.d.ts +2 -0
  159. package/dist/core/plan/sql-format.js +1 -0
  160. package/dist/core/plan/ssl-config.d.ts +32 -0
  161. package/dist/core/plan/ssl-config.js +115 -0
  162. package/dist/core/plan/statements.d.ts +2 -1
  163. package/dist/core/plan/statements.js +6 -2
  164. package/dist/core/plan/types.d.ts +6 -0
  165. package/dist/core/postgres-config.d.ts +29 -0
  166. package/dist/core/postgres-config.js +83 -2
  167. package/dist/core/sort/graph-builder.js +10 -0
  168. package/dist/core/sort/logical-sort.js +31 -23
  169. package/dist/core/test-utils/assert-valid-sql.d.ts +10 -0
  170. package/dist/core/test-utils/assert-valid-sql.js +19 -0
  171. package/dist/index.d.ts +8 -0
  172. package/dist/index.js +7 -1
  173. package/package.json +54 -22
  174. package/src/cli/app.ts +52 -0
  175. package/src/cli/bin/cli.ts +15 -0
  176. package/src/cli/commands/apply.ts +101 -0
  177. package/src/cli/commands/catalog-export.ts +78 -0
  178. package/src/cli/commands/declarative-apply.diagnostics.test.ts +77 -0
  179. package/src/cli/commands/declarative-apply.ts +380 -0
  180. package/src/cli/commands/declarative-export.ts +330 -0
  181. package/src/cli/commands/plan.ts +216 -0
  182. package/src/cli/commands/sync.ts +185 -0
  183. package/src/cli/exit-code.test.ts +19 -0
  184. package/src/cli/exit-code.ts +7 -0
  185. package/src/cli/formatters/index.ts +5 -0
  186. package/src/cli/formatters/tree/tree-builder.ts +380 -0
  187. package/src/cli/formatters/tree/tree-renderer.ts +372 -0
  188. package/src/cli/formatters/tree/tree.ts +238 -0
  189. package/src/cli/utils/apply-display.test.ts +348 -0
  190. package/src/cli/utils/apply-display.ts +238 -0
  191. package/src/cli/utils/export-display.test.ts +103 -0
  192. package/src/cli/utils/export-display.ts +275 -0
  193. package/src/cli/utils/integrations.test.ts +44 -0
  194. package/src/cli/utils/integrations.ts +42 -0
  195. package/src/cli/utils/resolve-input.test.ts +38 -0
  196. package/src/cli/utils/resolve-input.ts +17 -0
  197. package/src/cli/utils.ts +231 -0
  198. package/src/core/catalog-export/index.ts +20 -0
  199. package/src/core/catalog.diff.ts +247 -0
  200. package/src/core/catalog.model.test.ts +122 -0
  201. package/src/core/catalog.model.ts +510 -0
  202. package/src/core/catalog.snapshot.test.ts +464 -0
  203. package/src/core/catalog.snapshot.ts +289 -0
  204. package/src/core/change.types.ts +44 -0
  205. package/src/core/context.ts +26 -0
  206. package/src/core/declarative-apply/discover-sql.test.ts +103 -0
  207. package/src/core/declarative-apply/discover-sql.ts +107 -0
  208. package/src/core/declarative-apply/extract-catalog-providers.ts +220 -0
  209. package/src/core/declarative-apply/index.test.ts +67 -0
  210. package/src/core/declarative-apply/index.ts +205 -0
  211. package/src/core/declarative-apply/round-apply.test.ts +504 -0
  212. package/src/core/declarative-apply/round-apply.ts +562 -0
  213. package/src/core/depend.ts +1870 -0
  214. package/src/core/expand-replace-dependencies.test.ts +70 -0
  215. package/src/core/expand-replace-dependencies.ts +380 -0
  216. package/src/core/export/file-mapper.test.ts +816 -0
  217. package/src/core/export/file-mapper.ts +574 -0
  218. package/src/core/export/grouper.ts +108 -0
  219. package/src/core/export/index.ts +129 -0
  220. package/src/core/export/types.ts +104 -0
  221. package/src/core/fingerprint.ts +204 -0
  222. package/src/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
  223. package/src/core/integrations/filter/dsl.test.ts +211 -0
  224. package/src/core/integrations/filter/dsl.ts +266 -0
  225. package/src/core/integrations/filter/extractors.test.ts +244 -0
  226. package/src/core/integrations/filter/extractors.ts +187 -0
  227. package/src/core/integrations/filter/filter.types.ts +3 -0
  228. package/src/core/integrations/integration-dsl.ts +34 -0
  229. package/src/core/integrations/integration.types.ts +7 -0
  230. package/src/core/integrations/serialize/dsl.test.ts +91 -0
  231. package/src/core/integrations/serialize/dsl.ts +77 -0
  232. package/src/core/integrations/serialize/serialize.types.ts +3 -0
  233. package/src/core/integrations/supabase.ts +130 -0
  234. package/src/core/objects/aggregate/aggregate.diff.test.ts +215 -0
  235. package/src/core/objects/aggregate/aggregate.diff.ts +222 -0
  236. package/src/core/objects/aggregate/aggregate.model.ts +317 -0
  237. package/src/core/objects/aggregate/changes/aggregate.alter.test.ts +66 -0
  238. package/src/core/objects/aggregate/changes/aggregate.alter.ts +32 -0
  239. package/src/core/objects/aggregate/changes/aggregate.base.ts +20 -0
  240. package/src/core/objects/aggregate/changes/aggregate.comment.test.ts +89 -0
  241. package/src/core/objects/aggregate/changes/aggregate.comment.ts +62 -0
  242. package/src/core/objects/aggregate/changes/aggregate.create.test.ts +104 -0
  243. package/src/core/objects/aggregate/changes/aggregate.create.ts +329 -0
  244. package/src/core/objects/aggregate/changes/aggregate.drop.test.ts +82 -0
  245. package/src/core/objects/aggregate/changes/aggregate.drop.ts +32 -0
  246. package/src/core/objects/aggregate/changes/aggregate.privilege.test.ts +136 -0
  247. package/src/core/objects/aggregate/changes/aggregate.privilege.ts +146 -0
  248. package/src/core/objects/aggregate/changes/aggregate.types.ts +12 -0
  249. package/src/core/objects/base.change.ts +62 -0
  250. package/src/core/objects/base.default-privileges.ts +204 -0
  251. package/src/core/objects/base.diff.ts +20 -0
  252. package/src/core/objects/base.model.ts +82 -0
  253. package/src/core/objects/base.privilege-diff.ts +447 -0
  254. package/src/core/objects/base.privilege.ts +191 -0
  255. package/src/core/objects/collation/changes/collation.alter.test.ts +68 -0
  256. package/src/core/objects/collation/changes/collation.alter.ts +79 -0
  257. package/src/core/objects/collation/changes/collation.base.ts +20 -0
  258. package/src/core/objects/collation/changes/collation.comment.ts +68 -0
  259. package/src/core/objects/collation/changes/collation.create.test.ts +56 -0
  260. package/src/core/objects/collation/changes/collation.create.ts +106 -0
  261. package/src/core/objects/collation/changes/collation.drop.test.ts +31 -0
  262. package/src/core/objects/collation/changes/collation.drop.ts +37 -0
  263. package/src/core/objects/collation/changes/collation.types.ts +10 -0
  264. package/src/core/objects/collation/collation.diff.test.ts +97 -0
  265. package/src/core/objects/collation/collation.diff.ts +127 -0
  266. package/src/core/objects/collation/collation.model.ts +224 -0
  267. package/src/core/objects/diff-context.ts +16 -0
  268. package/src/core/objects/domain/changes/domain.alter.test.ts +335 -0
  269. package/src/core/objects/domain/changes/domain.alter.ts +286 -0
  270. package/src/core/objects/domain/changes/domain.base.ts +20 -0
  271. package/src/core/objects/domain/changes/domain.comment.ts +59 -0
  272. package/src/core/objects/domain/changes/domain.create.test.ts +95 -0
  273. package/src/core/objects/domain/changes/domain.create.ts +124 -0
  274. package/src/core/objects/domain/changes/domain.drop.test.ts +33 -0
  275. package/src/core/objects/domain/changes/domain.drop.ts +34 -0
  276. package/src/core/objects/domain/changes/domain.privilege.ts +171 -0
  277. package/src/core/objects/domain/changes/domain.types.ts +12 -0
  278. package/src/core/objects/domain/domain.diff.test.ts +284 -0
  279. package/src/core/objects/domain/domain.diff.ts +295 -0
  280. package/src/core/objects/domain/domain.model.ts +190 -0
  281. package/src/core/objects/event-trigger/changes/event-trigger.alter.test.ts +57 -0
  282. package/src/core/objects/event-trigger/changes/event-trigger.alter.ts +82 -0
  283. package/src/core/objects/event-trigger/changes/event-trigger.base.ts +20 -0
  284. package/src/core/objects/event-trigger/changes/event-trigger.comment.ts +66 -0
  285. package/src/core/objects/event-trigger/changes/event-trigger.create.test.ts +27 -0
  286. package/src/core/objects/event-trigger/changes/event-trigger.create.ts +72 -0
  287. package/src/core/objects/event-trigger/changes/event-trigger.drop.test.ts +25 -0
  288. package/src/core/objects/event-trigger/changes/event-trigger.drop.ts +34 -0
  289. package/src/core/objects/event-trigger/changes/event-trigger.types.ts +10 -0
  290. package/src/core/objects/event-trigger/event-trigger.diff.test.ts +131 -0
  291. package/src/core/objects/event-trigger/event-trigger.diff.ts +127 -0
  292. package/src/core/objects/event-trigger/event-trigger.model.ts +106 -0
  293. package/src/core/objects/extension/changes/extension.alter.test.ts +63 -0
  294. package/src/core/objects/extension/changes/extension.alter.ts +78 -0
  295. package/src/core/objects/extension/changes/extension.base.ts +20 -0
  296. package/src/core/objects/extension/changes/extension.comment.ts +64 -0
  297. package/src/core/objects/extension/changes/extension.create.test.ts +28 -0
  298. package/src/core/objects/extension/changes/extension.create.ts +63 -0
  299. package/src/core/objects/extension/changes/extension.drop.test.ts +26 -0
  300. package/src/core/objects/extension/changes/extension.drop.ts +34 -0
  301. package/src/core/objects/extension/changes/extension.types.ts +10 -0
  302. package/src/core/objects/extension/extension.diff.test.ts +42 -0
  303. package/src/core/objects/extension/extension.diff.ts +90 -0
  304. package/src/core/objects/extension/extension.model.test.ts +98 -0
  305. package/src/core/objects/extension/extension.model.ts +280 -0
  306. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.test.ts +136 -0
  307. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.ts +101 -0
  308. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.base.ts +20 -0
  309. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.ts +72 -0
  310. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.test.ts +160 -0
  311. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.ts +95 -0
  312. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.test.ts +26 -0
  313. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.ts +36 -0
  314. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.ts +172 -0
  315. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.ts +12 -0
  316. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.test.ts +286 -0
  317. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.ts +271 -0
  318. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.ts +149 -0
  319. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.ts +10 -0
  320. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.test.ts +340 -0
  321. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.ts +341 -0
  322. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.base.ts +20 -0
  323. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.ts +72 -0
  324. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.test.ts +210 -0
  325. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.ts +81 -0
  326. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.test.ts +46 -0
  327. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.ts +37 -0
  328. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.ts +181 -0
  329. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.ts +12 -0
  330. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.test.ts +813 -0
  331. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.ts +343 -0
  332. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.ts +242 -0
  333. package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.test.ts +183 -0
  334. package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.ts +126 -0
  335. package/src/core/objects/foreign-data-wrapper/server/changes/server.base.ts +20 -0
  336. package/src/core/objects/foreign-data-wrapper/server/changes/server.comment.ts +60 -0
  337. package/src/core/objects/foreign-data-wrapper/server/changes/server.create.test.ts +144 -0
  338. package/src/core/objects/foreign-data-wrapper/server/changes/server.create.ts +81 -0
  339. package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.test.ts +27 -0
  340. package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.ts +34 -0
  341. package/src/core/objects/foreign-data-wrapper/server/changes/server.privilege.ts +164 -0
  342. package/src/core/objects/foreign-data-wrapper/server/changes/server.types.ts +12 -0
  343. package/src/core/objects/foreign-data-wrapper/server/server.diff.test.ts +262 -0
  344. package/src/core/objects/foreign-data-wrapper/server/server.diff.ts +247 -0
  345. package/src/core/objects/foreign-data-wrapper/server/server.model.ts +133 -0
  346. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.test.ts +91 -0
  347. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.ts +69 -0
  348. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.base.ts +20 -0
  349. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.test.ts +96 -0
  350. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.ts +66 -0
  351. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.test.ts +60 -0
  352. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.ts +40 -0
  353. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.ts +8 -0
  354. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.test.ts +77 -0
  355. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.ts +107 -0
  356. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.ts +96 -0
  357. package/src/core/objects/index/changes/index.alter.test.ts +209 -0
  358. package/src/core/objects/index/changes/index.alter.ts +144 -0
  359. package/src/core/objects/index/changes/index.base.ts +20 -0
  360. package/src/core/objects/index/changes/index.comment.ts +63 -0
  361. package/src/core/objects/index/changes/index.create.test.ts +69 -0
  362. package/src/core/objects/index/changes/index.create.ts +68 -0
  363. package/src/core/objects/index/changes/index.drop.test.ts +47 -0
  364. package/src/core/objects/index/changes/index.drop.ts +34 -0
  365. package/src/core/objects/index/changes/index.types.ts +6 -0
  366. package/src/core/objects/index/changes/utils.ts +16 -0
  367. package/src/core/objects/index/index.diff.test.ts +153 -0
  368. package/src/core/objects/index/index.diff.ts +243 -0
  369. package/src/core/objects/index/index.model.ts +370 -0
  370. package/src/core/objects/language/changes/language.alter.test.ts +36 -0
  371. package/src/core/objects/language/changes/language.alter.ts +53 -0
  372. package/src/core/objects/language/changes/language.base.ts +20 -0
  373. package/src/core/objects/language/changes/language.comment.ts +58 -0
  374. package/src/core/objects/language/changes/language.create.test.ts +30 -0
  375. package/src/core/objects/language/changes/language.create.ts +104 -0
  376. package/src/core/objects/language/changes/language.drop.test.ts +28 -0
  377. package/src/core/objects/language/changes/language.drop.ts +39 -0
  378. package/src/core/objects/language/changes/language.privilege.ts +172 -0
  379. package/src/core/objects/language/changes/language.types.ts +12 -0
  380. package/src/core/objects/language/language.diff.test.ts +135 -0
  381. package/src/core/objects/language/language.diff.ts +144 -0
  382. package/src/core/objects/language/language.model.ts +150 -0
  383. package/src/core/objects/materialized-view/changes/materialized-view.alter.test.ts +130 -0
  384. package/src/core/objects/materialized-view/changes/materialized-view.alter.ts +113 -0
  385. package/src/core/objects/materialized-view/changes/materialized-view.base.ts +20 -0
  386. package/src/core/objects/materialized-view/changes/materialized-view.comment.ts +176 -0
  387. package/src/core/objects/materialized-view/changes/materialized-view.create.test.ts +69 -0
  388. package/src/core/objects/materialized-view/changes/materialized-view.create.ts +93 -0
  389. package/src/core/objects/materialized-view/changes/materialized-view.drop.test.ts +37 -0
  390. package/src/core/objects/materialized-view/changes/materialized-view.drop.ts +60 -0
  391. package/src/core/objects/materialized-view/changes/materialized-view.privilege.ts +212 -0
  392. package/src/core/objects/materialized-view/changes/materialized-view.types.ts +12 -0
  393. package/src/core/objects/materialized-view/materialized-view.diff.test.ts +264 -0
  394. package/src/core/objects/materialized-view/materialized-view.diff.ts +301 -0
  395. package/src/core/objects/materialized-view/materialized-view.model.ts +258 -0
  396. package/src/core/objects/procedure/changes/procedure.alter.test.ts +1077 -0
  397. package/src/core/objects/procedure/changes/procedure.alter.ts +290 -0
  398. package/src/core/objects/procedure/changes/procedure.base.ts +20 -0
  399. package/src/core/objects/procedure/changes/procedure.comment.ts +70 -0
  400. package/src/core/objects/procedure/changes/procedure.create.test.ts +51 -0
  401. package/src/core/objects/procedure/changes/procedure.create.ts +92 -0
  402. package/src/core/objects/procedure/changes/procedure.drop.test.ts +90 -0
  403. package/src/core/objects/procedure/changes/procedure.drop.ts +49 -0
  404. package/src/core/objects/procedure/changes/procedure.privilege.ts +188 -0
  405. package/src/core/objects/procedure/changes/procedure.types.ts +12 -0
  406. package/src/core/objects/procedure/procedure.diff.test.ts +161 -0
  407. package/src/core/objects/procedure/procedure.diff.ts +341 -0
  408. package/src/core/objects/procedure/procedure.model.ts +264 -0
  409. package/src/core/objects/procedure/utils.ts +58 -0
  410. package/src/core/objects/publication/changes/publication.alter.test.ts +217 -0
  411. package/src/core/objects/publication/changes/publication.alter.ts +225 -0
  412. package/src/core/objects/publication/changes/publication.base.ts +20 -0
  413. package/src/core/objects/publication/changes/publication.comment.test.ts +73 -0
  414. package/src/core/objects/publication/changes/publication.comment.ts +64 -0
  415. package/src/core/objects/publication/changes/publication.create.test.ts +90 -0
  416. package/src/core/objects/publication/changes/publication.create.ts +82 -0
  417. package/src/core/objects/publication/changes/publication.drop.test.ts +48 -0
  418. package/src/core/objects/publication/changes/publication.drop.ts +29 -0
  419. package/src/core/objects/publication/changes/publication.types.ts +24 -0
  420. package/src/core/objects/publication/publication.diff.test.ts +297 -0
  421. package/src/core/objects/publication/publication.diff.ts +247 -0
  422. package/src/core/objects/publication/publication.model.ts +206 -0
  423. package/src/core/objects/publication/utils.ts +55 -0
  424. package/src/core/objects/rls-policy/changes/rls-policy.alter.test.ts +267 -0
  425. package/src/core/objects/rls-policy/changes/rls-policy.alter.ts +128 -0
  426. package/src/core/objects/rls-policy/changes/rls-policy.base.ts +20 -0
  427. package/src/core/objects/rls-policy/changes/rls-policy.comment.ts +69 -0
  428. package/src/core/objects/rls-policy/changes/rls-policy.create.test.ts +81 -0
  429. package/src/core/objects/rls-policy/changes/rls-policy.create.ts +100 -0
  430. package/src/core/objects/rls-policy/changes/rls-policy.drop.test.ts +31 -0
  431. package/src/core/objects/rls-policy/changes/rls-policy.drop.ts +39 -0
  432. package/src/core/objects/rls-policy/changes/rls-policy.types.ts +10 -0
  433. package/src/core/objects/rls-policy/rls-policy.diff.test.ts +79 -0
  434. package/src/core/objects/rls-policy/rls-policy.diff.ts +121 -0
  435. package/src/core/objects/rls-policy/rls-policy.model.ts +140 -0
  436. package/src/core/objects/role/changes/role.alter.test.ts +362 -0
  437. package/src/core/objects/role/changes/role.alter.ts +110 -0
  438. package/src/core/objects/role/changes/role.base.ts +24 -0
  439. package/src/core/objects/role/changes/role.comment.ts +55 -0
  440. package/src/core/objects/role/changes/role.create.test.ts +56 -0
  441. package/src/core/objects/role/changes/role.create.ts +102 -0
  442. package/src/core/objects/role/changes/role.drop.test.ts +32 -0
  443. package/src/core/objects/role/changes/role.drop.ts +34 -0
  444. package/src/core/objects/role/changes/role.privilege.ts +376 -0
  445. package/src/core/objects/role/changes/role.types.ts +12 -0
  446. package/src/core/objects/role/role.diff.test.ts +279 -0
  447. package/src/core/objects/role/role.diff.ts +499 -0
  448. package/src/core/objects/role/role.model.ts +452 -0
  449. package/src/core/objects/rule/changes/rule.alter.test.ts +82 -0
  450. package/src/core/objects/rule/changes/rule.alter.ts +72 -0
  451. package/src/core/objects/rule/changes/rule.base.ts +20 -0
  452. package/src/core/objects/rule/changes/rule.comment.test.ts +58 -0
  453. package/src/core/objects/rule/changes/rule.comment.ts +62 -0
  454. package/src/core/objects/rule/changes/rule.create.test.ts +63 -0
  455. package/src/core/objects/rule/changes/rule.create.ts +42 -0
  456. package/src/core/objects/rule/changes/rule.drop.test.ts +40 -0
  457. package/src/core/objects/rule/changes/rule.drop.ts +29 -0
  458. package/src/core/objects/rule/changes/rule.types.ts +12 -0
  459. package/src/core/objects/rule/rule.diff.test.ts +132 -0
  460. package/src/core/objects/rule/rule.diff.ts +79 -0
  461. package/src/core/objects/rule/rule.model.ts +173 -0
  462. package/src/core/objects/schema/changes/schema.alter.test.ts +31 -0
  463. package/src/core/objects/schema/changes/schema.alter.ts +45 -0
  464. package/src/core/objects/schema/changes/schema.base.ts +20 -0
  465. package/src/core/objects/schema/changes/schema.comment.ts +56 -0
  466. package/src/core/objects/schema/changes/schema.create.test.ts +25 -0
  467. package/src/core/objects/schema/changes/schema.create.ts +47 -0
  468. package/src/core/objects/schema/changes/schema.drop.test.ts +23 -0
  469. package/src/core/objects/schema/changes/schema.drop.ts +34 -0
  470. package/src/core/objects/schema/changes/schema.privilege.ts +175 -0
  471. package/src/core/objects/schema/changes/schema.types.ts +12 -0
  472. package/src/core/objects/schema/schema.diff.test.ts +42 -0
  473. package/src/core/objects/schema/schema.diff.ts +146 -0
  474. package/src/core/objects/schema/schema.model.ts +107 -0
  475. package/src/core/objects/sequence/changes/sequence.alter.test.ts +157 -0
  476. package/src/core/objects/sequence/changes/sequence.alter.ts +115 -0
  477. package/src/core/objects/sequence/changes/sequence.base.ts +20 -0
  478. package/src/core/objects/sequence/changes/sequence.comment.ts +60 -0
  479. package/src/core/objects/sequence/changes/sequence.create.test.ts +89 -0
  480. package/src/core/objects/sequence/changes/sequence.create.ts +111 -0
  481. package/src/core/objects/sequence/changes/sequence.drop.test.ts +35 -0
  482. package/src/core/objects/sequence/changes/sequence.drop.ts +37 -0
  483. package/src/core/objects/sequence/changes/sequence.privilege.ts +179 -0
  484. package/src/core/objects/sequence/changes/sequence.types.ts +12 -0
  485. package/src/core/objects/sequence/sequence.diff.test.ts +255 -0
  486. package/src/core/objects/sequence/sequence.diff.ts +294 -0
  487. package/src/core/objects/sequence/sequence.model.ts +185 -0
  488. package/src/core/objects/subscription/changes/subscription.alter.test.ts +134 -0
  489. package/src/core/objects/subscription/changes/subscription.alter.ts +110 -0
  490. package/src/core/objects/subscription/changes/subscription.base.ts +20 -0
  491. package/src/core/objects/subscription/changes/subscription.comment.test.ts +70 -0
  492. package/src/core/objects/subscription/changes/subscription.comment.ts +64 -0
  493. package/src/core/objects/subscription/changes/subscription.create.test.ts +80 -0
  494. package/src/core/objects/subscription/changes/subscription.create.ts +69 -0
  495. package/src/core/objects/subscription/changes/subscription.drop.test.ts +48 -0
  496. package/src/core/objects/subscription/changes/subscription.drop.ts +20 -0
  497. package/src/core/objects/subscription/changes/subscription.types.ts +22 -0
  498. package/src/core/objects/subscription/subscription.diff.test.ts +237 -0
  499. package/src/core/objects/subscription/subscription.diff.ts +242 -0
  500. package/src/core/objects/subscription/subscription.model.ts +190 -0
  501. package/src/core/objects/subscription/utils.ts +156 -0
  502. package/src/core/objects/table/changes/table.alter.test.ts +846 -0
  503. package/src/core/objects/table/changes/table.alter.ts +806 -0
  504. package/src/core/objects/table/changes/table.base.ts +20 -0
  505. package/src/core/objects/table/changes/table.comment.ts +266 -0
  506. package/src/core/objects/table/changes/table.create.test.ts +188 -0
  507. package/src/core/objects/table/changes/table.create.ts +192 -0
  508. package/src/core/objects/table/changes/table.drop.test.ts +36 -0
  509. package/src/core/objects/table/changes/table.drop.ts +45 -0
  510. package/src/core/objects/table/changes/table.privilege.ts +200 -0
  511. package/src/core/objects/table/changes/table.types.ts +12 -0
  512. package/src/core/objects/table/table.diff.test.ts +868 -0
  513. package/src/core/objects/table/table.diff.ts +817 -0
  514. package/src/core/objects/table/table.model.ts +460 -0
  515. package/src/core/objects/trigger/changes/trigger.alter.test.ts +50 -0
  516. package/src/core/objects/trigger/changes/trigger.alter.ts +76 -0
  517. package/src/core/objects/trigger/changes/trigger.base.ts +20 -0
  518. package/src/core/objects/trigger/changes/trigger.comment.ts +64 -0
  519. package/src/core/objects/trigger/changes/trigger.create.test.ts +47 -0
  520. package/src/core/objects/trigger/changes/trigger.create.ts +88 -0
  521. package/src/core/objects/trigger/changes/trigger.drop.test.ts +47 -0
  522. package/src/core/objects/trigger/changes/trigger.drop.ts +39 -0
  523. package/src/core/objects/trigger/changes/trigger.types.ts +10 -0
  524. package/src/core/objects/trigger/trigger.diff.test.ts +84 -0
  525. package/src/core/objects/trigger/trigger.diff.ts +116 -0
  526. package/src/core/objects/trigger/trigger.model.ts +264 -0
  527. package/src/core/objects/type/composite-type/changes/composite-type.alter.test.ts +208 -0
  528. package/src/core/objects/type/composite-type/changes/composite-type.alter.ts +174 -0
  529. package/src/core/objects/type/composite-type/changes/composite-type.base.ts +20 -0
  530. package/src/core/objects/type/composite-type/changes/composite-type.comment.ts +145 -0
  531. package/src/core/objects/type/composite-type/changes/composite-type.create.test.ts +106 -0
  532. package/src/core/objects/type/composite-type/changes/composite-type.create.ts +95 -0
  533. package/src/core/objects/type/composite-type/changes/composite-type.drop.test.ts +36 -0
  534. package/src/core/objects/type/composite-type/changes/composite-type.drop.ts +37 -0
  535. package/src/core/objects/type/composite-type/changes/composite-type.privilege.ts +175 -0
  536. package/src/core/objects/type/composite-type/changes/composite-type.types.ts +12 -0
  537. package/src/core/objects/type/composite-type/composite-type.diff.test.ts +269 -0
  538. package/src/core/objects/type/composite-type/composite-type.diff.ts +310 -0
  539. package/src/core/objects/type/composite-type/composite-type.model.ts +253 -0
  540. package/src/core/objects/type/enum/changes/enum.alter.test.ts +113 -0
  541. package/src/core/objects/type/enum/changes/enum.alter.ts +91 -0
  542. package/src/core/objects/type/enum/changes/enum.base.ts +20 -0
  543. package/src/core/objects/type/enum/changes/enum.comment.ts +64 -0
  544. package/src/core/objects/type/enum/changes/enum.create.test.ts +31 -0
  545. package/src/core/objects/type/enum/changes/enum.create.ts +56 -0
  546. package/src/core/objects/type/enum/changes/enum.drop.test.ts +28 -0
  547. package/src/core/objects/type/enum/changes/enum.drop.ts +34 -0
  548. package/src/core/objects/type/enum/changes/enum.privilege.ts +175 -0
  549. package/src/core/objects/type/enum/changes/enum.types.ts +12 -0
  550. package/src/core/objects/type/enum/enum.diff.test.ts +372 -0
  551. package/src/core/objects/type/enum/enum.diff.ts +308 -0
  552. package/src/core/objects/type/enum/enum.model.ts +194 -0
  553. package/src/core/objects/type/range/changes/range.alter.test.ts +29 -0
  554. package/src/core/objects/type/range/changes/range.alter.ts +51 -0
  555. package/src/core/objects/type/range/changes/range.base.ts +20 -0
  556. package/src/core/objects/type/range/changes/range.comment.ts +64 -0
  557. package/src/core/objects/type/range/changes/range.create.test.ts +54 -0
  558. package/src/core/objects/type/range/changes/range.create.ts +155 -0
  559. package/src/core/objects/type/range/changes/range.drop.test.ts +28 -0
  560. package/src/core/objects/type/range/changes/range.drop.ts +34 -0
  561. package/src/core/objects/type/range/changes/range.privilege.ts +175 -0
  562. package/src/core/objects/type/range/changes/range.types.ts +12 -0
  563. package/src/core/objects/type/range/range.diff.test.ts +147 -0
  564. package/src/core/objects/type/range/range.diff.ts +197 -0
  565. package/src/core/objects/type/range/range.model.ts +187 -0
  566. package/src/core/objects/type/type.types.ts +5 -0
  567. package/src/core/objects/utils.ts +171 -0
  568. package/src/core/objects/view/changes/view.alter.test.ts +115 -0
  569. package/src/core/objects/view/changes/view.alter.ts +112 -0
  570. package/src/core/objects/view/changes/view.base.ts +20 -0
  571. package/src/core/objects/view/changes/view.comment.ts +59 -0
  572. package/src/core/objects/view/changes/view.create.test.ts +70 -0
  573. package/src/core/objects/view/changes/view.create.ts +73 -0
  574. package/src/core/objects/view/changes/view.drop.test.ts +37 -0
  575. package/src/core/objects/view/changes/view.drop.ts +40 -0
  576. package/src/core/objects/view/changes/view.privilege.ts +200 -0
  577. package/src/core/objects/view/changes/view.types.ts +12 -0
  578. package/src/core/objects/view/view.diff.test.ts +173 -0
  579. package/src/core/objects/view/view.diff.ts +215 -0
  580. package/src/core/objects/view/view.model.ts +262 -0
  581. package/src/core/plan/apply.ts +172 -0
  582. package/src/core/plan/create.ts +368 -0
  583. package/src/core/plan/hierarchy.ts +574 -0
  584. package/src/core/plan/index.ts +29 -0
  585. package/src/core/plan/io.ts +20 -0
  586. package/src/core/plan/risk.ts +48 -0
  587. package/src/core/plan/serialize.test.ts +317 -0
  588. package/src/core/plan/serialize.ts +209 -0
  589. package/src/core/plan/sql-format/constants.ts +13 -0
  590. package/src/core/plan/sql-format/fixtures.ts +2803 -0
  591. package/src/core/plan/sql-format/format-comment-literals.test.ts +96 -0
  592. package/src/core/plan/sql-format/format-functions.test.ts +127 -0
  593. package/src/core/plan/sql-format/format-lowercase-coverage.test.ts +119 -0
  594. package/src/core/plan/sql-format/format-off.test.ts +806 -0
  595. package/src/core/plan/sql-format/format-pretty-lower-leading.test.ts +1061 -0
  596. package/src/core/plan/sql-format/format-pretty-narrow.test.ts +1279 -0
  597. package/src/core/plan/sql-format/format-pretty-preserve.test.ts +1057 -0
  598. package/src/core/plan/sql-format/format-pretty-upper.test.ts +1048 -0
  599. package/src/core/plan/sql-format/format-stress.test.ts +616 -0
  600. package/src/core/plan/sql-format/format-utils.test.ts +91 -0
  601. package/src/core/plan/sql-format/format-utils.ts +391 -0
  602. package/src/core/plan/sql-format/formatters.ts +921 -0
  603. package/src/core/plan/sql-format/index.ts +149 -0
  604. package/src/core/plan/sql-format/keyword-case.test.ts +118 -0
  605. package/src/core/plan/sql-format/keyword-case.ts +1120 -0
  606. package/src/core/plan/sql-format/protect.test.ts +127 -0
  607. package/src/core/plan/sql-format/protect.ts +337 -0
  608. package/src/core/plan/sql-format/sql-scanner.test.ts +240 -0
  609. package/src/core/plan/sql-format/sql-scanner.ts +252 -0
  610. package/src/core/plan/sql-format/tokenizer.test.ts +68 -0
  611. package/src/core/plan/sql-format/tokenizer.ts +152 -0
  612. package/src/core/plan/sql-format/types.ts +31 -0
  613. package/src/core/plan/sql-format/wrap.test.ts +119 -0
  614. package/src/core/plan/sql-format/wrap.ts +196 -0
  615. package/src/core/plan/sql-format.ts +2 -0
  616. package/src/core/plan/ssl-config.ts +172 -0
  617. package/src/core/plan/statements.ts +22 -0
  618. package/src/core/plan/types.ts +171 -0
  619. package/src/core/postgres-config.ts +238 -0
  620. package/src/core/sort/custom-constraints.ts +161 -0
  621. package/src/core/sort/debug-visualization.ts +239 -0
  622. package/src/core/sort/dependency-filter.ts +224 -0
  623. package/src/core/sort/graph-builder.ts +235 -0
  624. package/src/core/sort/graph-utils.ts +51 -0
  625. package/src/core/sort/logical-sort.test.ts +371 -0
  626. package/src/core/sort/logical-sort.ts +597 -0
  627. package/src/core/sort/sort-changes.ts +234 -0
  628. package/src/core/sort/topological-sort.test.ts +275 -0
  629. package/src/core/sort/topological-sort.ts +184 -0
  630. package/src/core/sort/types.ts +112 -0
  631. package/src/core/sort/utils.ts +69 -0
  632. package/src/core/test-utils/assert-valid-sql.ts +20 -0
  633. package/src/index.ts +38 -0
@@ -0,0 +1,202 @@
1
+ /**
2
+ * CLI helpers for declarative export: file tree, diff, and summary formatting.
3
+ */
4
+ import { readdir, readFile } from "node:fs/promises";
5
+ import path from "node:path";
6
+ import chalk from "chalk";
7
+ // ============================================================================
8
+ // Path safety
9
+ // ============================================================================
10
+ /**
11
+ * Ensure a relative file path does not escape the output directory.
12
+ * Uses Node.js path.resolve + startsWith as the canonical traversal check.
13
+ */
14
+ export function assertSafePath(filePath, outputDir) {
15
+ const resolvedOutput = path.resolve(outputDir);
16
+ const resolvedFile = path.resolve(outputDir, filePath);
17
+ if (resolvedFile !== resolvedOutput &&
18
+ !resolvedFile.startsWith(resolvedOutput + path.sep)) {
19
+ throw new Error(`Export path traversal detected: '${filePath}' resolves outside output directory`);
20
+ }
21
+ }
22
+ function getFileStatus(path, diff) {
23
+ if (diff.created.includes(path))
24
+ return "created";
25
+ if (diff.updated.includes(path))
26
+ return "updated";
27
+ if (diff.deleted.includes(path))
28
+ return "deleted";
29
+ return "unchanged";
30
+ }
31
+ function formatLeafSegment(segment, status) {
32
+ switch (status) {
33
+ case "created":
34
+ return chalk.green(`+ ${segment}`);
35
+ case "updated":
36
+ return chalk.yellow(`~ ${segment}`);
37
+ case "deleted":
38
+ return chalk.red(`- ${segment}`);
39
+ default:
40
+ return chalk.dim(segment);
41
+ }
42
+ }
43
+ /**
44
+ * Build a directory tree string from file paths.
45
+ * Groups by directory, shows files as leaves with indentation.
46
+ * When options.diff is provided, leaf names are prefixed with + (created), ~ (updated), - (deleted) and colorized.
47
+ * When options.diffFocus is true, only changed paths (and their ancestors) are shown; unchanged files are omitted.
48
+ *
49
+ * @param files - Array of relative file paths (e.g. ["schemas/public/schema.sql", "schemas/public/tables/users.sql"])
50
+ * @param outputDir - Display name for the root (e.g. "declarative-schemas")
51
+ * @param options - Optional diff and diffFocus for symbols and filtering
52
+ */
53
+ export function buildFileTree(files, outputDir, options) {
54
+ const { diff, diffFocus } = options ?? {};
55
+ let pathsToShow = files;
56
+ if (diffFocus && diff) {
57
+ const changed = new Set([
58
+ ...diff.created,
59
+ ...diff.updated,
60
+ ...diff.deleted,
61
+ ]);
62
+ pathsToShow = [...changed];
63
+ if (pathsToShow.length === 0) {
64
+ return chalk.dim("(no file changes)");
65
+ }
66
+ }
67
+ const tree = new Map();
68
+ for (const filePath of pathsToShow) {
69
+ const segments = filePath.split("/");
70
+ let parent = "";
71
+ for (let i = 0; i < segments.length; i++) {
72
+ const segment = segments[i];
73
+ const fullPath = parent ? `${parent}/${segment}` : segment;
74
+ let children = tree.get(parent);
75
+ if (!children) {
76
+ children = new Set();
77
+ tree.set(parent, children);
78
+ }
79
+ children.add(fullPath);
80
+ parent = fullPath;
81
+ }
82
+ }
83
+ const lines = [];
84
+ function emit(relPath, indent, isLast) {
85
+ const segment = relPath ? path.basename(relPath) : outputDir;
86
+ const prefix = indent === 0 ? "" : " ".repeat(indent) + (isLast ? "└── " : "├── ");
87
+ const isLeaf = !tree.has(relPath);
88
+ const displaySegment = diff && isLeaf
89
+ ? formatLeafSegment(segment, getFileStatus(relPath, diff))
90
+ : segment;
91
+ lines.push(prefix + displaySegment);
92
+ const children = tree.get(relPath);
93
+ if (children) {
94
+ const sorted = [...children].sort((a, b) => path.basename(a).localeCompare(path.basename(b)));
95
+ for (let i = 0; i < sorted.length; i++) {
96
+ emit(sorted[i], indent + 1, i === sorted.length - 1);
97
+ }
98
+ }
99
+ }
100
+ emit("", 0, false);
101
+ return lines.join("\n");
102
+ }
103
+ // ============================================================================
104
+ // File diff
105
+ // ============================================================================
106
+ /**
107
+ * Recursively collect relative paths of managed (.sql) files under a directory.
108
+ * Non-SQL files (README, .gitkeep, etc.) are intentionally excluded so they
109
+ * are never flagged as "deleted" during diff.
110
+ */
111
+ async function collectExistingFiles(dir, base = "") {
112
+ const entries = await readdir(path.join(dir, base), { withFileTypes: true });
113
+ const files = [];
114
+ for (const e of entries) {
115
+ const rel = base ? `${base}/${e.name}` : e.name;
116
+ if (e.isFile() && e.name.endsWith(".sql")) {
117
+ files.push(rel);
118
+ }
119
+ else if (e.isDirectory()) {
120
+ files.push(...(await collectExistingFiles(dir, rel)));
121
+ }
122
+ }
123
+ return files;
124
+ }
125
+ /**
126
+ * Compare existing output directory with new file set.
127
+ * Returns created, updated, deleted, and unchanged paths.
128
+ */
129
+ export async function computeFileDiff(outputDir, newFiles) {
130
+ const newPaths = new Set(newFiles.map((f) => f.path));
131
+ const newByPath = new Map(newFiles.map((f) => [f.path, f]));
132
+ let existingPaths = [];
133
+ try {
134
+ existingPaths = await collectExistingFiles(outputDir);
135
+ }
136
+ catch {
137
+ // Directory doesn't exist or not readable
138
+ return {
139
+ created: [...newPaths],
140
+ updated: [],
141
+ deleted: [],
142
+ unchanged: [],
143
+ };
144
+ }
145
+ const existingSet = new Set(existingPaths);
146
+ const created = [];
147
+ const updated = [];
148
+ const deleted = [];
149
+ const unchanged = [];
150
+ for (const p of newPaths) {
151
+ if (!existingSet.has(p)) {
152
+ created.push(p);
153
+ }
154
+ else {
155
+ const entry = newByPath.get(p);
156
+ if (!entry)
157
+ continue;
158
+ try {
159
+ const existingContent = await readFile(path.join(outputDir, p), "utf-8");
160
+ if (existingContent.trim() !== entry.sql.trim()) {
161
+ updated.push(p);
162
+ }
163
+ else {
164
+ unchanged.push(p);
165
+ }
166
+ }
167
+ catch {
168
+ updated.push(p);
169
+ }
170
+ }
171
+ }
172
+ for (const p of existingPaths) {
173
+ if (!newPaths.has(p)) {
174
+ deleted.push(p);
175
+ }
176
+ }
177
+ return { created, updated, deleted, unchanged };
178
+ }
179
+ // ============================================================================
180
+ // Summary formatting
181
+ // ============================================================================
182
+ /**
183
+ * Format the created/deleted/updated summary with colors.
184
+ * In dry-run mode, uses "would create/delete/update" phrasing.
185
+ */
186
+ export function formatExportSummary(diff, dryRun) {
187
+ const lines = [];
188
+ const verb = dryRun ? "Would" : "";
189
+ if (diff.created.length > 0) {
190
+ lines.push(chalk.green(`${verb ? `${verb} create` : "Created"}: ${diff.created.length} file(s)`));
191
+ }
192
+ if (diff.updated.length > 0) {
193
+ lines.push(chalk.yellow(`${verb ? `${verb} update` : "Updated"}: ${diff.updated.length} file(s)`));
194
+ }
195
+ if (diff.deleted.length > 0) {
196
+ lines.push(chalk.red(`${verb ? `${verb} delete` : "Deleted"}: ${diff.deleted.length} file(s)`));
197
+ }
198
+ if (diff.unchanged.length > 0 && !dryRun) {
199
+ lines.push(chalk.dim(`Unchanged: ${diff.unchanged.length} file(s)`));
200
+ }
201
+ return lines.length > 0 ? lines.join("\n") : "";
202
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Shared utilities for resolving CLI --source/--target inputs that
3
+ * can be either a PostgreSQL connection URL or a catalog snapshot file path.
4
+ */
5
+ import type { Catalog } from "../../core/catalog.model.ts";
6
+ export declare function isPostgresUrl(input: string): boolean;
7
+ export declare function loadCatalogFromFile(path: string): Promise<Catalog>;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Shared utilities for resolving CLI --source/--target inputs that
3
+ * can be either a PostgreSQL connection URL or a catalog snapshot file path.
4
+ */
5
+ import { readFile } from "node:fs/promises";
6
+ import { deserializeCatalog } from "../../core/catalog.snapshot.js";
7
+ export function isPostgresUrl(input) {
8
+ return input.startsWith("postgres://") || input.startsWith("postgresql://");
9
+ }
10
+ export async function loadCatalogFromFile(path) {
11
+ const json = await readFile(path, "utf-8");
12
+ return deserializeCatalog(JSON.parse(json));
13
+ }
@@ -5,6 +5,7 @@ import type { CommandContext } from "@stricli/core";
5
5
  import type { Change } from "../core/change.types.ts";
6
6
  import type { DiffContext } from "../core/context.ts";
7
7
  import { type Plan } from "../core/plan/index.ts";
8
+ import type { SqlFormatOptions } from "../core/plan/sql-format.ts";
8
9
  type ApplyPlanResult = {
9
10
  status: "invalid_plan";
10
11
  message: string;
@@ -31,6 +32,7 @@ type PlanResult = {
31
32
  interface FormatPlanOptions {
32
33
  disableColors?: boolean;
33
34
  showUnsafeFlagSuggestion?: boolean;
35
+ sqlFormatOptions?: SqlFormatOptions;
34
36
  }
35
37
  /**
36
38
  * Formats a plan result for display in various formats.
package/dist/cli/utils.js CHANGED
@@ -19,7 +19,7 @@ export function formatPlanForDisplay(planResult, format, options = {}) {
19
19
  case "sql": {
20
20
  const content = [
21
21
  `-- Risk: ${risk.level === "data_loss" ? `data-loss (${risk.statements.length})` : "safe"}`,
22
- formatSqlScript(plan.statements),
22
+ formatSqlScript(plan.statements, options.sqlFormatOptions),
23
23
  ].join("\n");
24
24
  return { content, label: "Migration script" };
25
25
  }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Catalog export – programmatic API for extracting a database catalog
3
+ * and serializing it to a JSON snapshot.
4
+ *
5
+ * Use this subpath when you only need catalog export (e.g. Supabase CLI
6
+ * edge-runtime templates) without pulling in the full pg-delta API.
7
+ */
8
+ export { Catalog, createEmptyCatalog, extractCatalog, } from "../catalog.model.ts";
9
+ export type { CatalogSnapshot } from "../catalog.snapshot.ts";
10
+ export { deserializeCatalog, serializeCatalog, stringifyCatalogSnapshot, } from "../catalog.snapshot.ts";
11
+ export { createManagedPool } from "../postgres-config.ts";
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Catalog export – programmatic API for extracting a database catalog
3
+ * and serializing it to a JSON snapshot.
4
+ *
5
+ * Use this subpath when you only need catalog export (e.g. Supabase CLI
6
+ * edge-runtime templates) without pulling in the full pg-delta API.
7
+ */
8
+ export { Catalog, createEmptyCatalog, extractCatalog, } from "../catalog.model.js";
9
+ export { deserializeCatalog, serializeCatalog, stringifyCatalogSnapshot, } from "../catalog.snapshot.js";
10
+ export { createManagedPool } from "../postgres-config.js";
@@ -2,4 +2,5 @@ import type { Catalog } from "./catalog.model.ts";
2
2
  import type { Change } from "./change.types.ts";
3
3
  export declare function diffCatalogs(main: Catalog, branch: Catalog, options?: {
4
4
  role?: string;
5
+ skipDefaultPrivilegeSubtraction?: boolean;
5
6
  }): Change[];
@@ -29,6 +29,48 @@ import { diffEnums } from "./objects/type/enum/enum.diff.js";
29
29
  import { diffRanges } from "./objects/type/range/range.diff.js";
30
30
  import { stringifyWithBigInt } from "./objects/utils.js";
31
31
  import { diffViews } from "./objects/view/view.diff.js";
32
+ /**
33
+ * Get the stableId of the target object for a privilege change.
34
+ * Used to filter out redundant REVOKE statements for dropped objects.
35
+ */
36
+ function getPrivilegeTargetStableId(change) {
37
+ switch (change.objectType) {
38
+ case "composite_type":
39
+ return change.compositeType.stableId;
40
+ case "domain":
41
+ return change.domain.stableId;
42
+ case "enum":
43
+ return change.enum.stableId;
44
+ case "language":
45
+ return change.language.stableId;
46
+ case "materialized_view":
47
+ return change.materializedView.stableId;
48
+ case "aggregate":
49
+ return change.aggregate.stableId;
50
+ case "procedure":
51
+ return change.procedure.stableId;
52
+ case "range":
53
+ return change.range.stableId;
54
+ case "schema":
55
+ return change.schema.stableId;
56
+ case "sequence":
57
+ return change.sequence.stableId;
58
+ case "table":
59
+ return change.table.stableId;
60
+ case "view":
61
+ return change.view.stableId;
62
+ case "foreign_data_wrapper":
63
+ return change.foreignDataWrapper.stableId;
64
+ case "server":
65
+ return change.server.stableId;
66
+ case "foreign_table":
67
+ return change.foreignTable.stableId;
68
+ default: {
69
+ const _exhaustive = change;
70
+ return _exhaustive;
71
+ }
72
+ }
73
+ }
32
74
  export function diffCatalogs(main, branch, options) {
33
75
  const changes = [];
34
76
  // Step 1: Diff roles first to get default privilege changes
@@ -38,13 +80,22 @@ export function diffCatalogs(main, branch, options) {
38
80
  // This represents what defaults will be in effect after all ALTER DEFAULT PRIVILEGES
39
81
  // Since ALTER DEFAULT PRIVILEGES runs before CREATE (via constraint spec),
40
82
  // all created objects will use these final defaults.
41
- const defaultPrivilegeState = new DefaultPrivilegeState(main.roles);
42
- for (const change of roleChanges) {
43
- if (change instanceof GrantRoleDefaultPrivileges) {
44
- defaultPrivilegeState.applyGrant(change.role.name, change.objtype, change.inSchema, change.grantee, change.privileges);
45
- }
46
- else if (change instanceof RevokeRoleDefaultPrivileges) {
47
- defaultPrivilegeState.applyRevoke(change.role.name, change.objtype, change.inSchema, change.grantee, change.privileges);
83
+ //
84
+ // When skipDefaultPrivilegeSubtraction is true, we use an empty state so that
85
+ // getEffectiveDefaults always returns [] -- no privileges are subtracted and
86
+ // every GRANT is emitted explicitly. This is needed for declarative export
87
+ // where the output must be self-contained regardless of statement execution order.
88
+ const defaultPrivilegeState = options?.skipDefaultPrivilegeSubtraction
89
+ ? new DefaultPrivilegeState({})
90
+ : new DefaultPrivilegeState(main.roles);
91
+ if (!options?.skipDefaultPrivilegeSubtraction) {
92
+ for (const change of roleChanges) {
93
+ if (change instanceof GrantRoleDefaultPrivileges) {
94
+ defaultPrivilegeState.applyGrant(change.role.name, change.objtype, change.inSchema, change.grantee, change.privileges);
95
+ }
96
+ else if (change instanceof RevokeRoleDefaultPrivileges) {
97
+ defaultPrivilegeState.applyRevoke(change.role.name, change.objtype, change.inSchema, change.grantee, change.privileges);
98
+ }
48
99
  }
49
100
  }
50
101
  // Step 3: Create context with default privileges state for object diffing
@@ -58,25 +109,26 @@ export function diffCatalogs(main, branch, options) {
58
109
  currentUser: effectiveUser,
59
110
  defaultPrivilegeState,
60
111
  mainRoles: main.roles,
112
+ skipDefaultPrivilegeSubtraction: options?.skipDefaultPrivilegeSubtraction,
61
113
  };
62
114
  // Step 4: Diff all other objects with default privileges context
63
115
  changes.push(...diffAggregates(diffContext, main.aggregates, branch.aggregates));
64
- changes.push(...diffCollations({ currentUser: effectiveUser }, main.collations, branch.collations));
116
+ changes.push(...diffCollations(diffContext, main.collations, branch.collations));
65
117
  changes.push(...diffCompositeTypes(diffContext, main.compositeTypes, branch.compositeTypes));
66
118
  changes.push(...diffDomains(diffContext, main.domains, branch.domains));
67
119
  changes.push(...diffEnums(diffContext, main.enums, branch.enums));
68
120
  changes.push(...diffExtensions(main.extensions, branch.extensions));
69
121
  changes.push(...diffIndexes(main.indexes, branch.indexes, branch.indexableObjects));
70
122
  changes.push(...diffMaterializedViews(diffContext, main.materializedViews, branch.materializedViews));
71
- changes.push(...diffSubscriptions({ currentUser: effectiveUser }, main.subscriptions, branch.subscriptions));
72
- changes.push(...diffPublications({ currentUser: effectiveUser }, main.publications, branch.publications));
123
+ changes.push(...diffSubscriptions(diffContext, main.subscriptions, branch.subscriptions));
124
+ changes.push(...diffPublications(diffContext, main.publications, branch.publications));
73
125
  changes.push(...diffProcedures(diffContext, main.procedures, branch.procedures));
74
126
  changes.push(...diffRlsPolicies(main.rlsPolicies, branch.rlsPolicies));
75
127
  changes.push(...diffSchemas(diffContext, main.schemas, branch.schemas));
76
128
  changes.push(...diffSequences(diffContext, main.sequences, branch.sequences, branch.tables));
77
129
  changes.push(...diffTables(diffContext, main.tables, branch.tables));
78
130
  changes.push(...diffTriggers(main.triggers, branch.triggers, branch.indexableObjects));
79
- changes.push(...diffEventTriggers({ currentUser: effectiveUser }, main.eventTriggers, branch.eventTriggers));
131
+ changes.push(...diffEventTriggers(diffContext, main.eventTriggers, branch.eventTriggers));
80
132
  changes.push(...diffRules(main.rules, branch.rules));
81
133
  changes.push(...diffRanges(diffContext, main.ranges, branch.ranges));
82
134
  changes.push(...diffViews(diffContext, main.views, branch.views));
@@ -97,43 +149,7 @@ export function diffCatalogs(main, branch, options) {
97
149
  }
98
150
  let filteredChanges = changes.filter((change) => {
99
151
  if (change.operation === "alter" && change.scope === "privilege") {
100
- switch (change.objectType) {
101
- case "composite_type":
102
- return !droppedObjectStableIds.has(change.compositeType.stableId);
103
- case "domain":
104
- return !droppedObjectStableIds.has(change.domain.stableId);
105
- case "enum":
106
- return !droppedObjectStableIds.has(change.enum.stableId);
107
- case "language":
108
- return !droppedObjectStableIds.has(change.language.stableId);
109
- case "materialized_view":
110
- return !droppedObjectStableIds.has(change.materializedView.stableId);
111
- case "aggregate":
112
- return !droppedObjectStableIds.has(change.aggregate.stableId);
113
- case "procedure":
114
- return !droppedObjectStableIds.has(change.procedure.stableId);
115
- case "range":
116
- return !droppedObjectStableIds.has(change.range.stableId);
117
- case "schema":
118
- return !droppedObjectStableIds.has(change.schema.stableId);
119
- case "sequence":
120
- return !droppedObjectStableIds.has(change.sequence.stableId);
121
- case "table":
122
- return !droppedObjectStableIds.has(change.table.stableId);
123
- case "view":
124
- return !droppedObjectStableIds.has(change.view.stableId);
125
- case "foreign_data_wrapper":
126
- return !droppedObjectStableIds.has(change.foreignDataWrapper.stableId);
127
- case "server":
128
- return !droppedObjectStableIds.has(change.server.stableId);
129
- case "foreign_table":
130
- return !droppedObjectStableIds.has(change.foreignTable.stableId);
131
- default: {
132
- // exhaustiveness check
133
- const _exhaustive = change;
134
- return _exhaustive;
135
- }
136
- }
152
+ return !droppedObjectStableIds.has(getPrivilegeTargetStableId(change));
137
153
  }
138
154
  return true;
139
155
  });
@@ -17,7 +17,7 @@ import { type Publication } from "./objects/publication/publication.model.ts";
17
17
  import { type RlsPolicy } from "./objects/rls-policy/rls-policy.model.ts";
18
18
  import { type Role } from "./objects/role/role.model.ts";
19
19
  import { type Rule } from "./objects/rule/rule.model.ts";
20
- import { type Schema } from "./objects/schema/schema.model.ts";
20
+ import { Schema } from "./objects/schema/schema.model.ts";
21
21
  import { type Sequence } from "./objects/sequence/sequence.model.ts";
22
22
  import { Subscription } from "./objects/subscription/subscription.model.ts";
23
23
  import { type Table } from "./objects/table/table.model.ts";
@@ -89,5 +89,18 @@ export declare class Catalog {
89
89
  readonly currentUser: CatalogProps["currentUser"];
90
90
  constructor(props: CatalogProps);
91
91
  }
92
+ /**
93
+ * Create a baseline catalog representing a fresh PostgreSQL database.
94
+ *
95
+ * For PG 15+ this deserializes a pre-extracted snapshot of an empty `template1`
96
+ * database, including the `plpgsql` extension, `postgres` role with default
97
+ * privileges, and the `public` schema with its default ACLs and depends.
98
+ *
99
+ * For PG < 15, falls back to a minimal inline catalog with only the `public`
100
+ * schema. For exact fidelity on older versions, snapshot a real reference
101
+ * database using `serializeCatalog` and pass the deserialized result as source
102
+ * to `createPlan`.
103
+ */
104
+ export declare function createEmptyCatalog(version: number, currentUser: string): Promise<Catalog>;
92
105
  export declare function extractCatalog(pool: Pool): Promise<Catalog>;
93
106
  export {};
@@ -16,7 +16,7 @@ import { extractPublications, } from "./objects/publication/publication.model.js
16
16
  import { extractRlsPolicies, } from "./objects/rls-policy/rls-policy.model.js";
17
17
  import { extractRoles } from "./objects/role/role.model.js";
18
18
  import { extractRules } from "./objects/rule/rule.model.js";
19
- import { extractSchemas } from "./objects/schema/schema.model.js";
19
+ import { extractSchemas, Schema } from "./objects/schema/schema.model.js";
20
20
  import { extractSequences, } from "./objects/sequence/sequence.model.js";
21
21
  import { extractSubscriptions, Subscription, } from "./objects/subscription/subscription.model.js";
22
22
  import { extractTables } from "./objects/table/table.model.js";
@@ -88,6 +88,108 @@ export class Catalog {
88
88
  this.currentUser = props.currentUser;
89
89
  }
90
90
  }
91
+ // Lazily cached deserialized baselines (shared across calls)
92
+ let _pg1516Baseline = null;
93
+ let _pg17Baseline = null;
94
+ async function loadBaselineJson() {
95
+ const mod = await import("./fixtures/empty-catalogs/postgres-15-16-baseline.json");
96
+ return mod.default;
97
+ }
98
+ async function getPg1516Baseline() {
99
+ if (!_pg1516Baseline) {
100
+ const { deserializeCatalog } = await import("./catalog.snapshot.js");
101
+ const json = await loadBaselineJson();
102
+ _pg1516Baseline = deserializeCatalog(json);
103
+ }
104
+ return _pg1516Baseline;
105
+ }
106
+ async function getPg17Baseline() {
107
+ if (!_pg17Baseline) {
108
+ const { deserializeCatalog } = await import("./catalog.snapshot.js");
109
+ // PG 17 is identical to PG 15-16 except for a single addition:
110
+ // the MAINTAIN privilege on default relation (objtype "r") privileges.
111
+ // We patch the 15-16 baseline to avoid shipping a second full JSON file.
112
+ const json = await loadBaselineJson();
113
+ const patched = structuredClone(json);
114
+ const roles = patched.roles;
115
+ const pgRole = roles?.["role:postgres"];
116
+ if (pgRole) {
117
+ const defaultPrivileges = pgRole.default_privileges;
118
+ const relPrivs = defaultPrivileges?.find((dp) => dp.objtype === "r" && dp.grantee === "postgres");
119
+ if (relPrivs) {
120
+ const insertIdx = relPrivs.privileges.findIndex((p) => p.privilege === "INSERT");
121
+ if (insertIdx === -1) {
122
+ throw new Error("PG17 baseline patch failed: INSERT privilege not found in default relation privileges");
123
+ }
124
+ relPrivs.privileges.splice(insertIdx + 1, 0, {
125
+ privilege: "MAINTAIN",
126
+ grantable: false,
127
+ });
128
+ }
129
+ }
130
+ _pg17Baseline = deserializeCatalog(patched);
131
+ }
132
+ return _pg17Baseline;
133
+ }
134
+ /**
135
+ * Create a baseline catalog representing a fresh PostgreSQL database.
136
+ *
137
+ * For PG 15+ this deserializes a pre-extracted snapshot of an empty `template1`
138
+ * database, including the `plpgsql` extension, `postgres` role with default
139
+ * privileges, and the `public` schema with its default ACLs and depends.
140
+ *
141
+ * For PG < 15, falls back to a minimal inline catalog with only the `public`
142
+ * schema. For exact fidelity on older versions, snapshot a real reference
143
+ * database using `serializeCatalog` and pass the deserialized result as source
144
+ * to `createPlan`.
145
+ */
146
+ export async function createEmptyCatalog(version, currentUser) {
147
+ if (version >= 170000) {
148
+ const baseline = await getPg17Baseline();
149
+ return new Catalog({ ...baseline, version, currentUser });
150
+ }
151
+ if (version >= 150000) {
152
+ const baseline = await getPg1516Baseline();
153
+ return new Catalog({ ...baseline, version, currentUser });
154
+ }
155
+ const publicSchema = new Schema({
156
+ name: "public",
157
+ owner: currentUser,
158
+ comment: "standard public schema",
159
+ privileges: [],
160
+ });
161
+ return new Catalog({
162
+ aggregates: {},
163
+ collations: {},
164
+ compositeTypes: {},
165
+ domains: {},
166
+ enums: {},
167
+ extensions: {},
168
+ procedures: {},
169
+ indexes: {},
170
+ materializedViews: {},
171
+ subscriptions: {},
172
+ publications: {},
173
+ rlsPolicies: {},
174
+ roles: {},
175
+ schemas: { [publicSchema.stableId]: publicSchema },
176
+ sequences: {},
177
+ tables: {},
178
+ triggers: {},
179
+ eventTriggers: {},
180
+ rules: {},
181
+ ranges: {},
182
+ views: {},
183
+ foreignDataWrappers: {},
184
+ servers: {},
185
+ userMappings: {},
186
+ foreignTables: {},
187
+ depends: [],
188
+ indexableObjects: {},
189
+ version,
190
+ currentUser,
191
+ });
192
+ }
91
193
  export async function extractCatalog(pool) {
92
194
  const [aggregates, collations, compositeTypes, domains, enums, extensions, indexes, materializedViews, subscriptions, publications, procedures, rlsPolicies, roles, schemas, sequences, tables, triggers, eventTriggers, rules, ranges, views, foreignDataWrappers, servers, userMappings, foreignTables, depends, version, currentUser,] = await Promise.all([
93
195
  extractAggregates(pool).then(listToRecord),
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Catalog snapshot - full JSON-serializable representation of a Catalog.
3
+ *
4
+ * Enables catalog-export (snapshot a live DB) and catalog-import
5
+ * (use a snapshot as source/target for createPlan).
6
+ */
7
+ import { Catalog } from "./catalog.model.ts";
8
+ import type { PgDepend } from "./depend.ts";
9
+ /**
10
+ * Full JSON-serializable representation of a Catalog.
11
+ *
12
+ * Every object record uses plain props objects (not class instances).
13
+ * `indexableObjects` is omitted -- it is reconstructed on deserialization.
14
+ */
15
+ export interface CatalogSnapshot {
16
+ version: number;
17
+ currentUser: string;
18
+ aggregates: Record<string, Record<string, unknown>>;
19
+ collations: Record<string, Record<string, unknown>>;
20
+ compositeTypes: Record<string, Record<string, unknown>>;
21
+ domains: Record<string, Record<string, unknown>>;
22
+ enums: Record<string, Record<string, unknown>>;
23
+ extensions: Record<string, Record<string, unknown>>;
24
+ procedures: Record<string, Record<string, unknown>>;
25
+ indexes: Record<string, Record<string, unknown>>;
26
+ materializedViews: Record<string, Record<string, unknown>>;
27
+ subscriptions: Record<string, Record<string, unknown>>;
28
+ publications: Record<string, Record<string, unknown>>;
29
+ rlsPolicies: Record<string, Record<string, unknown>>;
30
+ roles: Record<string, Record<string, unknown>>;
31
+ schemas: Record<string, Record<string, unknown>>;
32
+ sequences: Record<string, Record<string, unknown>>;
33
+ tables: Record<string, Record<string, unknown>>;
34
+ triggers: Record<string, Record<string, unknown>>;
35
+ eventTriggers: Record<string, Record<string, unknown>>;
36
+ rules: Record<string, Record<string, unknown>>;
37
+ ranges: Record<string, Record<string, unknown>>;
38
+ views: Record<string, Record<string, unknown>>;
39
+ foreignDataWrappers: Record<string, Record<string, unknown>>;
40
+ servers: Record<string, Record<string, unknown>>;
41
+ userMappings: Record<string, Record<string, unknown>>;
42
+ foreignTables: Record<string, Record<string, unknown>>;
43
+ depends: PgDepend[];
44
+ }
45
+ /**
46
+ * Serialize a Catalog to a JSON-serializable CatalogSnapshot.
47
+ *
48
+ * Expects a normalized catalog (as returned by `extractCatalog`).
49
+ * BigInt values (Sequence min/max) are converted to strings by the
50
+ * custom JSON replacer -- call `stringifyCatalogSnapshot` for JSON output.
51
+ */
52
+ export declare function serializeCatalog(catalog: Catalog): CatalogSnapshot;
53
+ /**
54
+ * Serialize a CatalogSnapshot to a JSON string.
55
+ *
56
+ * Handles BigInt values (Sequence min/max) by converting them to strings.
57
+ */
58
+ export declare function stringifyCatalogSnapshot(snapshot: CatalogSnapshot): string;
59
+ /**
60
+ * Deserialize a CatalogSnapshot (plain JSON data) back into a Catalog.
61
+ *
62
+ * Validates the top-level structure with Zod, then constructs model
63
+ * class instances via their constructors. Rebuilds `indexableObjects`
64
+ * from tables + materializedViews.
65
+ */
66
+ export declare function deserializeCatalog(data: unknown): Catalog;