@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,870 @@
1
+ import {
2
+ getPartitionName,
3
+ getPrimaryKeyColumns,
4
+ getReorgProcedureName,
5
+ getReorgTableName,
6
+ getReorgTriggerName,
7
+ } from "@/drizzle/index.js";
8
+ import { getColumnCasing, getReorgTable } from "@/drizzle/kit/index.js";
9
+ import {
10
+ getLiveQueryChannelName,
11
+ getLiveQueryNotifyProcedureName,
12
+ getLiveQueryNotifyTriggerName,
13
+ getLiveQueryProcedureName,
14
+ getLiveQueryTriggerName,
15
+ getViewsLiveQueryNotifyTriggerName,
16
+ } from "@/drizzle/onchain.js";
17
+ import type { Logger } from "@/internal/logger.js";
18
+ import type {
19
+ NamespaceBuild,
20
+ PreBuild,
21
+ SchemaBuild,
22
+ } from "@/internal/types.js";
23
+ import { MAX_CHECKPOINT_STRING, decodeCheckpoint } from "@/utils/checkpoint.js";
24
+ import {
25
+ type SQL,
26
+ type Table,
27
+ type View,
28
+ and,
29
+ eq,
30
+ getTableColumns,
31
+ getTableName,
32
+ getViewName,
33
+ lte,
34
+ sql,
35
+ } from "drizzle-orm";
36
+ import { getTableConfig } from "drizzle-orm/pg-core";
37
+ import { getPonderCheckpointTable } from "./index.js";
38
+ import type { QB } from "./queryBuilder.js";
39
+
40
+ export const createIndexes = async (
41
+ qb: QB,
42
+ { statements }: { statements: SchemaBuild["statements"] },
43
+ context?: { logger?: Logger },
44
+ ) => {
45
+ for (const statement of statements.indexes.sql) {
46
+ await qb.transaction(
47
+ { label: "create_indexes" },
48
+ async (tx) => {
49
+ // 60 minutes
50
+ await tx.wrap((tx) => tx.execute("SET statement_timeout = 3600000;"));
51
+ await tx.wrap((tx) => tx.execute(statement));
52
+ },
53
+ undefined,
54
+ context,
55
+ );
56
+ }
57
+ };
58
+
59
+ export const createTriggers = async (
60
+ qb: QB,
61
+ { tables, chainId }: { tables: Table[]; chainId?: number },
62
+ context?: { logger?: Logger },
63
+ ) => {
64
+ await qb.transaction(
65
+ async (tx) => {
66
+ await Promise.all(
67
+ tables.map(async (table) => {
68
+ const schema = getTableConfig(table).schema ?? "public";
69
+ const columns = getTableColumns(table);
70
+
71
+ const columnNames = Object.values(columns).map(
72
+ (column) => `"${getColumnCasing(column, "snake_case")}"`,
73
+ );
74
+
75
+ await tx.wrap({ label: "create_trigger" }, (tx) =>
76
+ tx.execute(
77
+ `
78
+ CREATE OR REPLACE FUNCTION "${schema}".${getReorgProcedureName(table)}
79
+ RETURNS TRIGGER AS $$
80
+ BEGIN
81
+ IF TG_OP = 'INSERT' THEN
82
+ INSERT INTO "${schema}"."${getReorgTableName(table)}" (${columnNames.join(",")}, operation, checkpoint)
83
+ VALUES (${columnNames.map((name) => `NEW.${name}`).join(",")}, 0, '${MAX_CHECKPOINT_STRING}');
84
+ ELSIF TG_OP = 'UPDATE' THEN
85
+ INSERT INTO "${schema}"."${getReorgTableName(table)}" (${columnNames.join(",")}, operation, checkpoint)
86
+ VALUES (${columnNames.map((name) => `OLD.${name}`).join(",")}, 1, '${MAX_CHECKPOINT_STRING}');
87
+ ELSIF TG_OP = 'DELETE' THEN
88
+ INSERT INTO "${schema}"."${getReorgTableName(table)}" (${columnNames.join(",")}, operation, checkpoint)
89
+ VALUES (${columnNames.map((name) => `OLD.${name}`).join(",")}, 2, '${MAX_CHECKPOINT_STRING}');
90
+ END IF;
91
+ RETURN NULL;
92
+ END;
93
+ $$ LANGUAGE plpgsql`,
94
+ ),
95
+ );
96
+
97
+ await tx.wrap({ label: "create_trigger" }, (tx) =>
98
+ tx.execute(
99
+ `
100
+ CREATE OR REPLACE TRIGGER "${getReorgTriggerName()}"
101
+ AFTER INSERT OR UPDATE OR DELETE ON "${schema}"."${chainId === undefined ? getTableName(table) : getPartitionName(table, chainId)}"
102
+ FOR EACH ROW EXECUTE PROCEDURE "${schema}".${getReorgProcedureName(table)};
103
+ `,
104
+ ),
105
+ );
106
+ }),
107
+ );
108
+ },
109
+ undefined,
110
+ context,
111
+ );
112
+ };
113
+
114
+ export const dropTriggers = async (
115
+ qb: QB,
116
+ { tables, chainId }: { tables: Table[]; chainId?: number },
117
+ context?: { logger?: Logger },
118
+ ) => {
119
+ await qb.transaction(
120
+ async (tx) => {
121
+ await Promise.all(
122
+ tables.map(async (table) => {
123
+ const schema = getTableConfig(table).schema ?? "public";
124
+
125
+ await tx.wrap({ label: "drop_trigger" }, (tx) =>
126
+ tx.execute(
127
+ `DROP TRIGGER IF EXISTS "${getReorgTriggerName()}" ON "${schema}"."${chainId === undefined ? getTableName(table) : getPartitionName(table, chainId)}"`,
128
+ ),
129
+ );
130
+ }),
131
+ );
132
+ },
133
+ undefined,
134
+ context,
135
+ );
136
+ };
137
+
138
+ export const createLiveQueryTriggers = async (
139
+ qb: QB,
140
+ {
141
+ namespaceBuild,
142
+ tables,
143
+ chainId,
144
+ }: { namespaceBuild: NamespaceBuild; tables: Table[]; chainId?: number },
145
+ context?: { logger?: Logger },
146
+ ) => {
147
+ await qb.transaction(
148
+ async (tx) => {
149
+ const notifyProcedure = getLiveQueryNotifyProcedureName();
150
+ const notifyTrigger = getLiveQueryNotifyTriggerName();
151
+
152
+ await tx.wrap((tx) =>
153
+ tx.execute(
154
+ `
155
+ CREATE OR REPLACE TRIGGER "${notifyTrigger}"
156
+ AFTER INSERT OR UPDATE OR DELETE ON "${namespaceBuild.schema}"._ponder_checkpoint
157
+ FOR EACH STATEMENT EXECUTE PROCEDURE "${namespaceBuild.schema}".${notifyProcedure};`,
158
+ ),
159
+ );
160
+
161
+ const trigger = getLiveQueryTriggerName();
162
+ const procedure = getLiveQueryProcedureName();
163
+
164
+ for (const table of tables) {
165
+ const schema = getTableConfig(table).schema ?? "public";
166
+
167
+ // Note: Because the realtime indexing store writes to the parent table, we create the trigger on
168
+ // the parent table instead of the partition table.
169
+ await tx.wrap((tx) =>
170
+ tx.execute(
171
+ `
172
+ CREATE OR REPLACE TRIGGER "${trigger}"
173
+ AFTER INSERT OR UPDATE OR DELETE ON "${schema}"."${chainId === undefined ? getTableName(table) : getPartitionName(table, chainId)}"
174
+ FOR EACH ROW EXECUTE PROCEDURE "${schema}".${procedure};`,
175
+ ),
176
+ );
177
+ }
178
+ },
179
+ undefined,
180
+ context,
181
+ );
182
+ };
183
+
184
+ export const dropLiveQueryTriggers = async (
185
+ qb: QB,
186
+ {
187
+ namespaceBuild,
188
+ tables,
189
+ chainId,
190
+ }: { namespaceBuild: NamespaceBuild; tables: Table[]; chainId?: number },
191
+ context?: { logger?: Logger },
192
+ ) => {
193
+ await qb.transaction(
194
+ async (tx) => {
195
+ const notifyTrigger = getLiveQueryNotifyTriggerName();
196
+ await tx.wrap((tx) =>
197
+ tx.execute(
198
+ `DROP TRIGGER IF EXISTS "${notifyTrigger}" ON "${namespaceBuild.schema}"._ponder_checkpoint;`,
199
+ ),
200
+ );
201
+
202
+ const trigger = getLiveQueryTriggerName();
203
+ for (const table of tables) {
204
+ const schema = getTableConfig(table).schema ?? "public";
205
+
206
+ await tx.wrap((tx) =>
207
+ tx.execute(
208
+ `DROP TRIGGER IF EXISTS "${trigger}" ON "${schema}"."${chainId === undefined ? getTableName(table) : getPartitionName(table, chainId)}";`,
209
+ ),
210
+ );
211
+ }
212
+ },
213
+ undefined,
214
+ context,
215
+ );
216
+ };
217
+
218
+ export const createLiveQueryProcedures = async (
219
+ qb: QB,
220
+ { namespaceBuild }: { namespaceBuild: NamespaceBuild },
221
+ context?: { logger?: Logger },
222
+ ) => {
223
+ await qb.transaction(
224
+ async (tx) => {
225
+ const schema = namespaceBuild.schema;
226
+ const procedure = getLiveQueryProcedureName();
227
+
228
+ await tx.wrap(
229
+ (tx) =>
230
+ tx.execute(
231
+ `
232
+ CREATE OR REPLACE FUNCTION "${schema}".${procedure}
233
+ RETURNS TRIGGER LANGUAGE plpgsql
234
+ AS $$
235
+ BEGIN
236
+ INSERT INTO live_query_tables (table_name)
237
+ VALUES (TG_TABLE_NAME)
238
+ ON CONFLICT (table_name) DO NOTHING;
239
+ RETURN NULL;
240
+ END;
241
+ $$;`,
242
+ ),
243
+ context,
244
+ );
245
+
246
+ const notifyProcedure = getLiveQueryNotifyProcedureName();
247
+ const channel = getLiveQueryChannelName(namespaceBuild.schema);
248
+
249
+ await tx.wrap(
250
+ (tx) =>
251
+ tx.execute(`
252
+ CREATE OR REPLACE FUNCTION "${schema}".${notifyProcedure}
253
+ RETURNS TRIGGER LANGUAGE plpgsql
254
+ AS $$
255
+ DECLARE
256
+ table_names json;
257
+ table_exists boolean := false;
258
+ BEGIN
259
+ SELECT EXISTS (
260
+ SELECT 1
261
+ FROM information_schema.tables
262
+ WHERE table_name = 'live_query_tables'
263
+ AND table_type = 'LOCAL TEMPORARY'
264
+ ) INTO table_exists;
265
+
266
+ IF table_exists THEN
267
+ SELECT json_agg(table_name) INTO table_names
268
+ FROM live_query_tables;
269
+
270
+ table_names := COALESCE(table_names, '[]'::json);
271
+ PERFORM pg_notify('${channel}', table_names::text);
272
+ END IF;
273
+
274
+ RETURN NULL;
275
+ END;
276
+ $$;`),
277
+ context,
278
+ );
279
+ },
280
+ undefined,
281
+ context,
282
+ );
283
+ };
284
+
285
+ export const createViews = async (
286
+ qb: QB,
287
+ {
288
+ tables,
289
+ views,
290
+ namespaceBuild,
291
+ }: { tables: Table[]; views: View[]; namespaceBuild: NamespaceBuild },
292
+ context?: { logger?: Logger },
293
+ ) => {
294
+ await qb.transaction(
295
+ { label: "create_views" },
296
+ async (tx) => {
297
+ await tx.wrap((tx) =>
298
+ tx.execute(
299
+ `CREATE SCHEMA IF NOT EXISTS "${namespaceBuild.viewsSchema}"`,
300
+ ),
301
+ );
302
+
303
+ // Note: Drop views before creating new ones because Postgres does not support
304
+ // altering the schema of a view with CREATE OR REPLACE VIEW.
305
+
306
+ for (const table of tables) {
307
+ await tx.wrap((tx) =>
308
+ tx.execute(
309
+ `DROP VIEW IF EXISTS "${namespaceBuild.viewsSchema}"."${getTableName(table)}"`,
310
+ ),
311
+ );
312
+
313
+ await tx.wrap((tx) =>
314
+ tx.execute(
315
+ `CREATE VIEW "${namespaceBuild.viewsSchema}"."${getTableName(table)}" AS SELECT * FROM "${namespaceBuild.schema}"."${getTableName(table)}"`,
316
+ ),
317
+ );
318
+ }
319
+
320
+ for (const view of views) {
321
+ await tx.wrap((tx) =>
322
+ tx.execute(
323
+ `DROP VIEW IF EXISTS "${namespaceBuild.viewsSchema}"."${getViewName(view)}"`,
324
+ ),
325
+ );
326
+
327
+ await tx.wrap((tx) =>
328
+ tx.execute(
329
+ `CREATE VIEW "${namespaceBuild.viewsSchema}"."${getViewName(view)}" AS SELECT * FROM "${namespaceBuild.schema}"."${getViewName(view)}"`,
330
+ ),
331
+ );
332
+ }
333
+
334
+ await tx.wrap((tx) =>
335
+ tx.execute(
336
+ `DROP VIEW IF EXISTS "${namespaceBuild.viewsSchema}"."_ponder_meta"`,
337
+ ),
338
+ );
339
+
340
+ await tx.wrap((tx) =>
341
+ tx.execute(
342
+ `DROP VIEW IF EXISTS "${namespaceBuild.viewsSchema}"."_ponder_checkpoint"`,
343
+ ),
344
+ );
345
+
346
+ await tx.wrap((tx) =>
347
+ tx.execute(
348
+ `CREATE VIEW "${namespaceBuild.viewsSchema}"."_ponder_meta" AS SELECT * FROM "${namespaceBuild.schema}"."_ponder_meta"`,
349
+ ),
350
+ );
351
+
352
+ await tx.wrap((tx) =>
353
+ tx.execute(
354
+ `CREATE VIEW "${namespaceBuild.viewsSchema}"."_ponder_checkpoint" AS SELECT * FROM "${namespaceBuild.schema}"."_ponder_checkpoint"`,
355
+ ),
356
+ );
357
+
358
+ const notifyProcedure = getLiveQueryNotifyProcedureName();
359
+ const channel = getLiveQueryChannelName(namespaceBuild.viewsSchema!);
360
+
361
+ await tx.wrap((tx) =>
362
+ tx.execute(`
363
+ CREATE OR REPLACE FUNCTION "${namespaceBuild.viewsSchema}".${notifyProcedure}
364
+ RETURNS TRIGGER LANGUAGE plpgsql
365
+ AS $$
366
+ DECLARE
367
+ table_names json;
368
+ table_exists boolean := false;
369
+ BEGIN
370
+ SELECT EXISTS (
371
+ SELECT 1
372
+ FROM information_schema.tables
373
+ WHERE table_name = 'live_query_tables'
374
+ AND table_type = 'LOCAL TEMPORARY'
375
+ ) INTO table_exists;
376
+
377
+ IF table_exists THEN
378
+ SELECT json_agg(table_name) INTO table_names
379
+ FROM live_query_tables;
380
+
381
+ table_names := COALESCE(table_names, '[]'::json);
382
+ PERFORM pg_notify('${channel}', table_names::text);
383
+ END IF;
384
+
385
+ RETURN NULL;
386
+ END;
387
+ $$;`),
388
+ );
389
+
390
+ const trigger = getViewsLiveQueryNotifyTriggerName(
391
+ namespaceBuild.viewsSchema,
392
+ );
393
+
394
+ await tx.wrap((tx) =>
395
+ tx.execute(
396
+ `
397
+ CREATE OR REPLACE TRIGGER "${trigger}"
398
+ AFTER INSERT OR UPDATE OR DELETE
399
+ ON "${namespaceBuild.schema!}"._ponder_checkpoint
400
+ FOR EACH STATEMENT
401
+ EXECUTE PROCEDURE "${namespaceBuild.viewsSchema}".${notifyProcedure};`,
402
+ ),
403
+ );
404
+ },
405
+ undefined,
406
+ context,
407
+ );
408
+ };
409
+
410
+ export const revertOmnichain = async (
411
+ qb: QB,
412
+ {
413
+ checkpoint,
414
+ tables,
415
+ }: {
416
+ checkpoint: string;
417
+ tables: Table[];
418
+ },
419
+ context?: { logger?: Logger },
420
+ ): Promise<number[]> => {
421
+ if (tables.length === 0) return [];
422
+
423
+ return qb.transaction(
424
+ { label: "revert" },
425
+ async (tx) => {
426
+ const counts: number[] = [];
427
+
428
+ for (const table of tables) {
429
+ const primaryKeyColumns = getPrimaryKeyColumns(table);
430
+ const schema = getTableConfig(table).schema ?? "public";
431
+
432
+ const result = await tx.wrap((tx) =>
433
+ tx.execute(`
434
+ WITH reverted1 AS (
435
+ DELETE FROM "${schema}"."${getReorgTableName(table)}"
436
+ WHERE checkpoint > '${checkpoint}' RETURNING *
437
+ ), reverted2 AS (
438
+ SELECT ${primaryKeyColumns.map(({ sql }) => `"${sql}"`).join(", ")}, MIN(operation_id) AS operation_id FROM reverted1
439
+ GROUP BY ${primaryKeyColumns.map(({ sql }) => `"${sql}"`).join(", ")}
440
+ ), reverted3 AS (
441
+ SELECT ${Object.values(getTableColumns(table))
442
+ .map((column) => `reverted1."${getColumnCasing(column, "snake_case")}"`)
443
+ .join(", ")}, reverted1.operation FROM reverted2
444
+ INNER JOIN reverted1
445
+ ON ${primaryKeyColumns.map(({ sql }) => `reverted2."${sql}" = reverted1."${sql}"`).join("AND ")}
446
+ AND reverted2.operation_id = reverted1.operation_id
447
+ ), ${getRevertSql({ table })};`),
448
+ );
449
+
450
+ // @ts-ignore
451
+ counts.push(result.rows[0]!.count);
452
+ }
453
+
454
+ return counts;
455
+ },
456
+ undefined,
457
+ context,
458
+ );
459
+ };
460
+
461
+ export const revertMultichain = async (
462
+ qb: QB,
463
+ {
464
+ checkpoint,
465
+ tables,
466
+ }: {
467
+ checkpoint: string;
468
+ tables: Table[];
469
+ },
470
+ context?: { logger?: Logger },
471
+ ): Promise<number[]> => {
472
+ if (tables.length === 0) return [];
473
+
474
+ return qb.transaction(
475
+ { label: "revert" },
476
+ async (tx) => {
477
+ const counts: number[] = [];
478
+
479
+ const minOperationId = await tx
480
+ .wrap((tx) =>
481
+ tx.execute(`
482
+ SELECT MIN(operation_id) AS operation_id FROM (
483
+ ${tables
484
+ .map(
485
+ (table) => `
486
+ SELECT MIN(operation_id) AS operation_id FROM "${getTableConfig(table).schema ?? "public"}"."${getReorgTableName(table)}"
487
+ WHERE SUBSTRING(checkpoint, 11, 16)::numeric = ${String(decodeCheckpoint(checkpoint).chainId)}
488
+ AND checkpoint > '${checkpoint}'`,
489
+ )
490
+ .join(" UNION ALL ")}) AS all_mins;`),
491
+ )
492
+ .then((result) => {
493
+ // @ts-ignore
494
+ return result.rows[0]?.operation_id as string | null;
495
+ });
496
+
497
+ for (const table of tables) {
498
+ const primaryKeyColumns = getPrimaryKeyColumns(table);
499
+ const schema = getTableConfig(table).schema ?? "public";
500
+
501
+ const result = await tx.wrap((tx) =>
502
+ tx.execute(`
503
+ WITH reverted1 AS (
504
+ DELETE FROM "${schema}"."${getReorgTableName(table)}"
505
+ WHERE ${minOperationId!} IS NOT NULL AND operation_id >= ${minOperationId!}
506
+ RETURNING *
507
+ ), reverted2 AS (
508
+ SELECT ${primaryKeyColumns.map(({ sql }) => `"${sql}"`).join(", ")}, MIN(operation_id) AS operation_id FROM reverted1
509
+ GROUP BY ${primaryKeyColumns.map(({ sql }) => `"${sql}"`).join(", ")}
510
+ ), reverted3 AS (
511
+ SELECT ${Object.values(getTableColumns(table))
512
+ .map((column) => `reverted1."${getColumnCasing(column, "snake_case")}"`)
513
+ .join(", ")}, reverted1.operation FROM reverted2
514
+ INNER JOIN reverted1
515
+ ON ${primaryKeyColumns.map(({ sql }) => `reverted2."${sql}" = reverted1."${sql}"`).join("AND ")}
516
+ AND reverted2.operation_id = reverted1.operation_id
517
+ ), ${getRevertSql({ table })};`),
518
+ );
519
+
520
+ // @ts-ignore
521
+ counts.push(result.rows[0]!.count);
522
+ }
523
+
524
+ return counts;
525
+ },
526
+ undefined,
527
+ context,
528
+ );
529
+ };
530
+
531
+ export const revertIsolated = async (
532
+ qb: QB,
533
+ {
534
+ checkpoint,
535
+ tables,
536
+ }: {
537
+ checkpoint: string;
538
+ tables: Table[];
539
+ },
540
+ context?: { logger?: Logger },
541
+ ) => {
542
+ if (tables.length === 0) return [];
543
+
544
+ return qb.transaction(
545
+ { label: "revert" },
546
+ async (tx) => {
547
+ const counts: number[] = [];
548
+
549
+ for (const table of tables) {
550
+ const primaryKeyColumns = getPrimaryKeyColumns(table);
551
+ const schema = getTableConfig(table).schema ?? "public";
552
+
553
+ const result = await tx.wrap((tx) =>
554
+ tx.execute(`
555
+ WITH reverted1 AS (
556
+ DELETE FROM "${schema}"."${getReorgTableName(table)}"
557
+ WHERE checkpoint > '${checkpoint}' AND SUBSTRING(checkpoint, 11, 16)::numeric = ${String(decodeCheckpoint(checkpoint).chainId)} RETURNING *
558
+ ), reverted2 AS (
559
+ SELECT ${primaryKeyColumns.map(({ sql }) => `"${sql}"`).join(", ")}, MIN(operation_id) AS operation_id FROM reverted1
560
+ GROUP BY ${primaryKeyColumns.map(({ sql }) => `"${sql}"`).join(", ")}
561
+ ), reverted3 AS (
562
+ SELECT ${Object.values(getTableColumns(table))
563
+ .map((column) => `reverted1."${getColumnCasing(column, "snake_case")}"`)
564
+ .join(", ")}, reverted1.operation FROM reverted2
565
+ INNER JOIN reverted1
566
+ ON ${primaryKeyColumns.map(({ sql }) => `reverted2."${sql}" = reverted1."${sql}"`).join("AND ")}
567
+ AND reverted2.operation_id = reverted1.operation_id
568
+ ), ${getRevertSql({ table })};`),
569
+ );
570
+
571
+ // @ts-ignore
572
+ counts.push(result.rows[0]!.count);
573
+ }
574
+
575
+ return counts;
576
+ },
577
+ undefined,
578
+ context,
579
+ );
580
+ };
581
+
582
+ export const finalizeOmnichain = async (
583
+ qb: QB,
584
+ {
585
+ checkpoint,
586
+ tables,
587
+ namespaceBuild,
588
+ }: {
589
+ checkpoint: string;
590
+ tables: Table[];
591
+ namespaceBuild: NamespaceBuild;
592
+ },
593
+ context?: { logger?: Logger },
594
+ ) => {
595
+ const PONDER_CHECKPOINT = getPonderCheckpointTable(namespaceBuild.schema);
596
+
597
+ // TODO(kyle) is this breaking an invariant?
598
+ if (tables.length === 0) {
599
+ await qb.wrap(
600
+ (db) =>
601
+ db
602
+ .update(PONDER_CHECKPOINT)
603
+ .set({ finalizedCheckpoint: checkpoint, safeCheckpoint: checkpoint }),
604
+ context,
605
+ );
606
+ return;
607
+ }
608
+
609
+ return qb.transaction(
610
+ { label: "finalize" },
611
+ async (tx) => {
612
+ await tx.wrap((tx) =>
613
+ tx.update(PONDER_CHECKPOINT).set({
614
+ finalizedCheckpoint: checkpoint,
615
+ safeCheckpoint: checkpoint,
616
+ }),
617
+ );
618
+
619
+ for (const table of tables) {
620
+ await tx.wrap((tx) =>
621
+ tx
622
+ .delete(getReorgTable(table))
623
+ .where(lte(getReorgTable(table).checkpoint, checkpoint)),
624
+ );
625
+ }
626
+ },
627
+ undefined,
628
+ context,
629
+ );
630
+ };
631
+
632
+ export const finalizeMultichain = async (
633
+ qb: QB,
634
+ {
635
+ checkpoint,
636
+ tables,
637
+ namespaceBuild,
638
+ }: {
639
+ checkpoint: string;
640
+ tables: Table[];
641
+ namespaceBuild: NamespaceBuild;
642
+ },
643
+ context?: { logger?: Logger },
644
+ ) => {
645
+ const PONDER_CHECKPOINT = getPonderCheckpointTable(namespaceBuild.schema);
646
+
647
+ // TODO(kyle) is this breaking an invariant?
648
+ if (tables.length === 0) {
649
+ await qb.wrap(
650
+ (db) =>
651
+ db
652
+ .update(PONDER_CHECKPOINT)
653
+ .set({ finalizedCheckpoint: checkpoint, safeCheckpoint: checkpoint }),
654
+ context,
655
+ );
656
+ return;
657
+ }
658
+
659
+ // NOTE: It is invariant that PONDER_CHECKPOINT has a value for each chain.
660
+
661
+ return qb.transaction(
662
+ { label: "finalize" },
663
+ async (tx) => {
664
+ await tx.wrap((tx) =>
665
+ tx
666
+ .update(PONDER_CHECKPOINT)
667
+ .set({ finalizedCheckpoint: checkpoint })
668
+ .where(
669
+ eq(
670
+ PONDER_CHECKPOINT.chainId,
671
+ Number(decodeCheckpoint(checkpoint).chainId),
672
+ ),
673
+ ),
674
+ );
675
+
676
+ const minOperationId = await tx
677
+ .wrap((tx) =>
678
+ tx.execute(`
679
+ SELECT MIN(operation_id) AS operation_id FROM (
680
+ ${tables
681
+ .map(
682
+ (table) => `
683
+ SELECT MIN(operation_id) AS operation_id FROM "${getTableConfig(table).schema ?? "public"}"."${getTableName(getReorgTable(table))}"
684
+ WHERE checkpoint > (
685
+ SELECT finalized_checkpoint
686
+ FROM "${getTableConfig(PONDER_CHECKPOINT).schema ?? "public"}"."${getTableName(PONDER_CHECKPOINT)}"
687
+ WHERE chain_id = SUBSTRING(checkpoint, 11, 16)::numeric
688
+ )`,
689
+ )
690
+ .join(" UNION ALL ")}) AS all_mins;`),
691
+ )
692
+ .then((result) => {
693
+ // @ts-ignore
694
+ return result.rows[0]?.operation_id as string | null;
695
+ });
696
+
697
+ const result = await tx.wrap((tx) =>
698
+ tx.execute(`
699
+ WITH ${tables
700
+ .map(
701
+ (table, index) => `
702
+ deleted_${index} AS (
703
+ DELETE FROM "${getTableConfig(table).schema ?? "public"}"."${getTableName(getReorgTable(table))}"
704
+ WHERE ${minOperationId} IS NULL OR operation_id < ${minOperationId}
705
+ RETURNING *
706
+ )`,
707
+ )
708
+ .join(",\n")},
709
+ all_deleted AS (
710
+ ${tables
711
+ .map((_, index) => `SELECT checkpoint FROM deleted_${index}`)
712
+ .join(" UNION ALL ")}
713
+ )
714
+ SELECT MAX(checkpoint) as safe_checkpoint, SUBSTRING(checkpoint, 11, 16)::numeric as chain_id
715
+ FROM all_deleted
716
+ GROUP BY SUBSTRING(checkpoint, 11, 16)::numeric;`),
717
+ );
718
+
719
+ for (const { chain_id, safe_checkpoint } of result.rows) {
720
+ await tx.wrap((tx) =>
721
+ tx
722
+ .update(PONDER_CHECKPOINT)
723
+ .set({ safeCheckpoint: safe_checkpoint as string })
724
+ .where(eq(PONDER_CHECKPOINT.chainId, chain_id as number)),
725
+ );
726
+ }
727
+ },
728
+ undefined,
729
+ context,
730
+ );
731
+ };
732
+
733
+ export const finalizeIsolated = async (
734
+ qb: QB,
735
+ {
736
+ checkpoint,
737
+ tables,
738
+ namespaceBuild,
739
+ }: {
740
+ checkpoint: string;
741
+ tables: Table[];
742
+ namespaceBuild: NamespaceBuild;
743
+ },
744
+ context?: { logger?: Logger },
745
+ ) => {
746
+ const PONDER_CHECKPOINT = getPonderCheckpointTable(namespaceBuild.schema);
747
+ const chainId = Number(decodeCheckpoint(checkpoint).chainId);
748
+
749
+ if (tables.length === 0) {
750
+ await qb.wrap(
751
+ (db) =>
752
+ db
753
+ .update(PONDER_CHECKPOINT)
754
+ .set({ finalizedCheckpoint: checkpoint, safeCheckpoint: checkpoint })
755
+ .where(eq(PONDER_CHECKPOINT.chainId, chainId)),
756
+ context,
757
+ );
758
+ return;
759
+ }
760
+ return qb.transaction({ label: "finalize" }, async (tx) => {
761
+ await tx.wrap((tx) =>
762
+ tx
763
+ .update(PONDER_CHECKPOINT)
764
+ .set({ finalizedCheckpoint: checkpoint, safeCheckpoint: checkpoint })
765
+ .where(eq(PONDER_CHECKPOINT.chainId, chainId)),
766
+ );
767
+
768
+ for (const table of tables) {
769
+ await tx.wrap((tx) =>
770
+ tx
771
+ .delete(getReorgTable(table))
772
+ .where(
773
+ and(
774
+ lte(getReorgTable(table).checkpoint, checkpoint),
775
+ eq(sql`chain_id`, chainId),
776
+ ),
777
+ ),
778
+ );
779
+ }
780
+ });
781
+ };
782
+
783
+ export const commitBlock = async (
784
+ qb: QB,
785
+ {
786
+ checkpoint,
787
+ table,
788
+ preBuild,
789
+ }: { checkpoint: string; table: Table; preBuild: Pick<PreBuild, "ordering"> },
790
+ context?: { logger?: Logger },
791
+ ) => {
792
+ const reorgTable = getReorgTable(table);
793
+ let whereClause: SQL;
794
+ if (preBuild.ordering === "experimental_isolated") {
795
+ // Note: Query must include `chain_id` because it's possible for multiple chains to be indexing in parallel.
796
+ const chainId = Number(decodeCheckpoint(checkpoint).chainId);
797
+ whereClause = and(
798
+ eq(reorgTable.checkpoint, MAX_CHECKPOINT_STRING),
799
+ eq(sql`chain_id`, chainId),
800
+ )!;
801
+ } else {
802
+ whereClause = eq(reorgTable.checkpoint, MAX_CHECKPOINT_STRING);
803
+ }
804
+
805
+ await qb.wrap(
806
+ { label: "commit_block" },
807
+ (db) => db.update(reorgTable).set({ checkpoint }).where(whereClause),
808
+ context,
809
+ );
810
+ };
811
+
812
+ export const crashRecovery = async (
813
+ qb: QB,
814
+ { table }: { table: Table },
815
+ context?: { logger?: Logger },
816
+ ) => {
817
+ const primaryKeyColumns = getPrimaryKeyColumns(table);
818
+ const schema = getTableConfig(table).schema ?? "public";
819
+
820
+ await qb.wrap(
821
+ (db) =>
822
+ db.execute(`
823
+ WITH reverted1 AS (
824
+ DELETE FROM "${schema}"."${getTableName(getReorgTable(table))}"
825
+ RETURNING *
826
+ ), reverted2 AS (
827
+ SELECT ${primaryKeyColumns.map(({ sql }) => `"${sql}"`).join(", ")}, MIN(operation_id) AS operation_id FROM reverted1
828
+ GROUP BY ${primaryKeyColumns.map(({ sql }) => `"${sql}"`).join(", ")}
829
+ ), reverted3 AS (
830
+ SELECT ${Object.values(getTableColumns(table))
831
+ .map((column) => `reverted1."${getColumnCasing(column, "snake_case")}"`)
832
+ .join(", ")}, reverted1.operation FROM reverted2
833
+ INNER JOIN reverted1
834
+ ON ${primaryKeyColumns.map(({ sql }) => `reverted2."${sql}" = reverted1."${sql}"`).join("AND ")}
835
+ AND reverted2.operation_id = reverted1.operation_id
836
+ ), ${getRevertSql({ table })}`),
837
+ context,
838
+ );
839
+ };
840
+
841
+ const getRevertSql = ({ table }: { table: Table }) => {
842
+ const primaryKeyColumns = getPrimaryKeyColumns(table);
843
+ const schema = getTableConfig(table).schema ?? "public";
844
+
845
+ return `
846
+ inserted AS (
847
+ DELETE FROM "${schema}"."${getTableName(table)}" as t
848
+ WHERE EXISTS (
849
+ SELECT * FROM reverted3
850
+ WHERE ${primaryKeyColumns.map(({ sql }) => `t."${sql}" = reverted3."${sql}"`).join("AND ")}
851
+ AND OPERATION = 0
852
+ )
853
+ RETURNING *
854
+ ), updated_or_deleted AS (
855
+ INSERT INTO "${schema}"."${getTableName(table)}"
856
+ SELECT ${Object.values(getTableColumns(table))
857
+ .map((column) => `"${getColumnCasing(column, "snake_case")}"`)
858
+ .join(", ")} FROM reverted3
859
+ WHERE operation = 1 OR operation = 2
860
+ ON CONFLICT (${primaryKeyColumns.map(({ sql }) => `"${sql}"`).join(", ")})
861
+ DO UPDATE SET
862
+ ${Object.values(getTableColumns(table))
863
+ .map(
864
+ (column) =>
865
+ `"${getColumnCasing(column, "snake_case")}" = EXCLUDED."${getColumnCasing(column, "snake_case")}"`,
866
+ )
867
+ .join(", ")}
868
+ RETURNING *
869
+ ) SELECT COUNT(*) FROM reverted1 as count;`;
870
+ };