alchemy 0.62.3 → 0.63.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 (612) hide show
  1. package/bin/alchemy.js +1517 -1203
  2. package/bin/commands/deploy.ts +2 -0
  3. package/bin/commands/dev.ts +2 -0
  4. package/bin/commands/init.ts +1 -1
  5. package/bin/services/execute-alchemy.ts +11 -0
  6. package/bin/services/github-workflow.ts +2 -2
  7. package/bin/services/template-manager.ts +2 -0
  8. package/bin/types.ts +2 -1
  9. package/lib/alchemy.d.ts +6 -22
  10. package/lib/alchemy.d.ts.map +1 -1
  11. package/lib/alchemy.js +65 -169
  12. package/lib/alchemy.js.map +1 -1
  13. package/lib/apply.d.ts +0 -2
  14. package/lib/apply.d.ts.map +1 -1
  15. package/lib/apply.js +2 -16
  16. package/lib/apply.js.map +1 -1
  17. package/lib/aws/account-id.d.ts.map +1 -1
  18. package/lib/aws/account-id.js +3 -2
  19. package/lib/aws/account-id.js.map +1 -1
  20. package/lib/aws/bucket.d.ts +8 -2
  21. package/lib/aws/bucket.d.ts.map +1 -1
  22. package/lib/aws/bucket.js +21 -14
  23. package/lib/aws/bucket.js.map +1 -1
  24. package/lib/aws/ec2/security-group.d.ts +8 -2
  25. package/lib/aws/ec2/security-group.d.ts.map +1 -1
  26. package/lib/aws/ec2/security-group.js +7 -2
  27. package/lib/aws/ec2/security-group.js.map +1 -1
  28. package/lib/aws/function.d.ts +9 -3
  29. package/lib/aws/function.d.ts.map +1 -1
  30. package/lib/aws/function.js +35 -26
  31. package/lib/aws/function.js.map +1 -1
  32. package/lib/aws/policy-attachment.d.ts.map +1 -1
  33. package/lib/aws/policy-attachment.js +2 -1
  34. package/lib/aws/policy-attachment.js.map +1 -1
  35. package/lib/aws/policy.d.ts +8 -2
  36. package/lib/aws/policy.d.ts.map +1 -1
  37. package/lib/aws/policy.js +13 -4
  38. package/lib/aws/policy.js.map +1 -1
  39. package/lib/aws/queue.d.ts +8 -2
  40. package/lib/aws/queue.d.ts.map +1 -1
  41. package/lib/aws/queue.js +22 -14
  42. package/lib/aws/queue.js.map +1 -1
  43. package/lib/aws/role.d.ts +8 -2
  44. package/lib/aws/role.d.ts.map +1 -1
  45. package/lib/aws/role.js +10 -3
  46. package/lib/aws/role.js.map +1 -1
  47. package/lib/aws/ses.d.ts +1 -1
  48. package/lib/aws/ses.d.ts.map +1 -1
  49. package/lib/aws/ses.js +2 -1
  50. package/lib/aws/ses.js.map +1 -1
  51. package/lib/aws/ssm-parameter.d.ts +8 -2
  52. package/lib/aws/ssm-parameter.d.ts.map +1 -1
  53. package/lib/aws/ssm-parameter.js +15 -10
  54. package/lib/aws/ssm-parameter.js.map +1 -1
  55. package/lib/aws/table.d.ts +8 -2
  56. package/lib/aws/table.d.ts.map +1 -1
  57. package/lib/aws/table.js +17 -9
  58. package/lib/aws/table.js.map +1 -1
  59. package/lib/cloudflare/account-api-token.d.ts +2 -2
  60. package/lib/cloudflare/account-api-token.d.ts.map +1 -1
  61. package/lib/cloudflare/account-api-token.js +7 -6
  62. package/lib/cloudflare/account-api-token.js.map +1 -1
  63. package/lib/cloudflare/ai-gateway.d.ts +9 -4
  64. package/lib/cloudflare/ai-gateway.d.ts.map +1 -1
  65. package/lib/cloudflare/ai-gateway.js +20 -24
  66. package/lib/cloudflare/ai-gateway.js.map +1 -1
  67. package/lib/cloudflare/api-schema.d.ts +2 -2
  68. package/lib/cloudflare/api-schema.d.ts.map +1 -1
  69. package/lib/cloudflare/api-schema.js +6 -2
  70. package/lib/cloudflare/api-schema.js.map +1 -1
  71. package/lib/cloudflare/api-shield.d.ts +5 -1
  72. package/lib/cloudflare/api-shield.d.ts.map +1 -1
  73. package/lib/cloudflare/api-shield.js +6 -1
  74. package/lib/cloudflare/api-shield.js.map +1 -1
  75. package/lib/cloudflare/assets.d.ts +1 -1
  76. package/lib/cloudflare/assets.d.ts.map +1 -1
  77. package/lib/cloudflare/astro/astro.d.ts.map +1 -1
  78. package/lib/cloudflare/astro/astro.js +3 -1
  79. package/lib/cloudflare/astro/astro.js.map +1 -1
  80. package/lib/cloudflare/astro/plugin.d.ts +2 -1
  81. package/lib/cloudflare/astro/plugin.d.ts.map +1 -1
  82. package/lib/cloudflare/astro/plugin.js.map +1 -1
  83. package/lib/cloudflare/bindings.d.ts +2 -2
  84. package/lib/cloudflare/bindings.d.ts.map +1 -1
  85. package/lib/cloudflare/bound.d.ts +1 -1
  86. package/lib/cloudflare/bound.d.ts.map +1 -1
  87. package/lib/cloudflare/bucket.d.ts +120 -1
  88. package/lib/cloudflare/bucket.d.ts.map +1 -1
  89. package/lib/cloudflare/bucket.js +80 -2
  90. package/lib/cloudflare/bucket.js.map +1 -1
  91. package/lib/cloudflare/cloudflare-env-proxy.js +1 -1
  92. package/lib/cloudflare/cloudflare-env-proxy.js.map +1 -1
  93. package/lib/cloudflare/compatibility-date.gen.d.ts +1 -1
  94. package/lib/cloudflare/compatibility-date.gen.js +1 -1
  95. package/lib/cloudflare/container.d.ts +10 -4
  96. package/lib/cloudflare/container.d.ts.map +1 -1
  97. package/lib/cloudflare/container.js +12 -9
  98. package/lib/cloudflare/container.js.map +1 -1
  99. package/lib/cloudflare/custom-domain.js +2 -1
  100. package/lib/cloudflare/custom-domain.js.map +1 -1
  101. package/lib/cloudflare/d1-database.d.ts +1 -1
  102. package/lib/cloudflare/d1-database.d.ts.map +1 -1
  103. package/lib/cloudflare/d1-database.js +6 -2
  104. package/lib/cloudflare/d1-database.js.map +1 -1
  105. package/lib/cloudflare/dispatch-namespace.d.ts +2 -0
  106. package/lib/cloudflare/dispatch-namespace.d.ts.map +1 -1
  107. package/lib/cloudflare/dispatch-namespace.js +7 -5
  108. package/lib/cloudflare/dispatch-namespace.js.map +1 -1
  109. package/lib/cloudflare/durable-object-namespace.d.ts.map +1 -1
  110. package/lib/cloudflare/durable-object-namespace.js.map +1 -1
  111. package/lib/cloudflare/hyperdrive.d.ts +7 -1
  112. package/lib/cloudflare/hyperdrive.d.ts.map +1 -1
  113. package/lib/cloudflare/hyperdrive.js +3 -2
  114. package/lib/cloudflare/hyperdrive.js.map +1 -1
  115. package/lib/cloudflare/kv-namespace.d.ts +3 -0
  116. package/lib/cloudflare/kv-namespace.d.ts.map +1 -1
  117. package/lib/cloudflare/kv-namespace.js +11 -2
  118. package/lib/cloudflare/kv-namespace.js.map +1 -1
  119. package/lib/cloudflare/miniflare/miniflare-worker-proxy.js +3 -1
  120. package/lib/cloudflare/miniflare/miniflare-worker-proxy.js.map +1 -1
  121. package/lib/cloudflare/miniflare/paths.d.ts +4 -0
  122. package/lib/cloudflare/miniflare/paths.d.ts.map +1 -1
  123. package/lib/cloudflare/miniflare/paths.js +11 -0
  124. package/lib/cloudflare/miniflare/paths.js.map +1 -1
  125. package/lib/cloudflare/pipeline.d.ts +14 -3
  126. package/lib/cloudflare/pipeline.d.ts.map +1 -1
  127. package/lib/cloudflare/pipeline.js +31 -2
  128. package/lib/cloudflare/pipeline.js.map +1 -1
  129. package/lib/cloudflare/queue-consumer.js +1 -1
  130. package/lib/cloudflare/queue-consumer.js.map +1 -1
  131. package/lib/cloudflare/queue.d.ts +4 -2
  132. package/lib/cloudflare/queue.d.ts.map +1 -1
  133. package/lib/cloudflare/queue.js +13 -9
  134. package/lib/cloudflare/queue.js.map +1 -1
  135. package/lib/cloudflare/react-router/plugin.d.ts +1 -1
  136. package/lib/cloudflare/react-router/plugin.d.ts.map +1 -1
  137. package/lib/cloudflare/react-router/react-router.d.ts.map +1 -1
  138. package/lib/cloudflare/react-router/react-router.js +32 -2
  139. package/lib/cloudflare/react-router/react-router.js.map +1 -1
  140. package/lib/cloudflare/redwood/plugin.d.ts +2 -1
  141. package/lib/cloudflare/redwood/plugin.d.ts.map +1 -1
  142. package/lib/cloudflare/redwood/plugin.js.map +1 -1
  143. package/lib/cloudflare/route.js +1 -1
  144. package/lib/cloudflare/route.js.map +1 -1
  145. package/lib/cloudflare/ruleset.d.ts +3 -1
  146. package/lib/cloudflare/ruleset.d.ts.map +1 -1
  147. package/lib/cloudflare/ruleset.js +3 -2
  148. package/lib/cloudflare/ruleset.js.map +1 -1
  149. package/lib/cloudflare/secret.d.ts +6 -23
  150. package/lib/cloudflare/secret.d.ts.map +1 -1
  151. package/lib/cloudflare/secret.js +8 -4
  152. package/lib/cloudflare/secret.js.map +1 -1
  153. package/lib/cloudflare/secrets-store.d.ts +1 -1
  154. package/lib/cloudflare/secrets-store.d.ts.map +1 -1
  155. package/lib/cloudflare/secrets-store.js +5 -2
  156. package/lib/cloudflare/secrets-store.js.map +1 -1
  157. package/lib/cloudflare/tunnel.d.ts +5 -1
  158. package/lib/cloudflare/tunnel.d.ts.map +1 -1
  159. package/lib/cloudflare/tunnel.js +5 -1
  160. package/lib/cloudflare/tunnel.js.map +1 -1
  161. package/lib/cloudflare/vectorize-index.d.ts +7 -1
  162. package/lib/cloudflare/vectorize-index.d.ts.map +1 -1
  163. package/lib/cloudflare/vectorize-index.js +5 -2
  164. package/lib/cloudflare/vectorize-index.js.map +1 -1
  165. package/lib/cloudflare/vite/plugin.d.ts +2 -1
  166. package/lib/cloudflare/vite/plugin.d.ts.map +1 -1
  167. package/lib/cloudflare/vite/plugin.js.map +1 -1
  168. package/lib/cloudflare/website.js +1 -1
  169. package/lib/cloudflare/website.js.map +1 -1
  170. package/lib/cloudflare/worker-metadata.js +1 -1
  171. package/lib/cloudflare/worker-metadata.js.map +1 -1
  172. package/lib/cloudflare/worker.d.ts +1 -1
  173. package/lib/cloudflare/worker.d.ts.map +1 -1
  174. package/lib/cloudflare/worker.js +12 -7
  175. package/lib/cloudflare/worker.js.map +1 -1
  176. package/lib/cloudflare/wrangler.json.d.ts +1 -1
  177. package/lib/cloudflare/wrangler.json.d.ts.map +1 -1
  178. package/lib/cloudflare/wrangler.json.js +5 -3
  179. package/lib/cloudflare/wrangler.json.js.map +1 -1
  180. package/lib/docker/container.d.ts +6 -0
  181. package/lib/docker/container.d.ts.map +1 -1
  182. package/lib/docker/container.js +5 -1
  183. package/lib/docker/container.js.map +1 -1
  184. package/lib/docker/network.d.ts +8 -2
  185. package/lib/docker/network.d.ts.map +1 -1
  186. package/lib/docker/network.js +7 -2
  187. package/lib/docker/network.js.map +1 -1
  188. package/lib/docker/volume.d.ts +8 -2
  189. package/lib/docker/volume.d.ts.map +1 -1
  190. package/lib/docker/volume.js +6 -4
  191. package/lib/docker/volume.js.map +1 -1
  192. package/lib/esbuild/bundle.d.ts +1 -1
  193. package/lib/fs/index.d.ts +0 -8
  194. package/lib/fs/index.d.ts.map +1 -1
  195. package/lib/fs/index.js +0 -8
  196. package/lib/fs/index.js.map +1 -1
  197. package/lib/github/client.d.ts +1 -1
  198. package/lib/github/client.d.ts.map +1 -1
  199. package/lib/github/client.js +2 -1
  200. package/lib/github/client.js.map +1 -1
  201. package/lib/github/repository-environment.d.ts +8 -2
  202. package/lib/github/repository-environment.d.ts.map +1 -1
  203. package/lib/github/repository-environment.js +16 -12
  204. package/lib/github/repository-environment.js.map +1 -1
  205. package/lib/neon/project.d.ts +7 -1
  206. package/lib/neon/project.d.ts.map +1 -1
  207. package/lib/neon/project.js +14 -11
  208. package/lib/neon/project.js.map +1 -1
  209. package/lib/planetscale/branch.d.ts +4 -2
  210. package/lib/planetscale/branch.d.ts.map +1 -1
  211. package/lib/planetscale/branch.js +18 -12
  212. package/lib/planetscale/branch.js.map +1 -1
  213. package/lib/planetscale/database.d.ts +8 -2
  214. package/lib/planetscale/database.d.ts.map +1 -1
  215. package/lib/planetscale/database.js +24 -16
  216. package/lib/planetscale/database.js.map +1 -1
  217. package/lib/planetscale/password.d.ts +8 -2
  218. package/lib/planetscale/password.d.ts.map +1 -1
  219. package/lib/planetscale/password.js +2 -2
  220. package/lib/planetscale/password.js.map +1 -1
  221. package/lib/resource.d.ts +0 -2
  222. package/lib/resource.d.ts.map +1 -1
  223. package/lib/resource.js +1 -9
  224. package/lib/resource.js.map +1 -1
  225. package/lib/scope.d.ts +9 -3
  226. package/lib/scope.d.ts.map +1 -1
  227. package/lib/scope.js +21 -34
  228. package/lib/scope.js.map +1 -1
  229. package/lib/sentry/client-key.d.ts +7 -1
  230. package/lib/sentry/client-key.d.ts.map +1 -1
  231. package/lib/sentry/client-key.js +45 -6
  232. package/lib/sentry/client-key.js.map +1 -1
  233. package/lib/sentry/project.d.ts +8 -2
  234. package/lib/sentry/project.d.ts.map +1 -1
  235. package/lib/sentry/project.js +35 -5
  236. package/lib/sentry/project.js.map +1 -1
  237. package/lib/sentry/team.d.ts +8 -2
  238. package/lib/sentry/team.d.ts.map +1 -1
  239. package/lib/sentry/team.js +36 -6
  240. package/lib/sentry/team.js.map +1 -1
  241. package/lib/serde.d.ts +0 -5
  242. package/lib/serde.d.ts.map +1 -1
  243. package/lib/serde.js +0 -28
  244. package/lib/serde.js.map +1 -1
  245. package/lib/state/d1-state-store.d.ts +1 -1
  246. package/lib/state/d1-state-store.d.ts.map +1 -1
  247. package/lib/state/d1-state-store.js +5 -5
  248. package/lib/state/d1-state-store.js.map +1 -1
  249. package/lib/state/sqlite-state-store.d.ts.map +1 -1
  250. package/lib/state/sqlite-state-store.js +7 -11
  251. package/lib/state/sqlite-state-store.js.map +1 -1
  252. package/lib/stripe/card.d.ts.map +1 -1
  253. package/lib/stripe/card.js +3 -2
  254. package/lib/stripe/card.js.map +1 -1
  255. package/lib/stripe/client.d.ts +2 -2
  256. package/lib/stripe/client.d.ts.map +1 -1
  257. package/lib/stripe/client.js +4 -3
  258. package/lib/stripe/client.js.map +1 -1
  259. package/lib/stripe/coupon.d.ts.map +1 -1
  260. package/lib/stripe/coupon.js +4 -3
  261. package/lib/stripe/coupon.js.map +1 -1
  262. package/lib/stripe/customer.js +2 -2
  263. package/lib/stripe/customer.js.map +1 -1
  264. package/lib/stripe/entitlements-feature.d.ts.map +1 -1
  265. package/lib/stripe/entitlements-feature.js +3 -2
  266. package/lib/stripe/entitlements-feature.js.map +1 -1
  267. package/lib/stripe/file.d.ts.map +1 -1
  268. package/lib/stripe/file.js +3 -2
  269. package/lib/stripe/file.js.map +1 -1
  270. package/lib/stripe/meter.js +2 -2
  271. package/lib/stripe/meter.js.map +1 -1
  272. package/lib/stripe/portal-configuration.d.ts.map +1 -1
  273. package/lib/stripe/portal-configuration.js +3 -2
  274. package/lib/stripe/portal-configuration.js.map +1 -1
  275. package/lib/stripe/price.d.ts.map +1 -1
  276. package/lib/stripe/price.js +3 -2
  277. package/lib/stripe/price.js.map +1 -1
  278. package/lib/stripe/product-feature.d.ts.map +1 -1
  279. package/lib/stripe/product-feature.js +3 -2
  280. package/lib/stripe/product-feature.js.map +1 -1
  281. package/lib/stripe/product.d.ts.map +1 -1
  282. package/lib/stripe/product.js +3 -2
  283. package/lib/stripe/product.js.map +1 -1
  284. package/lib/stripe/promotion-code.d.ts.map +1 -1
  285. package/lib/stripe/promotion-code.js +3 -2
  286. package/lib/stripe/promotion-code.js.map +1 -1
  287. package/lib/stripe/shipping-rate.d.ts.map +1 -1
  288. package/lib/stripe/shipping-rate.js +4 -3
  289. package/lib/stripe/shipping-rate.js.map +1 -1
  290. package/lib/stripe/tax-rate.d.ts.map +1 -1
  291. package/lib/stripe/tax-rate.js +3 -2
  292. package/lib/stripe/tax-rate.js.map +1 -1
  293. package/lib/stripe/webhook.d.ts.map +1 -1
  294. package/lib/stripe/webhook.js +4 -3
  295. package/lib/stripe/webhook.js.map +1 -1
  296. package/lib/test/vitest.d.ts.map +1 -1
  297. package/lib/test/vitest.js +1 -0
  298. package/lib/test/vitest.js.map +1 -1
  299. package/lib/upstash/redis.d.ts +8 -2
  300. package/lib/upstash/redis.d.ts.map +1 -1
  301. package/lib/upstash/redis.js +6 -5
  302. package/lib/upstash/redis.js.map +1 -1
  303. package/lib/util/idempotent-spawn.d.ts.map +1 -1
  304. package/lib/util/idempotent-spawn.js +21 -2
  305. package/lib/util/idempotent-spawn.js.map +1 -1
  306. package/lib/util/ignore-matcher.d.ts.map +1 -1
  307. package/lib/util/ignore-matcher.js +3 -1
  308. package/lib/util/ignore-matcher.js.map +1 -1
  309. package/lib/util/peer.d.ts +10 -0
  310. package/lib/util/peer.d.ts.map +1 -0
  311. package/lib/util/peer.js +42 -0
  312. package/lib/util/peer.js.map +1 -0
  313. package/lib/util/xml.js +1 -1
  314. package/lib/util/xml.js.map +1 -1
  315. package/lib/vercel/project.d.ts +7 -1
  316. package/lib/vercel/project.d.ts.map +1 -1
  317. package/lib/vercel/project.js +28 -0
  318. package/lib/vercel/project.js.map +1 -1
  319. package/package.json +88 -74
  320. package/src/alchemy.ts +76 -222
  321. package/src/apply.ts +6 -19
  322. package/src/aws/account-id.ts +6 -3
  323. package/src/aws/bucket.ts +43 -32
  324. package/src/aws/ec2/security-group.ts +15 -3
  325. package/src/aws/function.ts +65 -39
  326. package/src/aws/policy-attachment.ts +10 -6
  327. package/src/aws/policy.ts +33 -15
  328. package/src/aws/queue.ts +50 -29
  329. package/src/aws/role.ts +37 -20
  330. package/src/aws/ses.ts +24 -20
  331. package/src/aws/ssm-parameter.ts +40 -20
  332. package/src/aws/table.ts +35 -17
  333. package/src/cloudflare/account-api-token.ts +9 -7
  334. package/src/cloudflare/ai-gateway.ts +37 -34
  335. package/src/cloudflare/api-schema.ts +33 -26
  336. package/src/cloudflare/api-shield.ts +15 -2
  337. package/src/cloudflare/astro/astro.ts +5 -1
  338. package/src/cloudflare/astro/plugin.ts +2 -1
  339. package/src/cloudflare/bindings.ts +2 -2
  340. package/src/cloudflare/bound.ts +1 -1
  341. package/src/cloudflare/bucket.ts +242 -3
  342. package/src/cloudflare/cloudflare-env-proxy.ts +1 -1
  343. package/src/cloudflare/compatibility-date.gen.ts +1 -1
  344. package/src/cloudflare/container.ts +23 -12
  345. package/src/cloudflare/custom-domain.ts +2 -2
  346. package/src/cloudflare/d1-database.ts +10 -3
  347. package/src/cloudflare/dispatch-namespace.ts +10 -7
  348. package/src/cloudflare/durable-object-namespace.ts +0 -1
  349. package/src/cloudflare/hyperdrive.ts +14 -4
  350. package/src/cloudflare/kv-namespace.ts +25 -2
  351. package/src/cloudflare/miniflare/miniflare-worker-proxy.ts +3 -1
  352. package/src/cloudflare/miniflare/paths.ts +13 -0
  353. package/src/cloudflare/pipeline.ts +76 -28
  354. package/src/cloudflare/queue-consumer.ts +1 -1
  355. package/src/cloudflare/queue.ts +26 -14
  356. package/src/cloudflare/react-router/react-router.ts +28 -2
  357. package/src/cloudflare/redwood/plugin.ts +3 -2
  358. package/src/cloudflare/route.ts +1 -1
  359. package/src/cloudflare/ruleset.ts +7 -2
  360. package/src/cloudflare/secret.ts +20 -31
  361. package/src/cloudflare/secrets-store.ts +7 -3
  362. package/src/cloudflare/tunnel.ts +13 -2
  363. package/src/cloudflare/vectorize-index.ts +14 -3
  364. package/src/cloudflare/vite/plugin.ts +3 -2
  365. package/src/cloudflare/website.ts +1 -1
  366. package/src/cloudflare/worker-metadata.ts +1 -1
  367. package/src/cloudflare/worker.ts +35 -23
  368. package/src/cloudflare/wrangler.json.ts +7 -4
  369. package/src/docker/container.ts +13 -1
  370. package/src/docker/network.ts +18 -3
  371. package/src/docker/volume.ts +17 -6
  372. package/src/fs/index.ts +0 -8
  373. package/src/github/client.ts +6 -2
  374. package/src/github/repository-environment.ts +27 -13
  375. package/src/neon/project.ts +24 -11
  376. package/src/planetscale/branch.ts +24 -13
  377. package/src/planetscale/database.ts +38 -17
  378. package/src/planetscale/password.ts +10 -3
  379. package/src/resource.ts +1 -10
  380. package/src/scope.ts +29 -38
  381. package/src/sentry/client-key.ts +74 -6
  382. package/src/sentry/project.ts +59 -6
  383. package/src/sentry/team.ts +55 -7
  384. package/src/serde.ts +0 -44
  385. package/src/state/d1-state-store.ts +13 -6
  386. package/src/state/sqlite-state-store.ts +16 -17
  387. package/src/stripe/card.ts +5 -2
  388. package/src/stripe/client.ts +10 -3
  389. package/src/stripe/coupon.ts +4 -3
  390. package/src/stripe/customer.ts +2 -2
  391. package/src/stripe/entitlements-feature.ts +5 -2
  392. package/src/stripe/file.ts +3 -2
  393. package/src/stripe/meter.ts +2 -2
  394. package/src/stripe/portal-configuration.ts +5 -2
  395. package/src/stripe/price.ts +3 -2
  396. package/src/stripe/product-feature.ts +5 -2
  397. package/src/stripe/product.ts +3 -2
  398. package/src/stripe/promotion-code.ts +3 -2
  399. package/src/stripe/shipping-rate.ts +4 -3
  400. package/src/stripe/tax-rate.ts +3 -2
  401. package/src/stripe/webhook.ts +4 -3
  402. package/src/test/vitest.ts +1 -0
  403. package/src/upstash/redis.ts +16 -6
  404. package/src/util/idempotent-spawn.ts +23 -2
  405. package/src/util/ignore-matcher.ts +3 -1
  406. package/src/util/peer.ts +53 -0
  407. package/src/util/xml.ts +1 -1
  408. package/src/vercel/project.ts +46 -1
  409. package/templates/hono/README.md +19 -0
  410. package/templates/hono/_env +1 -0
  411. package/templates/hono/_env.example +1 -0
  412. package/templates/hono/_gitignore +34 -0
  413. package/templates/hono/alchemy.run.ts +22 -0
  414. package/templates/hono/package.json +18 -0
  415. package/templates/hono/src/index.ts +17 -0
  416. package/templates/hono/tsconfig.json +13 -0
  417. package/templates/hono/types/env.d.ts +16 -0
  418. package/templates/react-router/vite.config.ts +5 -3
  419. package/workers/cloudflare-state-store.js +69 -74
  420. package/workers/dofs-state-store.js +1 -1
  421. package/bin/bootstrap-s3.ts +0 -255
  422. package/lib/ai/ark.d.ts +0 -12
  423. package/lib/ai/ark.d.ts.map +0 -1
  424. package/lib/ai/ark.js +0 -87
  425. package/lib/ai/ark.js.map +0 -1
  426. package/lib/ai/astro-file.d.ts +0 -138
  427. package/lib/ai/astro-file.d.ts.map +0 -1
  428. package/lib/ai/astro-file.js +0 -158
  429. package/lib/ai/astro-file.js.map +0 -1
  430. package/lib/ai/client.d.ts +0 -51
  431. package/lib/ai/client.d.ts.map +0 -1
  432. package/lib/ai/client.js +0 -58
  433. package/lib/ai/client.js.map +0 -1
  434. package/lib/ai/css-file.d.ts +0 -132
  435. package/lib/ai/css-file.d.ts.map +0 -1
  436. package/lib/ai/css-file.js +0 -142
  437. package/lib/ai/css-file.js.map +0 -1
  438. package/lib/ai/data.d.ts +0 -152
  439. package/lib/ai/data.d.ts.map +0 -1
  440. package/lib/ai/data.js +0 -120
  441. package/lib/ai/data.js.map +0 -1
  442. package/lib/ai/document.d.ts +0 -208
  443. package/lib/ai/document.d.ts.map +0 -1
  444. package/lib/ai/document.js +0 -206
  445. package/lib/ai/document.js.map +0 -1
  446. package/lib/ai/html-file.d.ts +0 -129
  447. package/lib/ai/html-file.d.ts.map +0 -1
  448. package/lib/ai/html-file.js +0 -139
  449. package/lib/ai/html-file.js.map +0 -1
  450. package/lib/ai/index.d.ts +0 -11
  451. package/lib/ai/index.d.ts.map +0 -1
  452. package/lib/ai/index.js +0 -11
  453. package/lib/ai/index.js.map +0 -1
  454. package/lib/ai/json-file.d.ts +0 -161
  455. package/lib/ai/json-file.d.ts.map +0 -1
  456. package/lib/ai/json-file.js +0 -188
  457. package/lib/ai/json-file.js.map +0 -1
  458. package/lib/ai/typescript-file.d.ts +0 -140
  459. package/lib/ai/typescript-file.d.ts.map +0 -1
  460. package/lib/ai/typescript-file.js +0 -146
  461. package/lib/ai/typescript-file.js.map +0 -1
  462. package/lib/ai/vue-file.d.ts +0 -127
  463. package/lib/ai/vue-file.d.ts.map +0 -1
  464. package/lib/ai/vue-file.js +0 -137
  465. package/lib/ai/vue-file.js.map +0 -1
  466. package/lib/ai/yaml-file.d.ts +0 -170
  467. package/lib/ai/yaml-file.d.ts.map +0 -1
  468. package/lib/ai/yaml-file.js +0 -201
  469. package/lib/ai/yaml-file.js.map +0 -1
  470. package/lib/fs/static-astro-file.d.ts +0 -35
  471. package/lib/fs/static-astro-file.d.ts.map +0 -1
  472. package/lib/fs/static-astro-file.js +0 -40
  473. package/lib/fs/static-astro-file.js.map +0 -1
  474. package/lib/fs/static-css-file.d.ts +0 -25
  475. package/lib/fs/static-css-file.d.ts.map +0 -1
  476. package/lib/fs/static-css-file.js +0 -30
  477. package/lib/fs/static-css-file.js.map +0 -1
  478. package/lib/fs/static-html-file.d.ts +0 -32
  479. package/lib/fs/static-html-file.d.ts.map +0 -1
  480. package/lib/fs/static-html-file.js +0 -37
  481. package/lib/fs/static-html-file.js.map +0 -1
  482. package/lib/fs/static-json-file.d.ts +0 -18
  483. package/lib/fs/static-json-file.d.ts.map +0 -1
  484. package/lib/fs/static-json-file.js +0 -19
  485. package/lib/fs/static-json-file.js.map +0 -1
  486. package/lib/fs/static-text-file.d.ts +0 -13
  487. package/lib/fs/static-text-file.d.ts.map +0 -1
  488. package/lib/fs/static-text-file.js +0 -9
  489. package/lib/fs/static-text-file.js.map +0 -1
  490. package/lib/fs/static-typescript-file.d.ts +0 -20
  491. package/lib/fs/static-typescript-file.d.ts.map +0 -1
  492. package/lib/fs/static-typescript-file.js +0 -16
  493. package/lib/fs/static-typescript-file.js.map +0 -1
  494. package/lib/fs/static-vue-file.d.ts +0 -29
  495. package/lib/fs/static-vue-file.d.ts.map +0 -1
  496. package/lib/fs/static-vue-file.js +0 -34
  497. package/lib/fs/static-vue-file.js.map +0 -1
  498. package/lib/fs/static-yaml-file.d.ts +0 -23
  499. package/lib/fs/static-yaml-file.d.ts.map +0 -1
  500. package/lib/fs/static-yaml-file.js +0 -10
  501. package/lib/fs/static-yaml-file.js.map +0 -1
  502. package/lib/internal/docs/providers.d.ts +0 -34
  503. package/lib/internal/docs/providers.d.ts.map +0 -1
  504. package/lib/internal/docs/providers.js +0 -200
  505. package/lib/internal/docs/providers.js.map +0 -1
  506. package/lib/runtime/bind.d.ts +0 -25
  507. package/lib/runtime/bind.d.ts.map +0 -1
  508. package/lib/runtime/bind.js +0 -76
  509. package/lib/runtime/bind.js.map +0 -1
  510. package/lib/runtime/global.d.ts +0 -8
  511. package/lib/runtime/global.d.ts.map +0 -1
  512. package/lib/runtime/global.js +0 -3
  513. package/lib/runtime/global.js.map +0 -1
  514. package/lib/runtime/plugin.d.ts +0 -35
  515. package/lib/runtime/plugin.d.ts.map +0 -1
  516. package/lib/runtime/plugin.js +0 -134
  517. package/lib/runtime/plugin.js.map +0 -1
  518. package/lib/runtime/shims.d.ts +0 -6
  519. package/lib/runtime/shims.d.ts.map +0 -1
  520. package/lib/runtime/shims.js +0 -27
  521. package/lib/runtime/shims.js.map +0 -1
  522. package/lib/runtime/state.d.ts +0 -5
  523. package/lib/runtime/state.d.ts.map +0 -1
  524. package/lib/runtime/state.js +0 -4
  525. package/lib/runtime/state.js.map +0 -1
  526. package/lib/web/astro.d.ts +0 -148
  527. package/lib/web/astro.d.ts.map +0 -1
  528. package/lib/web/astro.js +0 -419
  529. package/lib/web/astro.js.map +0 -1
  530. package/lib/web/shadcn-component.d.ts +0 -30
  531. package/lib/web/shadcn-component.d.ts.map +0 -1
  532. package/lib/web/shadcn-component.js +0 -25
  533. package/lib/web/shadcn-component.js.map +0 -1
  534. package/lib/web/shadcn.d.ts +0 -98
  535. package/lib/web/shadcn.d.ts.map +0 -1
  536. package/lib/web/shadcn.js +0 -102
  537. package/lib/web/shadcn.js.map +0 -1
  538. package/lib/web/tailwind.d.ts +0 -65
  539. package/lib/web/tailwind.d.ts.map +0 -1
  540. package/lib/web/tailwind.js +0 -98
  541. package/lib/web/tailwind.js.map +0 -1
  542. package/lib/web/vite.d.ts +0 -96
  543. package/lib/web/vite.d.ts.map +0 -1
  544. package/lib/web/vite.js +0 -232
  545. package/lib/web/vite.js.map +0 -1
  546. package/lib/web/vitepress/config.d.ts +0 -12
  547. package/lib/web/vitepress/config.d.ts.map +0 -1
  548. package/lib/web/vitepress/config.js +0 -33
  549. package/lib/web/vitepress/config.js.map +0 -1
  550. package/lib/web/vitepress/custom-theme.d.ts +0 -174
  551. package/lib/web/vitepress/custom-theme.d.ts.map +0 -1
  552. package/lib/web/vitepress/custom-theme.js +0 -337
  553. package/lib/web/vitepress/custom-theme.js.map +0 -1
  554. package/lib/web/vitepress/dependencies.d.ts +0 -13
  555. package/lib/web/vitepress/dependencies.d.ts.map +0 -1
  556. package/lib/web/vitepress/dependencies.js +0 -37
  557. package/lib/web/vitepress/dependencies.js.map +0 -1
  558. package/lib/web/vitepress/home-page.d.ts +0 -247
  559. package/lib/web/vitepress/home-page.d.ts.map +0 -1
  560. package/lib/web/vitepress/home-page.js +0 -146
  561. package/lib/web/vitepress/home-page.js.map +0 -1
  562. package/lib/web/vitepress/index.d.ts +0 -6
  563. package/lib/web/vitepress/index.d.ts.map +0 -1
  564. package/lib/web/vitepress/index.js +0 -6
  565. package/lib/web/vitepress/index.js.map +0 -1
  566. package/lib/web/vitepress/process-front-matter-files.d.ts +0 -19
  567. package/lib/web/vitepress/process-front-matter-files.d.ts.map +0 -1
  568. package/lib/web/vitepress/process-front-matter-files.js +0 -73
  569. package/lib/web/vitepress/process-front-matter-files.js.map +0 -1
  570. package/lib/web/vitepress/vitepress.d.ts +0 -75
  571. package/lib/web/vitepress/vitepress.d.ts.map +0 -1
  572. package/lib/web/vitepress/vitepress.js +0 -254
  573. package/lib/web/vitepress/vitepress.js.map +0 -1
  574. package/src/ai/ark.ts +0 -118
  575. package/src/ai/astro-file.ts +0 -270
  576. package/src/ai/client.ts +0 -117
  577. package/src/ai/css-file.ts +0 -247
  578. package/src/ai/data.ts +0 -221
  579. package/src/ai/document.ts +0 -367
  580. package/src/ai/html-file.ts +0 -244
  581. package/src/ai/index.ts +0 -10
  582. package/src/ai/json-file.ts +0 -325
  583. package/src/ai/typescript-file.ts +0 -259
  584. package/src/ai/vue-file.ts +0 -242
  585. package/src/ai/yaml-file.ts +0 -328
  586. package/src/fs/static-astro-file.ts +0 -45
  587. package/src/fs/static-css-file.ts +0 -35
  588. package/src/fs/static-html-file.ts +0 -42
  589. package/src/fs/static-json-file.ts +0 -38
  590. package/src/fs/static-text-file.ts +0 -23
  591. package/src/fs/static-typescript-file.ts +0 -37
  592. package/src/fs/static-vue-file.ts +0 -39
  593. package/src/fs/static-yaml-file.ts +0 -33
  594. package/src/internal/docs/providers.ts +0 -286
  595. package/src/runtime/bind.ts +0 -95
  596. package/src/runtime/global.ts +0 -10
  597. package/src/runtime/plugin.ts +0 -163
  598. package/src/runtime/shims.js +0 -34
  599. package/src/runtime/state.ts +0 -9
  600. package/src/web/astro.ts +0 -643
  601. package/src/web/shadcn-component.ts +0 -72
  602. package/src/web/shadcn.ts +0 -221
  603. package/src/web/tailwind.ts +0 -167
  604. package/src/web/vite.ts +0 -407
  605. package/src/web/vitepress/config.ts +0 -50
  606. package/src/web/vitepress/custom-theme.ts +0 -514
  607. package/src/web/vitepress/dependencies.ts +0 -69
  608. package/src/web/vitepress/home-page.ts +0 -378
  609. package/src/web/vitepress/index.ts +0 -5
  610. package/src/web/vitepress/process-front-matter-files.ts +0 -107
  611. package/src/web/vitepress/vitepress.ts +0 -372
  612. package/templates/sveltekit/bun.lock +0 -1099
@@ -2,6 +2,7 @@ import { join, resolve } from "node:path";
2
2
  import { getPackageManagerRunner } from "../../util/detect-package-manager.ts";
3
3
  import type { Assets } from "../assets.ts";
4
4
  import type { Bindings } from "../bindings.ts";
5
+ import { withSkipPathValidation } from "../miniflare/paths.ts";
5
6
  import { Website, type WebsiteProps } from "../website.ts";
6
7
  import type { Worker } from "../worker.ts";
7
8
 
@@ -80,6 +81,7 @@ export async function Astro<B extends Bindings>(
80
81
  props.entrypoint ??
81
82
  (output === "server" ? "dist/_worker.js/index.js" : undefined),
82
83
  assets: props.assets ?? "dist",
84
+ spa: false,
83
85
  });
84
86
  }
85
87
 
@@ -92,7 +94,9 @@ async function resolveOutputType(cwd: string): Promise<"server" | "static"> {
92
94
  ];
93
95
  for (const candidate of candidates) {
94
96
  try {
95
- const config = await import(join(cwd, candidate));
97
+ const config = await withSkipPathValidation(
98
+ () => import(join(cwd, candidate)),
99
+ );
96
100
  if (
97
101
  typeof config.default === "object" &&
98
102
  config.default &&
@@ -1,7 +1,8 @@
1
1
  import cloudflare, { type Options } from "@astrojs/cloudflare";
2
+ import type { AstroIntegration } from "astro";
2
3
  import { getPlatformProxyOptions } from "../cloudflare-env-proxy.ts";
3
4
 
4
- const alchemy = (options?: Options) => {
5
+ const alchemy = (options?: Options): AstroIntegration => {
5
6
  return cloudflare({
6
7
  platformProxy: getPlatformProxyOptions(options?.platformProxy),
7
8
  ...options,
@@ -4,7 +4,7 @@
4
4
  * https://developers.cloudflare.com/api/resources/workers/subresources/scripts/methods/update/
5
5
  */
6
6
  import type { Secret } from "../secret.ts";
7
- import type { AiGatewayResource } from "./ai-gateway.ts";
7
+ import type { AiGateway } from "./ai-gateway.ts";
8
8
  import type { Ai } from "./ai.ts";
9
9
  import type { AnalyticsEngineDataset } from "./analytics-engine.ts";
10
10
  import type { Assets } from "./assets.ts";
@@ -45,7 +45,7 @@ export declare namespace Bindings {
45
45
  */
46
46
  export type Binding =
47
47
  | Ai
48
- | AiGatewayResource
48
+ | AiGateway
49
49
  | Assets
50
50
  | Container
51
51
  | CloudflareSecret
@@ -21,7 +21,7 @@ import type {
21
21
  } from "@cloudflare/workers-types";
22
22
  import type { Pipeline } from "cloudflare:pipelines";
23
23
  import type { Secret } from "../secret.ts";
24
- import type { AiGatewayResource as _AiGateway } from "./ai-gateway.ts";
24
+ import type { AiGateway as _AiGateway } from "./ai-gateway.ts";
25
25
  import type { Ai as _Ai } from "./ai.ts";
26
26
  import type { AnalyticsEngineDataset as _AnalyticsEngineDataset } from "./analytics-engine.ts";
27
27
  import type { Assets } from "./assets.ts";
@@ -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
+ }
@@ -31,7 +31,7 @@ export const getPlatformProxyOptions = (
31
31
  };
32
32
  if (!persist) {
33
33
  const message =
34
- "[Alchemy] Persistence for local bindings is disabled. Some bindings may not work as expected. To enable, remove the \`persist\` option from getPlatformProxyOptions.";
34
+ "[Alchemy] Persistence for local bindings is disabled. Some bindings may not work as expected. To enable, remove the `persist` option from getPlatformProxyOptions.";
35
35
  if (!warned.has(message)) {
36
36
  console.warn(message);
37
37
  warned.add(message);
@@ -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-26";
@@ -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") ||
@@ -19,7 +19,6 @@ export type DurableObjectNamespace<T = any> = {
19
19
  environment?: string;
20
20
  sqlite?: boolean;
21
21
  namespaceId?: string;
22
- // @ts-ignore - phantom type
23
22
  __service__: T;
24
23
  };
25
24
 
@@ -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,
@@ -527,7 +537,7 @@ const normalizePort = (
527
537
  return port;
528
538
  }
529
539
  if (port) {
530
- return Number.parseInt(port);
540
+ return Number.parseInt(port, 10);
531
541
  }
532
542
  return scheme === "postgres" ? 5432 : 3306;
533
543
  };