@hugomrdias/foxer 0.0.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 (311) hide show
  1. package/README.md +56 -0
  2. package/dist/src/api/index.d.ts +2 -0
  3. package/dist/src/api/index.d.ts.map +1 -0
  4. package/dist/src/api/index.js +2 -0
  5. package/dist/src/api/index.js.map +1 -0
  6. package/dist/src/api/runner.d.ts +12 -0
  7. package/dist/src/api/runner.d.ts.map +1 -0
  8. package/dist/src/api/runner.js +29 -0
  9. package/dist/src/api/runner.js.map +1 -0
  10. package/dist/src/api/server.d.ts +18 -0
  11. package/dist/src/api/server.d.ts.map +1 -0
  12. package/dist/src/api/server.js +21 -0
  13. package/dist/src/api/server.js.map +1 -0
  14. package/dist/src/api/sql-middleware.d.ts +7 -0
  15. package/dist/src/api/sql-middleware.d.ts.map +1 -0
  16. package/dist/src/api/sql-middleware.js +95 -0
  17. package/dist/src/api/sql-middleware.js.map +1 -0
  18. package/dist/src/api/sql.d.ts +14 -0
  19. package/dist/src/api/sql.d.ts.map +1 -0
  20. package/dist/src/api/sql.js +108 -0
  21. package/dist/src/api/sql.js.map +1 -0
  22. package/dist/src/api/sse.d.ts +3 -0
  23. package/dist/src/api/sse.d.ts.map +1 -0
  24. package/dist/src/api/sse.js +11 -0
  25. package/dist/src/api/sse.js.map +1 -0
  26. package/dist/src/bin/dev.d.ts +3 -0
  27. package/dist/src/bin/dev.d.ts.map +1 -0
  28. package/dist/src/bin/dev.js +76 -0
  29. package/dist/src/bin/dev.js.map +1 -0
  30. package/dist/src/bin/flags.d.ts +32 -0
  31. package/dist/src/bin/flags.d.ts.map +1 -0
  32. package/dist/src/bin/flags.js +55 -0
  33. package/dist/src/bin/flags.js.map +1 -0
  34. package/dist/src/bin/index.d.ts +3 -0
  35. package/dist/src/bin/index.d.ts.map +1 -0
  36. package/dist/src/bin/index.js +22 -0
  37. package/dist/src/bin/index.js.map +1 -0
  38. package/dist/src/bin/utils.d.ts +4 -0
  39. package/dist/src/bin/utils.d.ts.map +1 -0
  40. package/dist/src/bin/utils.js +52 -0
  41. package/dist/src/bin/utils.js.map +1 -0
  42. package/dist/src/client/index.d.ts +18 -0
  43. package/dist/src/client/index.d.ts.map +1 -0
  44. package/dist/src/client/index.js +150 -0
  45. package/dist/src/client/index.js.map +1 -0
  46. package/dist/src/config/config.d.ts +157 -0
  47. package/dist/src/config/config.d.ts.map +1 -0
  48. package/dist/src/config/config.js +65 -0
  49. package/dist/src/config/config.js.map +1 -0
  50. package/dist/src/config/env.d.ts +25 -0
  51. package/dist/src/config/env.d.ts.map +1 -0
  52. package/dist/src/config/env.js +21 -0
  53. package/dist/src/config/env.js.map +1 -0
  54. package/dist/src/contants.d.ts +4 -0
  55. package/dist/src/contants.d.ts.map +1 -0
  56. package/dist/src/contants.js +4 -0
  57. package/dist/src/contants.js.map +1 -0
  58. package/dist/src/db/actions/blocks.d.ts +44 -0
  59. package/dist/src/db/actions/blocks.d.ts.map +1 -0
  60. package/dist/src/db/actions/blocks.js +152 -0
  61. package/dist/src/db/actions/blocks.js.map +1 -0
  62. package/dist/src/db/actions/index.d.ts +2 -0
  63. package/dist/src/db/actions/index.d.ts.map +1 -0
  64. package/dist/src/db/actions/index.js +2 -0
  65. package/dist/src/db/actions/index.js.map +1 -0
  66. package/dist/src/db/actions/transactions.d.ts +11 -0
  67. package/dist/src/db/actions/transactions.d.ts.map +1 -0
  68. package/dist/src/db/actions/transactions.js +22 -0
  69. package/dist/src/db/actions/transactions.js.map +1 -0
  70. package/dist/src/db/client.d.ts +329 -0
  71. package/dist/src/db/client.d.ts.map +1 -0
  72. package/dist/src/db/client.js +108 -0
  73. package/dist/src/db/client.js.map +1 -0
  74. package/dist/src/db/column-types.d.ts +132 -0
  75. package/dist/src/db/column-types.d.ts.map +1 -0
  76. package/dist/src/db/column-types.js +86 -0
  77. package/dist/src/db/column-types.js.map +1 -0
  78. package/dist/src/db/encode.d.ts +10 -0
  79. package/dist/src/db/encode.d.ts.map +1 -0
  80. package/dist/src/db/encode.js +79 -0
  81. package/dist/src/db/encode.js.map +1 -0
  82. package/dist/src/db/migrate.d.ts +31 -0
  83. package/dist/src/db/migrate.d.ts.map +1 -0
  84. package/dist/src/db/migrate.js +147 -0
  85. package/dist/src/db/migrate.js.map +1 -0
  86. package/dist/src/db/schema/blocks.d.ts +369 -0
  87. package/dist/src/db/schema/blocks.d.ts.map +1 -0
  88. package/dist/src/db/schema/blocks.js +24 -0
  89. package/dist/src/db/schema/blocks.js.map +1 -0
  90. package/dist/src/db/schema/index.d.ts +1415 -0
  91. package/dist/src/db/schema/index.d.ts.map +1 -0
  92. package/dist/src/db/schema/index.js +18 -0
  93. package/dist/src/db/schema/index.js.map +1 -0
  94. package/dist/src/db/schema/transactions.d.ts +336 -0
  95. package/dist/src/db/schema/transactions.d.ts.map +1 -0
  96. package/dist/src/db/schema/transactions.js +33 -0
  97. package/dist/src/db/schema/transactions.js.map +1 -0
  98. package/dist/src/db/transaction.d.ts +7 -0
  99. package/dist/src/db/transaction.d.ts.map +1 -0
  100. package/dist/src/db/transaction.js +8 -0
  101. package/dist/src/db/transaction.js.map +1 -0
  102. package/dist/src/hooks/default-hooks.d.ts +2 -0
  103. package/dist/src/hooks/default-hooks.d.ts.map +1 -0
  104. package/dist/src/hooks/default-hooks.js +107 -0
  105. package/dist/src/hooks/default-hooks.js.map +1 -0
  106. package/dist/src/hooks/registry.d.ts +51 -0
  107. package/dist/src/hooks/registry.d.ts.map +1 -0
  108. package/dist/src/hooks/registry.js +32 -0
  109. package/dist/src/hooks/registry.js.map +1 -0
  110. package/dist/src/index.d.ts +10 -0
  111. package/dist/src/index.d.ts.map +1 -0
  112. package/dist/src/index.js +4 -0
  113. package/dist/src/index.js.map +1 -0
  114. package/dist/src/indexer/backfill.d.ts +15 -0
  115. package/dist/src/indexer/backfill.d.ts.map +1 -0
  116. package/dist/src/indexer/backfill.js +95 -0
  117. package/dist/src/indexer/backfill.js.map +1 -0
  118. package/dist/src/indexer/live.d.ts +20 -0
  119. package/dist/src/indexer/live.d.ts.map +1 -0
  120. package/dist/src/indexer/live.js +51 -0
  121. package/dist/src/indexer/live.js.map +1 -0
  122. package/dist/src/indexer/process-block.d.ts +29 -0
  123. package/dist/src/indexer/process-block.d.ts.map +1 -0
  124. package/dist/src/indexer/process-block.js +91 -0
  125. package/dist/src/indexer/process-block.js.map +1 -0
  126. package/dist/src/indexer/queue-block.d.ts +18 -0
  127. package/dist/src/indexer/queue-block.d.ts.map +1 -0
  128. package/dist/src/indexer/queue-block.js +38 -0
  129. package/dist/src/indexer/queue-block.js.map +1 -0
  130. package/dist/src/indexer/reorg.d.ts +24 -0
  131. package/dist/src/indexer/reorg.d.ts.map +1 -0
  132. package/dist/src/indexer/reorg.js +83 -0
  133. package/dist/src/indexer/reorg.js.map +1 -0
  134. package/dist/src/indexer/runner.d.ts +14 -0
  135. package/dist/src/indexer/runner.d.ts.map +1 -0
  136. package/dist/src/indexer/runner.js +22 -0
  137. package/dist/src/indexer/runner.js.map +1 -0
  138. package/dist/src/rpc/client.d.ts +11 -0
  139. package/dist/src/rpc/client.d.ts.map +1 -0
  140. package/dist/src/rpc/client.js +18 -0
  141. package/dist/src/rpc/client.js.map +1 -0
  142. package/dist/src/rpc/get-block.d.ts +16 -0
  143. package/dist/src/rpc/get-block.d.ts.map +1 -0
  144. package/dist/src/rpc/get-block.js +77 -0
  145. package/dist/src/rpc/get-block.js.map +1 -0
  146. package/dist/src/rpc/get-logs.d.ts +11 -0
  147. package/dist/src/rpc/get-logs.d.ts.map +1 -0
  148. package/dist/src/rpc/get-logs.js +23 -0
  149. package/dist/src/rpc/get-logs.js.map +1 -0
  150. package/dist/src/schema.d.ts +3 -0
  151. package/dist/src/schema.d.ts.map +1 -0
  152. package/dist/src/schema.js +9 -0
  153. package/dist/src/schema.js.map +1 -0
  154. package/dist/src/types.d.ts +22 -0
  155. package/dist/src/types.d.ts.map +1 -0
  156. package/dist/src/types.js +1 -0
  157. package/dist/src/types.js.map +1 -0
  158. package/dist/src/utils/bloom.d.ts +6 -0
  159. package/dist/src/utils/bloom.d.ts.map +1 -0
  160. package/dist/src/utils/bloom.js +30 -0
  161. package/dist/src/utils/bloom.js.map +1 -0
  162. package/dist/src/utils/build-conflict-columns.d.ts +4 -0
  163. package/dist/src/utils/build-conflict-columns.d.ts.map +1 -0
  164. package/dist/src/utils/build-conflict-columns.js +14 -0
  165. package/dist/src/utils/build-conflict-columns.js.map +1 -0
  166. package/dist/src/utils/common.d.ts +2 -0
  167. package/dist/src/utils/common.d.ts.map +1 -0
  168. package/dist/src/utils/common.js +4 -0
  169. package/dist/src/utils/common.js.map +1 -0
  170. package/dist/src/utils/cursor.d.ts +5 -0
  171. package/dist/src/utils/cursor.d.ts.map +1 -0
  172. package/dist/src/utils/cursor.js +8 -0
  173. package/dist/src/utils/cursor.js.map +1 -0
  174. package/dist/src/utils/format.d.ts +2 -0
  175. package/dist/src/utils/format.d.ts.map +1 -0
  176. package/dist/src/utils/format.js +16 -0
  177. package/dist/src/utils/format.js.map +1 -0
  178. package/dist/src/utils/hash.d.ts +9 -0
  179. package/dist/src/utils/hash.d.ts.map +1 -0
  180. package/dist/src/utils/hash.js +15 -0
  181. package/dist/src/utils/hash.js.map +1 -0
  182. package/dist/src/utils/json.d.ts +5 -0
  183. package/dist/src/utils/json.d.ts.map +1 -0
  184. package/dist/src/utils/json.js +11 -0
  185. package/dist/src/utils/json.js.map +1 -0
  186. package/dist/src/utils/logger.d.ts +11 -0
  187. package/dist/src/utils/logger.d.ts.map +1 -0
  188. package/dist/src/utils/logger.js +111 -0
  189. package/dist/src/utils/logger.js.map +1 -0
  190. package/dist/src/utils/shutdown.d.ts +9 -0
  191. package/dist/src/utils/shutdown.d.ts.map +1 -0
  192. package/dist/src/utils/shutdown.js +24 -0
  193. package/dist/src/utils/shutdown.js.map +1 -0
  194. package/dist/src/utils/timer.d.ts +6 -0
  195. package/dist/src/utils/timer.d.ts.map +1 -0
  196. package/dist/src/utils/timer.js +9 -0
  197. package/dist/src/utils/timer.js.map +1 -0
  198. package/dist/src/utils/types.d.ts +39 -0
  199. package/dist/src/utils/types.d.ts.map +1 -0
  200. package/dist/src/utils/types.js +1 -0
  201. package/dist/src/utils/types.js.map +1 -0
  202. package/dist/tsconfig.tsbuildinfo +1 -0
  203. package/hello/apps/foc-api/README.md +69 -0
  204. package/hello/apps/foc-api/biome.json +8 -0
  205. package/hello/apps/foc-api/index.html +13 -0
  206. package/hello/apps/foc-api/package.json +39 -0
  207. package/hello/apps/foc-api/public/vite.svg +1 -0
  208. package/hello/apps/foc-api/src/app.css +45 -0
  209. package/hello/apps/foc-api/src/app.tsx +43 -0
  210. package/hello/apps/foc-api/src/assets/Cloudflare_Logo.svg +51 -0
  211. package/hello/apps/foc-api/src/assets/react.svg +1 -0
  212. package/hello/apps/foc-api/src/client.ts +41 -0
  213. package/hello/apps/foc-api/src/components/account.tsx +100 -0
  214. package/hello/apps/foc-api/src/components/wallet-options.tsx +43 -0
  215. package/hello/apps/foc-api/src/index.css +68 -0
  216. package/hello/apps/foc-api/src/main.tsx +38 -0
  217. package/hello/apps/foc-api/src/vite-env.d.ts +1 -0
  218. package/hello/apps/foc-api/tsconfig.app.json +44 -0
  219. package/hello/apps/foc-api/tsconfig.json +17 -0
  220. package/hello/apps/foc-api/tsconfig.node.json +25 -0
  221. package/hello/apps/foc-api/tsconfig.worker.json +8 -0
  222. package/hello/apps/foc-api/vite.config.ts +8 -0
  223. package/hello/apps/foc-api/worker/capabilities.ts +25 -0
  224. package/hello/apps/foc-api/worker/index.ts +64 -0
  225. package/hello/apps/foc-api/worker/router.ts +35 -0
  226. package/hello/apps/foc-api/worker-configuration.d.ts +7357 -0
  227. package/hello/apps/foc-api/wrangler.jsonc +50 -0
  228. package/hello/apps/foc-app/README.md +69 -0
  229. package/hello/apps/foc-app/biome.json +8 -0
  230. package/hello/apps/foc-app/index.html +13 -0
  231. package/hello/apps/foc-app/package.json +39 -0
  232. package/hello/apps/foc-app/public/vite.svg +1 -0
  233. package/hello/apps/foc-app/src/app.css +45 -0
  234. package/hello/apps/foc-app/src/app.tsx +43 -0
  235. package/hello/apps/foc-app/src/assets/Cloudflare_Logo.svg +51 -0
  236. package/hello/apps/foc-app/src/assets/react.svg +1 -0
  237. package/hello/apps/foc-app/src/client.ts +41 -0
  238. package/hello/apps/foc-app/src/components/account.tsx +100 -0
  239. package/hello/apps/foc-app/src/components/wallet-options.tsx +43 -0
  240. package/hello/apps/foc-app/src/index.css +68 -0
  241. package/hello/apps/foc-app/src/main.tsx +38 -0
  242. package/hello/apps/foc-app/src/vite-env.d.ts +1 -0
  243. package/hello/apps/foc-app/tsconfig.app.json +44 -0
  244. package/hello/apps/foc-app/tsconfig.json +17 -0
  245. package/hello/apps/foc-app/tsconfig.node.json +25 -0
  246. package/hello/apps/foc-app/tsconfig.worker.json +8 -0
  247. package/hello/apps/foc-app/vite.config.ts +8 -0
  248. package/hello/apps/foc-app/worker/capabilities.ts +25 -0
  249. package/hello/apps/foc-app/worker/index.ts +64 -0
  250. package/hello/apps/foc-app/worker/router.ts +35 -0
  251. package/hello/apps/foc-app/worker-configuration.d.ts +7357 -0
  252. package/hello/apps/foc-app/wrangler.jsonc +50 -0
  253. package/hello/biome.json +50 -0
  254. package/hello/package.json +22 -0
  255. package/hello/pnpm-workspace.yaml +3 -0
  256. package/hello/tsconfig.json +37 -0
  257. package/package.json +78 -0
  258. package/src/api/index.ts +1 -0
  259. package/src/api/runner.ts +43 -0
  260. package/src/api/server.ts +38 -0
  261. package/src/api/sql-middleware.ts +131 -0
  262. package/src/api/sql.ts +149 -0
  263. package/src/api/sse.ts +12 -0
  264. package/src/bin/create.ts +199 -0
  265. package/src/bin/dev.ts +91 -0
  266. package/src/bin/flags.ts +65 -0
  267. package/src/bin/index.ts +28 -0
  268. package/src/bin/utils.ts +55 -0
  269. package/src/config/config.ts +221 -0
  270. package/src/config/env.ts +28 -0
  271. package/src/contants.ts +3 -0
  272. package/src/db/actions/blocks.ts +209 -0
  273. package/src/db/actions/index.ts +1 -0
  274. package/src/db/actions/transactions.ts +32 -0
  275. package/src/db/client.ts +186 -0
  276. package/src/db/column-types.ts +105 -0
  277. package/src/db/encode.ts +99 -0
  278. package/src/db/migrate.ts +222 -0
  279. package/src/db/schema/blocks.ts +24 -0
  280. package/src/db/schema/index.ts +21 -0
  281. package/src/db/schema/transactions.ts +39 -0
  282. package/src/db/transaction.ts +20 -0
  283. package/src/hooks/registry.ts +107 -0
  284. package/src/index.ts +9 -0
  285. package/src/indexer/backfill.ts +133 -0
  286. package/src/indexer/live.ts +76 -0
  287. package/src/indexer/process-block.ts +142 -0
  288. package/src/indexer/queue-block.ts +74 -0
  289. package/src/indexer/reorg.ts +120 -0
  290. package/src/indexer/runner.ts +35 -0
  291. package/src/rpc/client.ts +27 -0
  292. package/src/rpc/get-block.ts +100 -0
  293. package/src/rpc/get-logs.ts +38 -0
  294. package/src/schema.ts +10 -0
  295. package/src/types.ts +32 -0
  296. package/src/utils/bloom.ts +41 -0
  297. package/src/utils/build-conflict-columns.ts +26 -0
  298. package/src/utils/common.ts +3 -0
  299. package/src/utils/cursor.ts +7 -0
  300. package/src/utils/format.ts +18 -0
  301. package/src/utils/hash.ts +17 -0
  302. package/src/utils/json.ts +11 -0
  303. package/src/utils/logger.ts +149 -0
  304. package/src/utils/shutdown.ts +36 -0
  305. package/src/utils/timer.ts +8 -0
  306. package/src/utils/types.ts +87 -0
  307. package/template/biome.json +50 -0
  308. package/template/package.json +22 -0
  309. package/template/pnpm-workspace.yaml +3 -0
  310. package/template/tsconfig.json +37 -0
  311. package/tsconfig.json +8 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/bin/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env node
2
+ import { readFileSync } from 'node:fs';
3
+ import { dirname, resolve } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { cli } from 'cleye';
6
+ import { dev } from "./dev.js";
7
+ const __dirname = dirname(fileURLToPath(import.meta.url));
8
+ const packageJsonPath = resolve(__dirname, '../../package.json');
9
+ const packageJson = JSON.parse(readFileSync(packageJsonPath, { encoding: 'utf8' }));
10
+ const argv = cli({
11
+ name: 'foxer',
12
+ version: packageJson.version,
13
+ commands: [dev],
14
+ help: {
15
+ version: packageJson.version,
16
+ },
17
+ });
18
+ if (!argv.command) {
19
+ argv.showHelp();
20
+ process.exit(1);
21
+ }
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/bin/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAC3B,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAE9B,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AACzD,MAAM,eAAe,GAAG,OAAO,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAA;AAChE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,YAAY,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CACpD,CAAA;AAED,MAAM,IAAI,GAAG,GAAG,CAAC;IACf,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,WAAW,CAAC,OAAO;IAC5B,QAAQ,EAAE,CAAC,GAAG,CAAC;IACf,IAAI,EAAE;QACJ,OAAO,EAAE,WAAW,CAAC,OAAO;KAC7B;CACF,CAAC,CAAA;AAEF,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IAClB,IAAI,CAAC,QAAQ,EAAE,CAAA;IACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { InternalConfig } from '../config/config';
2
+ import type { Logger } from '../utils/logger';
3
+ export declare function loadConfig(logger: Logger, root: string, filePath?: string): Promise<InternalConfig>;
4
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/bin/utils.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAgB7C,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,MAAM,2BA+BlB"}
@@ -0,0 +1,52 @@
1
+ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
2
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
3
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
4
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
5
+ });
6
+ }
7
+ return path;
8
+ };
9
+ import path from 'node:path';
10
+ import { pathToFileURL } from 'node:url';
11
+ import { lilconfig } from 'lilconfig';
12
+ const CLI_NAME = 'foxer';
13
+ const loadEsm = async (filepath) => {
14
+ const res = await import(__rewriteRelativeImportExtension(pathToFileURL(filepath).href));
15
+ return res.default ?? res;
16
+ };
17
+ const configLoaders = {
18
+ '.js': loadEsm,
19
+ '.mjs': loadEsm,
20
+ '.ts': loadEsm,
21
+ '.mts': loadEsm,
22
+ };
23
+ export async function loadConfig(logger, root, filePath) {
24
+ let configFile;
25
+ try {
26
+ if (filePath) {
27
+ const configPath = path.resolve(root, filePath);
28
+ configFile = await lilconfig(configPath, {
29
+ loaders: configLoaders,
30
+ searchPlaces: [],
31
+ }).load(configPath);
32
+ }
33
+ else {
34
+ configFile = await lilconfig(CLI_NAME, {
35
+ loaders: configLoaders,
36
+ searchPlaces: [`${CLI_NAME}.config.ts`, `${CLI_NAME}.config.mts`],
37
+ }).search();
38
+ }
39
+ }
40
+ catch (error) {
41
+ logger.error(error, 'config evaluation failed');
42
+ // ignore
43
+ }
44
+ if (!configFile || configFile.isEmpty) {
45
+ logger.error({
46
+ msg: 'Config file not found',
47
+ });
48
+ process.exit(1);
49
+ }
50
+ return configFile.config.config;
51
+ }
52
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/bin/utils.ts"],"names":[],"mappings":";;;;;;;;AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAwB,SAAS,EAAE,MAAM,WAAW,CAAA;AAI3D,MAAM,QAAQ,GAAG,OAAO,CAAA;AAExB,MAAM,OAAO,GAAG,KAAK,EAAE,QAAgB,EAAE,EAAE;IACzC,MAAM,GAAG,GAAG,MAAM,MAAM,kCAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAC,CAAA;IACtD,OAAO,GAAG,CAAC,OAAO,IAAI,GAAG,CAAA;AAC3B,CAAC,CAAA;AAED,MAAM,aAAa,GAAG;IACpB,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,OAAO;IACf,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,OAAO;CAChB,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAc,EACd,IAAY,EACZ,QAAiB;IAEjB,IAAI,UAAuC,CAAA;IAE3C,IAAI,CAAC;QACH,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;YAE/C,UAAU,GAAG,MAAM,SAAS,CAAC,UAAU,EAAE;gBACvC,OAAO,EAAE,aAAa;gBACtB,YAAY,EAAE,EAAE;aACjB,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACrB,CAAC;aAAM,CAAC;YACN,UAAU,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE;gBACrC,OAAO,EAAE,aAAa;gBACtB,YAAY,EAAE,CAAC,GAAG,QAAQ,YAAY,EAAE,GAAG,QAAQ,aAAa,CAAC;aAClE,CAAC,CAAC,MAAM,EAAE,CAAA;QACb,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,0BAA0B,CAAC,CAAA;QAC/C,SAAS;IACX,CAAC;IAED,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC;YACX,GAAG,EAAE,uBAAuB;SAC7B,CAAC,CAAA;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,OAAO,UAAU,CAAC,MAAM,CAAC,MAAwB,CAAA;AACnD,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { type AnyRelations, type EmptyRelations, type QueryWithTypings, type SQLWrapper } from 'drizzle-orm';
2
+ import { type PgRemoteDatabase } from 'drizzle-orm/pg-proxy';
3
+ import type { Simplify } from 'type-fest';
4
+ export declare const compileQuery: (query: SQLWrapper) => QueryWithTypings;
5
+ type ClientDb<TSchema extends Record<string, unknown> = Record<string, unknown>, TRelations extends AnyRelations = EmptyRelations> = Simplify<Omit<PgRemoteDatabase<TSchema, TRelations>, 'insert' | 'update' | 'delete' | 'transaction' | 'refreshMaterializedView' | '_' | '_query'>>;
6
+ export type Client<TSchema extends Record<string, unknown> = Record<string, unknown>, TRelations extends AnyRelations = EmptyRelations> = {
7
+ db: ClientDb<TSchema, TRelations>;
8
+ live: <result>(queryFn: (db: ClientDb<TSchema, TRelations>) => Promise<result>, onData: (result: result) => void, onError?: (error: Error) => void) => {
9
+ unsubscribe: () => void;
10
+ };
11
+ };
12
+ export declare function createClient<TSchema extends Record<string, unknown> = Record<string, unknown>, TRelations extends AnyRelations = EmptyRelations>({ baseUrl, relations, schema, }: {
13
+ baseUrl: string;
14
+ relations: TRelations;
15
+ schema: TSchema;
16
+ }): Client<TSchema, TRelations>;
17
+ export {};
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,EAEjB,KAAK,cAAc,EAGnB,KAAK,gBAAgB,EAGrB,KAAK,UAAU,EAEhB,MAAM,aAAa,CAAA;AAIpB,OAAO,EAAW,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAGrE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAoDzC,eAAO,MAAM,YAAY,GAAI,OAAO,UAAU,qBAE7C,CAAA;AAED,KAAK,QAAQ,CACX,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjE,UAAU,SAAS,YAAY,GAAG,cAAc,IAC9C,QAAQ,CACV,IAAI,CACF,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,EACnC,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,aAAa,GACb,yBAAyB,GACzB,GAAG,GACH,QAAQ,CACX,CACF,CAAA;AAED,MAAM,MAAM,MAAM,CAChB,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjE,UAAU,SAAS,YAAY,GAAG,cAAc,IAC9C;IACF,EAAE,EAAE,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;IAEjC,IAAI,EAAE,CAAC,MAAM,EACX,OAAO,EAAE,CAAC,EAAE,EAAE,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,EAC/D,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,EAChC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,KAC7B;QACH,WAAW,EAAE,MAAM,IAAI,CAAA;KACxB,CAAA;CACF,CAAA;AAED,wBAAgB,YAAY,CAC1B,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjE,UAAU,SAAS,YAAY,GAAG,cAAc,EAChD,EACA,OAAO,EACP,SAAS,EACT,MAAM,GACP,EAAE;IACD,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,UAAU,CAAA;IACrB,MAAM,EAAE,OAAO,CAAA;CAChB,GAAG,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,CAqI9B"}
@@ -0,0 +1,150 @@
1
+ import { Column, is, mapRelationalRow, SQL, Table, } from 'drizzle-orm';
2
+ import { PgRelationalQuery } from 'drizzle-orm/pg-core/query-builders/query';
3
+ import { PgRaw } from 'drizzle-orm/pg-core/query-builders/raw';
4
+ import { drizzle } from 'drizzle-orm/pg-proxy';
5
+ import { TypedQueryBuilder } from 'drizzle-orm/query-builders/query-builder';
6
+ import { EventSource } from 'eventsource';
7
+ import { stringify } from 'viem';
8
+ function orderSelectedFields(fields, pathPrefix) {
9
+ return Object.entries(fields).reduce((result, [name, field]) => {
10
+ if (typeof name !== 'string') {
11
+ return result;
12
+ }
13
+ const newPath = pathPrefix ? [...pathPrefix, name] : [name];
14
+ if (is(field, Column) || is(field, SQL) || is(field, SQL.Aliased)) {
15
+ result.push({ path: newPath, field });
16
+ }
17
+ else if (is(field, Table)) {
18
+ result.push(
19
+ // @ts-ignore
20
+ ...orderSelectedFields(field[Table.Symbol.Columns], newPath));
21
+ }
22
+ else {
23
+ result.push(...orderSelectedFields(field, newPath));
24
+ }
25
+ return result;
26
+ }, []);
27
+ }
28
+ const getUrl = (baseUrl, method, query) => {
29
+ const url = new URL(baseUrl);
30
+ url.pathname = `${url.pathname}/${method}`;
31
+ if (query) {
32
+ url.searchParams.set('sql', stringify(query));
33
+ }
34
+ return url;
35
+ };
36
+ const noopDatabase = drizzle(() => Promise.resolve({ rows: [] }), {
37
+ casing: 'snake_case',
38
+ });
39
+ // @ts-expect-error - dialect is not typed
40
+ const dialect = noopDatabase.dialect;
41
+ export const compileQuery = (query) => {
42
+ return dialect.sqlToQuery(query.getSQL());
43
+ };
44
+ export function createClient({ baseUrl, relations, schema, }) {
45
+ return {
46
+ db: drizzle(async (sql, params, method, typings) => {
47
+ const query = { sql, params, typings };
48
+ const url = getUrl(baseUrl, 'db', query);
49
+ const rsp = await fetch(url.toString(), {
50
+ method: 'GET',
51
+ });
52
+ if (!rsp.ok) {
53
+ throw new Error((await rsp.json()).error);
54
+ }
55
+ const result = await rsp.json();
56
+ if (method === 'all') {
57
+ return {
58
+ ...result,
59
+ rows: result.rows.map((row) => Object.values(row)),
60
+ };
61
+ }
62
+ return result;
63
+ }, {
64
+ relations: relations,
65
+ schema: schema,
66
+ casing: 'snake_case',
67
+ }),
68
+ live: (queryFn, onData, onError) => {
69
+ let result;
70
+ const passThroughDatabase = drizzle((_, __, method) => {
71
+ if (method === 'all') {
72
+ return Promise.resolve({
73
+ ...result,
74
+ rows: result.rows.map((row) => Object.values(row)),
75
+ });
76
+ }
77
+ return Promise.resolve(result);
78
+ }, { schema: schema, relations: relations, casing: 'snake_case' });
79
+ const queryPromise = queryFn(passThroughDatabase);
80
+ if ('getSQL' in queryPromise === false) {
81
+ throw new Error('"queryFn" must return SQL. You may have to remove `.execute()` from your query.');
82
+ }
83
+ const queryBuilder = queryPromise;
84
+ const query = compileQuery(queryBuilder);
85
+ const sse = new EventSource(getUrl(baseUrl, 'live', query));
86
+ async function onMessage(event) {
87
+ result = JSON.parse(event.data);
88
+ let data;
89
+ if (queryBuilder instanceof TypedQueryBuilder) {
90
+ data = await passThroughDatabase._.session
91
+ .prepareQuery(query,
92
+ // @ts-expect-error - selectedFields is not typed
93
+ orderSelectedFields(queryPromise._.selectedFields), undefined, false)
94
+ .execute();
95
+ }
96
+ else if (queryBuilder instanceof PgRelationalQuery) {
97
+ // @ts-expect-error - _toSQL is not typed
98
+ const selection = queryBuilder._toSQL().query.selection;
99
+ data = await passThroughDatabase._.session
100
+ .prepareQuery(query, undefined, undefined, true, (rawRows, mapColumnValue) => {
101
+ const rows = rawRows.map((row) => {
102
+ const obj = {};
103
+ row.forEach((value, index) => {
104
+ // @ts-expect-error - selection is not typed
105
+ obj[selection[index].key] = value;
106
+ });
107
+ return mapRelationalRow(obj, selection, mapColumnValue);
108
+ });
109
+ // @ts-expect-error - mode is not typed
110
+ if (queryBuilder.mode === 'first') {
111
+ return rows[0];
112
+ }
113
+ return rows;
114
+ })
115
+ .execute();
116
+ }
117
+ else if (queryBuilder instanceof PgRaw) {
118
+ data = await passThroughDatabase._.session
119
+ .prepareQuery(query, undefined, undefined, false)
120
+ .execute();
121
+ }
122
+ else {
123
+ throw new Error('Unsupported query builder');
124
+ }
125
+ // @ts-expect-error - data is not typed
126
+ onData(data);
127
+ }
128
+ function onSSEError(event) {
129
+ if ('data' in event) {
130
+ onError?.(new Error(event.data));
131
+ }
132
+ else {
133
+ // @ts-expect-error - message is not typed
134
+ onError?.(new Error(`SSE error ${event?.message}`));
135
+ }
136
+ sse.close();
137
+ }
138
+ sse.addEventListener('message', onMessage);
139
+ sse.addEventListener('error', onSSEError);
140
+ return {
141
+ unsubscribe: () => {
142
+ sse.removeEventListener('message', onMessage);
143
+ sse.removeEventListener('error', onSSEError);
144
+ sse.close();
145
+ },
146
+ };
147
+ },
148
+ };
149
+ }
150
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,157 @@
1
+ import type { Abi, AbiEvent } from 'abitype';
2
+ import type { AnyRelations, EmptyRelations } from 'drizzle-orm/relations';
3
+ import type { Hono } from 'hono';
4
+ import type { BlankEnv, BlankSchema } from 'hono/types';
5
+ import type { PoolConfig } from 'pg';
6
+ import type { SetRequired, Simplify, UnknownRecord } from 'type-fest';
7
+ import { type Address, type FallbackTransport, type HttpTransport, type Narrow, type PublicClientConfig, type WebSocketTransport } from 'viem';
8
+ import type { Database } from '../db/client.ts';
9
+ import type { HookRegistry } from '../hooks/registry.ts';
10
+ import { type RpcClients } from '../rpc/client.ts';
11
+ import type { UnknownObject } from '../types.ts';
12
+ import type { Logger } from '../utils/logger.ts';
13
+ import type { ContractConfig, ContractsConfig, GetContract } from '../utils/types.ts';
14
+ export type ClientConfig = Simplify<SetRequired<PublicClientConfig, 'chain'> & {
15
+ realtimeTransport?: HttpTransport | WebSocketTransport | FallbackTransport;
16
+ }>;
17
+ export type HonoConfig<TSchema extends UnknownRecord = UnknownRecord, TRelations extends AnyRelations = EmptyRelations> = (options: {
18
+ logger: Logger;
19
+ db: Database<TSchema, TRelations>;
20
+ }) => Hono<BlankEnv, BlankSchema, '/'>;
21
+ export type HooksConfig<contracts extends ContractsConfig<UnknownObject>, TSchema extends UnknownRecord, TRelations extends AnyRelations> = (context: {
22
+ registry: HookRegistry<ContractsConfig<Narrow<contracts>>, TSchema, TRelations>;
23
+ }) => void;
24
+ export type DatabaseConfig = {
25
+ driver: 'postgres';
26
+ url?: string;
27
+ options?: PoolConfig;
28
+ } | {
29
+ driver: 'pglite';
30
+ directory: string;
31
+ };
32
+ export type Config<contracts extends ContractsConfig<UnknownObject>, TSchema extends UnknownRecord, TRelations extends AnyRelations = EmptyRelations> = {
33
+ /**
34
+ * The batch size for the backfill. How many blocks to process at a time.
35
+ * @default 100
36
+ */
37
+ batchSize?: number;
38
+ /**
39
+ * The finality of the chain.
40
+ * @default 30
41
+ */
42
+ finality?: number;
43
+ /**
44
+ * The folder where the drizzle schema is stored.
45
+ * @default './drizzle'
46
+ */
47
+ drizzleFolder?: string;
48
+ /**
49
+ * The database configuration.
50
+ */
51
+ database?: DatabaseConfig;
52
+ /**
53
+ * The contracts to index.
54
+ */
55
+ contracts: ContractsConfig<Narrow<contracts>>;
56
+ /**
57
+ * The RPC clients configuration.
58
+ */
59
+ client: ClientConfig;
60
+ /**
61
+ * The Hono configuration.
62
+ */
63
+ hono: HonoConfig<TSchema, TRelations>;
64
+ /**
65
+ * The drizzle schema.
66
+ */
67
+ schema: TSchema;
68
+ /**
69
+ * The drizzle relations.
70
+ */
71
+ relations?: TRelations;
72
+ /**
73
+ * The hooks configuration.
74
+ */
75
+ hooks: HooksConfig<contracts, TSchema, TRelations>;
76
+ };
77
+ export type InternalConfig<TSchema extends UnknownRecord = UnknownRecord, TRelations extends AnyRelations = EmptyRelations> = {
78
+ batchSize: bigint;
79
+ finality: bigint;
80
+ drizzleFolder: string;
81
+ contracts: {
82
+ [contractName: string]: GetContract;
83
+ };
84
+ database?: DatabaseConfig;
85
+ client: ClientConfig;
86
+ hono: HonoConfig<TSchema, TRelations>;
87
+ schema: TSchema;
88
+ relations: TRelations;
89
+ hooks: (context: {
90
+ registry: HookRegistry;
91
+ }) => void;
92
+ startBlockNumber: bigint;
93
+ contractsForLive: ContractConfig<Abi, readonly string[]>[];
94
+ clients: RpcClients;
95
+ };
96
+ export declare function createConfig<contracts extends ContractsConfig<UnknownObject>, TSchema extends UnknownRecord = UnknownRecord, TRelations extends AnyRelations = EmptyRelations>(config: Config<contracts, TSchema, TRelations>): {
97
+ batchSize: bigint;
98
+ finality: bigint;
99
+ drizzleFolder: string;
100
+ relations: TRelations;
101
+ startBlockNumber: bigint;
102
+ contractsForLive: ContractConfig<Abi, readonly string[]>[];
103
+ clients: RpcClients;
104
+ /**
105
+ * The database configuration.
106
+ */
107
+ database?: DatabaseConfig;
108
+ /**
109
+ * The contracts to index.
110
+ */
111
+ contracts: ContractsConfig<Narrow<contracts>>;
112
+ /**
113
+ * The RPC clients configuration.
114
+ */
115
+ client: {
116
+ name?: string | undefined | undefined;
117
+ batch?: {
118
+ multicall?: boolean | import("viem").Prettify<import("viem").MulticallBatchOptions> | undefined;
119
+ } | undefined | undefined;
120
+ cacheTime?: number | undefined | undefined;
121
+ ccipRead?: {
122
+ request?: (parameters: import("viem").CcipRequestParameters) => Promise<`0x${string}`>;
123
+ } | false | undefined | undefined;
124
+ experimental_blockTag?: import("viem").BlockTag | undefined;
125
+ key?: string | undefined | undefined;
126
+ pollingInterval?: number | undefined | undefined;
127
+ transport: import("viem").Transport;
128
+ rpcSchema?: undefined;
129
+ chain: import("viem").Chain;
130
+ realtimeTransport?: (HttpTransport | WebSocketTransport | FallbackTransport) | undefined;
131
+ };
132
+ /**
133
+ * The Hono configuration.
134
+ */
135
+ hono: HonoConfig<TSchema, TRelations>;
136
+ /**
137
+ * The drizzle schema.
138
+ */
139
+ schema: TSchema;
140
+ /**
141
+ * The hooks configuration.
142
+ */
143
+ hooks: HooksConfig<contracts, TSchema, TRelations>;
144
+ };
145
+ export type FilteredContracts = {
146
+ eventAbis: AbiEvent[];
147
+ addresses: Address[];
148
+ eventNames: Set<string>;
149
+ contractNameByAddress: Record<Address, string>;
150
+ };
151
+ export declare function filterContracts(config: InternalConfig, fromBlock: bigint, toBlock: bigint): {
152
+ eventAbis: AbiEvent[];
153
+ addresses: `0x${string}`[];
154
+ contractNameByAddress: Record<`0x${string}`, string>;
155
+ eventNames: Set<string>;
156
+ };
157
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/config/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ import { getAbiItem, } from 'viem';
2
+ import { createRpcClients } from "../rpc/client.js";
3
+ export function createConfig(config) {
4
+ let startBlockNumber = 0n;
5
+ const contractsForLive = [];
6
+ for (const contract of Object.values(config.contracts)) {
7
+ if (contract.endBlock == null) {
8
+ contractsForLive.push(contract);
9
+ }
10
+ if (startBlockNumber === 0n && contract.startBlock != null) {
11
+ startBlockNumber = contract.startBlock;
12
+ continue;
13
+ }
14
+ if (contract.startBlock != null && contract.startBlock < startBlockNumber) {
15
+ startBlockNumber = contract.startBlock;
16
+ }
17
+ }
18
+ const clients = createRpcClients(config.client);
19
+ return {
20
+ ...config,
21
+ batchSize: BigInt(config.batchSize ?? 100),
22
+ finality: BigInt(config.finality ?? 30),
23
+ drizzleFolder: config.drizzleFolder ?? './drizzle',
24
+ relations: config.relations ? config.relations : {},
25
+ startBlockNumber,
26
+ contractsForLive,
27
+ clients,
28
+ };
29
+ }
30
+ export function filterContracts(config, fromBlock, toBlock) {
31
+ const eventAbis = [];
32
+ const addresses = [];
33
+ const eventNames = new Set();
34
+ const contractNameByAddress = {};
35
+ for (const [contractName, contract] of Object.entries(config.contracts)) {
36
+ const address = contract.address.toLowerCase();
37
+ const startBlock = contract.startBlock ?? 0n;
38
+ if (startBlock > toBlock) {
39
+ continue;
40
+ }
41
+ if (contract.endBlock != null && contract.endBlock < fromBlock) {
42
+ continue;
43
+ }
44
+ addresses.push(address);
45
+ contractNameByAddress[address] = contractName;
46
+ for (const event of contract.events) {
47
+ eventNames.add(event);
48
+ const eventAbi = getAbiItem({
49
+ abi: contract.abi,
50
+ name: event,
51
+ });
52
+ if (!eventAbi) {
53
+ throw new Error(`Event ${event} not found in contract ${contractName}`);
54
+ }
55
+ eventAbis.push(eventAbi);
56
+ }
57
+ }
58
+ return {
59
+ eventAbis: eventAbis,
60
+ addresses: addresses,
61
+ contractNameByAddress: contractNameByAddress,
62
+ eventNames: eventNames,
63
+ };
64
+ }
65
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/config/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { z } from 'zod';
2
+ import type { Logger } from '../utils/logger';
3
+ export type Env = z.infer<typeof envSchema>;
4
+ declare const envSchema: z.ZodObject<{
5
+ DATABASE_URL: z.ZodOptional<z.ZodURL>;
6
+ LOG_LEVEL: z.ZodDefault<z.ZodEnum<{
7
+ fatal: "fatal";
8
+ error: "error";
9
+ warn: "warn";
10
+ info: "info";
11
+ debug: "debug";
12
+ trace: "trace";
13
+ }>>;
14
+ LOG_MODE: z.ZodDefault<z.ZodEnum<{
15
+ json: "json";
16
+ pretty: "pretty";
17
+ }>>;
18
+ }, z.core.$strip>;
19
+ export declare function createEnv(logger: Logger): {
20
+ LOG_LEVEL: "fatal" | "error" | "warn" | "info" | "debug" | "trace";
21
+ LOG_MODE: "json" | "pretty";
22
+ DATABASE_URL?: string | undefined;
23
+ };
24
+ export {};
25
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../../src/config/env.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAM7C,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAA;AAC3C,QAAA,MAAM,SAAS;;;;;;;;;;;;;;iBAMb,CAAA;AAEF,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM;;;;EAUvC"}
@@ -0,0 +1,21 @@
1
+ import dotenv from 'dotenv';
2
+ import { z } from 'zod';
3
+ dotenv.config({
4
+ path: '.env.local',
5
+ });
6
+ const envSchema = z.object({
7
+ DATABASE_URL: z.url().optional(),
8
+ LOG_LEVEL: z
9
+ .enum(['trace', 'debug', 'info', 'warn', 'error', 'fatal'])
10
+ .default('info'),
11
+ LOG_MODE: z.enum(['pretty', 'json']).default('pretty'),
12
+ });
13
+ export function createEnv(logger) {
14
+ const parsed = envSchema.safeParse(process.env);
15
+ if (!parsed.success) {
16
+ throw new Error(`Failed to parse environment variables: \n ${z.flattenError(parsed.error)}`);
17
+ }
18
+ logger.debug({ env: parsed.data }, 'env parsed');
19
+ return parsed.data;
20
+ }
21
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../../src/config/env.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,MAAM,CAAC,MAAM,CAAC;IACZ,IAAI,EAAE,YAAY;CACnB,CAAC,CAAA;AAGF,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC;IACzB,YAAY,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IAChC,SAAS,EAAE,CAAC;SACT,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;SAC1D,OAAO,CAAC,MAAM,CAAC;IAClB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;CACvD,CAAC,CAAA;AAEF,MAAM,UAAU,SAAS,CAAC,MAAc;IACtC,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAE/C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CACb,6CAA6C,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC5E,CAAA;IACH,CAAC;IACD,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,YAAY,CAAC,CAAA;IAChD,OAAO,MAAM,CAAC,IAAI,CAAA;AACpB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare const PUBLICATION_NAME = "foxer_publication";
2
+ export declare const FOXER_TABLES: string[];
3
+ export declare const MAX_QUERY_PARAMS = 16000;
4
+ //# sourceMappingURL=contants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contants.d.ts","sourceRoot":"","sources":["../../src/contants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,sBAAsB,CAAA;AACnD,eAAO,MAAM,YAAY,UAA6B,CAAA;AACtD,eAAO,MAAM,gBAAgB,QAAQ,CAAA"}
@@ -0,0 +1,4 @@
1
+ export const PUBLICATION_NAME = 'foxer_publication';
2
+ export const FOXER_TABLES = ['blocks', 'transactions'];
3
+ export const MAX_QUERY_PARAMS = 16000;
4
+ //# sourceMappingURL=contants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contants.js","sourceRoot":"","sources":["../../src/contants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,mBAAmB,CAAA;AACnD,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAA;AACtD,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAA"}
@@ -0,0 +1,44 @@
1
+ /** biome-ignore-all lint/style/noNonNullAssertion: its ok */
2
+ import { type PgAsyncTransaction, type PgQueryResultHKT } from 'drizzle-orm/pg-core';
3
+ import type { PublicClient } from 'viem';
4
+ import type { FilteredContracts } from '../../config/config.ts';
5
+ import type { EncodedBlockWithTransactions } from '../../types.ts';
6
+ import type { Logger } from '../../utils/logger.ts';
7
+ import type { Database } from '../client.ts';
8
+ import { type relations, schema } from '../schema/index.ts';
9
+ /**
10
+ * Deletes canonical block rows from a specific block onward.
11
+ */
12
+ export declare function deleteBlocksFrom(db: Database, fromBlock: bigint): Promise<void>;
13
+ /**
14
+ * Caches a block and its transactions in the database.
15
+ *
16
+ * @param args - The arguments for the function
17
+ * @param args.db - The database instance
18
+ * @param args.block - The block to cache
19
+ * @returns The cached block and transactions
20
+ */
21
+ export declare function cacheBlockAndTransactions(args: {
22
+ db: Database<typeof schema, typeof relations>;
23
+ block: EncodedBlockWithTransactions;
24
+ logger: Logger;
25
+ }): Promise<void>;
26
+ /**
27
+ * Gets blocks and their transactions from the database in a range and fetches missing blocks from the RPC.
28
+ *
29
+ * @param args - The arguments for the function
30
+ * @param args.logger - The logger instance
31
+ * @param args.db - The database instance
32
+ * @param args.blockNumbers - The block numbers to get
33
+ * @param args.client - The client instance
34
+ * @returns The blocks and their transactions
35
+ */
36
+ export declare function getBlocksInRange(logger: Logger, db: Database<typeof schema, typeof relations>, blockNumbers: bigint[], client: PublicClient, contracts: FilteredContracts): Promise<Map<bigint, EncodedBlockWithTransactions>>;
37
+ /**
38
+ * Inserts blocks in chunks to avoid query parameter limit.
39
+ */
40
+ export declare function insertBlocksInChunks(args: {
41
+ db: PgAsyncTransaction<PgQueryResultHKT, typeof schema>;
42
+ blocks: EncodedBlockWithTransactions[];
43
+ }): Promise<void>;
44
+ //# sourceMappingURL=blocks.d.ts.map