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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (664) hide show
  1. package/README.md +41 -2
  2. package/dist/cli/app.js +26 -3
  3. package/dist/cli/bin/cli.js +5 -0
  4. package/dist/cli/commands/catalog-export.d.ts +5 -0
  5. package/dist/cli/commands/catalog-export.js +64 -0
  6. package/dist/cli/commands/declarative-apply.d.ts +6 -0
  7. package/dist/cli/commands/declarative-apply.js +288 -0
  8. package/dist/cli/commands/declarative-export.d.ts +5 -0
  9. package/dist/cli/commands/declarative-export.js +245 -0
  10. package/dist/cli/commands/plan.js +40 -6
  11. package/dist/cli/exit-code.d.ts +2 -0
  12. package/dist/cli/exit-code.js +7 -0
  13. package/dist/cli/formatters/tree/tree.js +3 -2
  14. package/dist/cli/utils/apply-display.d.ts +52 -0
  15. package/dist/cli/utils/apply-display.js +183 -0
  16. package/dist/cli/utils/export-display.d.ts +43 -0
  17. package/dist/cli/utils/export-display.js +202 -0
  18. package/dist/cli/utils/resolve-input.d.ts +7 -0
  19. package/dist/cli/utils/resolve-input.js +13 -0
  20. package/dist/cli/utils.d.ts +2 -0
  21. package/dist/cli/utils.js +1 -1
  22. package/dist/core/catalog-export/index.d.ts +11 -0
  23. package/dist/core/catalog-export/index.js +10 -0
  24. package/dist/core/catalog.diff.d.ts +1 -0
  25. package/dist/core/catalog.diff.js +64 -48
  26. package/dist/core/catalog.model.d.ts +16 -3
  27. package/dist/core/catalog.model.js +132 -30
  28. package/dist/core/catalog.snapshot.d.ts +66 -0
  29. package/dist/core/catalog.snapshot.js +206 -0
  30. package/dist/core/context.d.ts +3 -3
  31. package/dist/core/context.js +7 -10
  32. package/dist/core/declarative-apply/discover-sql.d.ts +18 -0
  33. package/dist/core/declarative-apply/discover-sql.js +86 -0
  34. package/dist/core/declarative-apply/extract-catalog-providers.d.ts +23 -0
  35. package/dist/core/declarative-apply/extract-catalog-providers.js +159 -0
  36. package/dist/core/declarative-apply/index.d.ts +49 -0
  37. package/dist/core/declarative-apply/index.js +134 -0
  38. package/dist/core/declarative-apply/round-apply.d.ts +100 -0
  39. package/dist/core/declarative-apply/round-apply.js +378 -0
  40. package/dist/core/depend.d.ts +2 -2
  41. package/dist/core/depend.js +8 -7
  42. package/dist/core/export/file-mapper.d.ts +71 -0
  43. package/dist/core/export/file-mapper.js +474 -0
  44. package/dist/core/export/grouper.d.ts +13 -0
  45. package/dist/core/export/grouper.js +76 -0
  46. package/dist/core/export/index.d.ts +45 -0
  47. package/dist/core/export/index.js +63 -0
  48. package/dist/core/export/types.d.ts +84 -0
  49. package/dist/core/export/types.js +25 -0
  50. package/dist/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
  51. package/dist/core/integrations/filter/dsl.d.ts +38 -1
  52. package/dist/core/integrations/filter/dsl.js +20 -2
  53. package/dist/core/integrations/filter/extractors.js +42 -0
  54. package/dist/core/integrations/integration-dsl.d.ts +10 -0
  55. package/dist/core/integrations/supabase.d.ts +8 -0
  56. package/dist/core/integrations/supabase.js +11 -0
  57. package/dist/core/objects/aggregate/aggregate.diff.d.ts +2 -8
  58. package/dist/core/objects/aggregate/aggregate.diff.js +16 -70
  59. package/dist/core/objects/aggregate/aggregate.model.d.ts +10 -10
  60. package/dist/core/objects/aggregate/aggregate.model.js +8 -10
  61. package/dist/core/objects/aggregate/changes/aggregate.create.js +1 -1
  62. package/dist/core/objects/aggregate/changes/aggregate.drop.js +1 -1
  63. package/dist/core/objects/base.privilege-diff.d.ts +38 -13
  64. package/dist/core/objects/base.privilege-diff.js +104 -22
  65. package/dist/core/objects/base.privilege.d.ts +1 -0
  66. package/dist/core/objects/base.privilege.js +9 -2
  67. package/dist/core/objects/collation/collation.diff.d.ts +2 -3
  68. package/dist/core/objects/collation/collation.model.d.ts +2 -2
  69. package/dist/core/objects/collation/collation.model.js +29 -28
  70. package/dist/core/objects/diff-context.d.ts +15 -0
  71. package/dist/core/objects/diff-context.js +1 -0
  72. package/dist/core/objects/domain/changes/domain.create.js +4 -2
  73. package/dist/core/objects/domain/domain.diff.d.ts +2 -8
  74. package/dist/core/objects/domain/domain.diff.js +16 -77
  75. package/dist/core/objects/domain/domain.model.d.ts +2 -2
  76. package/dist/core/objects/domain/domain.model.js +9 -11
  77. package/dist/core/objects/event-trigger/event-trigger.diff.d.ts +2 -3
  78. package/dist/core/objects/event-trigger/event-trigger.model.d.ts +2 -2
  79. package/dist/core/objects/event-trigger/event-trigger.model.js +7 -9
  80. package/dist/core/objects/extension/extension.model.d.ts +2 -2
  81. package/dist/core/objects/extension/extension.model.js +8 -10
  82. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.d.ts +2 -8
  83. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.js +13 -77
  84. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.d.ts +2 -2
  85. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.js +22 -24
  86. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.d.ts +2 -8
  87. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.js +16 -77
  88. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.d.ts +2 -2
  89. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.js +21 -23
  90. package/dist/core/objects/foreign-data-wrapper/server/server.diff.d.ts +2 -8
  91. package/dist/core/objects/foreign-data-wrapper/server/server.diff.js +13 -77
  92. package/dist/core/objects/foreign-data-wrapper/server/server.model.d.ts +2 -2
  93. package/dist/core/objects/foreign-data-wrapper/server/server.model.js +20 -22
  94. package/dist/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.d.ts +2 -2
  95. package/dist/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.js +20 -22
  96. package/dist/core/objects/index/index.model.d.ts +4 -4
  97. package/dist/core/objects/index/index.model.js +9 -11
  98. package/dist/core/objects/language/language.diff.d.ts +2 -5
  99. package/dist/core/objects/language/language.diff.js +7 -39
  100. package/dist/core/objects/language/language.model.js +5 -7
  101. package/dist/core/objects/materialized-view/materialized-view.diff.d.ts +2 -8
  102. package/dist/core/objects/materialized-view/materialized-view.diff.js +16 -158
  103. package/dist/core/objects/materialized-view/materialized-view.model.d.ts +5 -5
  104. package/dist/core/objects/materialized-view/materialized-view.model.js +9 -11
  105. package/dist/core/objects/procedure/changes/procedure.alter.js +12 -12
  106. package/dist/core/objects/procedure/procedure.diff.d.ts +2 -8
  107. package/dist/core/objects/procedure/procedure.diff.js +16 -77
  108. package/dist/core/objects/procedure/procedure.model.d.ts +11 -11
  109. package/dist/core/objects/procedure/procedure.model.js +9 -11
  110. package/dist/core/objects/publication/changes/publication.alter.d.ts +0 -9
  111. package/dist/core/objects/publication/changes/publication.alter.js +0 -14
  112. package/dist/core/objects/publication/changes/publication.types.d.ts +2 -2
  113. package/dist/core/objects/publication/publication.diff.d.ts +2 -3
  114. package/dist/core/objects/publication/publication.diff.js +8 -13
  115. package/dist/core/objects/publication/publication.model.d.ts +2 -2
  116. package/dist/core/objects/publication/publication.model.js +7 -9
  117. package/dist/core/objects/rls-policy/changes/rls-policy.alter.js +3 -3
  118. package/dist/core/objects/rls-policy/rls-policy.model.d.ts +4 -4
  119. package/dist/core/objects/rls-policy/rls-policy.model.js +8 -10
  120. package/dist/core/objects/role/role.diff.js +22 -1
  121. package/dist/core/objects/role/role.model.d.ts +6 -5
  122. package/dist/core/objects/role/role.model.js +146 -40
  123. package/dist/core/objects/rule/rule.model.d.ts +3 -3
  124. package/dist/core/objects/rule/rule.model.js +7 -9
  125. package/dist/core/objects/schema/schema.diff.d.ts +2 -8
  126. package/dist/core/objects/schema/schema.diff.js +16 -77
  127. package/dist/core/objects/schema/schema.model.d.ts +2 -2
  128. package/dist/core/objects/schema/schema.model.js +9 -11
  129. package/dist/core/objects/sequence/sequence.diff.d.ts +2 -8
  130. package/dist/core/objects/sequence/sequence.diff.js +16 -79
  131. package/dist/core/objects/sequence/sequence.model.d.ts +2 -2
  132. package/dist/core/objects/sequence/sequence.model.js +9 -11
  133. package/dist/core/objects/subscription/subscription.diff.d.ts +2 -3
  134. package/dist/core/objects/subscription/subscription.model.d.ts +2 -2
  135. package/dist/core/objects/subscription/subscription.model.js +25 -20
  136. package/dist/core/objects/table/changes/table.create.js +3 -0
  137. package/dist/core/objects/table/table.diff.d.ts +2 -8
  138. package/dist/core/objects/table/table.diff.js +26 -157
  139. package/dist/core/objects/table/table.model.d.ts +27 -24
  140. package/dist/core/objects/table/table.model.js +12 -11
  141. package/dist/core/objects/trigger/changes/trigger.alter.js +23 -0
  142. package/dist/core/objects/trigger/changes/trigger.create.js +4 -5
  143. package/dist/core/objects/trigger/trigger.model.d.ts +11 -2
  144. package/dist/core/objects/trigger/trigger.model.js +22 -10
  145. package/dist/core/objects/type/composite-type/composite-type.diff.d.ts +2 -8
  146. package/dist/core/objects/type/composite-type/composite-type.diff.js +16 -77
  147. package/dist/core/objects/type/composite-type/composite-type.model.d.ts +5 -5
  148. package/dist/core/objects/type/composite-type/composite-type.model.js +10 -11
  149. package/dist/core/objects/type/enum/enum.diff.d.ts +2 -8
  150. package/dist/core/objects/type/enum/enum.diff.js +25 -112
  151. package/dist/core/objects/type/enum/enum.model.d.ts +2 -2
  152. package/dist/core/objects/type/enum/enum.model.js +23 -25
  153. package/dist/core/objects/type/range/changes/range.create.js +6 -3
  154. package/dist/core/objects/type/range/range.diff.d.ts +2 -8
  155. package/dist/core/objects/type/range/range.diff.js +16 -77
  156. package/dist/core/objects/type/range/range.model.d.ts +2 -2
  157. package/dist/core/objects/type/range/range.model.js +8 -10
  158. package/dist/core/objects/view/view.diff.d.ts +2 -8
  159. package/dist/core/objects/view/view.diff.js +16 -158
  160. package/dist/core/objects/view/view.model.d.ts +20 -6
  161. package/dist/core/objects/view/view.model.js +11 -23
  162. package/dist/core/plan/apply.d.ts +2 -2
  163. package/dist/core/plan/apply.js +33 -16
  164. package/dist/core/plan/create.d.ts +20 -7
  165. package/dist/core/plan/create.js +153 -112
  166. package/dist/core/plan/serialize.js +16 -4
  167. package/dist/core/plan/sql-format/constants.d.ts +2 -0
  168. package/dist/core/plan/sql-format/constants.js +11 -0
  169. package/dist/core/plan/sql-format/fixtures.d.ts +2 -0
  170. package/dist/core/plan/sql-format/fixtures.js +2447 -0
  171. package/dist/core/plan/sql-format/format-utils.d.ts +37 -0
  172. package/dist/core/plan/sql-format/format-utils.js +274 -0
  173. package/dist/core/plan/sql-format/formatters.d.ts +20 -0
  174. package/dist/core/plan/sql-format/formatters.js +737 -0
  175. package/dist/core/plan/sql-format/index.d.ts +2 -0
  176. package/dist/core/plan/sql-format/index.js +98 -0
  177. package/dist/core/plan/sql-format/keyword-case.d.ts +2 -0
  178. package/dist/core/plan/sql-format/keyword-case.js +893 -0
  179. package/dist/core/plan/sql-format/protect.d.ts +3 -0
  180. package/dist/core/plan/sql-format/protect.js +269 -0
  181. package/dist/core/plan/sql-format/sql-scanner.d.ts +59 -0
  182. package/dist/core/plan/sql-format/sql-scanner.js +202 -0
  183. package/dist/core/plan/sql-format/tokenizer.d.ts +22 -0
  184. package/dist/core/plan/sql-format/tokenizer.js +118 -0
  185. package/dist/core/plan/sql-format/types.d.ts +28 -0
  186. package/dist/core/plan/sql-format/types.js +1 -0
  187. package/dist/core/plan/sql-format/wrap.d.ts +2 -0
  188. package/dist/core/plan/sql-format/wrap.js +165 -0
  189. package/dist/core/plan/sql-format.d.ts +2 -0
  190. package/dist/core/plan/sql-format.js +1 -0
  191. package/dist/core/plan/ssl-config.d.ts +32 -0
  192. package/dist/core/plan/ssl-config.js +115 -0
  193. package/dist/core/plan/statements.d.ts +2 -1
  194. package/dist/core/plan/statements.js +6 -2
  195. package/dist/core/plan/types.d.ts +6 -0
  196. package/dist/core/postgres-config.d.ts +47 -3
  197. package/dist/core/postgres-config.js +225 -39
  198. package/dist/core/sort/graph-builder.js +10 -0
  199. package/dist/core/sort/logical-sort.js +31 -23
  200. package/dist/core/test-utils/assert-valid-sql.d.ts +10 -0
  201. package/dist/core/test-utils/assert-valid-sql.js +19 -0
  202. package/dist/index.d.ts +9 -0
  203. package/dist/index.js +9 -1
  204. package/package.json +56 -22
  205. package/src/cli/app.ts +52 -0
  206. package/src/cli/bin/cli.ts +15 -0
  207. package/src/cli/commands/apply.ts +101 -0
  208. package/src/cli/commands/catalog-export.ts +78 -0
  209. package/src/cli/commands/declarative-apply.diagnostics.test.ts +77 -0
  210. package/src/cli/commands/declarative-apply.ts +380 -0
  211. package/src/cli/commands/declarative-export.ts +330 -0
  212. package/src/cli/commands/plan.ts +216 -0
  213. package/src/cli/commands/sync.ts +185 -0
  214. package/src/cli/exit-code.test.ts +19 -0
  215. package/src/cli/exit-code.ts +7 -0
  216. package/src/cli/formatters/index.ts +5 -0
  217. package/src/cli/formatters/tree/tree-builder.ts +380 -0
  218. package/src/cli/formatters/tree/tree-renderer.ts +372 -0
  219. package/src/cli/formatters/tree/tree.ts +238 -0
  220. package/src/cli/utils/apply-display.test.ts +348 -0
  221. package/src/cli/utils/apply-display.ts +238 -0
  222. package/src/cli/utils/export-display.test.ts +103 -0
  223. package/src/cli/utils/export-display.ts +275 -0
  224. package/src/cli/utils/integrations.test.ts +44 -0
  225. package/src/cli/utils/integrations.ts +42 -0
  226. package/src/cli/utils/resolve-input.test.ts +38 -0
  227. package/src/cli/utils/resolve-input.ts +17 -0
  228. package/src/cli/utils.ts +231 -0
  229. package/src/core/catalog-export/index.ts +20 -0
  230. package/src/core/catalog.diff.ts +247 -0
  231. package/src/core/catalog.model.test.ts +122 -0
  232. package/src/core/catalog.model.ts +510 -0
  233. package/src/core/catalog.snapshot.test.ts +477 -0
  234. package/src/core/catalog.snapshot.ts +289 -0
  235. package/src/core/change.types.ts +44 -0
  236. package/src/core/context.ts +26 -0
  237. package/src/core/declarative-apply/discover-sql.test.ts +103 -0
  238. package/src/core/declarative-apply/discover-sql.ts +107 -0
  239. package/src/core/declarative-apply/extract-catalog-providers.ts +220 -0
  240. package/src/core/declarative-apply/index.test.ts +67 -0
  241. package/src/core/declarative-apply/index.ts +205 -0
  242. package/src/core/declarative-apply/round-apply.test.ts +504 -0
  243. package/src/core/declarative-apply/round-apply.ts +562 -0
  244. package/src/core/depend.ts +1870 -0
  245. package/src/core/expand-replace-dependencies.test.ts +70 -0
  246. package/src/core/expand-replace-dependencies.ts +380 -0
  247. package/src/core/export/file-mapper.test.ts +816 -0
  248. package/src/core/export/file-mapper.ts +574 -0
  249. package/src/core/export/grouper.ts +108 -0
  250. package/src/core/export/index.ts +129 -0
  251. package/src/core/export/types.ts +104 -0
  252. package/src/core/fingerprint.ts +204 -0
  253. package/src/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
  254. package/src/core/integrations/filter/dsl.test.ts +211 -0
  255. package/src/core/integrations/filter/dsl.ts +266 -0
  256. package/src/core/integrations/filter/extractors.test.ts +244 -0
  257. package/src/core/integrations/filter/extractors.ts +187 -0
  258. package/src/core/integrations/filter/filter.types.ts +3 -0
  259. package/src/core/integrations/integration-dsl.ts +34 -0
  260. package/src/core/integrations/integration.types.ts +7 -0
  261. package/src/core/integrations/serialize/dsl.test.ts +91 -0
  262. package/src/core/integrations/serialize/dsl.ts +77 -0
  263. package/src/core/integrations/serialize/serialize.types.ts +3 -0
  264. package/src/core/integrations/supabase.ts +130 -0
  265. package/src/core/objects/aggregate/aggregate.diff.test.ts +215 -0
  266. package/src/core/objects/aggregate/aggregate.diff.ts +222 -0
  267. package/src/core/objects/aggregate/aggregate.model.ts +317 -0
  268. package/src/core/objects/aggregate/changes/aggregate.alter.test.ts +66 -0
  269. package/src/core/objects/aggregate/changes/aggregate.alter.ts +32 -0
  270. package/src/core/objects/aggregate/changes/aggregate.base.ts +20 -0
  271. package/src/core/objects/aggregate/changes/aggregate.comment.test.ts +89 -0
  272. package/src/core/objects/aggregate/changes/aggregate.comment.ts +62 -0
  273. package/src/core/objects/aggregate/changes/aggregate.create.test.ts +104 -0
  274. package/src/core/objects/aggregate/changes/aggregate.create.ts +329 -0
  275. package/src/core/objects/aggregate/changes/aggregate.drop.test.ts +82 -0
  276. package/src/core/objects/aggregate/changes/aggregate.drop.ts +32 -0
  277. package/src/core/objects/aggregate/changes/aggregate.privilege.test.ts +136 -0
  278. package/src/core/objects/aggregate/changes/aggregate.privilege.ts +146 -0
  279. package/src/core/objects/aggregate/changes/aggregate.types.ts +12 -0
  280. package/src/core/objects/base.change.ts +62 -0
  281. package/src/core/objects/base.default-privileges.ts +204 -0
  282. package/src/core/objects/base.diff.ts +20 -0
  283. package/src/core/objects/base.model.ts +82 -0
  284. package/src/core/objects/base.privilege-diff.ts +447 -0
  285. package/src/core/objects/base.privilege.ts +191 -0
  286. package/src/core/objects/collation/changes/collation.alter.test.ts +68 -0
  287. package/src/core/objects/collation/changes/collation.alter.ts +79 -0
  288. package/src/core/objects/collation/changes/collation.base.ts +20 -0
  289. package/src/core/objects/collation/changes/collation.comment.ts +68 -0
  290. package/src/core/objects/collation/changes/collation.create.test.ts +56 -0
  291. package/src/core/objects/collation/changes/collation.create.ts +106 -0
  292. package/src/core/objects/collation/changes/collation.drop.test.ts +31 -0
  293. package/src/core/objects/collation/changes/collation.drop.ts +37 -0
  294. package/src/core/objects/collation/changes/collation.types.ts +10 -0
  295. package/src/core/objects/collation/collation.diff.test.ts +97 -0
  296. package/src/core/objects/collation/collation.diff.ts +127 -0
  297. package/src/core/objects/collation/collation.model.ts +224 -0
  298. package/src/core/objects/diff-context.ts +16 -0
  299. package/src/core/objects/domain/changes/domain.alter.test.ts +335 -0
  300. package/src/core/objects/domain/changes/domain.alter.ts +286 -0
  301. package/src/core/objects/domain/changes/domain.base.ts +20 -0
  302. package/src/core/objects/domain/changes/domain.comment.ts +59 -0
  303. package/src/core/objects/domain/changes/domain.create.test.ts +95 -0
  304. package/src/core/objects/domain/changes/domain.create.ts +124 -0
  305. package/src/core/objects/domain/changes/domain.drop.test.ts +33 -0
  306. package/src/core/objects/domain/changes/domain.drop.ts +34 -0
  307. package/src/core/objects/domain/changes/domain.privilege.ts +171 -0
  308. package/src/core/objects/domain/changes/domain.types.ts +12 -0
  309. package/src/core/objects/domain/domain.diff.test.ts +284 -0
  310. package/src/core/objects/domain/domain.diff.ts +295 -0
  311. package/src/core/objects/domain/domain.model.ts +190 -0
  312. package/src/core/objects/event-trigger/changes/event-trigger.alter.test.ts +57 -0
  313. package/src/core/objects/event-trigger/changes/event-trigger.alter.ts +82 -0
  314. package/src/core/objects/event-trigger/changes/event-trigger.base.ts +20 -0
  315. package/src/core/objects/event-trigger/changes/event-trigger.comment.ts +66 -0
  316. package/src/core/objects/event-trigger/changes/event-trigger.create.test.ts +27 -0
  317. package/src/core/objects/event-trigger/changes/event-trigger.create.ts +72 -0
  318. package/src/core/objects/event-trigger/changes/event-trigger.drop.test.ts +25 -0
  319. package/src/core/objects/event-trigger/changes/event-trigger.drop.ts +34 -0
  320. package/src/core/objects/event-trigger/changes/event-trigger.types.ts +10 -0
  321. package/src/core/objects/event-trigger/event-trigger.diff.test.ts +131 -0
  322. package/src/core/objects/event-trigger/event-trigger.diff.ts +127 -0
  323. package/src/core/objects/event-trigger/event-trigger.model.ts +106 -0
  324. package/src/core/objects/extension/changes/extension.alter.test.ts +63 -0
  325. package/src/core/objects/extension/changes/extension.alter.ts +78 -0
  326. package/src/core/objects/extension/changes/extension.base.ts +20 -0
  327. package/src/core/objects/extension/changes/extension.comment.ts +64 -0
  328. package/src/core/objects/extension/changes/extension.create.test.ts +28 -0
  329. package/src/core/objects/extension/changes/extension.create.ts +63 -0
  330. package/src/core/objects/extension/changes/extension.drop.test.ts +26 -0
  331. package/src/core/objects/extension/changes/extension.drop.ts +34 -0
  332. package/src/core/objects/extension/changes/extension.types.ts +10 -0
  333. package/src/core/objects/extension/extension.diff.test.ts +42 -0
  334. package/src/core/objects/extension/extension.diff.ts +90 -0
  335. package/src/core/objects/extension/extension.model.test.ts +98 -0
  336. package/src/core/objects/extension/extension.model.ts +280 -0
  337. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.test.ts +136 -0
  338. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.ts +101 -0
  339. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.base.ts +20 -0
  340. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.ts +72 -0
  341. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.test.ts +160 -0
  342. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.ts +95 -0
  343. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.test.ts +26 -0
  344. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.ts +36 -0
  345. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.ts +172 -0
  346. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.ts +12 -0
  347. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.test.ts +286 -0
  348. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.ts +271 -0
  349. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.ts +149 -0
  350. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.ts +10 -0
  351. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.test.ts +340 -0
  352. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.ts +341 -0
  353. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.base.ts +20 -0
  354. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.ts +72 -0
  355. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.test.ts +210 -0
  356. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.ts +81 -0
  357. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.test.ts +46 -0
  358. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.ts +37 -0
  359. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.ts +181 -0
  360. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.ts +12 -0
  361. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.test.ts +813 -0
  362. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.ts +343 -0
  363. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.ts +242 -0
  364. package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.test.ts +183 -0
  365. package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.ts +126 -0
  366. package/src/core/objects/foreign-data-wrapper/server/changes/server.base.ts +20 -0
  367. package/src/core/objects/foreign-data-wrapper/server/changes/server.comment.ts +60 -0
  368. package/src/core/objects/foreign-data-wrapper/server/changes/server.create.test.ts +144 -0
  369. package/src/core/objects/foreign-data-wrapper/server/changes/server.create.ts +81 -0
  370. package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.test.ts +27 -0
  371. package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.ts +34 -0
  372. package/src/core/objects/foreign-data-wrapper/server/changes/server.privilege.ts +164 -0
  373. package/src/core/objects/foreign-data-wrapper/server/changes/server.types.ts +12 -0
  374. package/src/core/objects/foreign-data-wrapper/server/server.diff.test.ts +262 -0
  375. package/src/core/objects/foreign-data-wrapper/server/server.diff.ts +247 -0
  376. package/src/core/objects/foreign-data-wrapper/server/server.model.ts +133 -0
  377. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.test.ts +91 -0
  378. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.ts +69 -0
  379. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.base.ts +20 -0
  380. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.test.ts +96 -0
  381. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.ts +66 -0
  382. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.test.ts +60 -0
  383. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.ts +40 -0
  384. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.ts +8 -0
  385. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.test.ts +77 -0
  386. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.ts +107 -0
  387. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.ts +96 -0
  388. package/src/core/objects/index/changes/index.alter.test.ts +209 -0
  389. package/src/core/objects/index/changes/index.alter.ts +144 -0
  390. package/src/core/objects/index/changes/index.base.ts +20 -0
  391. package/src/core/objects/index/changes/index.comment.ts +63 -0
  392. package/src/core/objects/index/changes/index.create.test.ts +69 -0
  393. package/src/core/objects/index/changes/index.create.ts +68 -0
  394. package/src/core/objects/index/changes/index.drop.test.ts +47 -0
  395. package/src/core/objects/index/changes/index.drop.ts +34 -0
  396. package/src/core/objects/index/changes/index.types.ts +6 -0
  397. package/src/core/objects/index/changes/utils.ts +16 -0
  398. package/src/core/objects/index/index.diff.test.ts +153 -0
  399. package/src/core/objects/index/index.diff.ts +243 -0
  400. package/src/core/objects/index/index.model.ts +370 -0
  401. package/src/core/objects/language/changes/language.alter.test.ts +36 -0
  402. package/src/core/objects/language/changes/language.alter.ts +53 -0
  403. package/src/core/objects/language/changes/language.base.ts +20 -0
  404. package/src/core/objects/language/changes/language.comment.ts +58 -0
  405. package/src/core/objects/language/changes/language.create.test.ts +30 -0
  406. package/src/core/objects/language/changes/language.create.ts +104 -0
  407. package/src/core/objects/language/changes/language.drop.test.ts +28 -0
  408. package/src/core/objects/language/changes/language.drop.ts +39 -0
  409. package/src/core/objects/language/changes/language.privilege.ts +172 -0
  410. package/src/core/objects/language/changes/language.types.ts +12 -0
  411. package/src/core/objects/language/language.diff.test.ts +135 -0
  412. package/src/core/objects/language/language.diff.ts +144 -0
  413. package/src/core/objects/language/language.model.ts +150 -0
  414. package/src/core/objects/materialized-view/changes/materialized-view.alter.test.ts +130 -0
  415. package/src/core/objects/materialized-view/changes/materialized-view.alter.ts +113 -0
  416. package/src/core/objects/materialized-view/changes/materialized-view.base.ts +20 -0
  417. package/src/core/objects/materialized-view/changes/materialized-view.comment.ts +176 -0
  418. package/src/core/objects/materialized-view/changes/materialized-view.create.test.ts +69 -0
  419. package/src/core/objects/materialized-view/changes/materialized-view.create.ts +93 -0
  420. package/src/core/objects/materialized-view/changes/materialized-view.drop.test.ts +37 -0
  421. package/src/core/objects/materialized-view/changes/materialized-view.drop.ts +60 -0
  422. package/src/core/objects/materialized-view/changes/materialized-view.privilege.ts +212 -0
  423. package/src/core/objects/materialized-view/changes/materialized-view.types.ts +12 -0
  424. package/src/core/objects/materialized-view/materialized-view.diff.test.ts +264 -0
  425. package/src/core/objects/materialized-view/materialized-view.diff.ts +301 -0
  426. package/src/core/objects/materialized-view/materialized-view.model.ts +258 -0
  427. package/src/core/objects/procedure/changes/procedure.alter.test.ts +1077 -0
  428. package/src/core/objects/procedure/changes/procedure.alter.ts +290 -0
  429. package/src/core/objects/procedure/changes/procedure.base.ts +20 -0
  430. package/src/core/objects/procedure/changes/procedure.comment.ts +70 -0
  431. package/src/core/objects/procedure/changes/procedure.create.test.ts +51 -0
  432. package/src/core/objects/procedure/changes/procedure.create.ts +92 -0
  433. package/src/core/objects/procedure/changes/procedure.drop.test.ts +90 -0
  434. package/src/core/objects/procedure/changes/procedure.drop.ts +49 -0
  435. package/src/core/objects/procedure/changes/procedure.privilege.ts +188 -0
  436. package/src/core/objects/procedure/changes/procedure.types.ts +12 -0
  437. package/src/core/objects/procedure/procedure.diff.test.ts +161 -0
  438. package/src/core/objects/procedure/procedure.diff.ts +341 -0
  439. package/src/core/objects/procedure/procedure.model.ts +264 -0
  440. package/src/core/objects/procedure/utils.ts +58 -0
  441. package/src/core/objects/publication/changes/publication.alter.test.ts +217 -0
  442. package/src/core/objects/publication/changes/publication.alter.ts +225 -0
  443. package/src/core/objects/publication/changes/publication.base.ts +20 -0
  444. package/src/core/objects/publication/changes/publication.comment.test.ts +73 -0
  445. package/src/core/objects/publication/changes/publication.comment.ts +64 -0
  446. package/src/core/objects/publication/changes/publication.create.test.ts +90 -0
  447. package/src/core/objects/publication/changes/publication.create.ts +82 -0
  448. package/src/core/objects/publication/changes/publication.drop.test.ts +48 -0
  449. package/src/core/objects/publication/changes/publication.drop.ts +29 -0
  450. package/src/core/objects/publication/changes/publication.types.ts +24 -0
  451. package/src/core/objects/publication/publication.diff.test.ts +297 -0
  452. package/src/core/objects/publication/publication.diff.ts +247 -0
  453. package/src/core/objects/publication/publication.model.ts +206 -0
  454. package/src/core/objects/publication/utils.ts +55 -0
  455. package/src/core/objects/rls-policy/changes/rls-policy.alter.test.ts +267 -0
  456. package/src/core/objects/rls-policy/changes/rls-policy.alter.ts +128 -0
  457. package/src/core/objects/rls-policy/changes/rls-policy.base.ts +20 -0
  458. package/src/core/objects/rls-policy/changes/rls-policy.comment.ts +69 -0
  459. package/src/core/objects/rls-policy/changes/rls-policy.create.test.ts +81 -0
  460. package/src/core/objects/rls-policy/changes/rls-policy.create.ts +100 -0
  461. package/src/core/objects/rls-policy/changes/rls-policy.drop.test.ts +31 -0
  462. package/src/core/objects/rls-policy/changes/rls-policy.drop.ts +39 -0
  463. package/src/core/objects/rls-policy/changes/rls-policy.types.ts +10 -0
  464. package/src/core/objects/rls-policy/rls-policy.diff.test.ts +79 -0
  465. package/src/core/objects/rls-policy/rls-policy.diff.ts +121 -0
  466. package/src/core/objects/rls-policy/rls-policy.model.ts +140 -0
  467. package/src/core/objects/role/changes/role.alter.test.ts +362 -0
  468. package/src/core/objects/role/changes/role.alter.ts +110 -0
  469. package/src/core/objects/role/changes/role.base.ts +24 -0
  470. package/src/core/objects/role/changes/role.comment.ts +55 -0
  471. package/src/core/objects/role/changes/role.create.test.ts +56 -0
  472. package/src/core/objects/role/changes/role.create.ts +102 -0
  473. package/src/core/objects/role/changes/role.drop.test.ts +32 -0
  474. package/src/core/objects/role/changes/role.drop.ts +34 -0
  475. package/src/core/objects/role/changes/role.privilege.ts +376 -0
  476. package/src/core/objects/role/changes/role.types.ts +12 -0
  477. package/src/core/objects/role/role.diff.test.ts +279 -0
  478. package/src/core/objects/role/role.diff.ts +499 -0
  479. package/src/core/objects/role/role.model.ts +452 -0
  480. package/src/core/objects/rule/changes/rule.alter.test.ts +82 -0
  481. package/src/core/objects/rule/changes/rule.alter.ts +72 -0
  482. package/src/core/objects/rule/changes/rule.base.ts +20 -0
  483. package/src/core/objects/rule/changes/rule.comment.test.ts +58 -0
  484. package/src/core/objects/rule/changes/rule.comment.ts +62 -0
  485. package/src/core/objects/rule/changes/rule.create.test.ts +63 -0
  486. package/src/core/objects/rule/changes/rule.create.ts +42 -0
  487. package/src/core/objects/rule/changes/rule.drop.test.ts +40 -0
  488. package/src/core/objects/rule/changes/rule.drop.ts +29 -0
  489. package/src/core/objects/rule/changes/rule.types.ts +12 -0
  490. package/src/core/objects/rule/rule.diff.test.ts +132 -0
  491. package/src/core/objects/rule/rule.diff.ts +79 -0
  492. package/src/core/objects/rule/rule.model.ts +173 -0
  493. package/src/core/objects/schema/changes/schema.alter.test.ts +31 -0
  494. package/src/core/objects/schema/changes/schema.alter.ts +45 -0
  495. package/src/core/objects/schema/changes/schema.base.ts +20 -0
  496. package/src/core/objects/schema/changes/schema.comment.ts +56 -0
  497. package/src/core/objects/schema/changes/schema.create.test.ts +25 -0
  498. package/src/core/objects/schema/changes/schema.create.ts +47 -0
  499. package/src/core/objects/schema/changes/schema.drop.test.ts +23 -0
  500. package/src/core/objects/schema/changes/schema.drop.ts +34 -0
  501. package/src/core/objects/schema/changes/schema.privilege.ts +175 -0
  502. package/src/core/objects/schema/changes/schema.types.ts +12 -0
  503. package/src/core/objects/schema/schema.diff.test.ts +42 -0
  504. package/src/core/objects/schema/schema.diff.ts +146 -0
  505. package/src/core/objects/schema/schema.model.ts +107 -0
  506. package/src/core/objects/sequence/changes/sequence.alter.test.ts +157 -0
  507. package/src/core/objects/sequence/changes/sequence.alter.ts +115 -0
  508. package/src/core/objects/sequence/changes/sequence.base.ts +20 -0
  509. package/src/core/objects/sequence/changes/sequence.comment.ts +60 -0
  510. package/src/core/objects/sequence/changes/sequence.create.test.ts +89 -0
  511. package/src/core/objects/sequence/changes/sequence.create.ts +111 -0
  512. package/src/core/objects/sequence/changes/sequence.drop.test.ts +35 -0
  513. package/src/core/objects/sequence/changes/sequence.drop.ts +37 -0
  514. package/src/core/objects/sequence/changes/sequence.privilege.ts +179 -0
  515. package/src/core/objects/sequence/changes/sequence.types.ts +12 -0
  516. package/src/core/objects/sequence/sequence.diff.test.ts +255 -0
  517. package/src/core/objects/sequence/sequence.diff.ts +294 -0
  518. package/src/core/objects/sequence/sequence.model.ts +185 -0
  519. package/src/core/objects/subscription/changes/subscription.alter.test.ts +134 -0
  520. package/src/core/objects/subscription/changes/subscription.alter.ts +110 -0
  521. package/src/core/objects/subscription/changes/subscription.base.ts +20 -0
  522. package/src/core/objects/subscription/changes/subscription.comment.test.ts +70 -0
  523. package/src/core/objects/subscription/changes/subscription.comment.ts +64 -0
  524. package/src/core/objects/subscription/changes/subscription.create.test.ts +80 -0
  525. package/src/core/objects/subscription/changes/subscription.create.ts +69 -0
  526. package/src/core/objects/subscription/changes/subscription.drop.test.ts +48 -0
  527. package/src/core/objects/subscription/changes/subscription.drop.ts +20 -0
  528. package/src/core/objects/subscription/changes/subscription.types.ts +22 -0
  529. package/src/core/objects/subscription/subscription.diff.test.ts +237 -0
  530. package/src/core/objects/subscription/subscription.diff.ts +242 -0
  531. package/src/core/objects/subscription/subscription.model.ts +190 -0
  532. package/src/core/objects/subscription/utils.ts +156 -0
  533. package/src/core/objects/table/changes/table.alter.test.ts +846 -0
  534. package/src/core/objects/table/changes/table.alter.ts +806 -0
  535. package/src/core/objects/table/changes/table.base.ts +20 -0
  536. package/src/core/objects/table/changes/table.comment.ts +266 -0
  537. package/src/core/objects/table/changes/table.create.test.ts +188 -0
  538. package/src/core/objects/table/changes/table.create.ts +192 -0
  539. package/src/core/objects/table/changes/table.drop.test.ts +36 -0
  540. package/src/core/objects/table/changes/table.drop.ts +45 -0
  541. package/src/core/objects/table/changes/table.privilege.ts +200 -0
  542. package/src/core/objects/table/changes/table.types.ts +12 -0
  543. package/src/core/objects/table/table.diff.test.ts +868 -0
  544. package/src/core/objects/table/table.diff.ts +817 -0
  545. package/src/core/objects/table/table.model.ts +460 -0
  546. package/src/core/objects/trigger/changes/trigger.alter.test.ts +50 -0
  547. package/src/core/objects/trigger/changes/trigger.alter.ts +76 -0
  548. package/src/core/objects/trigger/changes/trigger.base.ts +20 -0
  549. package/src/core/objects/trigger/changes/trigger.comment.ts +64 -0
  550. package/src/core/objects/trigger/changes/trigger.create.test.ts +47 -0
  551. package/src/core/objects/trigger/changes/trigger.create.ts +88 -0
  552. package/src/core/objects/trigger/changes/trigger.drop.test.ts +47 -0
  553. package/src/core/objects/trigger/changes/trigger.drop.ts +39 -0
  554. package/src/core/objects/trigger/changes/trigger.types.ts +10 -0
  555. package/src/core/objects/trigger/trigger.diff.test.ts +84 -0
  556. package/src/core/objects/trigger/trigger.diff.ts +116 -0
  557. package/src/core/objects/trigger/trigger.model.ts +264 -0
  558. package/src/core/objects/type/composite-type/changes/composite-type.alter.test.ts +208 -0
  559. package/src/core/objects/type/composite-type/changes/composite-type.alter.ts +174 -0
  560. package/src/core/objects/type/composite-type/changes/composite-type.base.ts +20 -0
  561. package/src/core/objects/type/composite-type/changes/composite-type.comment.ts +145 -0
  562. package/src/core/objects/type/composite-type/changes/composite-type.create.test.ts +106 -0
  563. package/src/core/objects/type/composite-type/changes/composite-type.create.ts +95 -0
  564. package/src/core/objects/type/composite-type/changes/composite-type.drop.test.ts +36 -0
  565. package/src/core/objects/type/composite-type/changes/composite-type.drop.ts +37 -0
  566. package/src/core/objects/type/composite-type/changes/composite-type.privilege.ts +175 -0
  567. package/src/core/objects/type/composite-type/changes/composite-type.types.ts +12 -0
  568. package/src/core/objects/type/composite-type/composite-type.diff.test.ts +269 -0
  569. package/src/core/objects/type/composite-type/composite-type.diff.ts +310 -0
  570. package/src/core/objects/type/composite-type/composite-type.model.ts +253 -0
  571. package/src/core/objects/type/enum/changes/enum.alter.test.ts +113 -0
  572. package/src/core/objects/type/enum/changes/enum.alter.ts +91 -0
  573. package/src/core/objects/type/enum/changes/enum.base.ts +20 -0
  574. package/src/core/objects/type/enum/changes/enum.comment.ts +64 -0
  575. package/src/core/objects/type/enum/changes/enum.create.test.ts +31 -0
  576. package/src/core/objects/type/enum/changes/enum.create.ts +56 -0
  577. package/src/core/objects/type/enum/changes/enum.drop.test.ts +28 -0
  578. package/src/core/objects/type/enum/changes/enum.drop.ts +34 -0
  579. package/src/core/objects/type/enum/changes/enum.privilege.ts +175 -0
  580. package/src/core/objects/type/enum/changes/enum.types.ts +12 -0
  581. package/src/core/objects/type/enum/enum.diff.test.ts +372 -0
  582. package/src/core/objects/type/enum/enum.diff.ts +308 -0
  583. package/src/core/objects/type/enum/enum.model.ts +194 -0
  584. package/src/core/objects/type/range/changes/range.alter.test.ts +29 -0
  585. package/src/core/objects/type/range/changes/range.alter.ts +51 -0
  586. package/src/core/objects/type/range/changes/range.base.ts +20 -0
  587. package/src/core/objects/type/range/changes/range.comment.ts +64 -0
  588. package/src/core/objects/type/range/changes/range.create.test.ts +54 -0
  589. package/src/core/objects/type/range/changes/range.create.ts +155 -0
  590. package/src/core/objects/type/range/changes/range.drop.test.ts +28 -0
  591. package/src/core/objects/type/range/changes/range.drop.ts +34 -0
  592. package/src/core/objects/type/range/changes/range.privilege.ts +175 -0
  593. package/src/core/objects/type/range/changes/range.types.ts +12 -0
  594. package/src/core/objects/type/range/range.diff.test.ts +147 -0
  595. package/src/core/objects/type/range/range.diff.ts +197 -0
  596. package/src/core/objects/type/range/range.model.ts +187 -0
  597. package/src/core/objects/type/type.types.ts +5 -0
  598. package/src/core/objects/utils.ts +171 -0
  599. package/src/core/objects/view/changes/view.alter.test.ts +115 -0
  600. package/src/core/objects/view/changes/view.alter.ts +112 -0
  601. package/src/core/objects/view/changes/view.base.ts +20 -0
  602. package/src/core/objects/view/changes/view.comment.ts +59 -0
  603. package/src/core/objects/view/changes/view.create.test.ts +70 -0
  604. package/src/core/objects/view/changes/view.create.ts +73 -0
  605. package/src/core/objects/view/changes/view.drop.test.ts +37 -0
  606. package/src/core/objects/view/changes/view.drop.ts +40 -0
  607. package/src/core/objects/view/changes/view.privilege.ts +200 -0
  608. package/src/core/objects/view/changes/view.types.ts +12 -0
  609. package/src/core/objects/view/view.diff.test.ts +173 -0
  610. package/src/core/objects/view/view.diff.ts +215 -0
  611. package/src/core/objects/view/view.model.ts +262 -0
  612. package/src/core/plan/apply.ts +172 -0
  613. package/src/core/plan/create.ts +384 -0
  614. package/src/core/plan/hierarchy.ts +574 -0
  615. package/src/core/plan/index.ts +29 -0
  616. package/src/core/plan/io.ts +20 -0
  617. package/src/core/plan/risk.ts +48 -0
  618. package/src/core/plan/serialize.test.ts +317 -0
  619. package/src/core/plan/serialize.ts +209 -0
  620. package/src/core/plan/sql-format/constants.ts +13 -0
  621. package/src/core/plan/sql-format/fixtures.ts +2803 -0
  622. package/src/core/plan/sql-format/format-comment-literals.test.ts +96 -0
  623. package/src/core/plan/sql-format/format-functions.test.ts +127 -0
  624. package/src/core/plan/sql-format/format-lowercase-coverage.test.ts +119 -0
  625. package/src/core/plan/sql-format/format-off.test.ts +806 -0
  626. package/src/core/plan/sql-format/format-pretty-lower-leading.test.ts +1061 -0
  627. package/src/core/plan/sql-format/format-pretty-narrow.test.ts +1279 -0
  628. package/src/core/plan/sql-format/format-pretty-preserve.test.ts +1057 -0
  629. package/src/core/plan/sql-format/format-pretty-upper.test.ts +1048 -0
  630. package/src/core/plan/sql-format/format-stress.test.ts +616 -0
  631. package/src/core/plan/sql-format/format-utils.test.ts +91 -0
  632. package/src/core/plan/sql-format/format-utils.ts +391 -0
  633. package/src/core/plan/sql-format/formatters.ts +921 -0
  634. package/src/core/plan/sql-format/index.ts +149 -0
  635. package/src/core/plan/sql-format/keyword-case.test.ts +118 -0
  636. package/src/core/plan/sql-format/keyword-case.ts +1120 -0
  637. package/src/core/plan/sql-format/protect.test.ts +127 -0
  638. package/src/core/plan/sql-format/protect.ts +337 -0
  639. package/src/core/plan/sql-format/sql-scanner.test.ts +240 -0
  640. package/src/core/plan/sql-format/sql-scanner.ts +252 -0
  641. package/src/core/plan/sql-format/tokenizer.test.ts +68 -0
  642. package/src/core/plan/sql-format/tokenizer.ts +152 -0
  643. package/src/core/plan/sql-format/types.ts +31 -0
  644. package/src/core/plan/sql-format/wrap.test.ts +119 -0
  645. package/src/core/plan/sql-format/wrap.ts +196 -0
  646. package/src/core/plan/sql-format.ts +2 -0
  647. package/src/core/plan/ssl-config.ts +172 -0
  648. package/src/core/plan/statements.ts +22 -0
  649. package/src/core/plan/types.ts +171 -0
  650. package/src/core/postgres-config.ts +293 -0
  651. package/src/core/sort/custom-constraints.ts +161 -0
  652. package/src/core/sort/debug-visualization.ts +239 -0
  653. package/src/core/sort/dependency-filter.ts +224 -0
  654. package/src/core/sort/graph-builder.ts +235 -0
  655. package/src/core/sort/graph-utils.ts +51 -0
  656. package/src/core/sort/logical-sort.test.ts +371 -0
  657. package/src/core/sort/logical-sort.ts +597 -0
  658. package/src/core/sort/sort-changes.ts +234 -0
  659. package/src/core/sort/topological-sort.test.ts +275 -0
  660. package/src/core/sort/topological-sort.ts +184 -0
  661. package/src/core/sort/types.ts +112 -0
  662. package/src/core/sort/utils.ts +69 -0
  663. package/src/core/test-utils/assert-valid-sql.ts +20 -0
  664. package/src/index.ts +41 -0
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Map changes to declarative schema file paths.
3
+ */
4
+ import type { Change } from "../change.types.ts";
5
+ import type { FilePath, Grouping } from "./types.ts";
6
+ export declare function getFilePath(change: Change): FilePath;
7
+ /** A compiled grouping pattern: pre-built RegExp + group name. */
8
+ export interface CompiledPattern {
9
+ regex: RegExp;
10
+ name: string;
11
+ }
12
+ /** Result of compilePatterns: valid compiled patterns plus warnings for skipped/invalid regexes. */
13
+ interface CompilePatternsResult {
14
+ compiled: CompiledPattern[];
15
+ warnings: string[];
16
+ }
17
+ /**
18
+ * Compile user-facing `GroupingPattern[]` into `CompiledPattern[]`.
19
+ * Strings are turned into `new RegExp(str)`. Invalid regex strings are skipped
20
+ * (no throw), so the returned `compiled` array may be shorter than the input.
21
+ * Any skipped patterns are reported in `warnings`.
22
+ */
23
+ export declare function compilePatterns(patterns: import("./types.ts").GroupingPattern[]): CompilePatternsResult;
24
+ /**
25
+ * Create a file mapper that applies regex-based grouping on top of the
26
+ * default `getFilePath` mapping.
27
+ *
28
+ * When no grouping config is provided (or it is undefined), the plain
29
+ * `getFilePath` function is returned unchanged.
30
+ */
31
+ export declare function createFileMapper(grouping?: Grouping, onWarning?: (message: string) => void): (change: Change) => FilePath;
32
+ /**
33
+ * Flatten a schema-scoped file path into one file per category.
34
+ *
35
+ * e.g. `schemas/partman/tables/template_public_events.sql`
36
+ * → `schemas/partman/tables.sql`
37
+ *
38
+ * `schema.sql` is left unchanged (it is already flat).
39
+ */
40
+ export declare function flattenSchema(filePath: FilePath): FilePath;
41
+ /**
42
+ * Determine the group name for a change, or `null` if it should not be
43
+ * grouped.
44
+ *
45
+ * Resolution order:
46
+ * 1. Automatic partition detection -- resolve the parent table name.
47
+ * 2. Regex patterns -- first match wins (user controls priority by ordering).
48
+ *
49
+ * The resolved name from step 1 is fed through step 2 so that a partition
50
+ * parent name can itself be matched by a broader pattern (e.g. parent
51
+ * "kubernetes_resource_events" matches `/^kubernetes/`).
52
+ *
53
+ * If auto-detect resolved a parent but no pattern matched, the parent name
54
+ * is used as-is.
55
+ */
56
+ export declare function resolveGroupName(change: Change, filePath: FilePath, patterns: CompiledPattern[], autoPartitions: boolean): string | null;
57
+ /**
58
+ * Rewrite a `FilePath` according to the chosen grouping mode.
59
+ *
60
+ * - **single-file**: the filename becomes `{prefix}.sql` inside the original
61
+ * category directory.
62
+ * e.g. `schemas/public/tables/wal_verification_results_p20260107.sql`
63
+ * → `schemas/public/tables/wal_verification_results.sql`
64
+ *
65
+ * - **subdirectory**: the file is moved to a prefix-named directory under the
66
+ * schema root, with the category as the filename.
67
+ * e.g. `schemas/public/tables/wal_verification_results_p20260107.sql`
68
+ * → `schemas/public/wal_verification_results/tables.sql`
69
+ */
70
+ export declare function applyGrouping(filePath: FilePath, prefix: string, mode: Grouping["mode"]): FilePath;
71
+ export {};
@@ -0,0 +1,474 @@
1
+ /**
2
+ * Map changes to declarative schema file paths.
3
+ */
4
+ import createDebug from "debug";
5
+ import { getObjectName, getObjectSchema, getParentInfo, } from "../plan/serialize.js";
6
+ const debugExport = createDebug("pg-delta:export");
7
+ function isRoleDefaultPrivilegeChange(change) {
8
+ return (change.objectType === "role" &&
9
+ change.scope === "default_privilege" &&
10
+ "inSchema" in change);
11
+ }
12
+ function requireSchema(change) {
13
+ const schema = getObjectSchema(change);
14
+ if (!schema) {
15
+ throw new Error(`Expected schema for ${change.objectType} change '${getObjectName(change)}' (operation: ${change.operation})`);
16
+ }
17
+ return schema;
18
+ }
19
+ function schemaPath(schema, ...parts) {
20
+ return `schemas/${schema}/${parts.join("/")}`;
21
+ }
22
+ // ============================================================================
23
+ // File Path Mapping
24
+ // ============================================================================
25
+ export function getFilePath(change) {
26
+ switch (change.objectType) {
27
+ case "role":
28
+ if (isRoleDefaultPrivilegeChange(change) && change.inSchema) {
29
+ const schemaName = change.inSchema;
30
+ return {
31
+ path: schemaPath(schemaName, "schema.sql"),
32
+ category: "schema",
33
+ metadata: {
34
+ objectType: "default_privilege",
35
+ schemaName,
36
+ objectName: schemaName,
37
+ },
38
+ };
39
+ }
40
+ return {
41
+ path: "cluster/roles.sql",
42
+ category: "cluster",
43
+ metadata: { objectType: "role" },
44
+ };
45
+ case "extension": {
46
+ const extensionName = getObjectName(change);
47
+ return {
48
+ path: `cluster/extensions/${extensionName}.sql`,
49
+ category: "extensions",
50
+ metadata: { objectType: "extension", objectName: extensionName },
51
+ };
52
+ }
53
+ case "foreign_data_wrapper":
54
+ case "server":
55
+ case "user_mapping":
56
+ return {
57
+ path: "cluster/foreign_data_wrappers.sql",
58
+ category: "cluster",
59
+ metadata: { objectType: change.objectType },
60
+ };
61
+ case "publication":
62
+ return {
63
+ path: "cluster/publications.sql",
64
+ category: "cluster",
65
+ metadata: { objectType: "publication" },
66
+ };
67
+ case "subscription":
68
+ return {
69
+ path: "cluster/subscriptions.sql",
70
+ category: "cluster",
71
+ metadata: { objectType: "subscription" },
72
+ };
73
+ case "event_trigger":
74
+ return {
75
+ path: "cluster/event_triggers.sql",
76
+ category: "cluster",
77
+ metadata: { objectType: "event_trigger" },
78
+ };
79
+ case "language":
80
+ return {
81
+ path: "cluster/languages.sql",
82
+ category: "cluster",
83
+ metadata: { objectType: "language" },
84
+ };
85
+ case "schema": {
86
+ const schemaName = change.schema.name;
87
+ return {
88
+ path: schemaPath(schemaName, "schema.sql"),
89
+ category: "schema",
90
+ metadata: {
91
+ objectType: "schema",
92
+ schemaName,
93
+ objectName: schemaName,
94
+ },
95
+ };
96
+ }
97
+ case "enum":
98
+ case "composite_type":
99
+ case "range": {
100
+ const schema = requireSchema(change);
101
+ const objectName = getObjectName(change);
102
+ return {
103
+ path: schemaPath(schema, "types", `${objectName}.sql`),
104
+ category: "types",
105
+ metadata: {
106
+ objectType: change.objectType,
107
+ schemaName: schema,
108
+ objectName,
109
+ },
110
+ };
111
+ }
112
+ case "domain": {
113
+ const schema = requireSchema(change);
114
+ const objectName = getObjectName(change);
115
+ return {
116
+ path: schemaPath(schema, "domains", `${objectName}.sql`),
117
+ category: "domains",
118
+ metadata: {
119
+ objectType: "domain",
120
+ schemaName: schema,
121
+ objectName,
122
+ },
123
+ };
124
+ }
125
+ case "collation": {
126
+ const schema = requireSchema(change);
127
+ const objectName = getObjectName(change);
128
+ return {
129
+ path: schemaPath(schema, "collations", `${objectName}.sql`),
130
+ category: "collations",
131
+ metadata: {
132
+ objectType: "collation",
133
+ schemaName: schema,
134
+ objectName,
135
+ },
136
+ };
137
+ }
138
+ case "sequence": {
139
+ const schema = requireSchema(change);
140
+ const objectName = getObjectName(change);
141
+ // ALTER SEQUENCE ... OWNED BY must be grouped with the owning table,
142
+ // not the sequence file, to avoid ordering issues: the table must exist
143
+ // before the OWNED BY clause can reference its column.
144
+ if (change.operation === "alter" &&
145
+ "ownedBy" in change &&
146
+ change.ownedBy) {
147
+ const ownedBy = change.ownedBy;
148
+ return {
149
+ path: schemaPath(ownedBy.schema, "tables", `${ownedBy.table}.sql`),
150
+ category: "tables",
151
+ metadata: {
152
+ objectType: "table",
153
+ schemaName: ownedBy.schema,
154
+ objectName: ownedBy.table,
155
+ },
156
+ };
157
+ }
158
+ return {
159
+ path: schemaPath(schema, "sequences", `${objectName}.sql`),
160
+ category: "sequences",
161
+ metadata: {
162
+ objectType: "sequence",
163
+ schemaName: schema,
164
+ objectName,
165
+ },
166
+ };
167
+ }
168
+ case "table": {
169
+ const schema = change.table.schema;
170
+ const tableName = change.table.name;
171
+ // Partitions always go in the same file as their parent table.
172
+ if (change.table.is_partition && change.table.parent_name) {
173
+ const parentSchema = change.table.parent_schema ?? change.table.schema;
174
+ return {
175
+ path: schemaPath(parentSchema, "tables", `${change.table.parent_name}.sql`),
176
+ category: "tables",
177
+ metadata: {
178
+ objectType: "table",
179
+ schemaName: parentSchema,
180
+ objectName: change.table.parent_name,
181
+ },
182
+ };
183
+ }
184
+ return {
185
+ path: schemaPath(schema, "tables", `${tableName}.sql`),
186
+ category: "tables",
187
+ metadata: {
188
+ objectType: "table",
189
+ schemaName: schema,
190
+ objectName: tableName,
191
+ },
192
+ };
193
+ }
194
+ case "foreign_table": {
195
+ const schema = requireSchema(change);
196
+ const objectName = getObjectName(change);
197
+ return {
198
+ path: schemaPath(schema, "foreign_tables", `${objectName}.sql`),
199
+ category: "foreign_tables",
200
+ metadata: {
201
+ objectType: "foreign_table",
202
+ schemaName: schema,
203
+ objectName,
204
+ },
205
+ };
206
+ }
207
+ case "view": {
208
+ const schema = requireSchema(change);
209
+ const objectName = getObjectName(change);
210
+ return {
211
+ path: schemaPath(schema, "views", `${objectName}.sql`),
212
+ category: "views",
213
+ metadata: {
214
+ objectType: "view",
215
+ schemaName: schema,
216
+ objectName,
217
+ },
218
+ };
219
+ }
220
+ case "materialized_view": {
221
+ const schema = requireSchema(change);
222
+ const objectName = getObjectName(change);
223
+ return {
224
+ path: schemaPath(schema, "matviews", `${objectName}.sql`),
225
+ category: "matviews",
226
+ metadata: {
227
+ objectType: "materialized_view",
228
+ schemaName: schema,
229
+ objectName,
230
+ },
231
+ };
232
+ }
233
+ case "procedure": {
234
+ const schema = requireSchema(change);
235
+ const objectName = getObjectName(change);
236
+ const isProcedure = change.procedure.kind === "p";
237
+ return {
238
+ path: schemaPath(schema, isProcedure ? "procedures" : "functions", `${objectName}.sql`),
239
+ category: isProcedure ? "procedures" : "functions",
240
+ metadata: {
241
+ objectType: isProcedure ? "procedure" : "function",
242
+ schemaName: schema,
243
+ objectName,
244
+ },
245
+ };
246
+ }
247
+ case "aggregate": {
248
+ const schema = requireSchema(change);
249
+ const objectName = getObjectName(change);
250
+ return {
251
+ path: schemaPath(schema, "aggregates", `${objectName}.sql`),
252
+ category: "aggregates",
253
+ metadata: {
254
+ objectType: "aggregate",
255
+ schemaName: schema,
256
+ objectName,
257
+ },
258
+ };
259
+ }
260
+ case "index": {
261
+ const schema = requireSchema(change);
262
+ const parent = getParentInfo(change);
263
+ if (!parent) {
264
+ throw new Error(`Expected parent for index '${getObjectName(change)}' in schema '${schema}'`);
265
+ }
266
+ const parentName = parent.name;
267
+ const category = parent.type === "materialized_view" ? "matviews" : "tables";
268
+ return {
269
+ path: schemaPath(schema, category, `${parentName}.sql`),
270
+ category,
271
+ metadata: {
272
+ objectType: parent.type,
273
+ schemaName: schema,
274
+ objectName: parentName,
275
+ },
276
+ };
277
+ }
278
+ case "trigger":
279
+ case "rls_policy":
280
+ case "rule": {
281
+ const schema = requireSchema(change);
282
+ const parent = getParentInfo(change);
283
+ if (!parent) {
284
+ throw new Error(`Expected parent for ${change.objectType} '${getObjectName(change)}' in schema '${schema}'`);
285
+ }
286
+ const parentName = parent.name;
287
+ const category = parent.type === "view"
288
+ ? "views"
289
+ : parent.type === "materialized_view"
290
+ ? "matviews"
291
+ : "tables";
292
+ return {
293
+ path: schemaPath(schema, category, `${parentName}.sql`),
294
+ category,
295
+ metadata: {
296
+ objectType: parent.type,
297
+ schemaName: schema,
298
+ objectName: parentName,
299
+ },
300
+ };
301
+ }
302
+ default: {
303
+ const _exhaustive = change;
304
+ return _exhaustive;
305
+ }
306
+ }
307
+ }
308
+ /**
309
+ * Compile user-facing `GroupingPattern[]` into `CompiledPattern[]`.
310
+ * Strings are turned into `new RegExp(str)`. Invalid regex strings are skipped
311
+ * (no throw), so the returned `compiled` array may be shorter than the input.
312
+ * Any skipped patterns are reported in `warnings`.
313
+ */
314
+ export function compilePatterns(patterns) {
315
+ const compiled = [];
316
+ const warnings = [];
317
+ for (const p of patterns) {
318
+ let regex;
319
+ if (typeof p.pattern === "string") {
320
+ try {
321
+ regex = new RegExp(p.pattern);
322
+ }
323
+ catch (e) {
324
+ const msg = `Skipping invalid grouping regex '${p.pattern}': ${e instanceof Error ? e.message : String(e)}`;
325
+ debugExport(msg);
326
+ warnings.push(msg);
327
+ continue;
328
+ }
329
+ }
330
+ else {
331
+ // Strip /g and /y flags — .test() mutates lastIndex with these flags,
332
+ // causing non-deterministic matching across repeated calls.
333
+ const flags = p.pattern.flags.replace(/[gy]/g, "");
334
+ regex =
335
+ flags !== p.pattern.flags
336
+ ? new RegExp(p.pattern.source, flags)
337
+ : p.pattern;
338
+ }
339
+ compiled.push({ regex, name: p.name });
340
+ }
341
+ return { compiled, warnings };
342
+ }
343
+ /**
344
+ * Create a file mapper that applies regex-based grouping on top of the
345
+ * default `getFilePath` mapping.
346
+ *
347
+ * When no grouping config is provided (or it is undefined), the plain
348
+ * `getFilePath` function is returned unchanged.
349
+ */
350
+ export function createFileMapper(grouping, onWarning) {
351
+ if (!grouping)
352
+ return getFilePath;
353
+ const { compiled, warnings } = compilePatterns(grouping.groupPatterns ?? []);
354
+ for (const w of warnings) {
355
+ onWarning?.(w);
356
+ }
357
+ const autoPartitions = grouping.autoGroupPartitions !== false; // default true
358
+ const flatSet = new Set(grouping.flatSchemas ?? []);
359
+ return (change) => {
360
+ const basePath = getFilePath(change);
361
+ // Flat schemas: collapse everything into one file per category.
362
+ // Applied first -- skips pattern matching for these schemas.
363
+ if (flatSet.size > 0 &&
364
+ basePath.metadata.schemaName &&
365
+ flatSet.has(basePath.metadata.schemaName)) {
366
+ return flattenSchema(basePath);
367
+ }
368
+ const groupName = resolveGroupName(change, basePath, compiled, autoPartitions);
369
+ if (!groupName)
370
+ return basePath;
371
+ return applyGrouping(basePath, groupName, grouping.mode);
372
+ };
373
+ }
374
+ /**
375
+ * Flatten a schema-scoped file path into one file per category.
376
+ *
377
+ * e.g. `schemas/partman/tables/template_public_events.sql`
378
+ * → `schemas/partman/tables.sql`
379
+ *
380
+ * `schema.sql` is left unchanged (it is already flat).
381
+ */
382
+ export function flattenSchema(filePath) {
383
+ const schema = filePath.metadata.schemaName ?? "";
384
+ const category = filePath.category;
385
+ // schema.sql stays as-is
386
+ if (category === "schema")
387
+ return filePath;
388
+ return {
389
+ path: schemaPath(schema, `${category}.sql`),
390
+ category,
391
+ metadata: {
392
+ ...filePath.metadata,
393
+ objectName: category,
394
+ },
395
+ };
396
+ }
397
+ /**
398
+ * Determine the group name for a change, or `null` if it should not be
399
+ * grouped.
400
+ *
401
+ * Resolution order:
402
+ * 1. Automatic partition detection -- resolve the parent table name.
403
+ * 2. Regex patterns -- first match wins (user controls priority by ordering).
404
+ *
405
+ * The resolved name from step 1 is fed through step 2 so that a partition
406
+ * parent name can itself be matched by a broader pattern (e.g. parent
407
+ * "kubernetes_resource_events" matches `/^kubernetes/`).
408
+ *
409
+ * If auto-detect resolved a parent but no pattern matched, the parent name
410
+ * is used as-is.
411
+ */
412
+ export function resolveGroupName(change, filePath, patterns, autoPartitions) {
413
+ // Only schema-scoped objects can be grouped (skip cluster-level).
414
+ if (!filePath.metadata.schemaName)
415
+ return null;
416
+ // 1. Auto-detect partitions: table changes where the table is a partition
417
+ // of another table.
418
+ let resolvedName = null;
419
+ if (autoPartitions &&
420
+ change.objectType === "table" &&
421
+ change.table.is_partition &&
422
+ change.table.parent_name) {
423
+ resolvedName = change.table.parent_name;
424
+ }
425
+ // 2. Regex patterns -- first match wins.
426
+ const nameToMatch = resolvedName ?? filePath.metadata.objectName;
427
+ if (nameToMatch) {
428
+ for (const p of patterns) {
429
+ if (p.regex.test(nameToMatch)) {
430
+ return p.name;
431
+ }
432
+ }
433
+ }
434
+ // 3. If auto-detect found a parent but no pattern matched, use the parent
435
+ // name directly.
436
+ return resolvedName;
437
+ }
438
+ /**
439
+ * Rewrite a `FilePath` according to the chosen grouping mode.
440
+ *
441
+ * - **single-file**: the filename becomes `{prefix}.sql` inside the original
442
+ * category directory.
443
+ * e.g. `schemas/public/tables/wal_verification_results_p20260107.sql`
444
+ * → `schemas/public/tables/wal_verification_results.sql`
445
+ *
446
+ * - **subdirectory**: the file is moved to a prefix-named directory under the
447
+ * schema root, with the category as the filename.
448
+ * e.g. `schemas/public/tables/wal_verification_results_p20260107.sql`
449
+ * → `schemas/public/wal_verification_results/tables.sql`
450
+ */
451
+ export function applyGrouping(filePath, prefix, mode) {
452
+ const schema = filePath.metadata.schemaName ?? "";
453
+ const category = filePath.category;
454
+ if (mode === "single-file") {
455
+ // Replace the filename, keep the category directory.
456
+ return {
457
+ path: schemaPath(schema, category, `${prefix}.sql`),
458
+ category,
459
+ metadata: {
460
+ ...filePath.metadata,
461
+ objectName: prefix,
462
+ },
463
+ };
464
+ }
465
+ // subdirectory mode: schemas/{schema}/{prefix}/{category}.sql
466
+ return {
467
+ path: schemaPath(schema, prefix, `${category}.sql`),
468
+ category,
469
+ metadata: {
470
+ ...filePath.metadata,
471
+ objectName: prefix,
472
+ },
473
+ };
474
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Group changes into declarative schema files and order them for readability.
3
+ */
4
+ import type { Change } from "../change.types.ts";
5
+ import type { FileCategory, FileMetadata, FilePath } from "./types.ts";
6
+ interface FileGroup {
7
+ path: string;
8
+ category: FileCategory;
9
+ metadata: FileMetadata;
10
+ changes: Change[];
11
+ }
12
+ export declare function groupChangesByFile(changes: Change[], mapper?: (change: Change) => FilePath): FileGroup[];
13
+ export {};
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Group changes into declarative schema files and order them for readability.
3
+ */
4
+ import { getFilePath } from "./file-mapper.js";
5
+ import { CATEGORY_PRIORITY } from "./types.js";
6
+ // ============================================================================
7
+ // Within-file ordering
8
+ // ============================================================================
9
+ const OPERATION_PRIORITY = {
10
+ create: 0,
11
+ alter: 1,
12
+ };
13
+ const SCOPE_PRIORITY = {
14
+ object: 0,
15
+ comment: 1,
16
+ privilege: 2,
17
+ default_privilege: 3,
18
+ membership: 4,
19
+ };
20
+ /**
21
+ * Sort changes within a file for readability:
22
+ * 1. By operation: create → alter
23
+ * 2. By scope: object → comment → privilege → default_privilege → membership
24
+ * 3. Stable tie-break by original position
25
+ */
26
+ function sortChangesWithinFile(changes) {
27
+ // Tag each change with its original index for stable tie-breaking.
28
+ const tagged = changes.map((change, index) => ({ change, index }));
29
+ tagged.sort((a, b) => {
30
+ const opA = OPERATION_PRIORITY[a.change.operation] ?? 99;
31
+ const opB = OPERATION_PRIORITY[b.change.operation] ?? 99;
32
+ if (opA !== opB)
33
+ return opA - opB;
34
+ const scopeA = SCOPE_PRIORITY[a.change.scope ?? "object"] ?? 99;
35
+ const scopeB = SCOPE_PRIORITY[b.change.scope ?? "object"] ?? 99;
36
+ if (scopeA !== scopeB)
37
+ return scopeA - scopeB;
38
+ return a.index - b.index;
39
+ });
40
+ return tagged.map((t) => t.change);
41
+ }
42
+ // ============================================================================
43
+ // Grouping & Ordering
44
+ // ============================================================================
45
+ export function groupChangesByFile(changes, mapper = getFilePath) {
46
+ const groups = new Map();
47
+ for (const change of changes) {
48
+ const file = mapper(change);
49
+ const existing = groups.get(file.path);
50
+ if (!existing) {
51
+ groups.set(file.path, {
52
+ path: file.path,
53
+ category: file.category,
54
+ metadata: file.metadata,
55
+ changes: [change],
56
+ });
57
+ continue;
58
+ }
59
+ existing.changes.push(change);
60
+ }
61
+ // Sort within each file for readability.
62
+ for (const group of groups.values()) {
63
+ group.changes = sortChangesWithinFile(group.changes);
64
+ }
65
+ // Sort files by category priority, then alphabetically by path.
66
+ return Array.from(groups.values()).sort(sortByCategory);
67
+ }
68
+ /**
69
+ * Sort by category priority, then path for determinism.
70
+ */
71
+ function sortByCategory(a, b) {
72
+ const categoryDiff = CATEGORY_PRIORITY[a.category] - CATEGORY_PRIORITY[b.category];
73
+ if (categoryDiff !== 0)
74
+ return categoryDiff;
75
+ return a.path.localeCompare(b.path);
76
+ }
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Declarative schema export.
3
+ */
4
+ import type { Integration } from "../integrations/integration.types.ts";
5
+ import type { createPlan } from "../plan/create.ts";
6
+ import type { SqlFormatOptions } from "../plan/sql-format/types.ts";
7
+ import type { DeclarativeSchemaOutput, Grouping } from "./types.ts";
8
+ /**
9
+ * The result of createPlan, containing the plan, sorted changes, and context.
10
+ * Use this type when you have already confirmed createPlan returned non-null.
11
+ */
12
+ type PlanResult = NonNullable<Awaited<ReturnType<typeof createPlan>>>;
13
+ export interface ExportOptions {
14
+ /** Integration for custom serialization */
15
+ integration?: Integration;
16
+ /**
17
+ * SQL formatter options to control the output style.
18
+ * Merged on top of the default export options (maxWidth: 180, keywordCase: "upper").
19
+ * See `SqlFormatOptions` for available keys.
20
+ */
21
+ formatOptions?: SqlFormatOptions | null;
22
+ /**
23
+ * Group entities by name prefix into consolidated files or subdirectories.
24
+ * Supports automatic partition detection and/or explicit prefix lists.
25
+ */
26
+ grouping?: Grouping;
27
+ /** Callback for non-fatal warnings (e.g. invalid grouping regex patterns). */
28
+ onWarning?: (message: string) => void;
29
+ }
30
+ /**
31
+ * Export a declarative schema from a plan result.
32
+ *
33
+ * Takes the output of `createPlan()` and generates a declarative schema output
34
+ * with files grouped by object type. Drop operations are excluded since
35
+ * declarative mode targets the final desired state.
36
+ *
37
+ * Dependency-based filtering (cascading exclusions) is handled by `createPlan`,
38
+ * so this function only needs to filter out drop operations.
39
+ *
40
+ * @param planResult - The result from createPlan() containing plan, sortedChanges, and ctx
41
+ * @param options - Optional integration for custom serialization
42
+ * @returns Declarative schema output with grouped files
43
+ */
44
+ export declare function exportDeclarativeSchema(planResult: PlanResult, options?: ExportOptions): DeclarativeSchemaOutput;
45
+ export {};