alchemy 0.45.6 → 0.46.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 (352) hide show
  1. package/README.md +2 -2
  2. package/bin/alchemy.mjs +19280 -15136
  3. package/bin/alchemy.ts +14 -56
  4. package/bin/commands/create.ts +307 -137
  5. package/bin/commands/deploy.ts +23 -0
  6. package/bin/commands/destroy.ts +19 -0
  7. package/bin/commands/dev.ts +21 -0
  8. package/bin/commands/login.ts +63 -0
  9. package/bin/commands/run.ts +29 -0
  10. package/bin/services/dependencies.ts +0 -5
  11. package/bin/services/execute-alchemy.ts +160 -0
  12. package/bin/services/git.ts +27 -0
  13. package/bin/services/github-workflow.ts +229 -0
  14. package/bin/services/package-manager.ts +51 -68
  15. package/bin/services/template-manager.ts +10 -21
  16. package/bin/trpc.ts +3 -0
  17. package/bin/types.ts +4 -2
  18. package/lib/apply.d.ts +2 -0
  19. package/lib/apply.d.ts.map +1 -1
  20. package/lib/apply.js +26 -8
  21. package/lib/apply.js.map +1 -1
  22. package/lib/build-date.d.ts +1 -1
  23. package/lib/build-date.js +1 -1
  24. package/lib/cloudflare/ai.d.ts +8 -4
  25. package/lib/cloudflare/ai.d.ts.map +1 -1
  26. package/lib/cloudflare/ai.js +6 -8
  27. package/lib/cloudflare/ai.js.map +1 -1
  28. package/lib/cloudflare/analytics-engine.d.ts +11 -7
  29. package/lib/cloudflare/analytics-engine.d.ts.map +1 -1
  30. package/lib/cloudflare/analytics-engine.js +11 -9
  31. package/lib/cloudflare/analytics-engine.js.map +1 -1
  32. package/lib/cloudflare/{types.d.ts → api-response.d.ts} +6 -1
  33. package/lib/cloudflare/api-response.d.ts.map +1 -0
  34. package/lib/cloudflare/api-response.js +38 -0
  35. package/lib/cloudflare/api-response.js.map +1 -0
  36. package/lib/cloudflare/api.d.ts +9 -5
  37. package/lib/cloudflare/api.d.ts.map +1 -1
  38. package/lib/cloudflare/api.js +6 -46
  39. package/lib/cloudflare/api.js.map +1 -1
  40. package/lib/cloudflare/auth.d.ts +16 -35
  41. package/lib/cloudflare/auth.d.ts.map +1 -1
  42. package/lib/cloudflare/auth.js +50 -129
  43. package/lib/cloudflare/auth.js.map +1 -1
  44. package/lib/cloudflare/browser-rendering.d.ts +12 -3
  45. package/lib/cloudflare/browser-rendering.d.ts.map +1 -1
  46. package/lib/cloudflare/browser-rendering.js +12 -2
  47. package/lib/cloudflare/browser-rendering.js.map +1 -1
  48. package/lib/cloudflare/bundle/fs.d.ts.map +1 -1
  49. package/lib/cloudflare/bundle/fs.js +3 -0
  50. package/lib/cloudflare/bundle/fs.js.map +1 -1
  51. package/lib/cloudflare/bundle/internal-worker-bundle.d.ts +6 -0
  52. package/lib/cloudflare/bundle/internal-worker-bundle.d.ts.map +1 -0
  53. package/lib/cloudflare/bundle/internal-worker-bundle.js +14 -0
  54. package/lib/cloudflare/bundle/internal-worker-bundle.js.map +1 -0
  55. package/lib/cloudflare/compatibility-presets.d.ts +22 -0
  56. package/lib/cloudflare/compatibility-presets.d.ts.map +1 -0
  57. package/lib/cloudflare/compatibility-presets.js +27 -0
  58. package/lib/cloudflare/compatibility-presets.js.map +1 -0
  59. package/lib/cloudflare/container.d.ts +5 -1
  60. package/lib/cloudflare/container.d.ts.map +1 -1
  61. package/lib/cloudflare/container.js +42 -2
  62. package/lib/cloudflare/container.js.map +1 -1
  63. package/lib/cloudflare/dispatch-namespace.d.ts +5 -0
  64. package/lib/cloudflare/dispatch-namespace.d.ts.map +1 -1
  65. package/lib/cloudflare/dispatch-namespace.js +8 -0
  66. package/lib/cloudflare/dispatch-namespace.js.map +1 -1
  67. package/lib/cloudflare/durable-object-namespace.d.ts +23 -15
  68. package/lib/cloudflare/durable-object-namespace.d.ts.map +1 -1
  69. package/lib/cloudflare/durable-object-namespace.js +22 -21
  70. package/lib/cloudflare/durable-object-namespace.js.map +1 -1
  71. package/lib/cloudflare/hyperdrive.d.ts +19 -5
  72. package/lib/cloudflare/hyperdrive.d.ts.map +1 -1
  73. package/lib/cloudflare/hyperdrive.js +14 -0
  74. package/lib/cloudflare/hyperdrive.js.map +1 -1
  75. package/lib/cloudflare/images.d.ts +27 -17
  76. package/lib/cloudflare/images.d.ts.map +1 -1
  77. package/lib/cloudflare/images.js +13 -8
  78. package/lib/cloudflare/images.js.map +1 -1
  79. package/lib/cloudflare/index.d.ts +1 -3
  80. package/lib/cloudflare/index.d.ts.map +1 -1
  81. package/lib/cloudflare/index.js +1 -3
  82. package/lib/cloudflare/index.js.map +1 -1
  83. package/lib/cloudflare/miniflare/miniflare.d.ts +3 -3
  84. package/lib/cloudflare/miniflare/miniflare.d.ts.map +1 -1
  85. package/lib/cloudflare/miniflare/miniflare.js +7 -7
  86. package/lib/cloudflare/miniflare/miniflare.js.map +1 -1
  87. package/lib/cloudflare/miniflare/{mixed-mode.d.ts → remote-binding-proxy.d.ts} +5 -5
  88. package/lib/cloudflare/miniflare/remote-binding-proxy.d.ts.map +1 -0
  89. package/lib/cloudflare/miniflare/{mixed-mode.js → remote-binding-proxy.js} +16 -52
  90. package/lib/cloudflare/miniflare/remote-binding-proxy.js.map +1 -0
  91. package/lib/cloudflare/oauth.d.ts +22 -0
  92. package/lib/cloudflare/oauth.d.ts.map +1 -0
  93. package/lib/cloudflare/oauth.js +213 -0
  94. package/lib/cloudflare/oauth.js.map +1 -0
  95. package/lib/cloudflare/state.d.ts +26 -0
  96. package/lib/cloudflare/state.d.ts.map +1 -0
  97. package/lib/cloudflare/state.js +14 -0
  98. package/lib/cloudflare/state.js.map +1 -0
  99. package/lib/cloudflare/user.d.ts +2 -2
  100. package/lib/cloudflare/user.d.ts.map +1 -1
  101. package/lib/cloudflare/user.js +24 -47
  102. package/lib/cloudflare/user.js.map +1 -1
  103. package/lib/cloudflare/vectorize-index.d.ts.map +1 -1
  104. package/lib/cloudflare/vectorize-index.js +5 -2
  105. package/lib/cloudflare/vectorize-index.js.map +1 -1
  106. package/lib/cloudflare/version-metadata.d.ts +15 -3
  107. package/lib/cloudflare/version-metadata.d.ts.map +1 -1
  108. package/lib/cloudflare/version-metadata.js +11 -2
  109. package/lib/cloudflare/version-metadata.js.map +1 -1
  110. package/lib/cloudflare/vite.d.ts.map +1 -1
  111. package/lib/cloudflare/vite.js +2 -1
  112. package/lib/cloudflare/vite.js.map +1 -1
  113. package/lib/cloudflare/worker-metadata.d.ts +13 -2
  114. package/lib/cloudflare/worker-metadata.d.ts.map +1 -1
  115. package/lib/cloudflare/worker-metadata.js +10 -15
  116. package/lib/cloudflare/worker-metadata.js.map +1 -1
  117. package/lib/cloudflare/worker-subdomain.d.ts +7 -0
  118. package/lib/cloudflare/worker-subdomain.d.ts.map +1 -1
  119. package/lib/cloudflare/worker-subdomain.js +17 -22
  120. package/lib/cloudflare/worker-subdomain.js.map +1 -1
  121. package/lib/cloudflare/{worker/tail.d.ts → worker-tail.d.ts} +2 -2
  122. package/lib/cloudflare/worker-tail.d.ts.map +1 -0
  123. package/lib/cloudflare/{worker/tail.js → worker-tail.js} +11 -9
  124. package/lib/cloudflare/worker-tail.js.map +1 -0
  125. package/lib/cloudflare/worker.d.ts +19 -8
  126. package/lib/cloudflare/worker.d.ts.map +1 -1
  127. package/lib/cloudflare/worker.js +35 -10
  128. package/lib/cloudflare/worker.js.map +1 -1
  129. package/lib/cloudflare/workflow.d.ts +22 -11
  130. package/lib/cloudflare/workflow.d.ts.map +1 -1
  131. package/lib/cloudflare/workflow.js +23 -18
  132. package/lib/cloudflare/workflow.js.map +1 -1
  133. package/lib/context.d.ts +2 -2
  134. package/lib/context.d.ts.map +1 -1
  135. package/lib/docker/api.d.ts.map +1 -1
  136. package/lib/docker/api.js +30 -8
  137. package/lib/docker/api.js.map +1 -1
  138. package/lib/fs/file-system-state-store.d.ts +5 -20
  139. package/lib/fs/file-system-state-store.d.ts.map +1 -1
  140. package/lib/fs/file-system-state-store.js +5 -121
  141. package/lib/fs/file-system-state-store.js.map +1 -1
  142. package/lib/fs/index.d.ts +0 -1
  143. package/lib/fs/index.d.ts.map +1 -1
  144. package/lib/fs/index.js +0 -1
  145. package/lib/fs/index.js.map +1 -1
  146. package/lib/llms.cloudflare.txt +6 -5
  147. package/lib/planetscale/password.js +1 -1
  148. package/lib/planetscale/password.js.map +1 -1
  149. package/lib/scope.d.ts.map +1 -1
  150. package/lib/scope.js +3 -6
  151. package/lib/scope.js.map +1 -1
  152. package/lib/state/cloudflare-state-store.d.ts +34 -0
  153. package/lib/state/cloudflare-state-store.d.ts.map +1 -0
  154. package/lib/state/cloudflare-state-store.js +116 -0
  155. package/lib/state/cloudflare-state-store.js.map +1 -0
  156. package/lib/state/d1-state-store.d.ts +15 -0
  157. package/lib/state/d1-state-store.d.ts.map +1 -0
  158. package/lib/{cloudflare → state}/d1-state-store.js +31 -27
  159. package/lib/state/d1-state-store.js.map +1 -0
  160. package/lib/{cloudflare/do-state-store/types.d.ts → state/dofs-state-store/api.d.ts} +1 -1
  161. package/lib/state/dofs-state-store/api.d.ts.map +1 -0
  162. package/lib/state/dofs-state-store/api.js +1 -0
  163. package/lib/state/dofs-state-store/api.js.map +1 -0
  164. package/lib/{cloudflare/do-state-store/store.d.ts → state/dofs-state-store/index.d.ts} +10 -5
  165. package/lib/state/dofs-state-store/index.d.ts.map +1 -0
  166. package/lib/{cloudflare/do-state-store/store.js → state/dofs-state-store/index.js} +15 -11
  167. package/lib/state/dofs-state-store/index.js.map +1 -0
  168. package/lib/{cloudflare/do-state-store/internal.d.ts → state/dofs-state-store/store.d.ts} +4 -5
  169. package/lib/state/dofs-state-store/store.d.ts.map +1 -0
  170. package/lib/{cloudflare/do-state-store/internal.js → state/dofs-state-store/store.js} +7 -22
  171. package/lib/state/dofs-state-store/store.js.map +1 -0
  172. package/lib/state/file-system-state-store.d.ts +21 -0
  173. package/lib/state/file-system-state-store.d.ts.map +1 -0
  174. package/lib/state/file-system-state-store.js +122 -0
  175. package/lib/state/file-system-state-store.js.map +1 -0
  176. package/lib/state/index.d.ts +7 -0
  177. package/lib/state/index.d.ts.map +1 -0
  178. package/lib/state/index.js +7 -0
  179. package/lib/state/index.js.map +1 -0
  180. package/lib/state/migrations.d.ts +2 -0
  181. package/lib/state/migrations.d.ts.map +1 -0
  182. package/lib/state/migrations.js +3 -0
  183. package/lib/state/migrations.js.map +1 -0
  184. package/lib/state/operations.d.ts +36 -0
  185. package/lib/state/operations.d.ts.map +1 -0
  186. package/lib/state/operations.js +126 -0
  187. package/lib/state/operations.js.map +1 -0
  188. package/lib/state/proxy.d.ts +53 -0
  189. package/lib/state/proxy.d.ts.map +1 -0
  190. package/lib/state/proxy.js +65 -0
  191. package/lib/state/proxy.js.map +1 -0
  192. package/lib/{cloudflare → state}/r2-rest-state-store.d.ts +3 -1
  193. package/lib/state/r2-rest-state-store.d.ts.map +1 -0
  194. package/lib/{cloudflare → state}/r2-rest-state-store.js +6 -4
  195. package/lib/state/r2-rest-state-store.js.map +1 -0
  196. package/lib/state/schema.d.ts.map +1 -0
  197. package/lib/state/schema.js.map +1 -0
  198. package/lib/{sqlite → state}/sqlite-state-store.d.ts +5 -3
  199. package/lib/state/sqlite-state-store.d.ts.map +1 -0
  200. package/lib/{sqlite → state}/sqlite-state-store.js +15 -6
  201. package/lib/state/sqlite-state-store.js.map +1 -0
  202. package/lib/test/vitest.d.ts.map +1 -1
  203. package/lib/test/vitest.js +3 -6
  204. package/lib/test/vitest.js.map +1 -1
  205. package/lib/util/detect-node-runtime.d.ts +3 -0
  206. package/lib/util/detect-node-runtime.d.ts.map +1 -0
  207. package/lib/util/detect-node-runtime.js +10 -0
  208. package/lib/util/detect-node-runtime.js.map +1 -0
  209. package/lib/util/detect-package-manager.d.ts +2 -2
  210. package/lib/util/detect-package-manager.d.ts.map +1 -1
  211. package/lib/util/detect-package-manager.js +15 -5
  212. package/lib/util/detect-package-manager.js.map +1 -1
  213. package/lib/util/http-server.d.ts.map +1 -0
  214. package/lib/{cloudflare/miniflare → util}/http-server.js +1 -1
  215. package/lib/util/http-server.js.map +1 -0
  216. package/lib/util/memoize.d.ts +1 -0
  217. package/lib/util/memoize.d.ts.map +1 -1
  218. package/lib/util/memoize.js +2 -8
  219. package/lib/util/memoize.js.map +1 -1
  220. package/lib/util/neverthrow.d.ts +16 -0
  221. package/lib/util/neverthrow.d.ts.map +1 -0
  222. package/lib/util/neverthrow.js +46 -0
  223. package/lib/util/neverthrow.js.map +1 -0
  224. package/package.json +18 -16
  225. package/src/apply.ts +31 -10
  226. package/src/build-date.ts +1 -1
  227. package/src/cloudflare/ai.ts +10 -5
  228. package/src/cloudflare/analytics-engine.ts +20 -11
  229. package/src/cloudflare/{types.ts → api-response.ts} +31 -0
  230. package/src/cloudflare/api.ts +18 -57
  231. package/src/cloudflare/auth.ts +79 -211
  232. package/src/cloudflare/browser-rendering.ts +16 -2
  233. package/src/cloudflare/bundle/fs.ts +5 -0
  234. package/src/cloudflare/bundle/internal-worker-bundle.ts +21 -0
  235. package/src/cloudflare/compatibility-presets.ts +34 -0
  236. package/src/cloudflare/container.ts +70 -3
  237. package/src/cloudflare/dispatch-namespace.ts +28 -0
  238. package/src/cloudflare/durable-object-namespace.ts +38 -27
  239. package/src/cloudflare/hyperdrive.ts +19 -5
  240. package/src/cloudflare/images.ts +32 -17
  241. package/src/cloudflare/index.ts +1 -3
  242. package/src/cloudflare/miniflare/miniflare.ts +10 -7
  243. package/src/cloudflare/miniflare/{mixed-mode.ts → remote-binding-proxy.ts} +25 -75
  244. package/src/cloudflare/oauth.ts +300 -0
  245. package/src/cloudflare/state.ts +35 -0
  246. package/src/cloudflare/user.ts +40 -73
  247. package/src/cloudflare/vectorize-index.ts +7 -2
  248. package/src/cloudflare/version-metadata.ts +19 -2
  249. package/src/cloudflare/vite.ts +2 -1
  250. package/src/cloudflare/worker-metadata.ts +18 -43
  251. package/src/cloudflare/worker-subdomain.ts +43 -37
  252. package/src/cloudflare/{worker/tail.ts → worker-tail.ts} +13 -10
  253. package/src/cloudflare/worker.ts +74 -23
  254. package/src/cloudflare/workflow.ts +38 -19
  255. package/src/context.ts +2 -2
  256. package/src/docker/api.ts +33 -8
  257. package/src/fs/file-system-state-store.ts +5 -148
  258. package/src/fs/index.ts +0 -1
  259. package/src/llms.cloudflare.txt +6 -5
  260. package/src/planetscale/password.ts +1 -1
  261. package/src/scope.ts +3 -6
  262. package/src/state/cloudflare-state-store.ts +170 -0
  263. package/src/state/d1-state-store.ts +102 -0
  264. package/src/{cloudflare/do-state-store/store.ts → state/dofs-state-store/index.ts} +20 -13
  265. package/src/{cloudflare/do-state-store/internal.ts → state/dofs-state-store/store.ts} +9 -27
  266. package/src/state/file-system-state-store.ts +149 -0
  267. package/src/state/index.ts +6 -0
  268. package/src/state/migrations.ts +9 -0
  269. package/src/state/operations.ts +152 -0
  270. package/src/state/proxy.ts +132 -0
  271. package/src/{cloudflare → state}/r2-rest-state-store.ts +11 -8
  272. package/src/{sqlite → state}/sqlite-state-store.ts +18 -10
  273. package/src/test/vitest.ts +8 -6
  274. package/src/util/detect-node-runtime.ts +12 -0
  275. package/src/util/detect-package-manager.ts +19 -6
  276. package/src/{cloudflare/miniflare → util}/http-server.ts +1 -1
  277. package/src/util/memoize.ts +2 -8
  278. package/src/util/neverthrow.ts +64 -0
  279. package/templates/astro/package.json +3 -3
  280. package/templates/nuxt/package.json +3 -3
  281. package/templates/react-router/package.json +3 -3
  282. package/templates/rwsdk/alchemy.run.ts +1 -1
  283. package/templates/rwsdk/package.json +3 -3
  284. package/templates/sveltekit/package.json +3 -3
  285. package/templates/tanstack-start/package.json +3 -3
  286. package/templates/typescript/package.json +3 -2
  287. package/templates/typescript/tsconfig.json +1 -0
  288. package/templates/vite/package.json +3 -3
  289. package/workers/cloudflare-state-store.js +5638 -0
  290. package/workers/cloudflare-state-store.ts +108 -0
  291. package/workers/{do-state-store.js → dofs-state-store.js} +4 -4
  292. package/workers/{do-state-store.ts → dofs-state-store.ts} +12 -8
  293. package/workers/{mixed-mode-proxy-worker.js → remote-binding-proxy.js} +3 -3
  294. package/workers/remote-binding-proxy.ts +45 -0
  295. package/lib/cloudflare/d1-state-store.d.ts +0 -10
  296. package/lib/cloudflare/d1-state-store.d.ts.map +0 -1
  297. package/lib/cloudflare/d1-state-store.js.map +0 -1
  298. package/lib/cloudflare/do-state-store/index.d.ts +0 -2
  299. package/lib/cloudflare/do-state-store/index.d.ts.map +0 -1
  300. package/lib/cloudflare/do-state-store/index.js +0 -2
  301. package/lib/cloudflare/do-state-store/index.js.map +0 -1
  302. package/lib/cloudflare/do-state-store/internal.d.ts.map +0 -1
  303. package/lib/cloudflare/do-state-store/internal.js.map +0 -1
  304. package/lib/cloudflare/do-state-store/store.d.ts.map +0 -1
  305. package/lib/cloudflare/do-state-store/store.js.map +0 -1
  306. package/lib/cloudflare/do-state-store/types.d.ts.map +0 -1
  307. package/lib/cloudflare/do-state-store/types.js +0 -1
  308. package/lib/cloudflare/do-state-store/types.js.map +0 -1
  309. package/lib/cloudflare/miniflare/http-server.d.ts.map +0 -1
  310. package/lib/cloudflare/miniflare/http-server.js.map +0 -1
  311. package/lib/cloudflare/miniflare/mixed-mode.d.ts.map +0 -1
  312. package/lib/cloudflare/miniflare/mixed-mode.js.map +0 -1
  313. package/lib/cloudflare/r2-rest-state-store.d.ts.map +0 -1
  314. package/lib/cloudflare/r2-rest-state-store.js.map +0 -1
  315. package/lib/cloudflare/types.d.ts.map +0 -1
  316. package/lib/cloudflare/types.js +0 -19
  317. package/lib/cloudflare/types.js.map +0 -1
  318. package/lib/cloudflare/worker/shared.d.ts +0 -4
  319. package/lib/cloudflare/worker/shared.d.ts.map +0 -1
  320. package/lib/cloudflare/worker/shared.js +0 -21
  321. package/lib/cloudflare/worker/shared.js.map +0 -1
  322. package/lib/cloudflare/worker/tail.d.ts.map +0 -1
  323. package/lib/cloudflare/worker/tail.js.map +0 -1
  324. package/lib/sqlite/base-sqlite-state-store.d.ts +0 -31
  325. package/lib/sqlite/base-sqlite-state-store.d.ts.map +0 -1
  326. package/lib/sqlite/base-sqlite-state-store.js +0 -124
  327. package/lib/sqlite/base-sqlite-state-store.js.map +0 -1
  328. package/lib/sqlite/index.d.ts +0 -2
  329. package/lib/sqlite/index.d.ts.map +0 -1
  330. package/lib/sqlite/index.js +0 -2
  331. package/lib/sqlite/index.js.map +0 -1
  332. package/lib/sqlite/schema.d.ts.map +0 -1
  333. package/lib/sqlite/schema.js.map +0 -1
  334. package/lib/sqlite/sqlite-state-store.d.ts.map +0 -1
  335. package/lib/sqlite/sqlite-state-store.js.map +0 -1
  336. package/src/cloudflare/d1-state-store.ts +0 -105
  337. package/src/cloudflare/do-state-store/index.ts +0 -1
  338. package/src/cloudflare/worker/shared.ts +0 -30
  339. package/src/sqlite/base-sqlite-state-store.ts +0 -199
  340. package/src/sqlite/index.ts +0 -1
  341. package/templates/typescript/src/worker.js +0 -5
  342. package/workers/mixed-mode-proxy-worker.ts +0 -46
  343. /package/drizzle/{0000_busy_mauler.sql → default/0000_busy_mauler.sql} +0 -0
  344. /package/drizzle/{0001_concerned_iceman.sql → default/0001_concerned_iceman.sql} +0 -0
  345. /package/drizzle/{meta → default/meta}/0000_snapshot.json +0 -0
  346. /package/drizzle/{meta → default/meta}/0001_snapshot.json +0 -0
  347. /package/drizzle/{meta → default/meta}/_journal.json +0 -0
  348. /package/lib/{sqlite → state}/schema.d.ts +0 -0
  349. /package/lib/{sqlite → state}/schema.js +0 -0
  350. /package/lib/{cloudflare/miniflare → util}/http-server.d.ts +0 -0
  351. /package/src/{cloudflare/do-state-store/types.ts → state/dofs-state-store/api.ts} +0 -0
  352. /package/src/{sqlite → state}/schema.ts +0 -0
@@ -0,0 +1,16 @@
1
+ import { ResultAsync } from "neverthrow";
2
+ export declare const ensure: <T, E>(result: ResultAsync<T, E>, finalizer: () => any) => ResultAsync<T, E>;
3
+ export declare const detached: <T, E>() => {
4
+ result: ResultAsync<T, E>;
5
+ ok: (value: T) => void;
6
+ err: (error: E) => void;
7
+ };
8
+ export declare const singleFlight: <Args extends any[], Value, Error>(fn: (...args: Args) => ResultAsync<Value, Error>) => (...args: Args) => ResultAsync<Value, Error>;
9
+ export declare class HTTPError extends Error {
10
+ readonly status: number;
11
+ constructor(message: string, status: number);
12
+ }
13
+ export declare const fetchResult: (url: string, init?: RequestInit) => ResultAsync<Response, HTTPError>;
14
+ export declare const fetchJSON: <T, E>(url: string, init?: RequestInit) => ResultAsync<T, HTTPError | E>;
15
+ export declare const decodeJSON: <T, E>(response: Response) => ResultAsync<T, HTTPError | E>;
16
+ //# sourceMappingURL=neverthrow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"neverthrow.d.ts","sourceRoot":"","sources":["../../src/util/neverthrow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,WAAW,EAAe,MAAM,YAAY,CAAC;AAG/D,eAAO,MAAM,MAAM,GAAI,CAAC,EAAE,CAAC,EACzB,QAAQ,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,EACzB,WAAW,MAAM,GAAG,sBAGrB,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,CAAC,EAAE,CAAC;;gBAIb,CAAC;iBACA,CAAC;CAEjB,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,IAAI,SAAS,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAC3D,IAAI,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,MAGxC,GAAG,MAAM,IAAI,KAAG,WAAW,CAAC,KAAK,EAAE,KAAK,CAYjD,CAAC;AAEF,qBAAa,SAAU,SAAQ,KAAK;aAGhB,MAAM,EAAE,MAAM;gBAD9B,OAAO,EAAE,MAAM,EACC,MAAM,EAAE,MAAM;CAIjC;AAGD,eAAO,MAAM,WAAW,GAAI,KAAK,MAAM,EAAE,OAAM,WAAgB,qCAK9D,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,CAAC,EAAE,CAAC,EAAE,KAAK,MAAM,EAAE,OAAM,WAAgB,kCAElE,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,CAAC,EAAE,CAAC,EAAE,UAAU,QAAQ,kCAKlD,CAAC"}
@@ -0,0 +1,46 @@
1
+ import { err, ok, ResultAsync } from "neverthrow";
2
+ import { promiseWithResolvers } from "./promise-with-resolvers.js";
3
+ export const ensure = (result, finalizer) => {
4
+ return result.andTee(finalizer).orTee(finalizer);
5
+ };
6
+ export const detached = () => {
7
+ const { promise, resolve } = promiseWithResolvers();
8
+ return {
9
+ result: new ResultAsync(promise),
10
+ ok: (value) => resolve(ok(value)),
11
+ err: (error) => resolve(err(error)),
12
+ };
13
+ };
14
+ export const singleFlight = (fn) => {
15
+ const results = new Map();
16
+ return (...args) => {
17
+ const key = JSON.stringify(args ?? []);
18
+ const cached = results.get(key);
19
+ if (cached) {
20
+ return cached;
21
+ }
22
+ const result = fn(...args);
23
+ results.set(key, result);
24
+ return ensure(result, () => {
25
+ results.delete(key);
26
+ });
27
+ };
28
+ };
29
+ export class HTTPError extends Error {
30
+ status;
31
+ constructor(message, status) {
32
+ super(message);
33
+ this.status = status;
34
+ }
35
+ }
36
+ // TODO: merge this with safe-fetch?
37
+ export const fetchResult = (url, init = {}) => {
38
+ return ResultAsync.fromPromise(fetch(url, init), () => new HTTPError(`Failed to ${init.method ?? "GET"} ${url}`, 0));
39
+ };
40
+ export const fetchJSON = (url, init = {}) => {
41
+ return fetchResult(url, init).andThen((decodeJSON));
42
+ };
43
+ export const decodeJSON = (response) => {
44
+ return ResultAsync.fromPromise(response.json(), () => new HTTPError("Failed to decode JSON", response.status)).andThen((json) => (response.ok ? ok(json) : err(json)));
45
+ };
46
+ //# sourceMappingURL=neverthrow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"neverthrow.js","sourceRoot":"","sources":["../../src/util/neverthrow.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,31 +1,31 @@
1
1
  {
2
2
  "name": "alchemy",
3
- "version": "0.45.6",
4
- "type": "module",
5
- "module": "./lib/index.js",
3
+ "version": "0.46.1",
6
4
  "license": "Apache-2.0",
5
+ "author": "Sam Goodwin <sam@alchemy.run>",
6
+ "homepage": "https://alchemy.run",
7
7
  "repository": {
8
8
  "type": "git",
9
9
  "url": "git+https://github.com/sam-goodwin/alchemy.git",
10
10
  "directory": "alchemy"
11
11
  },
12
+ "type": "module",
13
+ "module": "./lib/index.js",
14
+ "bin": {
15
+ "alchemy": "bin/alchemy.mjs"
16
+ },
12
17
  "scripts": {
13
18
  "build:cli": "bun ./scripts/bundle-cli.ts",
14
19
  "build:workers": "bun ./scripts/build-workers.ts",
15
20
  "build": "rm -rf ./*.tsbuildinfo && rm -rf ./lib && tsc -b && bun run build:cli && bun run build:workers",
16
- "db:generate": "drizzle-kit generate",
21
+ "drizzle:generate": "bun run scripts/drizzle-generate.ts",
17
22
  "docs:gen": "rm -rf ./docs && typedoc",
18
23
  "postbuild": "cpx 'src/**/*/types.d.ts' lib && cpx 'src/**/*.txt' lib",
19
24
  "publish:npm": "cp ../README.md . && bun run build && bun run build:cli && npm publish && rm README.md"
20
25
  },
21
- "bin": {
22
- "alchemy": "bin/alchemy.mjs"
23
- },
24
- "author": "Sam Goodwin <sam@alchemy.run>",
25
- "homepage": "https://alchemy.run",
26
26
  "files": [
27
27
  "bin",
28
- "drizzle",
28
+ "drizzle/default",
29
29
  "lib",
30
30
  "src",
31
31
  "templates",
@@ -112,9 +112,9 @@
112
112
  "bun": "./src/web/shadcn.ts",
113
113
  "import": "./lib/web/shadcn.js"
114
114
  },
115
- "./sqlite": {
116
- "bun": "./src/sqlite/index.ts",
117
- "import": "./lib/sqlite/index.js"
115
+ "./state": {
116
+ "bun": "./src/state/index.ts",
117
+ "import": "./lib/state/index.js"
118
118
  },
119
119
  "./web/astro": {
120
120
  "bun": "./src/web/astro.ts",
@@ -149,6 +149,8 @@
149
149
  "kleur": "^4.1.5",
150
150
  "libsodium-wrappers": "^0.7.15",
151
151
  "miniflare": "^4.20250617.4",
152
+ "neverthrow": "^8.2.0",
153
+ "open": "^10.1.2",
152
154
  "pathe": "^2.0.3",
153
155
  "turndown": "^7.0.0",
154
156
  "unenv": "2.0.0-rc.15",
@@ -174,10 +176,11 @@
174
176
  "arktype": "^2.0.0",
175
177
  "cloudflare": "^4.0.0",
176
178
  "drizzle-orm": "^0.44.2",
179
+ "execa": "^9.6.0",
177
180
  "hono": "^4.0.0",
178
181
  "prettier": "^3.0.0",
179
182
  "stripe": "^17.0.0",
180
- "zod": "^3.0.0"
183
+ "zod": "^4.0.5"
181
184
  },
182
185
  "devDependencies": {
183
186
  "@ai-sdk/anthropic": "^1.1.6",
@@ -206,7 +209,6 @@
206
209
  "cpx": "^1.5.0",
207
210
  "dofs": "^0.1.0",
208
211
  "drizzle-kit": "^0.31.4",
209
- "execa": "^9.6.0",
210
212
  "fs-extra": "^11.3.0",
211
213
  "globby": "^14.1.0",
212
214
  "libsodium-wrappers": "^0.7.15",
@@ -214,7 +216,7 @@
214
216
  "openpgp": "^6.1.0",
215
217
  "picocolors": "^1.1.1",
216
218
  "prettier": "^3.5.3",
217
- "trpc-cli": "^0.9.2",
219
+ "trpc-cli": "^0.10.0",
218
220
  "turndown": "^7.2.0",
219
221
  "typedoc": "^0.28.1",
220
222
  "typedoc-plugin-markdown": "^4.6.0",
package/src/apply.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { alchemy } from "./alchemy.ts";
2
2
  import { context } from "./context.ts";
3
+ import { destroy } from "./destroy.ts";
3
4
  import {
4
5
  PROVIDERS,
5
6
  ResourceFQN,
@@ -33,7 +34,14 @@ export function apply<Out extends Resource>(
33
34
  return _apply(resource, props, options);
34
35
  }
35
36
 
36
- export class ReplacedSignal extends Error {}
37
+ export class ReplacedSignal extends Error {
38
+ public force: boolean;
39
+
40
+ constructor(force?: boolean) {
41
+ super();
42
+ this.force = force ?? false;
43
+ }
44
+ }
37
45
 
38
46
  async function _apply<Out extends Resource>(
39
47
  resource: PendingResource<Out>,
@@ -165,7 +173,7 @@ async function _apply<Out extends Resource>(
165
173
  props: state.oldProps,
166
174
  state,
167
175
  isReplacement: false,
168
- replace: () => {
176
+ replace: async (force?: boolean) => {
169
177
  if (phase === "create") {
170
178
  throw new Error(
171
179
  `Resource ${resource[ResourceKind]} ${resource[ResourceFQN]} cannot be replaced in create phase.`,
@@ -177,8 +185,19 @@ async function _apply<Out extends Resource>(
177
185
  );
178
186
  }
179
187
 
188
+ if (force) {
189
+ await destroy(resource, {
190
+ quiet: scope.quiet,
191
+ strategy: "sequential",
192
+ replace: {
193
+ props: state.oldProps,
194
+ output: resource,
195
+ },
196
+ });
197
+ }
198
+
180
199
  isReplaced = true;
181
- throw new ReplacedSignal();
200
+ throw new ReplacedSignal(force);
182
201
  },
183
202
  });
184
203
 
@@ -227,13 +246,15 @@ async function _apply<Out extends Resource>(
227
246
  )(resource[ResourceID], props),
228
247
  );
229
248
 
230
- const pendingDeletions =
231
- (await scope.get<PendingDeletions>("pendingDeletions")) ?? [];
232
- pendingDeletions.push({
233
- resource: oldOutput,
234
- oldProps: state.oldProps,
235
- });
236
- await scope.set("pendingDeletions", pendingDeletions);
249
+ if (!error.force) {
250
+ const pendingDeletions =
251
+ (await scope.get<PendingDeletions>("pendingDeletions")) ?? [];
252
+ pendingDeletions.push({
253
+ resource: oldOutput,
254
+ oldProps: state.oldProps,
255
+ });
256
+ await scope.set("pendingDeletions", pendingDeletions);
257
+ }
237
258
  } else {
238
259
  throw error;
239
260
  }
package/src/build-date.ts CHANGED
@@ -5,4 +5,4 @@
5
5
  * The build date used as the default worker compatibility date.
6
6
  * This is set to the date when the package was built.
7
7
  */
8
- export const BUILD_DATE = "2025-07-12";
8
+ export const BUILD_DATE = "2025-07-15";
@@ -9,7 +9,7 @@
9
9
  * ```ts
10
10
  * import { Worker, Ai } from "alchemy/cloudflare";
11
11
  *
12
- * const ai = new Ai();
12
+ * const ai = Ai();
13
13
  *
14
14
  * await Worker("my-worker", {
15
15
  * name: "my-worker",
@@ -22,12 +22,17 @@
22
22
  *
23
23
  * @see https://developers.cloudflare.com/workers-ai/
24
24
  */
25
- export class Ai<Models extends AiModelListType = AiModelListType> {
26
- public readonly type = "ai";
25
+ export function Ai<Models extends AiModelListType = AiModelListType>() {
26
+ return {
27
+ type: "ai",
28
+ _phantom: undefined! as Models,
29
+ } as const;
30
+ }
27
31
 
32
+ export type Ai<Models extends AiModelListType = AiModelListType> = {
33
+ type: "ai";
28
34
  /**
29
35
  * @internal
30
36
  */
31
- ///@ts-ignore
32
37
  _phantom: Models;
33
- }
38
+ };
@@ -6,21 +6,30 @@ export interface AnalyticsEngineDatasetProps {
6
6
  dataset: string;
7
7
  }
8
8
 
9
+ export type AnalyticsEngineDataset = {
10
+ type: "analytics_engine";
11
+ id: string;
12
+ dataset: string;
13
+ };
14
+
9
15
  /**
16
+ * Creates a binding for an Analytics Engine dataset.
17
+ *
10
18
  * @example
19
+ * ```ts
11
20
  * // Create a binding for an Analytics Engine dataset
12
- * const dataset = new AnalyticsEngineDataset("ae-dataset", {
21
+ * const dataset = AnalyticsEngineDataset("ae-dataset", {
13
22
  * dataset: "WEATHER",
14
23
  * });
24
+ * ```
15
25
  */
16
- export class AnalyticsEngineDataset {
17
- public readonly type = "analytics_engine" as const;
18
- public readonly dataset: string;
19
-
20
- constructor(
21
- public readonly id: string,
22
- input: AnalyticsEngineDatasetProps,
23
- ) {
24
- this.dataset = input.dataset;
25
- }
26
+ export function AnalyticsEngineDataset(
27
+ id: string,
28
+ props: AnalyticsEngineDatasetProps,
29
+ ): AnalyticsEngineDataset {
30
+ return {
31
+ type: "analytics_engine",
32
+ id,
33
+ dataset: props.dataset,
34
+ };
26
35
  }
@@ -47,6 +47,11 @@ export interface CloudflareApiError {
47
47
  * Error message
48
48
  */
49
49
  message: string;
50
+
51
+ /**
52
+ * Error documentation URL
53
+ */
54
+ documentation_url?: string;
50
55
  }
51
56
 
52
57
  /**
@@ -68,3 +73,29 @@ export async function extractCloudflareError(
68
73
  return `HTTP ${response.status}: ${response.statusText}`;
69
74
  }
70
75
  }
76
+
77
+ export async function extractCloudflareResult<T>(
78
+ label: string,
79
+ promise: Promise<Response>,
80
+ ): Promise<T> {
81
+ const response = await promise.catch(() => {
82
+ throw new Error(`Failed to ${label}: Failed to fetch`);
83
+ });
84
+ const json = (await response.json().catch(() => {
85
+ throw new Error(
86
+ `Failed to ${label} (${response.status}): The API returned an invalid response`,
87
+ );
88
+ })) as CloudflareApiResponse<T>;
89
+ if (json.success) {
90
+ return json.result;
91
+ } else {
92
+ const error = new Error(
93
+ `Failed to ${label} (${response.status} ${response.statusText}):\n${json.errors.map((e) => `- [${e.code}] ${e.message}${e.documentation_url ? ` (${e.documentation_url})` : ""}`).join("\n")}`,
94
+ );
95
+ Error.captureStackTrace(error, extractCloudflareResult);
96
+ Object.assign(error, {
97
+ status: response.status,
98
+ });
99
+ throw error;
100
+ }
101
+ }
@@ -1,12 +1,12 @@
1
- import { alchemy } from "../alchemy.ts";
2
1
  import type { Secret } from "../secret.ts";
3
2
  import { withExponentialBackoff } from "../util/retry.ts";
4
3
  import { safeFetch } from "../util/safe-fetch.ts";
5
4
  import {
6
5
  getCloudflareAuthHeaders,
6
+ normalizeAuthOptions,
7
7
  type CloudflareAuthOptions,
8
8
  } from "./auth.ts";
9
- import { getCloudflareAccounts, getUserEmailFromApiKey } from "./user.ts";
9
+ import { getCloudflareAccountId } from "./user.ts";
10
10
 
11
11
  /**
12
12
  * Options for Cloudflare API requests
@@ -42,6 +42,12 @@ export interface CloudflareApiOptions {
42
42
  email?: string;
43
43
  }
44
44
 
45
+ /** Used to propagate normalized auth options from a parent resource to `createCloudflareApi` in a child resource */
46
+ export type InternalCloudflareApiOptions = CloudflareAuthOptions & {
47
+ baseUrl?: string;
48
+ accountId: string;
49
+ };
50
+
45
51
  /**
46
52
  * Creates a CloudflareApi instance with automatic account ID discovery if not provided
47
53
  *
@@ -49,44 +55,18 @@ export interface CloudflareApiOptions {
49
55
  * @returns Promise resolving to a CloudflareApi instance
50
56
  */
51
57
  export async function createCloudflareApi(
52
- options: Partial<CloudflareApiOptions> = {},
58
+ options: Partial<CloudflareApiOptions> | InternalCloudflareApiOptions = {},
53
59
  ): Promise<CloudflareApi> {
54
- const apiKey =
55
- options.apiKey ??
56
- (process.env.CLOUDFLARE_API_KEY
57
- ? alchemy.secret(process.env.CLOUDFLARE_API_KEY)
58
- : undefined);
59
- const apiToken =
60
- options.apiToken ??
61
- (process.env.CLOUDFLARE_API_TOKEN
62
- ? alchemy.secret(process.env.CLOUDFLARE_API_TOKEN)
63
- : undefined);
64
- let email = options.email ?? process.env.CLOUDFLARE_EMAIL;
65
- if (apiKey && !email) {
66
- email = await getUserEmailFromApiKey(apiKey.unencrypted);
67
- }
60
+ const authOptions = await normalizeAuthOptions(options);
68
61
  const accountId =
69
62
  options.accountId ??
70
63
  process.env.CLOUDFLARE_ACCOUNT_ID ??
71
64
  process.env.CF_ACCOUNT_ID ??
72
- (
73
- await getCloudflareAccounts({
74
- apiKey,
75
- apiToken,
76
- email,
77
- } as CloudflareAuthOptions)
78
- )[0]?.id;
79
- if (accountId === undefined) {
80
- throw new Error(
81
- "Either accountId or CLOUDFLARE_ACCOUNT_ID must be provided",
82
- );
83
- }
65
+ (await getCloudflareAccountId(authOptions));
84
66
  return new CloudflareApi({
85
67
  baseUrl: options.baseUrl,
86
68
  accountId,
87
- email,
88
- apiKey,
89
- apiToken,
69
+ authOptions,
90
70
  });
91
71
  }
92
72
 
@@ -96,9 +76,6 @@ export async function createCloudflareApi(
96
76
  export class CloudflareApi {
97
77
  public readonly accountId: string;
98
78
  public readonly baseUrl: string;
99
- public readonly apiKey: Secret | undefined;
100
- public readonly apiToken: Secret | undefined;
101
- public readonly email: string | undefined;
102
79
  public readonly authOptions: CloudflareAuthOptions;
103
80
 
104
81
  /**
@@ -108,30 +85,14 @@ export class CloudflareApi {
108
85
  *
109
86
  * @param options API options
110
87
  */
111
- constructor(
112
- options: CloudflareApiOptions & {
113
- accountId: string;
114
- },
115
- ) {
88
+ constructor(options: {
89
+ baseUrl?: string;
90
+ accountId: string;
91
+ authOptions: CloudflareAuthOptions;
92
+ }) {
116
93
  this.accountId = options.accountId;
117
94
  this.baseUrl = options.baseUrl ?? "https://api.cloudflare.com/client/v4";
118
- this.apiKey = options.apiKey;
119
- this.apiToken = options.apiToken;
120
- this.email = options.email;
121
-
122
- if (this.apiKey && this.apiToken) {
123
- throw new Error("'apiKey' and 'apiToken' cannot both be provided");
124
- } else if (this.apiKey && !this.email) {
125
- throw new Error("'email' must be provided if 'apiKey' is provided");
126
- }
127
- this.authOptions = this.apiKey
128
- ? {
129
- apiKey: this.apiKey,
130
- email: this.email!,
131
- }
132
- : {
133
- apiToken: this.apiToken,
134
- };
95
+ this.authOptions = options.authOptions;
135
96
  }
136
97
 
137
98
  /**