alchemy 0.62.3 → 0.63.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 (594) hide show
  1. package/bin/alchemy.js +1516 -1202
  2. package/bin/commands/deploy.ts +2 -0
  3. package/bin/commands/dev.ts +2 -0
  4. package/bin/services/execute-alchemy.ts +11 -0
  5. package/bin/services/template-manager.ts +2 -0
  6. package/bin/types.ts +2 -1
  7. package/lib/alchemy.d.ts +6 -22
  8. package/lib/alchemy.d.ts.map +1 -1
  9. package/lib/alchemy.js +65 -169
  10. package/lib/alchemy.js.map +1 -1
  11. package/lib/apply.d.ts +0 -2
  12. package/lib/apply.d.ts.map +1 -1
  13. package/lib/apply.js +2 -16
  14. package/lib/apply.js.map +1 -1
  15. package/lib/aws/account-id.d.ts.map +1 -1
  16. package/lib/aws/account-id.js +3 -2
  17. package/lib/aws/account-id.js.map +1 -1
  18. package/lib/aws/bucket.d.ts +8 -2
  19. package/lib/aws/bucket.d.ts.map +1 -1
  20. package/lib/aws/bucket.js +21 -14
  21. package/lib/aws/bucket.js.map +1 -1
  22. package/lib/aws/ec2/security-group.d.ts +8 -2
  23. package/lib/aws/ec2/security-group.d.ts.map +1 -1
  24. package/lib/aws/ec2/security-group.js +7 -2
  25. package/lib/aws/ec2/security-group.js.map +1 -1
  26. package/lib/aws/function.d.ts +9 -3
  27. package/lib/aws/function.d.ts.map +1 -1
  28. package/lib/aws/function.js +35 -26
  29. package/lib/aws/function.js.map +1 -1
  30. package/lib/aws/policy-attachment.d.ts.map +1 -1
  31. package/lib/aws/policy-attachment.js +2 -1
  32. package/lib/aws/policy-attachment.js.map +1 -1
  33. package/lib/aws/policy.d.ts +8 -2
  34. package/lib/aws/policy.d.ts.map +1 -1
  35. package/lib/aws/policy.js +13 -4
  36. package/lib/aws/policy.js.map +1 -1
  37. package/lib/aws/queue.d.ts +8 -2
  38. package/lib/aws/queue.d.ts.map +1 -1
  39. package/lib/aws/queue.js +22 -14
  40. package/lib/aws/queue.js.map +1 -1
  41. package/lib/aws/role.d.ts +8 -2
  42. package/lib/aws/role.d.ts.map +1 -1
  43. package/lib/aws/role.js +10 -3
  44. package/lib/aws/role.js.map +1 -1
  45. package/lib/aws/ses.d.ts +1 -1
  46. package/lib/aws/ses.d.ts.map +1 -1
  47. package/lib/aws/ses.js +2 -1
  48. package/lib/aws/ses.js.map +1 -1
  49. package/lib/aws/ssm-parameter.d.ts +8 -2
  50. package/lib/aws/ssm-parameter.d.ts.map +1 -1
  51. package/lib/aws/ssm-parameter.js +15 -10
  52. package/lib/aws/ssm-parameter.js.map +1 -1
  53. package/lib/aws/table.d.ts +8 -2
  54. package/lib/aws/table.d.ts.map +1 -1
  55. package/lib/aws/table.js +17 -9
  56. package/lib/aws/table.js.map +1 -1
  57. package/lib/cloudflare/account-api-token.d.ts +2 -2
  58. package/lib/cloudflare/account-api-token.d.ts.map +1 -1
  59. package/lib/cloudflare/account-api-token.js +7 -6
  60. package/lib/cloudflare/account-api-token.js.map +1 -1
  61. package/lib/cloudflare/ai-gateway.d.ts +9 -4
  62. package/lib/cloudflare/ai-gateway.d.ts.map +1 -1
  63. package/lib/cloudflare/ai-gateway.js +20 -24
  64. package/lib/cloudflare/ai-gateway.js.map +1 -1
  65. package/lib/cloudflare/api-schema.d.ts +2 -2
  66. package/lib/cloudflare/api-schema.d.ts.map +1 -1
  67. package/lib/cloudflare/api-schema.js +6 -2
  68. package/lib/cloudflare/api-schema.js.map +1 -1
  69. package/lib/cloudflare/api-shield.d.ts +5 -1
  70. package/lib/cloudflare/api-shield.d.ts.map +1 -1
  71. package/lib/cloudflare/api-shield.js +6 -1
  72. package/lib/cloudflare/api-shield.js.map +1 -1
  73. package/lib/cloudflare/assets.d.ts +1 -1
  74. package/lib/cloudflare/assets.d.ts.map +1 -1
  75. package/lib/cloudflare/astro/astro.d.ts.map +1 -1
  76. package/lib/cloudflare/astro/astro.js +3 -1
  77. package/lib/cloudflare/astro/astro.js.map +1 -1
  78. package/lib/cloudflare/astro/plugin.d.ts +2 -1
  79. package/lib/cloudflare/astro/plugin.d.ts.map +1 -1
  80. package/lib/cloudflare/astro/plugin.js.map +1 -1
  81. package/lib/cloudflare/bindings.d.ts +2 -2
  82. package/lib/cloudflare/bindings.d.ts.map +1 -1
  83. package/lib/cloudflare/bound.d.ts +1 -1
  84. package/lib/cloudflare/bound.d.ts.map +1 -1
  85. package/lib/cloudflare/bucket.d.ts +120 -1
  86. package/lib/cloudflare/bucket.d.ts.map +1 -1
  87. package/lib/cloudflare/bucket.js +80 -2
  88. package/lib/cloudflare/bucket.js.map +1 -1
  89. package/lib/cloudflare/compatibility-date.gen.d.ts +1 -1
  90. package/lib/cloudflare/compatibility-date.gen.js +1 -1
  91. package/lib/cloudflare/container.d.ts +10 -4
  92. package/lib/cloudflare/container.d.ts.map +1 -1
  93. package/lib/cloudflare/container.js +12 -9
  94. package/lib/cloudflare/container.js.map +1 -1
  95. package/lib/cloudflare/custom-domain.js +2 -1
  96. package/lib/cloudflare/custom-domain.js.map +1 -1
  97. package/lib/cloudflare/d1-database.d.ts +1 -1
  98. package/lib/cloudflare/d1-database.d.ts.map +1 -1
  99. package/lib/cloudflare/d1-database.js +6 -2
  100. package/lib/cloudflare/d1-database.js.map +1 -1
  101. package/lib/cloudflare/dispatch-namespace.d.ts +2 -0
  102. package/lib/cloudflare/dispatch-namespace.d.ts.map +1 -1
  103. package/lib/cloudflare/dispatch-namespace.js +7 -5
  104. package/lib/cloudflare/dispatch-namespace.js.map +1 -1
  105. package/lib/cloudflare/hyperdrive.d.ts +7 -1
  106. package/lib/cloudflare/hyperdrive.d.ts.map +1 -1
  107. package/lib/cloudflare/hyperdrive.js +2 -1
  108. package/lib/cloudflare/hyperdrive.js.map +1 -1
  109. package/lib/cloudflare/kv-namespace.d.ts +3 -0
  110. package/lib/cloudflare/kv-namespace.d.ts.map +1 -1
  111. package/lib/cloudflare/kv-namespace.js +11 -2
  112. package/lib/cloudflare/kv-namespace.js.map +1 -1
  113. package/lib/cloudflare/miniflare/miniflare-worker-proxy.js +3 -1
  114. package/lib/cloudflare/miniflare/miniflare-worker-proxy.js.map +1 -1
  115. package/lib/cloudflare/miniflare/paths.d.ts +4 -0
  116. package/lib/cloudflare/miniflare/paths.d.ts.map +1 -1
  117. package/lib/cloudflare/miniflare/paths.js +11 -0
  118. package/lib/cloudflare/miniflare/paths.js.map +1 -1
  119. package/lib/cloudflare/pipeline.d.ts +14 -3
  120. package/lib/cloudflare/pipeline.d.ts.map +1 -1
  121. package/lib/cloudflare/pipeline.js +31 -2
  122. package/lib/cloudflare/pipeline.js.map +1 -1
  123. package/lib/cloudflare/queue-consumer.js +1 -1
  124. package/lib/cloudflare/queue-consumer.js.map +1 -1
  125. package/lib/cloudflare/queue.d.ts +4 -2
  126. package/lib/cloudflare/queue.d.ts.map +1 -1
  127. package/lib/cloudflare/queue.js +13 -9
  128. package/lib/cloudflare/queue.js.map +1 -1
  129. package/lib/cloudflare/react-router/plugin.d.ts +1 -1
  130. package/lib/cloudflare/react-router/plugin.d.ts.map +1 -1
  131. package/lib/cloudflare/react-router/react-router.d.ts.map +1 -1
  132. package/lib/cloudflare/react-router/react-router.js +32 -2
  133. package/lib/cloudflare/react-router/react-router.js.map +1 -1
  134. package/lib/cloudflare/redwood/plugin.d.ts +2 -1
  135. package/lib/cloudflare/redwood/plugin.d.ts.map +1 -1
  136. package/lib/cloudflare/redwood/plugin.js.map +1 -1
  137. package/lib/cloudflare/route.js +1 -1
  138. package/lib/cloudflare/route.js.map +1 -1
  139. package/lib/cloudflare/ruleset.d.ts +3 -1
  140. package/lib/cloudflare/ruleset.d.ts.map +1 -1
  141. package/lib/cloudflare/ruleset.js +3 -2
  142. package/lib/cloudflare/ruleset.js.map +1 -1
  143. package/lib/cloudflare/secret.d.ts +6 -23
  144. package/lib/cloudflare/secret.d.ts.map +1 -1
  145. package/lib/cloudflare/secret.js +8 -4
  146. package/lib/cloudflare/secret.js.map +1 -1
  147. package/lib/cloudflare/secrets-store.d.ts +1 -1
  148. package/lib/cloudflare/secrets-store.d.ts.map +1 -1
  149. package/lib/cloudflare/secrets-store.js +5 -2
  150. package/lib/cloudflare/secrets-store.js.map +1 -1
  151. package/lib/cloudflare/tunnel.d.ts +5 -1
  152. package/lib/cloudflare/tunnel.d.ts.map +1 -1
  153. package/lib/cloudflare/tunnel.js +5 -1
  154. package/lib/cloudflare/tunnel.js.map +1 -1
  155. package/lib/cloudflare/vectorize-index.d.ts +7 -1
  156. package/lib/cloudflare/vectorize-index.d.ts.map +1 -1
  157. package/lib/cloudflare/vectorize-index.js +5 -2
  158. package/lib/cloudflare/vectorize-index.js.map +1 -1
  159. package/lib/cloudflare/vite/plugin.d.ts +2 -1
  160. package/lib/cloudflare/vite/plugin.d.ts.map +1 -1
  161. package/lib/cloudflare/vite/plugin.js.map +1 -1
  162. package/lib/cloudflare/website.js +1 -1
  163. package/lib/cloudflare/website.js.map +1 -1
  164. package/lib/cloudflare/worker.d.ts +1 -1
  165. package/lib/cloudflare/worker.d.ts.map +1 -1
  166. package/lib/cloudflare/worker.js +12 -7
  167. package/lib/cloudflare/worker.js.map +1 -1
  168. package/lib/cloudflare/wrangler.json.d.ts +1 -1
  169. package/lib/cloudflare/wrangler.json.d.ts.map +1 -1
  170. package/lib/cloudflare/wrangler.json.js +5 -3
  171. package/lib/cloudflare/wrangler.json.js.map +1 -1
  172. package/lib/docker/container.d.ts +6 -0
  173. package/lib/docker/container.d.ts.map +1 -1
  174. package/lib/docker/container.js +5 -1
  175. package/lib/docker/container.js.map +1 -1
  176. package/lib/docker/network.d.ts +8 -2
  177. package/lib/docker/network.d.ts.map +1 -1
  178. package/lib/docker/network.js +7 -2
  179. package/lib/docker/network.js.map +1 -1
  180. package/lib/docker/volume.d.ts +8 -2
  181. package/lib/docker/volume.d.ts.map +1 -1
  182. package/lib/docker/volume.js +6 -4
  183. package/lib/docker/volume.js.map +1 -1
  184. package/lib/esbuild/bundle.d.ts +1 -1
  185. package/lib/fs/index.d.ts +0 -8
  186. package/lib/fs/index.d.ts.map +1 -1
  187. package/lib/fs/index.js +0 -8
  188. package/lib/fs/index.js.map +1 -1
  189. package/lib/github/client.d.ts +1 -1
  190. package/lib/github/client.d.ts.map +1 -1
  191. package/lib/github/client.js +2 -1
  192. package/lib/github/client.js.map +1 -1
  193. package/lib/github/repository-environment.d.ts +8 -2
  194. package/lib/github/repository-environment.d.ts.map +1 -1
  195. package/lib/github/repository-environment.js +16 -12
  196. package/lib/github/repository-environment.js.map +1 -1
  197. package/lib/neon/project.d.ts +7 -1
  198. package/lib/neon/project.d.ts.map +1 -1
  199. package/lib/neon/project.js +10 -6
  200. package/lib/neon/project.js.map +1 -1
  201. package/lib/planetscale/branch.d.ts +4 -2
  202. package/lib/planetscale/branch.d.ts.map +1 -1
  203. package/lib/planetscale/branch.js +18 -12
  204. package/lib/planetscale/branch.js.map +1 -1
  205. package/lib/planetscale/database.d.ts +8 -2
  206. package/lib/planetscale/database.d.ts.map +1 -1
  207. package/lib/planetscale/database.js +24 -16
  208. package/lib/planetscale/database.js.map +1 -1
  209. package/lib/planetscale/password.d.ts +8 -2
  210. package/lib/planetscale/password.d.ts.map +1 -1
  211. package/lib/planetscale/password.js +2 -2
  212. package/lib/planetscale/password.js.map +1 -1
  213. package/lib/resource.d.ts +0 -2
  214. package/lib/resource.d.ts.map +1 -1
  215. package/lib/resource.js +1 -9
  216. package/lib/resource.js.map +1 -1
  217. package/lib/scope.d.ts +9 -3
  218. package/lib/scope.d.ts.map +1 -1
  219. package/lib/scope.js +21 -34
  220. package/lib/scope.js.map +1 -1
  221. package/lib/sentry/client-key.d.ts +7 -1
  222. package/lib/sentry/client-key.d.ts.map +1 -1
  223. package/lib/sentry/client-key.js +45 -6
  224. package/lib/sentry/client-key.js.map +1 -1
  225. package/lib/sentry/project.d.ts +8 -2
  226. package/lib/sentry/project.d.ts.map +1 -1
  227. package/lib/sentry/project.js +35 -5
  228. package/lib/sentry/project.js.map +1 -1
  229. package/lib/sentry/team.d.ts +8 -2
  230. package/lib/sentry/team.d.ts.map +1 -1
  231. package/lib/sentry/team.js +36 -6
  232. package/lib/sentry/team.js.map +1 -1
  233. package/lib/serde.d.ts +0 -5
  234. package/lib/serde.d.ts.map +1 -1
  235. package/lib/serde.js +0 -28
  236. package/lib/serde.js.map +1 -1
  237. package/lib/state/d1-state-store.d.ts +1 -1
  238. package/lib/state/d1-state-store.d.ts.map +1 -1
  239. package/lib/state/d1-state-store.js +5 -5
  240. package/lib/state/d1-state-store.js.map +1 -1
  241. package/lib/state/sqlite-state-store.d.ts.map +1 -1
  242. package/lib/state/sqlite-state-store.js +7 -11
  243. package/lib/state/sqlite-state-store.js.map +1 -1
  244. package/lib/stripe/card.d.ts.map +1 -1
  245. package/lib/stripe/card.js +3 -2
  246. package/lib/stripe/card.js.map +1 -1
  247. package/lib/stripe/client.d.ts +2 -2
  248. package/lib/stripe/client.d.ts.map +1 -1
  249. package/lib/stripe/client.js +4 -3
  250. package/lib/stripe/client.js.map +1 -1
  251. package/lib/stripe/coupon.d.ts.map +1 -1
  252. package/lib/stripe/coupon.js +4 -3
  253. package/lib/stripe/coupon.js.map +1 -1
  254. package/lib/stripe/customer.js +2 -2
  255. package/lib/stripe/customer.js.map +1 -1
  256. package/lib/stripe/entitlements-feature.d.ts.map +1 -1
  257. package/lib/stripe/entitlements-feature.js +3 -2
  258. package/lib/stripe/entitlements-feature.js.map +1 -1
  259. package/lib/stripe/file.d.ts.map +1 -1
  260. package/lib/stripe/file.js +3 -2
  261. package/lib/stripe/file.js.map +1 -1
  262. package/lib/stripe/meter.js +2 -2
  263. package/lib/stripe/meter.js.map +1 -1
  264. package/lib/stripe/portal-configuration.d.ts.map +1 -1
  265. package/lib/stripe/portal-configuration.js +3 -2
  266. package/lib/stripe/portal-configuration.js.map +1 -1
  267. package/lib/stripe/price.d.ts.map +1 -1
  268. package/lib/stripe/price.js +3 -2
  269. package/lib/stripe/price.js.map +1 -1
  270. package/lib/stripe/product-feature.d.ts.map +1 -1
  271. package/lib/stripe/product-feature.js +3 -2
  272. package/lib/stripe/product-feature.js.map +1 -1
  273. package/lib/stripe/product.d.ts.map +1 -1
  274. package/lib/stripe/product.js +3 -2
  275. package/lib/stripe/product.js.map +1 -1
  276. package/lib/stripe/promotion-code.d.ts.map +1 -1
  277. package/lib/stripe/promotion-code.js +3 -2
  278. package/lib/stripe/promotion-code.js.map +1 -1
  279. package/lib/stripe/shipping-rate.d.ts.map +1 -1
  280. package/lib/stripe/shipping-rate.js +4 -3
  281. package/lib/stripe/shipping-rate.js.map +1 -1
  282. package/lib/stripe/tax-rate.d.ts.map +1 -1
  283. package/lib/stripe/tax-rate.js +3 -2
  284. package/lib/stripe/tax-rate.js.map +1 -1
  285. package/lib/stripe/webhook.d.ts.map +1 -1
  286. package/lib/stripe/webhook.js +4 -3
  287. package/lib/stripe/webhook.js.map +1 -1
  288. package/lib/test/vitest.d.ts.map +1 -1
  289. package/lib/test/vitest.js +1 -0
  290. package/lib/test/vitest.js.map +1 -1
  291. package/lib/upstash/redis.d.ts +8 -2
  292. package/lib/upstash/redis.d.ts.map +1 -1
  293. package/lib/upstash/redis.js +5 -4
  294. package/lib/upstash/redis.js.map +1 -1
  295. package/lib/util/ignore-matcher.d.ts.map +1 -1
  296. package/lib/util/ignore-matcher.js +3 -1
  297. package/lib/util/ignore-matcher.js.map +1 -1
  298. package/lib/util/peer.d.ts +10 -0
  299. package/lib/util/peer.d.ts.map +1 -0
  300. package/lib/util/peer.js +42 -0
  301. package/lib/util/peer.js.map +1 -0
  302. package/lib/vercel/project.d.ts +7 -1
  303. package/lib/vercel/project.d.ts.map +1 -1
  304. package/lib/vercel/project.js +28 -0
  305. package/lib/vercel/project.js.map +1 -1
  306. package/package.json +88 -74
  307. package/src/alchemy.ts +76 -222
  308. package/src/apply.ts +6 -19
  309. package/src/aws/account-id.ts +6 -3
  310. package/src/aws/bucket.ts +43 -32
  311. package/src/aws/ec2/security-group.ts +15 -3
  312. package/src/aws/function.ts +65 -39
  313. package/src/aws/policy-attachment.ts +10 -6
  314. package/src/aws/policy.ts +33 -15
  315. package/src/aws/queue.ts +50 -29
  316. package/src/aws/role.ts +37 -20
  317. package/src/aws/ses.ts +24 -20
  318. package/src/aws/ssm-parameter.ts +40 -20
  319. package/src/aws/table.ts +35 -17
  320. package/src/cloudflare/account-api-token.ts +9 -7
  321. package/src/cloudflare/ai-gateway.ts +37 -34
  322. package/src/cloudflare/api-schema.ts +33 -26
  323. package/src/cloudflare/api-shield.ts +15 -2
  324. package/src/cloudflare/astro/astro.ts +5 -1
  325. package/src/cloudflare/astro/plugin.ts +2 -1
  326. package/src/cloudflare/bindings.ts +2 -2
  327. package/src/cloudflare/bound.ts +1 -1
  328. package/src/cloudflare/bucket.ts +242 -3
  329. package/src/cloudflare/compatibility-date.gen.ts +1 -1
  330. package/src/cloudflare/container.ts +23 -12
  331. package/src/cloudflare/custom-domain.ts +2 -2
  332. package/src/cloudflare/d1-database.ts +10 -3
  333. package/src/cloudflare/dispatch-namespace.ts +10 -7
  334. package/src/cloudflare/hyperdrive.ts +13 -3
  335. package/src/cloudflare/kv-namespace.ts +25 -2
  336. package/src/cloudflare/miniflare/miniflare-worker-proxy.ts +3 -1
  337. package/src/cloudflare/miniflare/paths.ts +13 -0
  338. package/src/cloudflare/pipeline.ts +76 -28
  339. package/src/cloudflare/queue-consumer.ts +1 -1
  340. package/src/cloudflare/queue.ts +26 -14
  341. package/src/cloudflare/react-router/react-router.ts +28 -2
  342. package/src/cloudflare/redwood/plugin.ts +3 -2
  343. package/src/cloudflare/route.ts +1 -1
  344. package/src/cloudflare/ruleset.ts +7 -2
  345. package/src/cloudflare/secret.ts +20 -31
  346. package/src/cloudflare/secrets-store.ts +7 -3
  347. package/src/cloudflare/tunnel.ts +13 -2
  348. package/src/cloudflare/vectorize-index.ts +14 -3
  349. package/src/cloudflare/vite/plugin.ts +3 -2
  350. package/src/cloudflare/website.ts +1 -1
  351. package/src/cloudflare/worker.ts +35 -23
  352. package/src/cloudflare/wrangler.json.ts +7 -4
  353. package/src/docker/container.ts +13 -1
  354. package/src/docker/network.ts +18 -3
  355. package/src/docker/volume.ts +17 -6
  356. package/src/fs/index.ts +0 -8
  357. package/src/github/client.ts +6 -2
  358. package/src/github/repository-environment.ts +27 -13
  359. package/src/neon/project.ts +20 -6
  360. package/src/planetscale/branch.ts +24 -13
  361. package/src/planetscale/database.ts +38 -17
  362. package/src/planetscale/password.ts +10 -3
  363. package/src/resource.ts +1 -10
  364. package/src/scope.ts +29 -38
  365. package/src/sentry/client-key.ts +74 -6
  366. package/src/sentry/project.ts +59 -6
  367. package/src/sentry/team.ts +55 -7
  368. package/src/serde.ts +0 -44
  369. package/src/state/d1-state-store.ts +13 -6
  370. package/src/state/sqlite-state-store.ts +16 -17
  371. package/src/stripe/card.ts +5 -2
  372. package/src/stripe/client.ts +10 -3
  373. package/src/stripe/coupon.ts +4 -3
  374. package/src/stripe/customer.ts +2 -2
  375. package/src/stripe/entitlements-feature.ts +5 -2
  376. package/src/stripe/file.ts +3 -2
  377. package/src/stripe/meter.ts +2 -2
  378. package/src/stripe/portal-configuration.ts +5 -2
  379. package/src/stripe/price.ts +3 -2
  380. package/src/stripe/product-feature.ts +5 -2
  381. package/src/stripe/product.ts +3 -2
  382. package/src/stripe/promotion-code.ts +3 -2
  383. package/src/stripe/shipping-rate.ts +4 -3
  384. package/src/stripe/tax-rate.ts +3 -2
  385. package/src/stripe/webhook.ts +4 -3
  386. package/src/test/vitest.ts +1 -0
  387. package/src/upstash/redis.ts +15 -5
  388. package/src/util/ignore-matcher.ts +3 -1
  389. package/src/util/peer.ts +53 -0
  390. package/src/vercel/project.ts +46 -1
  391. package/templates/hono/README.md +19 -0
  392. package/templates/hono/_env +1 -0
  393. package/templates/hono/_env.example +1 -0
  394. package/templates/hono/_gitignore +34 -0
  395. package/templates/hono/alchemy.run.ts +22 -0
  396. package/templates/hono/package.json +18 -0
  397. package/templates/hono/src/index.ts +17 -0
  398. package/templates/hono/tsconfig.json +13 -0
  399. package/templates/hono/types/env.d.ts +16 -0
  400. package/templates/react-router/vite.config.ts +5 -3
  401. package/workers/cloudflare-state-store.js +69 -74
  402. package/workers/dofs-state-store.js +1 -1
  403. package/bin/bootstrap-s3.ts +0 -255
  404. package/lib/ai/ark.d.ts +0 -12
  405. package/lib/ai/ark.d.ts.map +0 -1
  406. package/lib/ai/ark.js +0 -87
  407. package/lib/ai/ark.js.map +0 -1
  408. package/lib/ai/astro-file.d.ts +0 -138
  409. package/lib/ai/astro-file.d.ts.map +0 -1
  410. package/lib/ai/astro-file.js +0 -158
  411. package/lib/ai/astro-file.js.map +0 -1
  412. package/lib/ai/client.d.ts +0 -51
  413. package/lib/ai/client.d.ts.map +0 -1
  414. package/lib/ai/client.js +0 -58
  415. package/lib/ai/client.js.map +0 -1
  416. package/lib/ai/css-file.d.ts +0 -132
  417. package/lib/ai/css-file.d.ts.map +0 -1
  418. package/lib/ai/css-file.js +0 -142
  419. package/lib/ai/css-file.js.map +0 -1
  420. package/lib/ai/data.d.ts +0 -152
  421. package/lib/ai/data.d.ts.map +0 -1
  422. package/lib/ai/data.js +0 -120
  423. package/lib/ai/data.js.map +0 -1
  424. package/lib/ai/document.d.ts +0 -208
  425. package/lib/ai/document.d.ts.map +0 -1
  426. package/lib/ai/document.js +0 -206
  427. package/lib/ai/document.js.map +0 -1
  428. package/lib/ai/html-file.d.ts +0 -129
  429. package/lib/ai/html-file.d.ts.map +0 -1
  430. package/lib/ai/html-file.js +0 -139
  431. package/lib/ai/html-file.js.map +0 -1
  432. package/lib/ai/index.d.ts +0 -11
  433. package/lib/ai/index.d.ts.map +0 -1
  434. package/lib/ai/index.js +0 -11
  435. package/lib/ai/index.js.map +0 -1
  436. package/lib/ai/json-file.d.ts +0 -161
  437. package/lib/ai/json-file.d.ts.map +0 -1
  438. package/lib/ai/json-file.js +0 -188
  439. package/lib/ai/json-file.js.map +0 -1
  440. package/lib/ai/typescript-file.d.ts +0 -140
  441. package/lib/ai/typescript-file.d.ts.map +0 -1
  442. package/lib/ai/typescript-file.js +0 -146
  443. package/lib/ai/typescript-file.js.map +0 -1
  444. package/lib/ai/vue-file.d.ts +0 -127
  445. package/lib/ai/vue-file.d.ts.map +0 -1
  446. package/lib/ai/vue-file.js +0 -137
  447. package/lib/ai/vue-file.js.map +0 -1
  448. package/lib/ai/yaml-file.d.ts +0 -170
  449. package/lib/ai/yaml-file.d.ts.map +0 -1
  450. package/lib/ai/yaml-file.js +0 -201
  451. package/lib/ai/yaml-file.js.map +0 -1
  452. package/lib/fs/static-astro-file.d.ts +0 -35
  453. package/lib/fs/static-astro-file.d.ts.map +0 -1
  454. package/lib/fs/static-astro-file.js +0 -40
  455. package/lib/fs/static-astro-file.js.map +0 -1
  456. package/lib/fs/static-css-file.d.ts +0 -25
  457. package/lib/fs/static-css-file.d.ts.map +0 -1
  458. package/lib/fs/static-css-file.js +0 -30
  459. package/lib/fs/static-css-file.js.map +0 -1
  460. package/lib/fs/static-html-file.d.ts +0 -32
  461. package/lib/fs/static-html-file.d.ts.map +0 -1
  462. package/lib/fs/static-html-file.js +0 -37
  463. package/lib/fs/static-html-file.js.map +0 -1
  464. package/lib/fs/static-json-file.d.ts +0 -18
  465. package/lib/fs/static-json-file.d.ts.map +0 -1
  466. package/lib/fs/static-json-file.js +0 -19
  467. package/lib/fs/static-json-file.js.map +0 -1
  468. package/lib/fs/static-text-file.d.ts +0 -13
  469. package/lib/fs/static-text-file.d.ts.map +0 -1
  470. package/lib/fs/static-text-file.js +0 -9
  471. package/lib/fs/static-text-file.js.map +0 -1
  472. package/lib/fs/static-typescript-file.d.ts +0 -20
  473. package/lib/fs/static-typescript-file.d.ts.map +0 -1
  474. package/lib/fs/static-typescript-file.js +0 -16
  475. package/lib/fs/static-typescript-file.js.map +0 -1
  476. package/lib/fs/static-vue-file.d.ts +0 -29
  477. package/lib/fs/static-vue-file.d.ts.map +0 -1
  478. package/lib/fs/static-vue-file.js +0 -34
  479. package/lib/fs/static-vue-file.js.map +0 -1
  480. package/lib/fs/static-yaml-file.d.ts +0 -23
  481. package/lib/fs/static-yaml-file.d.ts.map +0 -1
  482. package/lib/fs/static-yaml-file.js +0 -10
  483. package/lib/fs/static-yaml-file.js.map +0 -1
  484. package/lib/internal/docs/providers.d.ts +0 -34
  485. package/lib/internal/docs/providers.d.ts.map +0 -1
  486. package/lib/internal/docs/providers.js +0 -200
  487. package/lib/internal/docs/providers.js.map +0 -1
  488. package/lib/runtime/bind.d.ts +0 -25
  489. package/lib/runtime/bind.d.ts.map +0 -1
  490. package/lib/runtime/bind.js +0 -76
  491. package/lib/runtime/bind.js.map +0 -1
  492. package/lib/runtime/global.d.ts +0 -8
  493. package/lib/runtime/global.d.ts.map +0 -1
  494. package/lib/runtime/global.js +0 -3
  495. package/lib/runtime/global.js.map +0 -1
  496. package/lib/runtime/plugin.d.ts +0 -35
  497. package/lib/runtime/plugin.d.ts.map +0 -1
  498. package/lib/runtime/plugin.js +0 -134
  499. package/lib/runtime/plugin.js.map +0 -1
  500. package/lib/runtime/shims.d.ts +0 -6
  501. package/lib/runtime/shims.d.ts.map +0 -1
  502. package/lib/runtime/shims.js +0 -27
  503. package/lib/runtime/shims.js.map +0 -1
  504. package/lib/runtime/state.d.ts +0 -5
  505. package/lib/runtime/state.d.ts.map +0 -1
  506. package/lib/runtime/state.js +0 -4
  507. package/lib/runtime/state.js.map +0 -1
  508. package/lib/web/astro.d.ts +0 -148
  509. package/lib/web/astro.d.ts.map +0 -1
  510. package/lib/web/astro.js +0 -419
  511. package/lib/web/astro.js.map +0 -1
  512. package/lib/web/shadcn-component.d.ts +0 -30
  513. package/lib/web/shadcn-component.d.ts.map +0 -1
  514. package/lib/web/shadcn-component.js +0 -25
  515. package/lib/web/shadcn-component.js.map +0 -1
  516. package/lib/web/shadcn.d.ts +0 -98
  517. package/lib/web/shadcn.d.ts.map +0 -1
  518. package/lib/web/shadcn.js +0 -102
  519. package/lib/web/shadcn.js.map +0 -1
  520. package/lib/web/tailwind.d.ts +0 -65
  521. package/lib/web/tailwind.d.ts.map +0 -1
  522. package/lib/web/tailwind.js +0 -98
  523. package/lib/web/tailwind.js.map +0 -1
  524. package/lib/web/vite.d.ts +0 -96
  525. package/lib/web/vite.d.ts.map +0 -1
  526. package/lib/web/vite.js +0 -232
  527. package/lib/web/vite.js.map +0 -1
  528. package/lib/web/vitepress/config.d.ts +0 -12
  529. package/lib/web/vitepress/config.d.ts.map +0 -1
  530. package/lib/web/vitepress/config.js +0 -33
  531. package/lib/web/vitepress/config.js.map +0 -1
  532. package/lib/web/vitepress/custom-theme.d.ts +0 -174
  533. package/lib/web/vitepress/custom-theme.d.ts.map +0 -1
  534. package/lib/web/vitepress/custom-theme.js +0 -337
  535. package/lib/web/vitepress/custom-theme.js.map +0 -1
  536. package/lib/web/vitepress/dependencies.d.ts +0 -13
  537. package/lib/web/vitepress/dependencies.d.ts.map +0 -1
  538. package/lib/web/vitepress/dependencies.js +0 -37
  539. package/lib/web/vitepress/dependencies.js.map +0 -1
  540. package/lib/web/vitepress/home-page.d.ts +0 -247
  541. package/lib/web/vitepress/home-page.d.ts.map +0 -1
  542. package/lib/web/vitepress/home-page.js +0 -146
  543. package/lib/web/vitepress/home-page.js.map +0 -1
  544. package/lib/web/vitepress/index.d.ts +0 -6
  545. package/lib/web/vitepress/index.d.ts.map +0 -1
  546. package/lib/web/vitepress/index.js +0 -6
  547. package/lib/web/vitepress/index.js.map +0 -1
  548. package/lib/web/vitepress/process-front-matter-files.d.ts +0 -19
  549. package/lib/web/vitepress/process-front-matter-files.d.ts.map +0 -1
  550. package/lib/web/vitepress/process-front-matter-files.js +0 -73
  551. package/lib/web/vitepress/process-front-matter-files.js.map +0 -1
  552. package/lib/web/vitepress/vitepress.d.ts +0 -75
  553. package/lib/web/vitepress/vitepress.d.ts.map +0 -1
  554. package/lib/web/vitepress/vitepress.js +0 -254
  555. package/lib/web/vitepress/vitepress.js.map +0 -1
  556. package/src/ai/ark.ts +0 -118
  557. package/src/ai/astro-file.ts +0 -270
  558. package/src/ai/client.ts +0 -117
  559. package/src/ai/css-file.ts +0 -247
  560. package/src/ai/data.ts +0 -221
  561. package/src/ai/document.ts +0 -367
  562. package/src/ai/html-file.ts +0 -244
  563. package/src/ai/index.ts +0 -10
  564. package/src/ai/json-file.ts +0 -325
  565. package/src/ai/typescript-file.ts +0 -259
  566. package/src/ai/vue-file.ts +0 -242
  567. package/src/ai/yaml-file.ts +0 -328
  568. package/src/fs/static-astro-file.ts +0 -45
  569. package/src/fs/static-css-file.ts +0 -35
  570. package/src/fs/static-html-file.ts +0 -42
  571. package/src/fs/static-json-file.ts +0 -38
  572. package/src/fs/static-text-file.ts +0 -23
  573. package/src/fs/static-typescript-file.ts +0 -37
  574. package/src/fs/static-vue-file.ts +0 -39
  575. package/src/fs/static-yaml-file.ts +0 -33
  576. package/src/internal/docs/providers.ts +0 -286
  577. package/src/runtime/bind.ts +0 -95
  578. package/src/runtime/global.ts +0 -10
  579. package/src/runtime/plugin.ts +0 -163
  580. package/src/runtime/shims.js +0 -34
  581. package/src/runtime/state.ts +0 -9
  582. package/src/web/astro.ts +0 -643
  583. package/src/web/shadcn-component.ts +0 -72
  584. package/src/web/shadcn.ts +0 -221
  585. package/src/web/tailwind.ts +0 -167
  586. package/src/web/vite.ts +0 -407
  587. package/src/web/vitepress/config.ts +0 -50
  588. package/src/web/vitepress/custom-theme.ts +0 -514
  589. package/src/web/vitepress/dependencies.ts +0 -69
  590. package/src/web/vitepress/home-page.ts +0 -378
  591. package/src/web/vitepress/index.ts +0 -5
  592. package/src/web/vitepress/process-front-matter-files.ts +0 -107
  593. package/src/web/vitepress/vitepress.ts +0 -372
  594. package/templates/sveltekit/bun.lock +0 -1099
@@ -24,7 +24,7 @@ export interface BucketProps extends CloudflareApiOptions {
24
24
  * Names can only contain lowercase letters (a-z), numbers (0-9), and hyphens (-)
25
25
  * Cannot begin or end with a hyphen
26
26
  *
27
- * @default - the id of the resource
27
+ * @default ${app.name}-${app.stage}-${id}
28
28
  */
29
29
  name?: string;
30
30
 
@@ -76,6 +76,16 @@ export interface BucketProps extends CloudflareApiOptions {
76
76
  */
77
77
  cors?: R2BucketCORSRule[];
78
78
 
79
+ /**
80
+ * Lifecycle rules for the bucket
81
+ */
82
+ lifecycle?: R2BucketLifecycleRule[];
83
+
84
+ /**
85
+ * Lock rules for the bucket
86
+ */
87
+ lock?: R2BucketLockRule[];
88
+
79
89
  /**
80
90
  * Whether to emulate the bucket locally when Alchemy is running in watch mode.
81
91
  */
@@ -94,6 +104,102 @@ export interface BucketProps extends CloudflareApiOptions {
94
104
  };
95
105
  }
96
106
 
107
+ interface R2BucketLifecycleRule {
108
+ /**
109
+ * Unique identifier for this rule.
110
+ */
111
+ id?: string;
112
+
113
+ /**
114
+ * Conditions that apply to all transitions of this rule.
115
+ */
116
+ conditions?: {
117
+ /**
118
+ * Transitions will only apply to objects/uploads in the bucket that start with the given prefix, an empty prefix can be provided to scope rule to all objects/uploads.
119
+ */
120
+ prefix: string;
121
+ };
122
+
123
+ /**
124
+ * Whether or not this rule is in effect.
125
+ * @default true
126
+ */
127
+ enabled?: boolean;
128
+
129
+ /**
130
+ * Transition to abort ongoing multipart uploads.
131
+ */
132
+ abortMultipartUploadsTransition?: {
133
+ /**
134
+ * Condition for lifecycle transitions to apply after an object reaches an age in seconds.
135
+ */
136
+ condition: {
137
+ /**
138
+
139
+ /**
140
+ * Maximum age of the object in seconds.
141
+ */
142
+ maxAge: number;
143
+
144
+ /**
145
+ * Type of condition.
146
+ */
147
+ type: "Age";
148
+ };
149
+ };
150
+
151
+ /**
152
+ * Transition to delete objects.
153
+ */
154
+ deleteObjectsTransition?: {
155
+ /**
156
+ * Condition for lifecycle transitions to apply after an object reaches an age in seconds.
157
+ */
158
+ condition: { maxAge: number; type: "Age" } | { date: string; type: "Date" };
159
+ };
160
+
161
+ /**
162
+ * Transition to change the storage class of objects.
163
+ */
164
+ storageClassTransitions?: {
165
+ /**
166
+ * Condition for lifecycle transitions to apply after an object reaches an age in seconds.
167
+ */
168
+ condition: { maxAge: number; type: "Age" } | { date: string; type: "Date" };
169
+
170
+ /**
171
+ * Storage class for the bucket.
172
+ */
173
+ storageClass: "InfrequentAccess";
174
+ }[];
175
+ }
176
+
177
+ interface R2BucketLockRule {
178
+ /**
179
+ * Unique identifier for this rule.
180
+ */
181
+ id?: string;
182
+
183
+ /**
184
+ * Condition to apply a lock rule to an object for how long in seconds.
185
+ */
186
+ condition:
187
+ | { maxAgeSeconds: number; type: "Age" }
188
+ | { date: string; type: "Date" }
189
+ | { type: "Indefinite" };
190
+
191
+ /**
192
+ * Whether or not this rule is in effect.
193
+ * @default true
194
+ */
195
+ enabled?: boolean;
196
+
197
+ /**
198
+ * Rule will only apply to objects/uploads in the bucket that start with the given prefix, an empty prefix can be provided to scope rule to all objects/uploads.
199
+ */
200
+ prefix?: string;
201
+ }
202
+
97
203
  interface R2BucketCORSRule {
98
204
  /**
99
205
  * Identifier for this rule.
@@ -246,12 +352,19 @@ const _R2Bucket = Resource(
246
352
  id: string,
247
353
  props: BucketProps = {},
248
354
  ): Promise<R2Bucket> {
249
- const bucketName = props.name || id;
355
+ const bucketName =
356
+ props.name ?? this.output?.name ?? this.scope.createPhysicalName(id);
357
+
358
+ if (this.phase === "update" && this.output?.name !== bucketName) {
359
+ this.replace();
360
+ }
361
+
250
362
  const allowPublicAccess = props.allowPublicAccess === true;
251
363
  const dev = {
252
364
  id: this.output?.dev?.id ?? bucketName,
253
365
  remote: props.dev?.remote ?? false,
254
366
  };
367
+ const adopt = props.adopt ?? this.scope.adopt;
255
368
 
256
369
  if (this.scope.local && !props.dev?.remote) {
257
370
  return this({
@@ -289,7 +402,7 @@ const _R2Bucket = Resource(
289
402
  if (
290
403
  err instanceof CloudflareApiError &&
291
404
  err.status === 409 &&
292
- props.adopt
405
+ adopt
293
406
  ) {
294
407
  return await getBucket(api, bucketName, props);
295
408
  }
@@ -305,6 +418,12 @@ const _R2Bucket = Resource(
305
418
  if (props.cors?.length) {
306
419
  await putBucketCORS(api, bucketName, props);
307
420
  }
421
+ if (props.lifecycle?.length) {
422
+ await putBucketLifecycleRules(api, bucketName, props);
423
+ }
424
+ if (props.lock?.length) {
425
+ await putBucketLockRules(api, bucketName, props);
426
+ }
308
427
  return this({
309
428
  name: bucketName,
310
429
  location: bucket.location,
@@ -314,6 +433,8 @@ const _R2Bucket = Resource(
314
433
  domain,
315
434
  type: "r2_bucket",
316
435
  accountId: api.accountId,
436
+ lifecycle: props.lifecycle,
437
+ lock: props.lock,
317
438
  cors: props.cors,
318
439
  dev,
319
440
  });
@@ -335,11 +456,21 @@ const _R2Bucket = Resource(
335
456
  if (!isDeepStrictEqual(this.output.cors ?? [], props.cors ?? [])) {
336
457
  await putBucketCORS(api, bucketName, props);
337
458
  }
459
+ if (
460
+ !isDeepStrictEqual(this.output.lifecycle ?? [], props.lifecycle ?? [])
461
+ ) {
462
+ await putBucketLifecycleRules(api, bucketName, props);
463
+ }
464
+ if (!isDeepStrictEqual(this.output.lock ?? [], props.lock ?? [])) {
465
+ await putBucketLockRules(api, bucketName, props);
466
+ }
338
467
  return this({
339
468
  ...this.output,
340
469
  allowPublicAccess,
341
470
  dev,
342
471
  cors: props.cors,
472
+ lifecycle: props.lifecycle,
473
+ lock: props.lock,
343
474
  domain,
344
475
  });
345
476
  }
@@ -628,3 +759,111 @@ export async function putBucketCORS(
628
759
  ),
629
760
  );
630
761
  }
762
+
763
+ export async function putBucketLifecycleRules(
764
+ api: CloudflareApi,
765
+ bucketName: string,
766
+ props: BucketProps,
767
+ ) {
768
+ const rulesBody = Array.isArray(props.lifecycle)
769
+ ? props.lifecycle.length === 0
770
+ ? { rules: [] }
771
+ : {
772
+ rules: props.lifecycle.map((rule) => ({
773
+ ...rule,
774
+ // Required by the API; empty prefix means all objects/uploads
775
+ conditions: rule.conditions ?? { prefix: "" },
776
+ // Required by the API
777
+ enabled: rule.enabled ?? true,
778
+ })),
779
+ }
780
+ : {};
781
+
782
+ await extractCloudflareResult(
783
+ `put R2 bucket lifecycle rules for "${bucketName}"`,
784
+ api.put(
785
+ `/accounts/${api.accountId}/r2/buckets/${bucketName}/lifecycle`,
786
+ rulesBody,
787
+ { headers: withJurisdiction(props) },
788
+ ),
789
+ );
790
+ }
791
+
792
+ /**
793
+ * Get lifecycle rules for a bucket
794
+ */
795
+ export async function getBucketLifecycleRules(
796
+ api: CloudflareApi,
797
+ bucketName: string,
798
+ props: BucketProps = {},
799
+ ): Promise<R2BucketLifecycleRule[]> {
800
+ const res = await api.get(
801
+ `/accounts/${api.accountId}/r2/buckets/${bucketName}/lifecycle`,
802
+ { headers: withJurisdiction(props) },
803
+ );
804
+ const json: any = await res.json();
805
+ if (!json?.success) {
806
+ throw new CloudflareApiError(
807
+ `Failed to get R2 bucket lifecycle rules for "${bucketName}": ${res.status} ${res.statusText}`,
808
+ res,
809
+ json?.errors,
810
+ );
811
+ }
812
+ const rules: any[] = Array.isArray(json.result)
813
+ ? json.result
814
+ : (json.result?.rules ?? []);
815
+ return rules as R2BucketLifecycleRule[];
816
+ }
817
+
818
+ export async function putBucketLockRules(
819
+ api: CloudflareApi,
820
+ bucketName: string,
821
+ props: BucketProps,
822
+ ) {
823
+ const rulesBody = Array.isArray(props.lock)
824
+ ? props.lock.length === 0
825
+ ? { rules: [] }
826
+ : {
827
+ rules: props.lock.map((rule) => ({
828
+ ...rule,
829
+ // Required by the API
830
+ enabled: rule.enabled ?? true,
831
+ })),
832
+ }
833
+ : {};
834
+
835
+ await extractCloudflareResult(
836
+ `put R2 bucket lock rules for "${bucketName}"`,
837
+ api.put(
838
+ `/accounts/${api.accountId}/r2/buckets/${bucketName}/lock`,
839
+ rulesBody,
840
+ { headers: withJurisdiction(props) },
841
+ ),
842
+ );
843
+ }
844
+
845
+ /**
846
+ * Get lock rules for a bucket
847
+ */
848
+ export async function getBucketLockRules(
849
+ api: CloudflareApi,
850
+ bucketName: string,
851
+ props: BucketProps = {},
852
+ ): Promise<R2BucketLockRule[]> {
853
+ const res = await api.get(
854
+ `/accounts/${api.accountId}/r2/buckets/${bucketName}/lock`,
855
+ { headers: withJurisdiction(props) },
856
+ );
857
+ const json: any = await res.json();
858
+ if (!json?.success) {
859
+ throw new CloudflareApiError(
860
+ `Failed to get R2 bucket lock rules for "${bucketName}": ${res.status} ${res.statusText}`,
861
+ res,
862
+ json?.errors,
863
+ );
864
+ }
865
+ const rules: any[] = Array.isArray(json.result)
866
+ ? json.result
867
+ : (json.result?.rules ?? []);
868
+ return rules as R2BucketLockRule[];
869
+ }
@@ -4,4 +4,4 @@
4
4
  /**
5
5
  * The default Cloudflare Workers compatibility date, set based on the latest workerd release at the time of build.
6
6
  */
7
- export const DEFAULT_COMPATIBILITY_DATE = "2025-08-16";
7
+ export const DEFAULT_COMPATIBILITY_DATE = "2025-08-23";
@@ -123,8 +123,12 @@ export type Container<T = any> = {
123
123
  /** Unique identifier for the container */
124
124
  id: string;
125
125
 
126
- /** Optional human-readable name for the container */
127
- name: string;
126
+ /**
127
+ * Optional human-readable name for the container
128
+ *
129
+ * @default ${app.name}-${app.stage}-${id}
130
+ */
131
+ name?: string;
128
132
 
129
133
  /** Class name used to identify the container in Worker bindings */
130
134
  className: string;
@@ -170,7 +174,8 @@ export async function Container<T>(
170
174
  id: string,
171
175
  props: ContainerProps,
172
176
  ): Promise<Container<T>> {
173
- const name = props.name ?? id;
177
+ const scope = Scope.current;
178
+ const name = props.name ?? scope.createPhysicalName(id);
174
179
  const tag =
175
180
  props.tag === undefined || props.tag === "latest"
176
181
  ? `latest-${Date.now()}`
@@ -191,7 +196,7 @@ export async function Container<T>(
191
196
  adopt: props.adopt,
192
197
  };
193
198
 
194
- const isDev = Scope.current.local && !props.dev?.remote;
199
+ const isDev = scope.local && !props.dev?.remote;
195
200
  if (isDev) {
196
201
  const image = await Image(id, {
197
202
  name: `cloudflare-dev/${name}`, // prefix used by Miniflare
@@ -291,8 +296,10 @@ export interface ContainerApplicationProps extends CloudflareApiOptions {
291
296
  /**
292
297
  * The name of the container application.
293
298
  * Must be unique within your Cloudflare account.
299
+ *
300
+ * @default ${app}-${stage}-${id}
294
301
  */
295
- name: string;
302
+ name?: string;
296
303
 
297
304
  /**
298
305
  * Scheduling policy that controls where and how containers are deployed.
@@ -501,16 +508,20 @@ export const ContainerApplication = Resource(
501
508
  "cloudflare::ContainerApplication",
502
509
  async function (
503
510
  this: Context<ContainerApplication, ContainerApplicationProps>,
504
- _id: string,
511
+ id: string,
505
512
  props: ContainerApplicationProps,
506
513
  ): Promise<ContainerApplication> {
514
+ const applicationName = props.name ?? this.scope.createPhysicalName(id);
515
+
507
516
  if (this.scope.local && props.dev) {
508
517
  return this({
509
518
  id: this.output?.id ?? "",
510
- name: props.name,
519
+ name: applicationName,
511
520
  });
512
521
  }
513
522
 
523
+ const adopt = props.adopt ?? this.scope.adopt;
524
+
514
525
  const api = await createCloudflareApi(props);
515
526
  if (this.phase === "delete") {
516
527
  if (this.output?.id) {
@@ -562,8 +573,8 @@ export const ContainerApplication = Resource(
562
573
  let application: ContainerApplicationData;
563
574
 
564
575
  try {
565
- application = await createContainerApplication(api, props.adopt, {
566
- name: props.name,
576
+ application = await createContainerApplication(api, adopt, {
577
+ name: applicationName,
567
578
  scheduling_policy: props.schedulingPolicy ?? "default",
568
579
  instances: props.instances ?? 1,
569
580
  max_instances: props.maxInstances ?? 1,
@@ -588,19 +599,19 @@ export const ContainerApplication = Resource(
588
599
  } catch (error) {
589
600
  // Check if this is an "already exists" error and adopt is enabled
590
601
  if (
591
- props.adopt &&
602
+ adopt &&
592
603
  error instanceof Error &&
593
604
  error.message.includes("already exists")
594
605
  ) {
595
606
  // Find the existing container application
596
607
  const existingApplication = await findContainerApplicationByName(
597
608
  api,
598
- props.name,
609
+ applicationName,
599
610
  );
600
611
 
601
612
  if (!existingApplication) {
602
613
  throw new Error(
603
- `Failed to find existing container application '${props.name}' for adoption`,
614
+ `Failed to find existing container application '${applicationName}' for adoption`,
604
615
  );
605
616
  }
606
617
 
@@ -198,7 +198,7 @@ async function ensureCustomDomain(
198
198
  ): Promise<CustomDomain> {
199
199
  const environment = props.environment || "production";
200
200
  const domainHostname = props.name;
201
-
201
+ const adopt = props.adopt ?? context.scope.adopt;
202
202
  // Check if domain binding already exists for this account
203
203
  const listResponse = await api.get(
204
204
  `/accounts/${api.accountId}/workers/domains`,
@@ -239,7 +239,7 @@ async function ensureCustomDomain(
239
239
 
240
240
  // Handle the case where domain already exists during create phase
241
241
  if (context.phase === "create" && bindingExists) {
242
- if (!props.adopt) {
242
+ if (!adopt) {
243
243
  throw new Error(
244
244
  `CustomDomain for ${domainHostname} already exists in zone ${props.zoneId}. ` +
245
245
  "Set adopt: true to take control of the existing domain binding.",
@@ -31,7 +31,7 @@ export interface D1DatabaseProps extends CloudflareApiOptions {
31
31
  /**
32
32
  * Name of the database
33
33
  *
34
- * @default id
34
+ * @default ${app}-${stage}-${id}
35
35
  */
36
36
  name?: string;
37
37
 
@@ -263,12 +263,19 @@ const _D1Database = Resource(
263
263
  id: string,
264
264
  props: D1DatabaseProps = {},
265
265
  ): Promise<D1Database> {
266
- const databaseName = props.name ?? id;
266
+ const databaseName =
267
+ props.name ?? this.output?.name ?? this.scope.createPhysicalName(id);
268
+
269
+ if (this.phase === "update" && this.output?.name !== databaseName) {
270
+ this.replace();
271
+ }
272
+
267
273
  const local = this.scope.local && !props.dev?.remote;
268
274
  const dev = {
269
275
  id: this.output?.dev?.id ?? this.output?.id ?? id,
270
276
  remote: props.dev?.remote ?? false,
271
277
  };
278
+ const adopt = props.adopt ?? this.scope.adopt;
272
279
 
273
280
  if (local) {
274
281
  if (props.migrationsFiles && props.migrationsFiles.length > 0) {
@@ -327,7 +334,7 @@ const _D1Database = Resource(
327
334
  } catch (error) {
328
335
  // Check if this is a "database already exists" error and adopt is enabled
329
336
  if (
330
- props.adopt &&
337
+ adopt &&
331
338
  error instanceof CloudflareApiError &&
332
339
  error.message.includes("already exists")
333
340
  ) {
@@ -14,6 +14,8 @@ import {
14
14
  export interface DispatchNamespaceProps extends CloudflareApiOptions {
15
15
  /**
16
16
  * Name of the namespace
17
+ *
18
+ * @default ${app}-${stage}-${id}
17
19
  */
18
20
  namespace?: string;
19
21
 
@@ -112,7 +114,11 @@ export const DispatchNamespace = Resource(
112
114
  // Create Cloudflare API client with automatic account discovery
113
115
  const api = await createCloudflareApi(props);
114
116
 
115
- const namespace = props.namespace ?? id;
117
+ const namespace =
118
+ props.namespace ??
119
+ this.output?.namespace ??
120
+ this.scope.createPhysicalName(id);
121
+ const adopt = props.adopt ?? this.scope.adopt;
116
122
 
117
123
  if (this.phase === "delete") {
118
124
  // For delete operations, we need to check if the namespace exists in the output
@@ -132,11 +138,8 @@ export const DispatchNamespace = Resource(
132
138
  : Date.now();
133
139
 
134
140
  if (this.phase === "update") {
135
- // Check that the namespace name hasn't changed
136
- if (this.output?.namespace && this.output.namespace !== namespace) {
137
- throw new Error(
138
- `Cannot update dispatch namespace name after creation. Namespace name is immutable. Before: ${this.output.namespace}, After: ${namespace}`,
139
- );
141
+ if (this.output.namespace !== namespace) {
142
+ this.replace();
140
143
  }
141
144
  // For updates, just refresh metadata
142
145
  } else {
@@ -150,7 +153,7 @@ export const DispatchNamespace = Resource(
150
153
  } catch (error) {
151
154
  // Check if this is a "namespace already exists" error and adopt is enabled
152
155
  if (
153
- props.adopt &&
156
+ adopt &&
154
157
  error instanceof CloudflareApiError &&
155
158
  error.status === 400 &&
156
159
  (error.message.includes("already exists") ||
@@ -136,8 +136,10 @@ export type HyperdriveOrigin =
136
136
  export interface HyperdriveProps extends CloudflareApiOptions {
137
137
  /**
138
138
  * Name of the Hyperdrive configuration
139
+ *
140
+ * @default ${app}-${stage}-${id}
139
141
  */
140
- name: string;
142
+ name?: string;
141
143
 
142
144
  /**
143
145
  * Database connection origin configuration
@@ -182,6 +184,11 @@ export interface Hyperdrive
182
184
  */
183
185
  id: string;
184
186
 
187
+ /**
188
+ * Name of the Hyperdrive configuration
189
+ */
190
+ name: string;
191
+
185
192
  /**
186
193
  * The Cloudflare-generated UUID of the hyperdrive
187
194
  */
@@ -311,7 +318,7 @@ export async function Hyperdrive(
311
318
  * @internal
312
319
  */
313
320
  interface InternalHyperdriveProps extends CloudflareApiOptions {
314
- name: string;
321
+ name?: string;
315
322
  hyperdriveId?: string;
316
323
  origin: HyperdriveOrigin;
317
324
  caching?: HyperdriveCaching;
@@ -331,11 +338,14 @@ const _Hyperdrive = Resource(
331
338
  ): Promise<Hyperdrive> {
332
339
  const hyperdriveId = props.hyperdriveId || this.output?.hyperdriveId;
333
340
 
341
+ const name =
342
+ props.name ?? this.output?.name ?? this.scope.createPhysicalName(id);
343
+
334
344
  if (this.scope.local) {
335
345
  return this({
336
346
  id,
337
347
  hyperdriveId: hyperdriveId || "",
338
- name: props.name,
348
+ name,
339
349
  origin: props.origin,
340
350
  caching: props.caching,
341
351
  mtls: props.mtls,
@@ -20,6 +20,8 @@ import { deleteMiniflareBinding } from "./miniflare/delete.ts";
20
20
  export interface KVNamespaceProps extends CloudflareApiOptions {
21
21
  /**
22
22
  * Title of the namespace
23
+ *
24
+ * @default ${app}-${stage}-${id}
23
25
  */
24
26
  title?: string;
25
27
 
@@ -209,7 +211,9 @@ const _KVNamespace = Resource(
209
211
  id: string,
210
212
  props: KVNamespaceProps,
211
213
  ): Promise<KVNamespace> {
212
- const title = props.title ?? id;
214
+ const title =
215
+ props.title ?? this.output?.title ?? this.scope.createPhysicalName(id);
216
+
213
217
  const local = this.scope.local && !props.dev?.remote;
214
218
  const dev = {
215
219
  id: this.output?.dev?.id ?? this.output?.namespaceId ?? id,
@@ -230,6 +234,10 @@ const _KVNamespace = Resource(
230
234
 
231
235
  const api = await createCloudflareApi(props);
232
236
 
237
+ if (this.phase === "update" && this.output?.title !== title) {
238
+ await renameKVNamespace(api, this.output.namespaceId, title);
239
+ }
240
+
233
241
  if (this.phase === "delete") {
234
242
  if (this.output.dev?.id) {
235
243
  await deleteMiniflareBinding("kv", this.output.dev.id);
@@ -289,7 +297,7 @@ export async function createKVNamespace(
289
297
  (error.errorData as CloudflareApiErrorPayload[]).some(
290
298
  (e) => e.code === 10014,
291
299
  ) &&
292
- props.adopt
300
+ (props.adopt ?? Scope.current.adopt)
293
301
  ) {
294
302
  const existingNamespace = await findKVNamespaceByTitle(api, props.title);
295
303
 
@@ -456,3 +464,18 @@ export async function findKVNamespaceByTitle(
456
464
  // No matching namespace found
457
465
  return null;
458
466
  }
467
+
468
+ export async function renameKVNamespace(
469
+ api: CloudflareApi,
470
+ namespaceId: string,
471
+ title: string,
472
+ ) {
473
+ const response = await api.put(
474
+ `/accounts/${api.accountId}/storage/kv/namespaces/${namespaceId}`,
475
+ { title },
476
+ );
477
+
478
+ if (!response.ok) {
479
+ await handleApiError(response, "update", "kv_namespace", namespaceId);
480
+ }
481
+ }
@@ -149,7 +149,9 @@ const writeMiniflareResponseToNode = (
149
149
  out: http.ServerResponse,
150
150
  ) => {
151
151
  out.statusCode = res.status;
152
- res.headers.forEach((value, key) => out.setHeader(key, value));
152
+ res.headers.forEach((value, key) => {
153
+ out.setHeader(key, value);
154
+ });
153
155
 
154
156
  if (res.body) {
155
157
  Readable.fromWeb(res.body).pipe(out, { end: true });
@@ -1,5 +1,15 @@
1
+ import { AsyncLocalStorage } from "node:async_hooks";
1
2
  import { existsSync, readlinkSync, statSync } from "node:fs";
2
3
 
4
+ const dynamicImportContext = new AsyncLocalStorage<boolean>();
5
+
6
+ /**
7
+ * Used to disable path validation during dynamic imports.
8
+ */
9
+ export const withSkipPathValidation = <T>(callback: () => T) => {
10
+ return dynamicImportContext.run(true, callback);
11
+ };
12
+
3
13
  export const DEFAULT_CONFIG_PATH = ".alchemy/local/wrangler.jsonc";
4
14
  export const DEFAULT_PERSIST_PATH = ".alchemy/miniflare/v3";
5
15
 
@@ -42,6 +52,9 @@ export const validatePersistPath = (
42
52
  const warned = new Set<string>();
43
53
 
44
54
  const warnOrThrow = (message: string, throws: boolean) => {
55
+ if (dynamicImportContext.getStore()) {
56
+ return;
57
+ }
45
58
  if (throws) {
46
59
  throw new Error(message);
47
60
  }