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
@@ -1,8 +0,0 @@
1
- import envPaths from "env-paths";
2
- export const CONFIG_DIR = envPaths("alchemy", { suffix: "" }).config;
3
- export const TELEMETRY_DISABLED = !!process.env.ALCHEMY_TELEMETRY_DISABLED || !!process.env.DO_NOT_TRACK;
4
- // TODO(sam): replace with permanent URL
5
- export const POSTHOG_CLIENT_API_HOST = process.env.ALCHEMY_POSTHOG_CLIENT_API_HOST ?? "https://ph.alchemy.run";
6
- export const POSTHOG_PROJECT_ID = process.env.ALCHEMY_POSTHOG_PROJECT_ID ??
7
- "phc_A51Mi7Q63TvnNrvRMgvBxE1il0DAL66rVg4LdWPRsfK";
8
- //# sourceMappingURL=constants.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/util/telemetry/constants.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,WAAW,CAAC;AAEjC,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;AAErE,MAAM,CAAC,MAAM,kBAAkB,GAC7B,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;AAEzE,wCAAwC;AACxC,MAAM,CAAC,MAAM,uBAAuB,GAClC,OAAO,CAAC,GAAG,CAAC,+BAA+B,IAAI,wBAAwB,CAAC;AAC1E,MAAM,CAAC,MAAM,kBAAkB,GAC7B,OAAO,CAAC,GAAG,CAAC,0BAA0B;IACtC,iDAAiD,CAAC"}
@@ -1,15 +0,0 @@
1
- import type { Phase } from "../../alchemy.ts";
2
- import type { Telemetry } from "./types.ts";
3
- declare global {
4
- var Deno: {
5
- version: {
6
- deno: string;
7
- };
8
- } | undefined;
9
- var EdgeRuntime: Record<string, unknown> | undefined;
10
- }
11
- export declare function context(input: {
12
- sessionId: string;
13
- phase?: Phase;
14
- }): Promise<Telemetry.Context>;
15
- //# sourceMappingURL=context.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/util/telemetry/context.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAmD5C,OAAO,CAAC,MAAM,CAAC;IACb,IAAI,IAAI,EACJ;QACE,OAAO,EAAE;YACP,IAAI,EAAE,MAAM,CAAC;SACd,CAAC;KACH,GACD,SAAS,CAAC;IACd,IAAI,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;CACtD;AAiED,wBAAsB,OAAO,CAAC,KAAK,EAAE;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC;CACf,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAkB7B"}
@@ -1,128 +0,0 @@
1
- import { exec } from "node:child_process";
2
- import { mkdir, readFile, writeFile } from "node:fs/promises";
3
- import os from "node:os";
4
- import { join } from "node:path";
5
- import pkg from "../../../package.json" with { type: "json" };
6
- import { CONFIG_DIR } from "./constants.js";
7
- async function userId() {
8
- const path = join(CONFIG_DIR, "id");
9
- try {
10
- return (await readFile(path, "utf-8")).trim();
11
- }
12
- catch { }
13
- try {
14
- await mkdir(CONFIG_DIR, { recursive: true });
15
- }
16
- catch { }
17
- const id = crypto.randomUUID();
18
- try {
19
- await writeFile(path, id);
20
- console.warn([
21
- "Attention: To help improve Alchemy, we now collect anonymous usage, performance, and error data.",
22
- "You can opt out by setting the ALCHEMY_TELEMETRY_DISABLED or DO_NOT_TRACK environment variable to a truthy value.",
23
- ].join("\n"));
24
- }
25
- catch {
26
- return null;
27
- }
28
- return id;
29
- }
30
- function projectId() {
31
- return new Promise((resolve) => {
32
- exec("git rev-list --max-parents=0 HEAD", (err, stdout) => {
33
- if (err) {
34
- resolve(null);
35
- return;
36
- }
37
- resolve(stdout.trim());
38
- });
39
- });
40
- }
41
- function system() {
42
- return {
43
- platform: os.platform(),
44
- osVersion: os.release(),
45
- arch: os.arch(),
46
- cpus: os.cpus().length,
47
- memory: os.totalmem() / 1024 / 1024,
48
- };
49
- }
50
- const RUNTIMES = [
51
- {
52
- name: "bun",
53
- detect: () => !!globalThis.Bun,
54
- version: () => globalThis.Bun?.version,
55
- },
56
- {
57
- name: "deno",
58
- detect: () => !!globalThis.Deno,
59
- version: () => globalThis.Deno?.version?.deno,
60
- },
61
- {
62
- name: "workerd",
63
- detect: () => !!globalThis.EdgeRuntime,
64
- version: () => null,
65
- },
66
- {
67
- name: "node",
68
- detect: () => !!globalThis.process?.versions?.node,
69
- version: () => process.versions.node,
70
- },
71
- ];
72
- function runtime() {
73
- for (const runtime of RUNTIMES) {
74
- if (runtime.detect()) {
75
- return {
76
- name: runtime.name,
77
- version: runtime.version() ?? null,
78
- };
79
- }
80
- }
81
- return {
82
- name: null,
83
- version: null,
84
- };
85
- }
86
- const PROVIDERS = [
87
- { env: "GITHUB_ACTIONS", provider: "GitHub Actions", isCI: true },
88
- { env: "GITLAB_CI", provider: "GitLab CI", isCI: true },
89
- { env: "CIRCLECI", provider: "CircleCI", isCI: true },
90
- { env: "JENKINS_URL", provider: "Jenkins", isCI: true },
91
- { env: "TRAVIS", provider: "Travis CI", isCI: true },
92
- { env: "NOW_BUILDER", provider: "Vercel", isCI: true },
93
- { env: "VERCEL", provider: "Vercel", isCI: false },
94
- ];
95
- function environment() {
96
- for (const provider of PROVIDERS) {
97
- if (process.env[provider.env]) {
98
- return {
99
- provider: provider.provider,
100
- isCI: provider.isCI,
101
- };
102
- }
103
- }
104
- return {
105
- provider: null,
106
- isCI: !!process.env.CI,
107
- };
108
- }
109
- export async function context(input) {
110
- const env = environment();
111
- const [uid, pid] = await Promise.all([
112
- env.isCI ? null : userId(),
113
- projectId(),
114
- ]);
115
- return {
116
- userId: uid,
117
- projectId: pid,
118
- sessionId: input.sessionId,
119
- system: system(),
120
- runtime: runtime(),
121
- environment: env,
122
- alchemy: {
123
- version: pkg.version,
124
- phase: input.phase,
125
- },
126
- };
127
- }
128
- //# sourceMappingURL=context.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/util/telemetry/context.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- export * from "./client.ts";
2
- export * from "./types.ts";
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/util/telemetry/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
@@ -1,3 +0,0 @@
1
- export * from "./client.js";
2
- export * from "./types.js";
3
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/util/telemetry/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
@@ -1,68 +0,0 @@
1
- import type { Phase } from "../../alchemy.ts";
2
- export declare namespace Telemetry {
3
- interface Context {
4
- /** Random UUID generated once per machine and stored in XDG config directory (e.g. `~/Library/Preferences/alchemy` on Mac). Null for CI environments. */
5
- userId: string | null;
6
- /** Root commit hash for the git repository. Anonymous, stable identifier for anyone using git. */
7
- projectId: string | null;
8
- /** UUID generated once per application run. */
9
- sessionId: string;
10
- system: {
11
- platform: string;
12
- osVersion: string;
13
- arch: string;
14
- cpus: number;
15
- memory: number;
16
- };
17
- runtime: {
18
- name: string | null;
19
- version: string | null;
20
- };
21
- environment: {
22
- provider: string | null;
23
- isCI: boolean;
24
- };
25
- alchemy: {
26
- version: string;
27
- phase?: Phase;
28
- };
29
- }
30
- interface BaseEvent {
31
- event: string;
32
- timestamp: number;
33
- }
34
- interface SerializedError {
35
- name?: string;
36
- message: string;
37
- stack?: string;
38
- }
39
- type ErrorInput = Error | SerializedError;
40
- interface AppEvent extends BaseEvent {
41
- event: "app.start" | "app.success" | "app.error";
42
- elapsed?: number;
43
- error?: SerializedError;
44
- }
45
- interface ResourceEvent extends BaseEvent {
46
- event: "resource.start" | "resource.success" | "resource.error" | "resource.skip" | "resource.read";
47
- resource: string;
48
- status?: "creating" | "created" | "updating" | "updated" | "deleting" | "deleted";
49
- elapsed?: number;
50
- error?: SerializedError;
51
- replaced?: boolean;
52
- }
53
- interface CliEvent extends BaseEvent {
54
- event: "cli.start" | "cli.success" | "cli.error";
55
- command: string;
56
- }
57
- interface StateStoreEvent extends BaseEvent {
58
- event: "stateStore.init" | "stateStore.deinit" | "stateStore.list" | "stateStore.count" | "stateStore.get" | "stateStore.getBatch" | "stateStore.all" | "stateStore.set" | "stateStore.delete";
59
- stateStoreClass: string;
60
- elapsed?: number;
61
- error?: SerializedError;
62
- }
63
- type Event = AppEvent | ResourceEvent | StateStoreEvent | CliEvent;
64
- type EventInput = (Omit<AppEvent, "timestamp" | "error"> | Omit<ResourceEvent, "timestamp" | "error"> | Omit<StateStoreEvent, "timestamp" | "error"> | Omit<CliEvent, "timestamp" | "error">) & {
65
- error?: ErrorInput;
66
- };
67
- }
68
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/util/telemetry/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,yBAAiB,SAAS,CAAC;IACzB,UAAiB,OAAO;QACtB,yJAAyJ;QACzJ,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,kGAAkG;QAClG,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,+CAA+C;QAC/C,SAAS,EAAE,MAAM,CAAC;QAElB,MAAM,EAAE;YACN,QAAQ,EAAE,MAAM,CAAC;YACjB,SAAS,EAAE,MAAM,CAAC;YAClB,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,EAAE,MAAM,CAAC;YACb,MAAM,EAAE,MAAM,CAAC;SAChB,CAAC;QAEF,OAAO,EAAE;YACP,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;YACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;SACxB,CAAC;QAEF,WAAW,EAAE;YACX,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;YACxB,IAAI,EAAE,OAAO,CAAC;SACf,CAAC;QAEF,OAAO,EAAE;YACP,OAAO,EAAE,MAAM,CAAC;YAChB,KAAK,CAAC,EAAE,KAAK,CAAC;SACf,CAAC;KACH;IAED,UAAiB,SAAS;QACxB,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;KACnB;IAED,UAAiB,eAAe;QAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB;IAED,KAAY,UAAU,GAAG,KAAK,GAAG,eAAe,CAAC;IAEjD,UAAiB,QAAS,SAAQ,SAAS;QACzC,KAAK,EAAE,WAAW,GAAG,aAAa,GAAG,WAAW,CAAC;QACjD,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,eAAe,CAAC;KACzB;IAED,UAAiB,aAAc,SAAQ,SAAS;QAC9C,KAAK,EACD,gBAAgB,GAChB,kBAAkB,GAClB,gBAAgB,GAChB,eAAe,GACf,eAAe,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EACH,UAAU,GACV,SAAS,GACT,UAAU,GACV,SAAS,GACT,UAAU,GACV,SAAS,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,eAAe,CAAC;QACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB;IAED,UAAiB,QAAS,SAAQ,SAAS;QACzC,KAAK,EAAE,WAAW,GAAG,aAAa,GAAG,WAAW,CAAC;QACjD,OAAO,EAAE,MAAM,CAAC;KACjB;IAED,UAAiB,eAAgB,SAAQ,SAAS;QAChD,KAAK,EACD,iBAAiB,GACjB,mBAAmB,GACnB,iBAAiB,GACjB,kBAAkB,GAClB,gBAAgB,GAChB,qBAAqB,GACrB,gBAAgB,GAChB,gBAAgB,GAChB,mBAAmB,CAAC;QACxB,eAAe,EAAE,MAAM,CAAC;QACxB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,eAAe,CAAC;KACzB;IAED,KAAY,KAAK,GAAG,QAAQ,GAAG,aAAa,GAAG,eAAe,GAAG,QAAQ,CAAC;IAC1E,KAAY,UAAU,GAAG,CACrB,IAAI,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,GACrC,IAAI,CAAC,aAAa,EAAE,WAAW,GAAG,OAAO,CAAC,GAC1C,IAAI,CAAC,eAAe,EAAE,WAAW,GAAG,OAAO,CAAC,GAC5C,IAAI,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,CACxC,GAAG;QACF,KAAK,CAAC,EAAE,UAAU,CAAC;KACpB,CAAC;CACH"}
@@ -1 +0,0 @@
1
- //# sourceMappingURL=types.js.map
@@ -1,156 +0,0 @@
1
- import os from "node:os";
2
- import type { Phase } from "../../alchemy.ts";
3
- import {
4
- POSTHOG_CLIENT_API_HOST,
5
- POSTHOG_PROJECT_ID,
6
- TELEMETRY_DISABLED,
7
- } from "./constants.ts";
8
- import { context } from "./context.ts";
9
- import type { Telemetry } from "./types.ts";
10
-
11
- export interface TelemetryClientOptions {
12
- sessionId: string;
13
- phase?: Phase;
14
- enabled: boolean;
15
- quiet: boolean;
16
- }
17
-
18
- export interface ITelemetryClient {
19
- ready: Promise<unknown>;
20
- record(event: Telemetry.EventInput): void;
21
- finalize(): Promise<void>;
22
- }
23
-
24
- export class NoopTelemetryClient implements ITelemetryClient {
25
- ready = Promise.resolve();
26
- record(_: Telemetry.EventInput) {}
27
- finalize() {
28
- return Promise.resolve();
29
- }
30
- }
31
-
32
- export class TelemetryClient implements ITelemetryClient {
33
- private context: Promise<Telemetry.Context>;
34
- private events: Telemetry.Event[] = [];
35
-
36
- constructor(readonly options: TelemetryClientOptions) {
37
- this.context = context({
38
- sessionId: this.options.sessionId,
39
- phase: this.options.phase,
40
- });
41
- this.record({
42
- event: "app.start",
43
- });
44
- }
45
-
46
- get ready() {
47
- return this.context;
48
- }
49
-
50
- record(event: Telemetry.EventInput, timestamp = Date.now()) {
51
- const payload = {
52
- ...event,
53
- error: this.serializeError(event.error),
54
- timestamp,
55
- } as Telemetry.Event;
56
- this.events.push(payload);
57
- }
58
-
59
- private serializeError(
60
- error: Telemetry.ErrorInput | undefined,
61
- ): Telemetry.SerializedError | undefined {
62
- if (!error) {
63
- return undefined;
64
- }
65
- if (error instanceof Error) {
66
- return {
67
- ...error, // include additional properties from error object
68
- name: error.name,
69
- message: error.message?.replaceAll(os.homedir(), "~"), // redact home directory
70
- stack: error.stack?.replaceAll(os.homedir(), "~"),
71
- };
72
- }
73
- return error;
74
- }
75
-
76
- async finalize() {
77
- await this.send(this.events).catch((error) => {
78
- if (!this.options.quiet) {
79
- console.warn(error);
80
- }
81
- });
82
- }
83
-
84
- private async send(events: Telemetry.Event[]) {
85
- if (events.length === 0) {
86
- return;
87
- }
88
- const { userId, projectId, ...context } = await this.context;
89
- const safeProjectId = projectId ?? `temp_${userId}`;
90
- const groupResponse = await fetch(`${POSTHOG_CLIENT_API_HOST}/i/v0/e/`, {
91
- method: "POST",
92
- headers: {
93
- "Content-Type": "application/json",
94
- },
95
- body: JSON.stringify({
96
- api_key: POSTHOG_PROJECT_ID,
97
- event: "$groupidentify",
98
- distinct_id: "project-identify",
99
- properties: {
100
- $group_type: "project",
101
- $group_key: safeProjectId,
102
- },
103
- }),
104
- });
105
- if (!groupResponse.ok) {
106
- throw new Error(
107
- `Failed to send group identify: ${groupResponse.status} ${groupResponse.statusText} - ${await groupResponse.text()}`,
108
- );
109
- }
110
- const response = await fetch(`${POSTHOG_CLIENT_API_HOST}/batch`, {
111
- method: "POST",
112
- headers: {
113
- "Content-Type": "application/json",
114
- },
115
- body: JSON.stringify({
116
- api_key: POSTHOG_PROJECT_ID,
117
- historical_migration: false,
118
- batch: events.map(({ event, timestamp, ...properties }) => ({
119
- event,
120
- properties: {
121
- distinct_id: userId,
122
- ...context,
123
- ...properties,
124
- projectId: safeProjectId,
125
- $groups: { project: safeProjectId },
126
- },
127
- timestamp: new Date(timestamp).toISOString(),
128
- })),
129
- }),
130
- });
131
- if (!response.ok) {
132
- throw new Error(
133
- `Failed to send telemetry: ${response.status} ${response.statusText} - ${await response.text()}`,
134
- );
135
- }
136
- }
137
-
138
- static create({
139
- phase,
140
- enabled,
141
- quiet,
142
- }: Omit<TelemetryClientOptions, "sessionId">): ITelemetryClient {
143
- if (!enabled || TELEMETRY_DISABLED) {
144
- if (!quiet) {
145
- console.warn("[Alchemy] Telemetry is disabled.");
146
- }
147
- return new NoopTelemetryClient();
148
- }
149
- return new TelemetryClient({
150
- sessionId: crypto.randomUUID(),
151
- phase,
152
- enabled,
153
- quiet,
154
- });
155
- }
156
- }
@@ -1,13 +0,0 @@
1
- import envPaths from "env-paths";
2
-
3
- export const CONFIG_DIR = envPaths("alchemy", { suffix: "" }).config;
4
-
5
- export const TELEMETRY_DISABLED =
6
- !!process.env.ALCHEMY_TELEMETRY_DISABLED || !!process.env.DO_NOT_TRACK;
7
-
8
- // TODO(sam): replace with permanent URL
9
- export const POSTHOG_CLIENT_API_HOST =
10
- process.env.ALCHEMY_POSTHOG_CLIENT_API_HOST ?? "https://ph.alchemy.run";
11
- export const POSTHOG_PROJECT_ID =
12
- process.env.ALCHEMY_POSTHOG_PROJECT_ID ??
13
- "phc_A51Mi7Q63TvnNrvRMgvBxE1il0DAL66rVg4LdWPRsfK";
@@ -1,154 +0,0 @@
1
- import { exec } from "node:child_process";
2
- import { mkdir, readFile, writeFile } from "node:fs/promises";
3
- import os from "node:os";
4
- import { join } from "node:path";
5
- import pkg from "../../../package.json" with { type: "json" };
6
- import type { Phase } from "../../alchemy.ts";
7
- import { CONFIG_DIR } from "./constants.ts";
8
- import type { Telemetry } from "./types.ts";
9
-
10
- async function userId() {
11
- const path = join(CONFIG_DIR, "id");
12
-
13
- try {
14
- return (await readFile(path, "utf-8")).trim();
15
- } catch {}
16
-
17
- try {
18
- await mkdir(CONFIG_DIR, { recursive: true });
19
- } catch {}
20
-
21
- const id = crypto.randomUUID();
22
- try {
23
- await writeFile(path, id);
24
- console.warn(
25
- [
26
- "Attention: To help improve Alchemy, we now collect anonymous usage, performance, and error data.",
27
- "You can opt out by setting the ALCHEMY_TELEMETRY_DISABLED or DO_NOT_TRACK environment variable to a truthy value.",
28
- ].join("\n"),
29
- );
30
- } catch {
31
- return null;
32
- }
33
-
34
- return id;
35
- }
36
-
37
- function projectId() {
38
- return new Promise<string | null>((resolve) => {
39
- exec("git rev-list --max-parents=0 HEAD", (err, stdout) => {
40
- if (err) {
41
- resolve(null);
42
- return;
43
- }
44
- resolve(stdout.trim());
45
- });
46
- });
47
- }
48
-
49
- function system(): Telemetry.Context["system"] {
50
- return {
51
- platform: os.platform(),
52
- osVersion: os.release(),
53
- arch: os.arch(),
54
- cpus: os.cpus().length,
55
- memory: os.totalmem() / 1024 / 1024,
56
- };
57
- }
58
-
59
- declare global {
60
- var Deno:
61
- | {
62
- version: {
63
- deno: string;
64
- };
65
- }
66
- | undefined;
67
- var EdgeRuntime: Record<string, unknown> | undefined;
68
- }
69
-
70
- const RUNTIMES = [
71
- {
72
- name: "bun",
73
- detect: () => !!globalThis.Bun,
74
- version: () => globalThis.Bun?.version,
75
- },
76
- {
77
- name: "deno",
78
- detect: () => !!globalThis.Deno,
79
- version: () => globalThis.Deno?.version?.deno,
80
- },
81
- {
82
- name: "workerd",
83
- detect: () => !!globalThis.EdgeRuntime,
84
- version: () => null,
85
- },
86
- {
87
- name: "node",
88
- detect: () => !!globalThis.process?.versions?.node,
89
- version: () => process.versions.node,
90
- },
91
- ] as const;
92
-
93
- function runtime(): Telemetry.Context["runtime"] {
94
- for (const runtime of RUNTIMES) {
95
- if (runtime.detect()) {
96
- return {
97
- name: runtime.name,
98
- version: runtime.version() ?? null,
99
- };
100
- }
101
- }
102
- return {
103
- name: null,
104
- version: null,
105
- };
106
- }
107
-
108
- const PROVIDERS = [
109
- { env: "GITHUB_ACTIONS", provider: "GitHub Actions", isCI: true },
110
- { env: "GITLAB_CI", provider: "GitLab CI", isCI: true },
111
- { env: "CIRCLECI", provider: "CircleCI", isCI: true },
112
- { env: "JENKINS_URL", provider: "Jenkins", isCI: true },
113
- { env: "TRAVIS", provider: "Travis CI", isCI: true },
114
- { env: "NOW_BUILDER", provider: "Vercel", isCI: true },
115
- { env: "VERCEL", provider: "Vercel", isCI: false },
116
- ];
117
-
118
- function environment(): Telemetry.Context["environment"] {
119
- for (const provider of PROVIDERS) {
120
- if (process.env[provider.env]) {
121
- return {
122
- provider: provider.provider,
123
- isCI: provider.isCI,
124
- };
125
- }
126
- }
127
- return {
128
- provider: null,
129
- isCI: !!process.env.CI,
130
- };
131
- }
132
-
133
- export async function context(input: {
134
- sessionId: string;
135
- phase?: Phase;
136
- }): Promise<Telemetry.Context> {
137
- const env = environment();
138
- const [uid, pid] = await Promise.all([
139
- env.isCI ? null : userId(),
140
- projectId(),
141
- ]);
142
- return {
143
- userId: uid,
144
- projectId: pid,
145
- sessionId: input.sessionId,
146
- system: system(),
147
- runtime: runtime(),
148
- environment: env,
149
- alchemy: {
150
- version: pkg.version,
151
- phase: input.phase,
152
- },
153
- };
154
- }
@@ -1,2 +0,0 @@
1
- export * from "./client.ts";
2
- export * from "./types.ts";