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

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 (717) 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 +240 -0
  10. package/dist/cli/commands/plan.js +47 -16
  11. package/dist/cli/commands/sync.js +8 -12
  12. package/dist/cli/exit-code.d.ts +2 -0
  13. package/dist/cli/exit-code.js +7 -0
  14. package/dist/cli/formatters/tree/tree.js +3 -2
  15. package/dist/cli/utils/apply-display.d.ts +52 -0
  16. package/dist/cli/utils/apply-display.js +183 -0
  17. package/dist/cli/utils/export-display.d.ts +43 -0
  18. package/dist/cli/utils/export-display.js +202 -0
  19. package/dist/cli/utils/integrations.d.ts +30 -6
  20. package/dist/cli/utils/integrations.js +98 -6
  21. package/dist/cli/utils/resolve-input.d.ts +7 -0
  22. package/dist/cli/utils/resolve-input.js +13 -0
  23. package/dist/cli/utils.d.ts +2 -0
  24. package/dist/cli/utils.js +1 -1
  25. package/dist/core/catalog-export/index.d.ts +11 -0
  26. package/dist/core/catalog-export/index.js +10 -0
  27. package/dist/core/catalog.diff.d.ts +1 -0
  28. package/dist/core/catalog.diff.js +64 -48
  29. package/dist/core/catalog.model.d.ts +16 -3
  30. package/dist/core/catalog.model.js +132 -30
  31. package/dist/core/catalog.snapshot.d.ts +66 -0
  32. package/dist/core/catalog.snapshot.js +206 -0
  33. package/dist/core/change-utils.d.ts +9 -0
  34. package/dist/core/change-utils.js +71 -0
  35. package/dist/core/change.types.d.ts +22 -0
  36. package/dist/core/change.types.js +37 -1
  37. package/dist/core/context.d.ts +3 -3
  38. package/dist/core/context.js +7 -10
  39. package/dist/core/declarative-apply/discover-sql.d.ts +18 -0
  40. package/dist/core/declarative-apply/discover-sql.js +86 -0
  41. package/dist/core/declarative-apply/extract-catalog-providers.d.ts +23 -0
  42. package/dist/core/declarative-apply/extract-catalog-providers.js +159 -0
  43. package/dist/core/declarative-apply/index.d.ts +49 -0
  44. package/dist/core/declarative-apply/index.js +134 -0
  45. package/dist/core/declarative-apply/round-apply.d.ts +100 -0
  46. package/dist/core/declarative-apply/round-apply.js +378 -0
  47. package/dist/core/depend.d.ts +2 -2
  48. package/dist/core/depend.js +33 -7
  49. package/dist/core/export/file-mapper.d.ts +71 -0
  50. package/dist/core/export/file-mapper.js +474 -0
  51. package/dist/core/export/grouper.d.ts +13 -0
  52. package/dist/core/export/grouper.js +76 -0
  53. package/dist/core/export/index.d.ts +45 -0
  54. package/dist/core/export/index.js +63 -0
  55. package/dist/core/export/types.d.ts +84 -0
  56. package/dist/core/export/types.js +25 -0
  57. package/dist/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
  58. package/dist/core/integrations/filter/dsl.d.ts +82 -41
  59. package/dist/core/integrations/filter/dsl.js +127 -61
  60. package/dist/core/integrations/filter/flatten.d.ts +51 -0
  61. package/dist/core/integrations/filter/flatten.js +116 -0
  62. package/dist/core/integrations/integration-dsl.d.ts +27 -1
  63. package/dist/core/integrations/merge.d.ts +20 -0
  64. package/dist/core/integrations/merge.js +60 -0
  65. package/dist/core/integrations/serialize/dsl.d.ts +7 -4
  66. package/dist/core/integrations/serialize/dsl.js +2 -2
  67. package/dist/core/integrations/supabase.d.ts +8 -0
  68. package/dist/core/integrations/supabase.js +34 -8
  69. package/dist/core/objects/aggregate/aggregate.diff.d.ts +2 -8
  70. package/dist/core/objects/aggregate/aggregate.diff.js +16 -70
  71. package/dist/core/objects/aggregate/aggregate.model.d.ts +10 -10
  72. package/dist/core/objects/aggregate/aggregate.model.js +8 -10
  73. package/dist/core/objects/aggregate/changes/aggregate.create.js +1 -1
  74. package/dist/core/objects/aggregate/changes/aggregate.drop.js +1 -1
  75. package/dist/core/objects/aggregate/changes/aggregate.types.d.ts +1 -0
  76. package/dist/core/objects/base.change.d.ts +10 -0
  77. package/dist/core/objects/base.change.js +10 -0
  78. package/dist/core/objects/base.model.d.ts +4 -1
  79. package/dist/core/objects/base.model.js +5 -2
  80. package/dist/core/objects/base.privilege-diff.d.ts +38 -13
  81. package/dist/core/objects/base.privilege-diff.js +104 -22
  82. package/dist/core/objects/base.privilege.d.ts +1 -0
  83. package/dist/core/objects/base.privilege.js +9 -2
  84. package/dist/core/objects/collation/changes/collation.types.d.ts +1 -0
  85. package/dist/core/objects/collation/collation.diff.d.ts +2 -3
  86. package/dist/core/objects/collation/collation.model.d.ts +2 -2
  87. package/dist/core/objects/collation/collation.model.js +29 -28
  88. package/dist/core/objects/diff-context.d.ts +15 -0
  89. package/dist/core/objects/diff-context.js +1 -0
  90. package/dist/core/objects/domain/changes/domain.create.d.ts +1 -1
  91. package/dist/core/objects/domain/changes/domain.create.js +11 -3
  92. package/dist/core/objects/domain/changes/domain.types.d.ts +1 -0
  93. package/dist/core/objects/domain/domain.diff.d.ts +2 -8
  94. package/dist/core/objects/domain/domain.diff.js +16 -77
  95. package/dist/core/objects/domain/domain.model.d.ts +2 -2
  96. package/dist/core/objects/domain/domain.model.js +9 -11
  97. package/dist/core/objects/event-trigger/changes/event-trigger.types.d.ts +1 -0
  98. package/dist/core/objects/event-trigger/event-trigger.diff.d.ts +2 -3
  99. package/dist/core/objects/event-trigger/event-trigger.model.d.ts +2 -2
  100. package/dist/core/objects/event-trigger/event-trigger.model.js +7 -9
  101. package/dist/core/objects/extension/changes/extension.types.d.ts +1 -0
  102. package/dist/core/objects/extension/extension.model.d.ts +2 -2
  103. package/dist/core/objects/extension/extension.model.js +8 -10
  104. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.d.ts +1 -0
  105. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.d.ts +2 -8
  106. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.js +13 -77
  107. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.d.ts +2 -2
  108. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.js +22 -24
  109. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.d.ts +1 -0
  110. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.d.ts +1 -0
  111. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.d.ts +2 -8
  112. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.js +16 -77
  113. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.d.ts +2 -2
  114. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.js +21 -23
  115. package/dist/core/objects/foreign-data-wrapper/server/changes/server.types.d.ts +1 -0
  116. package/dist/core/objects/foreign-data-wrapper/server/server.diff.d.ts +2 -8
  117. package/dist/core/objects/foreign-data-wrapper/server/server.diff.js +13 -77
  118. package/dist/core/objects/foreign-data-wrapper/server/server.model.d.ts +2 -2
  119. package/dist/core/objects/foreign-data-wrapper/server/server.model.js +20 -22
  120. package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.d.ts +1 -0
  121. package/dist/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.d.ts +2 -2
  122. package/dist/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.js +20 -22
  123. package/dist/core/objects/index/changes/index.types.d.ts +1 -0
  124. package/dist/core/objects/index/index.model.d.ts +4 -4
  125. package/dist/core/objects/index/index.model.js +9 -11
  126. package/dist/core/objects/language/changes/language.types.d.ts +1 -0
  127. package/dist/core/objects/language/language.diff.d.ts +2 -5
  128. package/dist/core/objects/language/language.diff.js +7 -39
  129. package/dist/core/objects/language/language.model.js +5 -7
  130. package/dist/core/objects/materialized-view/changes/materialized-view.types.d.ts +1 -0
  131. package/dist/core/objects/materialized-view/materialized-view.diff.d.ts +2 -8
  132. package/dist/core/objects/materialized-view/materialized-view.diff.js +16 -158
  133. package/dist/core/objects/materialized-view/materialized-view.model.d.ts +5 -5
  134. package/dist/core/objects/materialized-view/materialized-view.model.js +9 -11
  135. package/dist/core/objects/procedure/changes/procedure.alter.js +12 -12
  136. package/dist/core/objects/procedure/changes/procedure.types.d.ts +1 -0
  137. package/dist/core/objects/procedure/procedure.diff.d.ts +2 -8
  138. package/dist/core/objects/procedure/procedure.diff.js +16 -77
  139. package/dist/core/objects/procedure/procedure.model.d.ts +11 -11
  140. package/dist/core/objects/procedure/procedure.model.js +9 -11
  141. package/dist/core/objects/publication/changes/publication.alter.d.ts +0 -9
  142. package/dist/core/objects/publication/changes/publication.alter.js +0 -14
  143. package/dist/core/objects/publication/changes/publication.types.d.ts +3 -2
  144. package/dist/core/objects/publication/publication.diff.d.ts +2 -3
  145. package/dist/core/objects/publication/publication.diff.js +8 -13
  146. package/dist/core/objects/publication/publication.model.d.ts +2 -2
  147. package/dist/core/objects/publication/publication.model.js +7 -9
  148. package/dist/core/objects/rls-policy/changes/rls-policy.alter.js +3 -3
  149. package/dist/core/objects/rls-policy/changes/rls-policy.types.d.ts +1 -0
  150. package/dist/core/objects/rls-policy/rls-policy.model.d.ts +4 -4
  151. package/dist/core/objects/rls-policy/rls-policy.model.js +8 -10
  152. package/dist/core/objects/role/changes/role.types.d.ts +1 -0
  153. package/dist/core/objects/role/role.diff.js +22 -1
  154. package/dist/core/objects/role/role.model.d.ts +6 -5
  155. package/dist/core/objects/role/role.model.js +146 -40
  156. package/dist/core/objects/rule/changes/rule.types.d.ts +1 -0
  157. package/dist/core/objects/rule/rule.model.d.ts +3 -3
  158. package/dist/core/objects/rule/rule.model.js +7 -9
  159. package/dist/core/objects/schema/changes/schema.types.d.ts +1 -0
  160. package/dist/core/objects/schema/schema.diff.d.ts +2 -8
  161. package/dist/core/objects/schema/schema.diff.js +16 -77
  162. package/dist/core/objects/schema/schema.model.d.ts +2 -2
  163. package/dist/core/objects/schema/schema.model.js +9 -11
  164. package/dist/core/objects/sequence/changes/sequence.types.d.ts +1 -0
  165. package/dist/core/objects/sequence/sequence.diff.d.ts +2 -8
  166. package/dist/core/objects/sequence/sequence.diff.js +16 -79
  167. package/dist/core/objects/sequence/sequence.model.d.ts +2 -2
  168. package/dist/core/objects/sequence/sequence.model.js +9 -11
  169. package/dist/core/objects/subscription/changes/subscription.types.d.ts +1 -0
  170. package/dist/core/objects/subscription/subscription.diff.d.ts +2 -3
  171. package/dist/core/objects/subscription/subscription.model.d.ts +2 -2
  172. package/dist/core/objects/subscription/subscription.model.js +25 -20
  173. package/dist/core/objects/table/changes/table.create.js +3 -0
  174. package/dist/core/objects/table/changes/table.types.d.ts +1 -0
  175. package/dist/core/objects/table/table.diff.d.ts +2 -8
  176. package/dist/core/objects/table/table.diff.js +26 -157
  177. package/dist/core/objects/table/table.model.d.ts +27 -24
  178. package/dist/core/objects/table/table.model.js +12 -11
  179. package/dist/core/objects/trigger/changes/trigger.alter.js +23 -0
  180. package/dist/core/objects/trigger/changes/trigger.create.js +4 -5
  181. package/dist/core/objects/trigger/changes/trigger.types.d.ts +1 -0
  182. package/dist/core/objects/trigger/trigger.model.d.ts +11 -2
  183. package/dist/core/objects/trigger/trigger.model.js +22 -10
  184. package/dist/core/objects/type/composite-type/changes/composite-type.types.d.ts +1 -0
  185. package/dist/core/objects/type/composite-type/composite-type.diff.d.ts +2 -8
  186. package/dist/core/objects/type/composite-type/composite-type.diff.js +16 -77
  187. package/dist/core/objects/type/composite-type/composite-type.model.d.ts +5 -5
  188. package/dist/core/objects/type/composite-type/composite-type.model.js +10 -11
  189. package/dist/core/objects/type/enum/changes/enum.types.d.ts +1 -0
  190. package/dist/core/objects/type/enum/enum.diff.d.ts +2 -8
  191. package/dist/core/objects/type/enum/enum.diff.js +25 -112
  192. package/dist/core/objects/type/enum/enum.model.d.ts +2 -2
  193. package/dist/core/objects/type/enum/enum.model.js +23 -25
  194. package/dist/core/objects/type/range/changes/range.create.js +6 -3
  195. package/dist/core/objects/type/range/changes/range.types.d.ts +1 -0
  196. package/dist/core/objects/type/range/range.diff.d.ts +2 -8
  197. package/dist/core/objects/type/range/range.diff.js +16 -77
  198. package/dist/core/objects/type/range/range.model.d.ts +2 -2
  199. package/dist/core/objects/type/range/range.model.js +8 -10
  200. package/dist/core/objects/type/type.types.d.ts +1 -0
  201. package/dist/core/objects/view/changes/view.types.d.ts +1 -0
  202. package/dist/core/objects/view/view.diff.d.ts +2 -8
  203. package/dist/core/objects/view/view.diff.js +37 -168
  204. package/dist/core/objects/view/view.model.d.ts +20 -6
  205. package/dist/core/objects/view/view.model.js +11 -23
  206. package/dist/core/plan/apply.d.ts +2 -2
  207. package/dist/core/plan/apply.js +33 -16
  208. package/dist/core/plan/create.d.ts +20 -7
  209. package/dist/core/plan/create.js +153 -112
  210. package/dist/core/plan/serialize.js +16 -4
  211. package/dist/core/plan/sql-format/constants.d.ts +2 -0
  212. package/dist/core/plan/sql-format/constants.js +11 -0
  213. package/dist/core/plan/sql-format/fixtures.d.ts +2 -0
  214. package/dist/core/plan/sql-format/fixtures.js +2447 -0
  215. package/dist/core/plan/sql-format/format-utils.d.ts +37 -0
  216. package/dist/core/plan/sql-format/format-utils.js +274 -0
  217. package/dist/core/plan/sql-format/formatters.d.ts +20 -0
  218. package/dist/core/plan/sql-format/formatters.js +737 -0
  219. package/dist/core/plan/sql-format/index.d.ts +2 -0
  220. package/dist/core/plan/sql-format/index.js +98 -0
  221. package/dist/core/plan/sql-format/keyword-case.d.ts +2 -0
  222. package/dist/core/plan/sql-format/keyword-case.js +893 -0
  223. package/dist/core/plan/sql-format/protect.d.ts +3 -0
  224. package/dist/core/plan/sql-format/protect.js +269 -0
  225. package/dist/core/plan/sql-format/sql-scanner.d.ts +59 -0
  226. package/dist/core/plan/sql-format/sql-scanner.js +202 -0
  227. package/dist/core/plan/sql-format/tokenizer.d.ts +22 -0
  228. package/dist/core/plan/sql-format/tokenizer.js +118 -0
  229. package/dist/core/plan/sql-format/types.d.ts +28 -0
  230. package/dist/core/plan/sql-format/types.js +1 -0
  231. package/dist/core/plan/sql-format/wrap.d.ts +2 -0
  232. package/dist/core/plan/sql-format/wrap.js +165 -0
  233. package/dist/core/plan/sql-format.d.ts +2 -0
  234. package/dist/core/plan/sql-format.js +1 -0
  235. package/dist/core/plan/ssl-config.d.ts +32 -0
  236. package/dist/core/plan/ssl-config.js +115 -0
  237. package/dist/core/plan/statements.d.ts +2 -1
  238. package/dist/core/plan/statements.js +6 -2
  239. package/dist/core/plan/types.d.ts +6 -0
  240. package/dist/core/postgres-config.d.ts +47 -3
  241. package/dist/core/postgres-config.js +225 -39
  242. package/dist/core/sort/custom-constraints.js +1 -1
  243. package/dist/core/sort/graph-builder.js +10 -0
  244. package/dist/core/sort/logical-sort.js +34 -47
  245. package/dist/core/test-utils/assert-valid-sql.d.ts +10 -0
  246. package/dist/core/test-utils/assert-valid-sql.js +19 -0
  247. package/dist/index.d.ts +9 -0
  248. package/dist/index.js +9 -1
  249. package/package.json +60 -22
  250. package/src/cli/app.ts +52 -0
  251. package/src/cli/bin/cli.ts +15 -0
  252. package/src/cli/commands/apply.ts +101 -0
  253. package/src/cli/commands/catalog-export.ts +78 -0
  254. package/src/cli/commands/declarative-apply.diagnostics.test.ts +77 -0
  255. package/src/cli/commands/declarative-apply.ts +380 -0
  256. package/src/cli/commands/declarative-export.ts +322 -0
  257. package/src/cli/commands/plan.ts +210 -0
  258. package/src/cli/commands/sync.ts +178 -0
  259. package/src/cli/exit-code.test.ts +19 -0
  260. package/src/cli/exit-code.ts +7 -0
  261. package/src/cli/formatters/index.ts +5 -0
  262. package/src/cli/formatters/tree/tree-builder.ts +380 -0
  263. package/src/cli/formatters/tree/tree-renderer.ts +372 -0
  264. package/src/cli/formatters/tree/tree.ts +238 -0
  265. package/src/cli/utils/apply-display.test.ts +348 -0
  266. package/src/cli/utils/apply-display.ts +238 -0
  267. package/src/cli/utils/export-display.test.ts +103 -0
  268. package/src/cli/utils/export-display.ts +275 -0
  269. package/src/cli/utils/integrations.test.ts +251 -0
  270. package/src/cli/utils/integrations.ts +170 -0
  271. package/src/cli/utils/resolve-input.test.ts +38 -0
  272. package/src/cli/utils/resolve-input.ts +17 -0
  273. package/src/cli/utils.ts +231 -0
  274. package/src/core/catalog-export/index.ts +20 -0
  275. package/src/core/catalog.diff.ts +247 -0
  276. package/src/core/catalog.model.test.ts +122 -0
  277. package/src/core/catalog.model.ts +510 -0
  278. package/src/core/catalog.snapshot.test.ts +486 -0
  279. package/src/core/catalog.snapshot.ts +289 -0
  280. package/src/core/change-utils.test.ts +61 -0
  281. package/src/core/change-utils.ts +73 -0
  282. package/src/core/change.types.ts +94 -0
  283. package/src/core/context.ts +26 -0
  284. package/src/core/declarative-apply/discover-sql.test.ts +103 -0
  285. package/src/core/declarative-apply/discover-sql.ts +107 -0
  286. package/src/core/declarative-apply/extract-catalog-providers.ts +220 -0
  287. package/src/core/declarative-apply/index.test.ts +67 -0
  288. package/src/core/declarative-apply/index.ts +205 -0
  289. package/src/core/declarative-apply/round-apply.test.ts +504 -0
  290. package/src/core/declarative-apply/round-apply.ts +562 -0
  291. package/src/core/depend.ts +1895 -0
  292. package/src/core/expand-replace-dependencies.test.ts +70 -0
  293. package/src/core/expand-replace-dependencies.ts +380 -0
  294. package/src/core/export/file-mapper.test.ts +816 -0
  295. package/src/core/export/file-mapper.ts +579 -0
  296. package/src/core/export/grouper.ts +108 -0
  297. package/src/core/export/index.ts +129 -0
  298. package/src/core/export/types.ts +104 -0
  299. package/src/core/fingerprint.ts +204 -0
  300. package/src/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
  301. package/src/core/integrations/filter/dsl.test.ts +450 -0
  302. package/src/core/integrations/filter/dsl.ts +305 -0
  303. package/src/core/integrations/filter/filter.types.ts +3 -0
  304. package/src/core/integrations/filter/flatten.test.ts +282 -0
  305. package/src/core/integrations/filter/flatten.ts +150 -0
  306. package/src/core/integrations/integration-dsl.ts +50 -0
  307. package/src/core/integrations/integration.types.ts +7 -0
  308. package/src/core/integrations/merge.test.ts +128 -0
  309. package/src/core/integrations/merge.ts +72 -0
  310. package/src/core/integrations/serialize/dsl.test.ts +91 -0
  311. package/src/core/integrations/serialize/dsl.ts +80 -0
  312. package/src/core/integrations/serialize/serialize.types.ts +3 -0
  313. package/src/core/integrations/supabase.ts +145 -0
  314. package/src/core/objects/aggregate/aggregate.diff.test.ts +215 -0
  315. package/src/core/objects/aggregate/aggregate.diff.ts +222 -0
  316. package/src/core/objects/aggregate/aggregate.model.ts +317 -0
  317. package/src/core/objects/aggregate/changes/aggregate.alter.test.ts +66 -0
  318. package/src/core/objects/aggregate/changes/aggregate.alter.ts +32 -0
  319. package/src/core/objects/aggregate/changes/aggregate.base.ts +20 -0
  320. package/src/core/objects/aggregate/changes/aggregate.comment.test.ts +89 -0
  321. package/src/core/objects/aggregate/changes/aggregate.comment.ts +62 -0
  322. package/src/core/objects/aggregate/changes/aggregate.create.test.ts +104 -0
  323. package/src/core/objects/aggregate/changes/aggregate.create.ts +329 -0
  324. package/src/core/objects/aggregate/changes/aggregate.drop.test.ts +82 -0
  325. package/src/core/objects/aggregate/changes/aggregate.drop.ts +32 -0
  326. package/src/core/objects/aggregate/changes/aggregate.privilege.test.ts +136 -0
  327. package/src/core/objects/aggregate/changes/aggregate.privilege.ts +146 -0
  328. package/src/core/objects/aggregate/changes/aggregate.types.ts +13 -0
  329. package/src/core/objects/base.change.ts +72 -0
  330. package/src/core/objects/base.default-privileges.ts +204 -0
  331. package/src/core/objects/base.diff.ts +20 -0
  332. package/src/core/objects/base.model.test.ts +43 -0
  333. package/src/core/objects/base.model.ts +85 -0
  334. package/src/core/objects/base.privilege-diff.ts +447 -0
  335. package/src/core/objects/base.privilege.ts +191 -0
  336. package/src/core/objects/collation/changes/collation.alter.test.ts +68 -0
  337. package/src/core/objects/collation/changes/collation.alter.ts +79 -0
  338. package/src/core/objects/collation/changes/collation.base.ts +20 -0
  339. package/src/core/objects/collation/changes/collation.comment.ts +68 -0
  340. package/src/core/objects/collation/changes/collation.create.test.ts +56 -0
  341. package/src/core/objects/collation/changes/collation.create.ts +106 -0
  342. package/src/core/objects/collation/changes/collation.drop.test.ts +31 -0
  343. package/src/core/objects/collation/changes/collation.drop.ts +37 -0
  344. package/src/core/objects/collation/changes/collation.types.ts +11 -0
  345. package/src/core/objects/collation/collation.diff.test.ts +97 -0
  346. package/src/core/objects/collation/collation.diff.ts +127 -0
  347. package/src/core/objects/collation/collation.model.ts +224 -0
  348. package/src/core/objects/diff-context.ts +16 -0
  349. package/src/core/objects/domain/changes/domain.alter.test.ts +335 -0
  350. package/src/core/objects/domain/changes/domain.alter.ts +286 -0
  351. package/src/core/objects/domain/changes/domain.base.ts +20 -0
  352. package/src/core/objects/domain/changes/domain.comment.ts +59 -0
  353. package/src/core/objects/domain/changes/domain.create.test.ts +95 -0
  354. package/src/core/objects/domain/changes/domain.create.ts +140 -0
  355. package/src/core/objects/domain/changes/domain.drop.test.ts +33 -0
  356. package/src/core/objects/domain/changes/domain.drop.ts +34 -0
  357. package/src/core/objects/domain/changes/domain.privilege.ts +171 -0
  358. package/src/core/objects/domain/changes/domain.types.ts +13 -0
  359. package/src/core/objects/domain/domain.diff.test.ts +284 -0
  360. package/src/core/objects/domain/domain.diff.ts +295 -0
  361. package/src/core/objects/domain/domain.model.ts +190 -0
  362. package/src/core/objects/event-trigger/changes/event-trigger.alter.test.ts +57 -0
  363. package/src/core/objects/event-trigger/changes/event-trigger.alter.ts +82 -0
  364. package/src/core/objects/event-trigger/changes/event-trigger.base.ts +20 -0
  365. package/src/core/objects/event-trigger/changes/event-trigger.comment.ts +66 -0
  366. package/src/core/objects/event-trigger/changes/event-trigger.create.test.ts +27 -0
  367. package/src/core/objects/event-trigger/changes/event-trigger.create.ts +72 -0
  368. package/src/core/objects/event-trigger/changes/event-trigger.drop.test.ts +25 -0
  369. package/src/core/objects/event-trigger/changes/event-trigger.drop.ts +34 -0
  370. package/src/core/objects/event-trigger/changes/event-trigger.types.ts +11 -0
  371. package/src/core/objects/event-trigger/event-trigger.diff.test.ts +131 -0
  372. package/src/core/objects/event-trigger/event-trigger.diff.ts +127 -0
  373. package/src/core/objects/event-trigger/event-trigger.model.ts +106 -0
  374. package/src/core/objects/extension/changes/extension.alter.test.ts +63 -0
  375. package/src/core/objects/extension/changes/extension.alter.ts +78 -0
  376. package/src/core/objects/extension/changes/extension.base.ts +20 -0
  377. package/src/core/objects/extension/changes/extension.comment.ts +64 -0
  378. package/src/core/objects/extension/changes/extension.create.test.ts +28 -0
  379. package/src/core/objects/extension/changes/extension.create.ts +63 -0
  380. package/src/core/objects/extension/changes/extension.drop.test.ts +26 -0
  381. package/src/core/objects/extension/changes/extension.drop.ts +34 -0
  382. package/src/core/objects/extension/changes/extension.types.ts +11 -0
  383. package/src/core/objects/extension/extension.diff.test.ts +42 -0
  384. package/src/core/objects/extension/extension.diff.ts +90 -0
  385. package/src/core/objects/extension/extension.model.test.ts +98 -0
  386. package/src/core/objects/extension/extension.model.ts +280 -0
  387. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.test.ts +136 -0
  388. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.ts +101 -0
  389. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.base.ts +20 -0
  390. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.ts +72 -0
  391. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.test.ts +160 -0
  392. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.ts +95 -0
  393. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.test.ts +26 -0
  394. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.ts +36 -0
  395. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.ts +172 -0
  396. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.ts +13 -0
  397. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.test.ts +286 -0
  398. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.ts +271 -0
  399. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.ts +149 -0
  400. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.ts +11 -0
  401. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.test.ts +340 -0
  402. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.ts +341 -0
  403. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.base.ts +20 -0
  404. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.ts +72 -0
  405. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.test.ts +210 -0
  406. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.ts +81 -0
  407. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.test.ts +46 -0
  408. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.ts +37 -0
  409. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.ts +181 -0
  410. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.ts +13 -0
  411. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.test.ts +813 -0
  412. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.ts +343 -0
  413. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.ts +242 -0
  414. package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.test.ts +183 -0
  415. package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.ts +126 -0
  416. package/src/core/objects/foreign-data-wrapper/server/changes/server.base.ts +20 -0
  417. package/src/core/objects/foreign-data-wrapper/server/changes/server.comment.ts +60 -0
  418. package/src/core/objects/foreign-data-wrapper/server/changes/server.create.test.ts +144 -0
  419. package/src/core/objects/foreign-data-wrapper/server/changes/server.create.ts +81 -0
  420. package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.test.ts +27 -0
  421. package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.ts +34 -0
  422. package/src/core/objects/foreign-data-wrapper/server/changes/server.privilege.ts +164 -0
  423. package/src/core/objects/foreign-data-wrapper/server/changes/server.types.ts +13 -0
  424. package/src/core/objects/foreign-data-wrapper/server/server.diff.test.ts +262 -0
  425. package/src/core/objects/foreign-data-wrapper/server/server.diff.ts +247 -0
  426. package/src/core/objects/foreign-data-wrapper/server/server.model.ts +133 -0
  427. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.test.ts +91 -0
  428. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.ts +69 -0
  429. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.base.ts +20 -0
  430. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.test.ts +96 -0
  431. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.ts +66 -0
  432. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.test.ts +60 -0
  433. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.ts +40 -0
  434. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.ts +9 -0
  435. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.test.ts +77 -0
  436. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.ts +107 -0
  437. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.ts +96 -0
  438. package/src/core/objects/index/changes/index.alter.test.ts +209 -0
  439. package/src/core/objects/index/changes/index.alter.ts +144 -0
  440. package/src/core/objects/index/changes/index.base.ts +20 -0
  441. package/src/core/objects/index/changes/index.comment.ts +63 -0
  442. package/src/core/objects/index/changes/index.create.test.ts +69 -0
  443. package/src/core/objects/index/changes/index.create.ts +68 -0
  444. package/src/core/objects/index/changes/index.drop.test.ts +47 -0
  445. package/src/core/objects/index/changes/index.drop.ts +34 -0
  446. package/src/core/objects/index/changes/index.types.ts +7 -0
  447. package/src/core/objects/index/changes/utils.ts +16 -0
  448. package/src/core/objects/index/index.diff.test.ts +153 -0
  449. package/src/core/objects/index/index.diff.ts +243 -0
  450. package/src/core/objects/index/index.model.ts +370 -0
  451. package/src/core/objects/language/changes/language.alter.test.ts +36 -0
  452. package/src/core/objects/language/changes/language.alter.ts +53 -0
  453. package/src/core/objects/language/changes/language.base.ts +20 -0
  454. package/src/core/objects/language/changes/language.comment.ts +58 -0
  455. package/src/core/objects/language/changes/language.create.test.ts +30 -0
  456. package/src/core/objects/language/changes/language.create.ts +104 -0
  457. package/src/core/objects/language/changes/language.drop.test.ts +28 -0
  458. package/src/core/objects/language/changes/language.drop.ts +39 -0
  459. package/src/core/objects/language/changes/language.privilege.ts +172 -0
  460. package/src/core/objects/language/changes/language.types.ts +13 -0
  461. package/src/core/objects/language/language.diff.test.ts +135 -0
  462. package/src/core/objects/language/language.diff.ts +144 -0
  463. package/src/core/objects/language/language.model.ts +150 -0
  464. package/src/core/objects/materialized-view/changes/materialized-view.alter.test.ts +130 -0
  465. package/src/core/objects/materialized-view/changes/materialized-view.alter.ts +113 -0
  466. package/src/core/objects/materialized-view/changes/materialized-view.base.ts +20 -0
  467. package/src/core/objects/materialized-view/changes/materialized-view.comment.ts +176 -0
  468. package/src/core/objects/materialized-view/changes/materialized-view.create.test.ts +69 -0
  469. package/src/core/objects/materialized-view/changes/materialized-view.create.ts +93 -0
  470. package/src/core/objects/materialized-view/changes/materialized-view.drop.test.ts +37 -0
  471. package/src/core/objects/materialized-view/changes/materialized-view.drop.ts +60 -0
  472. package/src/core/objects/materialized-view/changes/materialized-view.privilege.ts +212 -0
  473. package/src/core/objects/materialized-view/changes/materialized-view.types.ts +13 -0
  474. package/src/core/objects/materialized-view/materialized-view.diff.test.ts +264 -0
  475. package/src/core/objects/materialized-view/materialized-view.diff.ts +301 -0
  476. package/src/core/objects/materialized-view/materialized-view.model.ts +258 -0
  477. package/src/core/objects/procedure/changes/procedure.alter.test.ts +1077 -0
  478. package/src/core/objects/procedure/changes/procedure.alter.ts +290 -0
  479. package/src/core/objects/procedure/changes/procedure.base.ts +20 -0
  480. package/src/core/objects/procedure/changes/procedure.comment.ts +70 -0
  481. package/src/core/objects/procedure/changes/procedure.create.test.ts +51 -0
  482. package/src/core/objects/procedure/changes/procedure.create.ts +92 -0
  483. package/src/core/objects/procedure/changes/procedure.drop.test.ts +90 -0
  484. package/src/core/objects/procedure/changes/procedure.drop.ts +49 -0
  485. package/src/core/objects/procedure/changes/procedure.privilege.ts +188 -0
  486. package/src/core/objects/procedure/changes/procedure.types.ts +13 -0
  487. package/src/core/objects/procedure/procedure.diff.test.ts +161 -0
  488. package/src/core/objects/procedure/procedure.diff.ts +341 -0
  489. package/src/core/objects/procedure/procedure.model.ts +264 -0
  490. package/src/core/objects/procedure/utils.ts +58 -0
  491. package/src/core/objects/publication/changes/publication.alter.test.ts +217 -0
  492. package/src/core/objects/publication/changes/publication.alter.ts +225 -0
  493. package/src/core/objects/publication/changes/publication.base.ts +20 -0
  494. package/src/core/objects/publication/changes/publication.comment.test.ts +73 -0
  495. package/src/core/objects/publication/changes/publication.comment.ts +64 -0
  496. package/src/core/objects/publication/changes/publication.create.test.ts +90 -0
  497. package/src/core/objects/publication/changes/publication.create.ts +82 -0
  498. package/src/core/objects/publication/changes/publication.drop.test.ts +48 -0
  499. package/src/core/objects/publication/changes/publication.drop.ts +29 -0
  500. package/src/core/objects/publication/changes/publication.types.ts +25 -0
  501. package/src/core/objects/publication/publication.diff.test.ts +297 -0
  502. package/src/core/objects/publication/publication.diff.ts +247 -0
  503. package/src/core/objects/publication/publication.model.ts +206 -0
  504. package/src/core/objects/publication/utils.ts +55 -0
  505. package/src/core/objects/rls-policy/changes/rls-policy.alter.test.ts +267 -0
  506. package/src/core/objects/rls-policy/changes/rls-policy.alter.ts +128 -0
  507. package/src/core/objects/rls-policy/changes/rls-policy.base.ts +20 -0
  508. package/src/core/objects/rls-policy/changes/rls-policy.comment.ts +69 -0
  509. package/src/core/objects/rls-policy/changes/rls-policy.create.test.ts +81 -0
  510. package/src/core/objects/rls-policy/changes/rls-policy.create.ts +100 -0
  511. package/src/core/objects/rls-policy/changes/rls-policy.drop.test.ts +31 -0
  512. package/src/core/objects/rls-policy/changes/rls-policy.drop.ts +39 -0
  513. package/src/core/objects/rls-policy/changes/rls-policy.types.ts +11 -0
  514. package/src/core/objects/rls-policy/rls-policy.diff.test.ts +79 -0
  515. package/src/core/objects/rls-policy/rls-policy.diff.ts +121 -0
  516. package/src/core/objects/rls-policy/rls-policy.model.ts +140 -0
  517. package/src/core/objects/role/changes/role.alter.test.ts +362 -0
  518. package/src/core/objects/role/changes/role.alter.ts +110 -0
  519. package/src/core/objects/role/changes/role.base.ts +24 -0
  520. package/src/core/objects/role/changes/role.comment.ts +55 -0
  521. package/src/core/objects/role/changes/role.create.test.ts +56 -0
  522. package/src/core/objects/role/changes/role.create.ts +102 -0
  523. package/src/core/objects/role/changes/role.drop.test.ts +32 -0
  524. package/src/core/objects/role/changes/role.drop.ts +34 -0
  525. package/src/core/objects/role/changes/role.privilege.ts +376 -0
  526. package/src/core/objects/role/changes/role.types.ts +13 -0
  527. package/src/core/objects/role/role.diff.test.ts +279 -0
  528. package/src/core/objects/role/role.diff.ts +499 -0
  529. package/src/core/objects/role/role.model.ts +452 -0
  530. package/src/core/objects/rule/changes/rule.alter.test.ts +82 -0
  531. package/src/core/objects/rule/changes/rule.alter.ts +72 -0
  532. package/src/core/objects/rule/changes/rule.base.ts +20 -0
  533. package/src/core/objects/rule/changes/rule.comment.test.ts +58 -0
  534. package/src/core/objects/rule/changes/rule.comment.ts +62 -0
  535. package/src/core/objects/rule/changes/rule.create.test.ts +63 -0
  536. package/src/core/objects/rule/changes/rule.create.ts +42 -0
  537. package/src/core/objects/rule/changes/rule.drop.test.ts +40 -0
  538. package/src/core/objects/rule/changes/rule.drop.ts +29 -0
  539. package/src/core/objects/rule/changes/rule.types.ts +13 -0
  540. package/src/core/objects/rule/rule.diff.test.ts +132 -0
  541. package/src/core/objects/rule/rule.diff.ts +79 -0
  542. package/src/core/objects/rule/rule.model.ts +173 -0
  543. package/src/core/objects/schema/changes/schema.alter.test.ts +31 -0
  544. package/src/core/objects/schema/changes/schema.alter.ts +45 -0
  545. package/src/core/objects/schema/changes/schema.base.ts +20 -0
  546. package/src/core/objects/schema/changes/schema.comment.ts +56 -0
  547. package/src/core/objects/schema/changes/schema.create.test.ts +25 -0
  548. package/src/core/objects/schema/changes/schema.create.ts +47 -0
  549. package/src/core/objects/schema/changes/schema.drop.test.ts +23 -0
  550. package/src/core/objects/schema/changes/schema.drop.ts +34 -0
  551. package/src/core/objects/schema/changes/schema.privilege.ts +175 -0
  552. package/src/core/objects/schema/changes/schema.types.ts +13 -0
  553. package/src/core/objects/schema/schema.diff.test.ts +42 -0
  554. package/src/core/objects/schema/schema.diff.ts +146 -0
  555. package/src/core/objects/schema/schema.model.ts +107 -0
  556. package/src/core/objects/sequence/changes/sequence.alter.test.ts +157 -0
  557. package/src/core/objects/sequence/changes/sequence.alter.ts +115 -0
  558. package/src/core/objects/sequence/changes/sequence.base.ts +20 -0
  559. package/src/core/objects/sequence/changes/sequence.comment.ts +60 -0
  560. package/src/core/objects/sequence/changes/sequence.create.test.ts +89 -0
  561. package/src/core/objects/sequence/changes/sequence.create.ts +111 -0
  562. package/src/core/objects/sequence/changes/sequence.drop.test.ts +35 -0
  563. package/src/core/objects/sequence/changes/sequence.drop.ts +37 -0
  564. package/src/core/objects/sequence/changes/sequence.privilege.ts +179 -0
  565. package/src/core/objects/sequence/changes/sequence.types.ts +13 -0
  566. package/src/core/objects/sequence/sequence.diff.test.ts +255 -0
  567. package/src/core/objects/sequence/sequence.diff.ts +294 -0
  568. package/src/core/objects/sequence/sequence.model.ts +185 -0
  569. package/src/core/objects/subscription/changes/subscription.alter.test.ts +134 -0
  570. package/src/core/objects/subscription/changes/subscription.alter.ts +110 -0
  571. package/src/core/objects/subscription/changes/subscription.base.ts +20 -0
  572. package/src/core/objects/subscription/changes/subscription.comment.test.ts +70 -0
  573. package/src/core/objects/subscription/changes/subscription.comment.ts +64 -0
  574. package/src/core/objects/subscription/changes/subscription.create.test.ts +80 -0
  575. package/src/core/objects/subscription/changes/subscription.create.ts +69 -0
  576. package/src/core/objects/subscription/changes/subscription.drop.test.ts +48 -0
  577. package/src/core/objects/subscription/changes/subscription.drop.ts +20 -0
  578. package/src/core/objects/subscription/changes/subscription.types.ts +23 -0
  579. package/src/core/objects/subscription/subscription.diff.test.ts +237 -0
  580. package/src/core/objects/subscription/subscription.diff.ts +242 -0
  581. package/src/core/objects/subscription/subscription.model.ts +190 -0
  582. package/src/core/objects/subscription/utils.ts +156 -0
  583. package/src/core/objects/table/changes/table.alter.test.ts +846 -0
  584. package/src/core/objects/table/changes/table.alter.ts +806 -0
  585. package/src/core/objects/table/changes/table.base.ts +20 -0
  586. package/src/core/objects/table/changes/table.comment.ts +266 -0
  587. package/src/core/objects/table/changes/table.create.test.ts +188 -0
  588. package/src/core/objects/table/changes/table.create.ts +192 -0
  589. package/src/core/objects/table/changes/table.drop.test.ts +36 -0
  590. package/src/core/objects/table/changes/table.drop.ts +45 -0
  591. package/src/core/objects/table/changes/table.privilege.ts +200 -0
  592. package/src/core/objects/table/changes/table.types.ts +13 -0
  593. package/src/core/objects/table/table.diff.test.ts +868 -0
  594. package/src/core/objects/table/table.diff.ts +817 -0
  595. package/src/core/objects/table/table.model.ts +460 -0
  596. package/src/core/objects/trigger/changes/trigger.alter.test.ts +50 -0
  597. package/src/core/objects/trigger/changes/trigger.alter.ts +76 -0
  598. package/src/core/objects/trigger/changes/trigger.base.ts +20 -0
  599. package/src/core/objects/trigger/changes/trigger.comment.ts +64 -0
  600. package/src/core/objects/trigger/changes/trigger.create.test.ts +47 -0
  601. package/src/core/objects/trigger/changes/trigger.create.ts +88 -0
  602. package/src/core/objects/trigger/changes/trigger.drop.test.ts +47 -0
  603. package/src/core/objects/trigger/changes/trigger.drop.ts +39 -0
  604. package/src/core/objects/trigger/changes/trigger.types.ts +11 -0
  605. package/src/core/objects/trigger/trigger.diff.test.ts +84 -0
  606. package/src/core/objects/trigger/trigger.diff.ts +116 -0
  607. package/src/core/objects/trigger/trigger.model.ts +264 -0
  608. package/src/core/objects/type/composite-type/changes/composite-type.alter.test.ts +208 -0
  609. package/src/core/objects/type/composite-type/changes/composite-type.alter.ts +174 -0
  610. package/src/core/objects/type/composite-type/changes/composite-type.base.ts +20 -0
  611. package/src/core/objects/type/composite-type/changes/composite-type.comment.ts +145 -0
  612. package/src/core/objects/type/composite-type/changes/composite-type.create.test.ts +106 -0
  613. package/src/core/objects/type/composite-type/changes/composite-type.create.ts +95 -0
  614. package/src/core/objects/type/composite-type/changes/composite-type.drop.test.ts +36 -0
  615. package/src/core/objects/type/composite-type/changes/composite-type.drop.ts +37 -0
  616. package/src/core/objects/type/composite-type/changes/composite-type.privilege.ts +175 -0
  617. package/src/core/objects/type/composite-type/changes/composite-type.types.ts +13 -0
  618. package/src/core/objects/type/composite-type/composite-type.diff.test.ts +269 -0
  619. package/src/core/objects/type/composite-type/composite-type.diff.ts +310 -0
  620. package/src/core/objects/type/composite-type/composite-type.model.ts +253 -0
  621. package/src/core/objects/type/enum/changes/enum.alter.test.ts +113 -0
  622. package/src/core/objects/type/enum/changes/enum.alter.ts +91 -0
  623. package/src/core/objects/type/enum/changes/enum.base.ts +20 -0
  624. package/src/core/objects/type/enum/changes/enum.comment.ts +64 -0
  625. package/src/core/objects/type/enum/changes/enum.create.test.ts +31 -0
  626. package/src/core/objects/type/enum/changes/enum.create.ts +56 -0
  627. package/src/core/objects/type/enum/changes/enum.drop.test.ts +28 -0
  628. package/src/core/objects/type/enum/changes/enum.drop.ts +34 -0
  629. package/src/core/objects/type/enum/changes/enum.privilege.ts +175 -0
  630. package/src/core/objects/type/enum/changes/enum.types.ts +13 -0
  631. package/src/core/objects/type/enum/enum.diff.test.ts +372 -0
  632. package/src/core/objects/type/enum/enum.diff.ts +308 -0
  633. package/src/core/objects/type/enum/enum.model.ts +194 -0
  634. package/src/core/objects/type/range/changes/range.alter.test.ts +29 -0
  635. package/src/core/objects/type/range/changes/range.alter.ts +51 -0
  636. package/src/core/objects/type/range/changes/range.base.ts +20 -0
  637. package/src/core/objects/type/range/changes/range.comment.ts +64 -0
  638. package/src/core/objects/type/range/changes/range.create.test.ts +54 -0
  639. package/src/core/objects/type/range/changes/range.create.ts +155 -0
  640. package/src/core/objects/type/range/changes/range.drop.test.ts +28 -0
  641. package/src/core/objects/type/range/changes/range.drop.ts +34 -0
  642. package/src/core/objects/type/range/changes/range.privilege.ts +175 -0
  643. package/src/core/objects/type/range/changes/range.types.ts +13 -0
  644. package/src/core/objects/type/range/range.diff.test.ts +147 -0
  645. package/src/core/objects/type/range/range.diff.ts +197 -0
  646. package/src/core/objects/type/range/range.model.ts +187 -0
  647. package/src/core/objects/type/type.types.ts +6 -0
  648. package/src/core/objects/utils.ts +171 -0
  649. package/src/core/objects/view/changes/view.alter.test.ts +115 -0
  650. package/src/core/objects/view/changes/view.alter.ts +112 -0
  651. package/src/core/objects/view/changes/view.base.ts +20 -0
  652. package/src/core/objects/view/changes/view.comment.ts +59 -0
  653. package/src/core/objects/view/changes/view.create.test.ts +70 -0
  654. package/src/core/objects/view/changes/view.create.ts +73 -0
  655. package/src/core/objects/view/changes/view.drop.test.ts +37 -0
  656. package/src/core/objects/view/changes/view.drop.ts +40 -0
  657. package/src/core/objects/view/changes/view.privilege.ts +200 -0
  658. package/src/core/objects/view/changes/view.types.ts +13 -0
  659. package/src/core/objects/view/view.diff.test.ts +269 -0
  660. package/src/core/objects/view/view.diff.ts +230 -0
  661. package/src/core/objects/view/view.model.ts +262 -0
  662. package/src/core/plan/apply.ts +172 -0
  663. package/src/core/plan/create.ts +384 -0
  664. package/src/core/plan/hierarchy.ts +574 -0
  665. package/src/core/plan/index.ts +29 -0
  666. package/src/core/plan/io.ts +20 -0
  667. package/src/core/plan/risk.ts +48 -0
  668. package/src/core/plan/serialize.test.ts +317 -0
  669. package/src/core/plan/serialize.ts +209 -0
  670. package/src/core/plan/sql-format/constants.ts +13 -0
  671. package/src/core/plan/sql-format/fixtures.ts +2803 -0
  672. package/src/core/plan/sql-format/format-comment-literals.test.ts +96 -0
  673. package/src/core/plan/sql-format/format-functions.test.ts +127 -0
  674. package/src/core/plan/sql-format/format-lowercase-coverage.test.ts +119 -0
  675. package/src/core/plan/sql-format/format-off.test.ts +806 -0
  676. package/src/core/plan/sql-format/format-pretty-lower-leading.test.ts +1061 -0
  677. package/src/core/plan/sql-format/format-pretty-narrow.test.ts +1279 -0
  678. package/src/core/plan/sql-format/format-pretty-preserve.test.ts +1057 -0
  679. package/src/core/plan/sql-format/format-pretty-upper.test.ts +1048 -0
  680. package/src/core/plan/sql-format/format-stress.test.ts +616 -0
  681. package/src/core/plan/sql-format/format-utils.test.ts +91 -0
  682. package/src/core/plan/sql-format/format-utils.ts +391 -0
  683. package/src/core/plan/sql-format/formatters.ts +921 -0
  684. package/src/core/plan/sql-format/index.ts +149 -0
  685. package/src/core/plan/sql-format/keyword-case.test.ts +118 -0
  686. package/src/core/plan/sql-format/keyword-case.ts +1120 -0
  687. package/src/core/plan/sql-format/protect.test.ts +127 -0
  688. package/src/core/plan/sql-format/protect.ts +337 -0
  689. package/src/core/plan/sql-format/sql-scanner.test.ts +240 -0
  690. package/src/core/plan/sql-format/sql-scanner.ts +252 -0
  691. package/src/core/plan/sql-format/tokenizer.test.ts +68 -0
  692. package/src/core/plan/sql-format/tokenizer.ts +152 -0
  693. package/src/core/plan/sql-format/types.ts +31 -0
  694. package/src/core/plan/sql-format/wrap.test.ts +119 -0
  695. package/src/core/plan/sql-format/wrap.ts +196 -0
  696. package/src/core/plan/sql-format.ts +2 -0
  697. package/src/core/plan/ssl-config.ts +172 -0
  698. package/src/core/plan/statements.ts +22 -0
  699. package/src/core/plan/types.ts +171 -0
  700. package/src/core/postgres-config.ts +293 -0
  701. package/src/core/sort/custom-constraints.ts +161 -0
  702. package/src/core/sort/debug-visualization.ts +239 -0
  703. package/src/core/sort/dependency-filter.ts +224 -0
  704. package/src/core/sort/graph-builder.ts +235 -0
  705. package/src/core/sort/graph-utils.ts +51 -0
  706. package/src/core/sort/logical-sort.test.ts +371 -0
  707. package/src/core/sort/logical-sort.ts +573 -0
  708. package/src/core/sort/sort-changes.ts +234 -0
  709. package/src/core/sort/topological-sort.test.ts +275 -0
  710. package/src/core/sort/topological-sort.ts +184 -0
  711. package/src/core/sort/types.ts +112 -0
  712. package/src/core/sort/utils.ts +69 -0
  713. package/src/core/test-utils/assert-valid-sql.ts +20 -0
  714. package/src/index.ts +41 -0
  715. package/src/typedoc.ts +248 -0
  716. package/dist/core/integrations/filter/extractors.d.ts +0 -12
  717. package/dist/core/integrations/filter/extractors.js +0 -136
@@ -0,0 +1,240 @@
1
+ /**
2
+ * Declarative export command - export a declarative SQL schema from a database diff.
3
+ */
4
+ import { mkdir, rm, writeFile } from "node:fs/promises";
5
+ import path from "node:path";
6
+ import { buildCommand } from "@stricli/core";
7
+ import chalk from "chalk";
8
+ import { deserializeCatalog } from "../../core/catalog.snapshot.js";
9
+ import { exportDeclarativeSchema } from "../../core/export/index.js";
10
+ import { compileSerializeDSL, } from "../../core/integrations/serialize/dsl.js";
11
+ import { createPlan } from "../../core/plan/index.js";
12
+ import { assertSafePath, buildFileTree, computeFileDiff, formatExportSummary, } from "../utils/export-display.js";
13
+ import { resolveIntegrationOptions } from "../utils/integrations.js";
14
+ import { isPostgresUrl, loadCatalogFromFile } from "../utils/resolve-input.js";
15
+ function parseJsonFlag(label, value) {
16
+ try {
17
+ return JSON.parse(value);
18
+ }
19
+ catch (error) {
20
+ throw new Error(`Invalid ${label} JSON: ${error instanceof Error ? error.message : String(error)}`);
21
+ }
22
+ }
23
+ export const declarativeExportCommand = buildCommand({
24
+ parameters: {
25
+ flags: {
26
+ source: {
27
+ kind: "parsed",
28
+ brief: "Source (current state): postgres URL or catalog snapshot file path. Omit to export all objects from target.",
29
+ parse: String,
30
+ optional: true,
31
+ },
32
+ target: {
33
+ kind: "parsed",
34
+ brief: "Target (desired state): postgres URL or catalog snapshot file path",
35
+ parse: String,
36
+ },
37
+ output: {
38
+ kind: "parsed",
39
+ brief: "Output directory path for declarative schema files",
40
+ parse: String,
41
+ },
42
+ integration: {
43
+ kind: "parsed",
44
+ brief: "Integration name (e.g., 'supabase') or path to integration JSON file",
45
+ parse: String,
46
+ optional: true,
47
+ },
48
+ filter: {
49
+ kind: "parsed",
50
+ brief: 'Filter DSL as inline JSON (e.g., \'{"schema":"public"}\')',
51
+ parse: (v) => parseJsonFlag("filter", v),
52
+ optional: true,
53
+ },
54
+ serialize: {
55
+ kind: "parsed",
56
+ brief: 'Serialize DSL as inline JSON array (e.g., \'[{"when":{"type":"schema"},"options":{"skipAuthorization":true}}]\')',
57
+ parse: (v) => parseJsonFlag("serialize", v),
58
+ optional: true,
59
+ },
60
+ "grouping-mode": {
61
+ kind: "enum",
62
+ brief: "How grouped entities are organized on disk",
63
+ values: ["single-file", "subdirectory"],
64
+ optional: true,
65
+ },
66
+ "group-patterns": {
67
+ kind: "parsed",
68
+ brief: 'JSON array of {pattern, name} objects (e.g., \'[{"pattern":"^auth","name":"auth"}]\')',
69
+ parse: (v) => {
70
+ const parsed = parseJsonFlag("group-patterns", v);
71
+ if (!Array.isArray(parsed)) {
72
+ throw new Error("group-patterns must be a JSON array");
73
+ }
74
+ return parsed;
75
+ },
76
+ optional: true,
77
+ },
78
+ "flat-schemas": {
79
+ kind: "parsed",
80
+ brief: "Comma-separated list of schemas to flatten (e.g., partman,pgboss,audit)",
81
+ parse: String,
82
+ optional: true,
83
+ },
84
+ "format-options": {
85
+ kind: "parsed",
86
+ brief: 'SQL format options as inline JSON (e.g., \'{"keywordCase":"lower","maxWidth":180}\')',
87
+ parse: (v) => parseJsonFlag("format-options", v),
88
+ optional: true,
89
+ },
90
+ force: {
91
+ kind: "boolean",
92
+ brief: "Remove entire output directory before writing",
93
+ optional: true,
94
+ },
95
+ "dry-run": {
96
+ kind: "boolean",
97
+ brief: "Show tree and summary without writing files",
98
+ optional: true,
99
+ },
100
+ "diff-focus": {
101
+ kind: "boolean",
102
+ brief: "Show only files that changed (created/updated/deleted) in the tree",
103
+ optional: true,
104
+ },
105
+ verbose: {
106
+ kind: "boolean",
107
+ brief: "Show detailed output",
108
+ optional: true,
109
+ },
110
+ },
111
+ aliases: {
112
+ s: "source",
113
+ t: "target",
114
+ o: "output",
115
+ },
116
+ },
117
+ docs: {
118
+ brief: "Export a declarative schema from a database diff",
119
+ fullDescription: `
120
+ Export a declarative SQL schema by comparing two databases (source → target).
121
+ Writes .sql files to the output directory, grouped by object type and optional
122
+ grouping rules.
123
+
124
+ When --source is omitted, all objects from the target database are exported
125
+ (equivalent to diffing from an empty database).
126
+
127
+ Flags:
128
+ source - Source database connection URL (optional; omit for full export)
129
+ target - Target database connection URL (desired state)
130
+ output - Directory path for generated .sql files
131
+ integration - Integration name or path (e.g., supabase) for filter/serialize
132
+ filter - Filter DSL as JSON to include/exclude changes
133
+ serialize - Serialize DSL as JSON array for custom SQL generation
134
+ grouping-mode - single-file or subdirectory for grouped entities
135
+ group-patterns - JSON array of {pattern, name} for name-based grouping
136
+ flat-schemas - Comma-separated schemas to merge into one file per category
137
+ format-options - SQL format options as JSON
138
+ force - Remove output directory before writing (full replace)
139
+ dry-run - Show tree and summary only, do not write files
140
+ diff-focus - Show only changed files (created/updated/deleted) in the tree
141
+ verbose - Show detailed output
142
+
143
+ After export, a tip is printed with the command to apply the schema to an empty database.
144
+ `.trim(),
145
+ },
146
+ async func(flags) {
147
+ const { filter, serialize, emptyCatalog: integrationEmptyCatalog, } = await resolveIntegrationOptions({
148
+ filter: flags.filter,
149
+ serialize: flags.serialize,
150
+ integration: flags.integration,
151
+ });
152
+ const resolvedSource = flags.source
153
+ ? isPostgresUrl(flags.source)
154
+ ? flags.source
155
+ : await loadCatalogFromFile(flags.source)
156
+ : integrationEmptyCatalog
157
+ ? deserializeCatalog(integrationEmptyCatalog)
158
+ : null;
159
+ const resolvedTarget = isPostgresUrl(flags.target)
160
+ ? flags.target
161
+ : await loadCatalogFromFile(flags.target);
162
+ // Pass raw DSL to createPlan (not pre-compiled functions).
163
+ // createPlan compiles them internally and uses the DSL type to correctly
164
+ // determine cascade behavior: DSL filters disable cascading by default
165
+ // (unless cascade:true is set), preventing unintended exclusion of
166
+ // changes that depend on filtered objects (e.g. RLS policies that
167
+ // reference auth.uid() when the auth schema is filtered out).
168
+ const planResult = await createPlan(resolvedSource, resolvedTarget, {
169
+ filter,
170
+ serialize,
171
+ skipDefaultPrivilegeSubtraction: true,
172
+ });
173
+ if (!planResult) {
174
+ this.process.stdout.write("No changes detected.\n");
175
+ return;
176
+ }
177
+ const hasGrouping = flags["grouping-mode"] !== undefined ||
178
+ (flags["group-patterns"] !== undefined &&
179
+ flags["group-patterns"].length > 0) ||
180
+ (flags["flat-schemas"] !== undefined && flags["flat-schemas"].length > 0);
181
+ let grouping;
182
+ if (hasGrouping) {
183
+ grouping = {
184
+ mode: flags["grouping-mode"] ?? "single-file",
185
+ groupPatterns: flags["group-patterns"],
186
+ autoGroupPartitions: true,
187
+ flatSchemas: flags["flat-schemas"] !== undefined
188
+ ? flags["flat-schemas"]
189
+ .split(",")
190
+ .map((s) => s.trim())
191
+ .filter(Boolean)
192
+ : undefined,
193
+ };
194
+ }
195
+ const serializeFn = serialize !== undefined ? compileSerializeDSL(serialize) : undefined;
196
+ const output = exportDeclarativeSchema(planResult, {
197
+ integration: serializeFn !== undefined ? { serialize: serializeFn } : undefined,
198
+ formatOptions: flags["format-options"] ?? undefined,
199
+ grouping,
200
+ onWarning: (msg) => {
201
+ this.process.stderr.write(chalk.yellow(`Warning: ${msg}\n`));
202
+ },
203
+ });
204
+ const outputDir = path.resolve(flags.output);
205
+ const applyTip = (dir) => `\nTip: To apply this schema to an empty database, run:\n pgdelta declarative apply --path ${dir} --target <database_url>\n`;
206
+ const diff = await computeFileDiff(outputDir, output.files);
207
+ this.process.stdout.write("\n");
208
+ this.process.stdout.write(`${buildFileTree(output.files.map((f) => f.path), path.basename(outputDir) || outputDir, { diff, diffFocus: !!flags["diff-focus"] })}\n`);
209
+ this.process.stdout.write("\n");
210
+ this.process.stdout.write(`${chalk.green("+")} created ${chalk.yellow("~")} updated ${chalk.red("-")} deleted\n`);
211
+ this.process.stdout.write("\n");
212
+ const summary = formatExportSummary(diff, !!flags["dry-run"]);
213
+ if (summary) {
214
+ this.process.stdout.write(`${summary}\n`);
215
+ }
216
+ const totalChanges = planResult.sortedChanges.length;
217
+ const totalStatements = output.files.reduce((s, f) => s + f.statements, 0);
218
+ this.process.stdout.write(`Changes: ${totalChanges} | Files: ${output.files.length} | Statements: ${totalStatements}\n`);
219
+ if (flags["dry-run"]) {
220
+ this.process.stdout.write(chalk.dim("\n(dry-run: no files written)\n"));
221
+ this.process.stdout.write(chalk.cyan(applyTip(outputDir)));
222
+ return;
223
+ }
224
+ if (flags.force) {
225
+ await rm(outputDir, { recursive: true, force: true });
226
+ await mkdir(outputDir, { recursive: true });
227
+ }
228
+ else if (diff.deleted.length > 0) {
229
+ this.process.stderr.write(chalk.yellow(`Warning: ${diff.deleted.length} existing file(s) will no longer be present. Use --force to replace the output directory.\n`));
230
+ }
231
+ for (const file of output.files) {
232
+ assertSafePath(file.path, outputDir);
233
+ const filePath = path.join(outputDir, file.path);
234
+ await mkdir(path.dirname(filePath), { recursive: true });
235
+ await writeFile(filePath, file.sql);
236
+ }
237
+ this.process.stdout.write(chalk.green(`Wrote ${output.files.length} file(s) to ${outputDir}\n`));
238
+ this.process.stdout.write(chalk.cyan(applyTip(outputDir)));
239
+ },
240
+ });
@@ -3,20 +3,24 @@
3
3
  */
4
4
  import { writeFile } from "node:fs/promises";
5
5
  import { buildCommand } from "@stricli/core";
6
+ import { deserializeCatalog } from "../../core/catalog.snapshot.js";
6
7
  import { createPlan } from "../../core/plan/index.js";
7
- import { loadIntegrationDSL } from "../utils/integrations.js";
8
+ import { setCommandExitCode } from "../exit-code.js";
9
+ import { resolveIntegrationOptions } from "../utils/integrations.js";
10
+ import { isPostgresUrl, loadCatalogFromFile } from "../utils/resolve-input.js";
8
11
  import { formatPlanForDisplay } from "../utils.js";
9
12
  export const planCommand = buildCommand({
10
13
  parameters: {
11
14
  flags: {
12
15
  source: {
13
16
  kind: "parsed",
14
- brief: "Source database connection URL (current state)",
17
+ brief: "Source (current state): postgres URL or catalog snapshot file path. Omit for empty baseline.",
15
18
  parse: String,
19
+ optional: true,
16
20
  },
17
21
  target: {
18
22
  kind: "parsed",
19
- brief: "Target database connection URL (desired state)",
23
+ brief: "Target (desired state): postgres URL or catalog snapshot file path",
20
24
  parse: String,
21
25
  },
22
26
  format: {
@@ -69,6 +73,24 @@ export const planCommand = buildCommand({
69
73
  parse: String,
70
74
  optional: true,
71
75
  },
76
+ "sql-format": {
77
+ kind: "boolean",
78
+ brief: "Format SQL output (opt-in for --format sql or .sql output).",
79
+ optional: true,
80
+ },
81
+ "sql-format-options": {
82
+ kind: "parsed",
83
+ brief: 'SQL format options as inline JSON (e.g., \'{"keywordCase":"upper","maxWidth":100}\').',
84
+ parse: (value) => {
85
+ try {
86
+ return JSON.parse(value);
87
+ }
88
+ catch (error) {
89
+ throw new Error(`Invalid SQL format JSON: ${error instanceof Error ? error.message : String(error)}`);
90
+ }
91
+ },
92
+ optional: true,
93
+ },
72
94
  },
73
95
  aliases: {
74
96
  s: "source",
@@ -85,19 +107,25 @@ json/sql outputs are available for artifacts or piping.
85
107
  `.trim(),
86
108
  },
87
109
  async func(flags) {
88
- // Load integration if provided and extract filter/serialize DSL
89
- let filterOption = flags.filter;
90
- let serializeOption = flags.serialize;
91
- if (flags.integration) {
92
- const integrationDSL = await loadIntegrationDSL(flags.integration);
93
- // Use integration DSL if explicit flags not provided
94
- filterOption = filterOption ?? integrationDSL.filter;
95
- serializeOption = serializeOption ?? integrationDSL.serialize;
96
- }
97
- const planResult = await createPlan(flags.source, flags.target, {
110
+ const { filter, serialize, emptyCatalog: integrationEmptyCatalog, } = await resolveIntegrationOptions({
111
+ filter: flags.filter,
112
+ serialize: flags.serialize,
113
+ integration: flags.integration,
114
+ });
115
+ const resolvedSource = flags.source
116
+ ? isPostgresUrl(flags.source)
117
+ ? flags.source
118
+ : await loadCatalogFromFile(flags.source)
119
+ : integrationEmptyCatalog
120
+ ? deserializeCatalog(integrationEmptyCatalog)
121
+ : null;
122
+ const resolvedTarget = isPostgresUrl(flags.target)
123
+ ? flags.target
124
+ : await loadCatalogFromFile(flags.target);
125
+ const planResult = await createPlan(resolvedSource, resolvedTarget, {
98
126
  role: flags.role,
99
- filter: filterOption,
100
- serialize: serializeOption,
127
+ filter,
128
+ serialize,
101
129
  });
102
130
  if (!planResult) {
103
131
  this.process.stdout.write("No changes detected.\n");
@@ -120,6 +148,9 @@ json/sql outputs are available for artifacts or piping.
120
148
  const { content, label } = formatPlanForDisplay(planResult, effectiveFormat, {
121
149
  disableColors: !!outputPath,
122
150
  showUnsafeFlagSuggestion: false,
151
+ sqlFormatOptions: flags["sql-format"] || flags["sql-format-options"]
152
+ ? (flags["sql-format-options"] ?? {})
153
+ : undefined,
123
154
  });
124
155
  if (outputPath) {
125
156
  await writeFile(outputPath, content, "utf-8");
@@ -132,6 +163,6 @@ json/sql outputs are available for artifacts or piping.
132
163
  }
133
164
  }
134
165
  // Exit code 2 indicates changes were detected
135
- process.exitCode = 2;
166
+ setCommandExitCode(2);
136
167
  },
137
168
  });
@@ -4,7 +4,7 @@
4
4
  import { buildCommand } from "@stricli/core";
5
5
  import { applyPlan } from "../../core/plan/apply.js";
6
6
  import { createPlan } from "../../core/plan/index.js";
7
- import { loadIntegrationDSL } from "../utils/integrations.js";
7
+ import { resolveIntegrationOptions } from "../utils/integrations.js";
8
8
  import { formatPlanForDisplay, handleApplyResult, promptConfirmation, validatePlanRisk, } from "../utils.js";
9
9
  export const syncCommand = buildCommand({
10
10
  parameters: {
@@ -91,20 +91,16 @@ Exit codes:
91
91
  `.trim(),
92
92
  },
93
93
  async func(flags) {
94
- // Load integration if provided and extract filter/serialize DSL
95
- let filterOption = flags.filter;
96
- let serializeOption = flags.serialize;
97
- if (flags.integration) {
98
- const integrationDSL = await loadIntegrationDSL(flags.integration);
99
- // Use integration DSL if explicit flags not provided
100
- filterOption = filterOption ?? integrationDSL.filter;
101
- serializeOption = serializeOption ?? integrationDSL.serialize;
102
- }
94
+ const { filter, serialize } = await resolveIntegrationOptions({
95
+ filter: flags.filter,
96
+ serialize: flags.serialize,
97
+ integration: flags.integration,
98
+ });
103
99
  // 1. Create the plan
104
100
  const planResult = await createPlan(flags.source, flags.target, {
105
101
  role: flags.role,
106
- filter: filterOption,
107
- serialize: serializeOption,
102
+ filter,
103
+ serialize,
108
104
  });
109
105
  if (!planResult) {
110
106
  this.process.stdout.write("No changes detected.\n");
@@ -0,0 +1,2 @@
1
+ export declare function setCommandExitCode(code: number): void;
2
+ export declare function getCommandExitCode(): number | undefined;
@@ -0,0 +1,7 @@
1
+ let _exitCode;
2
+ export function setCommandExitCode(code) {
3
+ _exitCode = code;
4
+ }
5
+ export function getCommandExitCode() {
6
+ return _exitCode;
7
+ }
@@ -12,7 +12,7 @@ export function formatTree(plan) {
12
12
  // Summary
13
13
  const total = countTotalChanges(plan);
14
14
  lines.push(chalk.bold(`📋 Migration Plan: ${total} change${total !== 1 ? "s" : ""}`));
15
- const summary = buildSummaryLine(plan);
15
+ const summary = buildPlanSummaryTable(plan);
16
16
  if (summary) {
17
17
  lines.push("");
18
18
  lines.push(summary);
@@ -38,8 +38,9 @@ function countTotalChanges(plan) {
38
38
  }
39
39
  /**
40
40
  * Build summary as a table showing counts by entity type and operation.
41
+ * Exported for use by declarative-export to show the same summary style.
41
42
  */
42
- function buildSummaryLine(plan) {
43
+ function buildPlanSummaryTable(plan) {
43
44
  // Count by object type
44
45
  const byType = {};
45
46
  countFromHierarchy(plan, byType);
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Display utilities for the declarative-apply command.
3
+ *
4
+ * Pure formatting and location-resolution functions — no CLI framework dependency.
5
+ * Used to:
6
+ * - Map pg-topo diagnostics into display items (optionally grouped by message/code).
7
+ * - Resolve statement IDs to file paths and line/column for error output.
8
+ * - Format StatementErrors in a pgAdmin-style multi-line block.
9
+ */
10
+ import type { Diagnostic } from "@supabase/pg-topo";
11
+ import type { StatementError } from "../../core/declarative-apply/round-apply.ts";
12
+ /**
13
+ * Convert a 1-based character offset in a string to 1-based line and column.
14
+ * Used when mapping PostgreSQL error positions (in SQL) to file locations.
15
+ */
16
+ export declare function positionToLineColumn(sql: string, position: number): {
17
+ line: number;
18
+ column: number;
19
+ };
20
+ /** Input to buildDiagnosticDisplayItems: a pg-topo diagnostic plus optional location and object key. */
21
+ export type DiagnosticDisplayEntry = {
22
+ diagnostic: Diagnostic;
23
+ location?: string;
24
+ requiredObjectKey?: string;
25
+ };
26
+ /** One display row for a diagnostic (or a group of same-code diagnostics with multiple locations). */
27
+ type DiagnosticDisplayItem = {
28
+ code: string;
29
+ message: string;
30
+ suggestedFix?: string;
31
+ requiredObjectKey?: string;
32
+ locations: string[];
33
+ };
34
+ /** Extract requiredObjectKey from a pg-topo diagnostic if present and non-empty. */
35
+ export declare const requiredObjectKeyFromDiagnostic: (diagnostic: Diagnostic) => string | undefined;
36
+ /**
37
+ * Turn diagnostic entries into display items. If grouped is true, entries with
38
+ * the same code/message/suggestedFix are merged into one item with multiple locations.
39
+ */
40
+ export declare const buildDiagnosticDisplayItems: (entries: DiagnosticDisplayEntry[], grouped: boolean) => DiagnosticDisplayItem[];
41
+ /**
42
+ * Resolve the full path to a .sql file from the schema path (directory or single file)
43
+ * and a relative file path (e.g. from a statement id). If schemaPath is a file, its
44
+ * directory is used as the base.
45
+ */
46
+ export declare function resolveSqlFilePath(schemaPath: string, relativeFilePath: string): Promise<string>;
47
+ /**
48
+ * Format a StatementError in pgAdmin-style: ERROR, Detail, SQL state, optional
49
+ * Context, Hint, and Location (resolving the .sql file and line/column when possible).
50
+ */
51
+ export declare function formatStatementError(err: StatementError, schemaPath: string): Promise<string>;
52
+ export {};
@@ -0,0 +1,183 @@
1
+ /**
2
+ * Display utilities for the declarative-apply command.
3
+ *
4
+ * Pure formatting and location-resolution functions — no CLI framework dependency.
5
+ * Used to:
6
+ * - Map pg-topo diagnostics into display items (optionally grouped by message/code).
7
+ * - Resolve statement IDs to file paths and line/column for error output.
8
+ * - Format StatementErrors in a pgAdmin-style multi-line block.
9
+ */
10
+ import { readFile, stat } from "node:fs/promises";
11
+ import path from "node:path";
12
+ /**
13
+ * Convert a 1-based character offset in a string to 1-based line and column.
14
+ * Used when mapping PostgreSQL error positions (in SQL) to file locations.
15
+ */
16
+ export function positionToLineColumn(sql, position) {
17
+ const lines = sql.split("\n");
18
+ let offset = 0;
19
+ for (let i = 0; i < lines.length; i++) {
20
+ const lineLen = lines[i].length + (i < lines.length - 1 ? 1 : 0);
21
+ if (position <= offset + lineLen) {
22
+ return { line: i + 1, column: position - offset };
23
+ }
24
+ offset += lineLen;
25
+ }
26
+ const last = lines.length;
27
+ const lastLineLen = lines[last - 1]?.length ?? 0;
28
+ return { line: last, column: lastLineLen + 1 };
29
+ }
30
+ /**
31
+ * Parse a statement id in the form "filePath:statementIndex" into components.
32
+ * The last colon separates path from index (paths may contain colons).
33
+ * Returns null if the format is invalid.
34
+ */
35
+ function parseStatementId(id) {
36
+ const lastColon = id.lastIndexOf(":");
37
+ if (lastColon === -1)
38
+ return null;
39
+ const filePath = id.slice(0, lastColon);
40
+ const n = Number.parseInt(id.slice(lastColon + 1), 10);
41
+ if (!Number.isInteger(n) || n < 0)
42
+ return null;
43
+ return { filePath, statementIndex: n };
44
+ }
45
+ /** Extract requiredObjectKey from a pg-topo diagnostic if present and non-empty. */
46
+ export const requiredObjectKeyFromDiagnostic = (diagnostic) => {
47
+ const value = diagnostic.details?.requiredObjectKey;
48
+ return typeof value === "string" && value.length > 0 ? value : undefined;
49
+ };
50
+ /** Build a stable key for grouping diagnostics with the same code, message, and suggested fix. */
51
+ const diagnosticDisplayGroupKey = (entry) => [
52
+ entry.diagnostic.code,
53
+ entry.diagnostic.message,
54
+ entry.diagnostic.suggestedFix ?? "",
55
+ entry.requiredObjectKey ?? "",
56
+ ].join("\u0000");
57
+ /**
58
+ * Turn diagnostic entries into display items. If grouped is true, entries with
59
+ * the same code/message/suggestedFix are merged into one item with multiple locations.
60
+ */
61
+ export const buildDiagnosticDisplayItems = (entries, grouped) => {
62
+ if (!grouped) {
63
+ return entries.map((entry) => ({
64
+ code: entry.diagnostic.code,
65
+ message: entry.diagnostic.message,
66
+ suggestedFix: entry.diagnostic.suggestedFix,
67
+ requiredObjectKey: entry.requiredObjectKey,
68
+ locations: entry.location ? [entry.location] : [],
69
+ }));
70
+ }
71
+ const groupedItems = new Map();
72
+ for (const entry of entries) {
73
+ const key = diagnosticDisplayGroupKey(entry);
74
+ const existing = groupedItems.get(key);
75
+ if (!existing) {
76
+ groupedItems.set(key, {
77
+ code: entry.diagnostic.code,
78
+ message: entry.diagnostic.message,
79
+ suggestedFix: entry.diagnostic.suggestedFix,
80
+ requiredObjectKey: entry.requiredObjectKey,
81
+ locations: entry.location ? [entry.location] : [],
82
+ });
83
+ continue;
84
+ }
85
+ if (entry.location && !existing.locations.includes(entry.location)) {
86
+ existing.locations.push(entry.location);
87
+ }
88
+ }
89
+ return [...groupedItems.values()];
90
+ };
91
+ /**
92
+ * Resolve the full path to a .sql file from the schema path (directory or single file)
93
+ * and a relative file path (e.g. from a statement id). If schemaPath is a file, its
94
+ * directory is used as the base.
95
+ */
96
+ export async function resolveSqlFilePath(schemaPath, relativeFilePath) {
97
+ try {
98
+ const statResult = await stat(schemaPath);
99
+ const baseDir = statResult.isFile() ? path.dirname(schemaPath) : schemaPath;
100
+ return path.join(baseDir, relativeFilePath);
101
+ }
102
+ catch {
103
+ return path.join(schemaPath, relativeFilePath);
104
+ }
105
+ }
106
+ /**
107
+ * Find the 0-based start offset of statementSql in fileContent.
108
+ * Tries exact match first, then trimmed match. Returns -1 if not found.
109
+ */
110
+ function findStatementStartInFile(fileContent, statementSql) {
111
+ const exact = fileContent.indexOf(statementSql);
112
+ if (exact !== -1)
113
+ return exact;
114
+ const trimmedStmt = statementSql.trim();
115
+ if (!trimmedStmt)
116
+ return -1;
117
+ const trimmed = fileContent.indexOf(trimmedStmt);
118
+ if (trimmed !== -1)
119
+ return trimmed;
120
+ return -1;
121
+ }
122
+ /**
123
+ * Format a StatementError in pgAdmin-style: ERROR, Detail, SQL state, optional
124
+ * Context, Hint, and Location (resolving the .sql file and line/column when possible).
125
+ */
126
+ export async function formatStatementError(err, schemaPath) {
127
+ const lines = [];
128
+ lines.push(`ERROR: ${err.message}`);
129
+ if (err.detail) {
130
+ lines.push(`Detail: ${err.detail}`);
131
+ }
132
+ lines.push(`SQL state: ${err.code}`);
133
+ if (err.position !== undefined && err.statement.sql.length > 0) {
134
+ lines.push(`Character: ${err.position}`);
135
+ const pos = Math.max(0, Math.min(err.position - 1, err.statement.sql.length));
136
+ const contextStart = Math.max(0, pos - 40);
137
+ const contextEnd = Math.min(err.statement.sql.length, pos + 40);
138
+ const snippet = err.statement.sql.slice(contextStart, contextEnd);
139
+ const oneLine = snippet.replace(/\s+/g, " ").trim();
140
+ lines.push(`Context: ${oneLine || "(empty)"}`);
141
+ }
142
+ if (err.hint) {
143
+ lines.push(`Hint: ${err.hint}`);
144
+ }
145
+ const parsed = parseStatementId(err.statement.id);
146
+ if (parsed) {
147
+ let locationLine;
148
+ try {
149
+ const fullPath = await resolveSqlFilePath(schemaPath, parsed.filePath);
150
+ const fileContent = await readFile(fullPath, "utf-8");
151
+ const statementStart = findStatementStartInFile(fileContent, err.statement.sql);
152
+ if (statementStart !== -1) {
153
+ if (err.position !== undefined && err.statement.sql.length > 0) {
154
+ const fileErrorOffset = statementStart + (err.position - 1);
155
+ const fileErrorPosition = Math.min(fileErrorOffset + 1, fileContent.length);
156
+ const { line, column } = positionToLineColumn(fileContent, Math.max(1, fileErrorPosition));
157
+ locationLine = `Location: ${parsed.filePath}:${line}:${column}`;
158
+ }
159
+ else {
160
+ const { line } = positionToLineColumn(fileContent, statementStart + 1);
161
+ locationLine = `Location: ${parsed.filePath}:${line}`;
162
+ }
163
+ }
164
+ else {
165
+ locationLine = `Location: ${parsed.filePath} (statement ${parsed.statementIndex})`;
166
+ }
167
+ }
168
+ catch {
169
+ if (err.position !== undefined && err.statement.sql.length > 0) {
170
+ const { line, column } = positionToLineColumn(err.statement.sql, err.position);
171
+ locationLine = `Location: ${parsed.filePath} (statement ${parsed.statementIndex}, line ${line}, column ${column})`;
172
+ }
173
+ else {
174
+ locationLine = `Location: ${parsed.filePath} (statement ${parsed.statementIndex})`;
175
+ }
176
+ }
177
+ lines.push(locationLine);
178
+ }
179
+ else {
180
+ lines.push(`Location: ${err.statement.id}`);
181
+ }
182
+ return lines.map((l) => ` ${l}`).join("\n");
183
+ }