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