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
@@ -8,7 +8,7 @@ import { createCloudflareApi, type CloudflareApiOptions } from "./api.ts";
8
8
  import type { Bound } from "./bound.ts";
9
9
 
10
10
  /**
11
- * Origin configuration for a PostgreSQL database connection
11
+ * Origin configuration for a PostgreSQL or MySQL database connection
12
12
  */
13
13
  export interface HyperdriveOrigin {
14
14
  /**
@@ -29,7 +29,7 @@ export interface HyperdriveOrigin {
29
29
 
30
30
  /**
31
31
  * Database port
32
- * @default 5432
32
+ * @default 5432 for postgres, 3306 for mysql
33
33
  */
34
34
  port?: number;
35
35
 
@@ -37,7 +37,7 @@ export interface HyperdriveOrigin {
37
37
  * Connection scheme
38
38
  * @default "postgres"
39
39
  */
40
- scheme?: "postgres";
40
+ scheme?: "postgres" | "mysql";
41
41
 
42
42
  /**
43
43
  * Database user
@@ -72,7 +72,7 @@ export interface HyperdriveOriginWithAccess {
72
72
 
73
73
  /**
74
74
  * Database port
75
- * @default 5432
75
+ * @default 5432 for postgres, 3306 for mysql
76
76
  */
77
77
  port?: number;
78
78
 
@@ -80,7 +80,7 @@ export interface HyperdriveOriginWithAccess {
80
80
  * Connection scheme
81
81
  * @default "postgres"
82
82
  */
83
- scheme?: "postgres";
83
+ scheme?: "postgres" | "mysql";
84
84
 
85
85
  /**
86
86
  * Database user
@@ -200,6 +200,20 @@ export type Hyperdrive = HyperdriveResource & Bound<HyperdriveResource>;
200
200
  * });
201
201
  *
202
202
  * @example
203
+ * // Create a basic Hyperdrive connection to a MySQL database
204
+ * const mysqlHyperdrive = await Hyperdrive("my-mysql-db", {
205
+ * name: "my-mysql-db",
206
+ * origin: {
207
+ * database: "mydb",
208
+ * host: "mysql.example.com",
209
+ * password: alchemy.secret("your-password"),
210
+ * port: 3306,
211
+ * scheme: "mysql",
212
+ * user: "mysql_user"
213
+ * }
214
+ * });
215
+ *
216
+ * @example
203
217
  * // Create a Hyperdrive with caching disabled
204
218
  * const noCacheHyperdrive = await Hyperdrive("no-cache-db", {
205
219
  * name: "no-cache-db",
@@ -1,5 +1,25 @@
1
1
  /**
2
- * Cloudflare Images binding for image transformation and manipulation.
2
+ * Properties for creating an Images binding
3
+ */
4
+ export interface ImagesProps {
5
+ dev?: {
6
+ /**
7
+ * Whether to run the images binding remotely instead of locally
8
+ * @default false
9
+ */
10
+ remote?: boolean;
11
+ };
12
+ }
13
+
14
+ export type Images = {
15
+ type: "images";
16
+ dev?: {
17
+ remote?: boolean;
18
+ };
19
+ };
20
+
21
+ /**
22
+ * Creates a Cloudflare Images binding for image transformation and manipulation.
3
23
  *
4
24
  * Provides access to Cloudflare Images API for transforming, drawing, and outputting images
5
25
  * within Workers. The binding requires no configuration - just the binding name.
@@ -9,10 +29,11 @@
9
29
  * - For deployed Workers: image transforms must be enabled for the zone
10
30
  *
11
31
  * @example
32
+ * ```ts
12
33
  * // Create an Images binding and bind to a Worker:
13
34
  * import { Worker, Images } from "alchemy/cloudflare";
14
35
  *
15
- * const images = new Images();
36
+ * const images = Images();
16
37
  *
17
38
  * const worker = await Worker("image-processor", {
18
39
  * name: "image-processor",
@@ -21,8 +42,10 @@
21
42
  * IMAGES: images
22
43
  * }
23
44
  * });
45
+ * ```
24
46
  *
25
47
  * @example
48
+ * ```ts
26
49
  * // Runtime usage - Basic image transformation:
27
50
  * export default {
28
51
  * async fetch(request: Request, env: any): Promise<Response> {
@@ -36,8 +59,10 @@
36
59
  * return response.response();
37
60
  * }
38
61
  * };
62
+ * ```
39
63
  *
40
64
  * @example
65
+ * ```ts
41
66
  * // Runtime usage - Advanced transformations with overlays:
42
67
  * const watermark: ReadableStream = await fetchWatermark();
43
68
  * const image: ReadableStream = await fetchMainImage();
@@ -51,23 +76,13 @@
51
76
  * .output({ format: "image/avif" });
52
77
  *
53
78
  * return response.response();
79
+ * ```
54
80
  *
55
81
  * @see https://developers.cloudflare.com/images/transform-images/bindings/
56
82
  */
57
- export class Images {
58
- public readonly type = "images";
59
- public readonly dev?: {
60
- remote?: boolean;
83
+ export function Images(props?: ImagesProps): Images {
84
+ return {
85
+ type: "images",
86
+ dev: props?.dev,
61
87
  };
62
- constructor(props?: {
63
- dev?: {
64
- /**
65
- * Whether to run the images binding remotely instead of locally
66
- * @default false
67
- */
68
- remote?: boolean;
69
- };
70
- }) {
71
- this.dev = props?.dev;
72
- }
73
88
  }
@@ -18,10 +18,8 @@ export * from "./d1-clone.ts";
18
18
  export * from "./d1-database.ts";
19
19
  export * from "./d1-export.ts";
20
20
  export * from "./d1-import.ts";
21
- export * from "./d1-state-store.ts";
22
21
  export * from "./dispatch-namespace.ts";
23
22
  export * from "./dns-records.ts";
24
- export * from "./do-state-store/index.ts";
25
23
  export * from "./durable-object-namespace.ts";
26
24
  export * from "./email-address.ts";
27
25
  export * from "./email-catch-all.ts";
@@ -37,7 +35,6 @@ export * from "./permission-groups.ts";
37
35
  export * from "./pipeline.ts";
38
36
  export * from "./queue-consumer.ts";
39
37
  export * from "./queue.ts";
40
- export * from "./r2-rest-state-store.ts";
41
38
  export * from "./react-router.ts";
42
39
  export * from "./redirect-rule.ts";
43
40
  export * from "./redwood.ts";
@@ -45,6 +42,7 @@ export * from "./route.ts";
45
42
  export * from "./secret-key.ts";
46
43
  export * from "./secret.ts";
47
44
  export * from "./secrets-store.ts";
45
+ export * from "./state.ts";
48
46
  export * from "./sveltekit.ts";
49
47
  export * from "./tanstack-start.ts";
50
48
  export * from "./vectorize-index.ts";
@@ -7,24 +7,27 @@ import {
7
7
  } from "miniflare";
8
8
  import path from "node:path";
9
9
  import { findOpenPort } from "../../util/find-open-port.ts";
10
+ import { HTTPServer } from "../../util/http-server.ts";
10
11
  import { logger } from "../../util/logger.ts";
11
12
  import {
12
13
  promiseWithResolvers,
13
14
  type PromiseWithResolvers,
14
15
  } from "../../util/promise-with-resolvers.ts";
15
- import { HTTPServer } from "./http-server.ts";
16
16
  import {
17
17
  buildMiniflareWorkerOptions,
18
18
  buildRemoteBindings,
19
19
  type MiniflareWorkerOptions,
20
20
  } from "./miniflare-worker-options.ts";
21
- import { createMixedModeProxy, type MixedModeProxy } from "./mixed-mode.ts";
21
+ import {
22
+ createRemoteProxyWorker,
23
+ type RemoteBindingProxy,
24
+ } from "./remote-binding-proxy.ts";
22
25
 
23
26
  class MiniflareServer {
24
27
  miniflare?: Miniflare;
25
28
  workers = new Map<string, WorkerOptions>();
26
29
  servers = new Map<string, HTTPServer>();
27
- mixedModeProxies = new Map<string, MixedModeProxy>();
30
+ remoteBindingProxies = new Map<string, RemoteBindingProxy>();
28
31
 
29
32
  stream = new WritableStream<{
30
33
  worker: MiniflareWorkerOptions;
@@ -104,7 +107,7 @@ class MiniflareServer {
104
107
  await Promise.all([
105
108
  this.miniflare?.dispose(),
106
109
  ...Array.from(this.servers.values()).map((server) => server.stop()),
107
- ...Array.from(this.mixedModeProxies.values()).map((proxy) =>
110
+ ...Array.from(this.remoteBindingProxies.values()).map((proxy) =>
108
111
  proxy.server.stop(),
109
112
  ),
110
113
  ]);
@@ -120,7 +123,7 @@ class MiniflareServer {
120
123
  if (bindings.length === 0) {
121
124
  return undefined;
122
125
  }
123
- const existing = this.mixedModeProxies.get(worker.name);
126
+ const existing = this.remoteBindingProxies.get(worker.name);
124
127
  if (
125
128
  existing?.bindings.every((b) =>
126
129
  bindings.find((b2) => b2.name === b.name && b2.type === b.type),
@@ -128,11 +131,11 @@ class MiniflareServer {
128
131
  ) {
129
132
  return existing.connectionString;
130
133
  }
131
- const proxy = await createMixedModeProxy({
134
+ const proxy = await createRemoteProxyWorker({
132
135
  name: `mixed-mode-proxy-${crypto.randomUUID()}`,
133
136
  bindings,
134
137
  });
135
- this.mixedModeProxies.set(worker.name, proxy);
138
+ this.remoteBindingProxies.set(worker.name, proxy);
136
139
  return proxy.connectionString;
137
140
  }
138
141
 
@@ -1,10 +1,10 @@
1
1
  import type { RemoteProxyConnectionString } from "miniflare";
2
+ import { HTTPServer } from "../../util/http-server.ts";
3
+ import { extractCloudflareResult } from "../api-response.ts";
2
4
  import { createCloudflareApi, type CloudflareApi } from "../api.ts";
3
5
  import type { WorkerBindingSpec } from "../bindings.ts";
4
- import type { CloudflareApiResponse } from "../types.ts";
6
+ import { getInternalWorkerBundle } from "../bundle/internal-worker-bundle.ts";
5
7
  import type { WorkerMetadata } from "../worker-metadata.ts";
6
- import { getAccountSubdomain, getWorkerTemplate } from "../worker/shared.ts";
7
- import { HTTPServer } from "./http-server.ts";
8
8
 
9
9
  type WranglerSessionConfig =
10
10
  | {
@@ -22,41 +22,39 @@ interface WorkersPreviewSession {
22
22
  token: string;
23
23
  }
24
24
 
25
- export async function createMixedModeProxy(input: {
25
+ export async function createRemoteProxyWorker(input: {
26
26
  name: string;
27
27
  bindings: WorkerBindingSpec[];
28
28
  }) {
29
29
  const api = await createCloudflareApi();
30
- const script = await getWorkerTemplate("mixed-mode-proxy-worker");
30
+ const script = await getInternalWorkerBundle("remote-binding-proxy");
31
31
  const [token, subdomain] = await Promise.all([
32
32
  createWorkersPreviewToken(api, {
33
33
  name: input.name,
34
34
  metadata: {
35
- main_module: script.name,
35
+ main_module: script.file.name,
36
36
  compatibility_date: "2025-06-16",
37
37
  bindings: input.bindings,
38
38
  observability: {
39
39
  enabled: false,
40
40
  },
41
41
  },
42
- files: [script],
42
+ files: [script.file],
43
43
  session: {
44
44
  workers_dev: true,
45
45
  minimal_mode: true,
46
46
  },
47
47
  }),
48
- getAccountSubdomain(api),
48
+ import("../worker-subdomain.ts").then((m) => m.getAccountSubdomain(api)),
49
49
  ]);
50
- return new MixedModeProxy(
50
+ return new RemoteBindingProxy(
51
51
  `https://${input.name}.${subdomain}.workers.dev`,
52
52
  token,
53
53
  input.bindings,
54
54
  );
55
55
  }
56
56
 
57
- const DEBUG: boolean = false;
58
-
59
- export class MixedModeProxy {
57
+ export class RemoteBindingProxy {
60
58
  server: HTTPServer;
61
59
 
62
60
  constructor(
@@ -100,27 +98,6 @@ export class MixedModeProxy {
100
98
  responseHeaders.delete("transfer-encoding");
101
99
  responseHeaders.delete("content-encoding");
102
100
 
103
- if (DEBUG) {
104
- const clone = res.clone();
105
- console.log({
106
- request: {
107
- url: url.toString(),
108
- method: req.method,
109
- headers,
110
- body: req.body,
111
- },
112
- response: {
113
- status: res.status,
114
- headers: res.headers,
115
- body: await res.text(),
116
- },
117
- });
118
- return new Response(clone.body, {
119
- status: clone.status,
120
- headers: responseHeaders,
121
- });
122
- }
123
-
124
101
  return new Response(res.body, {
125
102
  status: res.status,
126
103
  headers: responseHeaders,
@@ -144,8 +121,9 @@ async function createWorkersPreviewToken(
144
121
  formData.append(file.name, file);
145
122
  }
146
123
  formData.append("wrangler-session-config", JSON.stringify(input.session));
147
- const res = await api
148
- .post(
124
+ const res = await extractCloudflareResult<{ preview_token: string }>(
125
+ "create workers preview token",
126
+ api.post(
149
127
  `/accounts/${api.accountId}/workers/scripts/${input.name}/edge-preview`,
150
128
  formData,
151
129
  {
@@ -153,13 +131,8 @@ async function createWorkersPreviewToken(
153
131
  "cf-preview-upload-config-token": session.token,
154
132
  },
155
133
  },
156
- )
157
- .then((res) =>
158
- parseCloudflareResponse<{ preview_token: string }>(
159
- res,
160
- "Failed to create workers preview token",
161
- ),
162
- );
134
+ ),
135
+ );
163
136
  // Fire and forget prewarm call
164
137
  // (see https://github.com/cloudflare/workers-sdk/blob/6c6afbd6072b96e78e67d3a863ed849c6aa49472/packages/wrangler/src/dev/create-worker-preview.ts#L338)
165
138
  void prewarm(session.prewarm, res.preview_token);
@@ -178,42 +151,19 @@ async function prewarm(url: string, previewToken: string) {
178
151
  }
179
152
 
180
153
  async function createWorkersPreviewSession(api: CloudflareApi) {
181
- const { exchange_url } = await api
182
- .get(`/accounts/${api.accountId}/workers/subdomain/edge-preview`)
183
- .then((res) =>
184
- parseCloudflareResponse<{
185
- exchange_url: string;
186
- token: string;
187
- }>(res, "Failed to create workers preview session"),
188
- );
189
- return await fetch(exchange_url).then((res) =>
190
- parseResponse<WorkersPreviewSession>(
191
- res,
192
- "Failed to create workers preview session",
193
- ),
154
+ const { exchange_url } = await extractCloudflareResult<{
155
+ exchange_url: string;
156
+ token: string;
157
+ }>(
158
+ "create workers preview session",
159
+ api.get(`/accounts/${api.accountId}/workers/subdomain/edge-preview`),
194
160
  );
195
- }
196
-
197
- async function parseResponse<T>(res: Response, message: string): Promise<T> {
161
+ const res = await fetch(exchange_url);
198
162
  if (!res.ok) {
199
- throw new Error(`${message} (${res.status} ${res.statusText})`);
200
- }
201
- const json: T = await res.json();
202
- return json;
203
- }
204
-
205
- async function parseCloudflareResponse<T>(
206
- res: Response,
207
- message: string,
208
- ): Promise<T> {
209
- const json: CloudflareApiResponse<T> = await res.json();
210
- if (!json.success) {
211
163
  throw new Error(
212
- `${message} (${res.status} ${res.statusText} - ${json.errors.map((e) => `${e.code}: ${e.message}`).join(", ")})`,
164
+ `Failed to create workers preview session: ${res.status} ${res.statusText}`,
213
165
  );
214
166
  }
215
- if (!json.result) {
216
- throw new Error(`${message} (${res.status} ${res.statusText})`);
217
- }
218
- return json.result;
167
+ const json: WorkersPreviewSession = await res.json();
168
+ return json;
219
169
  }