@subsquid/ponder 0.15.17-sqd.1

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 (654) hide show
  1. package/CHANGELOG.md +3386 -0
  2. package/README.md +186 -0
  3. package/dist/esm/bin/commands/codegen.js +46 -0
  4. package/dist/esm/bin/commands/codegen.js.map +1 -0
  5. package/dist/esm/bin/commands/createViews.js +196 -0
  6. package/dist/esm/bin/commands/createViews.js.map +1 -0
  7. package/dist/esm/bin/commands/dev.js +430 -0
  8. package/dist/esm/bin/commands/dev.js.map +1 -0
  9. package/dist/esm/bin/commands/list.js +148 -0
  10. package/dist/esm/bin/commands/list.js.map +1 -0
  11. package/dist/esm/bin/commands/prune.js +224 -0
  12. package/dist/esm/bin/commands/prune.js.map +1 -0
  13. package/dist/esm/bin/commands/serve.js +198 -0
  14. package/dist/esm/bin/commands/serve.js.map +1 -0
  15. package/dist/esm/bin/commands/start.js +253 -0
  16. package/dist/esm/bin/commands/start.js.map +1 -0
  17. package/dist/esm/bin/isolatedController.js +200 -0
  18. package/dist/esm/bin/isolatedController.js.map +1 -0
  19. package/dist/esm/bin/isolatedWorker.js +146 -0
  20. package/dist/esm/bin/isolatedWorker.js.map +1 -0
  21. package/dist/esm/bin/ponder.js +137 -0
  22. package/dist/esm/bin/ponder.js.map +1 -0
  23. package/dist/esm/bin/utils/codegen.js +25 -0
  24. package/dist/esm/bin/utils/codegen.js.map +1 -0
  25. package/dist/esm/bin/utils/exit.js +100 -0
  26. package/dist/esm/bin/utils/exit.js.map +1 -0
  27. package/dist/esm/build/config.js +743 -0
  28. package/dist/esm/build/config.js.map +1 -0
  29. package/dist/esm/build/factory.js +76 -0
  30. package/dist/esm/build/factory.js.map +1 -0
  31. package/dist/esm/build/index.js +538 -0
  32. package/dist/esm/build/index.js.map +1 -0
  33. package/dist/esm/build/plugin.js +53 -0
  34. package/dist/esm/build/plugin.js.map +1 -0
  35. package/dist/esm/build/pre.js +76 -0
  36. package/dist/esm/build/pre.js.map +1 -0
  37. package/dist/esm/build/schema.js +164 -0
  38. package/dist/esm/build/schema.js.map +1 -0
  39. package/dist/esm/build/stacktrace.js +137 -0
  40. package/dist/esm/build/stacktrace.js.map +1 -0
  41. package/dist/esm/client/index.js +441 -0
  42. package/dist/esm/client/index.js.map +1 -0
  43. package/dist/esm/config/address.js +2 -0
  44. package/dist/esm/config/address.js.map +1 -0
  45. package/dist/esm/config/eventFilter.js +2 -0
  46. package/dist/esm/config/eventFilter.js.map +1 -0
  47. package/dist/esm/config/index.js +2 -0
  48. package/dist/esm/config/index.js.map +1 -0
  49. package/dist/esm/config/utilityTypes.js +2 -0
  50. package/dist/esm/config/utilityTypes.js.map +1 -0
  51. package/dist/esm/database/actions.js +445 -0
  52. package/dist/esm/database/actions.js.map +1 -0
  53. package/dist/esm/database/index.js +597 -0
  54. package/dist/esm/database/index.js.map +1 -0
  55. package/dist/esm/database/queryBuilder.js +310 -0
  56. package/dist/esm/database/queryBuilder.js.map +1 -0
  57. package/dist/esm/drizzle/bigint.js +38 -0
  58. package/dist/esm/drizzle/bigint.js.map +1 -0
  59. package/dist/esm/drizzle/bytes.js +47 -0
  60. package/dist/esm/drizzle/bytes.js.map +1 -0
  61. package/dist/esm/drizzle/hex.js +40 -0
  62. package/dist/esm/drizzle/hex.js.map +1 -0
  63. package/dist/esm/drizzle/index.js +40 -0
  64. package/dist/esm/drizzle/index.js.map +1 -0
  65. package/dist/esm/drizzle/json.js +119 -0
  66. package/dist/esm/drizzle/json.js.map +1 -0
  67. package/dist/esm/drizzle/kit/index.js +928 -0
  68. package/dist/esm/drizzle/kit/index.js.map +1 -0
  69. package/dist/esm/drizzle/onchain.js +158 -0
  70. package/dist/esm/drizzle/onchain.js.map +1 -0
  71. package/dist/esm/drizzle/text.js +61 -0
  72. package/dist/esm/drizzle/text.js.map +1 -0
  73. package/dist/esm/graphql/graphiql.html.js +59 -0
  74. package/dist/esm/graphql/graphiql.html.js.map +1 -0
  75. package/dist/esm/graphql/index.js +916 -0
  76. package/dist/esm/graphql/index.js.map +1 -0
  77. package/dist/esm/graphql/json.js +42 -0
  78. package/dist/esm/graphql/json.js.map +1 -0
  79. package/dist/esm/graphql/middleware.js +78 -0
  80. package/dist/esm/graphql/middleware.js.map +1 -0
  81. package/dist/esm/index.js +9 -0
  82. package/dist/esm/index.js.map +1 -0
  83. package/dist/esm/indexing/addStackTrace.js +54 -0
  84. package/dist/esm/indexing/addStackTrace.js.map +1 -0
  85. package/dist/esm/indexing/client.js +675 -0
  86. package/dist/esm/indexing/client.js.map +1 -0
  87. package/dist/esm/indexing/index.js +652 -0
  88. package/dist/esm/indexing/index.js.map +1 -0
  89. package/dist/esm/indexing/profile.js +584 -0
  90. package/dist/esm/indexing/profile.js.map +1 -0
  91. package/dist/esm/indexing-store/cache.js +665 -0
  92. package/dist/esm/indexing-store/cache.js.map +1 -0
  93. package/dist/esm/indexing-store/historical.js +427 -0
  94. package/dist/esm/indexing-store/historical.js.map +1 -0
  95. package/dist/esm/indexing-store/index.js +35 -0
  96. package/dist/esm/indexing-store/index.js.map +1 -0
  97. package/dist/esm/indexing-store/profile.js +428 -0
  98. package/dist/esm/indexing-store/profile.js.map +1 -0
  99. package/dist/esm/indexing-store/realtime.js +305 -0
  100. package/dist/esm/indexing-store/realtime.js.map +1 -0
  101. package/dist/esm/indexing-store/utils.js +111 -0
  102. package/dist/esm/indexing-store/utils.js.map +1 -0
  103. package/dist/esm/internal/common.js +2 -0
  104. package/dist/esm/internal/common.js.map +1 -0
  105. package/dist/esm/internal/errors.js +300 -0
  106. package/dist/esm/internal/errors.js.map +1 -0
  107. package/dist/esm/internal/logger.js +178 -0
  108. package/dist/esm/internal/logger.js.map +1 -0
  109. package/dist/esm/internal/metrics.js +1046 -0
  110. package/dist/esm/internal/metrics.js.map +1 -0
  111. package/dist/esm/internal/options.js +73 -0
  112. package/dist/esm/internal/options.js.map +1 -0
  113. package/dist/esm/internal/shutdown.js +24 -0
  114. package/dist/esm/internal/shutdown.js.map +1 -0
  115. package/dist/esm/internal/telemetry.js +200 -0
  116. package/dist/esm/internal/telemetry.js.map +1 -0
  117. package/dist/esm/internal/types.js +2 -0
  118. package/dist/esm/internal/types.js.map +1 -0
  119. package/dist/esm/rpc/actions.js +988 -0
  120. package/dist/esm/rpc/actions.js.map +1 -0
  121. package/dist/esm/rpc/http.js +130 -0
  122. package/dist/esm/rpc/http.js.map +1 -0
  123. package/dist/esm/rpc/index.js +749 -0
  124. package/dist/esm/rpc/index.js.map +1 -0
  125. package/dist/esm/runtime/events.js +664 -0
  126. package/dist/esm/runtime/events.js.map +1 -0
  127. package/dist/esm/runtime/filter.js +443 -0
  128. package/dist/esm/runtime/filter.js.map +1 -0
  129. package/dist/esm/runtime/fragments.js +478 -0
  130. package/dist/esm/runtime/fragments.js.map +1 -0
  131. package/dist/esm/runtime/historical.js +985 -0
  132. package/dist/esm/runtime/historical.js.map +1 -0
  133. package/dist/esm/runtime/index.js +325 -0
  134. package/dist/esm/runtime/index.js.map +1 -0
  135. package/dist/esm/runtime/init.js +12 -0
  136. package/dist/esm/runtime/init.js.map +1 -0
  137. package/dist/esm/runtime/isolated.js +463 -0
  138. package/dist/esm/runtime/isolated.js.map +1 -0
  139. package/dist/esm/runtime/multichain.js +509 -0
  140. package/dist/esm/runtime/multichain.js.map +1 -0
  141. package/dist/esm/runtime/omnichain.js +544 -0
  142. package/dist/esm/runtime/omnichain.js.map +1 -0
  143. package/dist/esm/runtime/realtime.js +733 -0
  144. package/dist/esm/runtime/realtime.js.map +1 -0
  145. package/dist/esm/server/error.js +56 -0
  146. package/dist/esm/server/error.js.map +1 -0
  147. package/dist/esm/server/index.js +121 -0
  148. package/dist/esm/server/index.js.map +1 -0
  149. package/dist/esm/sync-historical/index.js +701 -0
  150. package/dist/esm/sync-historical/index.js.map +1 -0
  151. package/dist/esm/sync-historical/portal-realtime-wire.js +302 -0
  152. package/dist/esm/sync-historical/portal-realtime-wire.js.map +1 -0
  153. package/dist/esm/sync-historical/portal-realtime.js +154 -0
  154. package/dist/esm/sync-historical/portal-realtime.js.map +1 -0
  155. package/dist/esm/sync-historical/portal-transform.js +113 -0
  156. package/dist/esm/sync-historical/portal-transform.js.map +1 -0
  157. package/dist/esm/sync-historical/portal.js +949 -0
  158. package/dist/esm/sync-historical/portal.js.map +1 -0
  159. package/dist/esm/sync-historical/realtime.js +127 -0
  160. package/dist/esm/sync-historical/realtime.js.map +1 -0
  161. package/dist/esm/sync-realtime/bloom.js +76 -0
  162. package/dist/esm/sync-realtime/bloom.js.map +1 -0
  163. package/dist/esm/sync-realtime/index.js +917 -0
  164. package/dist/esm/sync-realtime/index.js.map +1 -0
  165. package/dist/esm/sync-store/encode.js +105 -0
  166. package/dist/esm/sync-store/encode.js.map +1 -0
  167. package/dist/esm/sync-store/index.js +885 -0
  168. package/dist/esm/sync-store/index.js.map +1 -0
  169. package/dist/esm/sync-store/migrations.js +1595 -0
  170. package/dist/esm/sync-store/migrations.js.map +1 -0
  171. package/dist/esm/sync-store/schema.js +181 -0
  172. package/dist/esm/sync-store/schema.js.map +1 -0
  173. package/dist/esm/types/db.js +2 -0
  174. package/dist/esm/types/db.js.map +1 -0
  175. package/dist/esm/types/eth.js +2 -0
  176. package/dist/esm/types/eth.js.map +1 -0
  177. package/dist/esm/types/utils.js +2 -0
  178. package/dist/esm/types/utils.js.map +1 -0
  179. package/dist/esm/types/virtual.js +2 -0
  180. package/dist/esm/types/virtual.js.map +1 -0
  181. package/dist/esm/ui/app.js +157 -0
  182. package/dist/esm/ui/app.js.map +1 -0
  183. package/dist/esm/ui/index.js +29 -0
  184. package/dist/esm/ui/index.js.map +1 -0
  185. package/dist/esm/ui/patch.js +103 -0
  186. package/dist/esm/ui/patch.js.map +1 -0
  187. package/dist/esm/utils/abi.js +55 -0
  188. package/dist/esm/utils/abi.js.map +1 -0
  189. package/dist/esm/utils/bigint.js +37 -0
  190. package/dist/esm/utils/bigint.js.map +1 -0
  191. package/dist/esm/utils/chains.js +21 -0
  192. package/dist/esm/utils/chains.js.map +1 -0
  193. package/dist/esm/utils/checkpoint.js +139 -0
  194. package/dist/esm/utils/checkpoint.js.map +1 -0
  195. package/dist/esm/utils/chunk.js +8 -0
  196. package/dist/esm/utils/chunk.js.map +1 -0
  197. package/dist/esm/utils/copy.js +129 -0
  198. package/dist/esm/utils/copy.js.map +1 -0
  199. package/dist/esm/utils/date.js +27 -0
  200. package/dist/esm/utils/date.js.map +1 -0
  201. package/dist/esm/utils/debug.js +2 -0
  202. package/dist/esm/utils/debug.js.map +1 -0
  203. package/dist/esm/utils/decodeAbiParameters.js +290 -0
  204. package/dist/esm/utils/decodeAbiParameters.js.map +1 -0
  205. package/dist/esm/utils/decodeEventLog.js +75 -0
  206. package/dist/esm/utils/decodeEventLog.js.map +1 -0
  207. package/dist/esm/utils/dedupe.js +29 -0
  208. package/dist/esm/utils/dedupe.js.map +1 -0
  209. package/dist/esm/utils/duplicates.js +19 -0
  210. package/dist/esm/utils/duplicates.js.map +1 -0
  211. package/dist/esm/utils/estimate.js +6 -0
  212. package/dist/esm/utils/estimate.js.map +1 -0
  213. package/dist/esm/utils/finality.js +38 -0
  214. package/dist/esm/utils/finality.js.map +1 -0
  215. package/dist/esm/utils/format.js +20 -0
  216. package/dist/esm/utils/format.js.map +1 -0
  217. package/dist/esm/utils/generators.js +121 -0
  218. package/dist/esm/utils/generators.js.map +1 -0
  219. package/dist/esm/utils/hash.js +11 -0
  220. package/dist/esm/utils/hash.js.map +1 -0
  221. package/dist/esm/utils/interval.js +171 -0
  222. package/dist/esm/utils/interval.js.map +1 -0
  223. package/dist/esm/utils/lowercase.js +7 -0
  224. package/dist/esm/utils/lowercase.js.map +1 -0
  225. package/dist/esm/utils/mutex.js +26 -0
  226. package/dist/esm/utils/mutex.js.map +1 -0
  227. package/dist/esm/utils/never.js +4 -0
  228. package/dist/esm/utils/never.js.map +1 -0
  229. package/dist/esm/utils/offset.js +101 -0
  230. package/dist/esm/utils/offset.js.map +1 -0
  231. package/dist/esm/utils/order.js +18 -0
  232. package/dist/esm/utils/order.js.map +1 -0
  233. package/dist/esm/utils/partition.js +46 -0
  234. package/dist/esm/utils/partition.js.map +1 -0
  235. package/dist/esm/utils/pg.js +149 -0
  236. package/dist/esm/utils/pg.js.map +1 -0
  237. package/dist/esm/utils/pglite.js +80 -0
  238. package/dist/esm/utils/pglite.js.map +1 -0
  239. package/dist/esm/utils/port.js +30 -0
  240. package/dist/esm/utils/port.js.map +1 -0
  241. package/dist/esm/utils/print.js +23 -0
  242. package/dist/esm/utils/print.js.map +1 -0
  243. package/dist/esm/utils/promiseAllSettledWithThrow.js +19 -0
  244. package/dist/esm/utils/promiseAllSettledWithThrow.js.map +1 -0
  245. package/dist/esm/utils/promiseWithResolvers.js +13 -0
  246. package/dist/esm/utils/promiseWithResolvers.js.map +1 -0
  247. package/dist/esm/utils/queue.js +150 -0
  248. package/dist/esm/utils/queue.js.map +1 -0
  249. package/dist/esm/utils/range.js +8 -0
  250. package/dist/esm/utils/range.js.map +1 -0
  251. package/dist/esm/utils/result.js +10 -0
  252. package/dist/esm/utils/result.js.map +1 -0
  253. package/dist/esm/utils/sql-parse.js +1326 -0
  254. package/dist/esm/utils/sql-parse.js.map +1 -0
  255. package/dist/esm/utils/timer.js +9 -0
  256. package/dist/esm/utils/timer.js.map +1 -0
  257. package/dist/esm/utils/truncate.js +15 -0
  258. package/dist/esm/utils/truncate.js.map +1 -0
  259. package/dist/esm/utils/wait.js +10 -0
  260. package/dist/esm/utils/wait.js.map +1 -0
  261. package/dist/esm/utils/zipper.js +67 -0
  262. package/dist/esm/utils/zipper.js.map +1 -0
  263. package/dist/types/bin/commands/codegen.d.ts +5 -0
  264. package/dist/types/bin/commands/codegen.d.ts.map +1 -0
  265. package/dist/types/bin/commands/createViews.d.ts +8 -0
  266. package/dist/types/bin/commands/createViews.d.ts.map +1 -0
  267. package/dist/types/bin/commands/dev.d.ts +5 -0
  268. package/dist/types/bin/commands/dev.d.ts.map +1 -0
  269. package/dist/types/bin/commands/list.d.ts +5 -0
  270. package/dist/types/bin/commands/list.d.ts.map +1 -0
  271. package/dist/types/bin/commands/prune.d.ts +5 -0
  272. package/dist/types/bin/commands/prune.d.ts.map +1 -0
  273. package/dist/types/bin/commands/serve.d.ts +5 -0
  274. package/dist/types/bin/commands/serve.d.ts.map +1 -0
  275. package/dist/types/bin/commands/start.d.ts +19 -0
  276. package/dist/types/bin/commands/start.d.ts.map +1 -0
  277. package/dist/types/bin/isolatedController.d.ts +13 -0
  278. package/dist/types/bin/isolatedController.d.ts.map +1 -0
  279. package/dist/types/bin/isolatedWorker.d.ts +9 -0
  280. package/dist/types/bin/isolatedWorker.d.ts.map +1 -0
  281. package/dist/types/bin/ponder.d.ts +37 -0
  282. package/dist/types/bin/ponder.d.ts.map +1 -0
  283. package/dist/types/bin/utils/codegen.d.ts +6 -0
  284. package/dist/types/bin/utils/codegen.d.ts.map +1 -0
  285. package/dist/types/bin/utils/exit.d.ts +10 -0
  286. package/dist/types/bin/utils/exit.d.ts.map +1 -0
  287. package/dist/types/build/config.d.ts +97 -0
  288. package/dist/types/build/config.d.ts.map +1 -0
  289. package/dist/types/build/factory.d.ts +13 -0
  290. package/dist/types/build/factory.d.ts.map +1 -0
  291. package/dist/types/build/index.d.ts +84 -0
  292. package/dist/types/build/index.d.ts.map +1 -0
  293. package/dist/types/build/plugin.d.ts +4 -0
  294. package/dist/types/build/plugin.d.ts.map +1 -0
  295. package/dist/types/build/pre.d.ts +26 -0
  296. package/dist/types/build/pre.d.ts.map +1 -0
  297. package/dist/types/build/schema.d.ts +20 -0
  298. package/dist/types/build/schema.d.ts.map +1 -0
  299. package/dist/types/build/stacktrace.d.ts +13 -0
  300. package/dist/types/build/stacktrace.d.ts.map +1 -0
  301. package/dist/types/client/index.d.ts +27 -0
  302. package/dist/types/client/index.d.ts.map +1 -0
  303. package/dist/types/config/address.d.ts +24 -0
  304. package/dist/types/config/address.d.ts.map +1 -0
  305. package/dist/types/config/eventFilter.d.ts +18 -0
  306. package/dist/types/config/eventFilter.d.ts.map +1 -0
  307. package/dist/types/config/index.d.ts +149 -0
  308. package/dist/types/config/index.d.ts.map +1 -0
  309. package/dist/types/config/utilityTypes.d.ts +43 -0
  310. package/dist/types/config/utilityTypes.d.ts.map +1 -0
  311. package/dist/types/database/actions.d.ts +99 -0
  312. package/dist/types/database/actions.d.ts.map +1 -0
  313. package/dist/types/database/index.d.ts +481 -0
  314. package/dist/types/database/index.d.ts.map +1 -0
  315. package/dist/types/database/queryBuilder.d.ts +65 -0
  316. package/dist/types/database/queryBuilder.d.ts.map +1 -0
  317. package/dist/types/drizzle/bigint.d.ts +25 -0
  318. package/dist/types/drizzle/bigint.d.ts.map +1 -0
  319. package/dist/types/drizzle/bytes.d.ts +31 -0
  320. package/dist/types/drizzle/bytes.d.ts.map +1 -0
  321. package/dist/types/drizzle/hex.d.ts +25 -0
  322. package/dist/types/drizzle/hex.d.ts.map +1 -0
  323. package/dist/types/drizzle/index.d.ts +10 -0
  324. package/dist/types/drizzle/index.d.ts.map +1 -0
  325. package/dist/types/drizzle/json.d.ts +51 -0
  326. package/dist/types/drizzle/json.d.ts.map +1 -0
  327. package/dist/types/drizzle/kit/index.d.ts +189 -0
  328. package/dist/types/drizzle/kit/index.d.ts.map +1 -0
  329. package/dist/types/drizzle/onchain.d.ts +287 -0
  330. package/dist/types/drizzle/onchain.d.ts.map +1 -0
  331. package/dist/types/drizzle/text.d.ts +29 -0
  332. package/dist/types/drizzle/text.d.ts.map +1 -0
  333. package/dist/types/graphql/graphiql.html.d.ts +2 -0
  334. package/dist/types/graphql/graphiql.html.d.ts.map +1 -0
  335. package/dist/types/graphql/index.d.ts +12 -0
  336. package/dist/types/graphql/index.d.ts.map +1 -0
  337. package/dist/types/graphql/json.d.ts +3 -0
  338. package/dist/types/graphql/json.d.ts.map +1 -0
  339. package/dist/types/graphql/middleware.d.ts +29 -0
  340. package/dist/types/graphql/middleware.d.ts.map +1 -0
  341. package/dist/types/index.d.ts +23 -0
  342. package/dist/types/index.d.ts.map +1 -0
  343. package/dist/types/indexing/addStackTrace.d.ts +3 -0
  344. package/dist/types/indexing/addStackTrace.d.ts.map +1 -0
  345. package/dist/types/indexing/client.d.ts +154 -0
  346. package/dist/types/indexing/client.d.ts.map +1 -0
  347. package/dist/types/indexing/index.d.ts +75 -0
  348. package/dist/types/indexing/index.d.ts.map +1 -0
  349. package/dist/types/indexing/profile.d.ts +16 -0
  350. package/dist/types/indexing/profile.d.ts.map +1 -0
  351. package/dist/types/indexing-store/cache.d.ts +115 -0
  352. package/dist/types/indexing-store/cache.d.ts.map +1 -0
  353. package/dist/types/indexing-store/historical.d.ts +12 -0
  354. package/dist/types/indexing-store/historical.d.ts.map +1 -0
  355. package/dist/types/indexing-store/index.d.ts +14 -0
  356. package/dist/types/indexing-store/index.d.ts.map +1 -0
  357. package/dist/types/indexing-store/profile.d.ts +7 -0
  358. package/dist/types/indexing-store/profile.d.ts.map +1 -0
  359. package/dist/types/indexing-store/realtime.d.ts +10 -0
  360. package/dist/types/indexing-store/realtime.d.ts.map +1 -0
  361. package/dist/types/indexing-store/utils.d.ts +19 -0
  362. package/dist/types/indexing-store/utils.d.ts.map +1 -0
  363. package/dist/types/internal/common.d.ts +15 -0
  364. package/dist/types/internal/common.d.ts.map +1 -0
  365. package/dist/types/internal/errors.d.ts +101 -0
  366. package/dist/types/internal/errors.d.ts.map +1 -0
  367. package/dist/types/internal/logger.d.ts +37 -0
  368. package/dist/types/internal/logger.d.ts.map +1 -0
  369. package/dist/types/internal/metrics.d.ts +120 -0
  370. package/dist/types/internal/metrics.d.ts.map +1 -0
  371. package/dist/types/internal/options.d.ts +62 -0
  372. package/dist/types/internal/options.d.ts.map +1 -0
  373. package/dist/types/internal/shutdown.d.ts +8 -0
  374. package/dist/types/internal/shutdown.d.ts.map +1 -0
  375. package/dist/types/internal/telemetry.d.ts +43 -0
  376. package/dist/types/internal/telemetry.d.ts.map +1 -0
  377. package/dist/types/internal/types.d.ts +435 -0
  378. package/dist/types/internal/types.d.ts.map +1 -0
  379. package/dist/types/rpc/actions.d.ts +360 -0
  380. package/dist/types/rpc/actions.d.ts.map +1 -0
  381. package/dist/types/rpc/http.d.ts +17 -0
  382. package/dist/types/rpc/http.d.ts.map +1 -0
  383. package/dist/types/rpc/index.d.ts +43 -0
  384. package/dist/types/rpc/index.d.ts.map +1 -0
  385. package/dist/types/runtime/events.d.ts +40 -0
  386. package/dist/types/runtime/events.d.ts.map +1 -0
  387. package/dist/types/runtime/filter.d.ts +87 -0
  388. package/dist/types/runtime/filter.d.ts.map +1 -0
  389. package/dist/types/runtime/fragments.d.ts +30 -0
  390. package/dist/types/runtime/fragments.d.ts.map +1 -0
  391. package/dist/types/runtime/historical.d.ts +123 -0
  392. package/dist/types/runtime/historical.d.ts.map +1 -0
  393. package/dist/types/runtime/index.d.ts +89 -0
  394. package/dist/types/runtime/index.d.ts.map +1 -0
  395. package/dist/types/runtime/init.d.ts +28 -0
  396. package/dist/types/runtime/init.d.ts.map +1 -0
  397. package/dist/types/runtime/isolated.d.ts +14 -0
  398. package/dist/types/runtime/isolated.d.ts.map +1 -0
  399. package/dist/types/runtime/multichain.d.ts +13 -0
  400. package/dist/types/runtime/multichain.d.ts.map +1 -0
  401. package/dist/types/runtime/omnichain.d.ts +23 -0
  402. package/dist/types/runtime/omnichain.d.ts.map +1 -0
  403. package/dist/types/runtime/realtime.d.ts +93 -0
  404. package/dist/types/runtime/realtime.d.ts.map +1 -0
  405. package/dist/types/server/error.d.ts +5 -0
  406. package/dist/types/server/error.d.ts.map +1 -0
  407. package/dist/types/server/index.d.ts +13 -0
  408. package/dist/types/server/index.d.ts.map +1 -0
  409. package/dist/types/sync-historical/index.d.ts +36 -0
  410. package/dist/types/sync-historical/index.d.ts.map +1 -0
  411. package/dist/types/sync-historical/portal-realtime-wire.d.ts +102 -0
  412. package/dist/types/sync-historical/portal-realtime-wire.d.ts.map +1 -0
  413. package/dist/types/sync-historical/portal-realtime.d.ts +95 -0
  414. package/dist/types/sync-historical/portal-realtime.d.ts.map +1 -0
  415. package/dist/types/sync-historical/portal-transform.d.ts +51 -0
  416. package/dist/types/sync-historical/portal-transform.d.ts.map +1 -0
  417. package/dist/types/sync-historical/portal.d.ts +34 -0
  418. package/dist/types/sync-historical/portal.d.ts.map +1 -0
  419. package/dist/types/sync-historical/realtime.d.ts +71 -0
  420. package/dist/types/sync-historical/realtime.d.ts.map +1 -0
  421. package/dist/types/sync-realtime/bloom.d.ts +18 -0
  422. package/dist/types/sync-realtime/bloom.d.ts.map +1 -0
  423. package/dist/types/sync-realtime/index.d.ts +47 -0
  424. package/dist/types/sync-realtime/index.d.ts.map +1 -0
  425. package/dist/types/sync-store/encode.d.ts +25 -0
  426. package/dist/types/sync-store/encode.d.ts.map +1 -0
  427. package/dist/types/sync-store/index.d.ts +135 -0
  428. package/dist/types/sync-store/index.d.ts.map +1 -0
  429. package/dist/types/sync-store/migrations.d.ts +8 -0
  430. package/dist/types/sync-store/migrations.d.ts.map +1 -0
  431. package/dist/types/sync-store/schema.d.ts +1828 -0
  432. package/dist/types/sync-store/schema.d.ts.map +1 -0
  433. package/dist/types/types/db.d.ts +213 -0
  434. package/dist/types/types/db.d.ts.map +1 -0
  435. package/dist/types/types/eth.d.ts +196 -0
  436. package/dist/types/types/eth.d.ts.map +1 -0
  437. package/dist/types/types/utils.d.ts +38 -0
  438. package/dist/types/types/utils.d.ts.map +1 -0
  439. package/dist/types/types/virtual.d.ts +99 -0
  440. package/dist/types/types/virtual.d.ts.map +1 -0
  441. package/dist/types/ui/app.d.ts +22 -0
  442. package/dist/types/ui/app.d.ts.map +1 -0
  443. package/dist/types/ui/index.d.ts +5 -0
  444. package/dist/types/ui/index.d.ts.map +1 -0
  445. package/dist/types/ui/patch.d.ts +7 -0
  446. package/dist/types/ui/patch.d.ts.map +1 -0
  447. package/dist/types/utils/abi.d.ts +23 -0
  448. package/dist/types/utils/abi.d.ts.map +1 -0
  449. package/dist/types/utils/bigint.d.ts +15 -0
  450. package/dist/types/utils/bigint.d.ts.map +1 -0
  451. package/dist/types/utils/chains.d.ts +42 -0
  452. package/dist/types/utils/chains.d.ts.map +1 -0
  453. package/dist/types/utils/checkpoint.d.ts +52 -0
  454. package/dist/types/utils/checkpoint.d.ts.map +1 -0
  455. package/dist/types/utils/chunk.d.ts +2 -0
  456. package/dist/types/utils/chunk.d.ts.map +1 -0
  457. package/dist/types/utils/copy.d.ts +16 -0
  458. package/dist/types/utils/copy.d.ts.map +1 -0
  459. package/dist/types/utils/date.d.ts +7 -0
  460. package/dist/types/utils/date.d.ts.map +1 -0
  461. package/dist/types/utils/debug.d.ts +105 -0
  462. package/dist/types/utils/debug.d.ts.map +1 -0
  463. package/dist/types/utils/decodeAbiParameters.d.ts +28 -0
  464. package/dist/types/utils/decodeAbiParameters.d.ts.map +1 -0
  465. package/dist/types/utils/decodeEventLog.d.ts +12 -0
  466. package/dist/types/utils/decodeEventLog.d.ts.map +1 -0
  467. package/dist/types/utils/dedupe.d.ts +20 -0
  468. package/dist/types/utils/dedupe.d.ts.map +1 -0
  469. package/dist/types/utils/duplicates.d.ts +7 -0
  470. package/dist/types/utils/duplicates.d.ts.map +1 -0
  471. package/dist/types/utils/estimate.d.ts +11 -0
  472. package/dist/types/utils/estimate.d.ts.map +1 -0
  473. package/dist/types/utils/finality.d.ts +12 -0
  474. package/dist/types/utils/finality.d.ts.map +1 -0
  475. package/dist/types/utils/format.d.ts +3 -0
  476. package/dist/types/utils/format.d.ts.map +1 -0
  477. package/dist/types/utils/generators.d.ts +42 -0
  478. package/dist/types/utils/generators.d.ts.map +1 -0
  479. package/dist/types/utils/hash.d.ts +11 -0
  480. package/dist/types/utils/hash.d.ts.map +1 -0
  481. package/dist/types/utils/interval.d.ts +53 -0
  482. package/dist/types/utils/interval.d.ts.map +1 -0
  483. package/dist/types/utils/lowercase.d.ts +5 -0
  484. package/dist/types/utils/lowercase.d.ts.map +1 -0
  485. package/dist/types/utils/mutex.d.ts +5 -0
  486. package/dist/types/utils/mutex.d.ts.map +1 -0
  487. package/dist/types/utils/never.d.ts +2 -0
  488. package/dist/types/utils/never.d.ts.map +1 -0
  489. package/dist/types/utils/offset.d.ts +8 -0
  490. package/dist/types/utils/offset.d.ts.map +1 -0
  491. package/dist/types/utils/order.d.ts +2 -0
  492. package/dist/types/utils/order.d.ts.map +1 -0
  493. package/dist/types/utils/partition.d.ts +22 -0
  494. package/dist/types/utils/partition.d.ts.map +1 -0
  495. package/dist/types/utils/pg.d.ts +8 -0
  496. package/dist/types/utils/pg.d.ts.map +1 -0
  497. package/dist/types/utils/pglite.d.ts +25 -0
  498. package/dist/types/utils/pglite.d.ts.map +1 -0
  499. package/dist/types/utils/port.d.ts +5 -0
  500. package/dist/types/utils/port.d.ts.map +1 -0
  501. package/dist/types/utils/print.d.ts +2 -0
  502. package/dist/types/utils/print.d.ts.map +1 -0
  503. package/dist/types/utils/promiseAllSettledWithThrow.d.ts +8 -0
  504. package/dist/types/utils/promiseAllSettledWithThrow.d.ts.map +1 -0
  505. package/dist/types/utils/promiseWithResolvers.d.ts +10 -0
  506. package/dist/types/utils/promiseWithResolvers.d.ts.map +1 -0
  507. package/dist/types/utils/queue.d.ts +33 -0
  508. package/dist/types/utils/queue.d.ts.map +1 -0
  509. package/dist/types/utils/range.d.ts +8 -0
  510. package/dist/types/utils/range.d.ts.map +1 -0
  511. package/dist/types/utils/result.d.ts +17 -0
  512. package/dist/types/utils/result.d.ts.map +1 -0
  513. package/dist/types/utils/sql-parse.d.ts +21 -0
  514. package/dist/types/utils/sql-parse.d.ts.map +1 -0
  515. package/dist/types/utils/timer.d.ts +6 -0
  516. package/dist/types/utils/timer.d.ts.map +1 -0
  517. package/dist/types/utils/truncate.d.ts +9 -0
  518. package/dist/types/utils/truncate.d.ts.map +1 -0
  519. package/dist/types/utils/wait.d.ts +6 -0
  520. package/dist/types/utils/wait.d.ts.map +1 -0
  521. package/dist/types/utils/zipper.d.ts +36 -0
  522. package/dist/types/utils/zipper.d.ts.map +1 -0
  523. package/package.json +116 -0
  524. package/src/bin/commands/codegen.ts +56 -0
  525. package/src/bin/commands/createViews.ts +311 -0
  526. package/src/bin/commands/dev.ts +490 -0
  527. package/src/bin/commands/list.ts +207 -0
  528. package/src/bin/commands/prune.ts +316 -0
  529. package/src/bin/commands/serve.ts +236 -0
  530. package/src/bin/commands/start.ts +319 -0
  531. package/src/bin/isolatedController.ts +300 -0
  532. package/src/bin/isolatedWorker.ts +192 -0
  533. package/src/bin/ponder.ts +200 -0
  534. package/src/bin/utils/codegen.ts +32 -0
  535. package/src/bin/utils/exit.ts +112 -0
  536. package/src/build/config.ts +1136 -0
  537. package/src/build/factory.ts +122 -0
  538. package/src/build/index.ts +747 -0
  539. package/src/build/plugin.ts +58 -0
  540. package/src/build/pre.ts +100 -0
  541. package/src/build/schema.ts +291 -0
  542. package/src/build/stacktrace.ts +137 -0
  543. package/src/client/index.ts +551 -0
  544. package/src/config/address.ts +32 -0
  545. package/src/config/eventFilter.ts +33 -0
  546. package/src/config/index.ts +245 -0
  547. package/src/config/utilityTypes.ts +152 -0
  548. package/src/database/actions.ts +870 -0
  549. package/src/database/index.ts +1018 -0
  550. package/src/database/queryBuilder.ts +534 -0
  551. package/src/drizzle/bigint.ts +57 -0
  552. package/src/drizzle/bytes.ts +68 -0
  553. package/src/drizzle/hex.ts +58 -0
  554. package/src/drizzle/index.ts +58 -0
  555. package/src/drizzle/json.ts +154 -0
  556. package/src/drizzle/kit/index.ts +1352 -0
  557. package/src/drizzle/onchain.ts +447 -0
  558. package/src/drizzle/text.ts +77 -0
  559. package/src/graphql/graphiql.html.ts +59 -0
  560. package/src/graphql/index.ts +1329 -0
  561. package/src/graphql/json.ts +62 -0
  562. package/src/graphql/middleware.ts +111 -0
  563. package/src/index.ts +139 -0
  564. package/src/indexing/addStackTrace.ts +69 -0
  565. package/src/indexing/client.ts +1184 -0
  566. package/src/indexing/index.ts +961 -0
  567. package/src/indexing/profile.ts +771 -0
  568. package/src/indexing-store/cache.ts +1056 -0
  569. package/src/indexing-store/historical.ts +555 -0
  570. package/src/indexing-store/index.ts +73 -0
  571. package/src/indexing-store/profile.ts +557 -0
  572. package/src/indexing-store/realtime.ts +412 -0
  573. package/src/indexing-store/utils.ts +162 -0
  574. package/src/internal/common.ts +15 -0
  575. package/src/internal/errors.ts +228 -0
  576. package/src/internal/logger.ts +252 -0
  577. package/src/internal/metrics.ts +1027 -0
  578. package/src/internal/options.ts +130 -0
  579. package/src/internal/shutdown.ts +32 -0
  580. package/src/internal/telemetry.ts +303 -0
  581. package/src/internal/types.ts +598 -0
  582. package/src/rpc/actions.ts +1344 -0
  583. package/src/rpc/http.ts +164 -0
  584. package/src/rpc/index.ts +959 -0
  585. package/src/runtime/events.ts +875 -0
  586. package/src/runtime/filter.ts +664 -0
  587. package/src/runtime/fragments.ts +674 -0
  588. package/src/runtime/historical.ts +1556 -0
  589. package/src/runtime/index.ts +578 -0
  590. package/src/runtime/init.ts +49 -0
  591. package/src/runtime/isolated.ts +769 -0
  592. package/src/runtime/multichain.ts +853 -0
  593. package/src/runtime/omnichain.ts +913 -0
  594. package/src/runtime/realtime.ts +1179 -0
  595. package/src/server/error.ts +68 -0
  596. package/src/server/index.ts +173 -0
  597. package/src/sync-historical/index.ts +1062 -0
  598. package/src/sync-historical/portal-realtime-wire.ts +389 -0
  599. package/src/sync-historical/portal-realtime.ts +209 -0
  600. package/src/sync-historical/portal-transform.ts +123 -0
  601. package/src/sync-historical/portal.ts +811 -0
  602. package/src/sync-historical/realtime.ts +132 -0
  603. package/src/sync-realtime/bloom.ts +102 -0
  604. package/src/sync-realtime/index.ts +1298 -0
  605. package/src/sync-store/encode.ts +153 -0
  606. package/src/sync-store/index.ts +1633 -0
  607. package/src/sync-store/migrations.ts +1801 -0
  608. package/src/sync-store/schema.ts +248 -0
  609. package/src/types/db.ts +292 -0
  610. package/src/types/eth.ts +216 -0
  611. package/src/types/utils.ts +47 -0
  612. package/src/types/virtual.ts +244 -0
  613. package/src/types.d.ts +38 -0
  614. package/src/ui/app.ts +207 -0
  615. package/src/ui/index.ts +37 -0
  616. package/src/ui/patch.ts +145 -0
  617. package/src/utils/abi.ts +103 -0
  618. package/src/utils/bigint.ts +41 -0
  619. package/src/utils/chains.ts +22 -0
  620. package/src/utils/checkpoint.ts +203 -0
  621. package/src/utils/chunk.ts +7 -0
  622. package/src/utils/copy.ts +151 -0
  623. package/src/utils/date.ts +26 -0
  624. package/src/utils/debug.ts +110 -0
  625. package/src/utils/decodeAbiParameters.ts +428 -0
  626. package/src/utils/decodeEventLog.ts +100 -0
  627. package/src/utils/dedupe.ts +32 -0
  628. package/src/utils/duplicates.ts +19 -0
  629. package/src/utils/estimate.ts +27 -0
  630. package/src/utils/finality.ts +40 -0
  631. package/src/utils/format.ts +22 -0
  632. package/src/utils/generators.ts +157 -0
  633. package/src/utils/hash.ts +22 -0
  634. package/src/utils/interval.ts +212 -0
  635. package/src/utils/lowercase.ts +6 -0
  636. package/src/utils/mutex.ts +33 -0
  637. package/src/utils/never.ts +3 -0
  638. package/src/utils/offset.ts +133 -0
  639. package/src/utils/order.ts +16 -0
  640. package/src/utils/partition.ts +53 -0
  641. package/src/utils/pg.ts +197 -0
  642. package/src/utils/pglite.ts +97 -0
  643. package/src/utils/port.ts +34 -0
  644. package/src/utils/print.ts +31 -0
  645. package/src/utils/promiseAllSettledWithThrow.ts +27 -0
  646. package/src/utils/promiseWithResolvers.ts +20 -0
  647. package/src/utils/queue.ts +258 -0
  648. package/src/utils/range.ts +8 -0
  649. package/src/utils/result.ts +26 -0
  650. package/src/utils/sql-parse.ts +1477 -0
  651. package/src/utils/timer.ts +8 -0
  652. package/src/utils/truncate.ts +15 -0
  653. package/src/utils/wait.ts +8 -0
  654. package/src/utils/zipper.ts +80 -0
@@ -0,0 +1,1352 @@
1
+ import { SQL, getTableName, is, sql } from "drizzle-orm";
2
+ import { CasingCache, toCamelCase, toSnakeCase } from "drizzle-orm/casing";
3
+ import {
4
+ type AnyPgTable,
5
+ PgColumn,
6
+ PgDialect,
7
+ type PgEnum,
8
+ PgEnumColumn,
9
+ PgMaterializedView,
10
+ PgSchema,
11
+ type PgSequence,
12
+ PgTable,
13
+ PgView,
14
+ getTableConfig,
15
+ getViewConfig,
16
+ index,
17
+ integer,
18
+ isPgEnum,
19
+ isPgSequence,
20
+ pgSchema,
21
+ pgTable,
22
+ varchar,
23
+ } from "drizzle-orm/pg-core";
24
+
25
+ type Dialect = "postgresql";
26
+ type CasingType = "snake_case" | "camelCase";
27
+
28
+ export type SqlStatements = {
29
+ tables: {
30
+ sql: string[];
31
+ json: JsonCreateTableStatement[];
32
+ };
33
+ views: {
34
+ sql: string[];
35
+ json: JsonCreatePgViewStatement[];
36
+ };
37
+ enums: {
38
+ sql: string[];
39
+ json: JsonCreateEnumStatement[];
40
+ };
41
+ indexes: { sql: string[]; json: JsonPgCreateIndexStatement[] };
42
+ };
43
+
44
+ export const sqlToReorgTableName = (tableName: string) =>
45
+ `_reorg__${tableName}`;
46
+
47
+ export const SHARED_OPERATION_ID_SEQUENCE = "operation_id_seq";
48
+
49
+ export const getReorgTable = (table: PgTable) => {
50
+ const schema = getTableConfig(table).schema;
51
+ if (schema && schema !== "public") {
52
+ return pgSchema(schema).table(
53
+ sqlToReorgTableName(getTableName(table)),
54
+ {
55
+ operation_id: integer()
56
+ .notNull()
57
+ .primaryKey()
58
+ .default(
59
+ sql.raw(`nextval('"${schema}"."${SHARED_OPERATION_ID_SEQUENCE}"')`),
60
+ ),
61
+ operation: integer().notNull().$type<0 | 1 | 2>(),
62
+ checkpoint: varchar({ length: 75 }).notNull(),
63
+ },
64
+ (table) => [index().on(table.checkpoint)],
65
+ );
66
+ }
67
+ return pgTable(
68
+ sqlToReorgTableName(getTableName(table)),
69
+ {
70
+ operation_id: integer()
71
+ .notNull()
72
+ .primaryKey()
73
+ .default(sql.raw(`nextval('"${SHARED_OPERATION_ID_SEQUENCE}"')`)),
74
+ operation: integer().notNull().$type<0 | 1 | 2>(),
75
+ checkpoint: varchar({ length: 75 }).notNull(),
76
+ },
77
+ (table) => [index().on(table.checkpoint)],
78
+ );
79
+ };
80
+
81
+ export const getSql = (schema: { [name: string]: unknown }): SqlStatements => {
82
+ const { tables, views, enums, schemas } = prepareFromExports(schema);
83
+ const json = generatePgSnapshot(tables, views, enums, schemas, "snake_case");
84
+ const squashed = squashPgScheme(json);
85
+
86
+ const jsonCreateIndexesForCreatedTables = Object.values(
87
+ squashed.tables,
88
+ ).flatMap((it) => {
89
+ // @ts-ignore
90
+ return preparePgCreateIndexesJson(it.name, it.schema, it.indexes);
91
+ });
92
+
93
+ const jsonCreateEnums =
94
+ Object.values(squashed.enums).map((it) => {
95
+ // @ts-ignore
96
+ return prepareCreateEnumJson(it.name, it.schema, it.values);
97
+ }) ?? [];
98
+
99
+ const jsonCreateTables = Object.values(squashed.tables).map((it: any) => {
100
+ return preparePgCreateTableJson(it, json);
101
+ });
102
+
103
+ const jsonCreateViews = Object.values(squashed.views).map((it: any) => {
104
+ return preparePgCreateViewJson(
105
+ it.name,
106
+ it.schema,
107
+ it.definition!,
108
+ it.materialized,
109
+ it.withNoData,
110
+ it.with,
111
+ it.using,
112
+ it.tablespace,
113
+ );
114
+ });
115
+
116
+ const fromJson = (statements: any[]) =>
117
+ statements
118
+ .flatMap((statement) => {
119
+ const filtered = convertors.filter((it) => {
120
+ return it.can(statement, "postgresql");
121
+ });
122
+
123
+ const convertor = filtered.length === 1 ? filtered[0] : undefined;
124
+
125
+ if (!convertor) {
126
+ return "";
127
+ }
128
+
129
+ return convertor.convert(statement);
130
+ })
131
+ .filter((it) => it !== "");
132
+
133
+ const combinedTables = jsonCreateTables.flatMap((statement) => [
134
+ statement,
135
+ createReorgTableStatement(statement),
136
+ ]);
137
+
138
+ return {
139
+ tables: {
140
+ sql: fromJson(combinedTables),
141
+ json: combinedTables,
142
+ },
143
+ views: { sql: fromJson(jsonCreateViews), json: jsonCreateViews },
144
+ enums: { sql: fromJson(jsonCreateEnums), json: jsonCreateEnums },
145
+ indexes: {
146
+ sql: fromJson(jsonCreateIndexesForCreatedTables),
147
+ json: jsonCreateIndexesForCreatedTables,
148
+ },
149
+ };
150
+ };
151
+
152
+ const createReorgTableStatement = (statement: JsonCreateTableStatement) => {
153
+ const reorgStatement: JsonCreateTableStatement = structuredClone(statement);
154
+
155
+ reorgStatement.compositePkName = undefined;
156
+ reorgStatement.compositePKs = [];
157
+
158
+ for (const column of reorgStatement.columns) {
159
+ column.primaryKey = false;
160
+ }
161
+
162
+ const reorgColumns = Object.values(
163
+ squashPgScheme(
164
+ generatePgSnapshot(
165
+ [
166
+ pgTable("", {
167
+ operation_id: integer()
168
+ .notNull()
169
+ .primaryKey()
170
+ .default(
171
+ sql.raw(
172
+ `nextval('"${statement.schema === "" ? "public" : statement.schema}"."${SHARED_OPERATION_ID_SEQUENCE}"')`,
173
+ ),
174
+ ),
175
+ operation: integer().notNull(),
176
+ checkpoint: varchar({ length: 75 }).notNull(),
177
+ }),
178
+ ],
179
+ [],
180
+ [],
181
+ [],
182
+ "snake_case",
183
+ ),
184
+ ).tables,
185
+ //@ts-ignore
186
+ )[0]!.columns;
187
+
188
+ reorgStatement.columns.push(...Object.values(reorgColumns));
189
+
190
+ reorgStatement.tableName = sqlToReorgTableName(reorgStatement.tableName);
191
+
192
+ return reorgStatement;
193
+ };
194
+
195
+ ////////
196
+ // Serializer
197
+ ////////
198
+
199
+ type Index = any;
200
+ type Column = any;
201
+ type PgSchemaSquashed = any;
202
+ type Table = any;
203
+ type Enum = any;
204
+ type PrimaryKey = any;
205
+ type IndexedColumn = any;
206
+ type IndexColumnType = any;
207
+
208
+ const PgSquasher = {
209
+ squashIdx: (idx: Index) => {
210
+ return `${idx.name};${idx.columns
211
+ .map(
212
+ (c: {
213
+ expression: any;
214
+ isExpression: any;
215
+ asc: any;
216
+ nulls: any;
217
+ opclass: any;
218
+ }) =>
219
+ `${c.expression}--${c.isExpression}--${c.asc}--${c.nulls}--${
220
+ c.opclass && ""
221
+ }`,
222
+ )
223
+ .join(
224
+ ",,",
225
+ )};${idx.isUnique};${idx.concurrently};${idx.method};${idx.where};${JSON.stringify(idx.with)}`;
226
+ },
227
+ unsquashIdx: (input: string): Index => {
228
+ const [
229
+ name,
230
+ columnsString,
231
+ isUnique,
232
+ concurrently,
233
+ method,
234
+ where,
235
+ idxWith,
236
+ ] = input.split(";");
237
+
238
+ const columnString = columnsString!.split(",,");
239
+ const columns: IndexColumnType[] = [];
240
+
241
+ for (const column of columnString) {
242
+ const [expression, isExpression, asc, nulls, opclass] =
243
+ column.split("--");
244
+ columns.push({
245
+ nulls: nulls as IndexColumnType["nulls"],
246
+ isExpression: isExpression === "true",
247
+ asc: asc === "true",
248
+ expression: expression,
249
+ opclass: opclass === "undefined" ? undefined : opclass,
250
+ });
251
+ }
252
+
253
+ return {
254
+ name,
255
+ columns,
256
+ isUnique: isUnique === "true",
257
+ concurrently: concurrently === "true",
258
+ method,
259
+ where: where === "undefined" ? undefined : where,
260
+ with:
261
+ !idxWith || idxWith === "undefined" ? undefined : JSON.parse(idxWith),
262
+ };
263
+ },
264
+ squashPK: (pk: PrimaryKey) => {
265
+ return `${pk.columns.join(",")};${pk.name}`;
266
+ },
267
+ unsquashPK: (pk: string): PrimaryKey => {
268
+ const splitted = pk.split(";");
269
+ return { name: splitted[1], columns: splitted[0]!.split(",") };
270
+ },
271
+ };
272
+
273
+ ////////
274
+ // JSON
275
+ ////////
276
+
277
+ interface JsonCreateTableStatement {
278
+ type: "create_table";
279
+ tableName: string;
280
+ schema: string;
281
+ columns: Column[];
282
+ compositePKs: string[];
283
+ compositePkName?: string;
284
+ uniqueConstraints?: string[];
285
+ checkConstraints?: string[];
286
+ }
287
+
288
+ type JsonCreatePgViewStatement = {
289
+ type: "create_view";
290
+ name: string;
291
+ schema: string;
292
+ definition?: string;
293
+ materialized: boolean;
294
+ with: any;
295
+ withNoData?: boolean;
296
+ using?: string;
297
+ tablespace?: string;
298
+ };
299
+
300
+ interface JsonCreateEnumStatement {
301
+ type: "create_type_enum";
302
+ name: string;
303
+ schema: string;
304
+ values: string[];
305
+ }
306
+
307
+ interface JsonCreateIndexStatement {
308
+ type: "create_index";
309
+ tableName: string;
310
+ data: string;
311
+ schema: string;
312
+ }
313
+
314
+ interface JsonPgCreateIndexStatement {
315
+ type: "create_index_pg";
316
+ tableName: string;
317
+ data: Index;
318
+ schema: string;
319
+ }
320
+
321
+ interface JsonCreateUniqueConstraint {
322
+ type: "create_unique_constraint";
323
+ tableName: string;
324
+ data: string;
325
+ schema?: string;
326
+ constraintName?: string;
327
+ }
328
+
329
+ interface JsonCreateCheckConstraint {
330
+ type: "create_check_constraint";
331
+ tableName: string;
332
+ data: string;
333
+ schema?: string;
334
+ }
335
+
336
+ interface JsonCreateCompositePK {
337
+ type: "create_composite_pk";
338
+ tableName: string;
339
+ data: string;
340
+ schema?: string;
341
+ constraintName?: string;
342
+ }
343
+
344
+ interface JsonCreateSchema {
345
+ type: "create_schema";
346
+ name: string;
347
+ }
348
+
349
+ interface JsonCreateReferenceStatement {
350
+ type: "create_reference";
351
+ data: string;
352
+ schema: string;
353
+ tableName: string;
354
+ isMulticolumn?: boolean;
355
+ columnNotNull?: boolean;
356
+ columnDefault?: string;
357
+ columnType?: string;
358
+ }
359
+
360
+ type JsonStatement =
361
+ | JsonCreateTableStatement
362
+ | JsonCreatePgViewStatement
363
+ | JsonCreateEnumStatement
364
+ | JsonCreateIndexStatement
365
+ | JsonPgCreateIndexStatement
366
+ | JsonCreateReferenceStatement
367
+ | JsonCreateCompositePK
368
+ | JsonCreateUniqueConstraint
369
+ | JsonCreateSchema
370
+ | JsonCreateCheckConstraint;
371
+
372
+ ////////
373
+ // Generator
374
+ ////////
375
+
376
+ const parseType = (schemaPrefix: string, type: string) => {
377
+ const pgNativeTypes = [
378
+ "uuid",
379
+ "smallint",
380
+ "integer",
381
+ "bigint",
382
+ "boolean",
383
+ "text",
384
+ "varchar",
385
+ "serial",
386
+ "bigserial",
387
+ "decimal",
388
+ "numeric",
389
+ "real",
390
+ "json",
391
+ "jsonb",
392
+ "time",
393
+ "time with time zone",
394
+ "time without time zone",
395
+ "time",
396
+ "timestamp",
397
+ "timestamp with time zone",
398
+ "timestamp without time zone",
399
+ "date",
400
+ "interval",
401
+ "bigint",
402
+ "bigserial",
403
+ "double precision",
404
+ "interval year",
405
+ "interval month",
406
+ "interval day",
407
+ "interval hour",
408
+ "interval minute",
409
+ "interval second",
410
+ "interval year to month",
411
+ "interval day to hour",
412
+ "interval day to minute",
413
+ "interval day to second",
414
+ "interval hour to minute",
415
+ "interval hour to second",
416
+ "interval minute to second",
417
+ ];
418
+
419
+ const arrayDefinitionRegex = /\[\d*(?:\[\d*\])*\]/g;
420
+ const arrayDefinition = (type.match(arrayDefinitionRegex) ?? []).join("");
421
+ const withoutArrayDefinition = type.replace(arrayDefinitionRegex, "");
422
+ return pgNativeTypes.some((it) => type.startsWith(it))
423
+ ? `${withoutArrayDefinition}${arrayDefinition}`
424
+ : `${schemaPrefix}"${withoutArrayDefinition}"${arrayDefinition}`;
425
+ };
426
+
427
+ abstract class Convertor {
428
+ abstract can(statement: JsonStatement, dialect: Dialect): boolean;
429
+ abstract convert(
430
+ statement: JsonStatement,
431
+ action?: "push",
432
+ ): string | string[];
433
+ }
434
+
435
+ class PgCreateTableConvertor extends Convertor {
436
+ can(statement: JsonStatement, dialect: Dialect): boolean {
437
+ return statement.type === "create_table" && dialect === "postgresql";
438
+ }
439
+
440
+ convert(st: JsonCreateTableStatement) {
441
+ const { tableName, schema, columns, compositePKs } = st;
442
+
443
+ let statement = "";
444
+ const name = schema ? `"${schema}"."${tableName}"` : `"${tableName}"`;
445
+
446
+ statement += `CREATE TABLE ${name} (\n`;
447
+ for (let i = 0; i < columns.length; i++) {
448
+ const column = columns[i];
449
+
450
+ const primaryKeyStatement = column.primaryKey ? " PRIMARY KEY" : "";
451
+ const notNullStatement =
452
+ column.notNull && !column.identity ? " NOT NULL" : "";
453
+ const defaultStatement =
454
+ column.default !== undefined ? ` DEFAULT ${column.default}` : "";
455
+
456
+ // const uniqueConstraint = column.isUnique
457
+ // ? ` CONSTRAINT "${column.uniqueName}" UNIQUE${column.nullsNotDistinct ? " NULLS NOT DISTINCT" : ""}`
458
+ // : "";
459
+
460
+ const schemaPrefix =
461
+ column.typeSchema && column.typeSchema !== "public"
462
+ ? `"${column.typeSchema}".`
463
+ : "";
464
+
465
+ const type = parseType(schemaPrefix, column.type);
466
+ // const generated = column.generated;
467
+
468
+ // const generatedStatement = generated
469
+ // ? ` GENERATED ALWAYS AS (${generated?.as}) STORED`
470
+ // : "";
471
+
472
+ // const unsquashedIdentity = column.identity
473
+ // ? PgSquasher.unsquashIdentity(column.identity)
474
+ // : undefined;
475
+
476
+ // const identityWithSchema = schema
477
+ // ? `"${schema}"."${unsquashedIdentity?.name}"`
478
+ // : `"${unsquashedIdentity?.name}"`;
479
+
480
+ // const identity = unsquashedIdentity
481
+ // ? ` GENERATED ${
482
+ // unsquashedIdentity.type === "always" ? "ALWAYS" : "BY DEFAULT"
483
+ // } AS IDENTITY (sequence name ${identityWithSchema}${
484
+ // unsquashedIdentity.increment
485
+ // ? ` INCREMENT BY ${unsquashedIdentity.increment}`
486
+ // : ""
487
+ // }${
488
+ // unsquashedIdentity.minValue
489
+ // ? ` MINVALUE ${unsquashedIdentity.minValue}`
490
+ // : ""
491
+ // }${
492
+ // unsquashedIdentity.maxValue
493
+ // ? ` MAXVALUE ${unsquashedIdentity.maxValue}`
494
+ // : ""
495
+ // }${
496
+ // unsquashedIdentity.startWith
497
+ // ? ` START WITH ${unsquashedIdentity.startWith}`
498
+ // : ""
499
+ // }${unsquashedIdentity.cache ? ` CACHE ${unsquashedIdentity.cache}` : ""}${
500
+ // unsquashedIdentity.cycle ? " CYCLE" : ""
501
+ // })`
502
+ // : "";
503
+
504
+ statement += `\t"${column.name}" ${type}${primaryKeyStatement}${defaultStatement}${notNullStatement}`;
505
+ statement += i === columns.length - 1 ? "" : ",\n";
506
+ }
507
+
508
+ if (typeof compositePKs !== "undefined" && compositePKs.length > 0) {
509
+ statement += ",\n";
510
+ const compositePK = PgSquasher.unsquashPK(compositePKs[0]!);
511
+ statement += `\tCONSTRAINT "${st.compositePkName}" PRIMARY KEY(\"${compositePK.columns.join(`","`)}\")`;
512
+ // statement += `\n`;
513
+ }
514
+
515
+ // if (
516
+ // typeof uniqueConstraints !== "undefined" &&
517
+ // uniqueConstraints.length > 0
518
+ // ) {
519
+ // for (const uniqueConstraint of uniqueConstraints) {
520
+ // statement += ",\n";
521
+ // const unsquashedUnique = PgSquasher.unsquashUnique(uniqueConstraint);
522
+ // statement += `\tCONSTRAINT "${unsquashedUnique.name}" UNIQUE${
523
+ // unsquashedUnique.nullsNotDistinct ? " NULLS NOT DISTINCT" : ""
524
+ // }(\"${unsquashedUnique.columns.join(`","`)}\")`;
525
+ // // statement += `\n`;
526
+ // }
527
+ // }
528
+
529
+ // if (
530
+ // typeof checkConstraints !== "undefined" &&
531
+ // checkConstraints.length > 0
532
+ // ) {
533
+ // for (const checkConstraint of checkConstraints) {
534
+ // statement += ",\n";
535
+ // const unsquashedCheck = PgSquasher.unsquashCheck(checkConstraint);
536
+ // statement += `\tCONSTRAINT "${unsquashedCheck.name}" CHECK (${unsquashedCheck.value})`;
537
+ // }
538
+ // }
539
+
540
+ statement += "\n);";
541
+ statement += "\n";
542
+
543
+ return statement;
544
+ }
545
+ }
546
+
547
+ class PgCreateViewConvertor extends Convertor {
548
+ can(statement: JsonStatement, dialect: Dialect): boolean {
549
+ return statement.type === "create_view" && dialect === "postgresql";
550
+ }
551
+
552
+ convert(st: JsonCreatePgViewStatement) {
553
+ const {
554
+ definition,
555
+ name: viewName,
556
+ schema,
557
+ with: withOption,
558
+ materialized,
559
+ withNoData,
560
+ tablespace,
561
+ using,
562
+ } = st;
563
+
564
+ const name = schema ? `"${schema}"."${viewName}"` : `"${viewName}"`;
565
+
566
+ let statement = materialized
567
+ ? `CREATE MATERIALIZED VIEW ${name}`
568
+ : `CREATE VIEW ${name}`;
569
+
570
+ if (using) statement += ` USING "${using}"`;
571
+
572
+ const options: string[] = [];
573
+ if (withOption) {
574
+ statement += " WITH (";
575
+
576
+ Object.entries(withOption).forEach(([key, value]) => {
577
+ if (typeof value === "undefined") return;
578
+
579
+ options.push(`${toSnakeCase(key)} = ${value}`);
580
+ });
581
+
582
+ statement += options.join(", ");
583
+
584
+ statement += ")";
585
+ }
586
+
587
+ if (tablespace) statement += ` TABLESPACE ${tablespace}`;
588
+
589
+ statement += ` AS (${definition})`;
590
+
591
+ if (withNoData) statement += " WITH NO DATA";
592
+
593
+ statement += ";";
594
+
595
+ return statement;
596
+ }
597
+ }
598
+
599
+ class CreateTypeEnumConvertor extends Convertor {
600
+ can(statement: JsonStatement): boolean {
601
+ return statement.type === "create_type_enum";
602
+ }
603
+
604
+ convert(st: JsonCreateEnumStatement) {
605
+ const { name, values, schema } = st;
606
+
607
+ const enumNameWithSchema = schema ? `"${schema}"."${name}"` : `"${name}"`;
608
+
609
+ let valuesStatement = "(";
610
+ valuesStatement += values.map((it) => `'${it}'`).join(", ");
611
+ valuesStatement += ")";
612
+
613
+ // TODO do we need this?
614
+ // let statement = 'DO $$ BEGIN';
615
+ // statement += '\n';
616
+ const statement = `CREATE TYPE ${enumNameWithSchema} AS ENUM${valuesStatement};`;
617
+ // statement += '\n';
618
+ // statement += 'EXCEPTION';
619
+ // statement += '\n';
620
+ // statement += ' WHEN duplicate_object THEN null;';
621
+ // statement += '\n';
622
+ // statement += 'END $$;';
623
+ // statement += '\n';
624
+ return statement;
625
+ }
626
+ }
627
+
628
+ class CreatePgIndexConvertor extends Convertor {
629
+ can(statement: JsonStatement, dialect: Dialect): boolean {
630
+ return statement.type === "create_index_pg" && dialect === "postgresql";
631
+ }
632
+
633
+ convert(statement: JsonPgCreateIndexStatement): string {
634
+ const {
635
+ name,
636
+ columns,
637
+ isUnique,
638
+ concurrently,
639
+ with: withMap,
640
+ method,
641
+ where,
642
+ } = statement.data;
643
+ // // since postgresql 9.5
644
+ const indexPart = isUnique ? "UNIQUE INDEX" : "INDEX";
645
+ const value = columns
646
+ .map(
647
+ (it: {
648
+ isExpression: any;
649
+ expression: any;
650
+ opclass: any;
651
+ asc: any;
652
+ nulls: string;
653
+ }) =>
654
+ `${it.isExpression ? it.expression : `"${it.expression}"`}${
655
+ it.opclass ? ` ${it.opclass}` : it.asc ? "" : " DESC"
656
+ }${
657
+ (it.asc && it.nulls && it.nulls === "last") || it.opclass
658
+ ? ""
659
+ : ` NULLS ${it.nulls!.toUpperCase()}`
660
+ }`,
661
+ )
662
+ .join(",");
663
+
664
+ const tableNameWithSchema = statement.schema
665
+ ? `"${statement.schema}"."${statement.tableName}"`
666
+ : `"${statement.tableName}"`;
667
+
668
+ function reverseLogic(mappedWith: Record<string, string>): string {
669
+ let reversedString = "";
670
+ for (const key in mappedWith) {
671
+ // biome-ignore lint/suspicious/noPrototypeBuiltins: <explanation>
672
+ if (mappedWith.hasOwnProperty(key)) {
673
+ reversedString += `${key}=${mappedWith[key]},`;
674
+ }
675
+ }
676
+ reversedString = reversedString.slice(0, -1);
677
+ return reversedString;
678
+ }
679
+
680
+ return `CREATE ${indexPart}${
681
+ concurrently ? " CONCURRENTLY" : ""
682
+ } IF NOT EXISTS "${name}" ON ${tableNameWithSchema} USING ${method} (${value})${
683
+ Object.keys(withMap!).length !== 0
684
+ ? ` WITH (${reverseLogic(withMap!)})`
685
+ : ""
686
+ }${where ? ` WHERE ${where}` : ""};`;
687
+ }
688
+ }
689
+
690
+ class PgCreateSchemaConvertor extends Convertor {
691
+ can(statement: JsonStatement, dialect: Dialect): boolean {
692
+ return statement.type === "create_schema" && dialect === "postgresql";
693
+ }
694
+
695
+ convert(statement: JsonCreateSchema) {
696
+ const { name } = statement;
697
+ return `CREATE SCHEMA IF NOT EXISTS"${name}";\n`;
698
+ }
699
+ }
700
+
701
+ const convertors: Convertor[] = [];
702
+ convertors.push(new PgCreateTableConvertor());
703
+ convertors.push(new PgCreateViewConvertor());
704
+ convertors.push(new CreateTypeEnumConvertor());
705
+ convertors.push(new CreatePgIndexConvertor());
706
+ convertors.push(new PgCreateSchemaConvertor());
707
+
708
+ const preparePgCreateTableJson = (
709
+ table: Table,
710
+ json: PgSchemaSquashed,
711
+ ): JsonCreateTableStatement => {
712
+ const { name, schema, columns, compositePrimaryKeys } = table;
713
+ const tableKey = `${schema || "public"}.${name}`;
714
+
715
+ // TODO: @AndriiSherman. We need this, will add test cases
716
+ const compositePkName =
717
+ Object.values(compositePrimaryKeys).length > 0
718
+ ? json.tables[tableKey].compositePrimaryKeys[
719
+ `${PgSquasher.unsquashPK(Object.values(compositePrimaryKeys)[0]! as string).name}`
720
+ ].name
721
+ : "";
722
+
723
+ return {
724
+ type: "create_table",
725
+ tableName: name,
726
+ schema,
727
+ columns: Object.values(columns),
728
+ compositePKs: Object.values(compositePrimaryKeys),
729
+ compositePkName: compositePkName,
730
+ };
731
+ };
732
+
733
+ const preparePgCreateViewJson = (
734
+ name: string,
735
+ schema: string,
736
+ definition: string,
737
+ materialized: boolean,
738
+ withNoData = false,
739
+ withOption?: any,
740
+ using?: string,
741
+ tablespace?: string,
742
+ ): JsonCreatePgViewStatement => {
743
+ return {
744
+ type: "create_view",
745
+ name: name,
746
+ schema: schema,
747
+ definition: definition,
748
+ with: withOption,
749
+ materialized: materialized,
750
+ withNoData,
751
+ using,
752
+ tablespace,
753
+ };
754
+ };
755
+
756
+ const preparePgCreateIndexesJson = (
757
+ tableName: string,
758
+ schema: string,
759
+ indexes: Record<string, string>,
760
+ ): JsonPgCreateIndexStatement[] => {
761
+ return Object.values(indexes).map((indexData) => {
762
+ return {
763
+ type: "create_index_pg",
764
+ tableName,
765
+ data: PgSquasher.unsquashIdx(indexData),
766
+ schema,
767
+ };
768
+ });
769
+ };
770
+
771
+ const prepareCreateEnumJson = (
772
+ name: string,
773
+ schema: string,
774
+ values: string[],
775
+ ): JsonCreateEnumStatement => {
776
+ return {
777
+ type: "create_type_enum",
778
+ name: name,
779
+ schema: schema,
780
+ values,
781
+ };
782
+ };
783
+
784
+ const prepareFromExports = (exports: Record<string, unknown>) => {
785
+ const tables: AnyPgTable[] = [];
786
+ const enums: PgEnum<any>[] = [];
787
+ const schemas: PgSchema[] = [];
788
+ const sequences: PgSequence[] = [];
789
+ const views: PgView[] = [];
790
+ const matViews: PgMaterializedView[] = [];
791
+
792
+ const i0values = Object.values(exports);
793
+ i0values.forEach((t) => {
794
+ if (isPgEnum(t)) {
795
+ enums.push(t);
796
+ return;
797
+ }
798
+ if (is(t, PgTable)) {
799
+ tables.push(t);
800
+ }
801
+
802
+ if (is(t, PgSchema)) {
803
+ schemas.push(t);
804
+ }
805
+
806
+ if (is(t, PgView)) {
807
+ views.push(t);
808
+ }
809
+
810
+ if (is(t, PgMaterializedView)) {
811
+ matViews.push(t);
812
+ }
813
+
814
+ if (isPgSequence(t)) {
815
+ sequences.push(t);
816
+ }
817
+ });
818
+
819
+ return { tables, enums, schemas, sequences, views, matViews };
820
+ };
821
+
822
+ export function getColumnCasing(
823
+ column: { keyAsName: boolean; name: string | undefined },
824
+ casing: CasingType | undefined,
825
+ ) {
826
+ if (!column.name) return "";
827
+ return !column.keyAsName || casing === undefined
828
+ ? column.name
829
+ : casing === "camelCase"
830
+ ? toCamelCase(column.name)
831
+ : toSnakeCase(column.name);
832
+ }
833
+
834
+ const sqlToStr = (sql: SQL, casing: CasingType | undefined) => {
835
+ return sql.toQuery({
836
+ escapeName: () => {
837
+ throw new Error("we don't support params for `sql` default values");
838
+ },
839
+ escapeParam: () => {
840
+ throw new Error("we don't support params for `sql` default values");
841
+ },
842
+ escapeString: () => {
843
+ throw new Error("we don't support params for `sql` default values");
844
+ },
845
+ casing: new CasingCache(casing),
846
+ }).sql;
847
+ };
848
+
849
+ function isPgArrayType(sqlType: string) {
850
+ return sqlType.match(/.*\[\d*\].*|.*\[\].*/g) !== null;
851
+ }
852
+
853
+ function buildArrayString(array: readonly any[], sqlType: string): string {
854
+ sqlType = sqlType.split("[")[0]!;
855
+ const values = array
856
+ .map((value) => {
857
+ if (typeof value === "number" || typeof value === "bigint") {
858
+ return value.toString();
859
+ } else if (typeof value === "boolean") {
860
+ return value ? "true" : "false";
861
+ } else if (Array.isArray(value)) {
862
+ return buildArrayString(value, sqlType);
863
+ } else if (value instanceof Date) {
864
+ if (sqlType === "date") {
865
+ return `"${value.toISOString().split("T")[0]}"`;
866
+ } else if (sqlType === "timestamp") {
867
+ return `"${value.toISOString().replace("T", " ").slice(0, 23)}"`;
868
+ } else {
869
+ return `"${value.toISOString()}"`;
870
+ }
871
+ } else if (typeof value === "object") {
872
+ return `"${JSON.stringify(value).replaceAll('"', '\\"')}"`;
873
+ }
874
+
875
+ return `"${value}"`;
876
+ })
877
+ .join(",");
878
+
879
+ return `{${values}}`;
880
+ }
881
+
882
+ const indexName = (tableName: string, columns: string[]) => {
883
+ return `${tableName}_${columns.join("_")}_index`;
884
+ };
885
+
886
+ const generatePgSnapshot = (
887
+ tables: AnyPgTable[],
888
+ views: PgView[],
889
+ enums: PgEnum<any>[],
890
+ schemas: PgSchema[],
891
+ casing: CasingType | undefined,
892
+ ) => {
893
+ const dialect = new PgDialect({ casing });
894
+ const result: Record<string, Table> = {};
895
+ const resultViews: Record<string, any> = {};
896
+
897
+ // This object stores unique names for indexes and will be used to detect if you have the same names for indexes
898
+ // within the same PostgreSQL schema
899
+ const indexesInSchema: Record<string, string[]> = {};
900
+
901
+ for (const table of tables) {
902
+ const {
903
+ name: tableName,
904
+ columns,
905
+ indexes,
906
+ schema,
907
+ primaryKeys,
908
+ } = getTableConfig(table);
909
+
910
+ const columnsObject: Record<string, Column> = {};
911
+ const indexesObject: Record<string, Index> = {};
912
+ const primaryKeysObject: Record<string, PrimaryKey> = {};
913
+
914
+ columns.forEach((column) => {
915
+ const name = getColumnCasing(column, casing);
916
+ const notNull: boolean = column.notNull;
917
+ const primaryKey: boolean = column.primary;
918
+ const sqlTypeLowered = column.getSQLType().toLowerCase();
919
+
920
+ const typeSchema = is(column, PgEnumColumn)
921
+ ? column.enum.schema || "public"
922
+ : undefined;
923
+
924
+ const columnToSet: Column = {
925
+ name,
926
+ type: column.getSQLType(),
927
+ typeSchema: typeSchema,
928
+ primaryKey,
929
+ notNull,
930
+ };
931
+
932
+ if (column.default !== undefined) {
933
+ if (is(column.default, SQL)) {
934
+ columnToSet.default = sqlToStr(column.default, casing);
935
+ } else {
936
+ if (typeof column.default === "string") {
937
+ columnToSet.default = `'${column.default}'`;
938
+ } else {
939
+ if (sqlTypeLowered === "jsonb" || sqlTypeLowered === "json") {
940
+ columnToSet.default = `'${JSON.stringify(column.default)}'::${sqlTypeLowered}`;
941
+ } else if (column.default instanceof Date) {
942
+ if (sqlTypeLowered === "date") {
943
+ columnToSet.default = `'${column.default.toISOString().split("T")[0]}'`;
944
+ } else if (sqlTypeLowered === "timestamp") {
945
+ columnToSet.default = `'${column.default.toISOString().replace("T", " ").slice(0, 23)}'`;
946
+ } else {
947
+ columnToSet.default = `'${column.default.toISOString()}'`;
948
+ }
949
+ } else if (
950
+ isPgArrayType(sqlTypeLowered) &&
951
+ Array.isArray(column.default)
952
+ ) {
953
+ columnToSet.default = `'${buildArrayString(column.default, sqlTypeLowered)}'`;
954
+ } else {
955
+ // Should do for all types
956
+ // columnToSet.default = `'${column.default}'::${sqlTypeLowered}`;
957
+ columnToSet.default = column.default;
958
+ }
959
+ }
960
+ }
961
+ }
962
+ columnsObject[name] = columnToSet;
963
+ });
964
+
965
+ primaryKeys.map((pk) => {
966
+ const originalColumnNames = pk.columns.map((c) => c.name);
967
+ const columnNames = pk.columns.map((c) => getColumnCasing(c, casing));
968
+
969
+ let name = pk.getName();
970
+ if (casing !== undefined) {
971
+ for (let i = 0; i < originalColumnNames.length; i++) {
972
+ name = name.replace(originalColumnNames[i]!, columnNames[i]!);
973
+ }
974
+ }
975
+
976
+ primaryKeysObject[name] = {
977
+ name,
978
+ columns: columnNames,
979
+ };
980
+ });
981
+
982
+ indexes.forEach((value) => {
983
+ const columns = value.config.columns;
984
+
985
+ const indexColumnNames: string[] = [];
986
+ columns.forEach((it) => {
987
+ const name = getColumnCasing(it as IndexedColumn, casing);
988
+
989
+ indexColumnNames.push(name);
990
+ });
991
+
992
+ const name = value.config.name
993
+ ? value.config.name
994
+ : indexName(tableName, indexColumnNames);
995
+
996
+ const indexColumns: IndexColumnType[] = columns.map(
997
+ (it): IndexColumnType => {
998
+ if (is(it, SQL)) {
999
+ return {
1000
+ expression: dialect.sqlToQuery(it, "indexes").sql,
1001
+ asc: true,
1002
+ isExpression: true,
1003
+ nulls: "last",
1004
+ };
1005
+ } else {
1006
+ it = it as IndexedColumn;
1007
+ return {
1008
+ expression: getColumnCasing(it as IndexedColumn, casing),
1009
+ isExpression: false,
1010
+ // @ts-ignore
1011
+ asc: it.indexConfig?.order === "asc",
1012
+ // @ts-ignore
1013
+ nulls: it.indexConfig?.nulls
1014
+ ? // @ts-ignore
1015
+ it.indexConfig?.nulls
1016
+ : // @ts-ignore
1017
+ it.indexConfig?.order === "desc"
1018
+ ? "first"
1019
+ : "last",
1020
+ // @ts-ignore
1021
+ opclass: it.indexConfig?.opClass,
1022
+ };
1023
+ }
1024
+ },
1025
+ );
1026
+
1027
+ // check for index names duplicates
1028
+ if (typeof indexesInSchema[schema ?? "public"] !== "undefined") {
1029
+ indexesInSchema[schema ?? "public"]!.push(name);
1030
+ } else {
1031
+ indexesInSchema[schema ?? "public"] = [name];
1032
+ }
1033
+
1034
+ indexesObject[name] = {
1035
+ name,
1036
+ columns: indexColumns,
1037
+ isUnique: value.config.unique ?? false,
1038
+ where: value.config.where
1039
+ ? dialect.sqlToQuery(value.config.where).sql
1040
+ : undefined,
1041
+ concurrently: value.config.concurrently ?? false,
1042
+ method: value.config.method ?? "btree",
1043
+ with: value.config.with ?? {},
1044
+ };
1045
+ });
1046
+
1047
+ const tableKey = `${schema ?? "public"}.${tableName}`;
1048
+
1049
+ result[tableKey] = {
1050
+ name: tableName,
1051
+ schema: schema ?? "",
1052
+ columns: columnsObject,
1053
+ indexes: indexesObject,
1054
+ compositePrimaryKeys: primaryKeysObject,
1055
+ };
1056
+ }
1057
+
1058
+ const combinedViews = [...views];
1059
+ for (const view of combinedViews) {
1060
+ // @ts-ignore
1061
+ // biome-ignore lint/suspicious/noImplicitAnyLet: <explanation>
1062
+ // biome-ignore lint/style/useConst: <explanation>
1063
+ let viewName;
1064
+ // @ts-ignore
1065
+ // biome-ignore lint/suspicious/noImplicitAnyLet: <explanation>
1066
+ // biome-ignore lint/style/useConst: <explanation>
1067
+ let schema;
1068
+ // @ts-ignore
1069
+ // biome-ignore lint/suspicious/noImplicitAnyLet: <explanation>
1070
+ // biome-ignore lint/style/useConst: <explanation>
1071
+ let query;
1072
+ // @ts-ignore
1073
+ // biome-ignore lint/suspicious/noImplicitAnyLet: <explanation>
1074
+ // biome-ignore lint/style/useConst: <explanation>
1075
+ let selectedFields;
1076
+ // @ts-ignore
1077
+ // biome-ignore lint/suspicious/noImplicitAnyLet: <explanation>
1078
+ // biome-ignore lint/style/useConst: <explanation>
1079
+ let isExisting;
1080
+ // @ts-ignore
1081
+ // biome-ignore lint/suspicious/noImplicitAnyLet: <explanation>
1082
+ // biome-ignore lint/style/useConst: <explanation>
1083
+ let withOption;
1084
+ // @ts-ignore
1085
+ // biome-ignore lint/suspicious/noImplicitAnyLet: <explanation>
1086
+ // biome-ignore lint/style/useConst: <explanation>
1087
+ let tablespace;
1088
+ // @ts-ignore
1089
+ // biome-ignore lint/suspicious/noImplicitAnyLet: <explanation>
1090
+ // biome-ignore lint/style/useConst: <explanation>
1091
+ let using;
1092
+ // @ts-ignore
1093
+ // biome-ignore lint/suspicious/noImplicitAnyLet: <explanation>
1094
+ // biome-ignore lint/style/useConst: <explanation>
1095
+ let withNoData;
1096
+ const materialized: boolean = false;
1097
+
1098
+ // if (is(view, PgView)) {
1099
+ ({
1100
+ name: viewName,
1101
+ schema,
1102
+ query,
1103
+ selectedFields,
1104
+ isExisting,
1105
+ with: withOption,
1106
+ } = getViewConfig(view));
1107
+ // } else {
1108
+ // ({ name: viewName, schema, query, selectedFields, isExisting, with: withOption, tablespace, using, withNoData } =
1109
+ // getMaterializedViewConfig(view));
1110
+
1111
+ // materialized = true;
1112
+ // }
1113
+
1114
+ const viewSchema = schema ?? "public";
1115
+
1116
+ const viewKey = `${viewSchema}.${viewName}`;
1117
+
1118
+ const columnsObject: Record<string, Column> = {};
1119
+ // const uniqueConstraintObject: Record<string, UniqueConstraint> = {};
1120
+
1121
+ // const existingView = resultViews[viewKey];
1122
+ // if (typeof existingView !== 'undefined') {
1123
+ // console.log(
1124
+ // `\n${
1125
+ // withStyle.errorWarning(
1126
+ // `We\'ve found duplicated view name across ${
1127
+ // chalk.underline.blue(schema ?? 'public')
1128
+ // } schema. Please rename your view`,
1129
+ // )
1130
+ // }`,
1131
+ // );
1132
+ // process.exit(1);
1133
+ // }
1134
+
1135
+ for (const key in selectedFields) {
1136
+ if (is(selectedFields[key], PgColumn)) {
1137
+ const column = selectedFields[key] as PgColumn;
1138
+
1139
+ const notNull: boolean = column.notNull;
1140
+ const primaryKey: boolean = column.primary;
1141
+ const sqlTypeLowered = column.getSQLType().toLowerCase();
1142
+
1143
+ const typeSchema = is(column, PgEnumColumn)
1144
+ ? column.enum.schema || "public"
1145
+ : undefined;
1146
+ // const generated = column.generated;
1147
+ // const identity = column.generatedIdentity;
1148
+
1149
+ // const increment = stringFromIdentityProperty(identity?.sequenceOptions?.increment) ?? '1';
1150
+ // const minValue = stringFromIdentityProperty(identity?.sequenceOptions?.minValue)
1151
+ // ?? (Number.parseFloat(increment) < 0 ? minRangeForIdentityBasedOn(column.columnType) : '1');
1152
+ // const maxValue = stringFromIdentityProperty(identity?.sequenceOptions?.maxValue)
1153
+ // ?? (Number.parseFloat(increment) < 0 ? '-1' : maxRangeForIdentityBasedOn(column.getSQLType()));
1154
+ // const startWith = stringFromIdentityProperty(identity?.sequenceOptions?.startWith)
1155
+ // ?? (Number.parseFloat(increment) < 0 ? maxValue : minValue);
1156
+ // const cache = stringFromIdentityProperty(identity?.sequenceOptions?.cache) ?? '1';
1157
+
1158
+ const columnToSet: Column = {
1159
+ name: column.name,
1160
+ type: column.getSQLType(),
1161
+ typeSchema: typeSchema,
1162
+ primaryKey,
1163
+ notNull,
1164
+ // generated: generated
1165
+ // ? {
1166
+ // as: is(generated.as, SQL)
1167
+ // ? dialect.sqlToQuery(generated.as as SQL).sql
1168
+ // : typeof generated.as === 'function'
1169
+ // ? dialect.sqlToQuery(generated.as() as SQL).sql
1170
+ // : (generated.as as any),
1171
+ // type: 'stored',
1172
+ // }
1173
+ // : undefined,
1174
+ // identity: identity
1175
+ // ? {
1176
+ // type: identity.type,
1177
+ // name: identity.sequenceName ?? `${viewName}_${column.name}_seq`,
1178
+ // schema: schema ?? 'public',
1179
+ // increment,
1180
+ // startWith,
1181
+ // minValue,
1182
+ // maxValue,
1183
+ // cache,
1184
+ // cycle: identity?.sequenceOptions?.cycle ?? false,
1185
+ // }
1186
+ // : undefined,
1187
+ };
1188
+
1189
+ // if (column.isUnique) {
1190
+ // // const existingUnique = uniqueConstraintObject[column.uniqueName!];
1191
+ // // if (typeof existingUnique !== 'undefined') {
1192
+ // // console.log(
1193
+ // // `\n${
1194
+ // // withStyle.errorWarning(
1195
+ // // `We\'ve found duplicated unique constraint names in ${chalk.underline.blue(viewName)} table.
1196
+ // // The unique constraint ${chalk.underline.blue(column.uniqueName)} on the ${
1197
+ // // chalk.underline.blue(
1198
+ // // column.name,
1199
+ // // )
1200
+ // // } column is conflicting with a unique constraint name already defined for ${
1201
+ // // chalk.underline.blue(existingUnique.columns.join(','))
1202
+ // // } columns\n`,
1203
+ // // )
1204
+ // // }`,
1205
+ // // );
1206
+ // // process.exit(1);
1207
+ // // }
1208
+ // uniqueConstraintObject[column.uniqueName!] = {
1209
+ // name: column.uniqueName!,
1210
+ // nullsNotDistinct: column.uniqueType === 'not distinct',
1211
+ // columns: [columnToSet.name],
1212
+ // };
1213
+ // }
1214
+
1215
+ if (column.default !== undefined) {
1216
+ if (is(column.default, SQL)) {
1217
+ columnToSet.default = sqlToStr(column.default, casing);
1218
+ } else {
1219
+ if (typeof column.default === "string") {
1220
+ columnToSet.default = `'${column.default}'`;
1221
+ } else {
1222
+ if (sqlTypeLowered === "jsonb" || sqlTypeLowered === "json") {
1223
+ columnToSet.default = `'${JSON.stringify(column.default)}'::${sqlTypeLowered}`;
1224
+ } else if (column.default instanceof Date) {
1225
+ if (sqlTypeLowered === "date") {
1226
+ columnToSet.default = `'${column.default.toISOString().split("T")[0]}'`;
1227
+ } else if (sqlTypeLowered === "timestamp") {
1228
+ columnToSet.default = `'${column.default.toISOString().replace("T", " ").slice(0, 23)}'`;
1229
+ } else {
1230
+ columnToSet.default = `'${column.default.toISOString()}'`;
1231
+ }
1232
+ } else if (
1233
+ isPgArrayType(sqlTypeLowered) &&
1234
+ Array.isArray(column.default)
1235
+ ) {
1236
+ columnToSet.default = `'${buildArrayString(column.default, sqlTypeLowered)}'`;
1237
+ } else {
1238
+ // Should do for all types
1239
+ // columnToSet.default = `'${column.default}'::${sqlTypeLowered}`;
1240
+ columnToSet.default = column.default;
1241
+ }
1242
+ }
1243
+ }
1244
+ }
1245
+ columnsObject[column.name] = columnToSet;
1246
+ }
1247
+ }
1248
+
1249
+ resultViews[viewKey] = {
1250
+ columns: columnsObject,
1251
+ definition: isExisting ? undefined : dialect.sqlToQuery(query!).sql,
1252
+ name: viewName,
1253
+ schema: viewSchema,
1254
+ isExisting,
1255
+ with: withOption,
1256
+ withNoData,
1257
+ materialized,
1258
+ tablespace,
1259
+ using,
1260
+ };
1261
+ }
1262
+
1263
+ const enumsToReturn: Record<string, Enum> = enums.reduce<{
1264
+ [key: string]: Enum;
1265
+ }>((map, obj) => {
1266
+ const enumSchema = obj.schema || "public";
1267
+ const key = `${enumSchema}.${obj.enumName}`;
1268
+ map[key] = {
1269
+ name: obj.enumName,
1270
+ schema: enumSchema,
1271
+ values: obj.enumValues,
1272
+ };
1273
+ return map;
1274
+ }, {});
1275
+
1276
+ const schemasObject = Object.fromEntries(
1277
+ schemas
1278
+ .filter((it) => {
1279
+ return it.schemaName !== "public";
1280
+ })
1281
+ .map((it) => [it.schemaName, it.schemaName]),
1282
+ );
1283
+
1284
+ return {
1285
+ version: "7",
1286
+ dialect: "postgresql",
1287
+ tables: result,
1288
+ enums: enumsToReturn,
1289
+ schemas: schemasObject,
1290
+ views: resultViews,
1291
+ };
1292
+ };
1293
+
1294
+ const mapValues = <IN, OUT>(
1295
+ obj: Record<string, IN>,
1296
+ map: (input: IN) => OUT,
1297
+ ): Record<string, OUT> => {
1298
+ const result = Object.keys(obj).reduce(
1299
+ (result, key) => {
1300
+ result[key] = map(obj[key]!);
1301
+ return result;
1302
+ },
1303
+ {} as Record<string, OUT>,
1304
+ );
1305
+ return result;
1306
+ };
1307
+
1308
+ const squashPgScheme = (json: PgSchemaSquashed): PgSchemaSquashed => {
1309
+ const mappedTables = Object.fromEntries(
1310
+ Object.entries(json.tables).map((it: [string, any]) => {
1311
+ const squashedIndexes = mapValues(it[1]!.indexes, (index) => {
1312
+ return PgSquasher.squashIdx(index);
1313
+ });
1314
+
1315
+ const squashedPKs = mapValues(it[1]!.compositePrimaryKeys, (pk) => {
1316
+ return PgSquasher.squashPK(pk);
1317
+ });
1318
+
1319
+ const mappedColumns = Object.fromEntries(
1320
+ Object.entries(it[1]!.columns).map((it) => {
1321
+ return [
1322
+ it[0],
1323
+ {
1324
+ ...it[1]!,
1325
+ identity: undefined,
1326
+ },
1327
+ ];
1328
+ }),
1329
+ );
1330
+
1331
+ return [
1332
+ it[0],
1333
+ {
1334
+ name: it[1]!.name,
1335
+ schema: it[1]!.schema,
1336
+ columns: mappedColumns,
1337
+ indexes: squashedIndexes,
1338
+ compositePrimaryKeys: squashedPKs,
1339
+ },
1340
+ ];
1341
+ }),
1342
+ );
1343
+
1344
+ return {
1345
+ version: "7",
1346
+ dialect: json.dialect,
1347
+ tables: mappedTables,
1348
+ enums: json.enums,
1349
+ schemas: json.schemas,
1350
+ views: json.views,
1351
+ };
1352
+ };