alchemy 0.69.0 → 0.70.0

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 (314) hide show
  1. package/bin/alchemy.js +3810 -3889
  2. package/bin/commands/init.ts +41 -55
  3. package/bin/trpc.ts +4 -9
  4. package/lib/alchemy.d.ts +3 -3
  5. package/lib/alchemy.d.ts.map +1 -1
  6. package/lib/alchemy.js +2 -15
  7. package/lib/alchemy.js.map +1 -1
  8. package/lib/apply.js +24 -9
  9. package/lib/apply.js.map +1 -1
  10. package/lib/aws/utils.d.ts +2 -1
  11. package/lib/aws/utils.d.ts.map +1 -1
  12. package/lib/aws/utils.js.map +1 -1
  13. package/lib/clickhouse/api/client.gen.d.ts +13 -0
  14. package/lib/clickhouse/api/client.gen.d.ts.map +1 -0
  15. package/lib/clickhouse/api/client.gen.js +7 -0
  16. package/lib/clickhouse/api/client.gen.js.map +1 -0
  17. package/lib/clickhouse/api/sdk.gen.d.ts +322 -0
  18. package/lib/clickhouse/api/sdk.gen.d.ts.map +1 -0
  19. package/lib/clickhouse/api/sdk.gen.js +683 -0
  20. package/lib/clickhouse/api/sdk.gen.js.map +1 -0
  21. package/lib/clickhouse/api/types.gen.d.ts +5030 -0
  22. package/lib/clickhouse/api/types.gen.d.ts.map +1 -0
  23. package/lib/clickhouse/api/types.gen.js +2 -0
  24. package/lib/clickhouse/api/types.gen.js.map +1 -0
  25. package/lib/clickhouse/api-key.d.ts +29 -0
  26. package/lib/clickhouse/api-key.d.ts.map +1 -0
  27. package/lib/clickhouse/api-key.js +83 -0
  28. package/lib/clickhouse/api-key.js.map +1 -0
  29. package/lib/clickhouse/api.d.ts +36 -0
  30. package/lib/clickhouse/api.d.ts.map +1 -0
  31. package/lib/clickhouse/api.js +48 -0
  32. package/lib/clickhouse/api.js.map +1 -0
  33. package/lib/clickhouse/index.d.ts +4 -0
  34. package/lib/clickhouse/index.d.ts.map +1 -0
  35. package/lib/clickhouse/index.js +4 -0
  36. package/lib/clickhouse/index.js.map +1 -0
  37. package/lib/clickhouse/organization.d.ts +16 -0
  38. package/lib/clickhouse/organization.d.ts.map +1 -0
  39. package/lib/clickhouse/organization.js +21 -0
  40. package/lib/clickhouse/organization.js.map +1 -0
  41. package/lib/clickhouse/service.d.ts +275 -0
  42. package/lib/clickhouse/service.d.ts.map +1 -0
  43. package/lib/clickhouse/service.js +274 -0
  44. package/lib/clickhouse/service.js.map +1 -0
  45. package/lib/cloudflare/account-api-token.d.ts.map +1 -1
  46. package/lib/cloudflare/account-api-token.js +1 -1
  47. package/lib/cloudflare/account-api-token.js.map +1 -1
  48. package/lib/cloudflare/bucket-object.d.ts +5 -0
  49. package/lib/cloudflare/bucket-object.d.ts.map +1 -1
  50. package/lib/cloudflare/bucket-object.js +1 -1
  51. package/lib/cloudflare/bucket-object.js.map +1 -1
  52. package/lib/cloudflare/bucket.d.ts +6 -3
  53. package/lib/cloudflare/bucket.d.ts.map +1 -1
  54. package/lib/cloudflare/bucket.js +60 -8
  55. package/lib/cloudflare/bucket.js.map +1 -1
  56. package/lib/cloudflare/bun-spa/bun-spa.d.ts +15 -0
  57. package/lib/cloudflare/bun-spa/bun-spa.d.ts.map +1 -0
  58. package/lib/cloudflare/bun-spa/bun-spa.js +95 -0
  59. package/lib/cloudflare/bun-spa/bun-spa.js.map +1 -0
  60. package/lib/cloudflare/compatibility-date.gen.d.ts +1 -1
  61. package/lib/cloudflare/compatibility-date.gen.js +1 -1
  62. package/lib/cloudflare/container.d.ts +11 -1
  63. package/lib/cloudflare/container.d.ts.map +1 -1
  64. package/lib/cloudflare/container.js +1 -1
  65. package/lib/cloudflare/container.js.map +1 -1
  66. package/lib/cloudflare/index.d.ts +1 -0
  67. package/lib/cloudflare/index.d.ts.map +1 -1
  68. package/lib/cloudflare/index.js +1 -0
  69. package/lib/cloudflare/index.js.map +1 -1
  70. package/lib/cloudflare/miniflare/build-worker-options.d.ts.map +1 -1
  71. package/lib/cloudflare/miniflare/build-worker-options.js +3 -3
  72. package/lib/cloudflare/miniflare/build-worker-options.js.map +1 -1
  73. package/lib/cloudflare/miniflare/miniflare-controller.d.ts.map +1 -1
  74. package/lib/cloudflare/miniflare/miniflare-controller.js +2 -0
  75. package/lib/cloudflare/miniflare/miniflare-controller.js.map +1 -1
  76. package/lib/cloudflare/miniflare/miniflare-worker-proxy.d.ts +1 -1
  77. package/lib/cloudflare/miniflare/miniflare-worker-proxy.d.ts.map +1 -1
  78. package/lib/cloudflare/miniflare/miniflare-worker-proxy.js +33 -14
  79. package/lib/cloudflare/miniflare/miniflare-worker-proxy.js.map +1 -1
  80. package/lib/cloudflare/permission-groups.d.ts +2 -3
  81. package/lib/cloudflare/permission-groups.d.ts.map +1 -1
  82. package/lib/cloudflare/permission-groups.js +10 -15
  83. package/lib/cloudflare/permission-groups.js.map +1 -1
  84. package/lib/cloudflare/redwood/redwood.d.ts +1 -1
  85. package/lib/cloudflare/redwood/redwood.js +1 -1
  86. package/lib/cloudflare/tanstack-start/plugin.d.ts +2 -15
  87. package/lib/cloudflare/tanstack-start/plugin.d.ts.map +1 -1
  88. package/lib/cloudflare/tanstack-start/plugin.js +5 -25
  89. package/lib/cloudflare/tanstack-start/plugin.js.map +1 -1
  90. package/lib/cloudflare/tanstack-start/tanstack-start.d.ts.map +1 -1
  91. package/lib/cloudflare/tanstack-start/tanstack-start.js +15 -4
  92. package/lib/cloudflare/tanstack-start/tanstack-start.js.map +1 -1
  93. package/lib/cloudflare/util/filter-env-bindings.d.ts +62 -0
  94. package/lib/cloudflare/util/filter-env-bindings.d.ts.map +1 -0
  95. package/lib/cloudflare/util/filter-env-bindings.js +81 -0
  96. package/lib/cloudflare/util/filter-env-bindings.js.map +1 -0
  97. package/lib/cloudflare/website.d.ts +2 -2
  98. package/lib/cloudflare/website.d.ts.map +1 -1
  99. package/lib/cloudflare/website.js +7 -18
  100. package/lib/cloudflare/website.js.map +1 -1
  101. package/lib/cloudflare/worker-metadata.d.ts +5 -1
  102. package/lib/cloudflare/worker-metadata.d.ts.map +1 -1
  103. package/lib/cloudflare/worker-metadata.js +3 -0
  104. package/lib/cloudflare/worker-metadata.js.map +1 -1
  105. package/lib/cloudflare/worker.d.ts +17 -1
  106. package/lib/cloudflare/worker.d.ts.map +1 -1
  107. package/lib/cloudflare/worker.js +1 -0
  108. package/lib/cloudflare/worker.js.map +1 -1
  109. package/lib/cloudflare/wrangler.json.d.ts +15 -1
  110. package/lib/cloudflare/wrangler.json.d.ts.map +1 -1
  111. package/lib/cloudflare/wrangler.json.js +12 -4
  112. package/lib/cloudflare/wrangler.json.js.map +1 -1
  113. package/lib/coinbase/client.d.ts +54 -0
  114. package/lib/coinbase/client.d.ts.map +1 -0
  115. package/lib/coinbase/client.js +89 -0
  116. package/lib/coinbase/client.js.map +1 -0
  117. package/lib/coinbase/evm-account.d.ts +118 -0
  118. package/lib/coinbase/evm-account.d.ts.map +1 -0
  119. package/lib/coinbase/evm-account.js +198 -0
  120. package/lib/coinbase/evm-account.js.map +1 -0
  121. package/lib/coinbase/evm-smart-account.d.ts +122 -0
  122. package/lib/coinbase/evm-smart-account.d.ts.map +1 -0
  123. package/lib/coinbase/evm-smart-account.js +213 -0
  124. package/lib/coinbase/evm-smart-account.js.map +1 -0
  125. package/lib/coinbase/faucet.d.ts +11 -0
  126. package/lib/coinbase/faucet.d.ts.map +1 -0
  127. package/lib/coinbase/faucet.js +146 -0
  128. package/lib/coinbase/faucet.js.map +1 -0
  129. package/lib/coinbase/index.d.ts +4 -0
  130. package/lib/coinbase/index.d.ts.map +1 -0
  131. package/lib/coinbase/index.js +4 -0
  132. package/lib/coinbase/index.js.map +1 -0
  133. package/lib/coinbase/types.d.ts +28 -0
  134. package/lib/coinbase/types.d.ts.map +1 -0
  135. package/lib/coinbase/types.js +4 -0
  136. package/lib/{util/telemetry → coinbase}/types.js.map +1 -1
  137. package/lib/coinbase/utils.d.ts +13 -0
  138. package/lib/coinbase/utils.d.ts.map +1 -0
  139. package/lib/coinbase/utils.js +17 -0
  140. package/lib/coinbase/utils.js.map +1 -0
  141. package/lib/docker/api.d.ts +22 -1
  142. package/lib/docker/api.d.ts.map +1 -1
  143. package/lib/docker/api.js +64 -2
  144. package/lib/docker/api.js.map +1 -1
  145. package/lib/docker/container.d.ts +88 -0
  146. package/lib/docker/container.d.ts.map +1 -1
  147. package/lib/docker/container.js +36 -0
  148. package/lib/docker/container.js.map +1 -1
  149. package/lib/neon/api/types.gen.d.ts +7 -2
  150. package/lib/neon/api/types.gen.d.ts.map +1 -1
  151. package/lib/planetscale/api/types.gen.d.ts +20 -4
  152. package/lib/planetscale/api/types.gen.d.ts.map +1 -1
  153. package/lib/planetscale/api.d.ts.map +1 -1
  154. package/lib/planetscale/api.js +1 -0
  155. package/lib/planetscale/api.js.map +1 -1
  156. package/lib/planetscale/password.d.ts.map +1 -1
  157. package/lib/planetscale/password.js +1 -13
  158. package/lib/planetscale/password.js.map +1 -1
  159. package/lib/resource.d.ts.map +1 -1
  160. package/lib/resource.js +7 -3
  161. package/lib/resource.js.map +1 -1
  162. package/lib/scope.d.ts +4 -9
  163. package/lib/scope.d.ts.map +1 -1
  164. package/lib/scope.js +16 -37
  165. package/lib/scope.js.map +1 -1
  166. package/lib/state/instrumented-state-store.d.ts +1 -3
  167. package/lib/state/instrumented-state-store.d.ts.map +1 -1
  168. package/lib/state/instrumented-state-store.js +19 -21
  169. package/lib/state/instrumented-state-store.js.map +1 -1
  170. package/lib/test/bun.d.ts.map +1 -1
  171. package/lib/test/bun.js +1 -2
  172. package/lib/test/bun.js.map +1 -1
  173. package/lib/test/vitest.d.ts.map +1 -1
  174. package/lib/test/vitest.js +1 -2
  175. package/lib/test/vitest.js.map +1 -1
  176. package/lib/util/diff.d.ts +5 -0
  177. package/lib/util/diff.d.ts.map +1 -0
  178. package/lib/util/diff.js +14 -0
  179. package/lib/util/diff.js.map +1 -0
  180. package/lib/util/telemetry.d.ts +52 -0
  181. package/lib/util/telemetry.d.ts.map +1 -0
  182. package/lib/util/telemetry.js +191 -0
  183. package/lib/util/telemetry.js.map +1 -0
  184. package/package.json +19 -1
  185. package/src/alchemy.ts +5 -20
  186. package/src/apply.ts +29 -12
  187. package/src/aws/utils.ts +2 -1
  188. package/src/clickhouse/api/client.gen.ts +28 -0
  189. package/src/clickhouse/api/sdk.gen.ts +1286 -0
  190. package/src/clickhouse/api/types.gen.ts +5898 -0
  191. package/src/clickhouse/api-key.ts +136 -0
  192. package/src/clickhouse/api.ts +84 -0
  193. package/src/clickhouse/index.ts +3 -0
  194. package/src/clickhouse/organization.ts +31 -0
  195. package/src/clickhouse/service.ts +668 -0
  196. package/src/cloudflare/account-api-token.ts +1 -4
  197. package/src/cloudflare/bucket-object.ts +11 -1
  198. package/src/cloudflare/bucket.ts +72 -6
  199. package/src/cloudflare/bun-spa/bun-spa.ts +139 -0
  200. package/src/cloudflare/compatibility-date.gen.ts +1 -1
  201. package/src/cloudflare/container.ts +22 -3
  202. package/src/cloudflare/index.ts +1 -0
  203. package/src/cloudflare/miniflare/build-worker-options.ts +6 -4
  204. package/src/cloudflare/miniflare/miniflare-controller.ts +2 -0
  205. package/src/cloudflare/miniflare/miniflare-worker-proxy.ts +42 -15
  206. package/src/cloudflare/permission-groups.ts +21 -49
  207. package/src/cloudflare/redwood/redwood.ts +1 -1
  208. package/src/cloudflare/tanstack-start/plugin.ts +7 -28
  209. package/src/cloudflare/tanstack-start/tanstack-start.ts +15 -4
  210. package/src/cloudflare/util/filter-env-bindings.ts +96 -0
  211. package/src/cloudflare/website.ts +12 -24
  212. package/src/cloudflare/worker-metadata.ts +8 -1
  213. package/src/cloudflare/worker.ts +19 -1
  214. package/src/cloudflare/wrangler.json.ts +27 -9
  215. package/src/coinbase/client.ts +146 -0
  216. package/src/coinbase/evm-account.ts +317 -0
  217. package/src/coinbase/evm-smart-account.ts +339 -0
  218. package/src/coinbase/faucet.ts +173 -0
  219. package/src/coinbase/index.ts +3 -0
  220. package/src/coinbase/types.ts +33 -0
  221. package/src/coinbase/utils.ts +19 -0
  222. package/src/docker/api.ts +86 -2
  223. package/src/docker/container.ts +97 -0
  224. package/src/neon/api/types.gen.ts +13 -1
  225. package/src/planetscale/api/types.gen.ts +22 -2
  226. package/src/planetscale/api.ts +1 -0
  227. package/src/planetscale/password.ts +1 -14
  228. package/src/resource.ts +11 -4
  229. package/src/scope.ts +22 -45
  230. package/src/state/instrumented-state-store.ts +27 -26
  231. package/src/test/bun.ts +1 -2
  232. package/src/test/vitest.ts +1 -2
  233. package/src/util/diff.ts +14 -0
  234. package/src/util/telemetry.ts +297 -0
  235. package/templates/tanstack-start/.cta.json +13 -0
  236. package/templates/tanstack-start/README.md +267 -49
  237. package/templates/tanstack-start/_gitignore +9 -18
  238. package/templates/tanstack-start/alchemy.run.ts +2 -2
  239. package/templates/tanstack-start/package.json +24 -19
  240. package/templates/tanstack-start/public/favicon.ico +0 -0
  241. package/templates/tanstack-start/public/logo192.png +0 -0
  242. package/templates/tanstack-start/public/logo512.png +0 -0
  243. package/templates/tanstack-start/public/manifest.json +25 -0
  244. package/templates/tanstack-start/public/robots.txt +3 -0
  245. package/templates/tanstack-start/src/components/Header.tsx +21 -0
  246. package/templates/tanstack-start/src/logo.svg +12 -0
  247. package/templates/tanstack-start/src/router.tsx +7 -16
  248. package/templates/tanstack-start/src/routes/__root.tsx +13 -114
  249. package/templates/tanstack-start/src/routes/api.demo-names.ts +15 -0
  250. package/templates/tanstack-start/src/routes/demo.start.api-request.tsx +44 -0
  251. package/templates/tanstack-start/src/routes/demo.start.server-funcs.tsx +97 -0
  252. package/templates/tanstack-start/src/routes/index.tsx +31 -4
  253. package/templates/tanstack-start/src/styles.css +15 -0
  254. package/templates/tanstack-start/tsconfig.json +19 -22
  255. package/templates/tanstack-start/types/env.d.ts +2 -2
  256. package/templates/tanstack-start/vite.config.ts +16 -25
  257. package/workers/tunnel-proxy.js +1 -1
  258. package/lib/util/telemetry/client.d.ts +0 -31
  259. package/lib/util/telemetry/client.d.ts.map +0 -1
  260. package/lib/util/telemetry/client.js +0 -121
  261. package/lib/util/telemetry/client.js.map +0 -1
  262. package/lib/util/telemetry/constants.d.ts +0 -5
  263. package/lib/util/telemetry/constants.d.ts.map +0 -1
  264. package/lib/util/telemetry/constants.js +0 -8
  265. package/lib/util/telemetry/constants.js.map +0 -1
  266. package/lib/util/telemetry/context.d.ts +0 -15
  267. package/lib/util/telemetry/context.d.ts.map +0 -1
  268. package/lib/util/telemetry/context.js +0 -128
  269. package/lib/util/telemetry/context.js.map +0 -1
  270. package/lib/util/telemetry/index.d.ts +0 -3
  271. package/lib/util/telemetry/index.d.ts.map +0 -1
  272. package/lib/util/telemetry/index.js +0 -3
  273. package/lib/util/telemetry/index.js.map +0 -1
  274. package/lib/util/telemetry/types.d.ts +0 -68
  275. package/lib/util/telemetry/types.d.ts.map +0 -1
  276. package/lib/util/telemetry/types.js +0 -1
  277. package/src/util/telemetry/client.ts +0 -156
  278. package/src/util/telemetry/constants.ts +0 -13
  279. package/src/util/telemetry/context.ts +0 -154
  280. package/src/util/telemetry/index.ts +0 -2
  281. package/src/util/telemetry/types.ts +0 -105
  282. package/templates/tanstack-start/_prettierignore +0 -4
  283. package/templates/tanstack-start/public/android-chrome-192x192.png +0 -0
  284. package/templates/tanstack-start/public/android-chrome-512x512.png +0 -0
  285. package/templates/tanstack-start/public/apple-touch-icon.png +0 -0
  286. package/templates/tanstack-start/public/favicon-16x16.png +0 -0
  287. package/templates/tanstack-start/public/favicon-32x32.png +0 -0
  288. package/templates/tanstack-start/public/favicon.png +0 -0
  289. package/templates/tanstack-start/public/site.webmanifest +0 -19
  290. package/templates/tanstack-start/src/components/DefaultCatchBoundary.tsx +0 -53
  291. package/templates/tanstack-start/src/components/NotFound.tsx +0 -25
  292. package/templates/tanstack-start/src/components/PostError.tsx +0 -5
  293. package/templates/tanstack-start/src/components/UserError.tsx +0 -5
  294. package/templates/tanstack-start/src/routes/_pathlessLayout/_nested-layout/route-a.tsx +0 -10
  295. package/templates/tanstack-start/src/routes/_pathlessLayout/_nested-layout/route-b.tsx +0 -10
  296. package/templates/tanstack-start/src/routes/_pathlessLayout/_nested-layout.tsx +0 -34
  297. package/templates/tanstack-start/src/routes/_pathlessLayout.tsx +0 -16
  298. package/templates/tanstack-start/src/routes/api/users.$userId.ts +0 -28
  299. package/templates/tanstack-start/src/routes/api/users.ts +0 -59
  300. package/templates/tanstack-start/src/routes/customScript[.]js.ts +0 -10
  301. package/templates/tanstack-start/src/routes/deferred.tsx +0 -62
  302. package/templates/tanstack-start/src/routes/posts.$postId.tsx +0 -34
  303. package/templates/tanstack-start/src/routes/posts.index.tsx +0 -8
  304. package/templates/tanstack-start/src/routes/posts.tsx +0 -38
  305. package/templates/tanstack-start/src/routes/posts_.$postId.deep.tsx +0 -29
  306. package/templates/tanstack-start/src/routes/redirect.tsx +0 -9
  307. package/templates/tanstack-start/src/routes/users.$userId.tsx +0 -44
  308. package/templates/tanstack-start/src/routes/users.index.tsx +0 -18
  309. package/templates/tanstack-start/src/routes/users.tsx +0 -49
  310. package/templates/tanstack-start/src/styles/app.css +0 -12
  311. package/templates/tanstack-start/src/utils/loggingMiddleware.tsx +0 -41
  312. package/templates/tanstack-start/src/utils/posts.tsx +0 -40
  313. package/templates/tanstack-start/src/utils/seo.ts +0 -33
  314. package/templates/tanstack-start/src/utils/users.tsx +0 -5
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Returns an array of keys in `b` that are different from `a`.
3
+ */
4
+ export declare const diff: <T>(a: T, b: NoInfer<T>) => (keyof T)[];
5
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/util/diff.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,eAAO,MAAM,IAAI,GAAI,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,gBAQ1C,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { isDeepStrictEqual } from "node:util";
2
+ /**
3
+ * Returns an array of keys in `b` that are different from `a`.
4
+ */
5
+ export const diff = (a, b) => {
6
+ const keys = [];
7
+ for (const key in a) {
8
+ if (!isDeepStrictEqual(a[key], b[key])) {
9
+ keys.push(key);
10
+ }
11
+ }
12
+ return keys;
13
+ };
14
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/util/diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE9C;;GAEG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,CAAI,CAAI,EAAE,CAAa,EAAE,EAAE;IAC7C,MAAM,IAAI,GAAgB,EAAE,CAAC;IAC7B,KAAK,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;QACpB,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACvC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC"}
@@ -0,0 +1,52 @@
1
+ import type { Phase } from "../alchemy.ts";
2
+ export declare const CONFIG_PATH: string;
3
+ export declare const CONFIG_PATH_LEGACY: string;
4
+ export declare const TELEMETRY_DISABLED: boolean;
5
+ export declare const TELEMETRY_API_URL: string;
6
+ export declare const SUPPRESS_TELEMETRY_ERRORS: boolean;
7
+ export declare const collectData: () => Promise<GenericTelemetryData>;
8
+ export type GenericTelemetryData = {
9
+ userId: string;
10
+ sessionId: string;
11
+ platform: string;
12
+ osVersion: string;
13
+ arch: string;
14
+ cpus: number;
15
+ memory: number;
16
+ rootCommitHash: string;
17
+ gitOriginUrl: string;
18
+ gitBranchHash: string;
19
+ runtime: string;
20
+ runtimeVersion: string;
21
+ ciProvider: string;
22
+ isCI: boolean;
23
+ alchemyVersion: string;
24
+ };
25
+ export type ErrorData = {
26
+ errorTag: string;
27
+ errorMessage: string;
28
+ errorStack: string;
29
+ };
30
+ export type CliTelemetryData = {
31
+ command: string;
32
+ event: "cli.start" | "cli.success" | "cli.error";
33
+ };
34
+ export type ResourceTelemetryData = {
35
+ phase: Phase;
36
+ event: "resource.start" | "resource.success" | "resource.error" | "resource.skip" | "resource.read";
37
+ resource: string;
38
+ status: "creating" | "created" | "updating" | "updated" | "deleting" | "deleted" | "unknown";
39
+ duration: number;
40
+ replaced: boolean;
41
+ };
42
+ export type StateStoreTelemetryData = {
43
+ event: "statestore.init" | "statestore.deinit" | "statestore.list" | "statestore.count" | "statestore.get" | "statestore.getBatch" | "statestore.all" | "statestore.set" | "statestore.delete";
44
+ stateStore: string;
45
+ duration: number;
46
+ };
47
+ export type AlchemyTelemetryData = {
48
+ event: "alchemy.start" | "alchemy.success" | "alchemy.error";
49
+ duration: number;
50
+ };
51
+ export declare function createAndSendEvent(data: CliTelemetryData | ResourceTelemetryData | StateStoreTelemetryData | AlchemyTelemetryData, error?: Error): Promise<void>;
52
+ //# sourceMappingURL=telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/util/telemetry.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAK3C,eAAO,MAAM,WAAW,QAA4C,CAAC;AACrE,eAAO,MAAM,kBAAkB,QAG9B,CAAC;AAEF,eAAO,MAAM,kBAAkB,SACyC,CAAC;AAEzE,eAAO,MAAM,iBAAiB,QAC4C,CAAC;AAC3E,eAAO,MAAM,yBAAyB,SACW,CAAC;AA8GlD,eAAO,MAAM,WAAW,qCAiCtB,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,WAAW,GAAG,aAAa,GAAG,WAAW,CAAC;CAClD,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EACD,gBAAgB,GAChB,kBAAkB,GAClB,gBAAgB,GAChB,eAAe,GACf,eAAe,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EACF,UAAU,GACV,SAAS,GACT,UAAU,GACV,SAAS,GACT,UAAU,GACV,SAAS,GACT,SAAS,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,KAAK,EACD,iBAAiB,GACjB,mBAAmB,GACnB,iBAAiB,GACjB,kBAAkB,GAClB,gBAAgB,GAChB,qBAAqB,GACrB,gBAAgB,GAChB,gBAAgB,GAChB,mBAAmB,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,eAAe,GAAG,iBAAiB,GAAG,eAAe,CAAC;IAC7D,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,wBAAsB,kBAAkB,CACtC,IAAI,EACA,gBAAgB,GAChB,qBAAqB,GACrB,uBAAuB,GACvB,oBAAoB,EACxB,KAAK,CAAC,EAAE,KAAK,iBA0Bd"}
@@ -0,0 +1,191 @@
1
+ import envPaths from "env-paths";
2
+ import { exec } from "node:child_process";
3
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
4
+ import os from "node:os";
5
+ import path from "pathe";
6
+ import pkg from "../../package.json" with { type: "json" };
7
+ import { Scope } from "../scope.js";
8
+ import { logger } from "./logger.js";
9
+ import { memoize } from "./memoize.js";
10
+ export const CONFIG_PATH = path.join(os.homedir(), ".alchemy", "id");
11
+ export const CONFIG_PATH_LEGACY = path.join(envPaths("alchemy", { suffix: "" }).config, "id");
12
+ export const TELEMETRY_DISABLED = !!process.env.ALCHEMY_TELEMETRY_DISABLED || !!process.env.DO_NOT_TRACK;
13
+ export const TELEMETRY_API_URL = process.env.ALCHEMY_TELEMETRY_API_URL ?? "https://telemetry.alchemy.run";
14
+ export const SUPPRESS_TELEMETRY_ERRORS = !!process.env.ALCHEMY_TELEMETRY_SUPPRESS_ERRORS;
15
+ async function getOrCreateUserId() {
16
+ async function readUserId(path) {
17
+ try {
18
+ return (await readFile(path, "utf-8")).trim();
19
+ }
20
+ catch {
21
+ return null;
22
+ }
23
+ }
24
+ const id = await readUserId(CONFIG_PATH);
25
+ if (id) {
26
+ return id;
27
+ }
28
+ const legacyId = await readUserId(CONFIG_PATH_LEGACY);
29
+ try {
30
+ const id = legacyId ?? crypto.randomUUID();
31
+ await mkdir(path.dirname(CONFIG_PATH), { recursive: true });
32
+ await writeFile(CONFIG_PATH, id);
33
+ if (!legacyId) {
34
+ console.warn([
35
+ "Attention: To help improve Alchemy, we collect anonymous usage, performance, and error data.",
36
+ "You can opt out by setting the ALCHEMY_TELEMETRY_DISABLED or DO_NOT_TRACK environment variable to a truthy value.",
37
+ ].join("\n"));
38
+ }
39
+ return id;
40
+ }
41
+ catch {
42
+ return null;
43
+ }
44
+ }
45
+ async function getRootCommitHash() {
46
+ return new Promise((resolve) => {
47
+ exec("git rev-list --max-parents=0 HEAD", (err, stdout) => {
48
+ if (err) {
49
+ resolve(null);
50
+ return;
51
+ }
52
+ resolve(stdout.trim());
53
+ });
54
+ });
55
+ }
56
+ async function getGitOriginUrlHash() {
57
+ return new Promise((resolve) => {
58
+ exec("git config --get remote.origin.url", (err, stdout) => {
59
+ if (err) {
60
+ resolve(null);
61
+ return;
62
+ }
63
+ resolve(hashString(stdout.trim()));
64
+ });
65
+ });
66
+ }
67
+ async function getBranchName() {
68
+ return new Promise((resolve) => {
69
+ exec("git rev-parse --abbrev-ref HEAD", (err, stdout) => {
70
+ if (err) {
71
+ resolve(null);
72
+ return;
73
+ }
74
+ resolve(stdout.trim());
75
+ });
76
+ });
77
+ }
78
+ function getRuntime() {
79
+ if (globalThis.Bun)
80
+ return { name: "bun", version: Bun.version };
81
+ // @ts-expect-error
82
+ if (globalThis.Deno)
83
+ // @ts-expect-error
84
+ return { name: "deno", version: Deno.version?.deno ?? null };
85
+ // @ts-expect-error
86
+ if (globalThis.EdgeRuntime)
87
+ return { name: "workerd", version: null };
88
+ if (globalThis.process?.versions?.node)
89
+ return { name: "node", version: process.versions.node };
90
+ return { name: null, version: null };
91
+ }
92
+ const PROVIDERS = [
93
+ { env: "GITHUB_ACTIONS", provider: "GitHub Actions", isCI: true },
94
+ { env: "GITLAB_CI", provider: "GitLab CI", isCI: true },
95
+ { env: "CIRCLECI", provider: "CircleCI", isCI: true },
96
+ { env: "JENKINS_URL", provider: "Jenkins", isCI: true },
97
+ { env: "TRAVIS", provider: "Travis CI", isCI: true },
98
+ { env: "NOW_BUILDER", provider: "Vercel", isCI: true },
99
+ { env: "VERCEL", provider: "Vercel", isCI: false },
100
+ ];
101
+ function getEnvironment() {
102
+ for (const provider of PROVIDERS) {
103
+ if (process.env[provider.env]) {
104
+ return {
105
+ provider: provider.provider,
106
+ isCI: provider.isCI,
107
+ };
108
+ }
109
+ }
110
+ return {
111
+ provider: null,
112
+ isCI: !!process.env.CI,
113
+ };
114
+ }
115
+ export const collectData = memoize(async () => {
116
+ const [userId, rootCommitHash, gitOriginUrlHash, branchHash, runtime, environment,] = await Promise.all([
117
+ getOrCreateUserId(),
118
+ getRootCommitHash(),
119
+ getGitOriginUrlHash(),
120
+ getBranchName().then(hashString),
121
+ getRuntime(),
122
+ getEnvironment(),
123
+ ]);
124
+ return {
125
+ userId: userId ?? "",
126
+ sessionId: crypto.randomUUID(),
127
+ platform: os.platform(),
128
+ osVersion: os.release(),
129
+ arch: os.arch(),
130
+ cpus: os.cpus().length,
131
+ memory: Math.round(os.totalmem() / 1024 / 1024),
132
+ rootCommitHash: rootCommitHash ?? "",
133
+ gitOriginUrl: gitOriginUrlHash ?? "",
134
+ gitBranchHash: branchHash ?? "",
135
+ runtime: runtime.name ?? "",
136
+ runtimeVersion: runtime.version ?? "",
137
+ ciProvider: environment.provider ?? "",
138
+ isCI: environment.isCI,
139
+ alchemyVersion: pkg.version,
140
+ };
141
+ });
142
+ export async function createAndSendEvent(data, error) {
143
+ if (Scope.getScope()?.noTrack || TELEMETRY_DISABLED) {
144
+ return;
145
+ }
146
+ try {
147
+ const eventData = {
148
+ ...data,
149
+ ...("duration" in data
150
+ ? { duration: Math.round(data.duration * 1000) }
151
+ : {}),
152
+ ...(await collectData()),
153
+ ...serializeError(error),
154
+ };
155
+ await fetch(TELEMETRY_API_URL, {
156
+ method: "POST",
157
+ headers: {
158
+ "Content-Type": "application/json",
159
+ },
160
+ body: JSON.stringify(eventData),
161
+ });
162
+ }
163
+ catch (error) {
164
+ if (!SUPPRESS_TELEMETRY_ERRORS) {
165
+ logger.warn("Failed to send telemetry event:", error);
166
+ }
167
+ }
168
+ }
169
+ async function hashString(input) {
170
+ if (input == null) {
171
+ return null;
172
+ }
173
+ const data = new TextEncoder().encode(input);
174
+ const hashBuffer = await crypto.subtle.digest("SHA-256", data);
175
+ return Array.from(new Uint8Array(hashBuffer), (byte) => byte.toString(16).padStart(2, "0")).join("");
176
+ }
177
+ function serializeError(error) {
178
+ if (error instanceof Error) {
179
+ return {
180
+ errorTag: error.name ?? "",
181
+ errorMessage: error.message?.replaceAll(os.homedir(), "~") ?? "", // redact home directory
182
+ errorStack: error.stack?.replaceAll(os.homedir(), "~") ?? "",
183
+ };
184
+ }
185
+ return {
186
+ errorTag: "",
187
+ errorMessage: "",
188
+ errorStack: "",
189
+ };
190
+ }
191
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/util/telemetry.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "alchemy",
3
- "version": "0.69.0",
3
+ "version": "0.70.0",
4
4
  "license": "Apache-2.0",
5
5
  "author": "Sam Goodwin <sam@alchemy.run>",
6
6
  "homepage": "https://alchemy.run",
@@ -40,6 +40,14 @@
40
40
  "bun": "./src/llms.ts",
41
41
  "import": "./lib/llms.js"
42
42
  },
43
+ "./coinbase": {
44
+ "bun": "./src/coinbase/index.ts",
45
+ "import": "./lib/coinbase/index.js"
46
+ },
47
+ "./coinbase/faucet": {
48
+ "bun": "./src/coinbase/faucet.ts",
49
+ "import": "./lib/coinbase/faucet.js"
50
+ },
43
51
  "./aws": {
44
52
  "bun": "./src/aws/index.ts",
45
53
  "import": "./lib/aws/index.js"
@@ -52,6 +60,10 @@
52
60
  "bun": "./src/aws/oidc/index.ts",
53
61
  "import": "./lib/aws/oidc/index.js"
54
62
  },
63
+ "./clickhouse": {
64
+ "bun": "./src/clickhouse/index.ts",
65
+ "import": "./lib/clickhouse/index.js"
66
+ },
55
67
  "./cloudflare": {
56
68
  "bun": "./src/cloudflare/index.ts",
57
69
  "import": "./lib/cloudflare/index.js"
@@ -150,6 +162,7 @@
150
162
  "@cloudflare/unenv-preset": "^2.6.3",
151
163
  "@iarna/toml": "^2.2.5",
152
164
  "@smithy/node-config-provider": "^4.0.0",
165
+ "@smithy/types": "^4.6.0",
153
166
  "aws4fetch": "^1.0.20",
154
167
  "env-paths": "^3.0.0",
155
168
  "esbuild": "^0.25.1",
@@ -175,6 +188,7 @@
175
188
  "peerDependencies": {
176
189
  "@astrojs/cloudflare": "^12.6.4",
177
190
  "@aws-sdk/client-dynamodb": "^3.0.0",
191
+ "@coinbase/cdp-sdk": "^0.10.0",
178
192
  "@aws-sdk/client-iam": "^3.0.0",
179
193
  "@aws-sdk/client-lambda": "^3.0.0",
180
194
  "@aws-sdk/client-s3": "^3.0.0",
@@ -196,6 +210,9 @@
196
210
  "@astrojs/cloudflare": {
197
211
  "optional": true
198
212
  },
213
+ "@coinbase/cdp-sdk": {
214
+ "optional": true
215
+ },
199
216
  "@aws-sdk/client-dynamodb": {
200
217
  "optional": true
201
218
  },
@@ -264,6 +281,7 @@
264
281
  "@cloudflare/puppeteer": "^1.0.2",
265
282
  "@cloudflare/vite-plugin": "^1.11.6",
266
283
  "@cloudflare/workers-types": "^4.20250805.0",
284
+ "@coinbase/cdp-sdk": "^1.38.2",
267
285
  "@libsql/client": "^0.15.12",
268
286
  "@octokit/rest": "^21.1.1",
269
287
  "@sentry/cloudflare": "^9.43.0",
package/src/alchemy.ts CHANGED
@@ -17,7 +17,6 @@ import { secret } from "./secret.ts";
17
17
  import type { StateStoreType } from "./state.ts";
18
18
  import type { LoggerApi } from "./util/cli.ts";
19
19
  import { ALCHEMY_ROOT } from "./util/root-dir.ts";
20
- import { TelemetryClient } from "./util/telemetry/client.ts";
21
20
 
22
21
  /**
23
22
  * Type alias for semantic highlighting of `alchemy` as a type keyword
@@ -162,20 +161,13 @@ If this is a mistake, you can disable this check by setting the ALCHEMY_CI_STATE
162
161
  }
163
162
 
164
163
  const phase = mergedOptions?.phase ?? "up";
165
- const telemetryClient =
166
- mergedOptions?.parent?.telemetryClient ??
167
- TelemetryClient.create({
168
- phase,
169
- enabled: mergedOptions?.telemetry ?? true,
170
- quiet: mergedOptions?.quiet ?? false,
171
- });
172
164
  const root = new Scope({
173
165
  ...mergedOptions,
174
166
  parent: undefined,
175
167
  scopeName: appName,
176
168
  phase,
177
169
  password: mergedOptions?.password ?? process.env.ALCHEMY_PASSWORD,
178
- telemetryClient,
170
+ noTrack: mergedOptions?.noTrack ?? false,
179
171
  isSelected: app === undefined ? undefined : app === appName,
180
172
  });
181
173
  onExit((code) => {
@@ -280,12 +272,12 @@ export interface AlchemyOptions {
280
272
  */
281
273
  password?: string;
282
274
  /**
283
- * Whether to send anonymous telemetry data to the Alchemy team.
275
+ * Whether to stop sending anonymous telemetry data to the Alchemy team.
284
276
  * You can also opt out by setting the `DO_NOT_TRACK` or `ALCHEMY_TELEMETRY_DISABLED` environment variables to a truthy value.
285
277
  *
286
- * @default true
278
+ * @default false
287
279
  */
288
- telemetry?: boolean;
280
+ noTrack?: boolean;
289
281
  /**
290
282
  * A custom logger instance to use for this scope.
291
283
  * If not provided, the default fallback logger will be used.
@@ -353,18 +345,11 @@ async function run<T>(
353
345
  RunOptions,
354
346
  (this: Scope, scope: Scope) => Promise<T>,
355
347
  ]);
356
- const telemetryClient =
357
- options?.parent?.telemetryClient ??
358
- TelemetryClient.create({
359
- phase: options?.phase ?? "up",
360
- enabled: options?.telemetry ?? true,
361
- quiet: options?.quiet ?? false,
362
- });
363
348
  const _scope = new Scope({
364
349
  ...options,
365
350
  parent: options?.parent,
366
351
  scopeName: id,
367
- telemetryClient,
352
+ noTrack: options?.noTrack ?? false,
368
353
  });
369
354
  let noop = options?.noop ?? false;
370
355
  try {
package/src/apply.ts CHANGED
@@ -19,7 +19,7 @@ import { serialize } from "./serde.ts";
19
19
  import type { State } from "./state.ts";
20
20
  import { formatFQN } from "./util/cli.ts";
21
21
  import { logger } from "./util/logger.ts";
22
- import type { Telemetry } from "./util/telemetry/index.ts";
22
+ import { createAndSendEvent } from "./util/telemetry.ts";
23
23
 
24
24
  export interface ApplyOptions {
25
25
  quiet?: boolean;
@@ -83,9 +83,13 @@ async function _apply<Out extends ResourceAttributes>(
83
83
  // we are running in a monorepo and are not the selected app, so we need to wait for the process to be consistent
84
84
  state = await waitForConsistentState();
85
85
  }
86
- scope.telemetryClient.record({
86
+ createAndSendEvent({
87
87
  event: "resource.read",
88
+ phase: scope.phase,
89
+ duration: performance.now() - start,
90
+ status: state.status,
88
91
  resource: resource[ResourceKind],
92
+ replaced: false,
89
93
  });
90
94
  return state.output as Awaited<Out> & Resource;
91
95
 
@@ -179,10 +183,13 @@ async function _apply<Out extends ResourceAttributes>(
179
183
  status: "success",
180
184
  });
181
185
  }
182
- scope.telemetryClient.record({
186
+ createAndSendEvent({
183
187
  event: "resource.skip",
184
188
  resource: resource[ResourceKind],
185
189
  status: state.status,
190
+ phase: scope.phase,
191
+ duration: performance.now() - start,
192
+ replaced: false,
186
193
  });
187
194
  return state.output as Awaited<Out> & Resource;
188
195
  }
@@ -202,10 +209,13 @@ async function _apply<Out extends ResourceAttributes>(
202
209
  });
203
210
  }
204
211
 
205
- scope.telemetryClient.record({
212
+ createAndSendEvent({
206
213
  event: "resource.start",
207
214
  resource: resource[ResourceKind],
208
215
  status: state.status,
216
+ phase: scope.phase,
217
+ duration: performance.now() - start,
218
+ replaced: false,
209
219
  });
210
220
 
211
221
  await scope.state.set(resource[ResourceID], state);
@@ -326,11 +336,12 @@ async function _apply<Out extends ResourceAttributes>(
326
336
  }
327
337
 
328
338
  const status = phase === "create" ? "created" : "updated";
329
- scope.telemetryClient.record({
339
+ createAndSendEvent({
330
340
  event: "resource.success",
331
341
  resource: resource[ResourceKind],
332
342
  status,
333
- elapsed: performance.now() - start,
343
+ phase: scope.phase,
344
+ duration: performance.now() - start,
334
345
  replaced: isReplaced,
335
346
  });
336
347
 
@@ -347,12 +358,18 @@ async function _apply<Out extends ResourceAttributes>(
347
358
  });
348
359
  return output as Awaited<Out> & Resource;
349
360
  } catch (error) {
350
- scope.telemetryClient.record({
351
- event: "resource.error",
352
- resource: resource[ResourceKind],
353
- error: error as Telemetry.ErrorInput,
354
- elapsed: performance.now() - start,
355
- });
361
+ let errorToSend = error instanceof Error ? error : new Error(String(error));
362
+ createAndSendEvent(
363
+ {
364
+ event: "resource.error",
365
+ resource: resource[ResourceKind],
366
+ duration: performance.now() - start,
367
+ phase: scope.phase,
368
+ status: "unknown",
369
+ replaced: false,
370
+ },
371
+ errorToSend,
372
+ );
356
373
  scope.fail();
357
374
  throw error;
358
375
  }
package/src/aws/utils.ts CHANGED
@@ -1,12 +1,13 @@
1
1
  import { fromNodeProviderChain } from "@aws-sdk/credential-providers";
2
2
  import { loadConfig } from "@smithy/node-config-provider";
3
+ import type { Provider } from "@smithy/types";
3
4
  import { AwsClient } from "aws4fetch";
4
5
  import { flattenParams } from "../util/params.ts";
5
6
 
6
7
  /**
7
8
  * Get AWS region from configuration
8
9
  */
9
- export const getRegion = loadConfig({
10
+ export const getRegion: Provider<string> = loadConfig({
10
11
  environmentVariableSelector: (env: any) =>
11
12
  env.AWS_REGION || env.AWS_DEFAULT_REGION,
12
13
  configFileSelector: (profile: any) => profile.region,
@@ -0,0 +1,28 @@
1
+ // This file is auto-generated by @hey-api/openapi-ts
2
+
3
+ import {
4
+ type ClientOptions,
5
+ type Config,
6
+ createClient,
7
+ createConfig,
8
+ } from "../../util/api/client/index.ts";
9
+ import type { ClientOptions as ClientOptions2 } from "./types.gen.ts";
10
+
11
+ /**
12
+ * The `createClientConfig()` function will be called on client initialization
13
+ * and the returned object will become the client's initial configuration.
14
+ *
15
+ * You may want to initialize your client this way instead of calling
16
+ * `setConfig()`. This is useful for example if you're using Next.js
17
+ * to ensure your client always has the correct values.
18
+ */
19
+ export type CreateClientConfig<T extends ClientOptions = ClientOptions2> = (
20
+ override?: Config<ClientOptions & T>,
21
+ ) => Config<Required<ClientOptions> & T>;
22
+
23
+ export const client = createClient(
24
+ createConfig<ClientOptions2>({
25
+ baseUrl: "https://api.clickhouse.cloud",
26
+ throwOnError: true,
27
+ }),
28
+ );