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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (680) hide show
  1. package/README.md +41 -2
  2. package/dist/cli/app.js +26 -3
  3. package/dist/cli/bin/cli.js +5 -0
  4. package/dist/cli/commands/catalog-export.d.ts +5 -0
  5. package/dist/cli/commands/catalog-export.js +64 -0
  6. package/dist/cli/commands/declarative-apply.d.ts +6 -0
  7. package/dist/cli/commands/declarative-apply.js +288 -0
  8. package/dist/cli/commands/declarative-export.d.ts +5 -0
  9. package/dist/cli/commands/declarative-export.js +245 -0
  10. package/dist/cli/commands/plan.js +40 -6
  11. package/dist/cli/exit-code.d.ts +2 -0
  12. package/dist/cli/exit-code.js +7 -0
  13. package/dist/cli/formatters/tree/tree.js +3 -2
  14. package/dist/cli/utils/apply-display.d.ts +52 -0
  15. package/dist/cli/utils/apply-display.js +183 -0
  16. package/dist/cli/utils/export-display.d.ts +43 -0
  17. package/dist/cli/utils/export-display.js +202 -0
  18. package/dist/cli/utils/integrations.d.ts +4 -3
  19. package/dist/cli/utils/integrations.js +25 -16
  20. package/dist/cli/utils/resolve-input.d.ts +7 -0
  21. package/dist/cli/utils/resolve-input.js +13 -0
  22. package/dist/cli/utils.d.ts +2 -0
  23. package/dist/cli/utils.js +1 -1
  24. package/dist/core/catalog-export/index.d.ts +11 -0
  25. package/dist/core/catalog-export/index.js +10 -0
  26. package/dist/core/catalog.diff.d.ts +1 -0
  27. package/dist/core/catalog.diff.js +64 -48
  28. package/dist/core/catalog.model.d.ts +16 -3
  29. package/dist/core/catalog.model.js +132 -30
  30. package/dist/core/catalog.snapshot.d.ts +66 -0
  31. package/dist/core/catalog.snapshot.js +206 -0
  32. package/dist/core/context.d.ts +3 -3
  33. package/dist/core/context.js +7 -10
  34. package/dist/core/declarative-apply/discover-sql.d.ts +18 -0
  35. package/dist/core/declarative-apply/discover-sql.js +86 -0
  36. package/dist/core/declarative-apply/extract-catalog-providers.d.ts +23 -0
  37. package/dist/core/declarative-apply/extract-catalog-providers.js +159 -0
  38. package/dist/core/declarative-apply/index.d.ts +49 -0
  39. package/dist/core/declarative-apply/index.js +134 -0
  40. package/dist/core/declarative-apply/round-apply.d.ts +100 -0
  41. package/dist/core/declarative-apply/round-apply.js +378 -0
  42. package/dist/core/depend.d.ts +2 -2
  43. package/dist/core/depend.js +8 -7
  44. package/dist/core/export/file-mapper.d.ts +71 -0
  45. package/dist/core/export/file-mapper.js +474 -0
  46. package/dist/core/export/grouper.d.ts +13 -0
  47. package/dist/core/export/grouper.js +76 -0
  48. package/dist/core/export/index.d.ts +45 -0
  49. package/dist/core/export/index.js +63 -0
  50. package/dist/core/export/types.d.ts +84 -0
  51. package/dist/core/export/types.js +25 -0
  52. package/dist/core/fingerprint.d.ts +0 -8
  53. package/dist/core/fingerprint.js +2 -2
  54. package/dist/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
  55. package/dist/core/integrations/filter/dsl.d.ts +39 -2
  56. package/dist/core/integrations/filter/dsl.js +20 -2
  57. package/dist/core/integrations/filter/extractors.js +42 -0
  58. package/dist/core/integrations/filter/filter.types.d.ts +2 -0
  59. package/dist/core/integrations/filter/filter.types.js +1 -0
  60. package/dist/core/integrations/integration-dsl.d.ts +10 -0
  61. package/dist/core/integrations/integration.types.d.ts +2 -1
  62. package/dist/core/integrations/serialize/dsl.d.ts +1 -1
  63. package/dist/core/integrations/serialize/serialize.types.d.ts +2 -0
  64. package/dist/core/integrations/serialize/serialize.types.js +1 -0
  65. package/dist/core/integrations/supabase.d.ts +18 -0
  66. package/dist/core/integrations/supabase.js +125 -0
  67. package/dist/core/objects/aggregate/aggregate.diff.d.ts +2 -8
  68. package/dist/core/objects/aggregate/aggregate.diff.js +16 -70
  69. package/dist/core/objects/aggregate/aggregate.model.d.ts +2 -2
  70. package/dist/core/objects/aggregate/aggregate.model.js +8 -10
  71. package/dist/core/objects/aggregate/changes/aggregate.create.js +1 -1
  72. package/dist/core/objects/aggregate/changes/aggregate.drop.js +1 -1
  73. package/dist/core/objects/base.privilege-diff.d.ts +38 -13
  74. package/dist/core/objects/base.privilege-diff.js +104 -22
  75. package/dist/core/objects/base.privilege.d.ts +1 -0
  76. package/dist/core/objects/base.privilege.js +9 -2
  77. package/dist/core/objects/collation/collation.diff.d.ts +2 -3
  78. package/dist/core/objects/collation/collation.model.d.ts +2 -2
  79. package/dist/core/objects/collation/collation.model.js +29 -28
  80. package/dist/core/objects/diff-context.d.ts +15 -0
  81. package/dist/core/objects/diff-context.js +1 -0
  82. package/dist/core/objects/domain/changes/domain.create.js +4 -2
  83. package/dist/core/objects/domain/domain.diff.d.ts +2 -8
  84. package/dist/core/objects/domain/domain.diff.js +16 -77
  85. package/dist/core/objects/domain/domain.model.d.ts +2 -2
  86. package/dist/core/objects/domain/domain.model.js +9 -11
  87. package/dist/core/objects/event-trigger/event-trigger.diff.d.ts +2 -3
  88. package/dist/core/objects/event-trigger/event-trigger.model.d.ts +2 -2
  89. package/dist/core/objects/event-trigger/event-trigger.model.js +7 -9
  90. package/dist/core/objects/extension/extension.model.d.ts +2 -2
  91. package/dist/core/objects/extension/extension.model.js +8 -10
  92. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.d.ts +2 -8
  93. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.js +13 -77
  94. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.d.ts +2 -2
  95. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.js +22 -24
  96. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.d.ts +2 -8
  97. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.js +16 -77
  98. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.d.ts +2 -2
  99. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.js +21 -23
  100. package/dist/core/objects/foreign-data-wrapper/server/server.diff.d.ts +2 -8
  101. package/dist/core/objects/foreign-data-wrapper/server/server.diff.js +13 -77
  102. package/dist/core/objects/foreign-data-wrapper/server/server.model.d.ts +2 -2
  103. package/dist/core/objects/foreign-data-wrapper/server/server.model.js +20 -22
  104. package/dist/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.d.ts +2 -2
  105. package/dist/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.js +20 -22
  106. package/dist/core/objects/index/index.model.d.ts +4 -4
  107. package/dist/core/objects/index/index.model.js +9 -11
  108. package/dist/core/objects/language/language.diff.d.ts +2 -5
  109. package/dist/core/objects/language/language.diff.js +7 -39
  110. package/dist/core/objects/language/language.model.js +5 -7
  111. package/dist/core/objects/materialized-view/materialized-view.diff.d.ts +2 -8
  112. package/dist/core/objects/materialized-view/materialized-view.diff.js +16 -158
  113. package/dist/core/objects/materialized-view/materialized-view.model.d.ts +2 -2
  114. package/dist/core/objects/materialized-view/materialized-view.model.js +9 -11
  115. package/dist/core/objects/procedure/changes/procedure.alter.js +12 -12
  116. package/dist/core/objects/procedure/procedure.diff.d.ts +2 -8
  117. package/dist/core/objects/procedure/procedure.diff.js +16 -77
  118. package/dist/core/objects/procedure/procedure.model.d.ts +2 -2
  119. package/dist/core/objects/procedure/procedure.model.js +9 -11
  120. package/dist/core/objects/publication/changes/publication.alter.d.ts +0 -9
  121. package/dist/core/objects/publication/changes/publication.alter.js +0 -14
  122. package/dist/core/objects/publication/changes/publication.types.d.ts +2 -2
  123. package/dist/core/objects/publication/publication.diff.d.ts +2 -3
  124. package/dist/core/objects/publication/publication.diff.js +8 -13
  125. package/dist/core/objects/publication/publication.model.d.ts +2 -2
  126. package/dist/core/objects/publication/publication.model.js +7 -9
  127. package/dist/core/objects/rls-policy/changes/rls-policy.alter.js +3 -3
  128. package/dist/core/objects/rls-policy/rls-policy.model.d.ts +2 -2
  129. package/dist/core/objects/rls-policy/rls-policy.model.js +8 -10
  130. package/dist/core/objects/role/role.diff.js +22 -1
  131. package/dist/core/objects/role/role.model.d.ts +3 -2
  132. package/dist/core/objects/role/role.model.js +146 -40
  133. package/dist/core/objects/rule/rule.model.d.ts +2 -2
  134. package/dist/core/objects/rule/rule.model.js +7 -9
  135. package/dist/core/objects/schema/schema.diff.d.ts +2 -8
  136. package/dist/core/objects/schema/schema.diff.js +16 -77
  137. package/dist/core/objects/schema/schema.model.d.ts +2 -2
  138. package/dist/core/objects/schema/schema.model.js +9 -11
  139. package/dist/core/objects/sequence/sequence.diff.d.ts +2 -8
  140. package/dist/core/objects/sequence/sequence.diff.js +16 -79
  141. package/dist/core/objects/sequence/sequence.model.d.ts +2 -2
  142. package/dist/core/objects/sequence/sequence.model.js +9 -11
  143. package/dist/core/objects/subscription/subscription.diff.d.ts +2 -3
  144. package/dist/core/objects/subscription/subscription.model.d.ts +2 -2
  145. package/dist/core/objects/subscription/subscription.model.js +25 -20
  146. package/dist/core/objects/table/changes/table.create.js +3 -0
  147. package/dist/core/objects/table/table.diff.d.ts +2 -8
  148. package/dist/core/objects/table/table.diff.js +26 -157
  149. package/dist/core/objects/table/table.model.d.ts +7 -4
  150. package/dist/core/objects/table/table.model.js +12 -11
  151. package/dist/core/objects/trigger/changes/trigger.alter.js +23 -0
  152. package/dist/core/objects/trigger/changes/trigger.create.js +4 -5
  153. package/dist/core/objects/trigger/trigger.model.d.ts +11 -2
  154. package/dist/core/objects/trigger/trigger.model.js +22 -10
  155. package/dist/core/objects/type/composite-type/composite-type.diff.d.ts +2 -8
  156. package/dist/core/objects/type/composite-type/composite-type.diff.js +16 -77
  157. package/dist/core/objects/type/composite-type/composite-type.model.d.ts +2 -2
  158. package/dist/core/objects/type/composite-type/composite-type.model.js +10 -11
  159. package/dist/core/objects/type/enum/enum.diff.d.ts +2 -8
  160. package/dist/core/objects/type/enum/enum.diff.js +25 -112
  161. package/dist/core/objects/type/enum/enum.model.d.ts +2 -2
  162. package/dist/core/objects/type/enum/enum.model.js +23 -25
  163. package/dist/core/objects/type/range/changes/range.create.js +6 -3
  164. package/dist/core/objects/type/range/range.diff.d.ts +2 -8
  165. package/dist/core/objects/type/range/range.diff.js +16 -77
  166. package/dist/core/objects/type/range/range.model.d.ts +2 -2
  167. package/dist/core/objects/type/range/range.model.js +8 -10
  168. package/dist/core/objects/view/view.diff.d.ts +2 -8
  169. package/dist/core/objects/view/view.diff.js +16 -158
  170. package/dist/core/objects/view/view.model.d.ts +17 -3
  171. package/dist/core/objects/view/view.model.js +11 -23
  172. package/dist/core/plan/apply.d.ts +2 -2
  173. package/dist/core/plan/apply.js +33 -16
  174. package/dist/core/plan/create.d.ts +20 -7
  175. package/dist/core/plan/create.js +153 -112
  176. package/dist/core/plan/index.d.ts +1 -2
  177. package/dist/core/plan/index.js +0 -1
  178. package/dist/core/plan/serialize.js +16 -4
  179. package/dist/core/plan/sql-format/constants.d.ts +2 -0
  180. package/dist/core/plan/sql-format/constants.js +11 -0
  181. package/dist/core/plan/sql-format/fixtures.d.ts +2 -0
  182. package/dist/core/plan/sql-format/fixtures.js +2447 -0
  183. package/dist/core/plan/sql-format/format-utils.d.ts +37 -0
  184. package/dist/core/plan/sql-format/format-utils.js +274 -0
  185. package/dist/core/plan/sql-format/formatters.d.ts +20 -0
  186. package/dist/core/plan/sql-format/formatters.js +737 -0
  187. package/dist/core/plan/sql-format/index.d.ts +2 -0
  188. package/dist/core/plan/sql-format/index.js +98 -0
  189. package/dist/core/plan/sql-format/keyword-case.d.ts +2 -0
  190. package/dist/core/plan/sql-format/keyword-case.js +893 -0
  191. package/dist/core/plan/sql-format/protect.d.ts +3 -0
  192. package/dist/core/plan/sql-format/protect.js +269 -0
  193. package/dist/core/plan/sql-format/sql-scanner.d.ts +59 -0
  194. package/dist/core/plan/sql-format/sql-scanner.js +202 -0
  195. package/dist/core/plan/sql-format/tokenizer.d.ts +22 -0
  196. package/dist/core/plan/sql-format/tokenizer.js +118 -0
  197. package/dist/core/plan/sql-format/types.d.ts +28 -0
  198. package/dist/core/plan/sql-format/types.js +1 -0
  199. package/dist/core/plan/sql-format/wrap.d.ts +2 -0
  200. package/dist/core/plan/sql-format/wrap.js +165 -0
  201. package/dist/core/plan/sql-format.d.ts +2 -0
  202. package/dist/core/plan/sql-format.js +1 -0
  203. package/dist/core/plan/ssl-config.d.ts +32 -0
  204. package/dist/core/plan/ssl-config.js +115 -0
  205. package/dist/core/plan/statements.d.ts +2 -1
  206. package/dist/core/plan/statements.js +6 -2
  207. package/dist/core/plan/types.d.ts +10 -15
  208. package/dist/core/postgres-config.d.ts +47 -3
  209. package/dist/core/postgres-config.js +225 -39
  210. package/dist/core/sort/graph-builder.js +10 -0
  211. package/dist/core/sort/logical-sort.js +31 -23
  212. package/dist/core/test-utils/assert-valid-sql.d.ts +10 -0
  213. package/dist/core/test-utils/assert-valid-sql.js +19 -0
  214. package/dist/index.d.ts +18 -1
  215. package/dist/index.js +16 -1
  216. package/package.json +58 -21
  217. package/src/cli/app.ts +52 -0
  218. package/src/cli/bin/cli.ts +15 -0
  219. package/src/cli/commands/apply.ts +101 -0
  220. package/src/cli/commands/catalog-export.ts +78 -0
  221. package/src/cli/commands/declarative-apply.diagnostics.test.ts +77 -0
  222. package/src/cli/commands/declarative-apply.ts +380 -0
  223. package/src/cli/commands/declarative-export.ts +330 -0
  224. package/src/cli/commands/plan.ts +216 -0
  225. package/src/cli/commands/sync.ts +185 -0
  226. package/src/cli/exit-code.test.ts +19 -0
  227. package/src/cli/exit-code.ts +7 -0
  228. package/src/cli/formatters/index.ts +5 -0
  229. package/src/cli/formatters/tree/tree-builder.ts +380 -0
  230. package/src/cli/formatters/tree/tree-renderer.ts +372 -0
  231. package/src/cli/formatters/tree/tree.ts +238 -0
  232. package/src/cli/utils/apply-display.test.ts +348 -0
  233. package/src/cli/utils/apply-display.ts +238 -0
  234. package/src/cli/utils/export-display.test.ts +103 -0
  235. package/src/cli/utils/export-display.ts +275 -0
  236. package/src/cli/utils/integrations.test.ts +44 -0
  237. package/src/cli/utils/integrations.ts +42 -0
  238. package/src/cli/utils/resolve-input.test.ts +38 -0
  239. package/src/cli/utils/resolve-input.ts +17 -0
  240. package/src/cli/utils.ts +231 -0
  241. package/src/core/catalog-export/index.ts +20 -0
  242. package/src/core/catalog.diff.ts +247 -0
  243. package/src/core/catalog.model.test.ts +122 -0
  244. package/src/core/catalog.model.ts +510 -0
  245. package/src/core/catalog.snapshot.test.ts +477 -0
  246. package/src/core/catalog.snapshot.ts +289 -0
  247. package/src/core/change.types.ts +44 -0
  248. package/src/core/context.ts +26 -0
  249. package/src/core/declarative-apply/discover-sql.test.ts +103 -0
  250. package/src/core/declarative-apply/discover-sql.ts +107 -0
  251. package/src/core/declarative-apply/extract-catalog-providers.ts +220 -0
  252. package/src/core/declarative-apply/index.test.ts +67 -0
  253. package/src/core/declarative-apply/index.ts +205 -0
  254. package/src/core/declarative-apply/round-apply.test.ts +504 -0
  255. package/src/core/declarative-apply/round-apply.ts +562 -0
  256. package/src/core/depend.ts +1870 -0
  257. package/src/core/expand-replace-dependencies.test.ts +70 -0
  258. package/src/core/expand-replace-dependencies.ts +380 -0
  259. package/src/core/export/file-mapper.test.ts +816 -0
  260. package/src/core/export/file-mapper.ts +574 -0
  261. package/src/core/export/grouper.ts +108 -0
  262. package/src/core/export/index.ts +129 -0
  263. package/src/core/export/types.ts +104 -0
  264. package/src/core/fingerprint.ts +204 -0
  265. package/src/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
  266. package/src/core/integrations/filter/dsl.test.ts +211 -0
  267. package/src/core/integrations/filter/dsl.ts +266 -0
  268. package/src/core/integrations/filter/extractors.test.ts +244 -0
  269. package/src/core/integrations/filter/extractors.ts +187 -0
  270. package/src/core/integrations/filter/filter.types.ts +3 -0
  271. package/src/core/integrations/integration-dsl.ts +34 -0
  272. package/src/core/integrations/integration.types.ts +7 -0
  273. package/src/core/integrations/serialize/dsl.test.ts +91 -0
  274. package/src/core/integrations/serialize/dsl.ts +77 -0
  275. package/src/core/integrations/serialize/serialize.types.ts +3 -0
  276. package/src/core/integrations/supabase.ts +130 -0
  277. package/src/core/objects/aggregate/aggregate.diff.test.ts +215 -0
  278. package/src/core/objects/aggregate/aggregate.diff.ts +222 -0
  279. package/src/core/objects/aggregate/aggregate.model.ts +317 -0
  280. package/src/core/objects/aggregate/changes/aggregate.alter.test.ts +66 -0
  281. package/src/core/objects/aggregate/changes/aggregate.alter.ts +32 -0
  282. package/src/core/objects/aggregate/changes/aggregate.base.ts +20 -0
  283. package/src/core/objects/aggregate/changes/aggregate.comment.test.ts +89 -0
  284. package/src/core/objects/aggregate/changes/aggregate.comment.ts +62 -0
  285. package/src/core/objects/aggregate/changes/aggregate.create.test.ts +104 -0
  286. package/src/core/objects/aggregate/changes/aggregate.create.ts +329 -0
  287. package/src/core/objects/aggregate/changes/aggregate.drop.test.ts +82 -0
  288. package/src/core/objects/aggregate/changes/aggregate.drop.ts +32 -0
  289. package/src/core/objects/aggregate/changes/aggregate.privilege.test.ts +136 -0
  290. package/src/core/objects/aggregate/changes/aggregate.privilege.ts +146 -0
  291. package/src/core/objects/aggregate/changes/aggregate.types.ts +12 -0
  292. package/src/core/objects/base.change.ts +62 -0
  293. package/src/core/objects/base.default-privileges.ts +204 -0
  294. package/src/core/objects/base.diff.ts +20 -0
  295. package/src/core/objects/base.model.ts +82 -0
  296. package/src/core/objects/base.privilege-diff.ts +447 -0
  297. package/src/core/objects/base.privilege.ts +191 -0
  298. package/src/core/objects/collation/changes/collation.alter.test.ts +68 -0
  299. package/src/core/objects/collation/changes/collation.alter.ts +79 -0
  300. package/src/core/objects/collation/changes/collation.base.ts +20 -0
  301. package/src/core/objects/collation/changes/collation.comment.ts +68 -0
  302. package/src/core/objects/collation/changes/collation.create.test.ts +56 -0
  303. package/src/core/objects/collation/changes/collation.create.ts +106 -0
  304. package/src/core/objects/collation/changes/collation.drop.test.ts +31 -0
  305. package/src/core/objects/collation/changes/collation.drop.ts +37 -0
  306. package/src/core/objects/collation/changes/collation.types.ts +10 -0
  307. package/src/core/objects/collation/collation.diff.test.ts +97 -0
  308. package/src/core/objects/collation/collation.diff.ts +127 -0
  309. package/src/core/objects/collation/collation.model.ts +224 -0
  310. package/src/core/objects/diff-context.ts +16 -0
  311. package/src/core/objects/domain/changes/domain.alter.test.ts +335 -0
  312. package/src/core/objects/domain/changes/domain.alter.ts +286 -0
  313. package/src/core/objects/domain/changes/domain.base.ts +20 -0
  314. package/src/core/objects/domain/changes/domain.comment.ts +59 -0
  315. package/src/core/objects/domain/changes/domain.create.test.ts +95 -0
  316. package/src/core/objects/domain/changes/domain.create.ts +124 -0
  317. package/src/core/objects/domain/changes/domain.drop.test.ts +33 -0
  318. package/src/core/objects/domain/changes/domain.drop.ts +34 -0
  319. package/src/core/objects/domain/changes/domain.privilege.ts +171 -0
  320. package/src/core/objects/domain/changes/domain.types.ts +12 -0
  321. package/src/core/objects/domain/domain.diff.test.ts +284 -0
  322. package/src/core/objects/domain/domain.diff.ts +295 -0
  323. package/src/core/objects/domain/domain.model.ts +190 -0
  324. package/src/core/objects/event-trigger/changes/event-trigger.alter.test.ts +57 -0
  325. package/src/core/objects/event-trigger/changes/event-trigger.alter.ts +82 -0
  326. package/src/core/objects/event-trigger/changes/event-trigger.base.ts +20 -0
  327. package/src/core/objects/event-trigger/changes/event-trigger.comment.ts +66 -0
  328. package/src/core/objects/event-trigger/changes/event-trigger.create.test.ts +27 -0
  329. package/src/core/objects/event-trigger/changes/event-trigger.create.ts +72 -0
  330. package/src/core/objects/event-trigger/changes/event-trigger.drop.test.ts +25 -0
  331. package/src/core/objects/event-trigger/changes/event-trigger.drop.ts +34 -0
  332. package/src/core/objects/event-trigger/changes/event-trigger.types.ts +10 -0
  333. package/src/core/objects/event-trigger/event-trigger.diff.test.ts +131 -0
  334. package/src/core/objects/event-trigger/event-trigger.diff.ts +127 -0
  335. package/src/core/objects/event-trigger/event-trigger.model.ts +106 -0
  336. package/src/core/objects/extension/changes/extension.alter.test.ts +63 -0
  337. package/src/core/objects/extension/changes/extension.alter.ts +78 -0
  338. package/src/core/objects/extension/changes/extension.base.ts +20 -0
  339. package/src/core/objects/extension/changes/extension.comment.ts +64 -0
  340. package/src/core/objects/extension/changes/extension.create.test.ts +28 -0
  341. package/src/core/objects/extension/changes/extension.create.ts +63 -0
  342. package/src/core/objects/extension/changes/extension.drop.test.ts +26 -0
  343. package/src/core/objects/extension/changes/extension.drop.ts +34 -0
  344. package/src/core/objects/extension/changes/extension.types.ts +10 -0
  345. package/src/core/objects/extension/extension.diff.test.ts +42 -0
  346. package/src/core/objects/extension/extension.diff.ts +90 -0
  347. package/src/core/objects/extension/extension.model.test.ts +98 -0
  348. package/src/core/objects/extension/extension.model.ts +280 -0
  349. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.test.ts +136 -0
  350. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.ts +101 -0
  351. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.base.ts +20 -0
  352. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.ts +72 -0
  353. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.test.ts +160 -0
  354. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.ts +95 -0
  355. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.test.ts +26 -0
  356. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.ts +36 -0
  357. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.ts +172 -0
  358. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.ts +12 -0
  359. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.test.ts +286 -0
  360. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.ts +271 -0
  361. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.ts +149 -0
  362. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.ts +10 -0
  363. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.test.ts +340 -0
  364. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.ts +341 -0
  365. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.base.ts +20 -0
  366. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.ts +72 -0
  367. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.test.ts +210 -0
  368. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.ts +81 -0
  369. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.test.ts +46 -0
  370. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.ts +37 -0
  371. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.ts +181 -0
  372. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.ts +12 -0
  373. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.test.ts +813 -0
  374. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.ts +343 -0
  375. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.ts +242 -0
  376. package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.test.ts +183 -0
  377. package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.ts +126 -0
  378. package/src/core/objects/foreign-data-wrapper/server/changes/server.base.ts +20 -0
  379. package/src/core/objects/foreign-data-wrapper/server/changes/server.comment.ts +60 -0
  380. package/src/core/objects/foreign-data-wrapper/server/changes/server.create.test.ts +144 -0
  381. package/src/core/objects/foreign-data-wrapper/server/changes/server.create.ts +81 -0
  382. package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.test.ts +27 -0
  383. package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.ts +34 -0
  384. package/src/core/objects/foreign-data-wrapper/server/changes/server.privilege.ts +164 -0
  385. package/src/core/objects/foreign-data-wrapper/server/changes/server.types.ts +12 -0
  386. package/src/core/objects/foreign-data-wrapper/server/server.diff.test.ts +262 -0
  387. package/src/core/objects/foreign-data-wrapper/server/server.diff.ts +247 -0
  388. package/src/core/objects/foreign-data-wrapper/server/server.model.ts +133 -0
  389. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.test.ts +91 -0
  390. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.ts +69 -0
  391. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.base.ts +20 -0
  392. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.test.ts +96 -0
  393. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.ts +66 -0
  394. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.test.ts +60 -0
  395. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.ts +40 -0
  396. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.ts +8 -0
  397. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.test.ts +77 -0
  398. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.ts +107 -0
  399. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.ts +96 -0
  400. package/src/core/objects/index/changes/index.alter.test.ts +209 -0
  401. package/src/core/objects/index/changes/index.alter.ts +144 -0
  402. package/src/core/objects/index/changes/index.base.ts +20 -0
  403. package/src/core/objects/index/changes/index.comment.ts +63 -0
  404. package/src/core/objects/index/changes/index.create.test.ts +69 -0
  405. package/src/core/objects/index/changes/index.create.ts +68 -0
  406. package/src/core/objects/index/changes/index.drop.test.ts +47 -0
  407. package/src/core/objects/index/changes/index.drop.ts +34 -0
  408. package/src/core/objects/index/changes/index.types.ts +6 -0
  409. package/src/core/objects/index/changes/utils.ts +16 -0
  410. package/src/core/objects/index/index.diff.test.ts +153 -0
  411. package/src/core/objects/index/index.diff.ts +243 -0
  412. package/src/core/objects/index/index.model.ts +370 -0
  413. package/src/core/objects/language/changes/language.alter.test.ts +36 -0
  414. package/src/core/objects/language/changes/language.alter.ts +53 -0
  415. package/src/core/objects/language/changes/language.base.ts +20 -0
  416. package/src/core/objects/language/changes/language.comment.ts +58 -0
  417. package/src/core/objects/language/changes/language.create.test.ts +30 -0
  418. package/src/core/objects/language/changes/language.create.ts +104 -0
  419. package/src/core/objects/language/changes/language.drop.test.ts +28 -0
  420. package/src/core/objects/language/changes/language.drop.ts +39 -0
  421. package/src/core/objects/language/changes/language.privilege.ts +172 -0
  422. package/src/core/objects/language/changes/language.types.ts +12 -0
  423. package/src/core/objects/language/language.diff.test.ts +135 -0
  424. package/src/core/objects/language/language.diff.ts +144 -0
  425. package/src/core/objects/language/language.model.ts +150 -0
  426. package/src/core/objects/materialized-view/changes/materialized-view.alter.test.ts +130 -0
  427. package/src/core/objects/materialized-view/changes/materialized-view.alter.ts +113 -0
  428. package/src/core/objects/materialized-view/changes/materialized-view.base.ts +20 -0
  429. package/src/core/objects/materialized-view/changes/materialized-view.comment.ts +176 -0
  430. package/src/core/objects/materialized-view/changes/materialized-view.create.test.ts +69 -0
  431. package/src/core/objects/materialized-view/changes/materialized-view.create.ts +93 -0
  432. package/src/core/objects/materialized-view/changes/materialized-view.drop.test.ts +37 -0
  433. package/src/core/objects/materialized-view/changes/materialized-view.drop.ts +60 -0
  434. package/src/core/objects/materialized-view/changes/materialized-view.privilege.ts +212 -0
  435. package/src/core/objects/materialized-view/changes/materialized-view.types.ts +12 -0
  436. package/src/core/objects/materialized-view/materialized-view.diff.test.ts +264 -0
  437. package/src/core/objects/materialized-view/materialized-view.diff.ts +301 -0
  438. package/src/core/objects/materialized-view/materialized-view.model.ts +258 -0
  439. package/src/core/objects/procedure/changes/procedure.alter.test.ts +1077 -0
  440. package/src/core/objects/procedure/changes/procedure.alter.ts +290 -0
  441. package/src/core/objects/procedure/changes/procedure.base.ts +20 -0
  442. package/src/core/objects/procedure/changes/procedure.comment.ts +70 -0
  443. package/src/core/objects/procedure/changes/procedure.create.test.ts +51 -0
  444. package/src/core/objects/procedure/changes/procedure.create.ts +92 -0
  445. package/src/core/objects/procedure/changes/procedure.drop.test.ts +90 -0
  446. package/src/core/objects/procedure/changes/procedure.drop.ts +49 -0
  447. package/src/core/objects/procedure/changes/procedure.privilege.ts +188 -0
  448. package/src/core/objects/procedure/changes/procedure.types.ts +12 -0
  449. package/src/core/objects/procedure/procedure.diff.test.ts +161 -0
  450. package/src/core/objects/procedure/procedure.diff.ts +341 -0
  451. package/src/core/objects/procedure/procedure.model.ts +264 -0
  452. package/src/core/objects/procedure/utils.ts +58 -0
  453. package/src/core/objects/publication/changes/publication.alter.test.ts +217 -0
  454. package/src/core/objects/publication/changes/publication.alter.ts +225 -0
  455. package/src/core/objects/publication/changes/publication.base.ts +20 -0
  456. package/src/core/objects/publication/changes/publication.comment.test.ts +73 -0
  457. package/src/core/objects/publication/changes/publication.comment.ts +64 -0
  458. package/src/core/objects/publication/changes/publication.create.test.ts +90 -0
  459. package/src/core/objects/publication/changes/publication.create.ts +82 -0
  460. package/src/core/objects/publication/changes/publication.drop.test.ts +48 -0
  461. package/src/core/objects/publication/changes/publication.drop.ts +29 -0
  462. package/src/core/objects/publication/changes/publication.types.ts +24 -0
  463. package/src/core/objects/publication/publication.diff.test.ts +297 -0
  464. package/src/core/objects/publication/publication.diff.ts +247 -0
  465. package/src/core/objects/publication/publication.model.ts +206 -0
  466. package/src/core/objects/publication/utils.ts +55 -0
  467. package/src/core/objects/rls-policy/changes/rls-policy.alter.test.ts +267 -0
  468. package/src/core/objects/rls-policy/changes/rls-policy.alter.ts +128 -0
  469. package/src/core/objects/rls-policy/changes/rls-policy.base.ts +20 -0
  470. package/src/core/objects/rls-policy/changes/rls-policy.comment.ts +69 -0
  471. package/src/core/objects/rls-policy/changes/rls-policy.create.test.ts +81 -0
  472. package/src/core/objects/rls-policy/changes/rls-policy.create.ts +100 -0
  473. package/src/core/objects/rls-policy/changes/rls-policy.drop.test.ts +31 -0
  474. package/src/core/objects/rls-policy/changes/rls-policy.drop.ts +39 -0
  475. package/src/core/objects/rls-policy/changes/rls-policy.types.ts +10 -0
  476. package/src/core/objects/rls-policy/rls-policy.diff.test.ts +79 -0
  477. package/src/core/objects/rls-policy/rls-policy.diff.ts +121 -0
  478. package/src/core/objects/rls-policy/rls-policy.model.ts +140 -0
  479. package/src/core/objects/role/changes/role.alter.test.ts +362 -0
  480. package/src/core/objects/role/changes/role.alter.ts +110 -0
  481. package/src/core/objects/role/changes/role.base.ts +24 -0
  482. package/src/core/objects/role/changes/role.comment.ts +55 -0
  483. package/src/core/objects/role/changes/role.create.test.ts +56 -0
  484. package/src/core/objects/role/changes/role.create.ts +102 -0
  485. package/src/core/objects/role/changes/role.drop.test.ts +32 -0
  486. package/src/core/objects/role/changes/role.drop.ts +34 -0
  487. package/src/core/objects/role/changes/role.privilege.ts +376 -0
  488. package/src/core/objects/role/changes/role.types.ts +12 -0
  489. package/src/core/objects/role/role.diff.test.ts +279 -0
  490. package/src/core/objects/role/role.diff.ts +499 -0
  491. package/src/core/objects/role/role.model.ts +452 -0
  492. package/src/core/objects/rule/changes/rule.alter.test.ts +82 -0
  493. package/src/core/objects/rule/changes/rule.alter.ts +72 -0
  494. package/src/core/objects/rule/changes/rule.base.ts +20 -0
  495. package/src/core/objects/rule/changes/rule.comment.test.ts +58 -0
  496. package/src/core/objects/rule/changes/rule.comment.ts +62 -0
  497. package/src/core/objects/rule/changes/rule.create.test.ts +63 -0
  498. package/src/core/objects/rule/changes/rule.create.ts +42 -0
  499. package/src/core/objects/rule/changes/rule.drop.test.ts +40 -0
  500. package/src/core/objects/rule/changes/rule.drop.ts +29 -0
  501. package/src/core/objects/rule/changes/rule.types.ts +12 -0
  502. package/src/core/objects/rule/rule.diff.test.ts +132 -0
  503. package/src/core/objects/rule/rule.diff.ts +79 -0
  504. package/src/core/objects/rule/rule.model.ts +173 -0
  505. package/src/core/objects/schema/changes/schema.alter.test.ts +31 -0
  506. package/src/core/objects/schema/changes/schema.alter.ts +45 -0
  507. package/src/core/objects/schema/changes/schema.base.ts +20 -0
  508. package/src/core/objects/schema/changes/schema.comment.ts +56 -0
  509. package/src/core/objects/schema/changes/schema.create.test.ts +25 -0
  510. package/src/core/objects/schema/changes/schema.create.ts +47 -0
  511. package/src/core/objects/schema/changes/schema.drop.test.ts +23 -0
  512. package/src/core/objects/schema/changes/schema.drop.ts +34 -0
  513. package/src/core/objects/schema/changes/schema.privilege.ts +175 -0
  514. package/src/core/objects/schema/changes/schema.types.ts +12 -0
  515. package/src/core/objects/schema/schema.diff.test.ts +42 -0
  516. package/src/core/objects/schema/schema.diff.ts +146 -0
  517. package/src/core/objects/schema/schema.model.ts +107 -0
  518. package/src/core/objects/sequence/changes/sequence.alter.test.ts +157 -0
  519. package/src/core/objects/sequence/changes/sequence.alter.ts +115 -0
  520. package/src/core/objects/sequence/changes/sequence.base.ts +20 -0
  521. package/src/core/objects/sequence/changes/sequence.comment.ts +60 -0
  522. package/src/core/objects/sequence/changes/sequence.create.test.ts +89 -0
  523. package/src/core/objects/sequence/changes/sequence.create.ts +111 -0
  524. package/src/core/objects/sequence/changes/sequence.drop.test.ts +35 -0
  525. package/src/core/objects/sequence/changes/sequence.drop.ts +37 -0
  526. package/src/core/objects/sequence/changes/sequence.privilege.ts +179 -0
  527. package/src/core/objects/sequence/changes/sequence.types.ts +12 -0
  528. package/src/core/objects/sequence/sequence.diff.test.ts +255 -0
  529. package/src/core/objects/sequence/sequence.diff.ts +294 -0
  530. package/src/core/objects/sequence/sequence.model.ts +185 -0
  531. package/src/core/objects/subscription/changes/subscription.alter.test.ts +134 -0
  532. package/src/core/objects/subscription/changes/subscription.alter.ts +110 -0
  533. package/src/core/objects/subscription/changes/subscription.base.ts +20 -0
  534. package/src/core/objects/subscription/changes/subscription.comment.test.ts +70 -0
  535. package/src/core/objects/subscription/changes/subscription.comment.ts +64 -0
  536. package/src/core/objects/subscription/changes/subscription.create.test.ts +80 -0
  537. package/src/core/objects/subscription/changes/subscription.create.ts +69 -0
  538. package/src/core/objects/subscription/changes/subscription.drop.test.ts +48 -0
  539. package/src/core/objects/subscription/changes/subscription.drop.ts +20 -0
  540. package/src/core/objects/subscription/changes/subscription.types.ts +22 -0
  541. package/src/core/objects/subscription/subscription.diff.test.ts +237 -0
  542. package/src/core/objects/subscription/subscription.diff.ts +242 -0
  543. package/src/core/objects/subscription/subscription.model.ts +190 -0
  544. package/src/core/objects/subscription/utils.ts +156 -0
  545. package/src/core/objects/table/changes/table.alter.test.ts +846 -0
  546. package/src/core/objects/table/changes/table.alter.ts +806 -0
  547. package/src/core/objects/table/changes/table.base.ts +20 -0
  548. package/src/core/objects/table/changes/table.comment.ts +266 -0
  549. package/src/core/objects/table/changes/table.create.test.ts +188 -0
  550. package/src/core/objects/table/changes/table.create.ts +192 -0
  551. package/src/core/objects/table/changes/table.drop.test.ts +36 -0
  552. package/src/core/objects/table/changes/table.drop.ts +45 -0
  553. package/src/core/objects/table/changes/table.privilege.ts +200 -0
  554. package/src/core/objects/table/changes/table.types.ts +12 -0
  555. package/src/core/objects/table/table.diff.test.ts +868 -0
  556. package/src/core/objects/table/table.diff.ts +817 -0
  557. package/src/core/objects/table/table.model.ts +460 -0
  558. package/src/core/objects/trigger/changes/trigger.alter.test.ts +50 -0
  559. package/src/core/objects/trigger/changes/trigger.alter.ts +76 -0
  560. package/src/core/objects/trigger/changes/trigger.base.ts +20 -0
  561. package/src/core/objects/trigger/changes/trigger.comment.ts +64 -0
  562. package/src/core/objects/trigger/changes/trigger.create.test.ts +47 -0
  563. package/src/core/objects/trigger/changes/trigger.create.ts +88 -0
  564. package/src/core/objects/trigger/changes/trigger.drop.test.ts +47 -0
  565. package/src/core/objects/trigger/changes/trigger.drop.ts +39 -0
  566. package/src/core/objects/trigger/changes/trigger.types.ts +10 -0
  567. package/src/core/objects/trigger/trigger.diff.test.ts +84 -0
  568. package/src/core/objects/trigger/trigger.diff.ts +116 -0
  569. package/src/core/objects/trigger/trigger.model.ts +264 -0
  570. package/src/core/objects/type/composite-type/changes/composite-type.alter.test.ts +208 -0
  571. package/src/core/objects/type/composite-type/changes/composite-type.alter.ts +174 -0
  572. package/src/core/objects/type/composite-type/changes/composite-type.base.ts +20 -0
  573. package/src/core/objects/type/composite-type/changes/composite-type.comment.ts +145 -0
  574. package/src/core/objects/type/composite-type/changes/composite-type.create.test.ts +106 -0
  575. package/src/core/objects/type/composite-type/changes/composite-type.create.ts +95 -0
  576. package/src/core/objects/type/composite-type/changes/composite-type.drop.test.ts +36 -0
  577. package/src/core/objects/type/composite-type/changes/composite-type.drop.ts +37 -0
  578. package/src/core/objects/type/composite-type/changes/composite-type.privilege.ts +175 -0
  579. package/src/core/objects/type/composite-type/changes/composite-type.types.ts +12 -0
  580. package/src/core/objects/type/composite-type/composite-type.diff.test.ts +269 -0
  581. package/src/core/objects/type/composite-type/composite-type.diff.ts +310 -0
  582. package/src/core/objects/type/composite-type/composite-type.model.ts +253 -0
  583. package/src/core/objects/type/enum/changes/enum.alter.test.ts +113 -0
  584. package/src/core/objects/type/enum/changes/enum.alter.ts +91 -0
  585. package/src/core/objects/type/enum/changes/enum.base.ts +20 -0
  586. package/src/core/objects/type/enum/changes/enum.comment.ts +64 -0
  587. package/src/core/objects/type/enum/changes/enum.create.test.ts +31 -0
  588. package/src/core/objects/type/enum/changes/enum.create.ts +56 -0
  589. package/src/core/objects/type/enum/changes/enum.drop.test.ts +28 -0
  590. package/src/core/objects/type/enum/changes/enum.drop.ts +34 -0
  591. package/src/core/objects/type/enum/changes/enum.privilege.ts +175 -0
  592. package/src/core/objects/type/enum/changes/enum.types.ts +12 -0
  593. package/src/core/objects/type/enum/enum.diff.test.ts +372 -0
  594. package/src/core/objects/type/enum/enum.diff.ts +308 -0
  595. package/src/core/objects/type/enum/enum.model.ts +194 -0
  596. package/src/core/objects/type/range/changes/range.alter.test.ts +29 -0
  597. package/src/core/objects/type/range/changes/range.alter.ts +51 -0
  598. package/src/core/objects/type/range/changes/range.base.ts +20 -0
  599. package/src/core/objects/type/range/changes/range.comment.ts +64 -0
  600. package/src/core/objects/type/range/changes/range.create.test.ts +54 -0
  601. package/src/core/objects/type/range/changes/range.create.ts +155 -0
  602. package/src/core/objects/type/range/changes/range.drop.test.ts +28 -0
  603. package/src/core/objects/type/range/changes/range.drop.ts +34 -0
  604. package/src/core/objects/type/range/changes/range.privilege.ts +175 -0
  605. package/src/core/objects/type/range/changes/range.types.ts +12 -0
  606. package/src/core/objects/type/range/range.diff.test.ts +147 -0
  607. package/src/core/objects/type/range/range.diff.ts +197 -0
  608. package/src/core/objects/type/range/range.model.ts +187 -0
  609. package/src/core/objects/type/type.types.ts +5 -0
  610. package/src/core/objects/utils.ts +171 -0
  611. package/src/core/objects/view/changes/view.alter.test.ts +115 -0
  612. package/src/core/objects/view/changes/view.alter.ts +112 -0
  613. package/src/core/objects/view/changes/view.base.ts +20 -0
  614. package/src/core/objects/view/changes/view.comment.ts +59 -0
  615. package/src/core/objects/view/changes/view.create.test.ts +70 -0
  616. package/src/core/objects/view/changes/view.create.ts +73 -0
  617. package/src/core/objects/view/changes/view.drop.test.ts +37 -0
  618. package/src/core/objects/view/changes/view.drop.ts +40 -0
  619. package/src/core/objects/view/changes/view.privilege.ts +200 -0
  620. package/src/core/objects/view/changes/view.types.ts +12 -0
  621. package/src/core/objects/view/view.diff.test.ts +173 -0
  622. package/src/core/objects/view/view.diff.ts +215 -0
  623. package/src/core/objects/view/view.model.ts +262 -0
  624. package/src/core/plan/apply.ts +172 -0
  625. package/src/core/plan/create.ts +384 -0
  626. package/src/core/plan/hierarchy.ts +574 -0
  627. package/src/core/plan/index.ts +29 -0
  628. package/src/core/plan/io.ts +20 -0
  629. package/src/core/plan/risk.ts +48 -0
  630. package/src/core/plan/serialize.test.ts +317 -0
  631. package/src/core/plan/serialize.ts +209 -0
  632. package/src/core/plan/sql-format/constants.ts +13 -0
  633. package/src/core/plan/sql-format/fixtures.ts +2803 -0
  634. package/src/core/plan/sql-format/format-comment-literals.test.ts +96 -0
  635. package/src/core/plan/sql-format/format-functions.test.ts +127 -0
  636. package/src/core/plan/sql-format/format-lowercase-coverage.test.ts +119 -0
  637. package/src/core/plan/sql-format/format-off.test.ts +806 -0
  638. package/src/core/plan/sql-format/format-pretty-lower-leading.test.ts +1061 -0
  639. package/src/core/plan/sql-format/format-pretty-narrow.test.ts +1279 -0
  640. package/src/core/plan/sql-format/format-pretty-preserve.test.ts +1057 -0
  641. package/src/core/plan/sql-format/format-pretty-upper.test.ts +1048 -0
  642. package/src/core/plan/sql-format/format-stress.test.ts +616 -0
  643. package/src/core/plan/sql-format/format-utils.test.ts +91 -0
  644. package/src/core/plan/sql-format/format-utils.ts +391 -0
  645. package/src/core/plan/sql-format/formatters.ts +921 -0
  646. package/src/core/plan/sql-format/index.ts +149 -0
  647. package/src/core/plan/sql-format/keyword-case.test.ts +118 -0
  648. package/src/core/plan/sql-format/keyword-case.ts +1120 -0
  649. package/src/core/plan/sql-format/protect.test.ts +127 -0
  650. package/src/core/plan/sql-format/protect.ts +337 -0
  651. package/src/core/plan/sql-format/sql-scanner.test.ts +240 -0
  652. package/src/core/plan/sql-format/sql-scanner.ts +252 -0
  653. package/src/core/plan/sql-format/tokenizer.test.ts +68 -0
  654. package/src/core/plan/sql-format/tokenizer.ts +152 -0
  655. package/src/core/plan/sql-format/types.ts +31 -0
  656. package/src/core/plan/sql-format/wrap.test.ts +119 -0
  657. package/src/core/plan/sql-format/wrap.ts +196 -0
  658. package/src/core/plan/sql-format.ts +2 -0
  659. package/src/core/plan/ssl-config.ts +172 -0
  660. package/src/core/plan/statements.ts +22 -0
  661. package/src/core/plan/types.ts +171 -0
  662. package/src/core/postgres-config.ts +293 -0
  663. package/src/core/sort/custom-constraints.ts +161 -0
  664. package/src/core/sort/debug-visualization.ts +239 -0
  665. package/src/core/sort/dependency-filter.ts +224 -0
  666. package/src/core/sort/graph-builder.ts +235 -0
  667. package/src/core/sort/graph-utils.ts +51 -0
  668. package/src/core/sort/logical-sort.test.ts +371 -0
  669. package/src/core/sort/logical-sort.ts +597 -0
  670. package/src/core/sort/sort-changes.ts +234 -0
  671. package/src/core/sort/topological-sort.test.ts +275 -0
  672. package/src/core/sort/topological-sort.ts +184 -0
  673. package/src/core/sort/types.ts +112 -0
  674. package/src/core/sort/utils.ts +69 -0
  675. package/src/core/test-utils/assert-valid-sql.ts +20 -0
  676. package/src/index.ts +41 -0
  677. package/dist/core/index.d.ts +0 -15
  678. package/dist/core/index.js +0 -14
  679. package/dist/core/main.d.ts +0 -5
  680. package/dist/core/main.js +0 -44
@@ -0,0 +1,616 @@
1
+ import { describe, expect, test } from "bun:test";
2
+ import { formatSqlStatements } from "../sql-format.ts";
3
+
4
+ describe("stress tests", () => {
5
+ test("recursive CTE view with dollar identifiers and window functions", () => {
6
+ const sql = `CREATE OR REPLACE VIEW public."User-Stats (v2)" AS
7
+ /* This comment contains ;;; and 'quotes' and $dollar$ */
8
+ WITH RECURSIVE "cte$levels" AS (
9
+ SELECT
10
+ u.id,
11
+ u.parent_id,
12
+ 0 AS depth,
13
+ ARRAY[u.id] AS path
14
+ FROM public."user" u
15
+ WHERE u.parent_id IS NULL
16
+
17
+ UNION ALL
18
+
19
+ SELECT
20
+ c.id,
21
+ c.parent_id,
22
+ p.depth + 1,
23
+ p.path || c.id
24
+ FROM public."user" c
25
+ JOIN "cte$levels" p
26
+ ON p.id = c.parent_id
27
+ AND c.id <> ALL(p.path) -- prevent cycles
28
+ ),
29
+ json_expanded AS (
30
+ SELECT
31
+ u.id,
32
+ jsonb_each_text(
33
+ COALESCE(
34
+ u.metadata,
35
+ '{}'::jsonb
36
+ )
37
+ ) AS kv
38
+ FROM public."user" u
39
+ )
40
+ SELECT
41
+ l.id AS "userId",
42
+ l.depth AS "level",
43
+ COUNT(*) FILTER (WHERE e.kv.key = 'role') AS "role_count",
44
+ MAX(
45
+ CASE
46
+ WHEN e.kv.key = 'last_login'
47
+ THEN e.kv.value::timestamptz
48
+ ELSE NULL
49
+ END
50
+ ) OVER (PARTITION BY l.id) AS "lastLogin",
51
+ string_agg(
52
+ DISTINCT
53
+ format(
54
+ 'key="%s"; value="%s"',
55
+ replace(e.kv.key, '"', '\\"'),
56
+ replace(e.kv.value, '"', '\\"')
57
+ ),
58
+ E'\\n---\\n'
59
+ ORDER BY e.kv.key
60
+ ) AS "kv_dump",
61
+ now() AT TIME ZONE 'UTC' AS "computed_at"
62
+ FROM "cte$levels" l
63
+ LEFT JOIN json_expanded e
64
+ ON e.id = l.id
65
+ GROUP BY
66
+ l.id,
67
+ l.depth
68
+ HAVING
69
+ COUNT(*) > 0
70
+ ORDER BY
71
+ l.depth DESC,
72
+ "userId";`;
73
+
74
+ const [result] = formatSqlStatements([sql]);
75
+ expect(result).toMatchInlineSnapshot(`
76
+ "CREATE OR REPLACE VIEW public."User-Stats (v2)" AS
77
+ /* This comment contains ;;; and 'quotes' and $dollar$ */
78
+ WITH RECURSIVE "cte$levels" AS (
79
+ SELECT
80
+ u.id,
81
+ u.parent_id,
82
+ 0 AS depth,
83
+ ARRAY[u.id] AS path
84
+ FROM public."user" u
85
+ WHERE u.parent_id IS NULL
86
+
87
+ UNION ALL
88
+
89
+ SELECT
90
+ c.id,
91
+ c.parent_id,
92
+ p.depth + 1,
93
+ p.path || c.id
94
+ FROM public."user" c
95
+ JOIN "cte$levels" p
96
+ ON p.id = c.parent_id
97
+ AND c.id <> ALL(p.path) -- prevent cycles
98
+ ),
99
+ json_expanded AS (
100
+ SELECT
101
+ u.id,
102
+ jsonb_each_text(
103
+ COALESCE(
104
+ u.metadata,
105
+ '{}'::jsonb
106
+ )
107
+ ) AS kv
108
+ FROM public."user" u
109
+ )
110
+ SELECT
111
+ l.id AS "userId",
112
+ l.depth AS "level",
113
+ COUNT(*) FILTER (WHERE e.kv.key = 'role') AS "role_count",
114
+ MAX(
115
+ CASE
116
+ WHEN e.kv.key = 'last_login'
117
+ THEN e.kv.value::timestamptz
118
+ ELSE NULL
119
+ END
120
+ ) OVER (PARTITION BY l.id) AS "lastLogin",
121
+ string_agg(
122
+ DISTINCT
123
+ format(
124
+ 'key="%s"; value="%s"',
125
+ replace(e.kv.key, '"', '\\"'),
126
+ replace(e.kv.value, '"', '\\"')
127
+ ),
128
+ E'\\n---\\n'
129
+ ORDER BY e.kv.key
130
+ ) AS "kv_dump",
131
+ now() AT TIME ZONE 'UTC' AS "computed_at"
132
+ FROM "cte$levels" l
133
+ LEFT JOIN json_expanded e
134
+ ON e.id = l.id
135
+ GROUP BY
136
+ l.id,
137
+ l.depth
138
+ HAVING
139
+ COUNT(*) > 0
140
+ ORDER BY
141
+ l.depth DESC,
142
+ "userId""
143
+ `);
144
+ });
145
+
146
+ test("function with IN/OUT params, SECURITY DEFINER, SET, and nested dollar quoting", () => {
147
+ const sql = `CREATE OR REPLACE FUNCTION public."compute""Stats$Weird"(
148
+ IN p_user_id uuid,
149
+ IN p_opts jsonb DEFAULT '{"debug": false, "limit": 10}',
150
+ OUT result jsonb
151
+ )
152
+ RETURNS jsonb
153
+ LANGUAGE plpgsql VOLATILE SECURITY DEFINER
154
+ SET search_path =
155
+ public, pg_temp
156
+ AS $func$
157
+ DECLARE
158
+ v_sql text;
159
+ v_limit integer := COALESCE((p_opts ->> 'limit')::int, 10);
160
+ v_debug boolean := (p_opts ->> 'debug')::boolean;
161
+ v_row record;
162
+ v_payload jsonb := '{}'::jsonb;
163
+ BEGIN
164
+ v_sql := format($sql$
165
+ SELECT
166
+ u.id,
167
+ u.email,
168
+ jsonb_build_object(
169
+ 'roles', array_agg(DISTINCT r.name ORDER BY r.name),
170
+ 'created', u.created_at,
171
+ 'note', 'This string contains ''quotes'', $dollars$, and ; semicolons'
172
+ ) AS payload
173
+ FROM public."user" u
174
+ LEFT JOIN public.user_role ur ON ur.user_id = u.id
175
+ LEFT JOIN public."role" r ON r.id = ur.role_id
176
+ WHERE u.id = %L
177
+ GROUP BY u.id, u.email, u.created_at
178
+ LIMIT %s
179
+ $sql$, p_user_id, v_limit);
180
+
181
+ IF v_debug THEN
182
+ RAISE NOTICE E'Executing SQL:\\n%s', v_sql;
183
+ END IF;
184
+
185
+ FOR v_row IN EXECUTE v_sql
186
+ LOOP
187
+ v_payload :=
188
+ v_payload
189
+ || jsonb_build_object(
190
+ v_row.email,
191
+ jsonb_set(
192
+ v_row.payload,
193
+ '{computed_at}',
194
+ to_jsonb(clock_timestamp()),
195
+ true
196
+ )
197
+ );
198
+ END LOOP;
199
+
200
+ result := jsonb_build_object(
201
+ 'user_id', p_user_id,
202
+ 'data', v_payload,
203
+ 'meta', jsonb_build_object(
204
+ 'opts', p_opts,
205
+ 'row_count', jsonb_array_length(
206
+ COALESCE(
207
+ jsonb_path_query_array(
208
+ v_payload,
209
+ '$.*'
210
+ ),
211
+ '[]'::jsonb
212
+ )
213
+ )
214
+ )
215
+ );
216
+
217
+ RETURN;
218
+ EXCEPTION
219
+ WHEN division_by_zero OR undefined_function THEN
220
+ -- Totally unrelated exception, just to mess with parsers
221
+ result := jsonb_build_object(
222
+ 'error', SQLERRM,
223
+ 'state', SQLSTATE
224
+ );
225
+ RETURN;
226
+ END;
227
+ $func$;`;
228
+
229
+ const [result] = formatSqlStatements([sql]);
230
+ expect(result).toMatchInlineSnapshot(`
231
+ "CREATE OR REPLACE FUNCTION public."compute""Stats$Weird" (
232
+ IN p_user_id uuid,
233
+ IN p_opts jsonb DEFAULT '{"debug": false, "limit": 10}',
234
+ OUT result jsonb
235
+ )
236
+ RETURNS jsonb
237
+ LANGUAGE plpgsql
238
+ VOLATILE
239
+ SECURITY DEFINER
240
+ SET search_path =
241
+ public, pg_temp
242
+ AS $func$
243
+ DECLARE
244
+ v_sql text;
245
+ v_limit integer := COALESCE((p_opts ->> 'limit')::int, 10);
246
+ v_debug boolean := (p_opts ->> 'debug')::boolean;
247
+ v_row record;
248
+ v_payload jsonb := '{}'::jsonb;
249
+ BEGIN
250
+ v_sql := format($sql$
251
+ SELECT
252
+ u.id,
253
+ u.email,
254
+ jsonb_build_object(
255
+ 'roles', array_agg(DISTINCT r.name ORDER BY r.name),
256
+ 'created', u.created_at,
257
+ 'note', 'This string contains ''quotes'', $dollars$, and ; semicolons'
258
+ ) AS payload
259
+ FROM public."user" u
260
+ LEFT JOIN public.user_role ur ON ur.user_id = u.id
261
+ LEFT JOIN public."role" r ON r.id = ur.role_id
262
+ WHERE u.id = %L
263
+ GROUP BY u.id, u.email, u.created_at
264
+ LIMIT %s
265
+ $sql$, p_user_id, v_limit);
266
+
267
+ IF v_debug THEN
268
+ RAISE NOTICE E'Executing SQL:\\n%s', v_sql;
269
+ END IF;
270
+
271
+ FOR v_row IN EXECUTE v_sql
272
+ LOOP
273
+ v_payload :=
274
+ v_payload
275
+ || jsonb_build_object(
276
+ v_row.email,
277
+ jsonb_set(
278
+ v_row.payload,
279
+ '{computed_at}',
280
+ to_jsonb(clock_timestamp()),
281
+ true
282
+ )
283
+ );
284
+ END LOOP;
285
+
286
+ result := jsonb_build_object(
287
+ 'user_id', p_user_id,
288
+ 'data', v_payload,
289
+ 'meta', jsonb_build_object(
290
+ 'opts', p_opts,
291
+ 'row_count', jsonb_array_length(
292
+ COALESCE(
293
+ jsonb_path_query_array(
294
+ v_payload,
295
+ '$.*'
296
+ ),
297
+ '[]'::jsonb
298
+ )
299
+ )
300
+ )
301
+ );
302
+
303
+ RETURN;
304
+ EXCEPTION
305
+ WHEN division_by_zero OR undefined_function THEN
306
+ -- Totally unrelated exception, just to mess with parsers
307
+ result := jsonb_build_object(
308
+ 'error', SQLERRM,
309
+ 'state', SQLSTATE
310
+ );
311
+ RETURN;
312
+ END;
313
+ $func$"
314
+ `);
315
+ });
316
+
317
+ test("view with reserved word name, jsonb operators, CROSS JOIN LATERAL, WITH ORDINALITY", () => {
318
+ const sql = `CREATE VIEW public."select" AS
319
+ SELECT
320
+ t."from"::text COLLATE "C" AS "from_text",
321
+ t.val #>> '{a,b,c}' AS deep_value,
322
+ t.val ?& ARRAY['x', 'y', 'z'] AS has_all_keys,
323
+ t.val @> '{"nested": [1,2,3]}'::jsonb AS contains_array,
324
+ ln.ordinality AS idx,
325
+ ln.elem AS elem,
326
+ /* comment mid-expression */
327
+ (ln.elem::numeric / NULLIF(t.divisor, 0))::numeric(10,2) AS ratio
328
+ FROM (
329
+ SELECT
330
+ 42 AS "from",
331
+ '{"a":{"b":{"c":"ok"}},"x":1}'::jsonb AS val,
332
+ 0 AS divisor
333
+ ) t
334
+ CROSS JOIN LATERAL jsonb_array_elements_text(
335
+ '[ "1", "2", "3" ]'::jsonb
336
+ ) WITH ORDINALITY AS ln(elem, ordinality)
337
+ WHERE
338
+ t.val IS NOT NULL
339
+ AND (
340
+ ln.elem SIMILAR TO '[0-9]+'
341
+ OR ln.elem ~* E'^[a-z]+'
342
+ )
343
+ ORDER BY
344
+ idx DESC NULLS LAST;`;
345
+
346
+ const [result] = formatSqlStatements([sql]);
347
+ expect(result).toMatchInlineSnapshot(`
348
+ "CREATE VIEW public."select" AS
349
+ SELECT
350
+ t."from"::text COLLATE "C" AS "from_text",
351
+ t.val #>> '{a,b,c}' AS deep_value,
352
+ t.val ?& ARRAY['x', 'y', 'z'] AS has_all_keys,
353
+ t.val @> '{"nested": [1,2,3]}'::jsonb AS contains_array,
354
+ ln.ordinality AS idx,
355
+ ln.elem AS elem,
356
+ /* comment mid-expression */
357
+ (ln.elem::numeric / NULLIF(t.divisor, 0))::numeric(10,2) AS ratio
358
+ FROM (
359
+ SELECT
360
+ 42 AS "from",
361
+ '{"a":{"b":{"c":"ok"}},"x":1}'::jsonb AS val,
362
+ 0 AS divisor
363
+ ) t
364
+ CROSS JOIN LATERAL jsonb_array_elements_text(
365
+ '[ "1", "2", "3" ]'::jsonb
366
+ ) WITH ORDINALITY AS ln(elem, ordinality)
367
+ WHERE
368
+ t.val IS NOT NULL
369
+ AND (
370
+ ln.elem SIMILAR TO '[0-9]+'
371
+ OR ln.elem ~* E'^[a-z]+'
372
+ )
373
+ ORDER BY
374
+ idx DESC NULLS LAST"
375
+ `);
376
+ });
377
+
378
+ test("function with OUT params, RETURNS SETOF RECORD, RAISE EXCEPTION USING", () => {
379
+ const sql = `CREATE OR REPLACE FUNCTION public.get_everything_weird(
380
+ p_input text,
381
+ OUT a int,
382
+ OUT b text,
383
+ OUT c timestamptz
384
+ )
385
+ RETURNS SETOF RECORD
386
+ LANGUAGE plpgsql
387
+ AS $$
388
+ BEGIN
389
+ RETURN QUERY
390
+ SELECT
391
+ generate_series(1, length(p_input)) AS a,
392
+ substr(p_input, 1, generate_series) AS b,
393
+ now() + (generate_series || ' seconds')::interval
394
+ FROM generate_series(1, length(p_input));
395
+
396
+ -- unreachable but legal
397
+ IF false THEN
398
+ RAISE EXCEPTION USING
399
+ MESSAGE = 'never happens',
400
+ DETAIL = format('input=%L', p_input),
401
+ HINT = 'this is just here to hurt';
402
+ END IF;
403
+ END;
404
+ $$;`;
405
+
406
+ const [result] = formatSqlStatements([sql]);
407
+ expect(result).toMatchInlineSnapshot(`
408
+ "CREATE OR REPLACE FUNCTION public.get_everything_weird (
409
+ p_input text,
410
+ OUT a int,
411
+ OUT b text,
412
+ OUT c timestamptz
413
+ )
414
+ RETURNS SETOF RECORD
415
+ LANGUAGE plpgsql
416
+ AS $$
417
+ BEGIN
418
+ RETURN QUERY
419
+ SELECT
420
+ generate_series(1, length(p_input)) AS a,
421
+ substr(p_input, 1, generate_series) AS b,
422
+ now() + (generate_series || ' seconds')::interval
423
+ FROM generate_series(1, length(p_input));
424
+
425
+ -- unreachable but legal
426
+ IF false THEN
427
+ RAISE EXCEPTION USING
428
+ MESSAGE = 'never happens',
429
+ DETAIL = format('input=%L', p_input),
430
+ HINT = 'this is just here to hurt';
431
+ END IF;
432
+ END;
433
+ $$"
434
+ `);
435
+ });
436
+
437
+ test("function with triple-nested dollar quoting and dynamic SQL", () => {
438
+ const sql = `CREATE OR REPLACE FUNCTION public.execception(
439
+ p_table regclass
440
+ )
441
+ RETURNS void
442
+ LANGUAGE plpgsql
443
+ AS $outer$
444
+ DECLARE
445
+ v text;
446
+ BEGIN
447
+ v := format($inner$
448
+ DO $do$
449
+ BEGIN
450
+ EXECUTE format(
451
+ 'INSERT INTO %s VALUES (''%%s'', now())',
452
+ %L
453
+ ) USING 'payload with ''quotes'' and $dollars';
454
+ END;
455
+ $do$;
456
+ $inner$, p_table);
457
+
458
+ EXECUTE v;
459
+ END;
460
+ $outer$;`;
461
+
462
+ const [result] = formatSqlStatements([sql]);
463
+ expect(result).toMatchInlineSnapshot(`
464
+ "CREATE OR REPLACE FUNCTION public.execception (
465
+ p_table regclass
466
+ )
467
+ RETURNS void
468
+ LANGUAGE plpgsql
469
+ AS $outer$
470
+ DECLARE
471
+ v text;
472
+ BEGIN
473
+ v := format($inner$
474
+ DO $do$
475
+ BEGIN
476
+ EXECUTE format(
477
+ 'INSERT INTO %s VALUES (''%%s'', now())',
478
+ %L
479
+ ) USING 'payload with ''quotes'' and $dollars';
480
+ END;
481
+ $do$;
482
+ $inner$, p_table);
483
+
484
+ EXECUTE v;
485
+ END;
486
+ $outer$"
487
+ `);
488
+ });
489
+
490
+ test("view with DISTINCT ON, WINDOW clause, and INTERVAL frame", () => {
491
+ const sql = `CREATE VIEW public."analytics::daily" AS
492
+ SELECT DISTINCT ON (user_id)
493
+ user_id,
494
+ event,
495
+ created_at,
496
+ COUNT(*) FILTER (WHERE event = 'login')
497
+ OVER w AS login_count,
498
+ SUM(value) OVER (
499
+ PARTITION BY user_id
500
+ ORDER BY created_at
501
+ ROWS BETWEEN UNBOUNDED PRECEDING
502
+ AND CURRENT ROW
503
+ ) AS running_total
504
+ FROM public.events
505
+ WINDOW w AS (
506
+ PARTITION BY user_id
507
+ ORDER BY created_at
508
+ RANGE BETWEEN INTERVAL '7 days' PRECEDING
509
+ AND CURRENT ROW
510
+ )
511
+ ORDER BY
512
+ user_id,
513
+ created_at DESC;`;
514
+
515
+ const [result] = formatSqlStatements([sql]);
516
+ expect(result).toMatchInlineSnapshot(`
517
+ "CREATE VIEW public."analytics::daily" AS
518
+ SELECT DISTINCT ON (user_id)
519
+ user_id,
520
+ event,
521
+ created_at,
522
+ COUNT(*) FILTER (WHERE event = 'login')
523
+ OVER w AS login_count,
524
+ SUM(value) OVER (
525
+ PARTITION BY user_id
526
+ ORDER BY created_at
527
+ ROWS BETWEEN UNBOUNDED PRECEDING
528
+ AND CURRENT ROW
529
+ ) AS running_total
530
+ FROM public.events
531
+ WINDOW w AS (
532
+ PARTITION BY user_id
533
+ ORDER BY created_at
534
+ RANGE BETWEEN INTERVAL '7 days' PRECEDING
535
+ AND CURRENT ROW
536
+ )
537
+ ORDER BY
538
+ user_id,
539
+ created_at DESC"
540
+ `);
541
+ });
542
+
543
+ test("view with operator soup, IS DISTINCT FROM NULL, nested subquery", () => {
544
+ const sql = `CREATE VIEW public.operator_soup AS
545
+ SELECT
546
+ ((((a + b)::numeric ^ 2) /|/ c)::float8 AT TIME ZONE 'UTC')
547
+ IS DISTINCT FROM NULL AS meaning_of_life
548
+ FROM (
549
+ SELECT
550
+ 1 AS a,
551
+ 2 AS b,
552
+ 3 AS c
553
+ ) s;`;
554
+
555
+ const [result] = formatSqlStatements([sql]);
556
+ expect(result).toMatchInlineSnapshot(`
557
+ "CREATE VIEW public.operator_soup AS
558
+ SELECT
559
+ ((((a + b)::numeric ^ 2) /|/ c)::float8 AT TIME ZONE 'UTC')
560
+ IS DISTINCT FROM NULL AS meaning_of_life
561
+ FROM (
562
+ SELECT
563
+ 1 AS a,
564
+ 2 AS b,
565
+ 3 AS c
566
+ ) s"
567
+ `);
568
+ });
569
+
570
+ test("trigger function with $ in name, IS DISTINCT FROM, jsonb_set", () => {
571
+ const sql = `CREATE OR REPLACE FUNCTION public.trigger$logic()
572
+ RETURNS trigger
573
+ LANGUAGE plpgsql
574
+ AS $$
575
+ BEGIN
576
+ IF TG_OP IN ('INSERT', 'UPDATE')
577
+ AND NEW."order" IS DISTINCT FROM OLD."order"
578
+ THEN
579
+ NEW.audit := jsonb_set(
580
+ COALESCE(NEW.audit, '{}'::jsonb),
581
+ ARRAY['changed_at'],
582
+ to_jsonb(clock_timestamp()),
583
+ true
584
+ );
585
+ END IF;
586
+
587
+ -- RETURN NULL is valid in AFTER triggers
588
+ RETURN NEW;
589
+ END;
590
+ $$;`;
591
+
592
+ const [result] = formatSqlStatements([sql]);
593
+ expect(result).toMatchInlineSnapshot(`
594
+ "CREATE OR REPLACE FUNCTION public.trigger$logic()
595
+ RETURNS trigger
596
+ LANGUAGE plpgsql
597
+ AS $$
598
+ BEGIN
599
+ IF TG_OP IN ('INSERT', 'UPDATE')
600
+ AND NEW."order" IS DISTINCT FROM OLD."order"
601
+ THEN
602
+ NEW.audit := jsonb_set(
603
+ COALESCE(NEW.audit, '{}'::jsonb),
604
+ ARRAY['changed_at'],
605
+ to_jsonb(clock_timestamp()),
606
+ true
607
+ );
608
+ END IF;
609
+
610
+ -- RETURN NULL is valid in AFTER triggers
611
+ RETURN NEW;
612
+ END;
613
+ $$"
614
+ `);
615
+ });
616
+ });
@@ -0,0 +1,91 @@
1
+ import { describe, expect, it } from "bun:test";
2
+ import { DEFAULT_OPTIONS } from "./constants.ts";
3
+ import {
4
+ formatColumnList,
5
+ formatKeyValueItems,
6
+ formatListItems,
7
+ indentString,
8
+ splitLeadingComments,
9
+ splitSqlStatements,
10
+ } from "./format-utils.ts";
11
+
12
+ describe("splitSqlStatements", () => {
13
+ it("splits by semicolons", () => {
14
+ const result = splitSqlStatements("SELECT 1;SELECT 2");
15
+ expect(result).toEqual(["SELECT 1", "SELECT 2"]);
16
+ });
17
+
18
+ it("ignores semicolons inside quotes", () => {
19
+ const result = splitSqlStatements("SELECT ';' FROM foo");
20
+ expect(result).toEqual(["SELECT ';' FROM foo"]);
21
+ });
22
+
23
+ it("ignores semicolons inside comments", () => {
24
+ const result = splitSqlStatements("SELECT 1 -- semi; here\nFROM foo");
25
+ expect(result).toEqual(["SELECT 1 -- semi; here\nFROM foo"]);
26
+ });
27
+ });
28
+
29
+ describe("splitLeadingComments", () => {
30
+ it("separates leading comment lines from body", () => {
31
+ const input = "-- comment\n-- another\nSELECT 1";
32
+ const result = splitLeadingComments(input);
33
+ expect(result.commentLines).toEqual(["-- comment", "-- another"]);
34
+ expect(result.body).toBe("SELECT 1");
35
+ });
36
+
37
+ it("returns empty commentLines when no comments", () => {
38
+ const result = splitLeadingComments("SELECT 1");
39
+ expect(result.commentLines).toEqual([]);
40
+ expect(result.body).toBe("SELECT 1");
41
+ });
42
+ });
43
+
44
+ describe("formatColumnList", () => {
45
+ it("formats column definitions with alignment", () => {
46
+ const content = "id integer, name text, description varchar(255)";
47
+ const result = formatColumnList(content, DEFAULT_OPTIONS);
48
+ expect(result).not.toBeNull();
49
+ expect(result?.length).toBe(3);
50
+ // Each line should be indented
51
+ for (const line of result ?? []) {
52
+ expect(line).toMatch(/^\s+/);
53
+ }
54
+ });
55
+
56
+ it("returns null for empty content", () => {
57
+ expect(formatColumnList("", DEFAULT_OPTIONS)).toBeNull();
58
+ });
59
+ });
60
+
61
+ describe("formatKeyValueItems", () => {
62
+ it("formats key=value items with alignment", () => {
63
+ const items = ["a = 1", "long_key = 2"];
64
+ const result = formatKeyValueItems(items, DEFAULT_OPTIONS);
65
+ expect(result.length).toBe(2);
66
+ // Both should be indented
67
+ for (const line of result) {
68
+ expect(line).toMatch(/^\s+/);
69
+ }
70
+ });
71
+ });
72
+
73
+ describe("formatListItems", () => {
74
+ it("applies trailing comma style", () => {
75
+ const result = formatListItems(["a", "b", "c"], " ", "trailing");
76
+ expect(result).toEqual([" a,", " b,", " c"]);
77
+ });
78
+
79
+ it("applies leading comma style", () => {
80
+ const result = formatListItems(["a", "b", "c"], " ", "leading");
81
+ expect(result).toEqual([" a", " , b", " , c"]);
82
+ });
83
+ });
84
+
85
+ describe("indentString", () => {
86
+ it("returns correct number of spaces", () => {
87
+ expect(indentString(0)).toBe("");
88
+ expect(indentString(2)).toBe(" ");
89
+ expect(indentString(4)).toBe(" ");
90
+ });
91
+ });