@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":"client.js","sourceRoot":"","sources":["../../../src/db/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,132 @@
1
+ export declare const numeric78: {
2
+ <TConfig extends Record<string, any>>(fieldConfig?: TConfig | undefined): import("drizzle-orm/pg-core").PgCustomColumnBuilder<{
3
+ dataType: "custom";
4
+ data: bigint;
5
+ driverParam: string;
6
+ }>;
7
+ (dbName: string, fieldConfig?: unknown): import("drizzle-orm/pg-core").PgCustomColumnBuilder<{
8
+ dataType: "custom";
9
+ data: bigint;
10
+ driverParam: string;
11
+ }>;
12
+ };
13
+ export declare const hex: {
14
+ <TConfig extends Record<string, any> & {
15
+ length: number | undefined;
16
+ }>(fieldConfig?: TConfig | undefined): import("drizzle-orm/pg-core").PgCustomColumnBuilder<{
17
+ dataType: "custom";
18
+ data: `0x${string}`;
19
+ driverParam: string;
20
+ }>;
21
+ (dbName: string, fieldConfig?: {
22
+ length: number | undefined;
23
+ } | undefined): import("drizzle-orm/pg-core").PgCustomColumnBuilder<{
24
+ dataType: "custom";
25
+ data: `0x${string}`;
26
+ driverParam: string;
27
+ }>;
28
+ };
29
+ /**
30
+ * Hash column type
31
+ * @param config - Configuration for the column
32
+ * @param config.length - Length of the column (default: 66)
33
+ * @returns Hash column type
34
+ */
35
+ export declare const hash: {
36
+ <TConfig extends Record<string, any> & {
37
+ length: number | undefined;
38
+ }>(fieldConfig?: TConfig | undefined): import("drizzle-orm/pg-core").PgCustomColumnBuilder<{
39
+ dataType: "custom";
40
+ data: `0x${string}`;
41
+ driverParam: string;
42
+ }>;
43
+ (dbName: string, fieldConfig?: {
44
+ length: number | undefined;
45
+ } | undefined): import("drizzle-orm/pg-core").PgCustomColumnBuilder<{
46
+ dataType: "custom";
47
+ data: `0x${string}`;
48
+ driverParam: string;
49
+ }>;
50
+ };
51
+ export declare const address: {
52
+ <TConfig extends Record<string, any> & {
53
+ length: number | undefined;
54
+ }>(fieldConfig?: TConfig | undefined): import("drizzle-orm/pg-core").PgCustomColumnBuilder<{
55
+ dataType: "custom";
56
+ data: `0x${string}`;
57
+ driverParam: string;
58
+ }>;
59
+ (dbName: string, fieldConfig?: {
60
+ length: number | undefined;
61
+ } | undefined): import("drizzle-orm/pg-core").PgCustomColumnBuilder<{
62
+ dataType: "custom";
63
+ data: `0x${string}`;
64
+ driverParam: string;
65
+ }>;
66
+ };
67
+ /**
68
+ * Bigint column type (8 bytes)
69
+ * For bigger number see {@link numeric78}, {@link uint256} and {@link int256}
70
+ * @returns Bigint column type
71
+ */
72
+ export declare const bigint: {
73
+ <TConfig extends Record<string, any>>(fieldConfig?: TConfig | undefined): import("drizzle-orm/pg-core").PgCustomColumnBuilder<{
74
+ dataType: "custom";
75
+ data: bigint;
76
+ driverParam: string;
77
+ }>;
78
+ (dbName: string, fieldConfig?: unknown): import("drizzle-orm/pg-core").PgCustomColumnBuilder<{
79
+ dataType: "custom";
80
+ data: bigint;
81
+ driverParam: string;
82
+ }>;
83
+ };
84
+ export declare const uint256: {
85
+ <TConfig extends Record<string, any>>(fieldConfig?: TConfig | undefined): import("drizzle-orm/pg-core").PgCustomColumnBuilder<{
86
+ dataType: "custom";
87
+ data: bigint;
88
+ driverParam: string;
89
+ }>;
90
+ (dbName: string, fieldConfig?: unknown): import("drizzle-orm/pg-core").PgCustomColumnBuilder<{
91
+ dataType: "custom";
92
+ data: bigint;
93
+ driverParam: string;
94
+ }>;
95
+ };
96
+ export declare const int256: {
97
+ <TConfig extends Record<string, any>>(fieldConfig?: TConfig | undefined): import("drizzle-orm/pg-core").PgCustomColumnBuilder<{
98
+ dataType: "custom";
99
+ data: bigint;
100
+ driverParam: string;
101
+ }>;
102
+ (dbName: string, fieldConfig?: unknown): import("drizzle-orm/pg-core").PgCustomColumnBuilder<{
103
+ dataType: "custom";
104
+ data: bigint;
105
+ driverParam: string;
106
+ }>;
107
+ };
108
+ export declare const jsonb: {
109
+ <TConfig extends Record<string, any>>(fieldConfig?: TConfig | undefined): import("drizzle-orm/pg-core").PgCustomColumnBuilder<{
110
+ dataType: "custom";
111
+ data: unknown;
112
+ driverParam: string;
113
+ }>;
114
+ (dbName: string, fieldConfig?: unknown): import("drizzle-orm/pg-core").PgCustomColumnBuilder<{
115
+ dataType: "custom";
116
+ data: unknown;
117
+ driverParam: string;
118
+ }>;
119
+ };
120
+ export declare const bytea: {
121
+ <TConfig extends Record<string, any>>(fieldConfig?: TConfig | undefined): import("drizzle-orm/pg-core").PgCustomColumnBuilder<{
122
+ dataType: "custom";
123
+ data: `0x${string}`;
124
+ driverParam: Buffer<ArrayBufferLike>;
125
+ }>;
126
+ (dbName: string, fieldConfig?: unknown): import("drizzle-orm/pg-core").PgCustomColumnBuilder<{
127
+ dataType: "custom";
128
+ data: `0x${string}`;
129
+ driverParam: Buffer<ArrayBufferLike>;
130
+ }>;
131
+ };
132
+ //# sourceMappingURL=column-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column-types.d.ts","sourceRoot":"","sources":["../../../src/db/column-types.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,SAAS;;;;;;;;;;;CAOpB,CAAA;AAEF,eAAO,MAAM,GAAG;;gBAGK,MAAM,GAAG,SAAS;;;;;;;gBAAlB,MAAM,GAAG,SAAS;;;;;;CAWrC,CAAA;AAEF;;;;;GAKG;AACH,eAAO,MAAM,IAAI;;gBAGI,MAAM,GAAG,SAAS;;;;;;;gBAAlB,MAAM,GAAG,SAAS;;;;;;CAWrC,CAAA;AAEF,eAAO,MAAM,OAAO;;gBAGC,MAAM,GAAG,SAAS;;;;;;;gBAAlB,MAAM,GAAG,SAAS;;;;;;CAWrC,CAAA;AAEF;;;;GAIG;AACH,eAAO,MAAM,MAAM;;;;;;;;;;;CAOjB,CAAA;AAEF,eAAO,MAAM,OAAO;;;;;;;;;;;CAAY,CAAA;AAChC,eAAO,MAAM,MAAM;;;;;;;;;;;CAAY,CAAA;AAE/B,eAAO,MAAM,KAAK;;;;;;;;;;;CAOhB,CAAA;AAEF,eAAO,MAAM,KAAK;;;;;;;;;;;CAYhB,CAAA"}
@@ -0,0 +1,86 @@
1
+ import { customType } from 'drizzle-orm/pg-core';
2
+ import { stringify } from 'viem';
3
+ export const numeric78 = customType({
4
+ dataType() {
5
+ return 'numeric(78,0)';
6
+ },
7
+ fromDriver(value) {
8
+ return BigInt(value);
9
+ },
10
+ });
11
+ export const hex = customType({
12
+ dataType(config) {
13
+ if (config?.length) {
14
+ return `varchar(${config.length})`;
15
+ }
16
+ return 'varchar';
17
+ },
18
+ fromDriver(value) {
19
+ return value;
20
+ },
21
+ });
22
+ /**
23
+ * Hash column type
24
+ * @param config - Configuration for the column
25
+ * @param config.length - Length of the column (default: 66)
26
+ * @returns Hash column type
27
+ */
28
+ export const hash = customType({
29
+ dataType(config) {
30
+ if (config?.length) {
31
+ return `varchar(${config.length})`;
32
+ }
33
+ return 'varchar(66)';
34
+ },
35
+ fromDriver(value) {
36
+ return value;
37
+ },
38
+ });
39
+ export const address = customType({
40
+ dataType(config) {
41
+ if (config?.length) {
42
+ return `varchar(${config.length})`;
43
+ }
44
+ return 'varchar(42)';
45
+ },
46
+ fromDriver(value) {
47
+ return value;
48
+ },
49
+ });
50
+ /**
51
+ * Bigint column type (8 bytes)
52
+ * For bigger number see {@link numeric78}, {@link uint256} and {@link int256}
53
+ * @returns Bigint column type
54
+ */
55
+ export const bigint = customType({
56
+ dataType() {
57
+ return 'bigint';
58
+ },
59
+ fromDriver(value) {
60
+ return BigInt(value);
61
+ },
62
+ });
63
+ export const uint256 = numeric78;
64
+ export const int256 = numeric78;
65
+ export const jsonb = customType({
66
+ dataType() {
67
+ return 'jsonb';
68
+ },
69
+ toDriver(value) {
70
+ return stringify(value);
71
+ },
72
+ });
73
+ export const bytea = customType({
74
+ dataType() {
75
+ return 'bytea';
76
+ },
77
+ toDriver(value) {
78
+ return Buffer.from(value.slice(2), 'hex');
79
+ },
80
+ fromDriver(value) {
81
+ const hex = value.toString('hex');
82
+ const _value = hex.startsWith('\\x') ? hex.slice(2) : hex;
83
+ return `0x${_value}`;
84
+ },
85
+ });
86
+ //# sourceMappingURL=column-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column-types.js","sourceRoot":"","sources":["../../../src/db/column-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAqC,SAAS,EAAE,MAAM,MAAM,CAAA;AAEnE,MAAM,CAAC,MAAM,SAAS,GAAG,UAAU,CAAuC;IACxE,QAAQ;QACN,OAAO,eAAe,CAAA;IACxB,CAAC;IACD,UAAU,CAAC,KAAa;QACtB,OAAO,MAAM,CAAC,KAAK,CAAC,CAAA;IACtB,CAAC;CACF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,GAAG,GAAG,UAAU,CAI1B;IACD,QAAQ,CAAC,MAAM;QACb,IAAI,MAAM,EAAE,MAAM,EAAE,CAAC;YACnB,OAAO,WAAW,MAAM,CAAC,MAAM,GAAG,CAAA;QACpC,CAAC;QACD,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,UAAU,CAAC,KAAa;QACtB,OAAO,KAAY,CAAA;IACrB,CAAC;CACF,CAAC,CAAA;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,UAAU,CAI3B;IACD,QAAQ,CAAC,MAAM;QACb,IAAI,MAAM,EAAE,MAAM,EAAE,CAAC;YACnB,OAAO,WAAW,MAAM,CAAC,MAAM,GAAG,CAAA;QACpC,CAAC;QACD,OAAO,aAAa,CAAA;IACtB,CAAC;IACD,UAAU,CAAC,KAAa;QACtB,OAAO,KAAa,CAAA;IACtB,CAAC;CACF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG,UAAU,CAI9B;IACD,QAAQ,CAAC,MAAM;QACb,IAAI,MAAM,EAAE,MAAM,EAAE,CAAC;YACnB,OAAO,WAAW,MAAM,CAAC,MAAM,GAAG,CAAA;QACpC,CAAC;QACD,OAAO,aAAa,CAAA;IACtB,CAAC;IACD,UAAU,CAAC,KAAa;QACtB,OAAO,KAAgB,CAAA;IACzB,CAAC;CACF,CAAC,CAAA;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,CAAuC;IACrE,QAAQ;QACN,OAAO,QAAQ,CAAA;IACjB,CAAC;IACD,UAAU,CAAC,KAAa;QACtB,OAAO,MAAM,CAAC,KAAK,CAAC,CAAA;IACtB,CAAC;CACF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG,SAAS,CAAA;AAChC,MAAM,CAAC,MAAM,MAAM,GAAG,SAAS,CAAA;AAE/B,MAAM,CAAC,MAAM,KAAK,GAAG,UAAU,CAAwC;IACrE,QAAQ;QACN,OAAO,OAAO,CAAA;IAChB,CAAC;IACD,QAAQ,CAAC,KAAc;QACrB,OAAO,SAAS,CAAC,KAAK,CAAC,CAAA;IACzB,CAAC;CACF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,KAAK,GAAG,UAAU,CAAoC;IACjE,QAAQ;QACN,OAAO,OAAO,CAAA;IAChB,CAAC;IACD,QAAQ,CAAC,KAAa;QACpB,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;IAC3C,CAAC;IACD,UAAU,CAAC,KAAa;QACtB,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QACjC,MAAM,MAAM,GAAG,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;QACzD,OAAO,KAAK,MAAM,EAAS,CAAA;IAC7B,CAAC;CACF,CAAC,CAAA"}
@@ -0,0 +1,10 @@
1
+ import type { Hash } from 'viem';
2
+ import type { ChainBlock, ChainTransaction, EncodedBlock, EncodedBlockWithTransactions, EncodedTransaction } from '../types';
3
+ export declare function encodeTransaction(tx: ChainTransaction): EncodedTransaction;
4
+ export declare function encodeBlock(block: ChainBlock): EncodedBlock;
5
+ export declare function encodeBlockWithTransactions(block: ChainBlock): EncodedBlockWithTransactions;
6
+ export declare function encodeNullRoundBlock(options: {
7
+ number: bigint;
8
+ hash: Hash;
9
+ }): EncodedBlockWithTransactions;
10
+ //# sourceMappingURL=encode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encode.d.ts","sourceRoot":"","sources":["../../../src/db/encode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAChC,OAAO,KAAK,EACV,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,4BAA4B,EAC5B,kBAAkB,EACnB,MAAM,UAAU,CAAA;AAEjB,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,gBAAgB,GAAG,kBAAkB,CAqB1E;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,YAAY,CAsB3D;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,UAAU,GAChB,4BAA4B,CAK9B;AAMD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE;IAC5C,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,IAAI,CAAA;CACX,GAAG,4BAA4B,CA0B/B"}
@@ -0,0 +1,79 @@
1
+ export function encodeTransaction(tx) {
2
+ return {
3
+ hash: tx.hash,
4
+ blockNumber: tx.blockNumber,
5
+ transactionIndex: tx.transactionIndex,
6
+ blockHash: tx.blockHash,
7
+ from: tx.from,
8
+ to: tx.to ?? null,
9
+ input: tx.input,
10
+ value: tx.value,
11
+ nonce: tx.nonce,
12
+ r: tx.r,
13
+ s: tx.s,
14
+ v: tx.v,
15
+ type: tx.type,
16
+ gas: tx.gas ?? null,
17
+ gasPrice: tx.gasPrice ?? null,
18
+ maxFeePerGas: tx.maxFeePerGas ?? null,
19
+ maxPriorityFeePerGas: tx.maxPriorityFeePerGas ?? null,
20
+ accessList: tx.accessList ?? null,
21
+ };
22
+ }
23
+ export function encodeBlock(block) {
24
+ return {
25
+ number: block.number,
26
+ timestamp: block.timestamp,
27
+ hash: block.hash,
28
+ parentHash: block.parentHash,
29
+ logsBloom: block.logsBloom,
30
+ miner: block.miner,
31
+ gasUsed: block.gasUsed,
32
+ gasLimit: block.gasLimit,
33
+ baseFeePerGas: block.baseFeePerGas ?? null,
34
+ nonce: block.nonce,
35
+ mixHash: block.mixHash,
36
+ stateRoot: block.stateRoot,
37
+ receiptsRoot: block.receiptsRoot,
38
+ transactionsRoot: block.transactionsRoot,
39
+ sha3Uncles: block.sha3Uncles,
40
+ size: block.size,
41
+ difficulty: block.difficulty,
42
+ totalDifficulty: block.totalDifficulty ?? null,
43
+ extraData: block.extraData,
44
+ };
45
+ }
46
+ export function encodeBlockWithTransactions(block) {
47
+ return {
48
+ ...encodeBlock(block),
49
+ transactions: block.transactions.map(encodeTransaction),
50
+ };
51
+ }
52
+ const EMPTY_TRIE_HASH = '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421';
53
+ const EMPTY_LOGS_BLOOM = '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff';
54
+ export function encodeNullRoundBlock(options) {
55
+ return {
56
+ number: options.number,
57
+ // TODO: probably should be previous block timestamp plus 30 seconds
58
+ timestamp: BigInt(Math.floor(Date.now() / 1000)),
59
+ hash: options.hash,
60
+ parentHash: options.hash,
61
+ logsBloom: EMPTY_LOGS_BLOOM,
62
+ miner: '0x0000000000000000000000000000000000000000',
63
+ gasUsed: 0n,
64
+ gasLimit: 30000000n,
65
+ baseFeePerGas: 1000000000n,
66
+ nonce: '0x0000000000000000',
67
+ mixHash: '0x0000000000000000000000000000000000000000000000000000000000000000',
68
+ stateRoot: EMPTY_TRIE_HASH,
69
+ receiptsRoot: EMPTY_TRIE_HASH,
70
+ transactionsRoot: EMPTY_TRIE_HASH,
71
+ sha3Uncles: '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347',
72
+ size: 0n,
73
+ difficulty: 0n,
74
+ totalDifficulty: 0n,
75
+ extraData: '0x',
76
+ transactions: [],
77
+ };
78
+ }
79
+ //# sourceMappingURL=encode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encode.js","sourceRoot":"","sources":["../../../src/db/encode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { Logger } from '../utils/logger.ts';
2
+ import type { Database, DatabaseContext } from './client.ts';
3
+ /**
4
+ * Applies pending SQL migrations at runtime.
5
+ */
6
+ export declare function runMigrations({ dbContext, folder, logger, }: {
7
+ folder: string;
8
+ dbContext: DatabaseContext;
9
+ logger: Logger;
10
+ }): Promise<void>;
11
+ /**
12
+ * Creates or updates a publication for the provided tables in the database.
13
+ * The resulting publication contains only the provided tables.
14
+ * This is needed for the live sync to work.
15
+ *
16
+ * @param db - The database to create the publication for
17
+ * @param tables - The list of table names to include
18
+ */
19
+ export declare function createPublications(db: Database, tables: string[]): Promise<void>;
20
+ /**
21
+ * Ensures every provided table has a blockNumber column and an index on it.
22
+ */
23
+ export declare function assertTablesHaveBlockNumberIndex(fullSchema: Record<string, unknown>, tableNames: string[]): void;
24
+ /**
25
+ * Checks if WAL is enabled.
26
+ *
27
+ * @param db - The database to check
28
+ * @returns True if WAL is enabled, false otherwise
29
+ */
30
+ export declare function isWalEnabled(db: Database): Promise<boolean>;
31
+ //# sourceMappingURL=migrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../../src/db/migrate.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAEhD,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAE5D;;GAEG;AACH,wBAAsB,aAAa,CAAC,EAClC,SAAS,EACT,MAAM,EACN,MAAM,GACP,EAAE;IACD,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,eAAe,CAAA;IAC1B,MAAM,EAAE,MAAM,CAAA;CACf,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BhB;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,iBA2BtE;AAED;;GAEG;AACH,wBAAgB,gCAAgC,CAC9C,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,UAAU,EAAE,MAAM,EAAE,QAsGrB;AAeD;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,EAAE,EAAE,QAAQ,oBAK9C"}
@@ -0,0 +1,147 @@
1
+ import { migrate as migratePostgresJs } from 'drizzle-orm/node-postgres/migrator';
2
+ import { getTableConfig } from 'drizzle-orm/pg-core';
3
+ import { IndexedColumn } from 'drizzle-orm/pg-core/columns/common';
4
+ import { migrate as migratePglite } from 'drizzle-orm/pglite/migrator';
5
+ import { FOXER_TABLES, PUBLICATION_NAME } from "../contants.js";
6
+ import { startClock } from "../utils/timer.js";
7
+ /**
8
+ * Applies pending SQL migrations at runtime.
9
+ */
10
+ export async function runMigrations({ dbContext, folder, logger, }) {
11
+ const endClock = startClock();
12
+ const { db, driver } = dbContext;
13
+ // apply migrations
14
+ if (driver === 'postgres') {
15
+ await migratePostgresJs(db, { migrationsFolder: folder });
16
+ }
17
+ else {
18
+ await migratePglite(db, { migrationsFolder: folder });
19
+ }
20
+ // get tables to migrate
21
+ const tables = Object.keys(dbContext.db._.fullSchema).filter((table) => !FOXER_TABLES.includes(table));
22
+ // assert tables have blockNumber column and index
23
+ assertTablesHaveBlockNumberIndex(dbContext.db._.fullSchema, tables);
24
+ // check if wal is enabled
25
+ const wal = await isWalEnabled(db);
26
+ if (!wal) {
27
+ throw new Error('WAL is not enabled, set wal_level=logical in your postgresql.conf or pass -c wal_level=logical to the postgres client');
28
+ }
29
+ // create publications
30
+ await createPublications(db, tables);
31
+ logger.info({ driver, duration: endClock() }, 'migrations applied');
32
+ }
33
+ /**
34
+ * Creates or updates a publication for the provided tables in the database.
35
+ * The resulting publication contains only the provided tables.
36
+ * This is needed for the live sync to work.
37
+ *
38
+ * @param db - The database to create the publication for
39
+ * @param tables - The list of table names to include
40
+ */
41
+ export async function createPublications(db, tables) {
42
+ if (tables.length === 0)
43
+ return;
44
+ const quotedTables = tables.map((table) => `"${table.replaceAll('"', '""')}"`);
45
+ const publication = await db.execute(`SELECT puballtables FROM pg_publication WHERE pubname = '${PUBLICATION_NAME}'`);
46
+ if (publication.rows.length === 0) {
47
+ await db.execute(`CREATE PUBLICATION ${PUBLICATION_NAME} FOR TABLE ${quotedTables.join(', ')}`);
48
+ return;
49
+ }
50
+ const isForAllTables = Boolean(publication.rows[0].puballtables);
51
+ if (isForAllTables) {
52
+ await db.execute(`DROP PUBLICATION ${PUBLICATION_NAME}`);
53
+ await db.execute(`CREATE PUBLICATION ${PUBLICATION_NAME} FOR TABLE ${quotedTables.join(', ')}`);
54
+ return;
55
+ }
56
+ await db.execute(`ALTER PUBLICATION ${PUBLICATION_NAME} SET TABLE ${quotedTables.join(', ')}`);
57
+ }
58
+ /**
59
+ * Ensures every provided table has a blockNumber column and an index on it.
60
+ */
61
+ export function assertTablesHaveBlockNumberIndex(fullSchema, tableNames) {
62
+ const missingBlockNumberColumn = [];
63
+ const missingBlockNumberIndex = [];
64
+ const tableConfigs = new Map();
65
+ const tableHasBlockNumberColumn = new Map();
66
+ for (const tableName of tableNames) {
67
+ const table = fullSchema[tableName];
68
+ if (!table)
69
+ continue;
70
+ const config = getTableConfig(table);
71
+ tableConfigs.set(tableName, config);
72
+ tableHasBlockNumberColumn.set(tableName, config.columns.some((column) => ['blockNumber', 'block_number'].includes(column.name)));
73
+ }
74
+ for (const tableName of tableNames) {
75
+ const config = tableConfigs.get(tableName);
76
+ if (!config)
77
+ continue;
78
+ const blockNumberColumns = config.columns.filter((column) => ['blockNumber', 'block_number'].includes(column.name));
79
+ if (blockNumberColumns.length === 0) {
80
+ if (hasCascadeForeignKeyToBlockNumberTable(config, tableHasBlockNumberColumn)) {
81
+ continue;
82
+ }
83
+ missingBlockNumberColumn.push(tableName);
84
+ continue;
85
+ }
86
+ const blockNumberColumnNames = new Set(blockNumberColumns.map((column) => column.name));
87
+ const hasBlockNumberIndex = config.indexes.some((index) => {
88
+ const indexColumns = index.config?.columns;
89
+ if (!indexColumns || indexColumns.length === 0)
90
+ return false;
91
+ return indexColumns.some((column) => {
92
+ if (!(column instanceof IndexedColumn))
93
+ return false;
94
+ if (!column.name)
95
+ return false;
96
+ return blockNumberColumnNames.has(column.name);
97
+ });
98
+ });
99
+ if (!hasBlockNumberIndex) {
100
+ missingBlockNumberIndex.push(tableName);
101
+ }
102
+ }
103
+ if (missingBlockNumberColumn.length > 0 ||
104
+ missingBlockNumberIndex.length > 0) {
105
+ const missingColumnTables = missingBlockNumberColumn.sort();
106
+ const missingIndexTables = missingBlockNumberIndex.sort();
107
+ const lines = [
108
+ 'Invalid schema for Foxer sync.',
109
+ '',
110
+ 'Each published table must have:',
111
+ "1) a 'blockNumber' column (db name can be 'block_number')",
112
+ "2) an index that includes 'blockNumber'",
113
+ "Exception: table can skip both when it has a foreign key with onDelete('cascade') to a table with blockNumber.",
114
+ '',
115
+ ];
116
+ if (missingColumnTables.length > 0) {
117
+ lines.push(`Tables missing blockNumber column: ${missingColumnTables.join(', ')}`);
118
+ }
119
+ if (missingIndexTables.length > 0) {
120
+ lines.push(`Tables missing blockNumber index: ${missingIndexTables.join(', ')}`);
121
+ }
122
+ lines.push('', 'Drizzle example:', "const myTable = pgTable('my_table', {", ' // 1) Add the blockNumber column', ' blockNumber: bigint().notNull(),', ' // ...other columns', '}, (table) => [', ' // 2) Add an index on blockNumber', " index('my_table_block_number_index').on(table.blockNumber),", '])');
123
+ throw new Error(lines.join('\n'));
124
+ }
125
+ }
126
+ function hasCascadeForeignKeyToBlockNumberTable(tableConfig, tableHasBlockNumberColumn) {
127
+ return tableConfig.foreignKeys.some((foreignKey) => {
128
+ if (foreignKey.onDelete !== 'cascade')
129
+ return false;
130
+ const referencedTable = foreignKey.reference().foreignTable;
131
+ const referencedTableName = getTableConfig(referencedTable).name;
132
+ return tableHasBlockNumberColumn.get(referencedTableName) === true;
133
+ });
134
+ }
135
+ /**
136
+ * Checks if WAL is enabled.
137
+ *
138
+ * @param db - The database to check
139
+ * @returns True if WAL is enabled, false otherwise
140
+ */
141
+ export async function isWalEnabled(db) {
142
+ const wal = await db
143
+ .execute('SHOW WAL_LEVEL')
144
+ .then((result) => result.rows[0].wal_level);
145
+ return wal === 'logical';
146
+ }
147
+ //# sourceMappingURL=migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../../src/db/migrate.ts"],"names":[],"mappings":"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"}