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
@@ -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
  }
@@ -183,7 +183,7 @@ export interface PipelineProps extends CloudflareApiOptions {
183
183
  /**
184
184
  * Name of the pipeline
185
185
  *
186
- * @default id
186
+ * @default ${app}-${stage}-${id}
187
187
  */
188
188
  name?: string;
189
189
 
@@ -236,34 +236,34 @@ export function isPipeline(resource: Resource): resource is Pipeline {
236
236
  /**
237
237
  * Output returned after Pipeline creation/update
238
238
  */
239
- export interface Pipeline<_T extends PipelineRecord = PipelineRecord>
240
- extends Resource<"cloudflare::Pipeline">,
241
- PipelineProps {
242
- /**
243
- * Type identifier for the Pipeline resource
244
- */
245
- type: "pipeline";
246
-
247
- /**
248
- * The unique ID of the pipeline
249
- */
250
- id: string;
239
+ export type Pipeline<_T extends PipelineRecord = PipelineRecord> =
240
+ Resource<"cloudflare::Pipeline"> &
241
+ PipelineProps & {
242
+ /**
243
+ * Type identifier for the Pipeline resource
244
+ */
245
+ type: "pipeline";
246
+
247
+ /**
248
+ * The unique ID of the pipeline
249
+ */
250
+ id: string;
251
251
 
252
- /**
253
- * The name of the pipeline
254
- */
255
- name: string;
252
+ /**
253
+ * The name of the pipeline
254
+ */
255
+ name: string;
256
256
 
257
- /**
258
- * HTTP endpoint URL for the pipeline
259
- */
260
- endpoint: string;
257
+ /**
258
+ * HTTP endpoint URL for the pipeline
259
+ */
260
+ endpoint: string;
261
261
 
262
- /**
263
- * Version of the pipeline
264
- */
265
- version: number;
266
- }
262
+ /**
263
+ * Version of the pipeline
264
+ */
265
+ version: number;
266
+ };
267
267
 
268
268
  /**
269
269
  * Creates and manages Cloudflare Pipelines.
@@ -337,7 +337,8 @@ export const Pipeline = Resource("cloudflare::Pipeline", async function <
337
337
  Pipeline<T>
338
338
  > {
339
339
  const api = await createCloudflareApi(props);
340
- const pipelineName = props.name ?? id;
340
+ const pipelineName =
341
+ props.name ?? this.output?.name ?? this.scope.createPhysicalName(id);
341
342
 
342
343
  if (this.scope.local && !props.dev?.remote) {
343
344
  return this({
@@ -353,6 +354,10 @@ export const Pipeline = Resource("cloudflare::Pipeline", async function <
353
354
  });
354
355
  }
355
356
 
357
+ if (this.phase === "update" && this.output?.name !== pipelineName) {
358
+ await renamePipeline(api, this.output.name, pipelineName);
359
+ }
360
+
356
361
  if (this.phase === "delete") {
357
362
  if (props.delete !== false) {
358
363
  // Delete Pipeline
@@ -377,7 +382,7 @@ export const Pipeline = Resource("cloudflare::Pipeline", async function <
377
382
  (error.status === 400 &&
378
383
  error.message.includes("Pipeline with this name already exists")))
379
384
  ) {
380
- if (props.adopt) {
385
+ if (props.adopt ?? this.scope.adopt) {
381
386
  console.warn(
382
387
  "Pipeline already exists, adopting existing Cloudflare Pipeline:",
383
388
  pipelineName,
@@ -580,6 +585,49 @@ export async function updatePipeline(
580
585
  return (await updateResponse.json()) as CloudflarePipelineResponse;
581
586
  }
582
587
 
588
+ /**
589
+ * Rename a pipeline
590
+ *
591
+ * @param api - Cloudflare API instance
592
+ * @param currentName - Current name of the pipeline
593
+ * @param newName - New name for the pipeline
594
+ * @returns Updated pipeline response with the new name
595
+ *
596
+ * @see https://developers.cloudflare.com/api/resources/pipelines/methods/update/
597
+ */
598
+ export async function renamePipeline(
599
+ api: CloudflareApi,
600
+ currentName: string,
601
+ newName: string,
602
+ ): Promise<CloudflarePipelineResponse> {
603
+ // Get the current pipeline configuration
604
+ const currentPipeline = await getPipeline(api, currentName);
605
+
606
+ // Build the update payload with the new name
607
+ const updatePayload = {
608
+ name: newName,
609
+ source: currentPipeline.result.source,
610
+ destination: currentPipeline.result.destination,
611
+ };
612
+
613
+ // Use the update endpoint with the current name in the path and new name in the body
614
+ const updateResponse = await api.put(
615
+ `/accounts/${api.accountId}/pipelines/${currentName}`,
616
+ updatePayload,
617
+ );
618
+
619
+ if (!updateResponse.ok) {
620
+ return await handleApiError(
621
+ updateResponse,
622
+ "renaming",
623
+ "Pipeline",
624
+ `${currentName} -> ${newName}`,
625
+ );
626
+ }
627
+
628
+ return (await updateResponse.json()) as CloudflarePipelineResponse;
629
+ }
630
+
583
631
  /**
584
632
  * Helper function to prepare pipeline payload for create/update operations
585
633
  */
@@ -200,7 +200,7 @@ export const QueueConsumer = Resource(
200
200
  err instanceof CloudflareApiError &&
201
201
  err.status === 400 &&
202
202
  err.message.includes("already has a consumer") &&
203
- props.adopt
203
+ (props.adopt ?? this.scope.adopt)
204
204
  ) {
205
205
  const consumerId = await findQueueConsumerId(
206
206
  api,
@@ -40,7 +40,7 @@ export interface QueueProps extends CloudflareApiOptions {
40
40
  * Required during creation
41
41
  * Cannot be changed after creation
42
42
  *
43
- * @default id
43
+ * @default ${app}-${stage}-${id}
44
44
  */
45
45
  name?: string;
46
46
 
@@ -248,7 +248,9 @@ const _Queue = Resource("cloudflare::Queue", async function <
248
248
  >(this: Context<Queue<T>>, id: string, props: QueueProps = {}): Promise<
249
249
  Queue<T>
250
250
  > {
251
- const queueName = props.name ?? id;
251
+ const queueName =
252
+ props.name ?? this.output?.name ?? this.scope.createPhysicalName(id);
253
+
252
254
  const dev = {
253
255
  id: this.output?.dev?.id ?? this.output?.id ?? id,
254
256
  remote: props.dev?.remote ?? false,
@@ -285,7 +287,7 @@ const _Queue = Resource("cloudflare::Queue", async function <
285
287
  queueData = await createQueue(api, queueName, props);
286
288
  } catch (error) {
287
289
  if (error instanceof CloudflareApiError && error.status === 409) {
288
- if (!props.adopt) {
290
+ if (!(props.adopt ?? this.scope.adopt)) {
289
291
  throw error;
290
292
  }
291
293
  // Queue already exists, try to find it by name
@@ -296,7 +298,10 @@ const _Queue = Resource("cloudflare::Queue", async function <
296
298
  );
297
299
  }
298
300
  queueData = existingQueue;
299
- queueData = await updateQueue(api, queueData.result.queue_id!, props);
301
+ queueData = await updateQueue(api, queueData.result.queue_id!, {
302
+ ...props,
303
+ name: queueName,
304
+ });
300
305
  } else {
301
306
  throw error;
302
307
  }
@@ -304,15 +309,11 @@ const _Queue = Resource("cloudflare::Queue", async function <
304
309
  } else {
305
310
  // Update operation
306
311
  if (this.output?.id) {
307
- // Check if name is being changed, which is not allowed
308
- if (queueName !== this.output.name) {
309
- throw new Error(
310
- `Cannot update Queue name after creation. Queue name is immutable. Before: ${this.output.name}, After: ${queueName}`,
311
- );
312
- }
313
-
314
312
  // Update the queue with new settings
315
- queueData = await updateQueue(api, this.output.id, props);
313
+ queueData = await updateQueue(api, this.output.id, {
314
+ ...props,
315
+ name: queueName,
316
+ });
316
317
  } else {
317
318
  // If no ID exists, fall back to creating a new queue
318
319
  queueData = await createQueue(api, queueName, props);
@@ -452,10 +453,21 @@ export async function deleteQueue(
452
453
  export async function updateQueue(
453
454
  api: CloudflareApi,
454
455
  queueId: string,
455
- props: QueueProps,
456
+ props: QueueProps & {
457
+ name: string;
458
+ },
456
459
  ): Promise<CloudflareQueueResponse> {
457
460
  // Prepare the update payload - only include settings
458
- const updatePayload: any = {};
461
+ const updatePayload: {
462
+ queue_name?: string;
463
+ settings?: {
464
+ delivery_delay?: number;
465
+ delivery_paused?: boolean;
466
+ message_retention_period?: number;
467
+ };
468
+ } = {
469
+ queue_name: props.name,
470
+ };
459
471
 
460
472
  // Add settings if provided
461
473
  if (props.settings) {
@@ -1,3 +1,4 @@
1
+ import path from "node:path";
1
2
  import { getPackageManagerRunner } from "../../util/detect-package-manager.ts";
2
3
  import type { Assets } from "../assets.ts";
3
4
  import type { Bindings } from "../bindings.ts";
@@ -21,6 +22,8 @@ export async function ReactRouter<B extends Bindings>(
21
22
  props: ReactRouterProps<B> = {},
22
23
  ): Promise<ReactRouter<B>> {
23
24
  const runner = await getPackageManagerRunner();
25
+ const cwd = path.resolve(props.cwd ?? process.cwd());
26
+ const ssr = await detectSSREnabled(cwd);
24
27
  return await Vite(id, {
25
28
  ...props,
26
29
  build:
@@ -29,13 +32,36 @@ export async function ReactRouter<B extends Bindings>(
29
32
  dev:
30
33
  props.dev ??
31
34
  `${runner} react-router typegen && ${runner} react-router dev`,
35
+ spa: !ssr,
32
36
  compatibility: "node",
33
- entrypoint: props.entrypoint ?? "build/server/index.js",
37
+ entrypoint: props.entrypoint ?? (ssr ? "build/server/index.js" : undefined),
34
38
  noBundle: props.noBundle ?? true,
35
39
  assets: props.assets ?? "build/client",
36
40
  wrangler: {
37
- main: props.wrangler?.main ?? props.main ?? "workers/app.ts",
41
+ main:
42
+ props.wrangler?.main ??
43
+ props.main ??
44
+ (ssr ? "workers/app.ts" : undefined),
38
45
  transform: props.wrangler?.transform,
39
46
  },
40
47
  });
41
48
  }
49
+
50
+ /**
51
+ * Detect if SSR is enabled by checking for an `ssr` property in `react-router.config.ts`.
52
+ * If no config is found or if there is no `ssr` property, default to true in line with React Router's default behavior.
53
+ * @see https://reactrouter.com/api/framework-conventions/react-router.config.ts
54
+ */
55
+ async function detectSSREnabled(cwd: string): Promise<boolean> {
56
+ const candidates = [
57
+ "react-router.config.ts",
58
+ "react-router.config.mts",
59
+ "react-router.config.mjs",
60
+ "react-router.config.js",
61
+ ];
62
+ const configs = await Promise.allSettled(
63
+ candidates.map((candidate) => import(path.join(cwd, candidate))),
64
+ );
65
+ const config = configs.find((result) => result.status === "fulfilled")?.value;
66
+ return config?.default?.ssr !== false;
67
+ }
@@ -1,15 +1,16 @@
1
1
  import { redwood, type RedwoodPluginOptions } from "rwsdk/vite";
2
+ import type { PluginOption } from "vite";
2
3
  import { DEFAULT_CONFIG_PATH } from "../miniflare/paths.ts";
3
4
  import alchemyVite from "../vite/plugin.ts";
4
5
 
5
- const alchemyRedwood = (options?: RedwoodPluginOptions) => {
6
+ const alchemyRedwood = (options?: RedwoodPluginOptions): PluginOption => {
6
7
  const configPath = options?.configPath ?? DEFAULT_CONFIG_PATH;
7
8
  return [
8
9
  redwood({
9
10
  ...options,
10
11
  configPath,
11
12
  includeCloudflarePlugin: false,
12
- }),
13
+ }) as PluginOption,
13
14
  alchemyVite({
14
15
  configPath,
15
16
  viteEnvironment: { name: "worker" },
@@ -211,7 +211,7 @@ export const Route = Resource(
211
211
  } catch (error) {
212
212
  // Check if this is a "route already exists" error and adopt is enabled
213
213
  if (
214
- props.adopt &&
214
+ (props.adopt ?? this.scope.adopt) &&
215
215
  error instanceof CloudflareApiError &&
216
216
  error.status === 409
217
217
  ) {
@@ -32,6 +32,8 @@ export interface RulesetProps<Phase extends RulePhase>
32
32
 
33
33
  /**
34
34
  * Human-readable name for the ruleset
35
+ *
36
+ * @default ${app}-${stage}-${id}
35
37
  */
36
38
  name?: string;
37
39
 
@@ -152,7 +154,7 @@ export interface Ruleset<Phase extends RulePhase>
152
154
  */
153
155
  export const Ruleset = Resource("cloudflare::Ruleset", async function <
154
156
  Phase extends RulePhase,
155
- >(this: Context<Ruleset<Phase>>, _id: string, props: RulesetProps<Phase>): Promise<
157
+ >(this: Context<Ruleset<Phase>>, id: string, props: RulesetProps<Phase>): Promise<
156
158
  Ruleset<Phase>
157
159
  > {
158
160
  const api = await createCloudflareApi(props);
@@ -172,10 +174,13 @@ export const Ruleset = Resource("cloudflare::Ruleset", async function <
172
174
  return this.destroy();
173
175
  }
174
176
 
177
+ const rulesetName =
178
+ props.name ?? this.output?.name ?? this.scope.createPhysicalName(id);
179
+
175
180
  // Overwrite entire entrypoint with only the provided rules
176
181
  const result = await updateRuleset(api, zoneId, phase, {
177
182
  rules: props.rules,
178
- ...(props.name && { name: props.name }),
183
+ name: rulesetName,
179
184
  ...(props.description && { description: props.description }),
180
185
  });
181
186
 
@@ -13,41 +13,21 @@ import {
13
13
  import { findSecretsStoreByName, SecretsStore } from "./secrets-store.ts";
14
14
 
15
15
  /**
16
- * Properties for creating or updating a Secret in a Secrets Store (internal interface)
16
+ * Properties for creating or updating a Secret in a Secrets Store (public interface)
17
17
  */
18
- interface _SecretProps extends CloudflareApiOptions {
18
+ export interface SecretProps extends CloudflareApiOptions {
19
19
  /**
20
- * The secrets store to add this secret to
20
+ * Name for the Secret.
21
21
  *
22
- * @default - the default-secret-store
23
- */
24
- store?: SecretsStore<any>;
25
-
26
- /**
27
- * The secret value to store (must be an AlchemySecret for security)
22
+ * @default ${app}-${stage}-${id}
28
23
  */
29
- value: AlchemySecret;
30
-
31
- /**
32
- * Whether to delete the secret.
33
- * If set to false, the secret will remain but the resource will be removed from state
34
- *
35
- * @default true
36
- */
37
- delete?: boolean;
38
- }
39
-
40
- /**
41
- * Properties for creating or updating a Secret in a Secrets Store (public interface)
42
- */
43
- export interface SecretProps extends CloudflareApiOptions {
24
+ name?: string;
44
25
  /**
45
26
  * The secrets store to add this secret to
46
27
  *
47
28
  * @default - the default-secret-store
48
29
  */
49
30
  store?: SecretsStore<any>;
50
-
51
31
  /**
52
32
  * The secret value to store
53
33
  * Can be a string or an existing Secret instance
@@ -76,7 +56,7 @@ export function isSecret(resource: Resource): resource is Secret {
76
56
  }
77
57
 
78
58
  export type Secret = Resource<"cloudflare::Secret"> &
79
- Omit<_SecretProps, "delete"> & {
59
+ Omit<SecretProps, "delete" | "value"> & {
80
60
  /**
81
61
  * The binding type for Cloudflare Workers
82
62
  */
@@ -177,11 +157,20 @@ const _Secret = Resource(
177
157
  "cloudflare::Secret",
178
158
  async function (
179
159
  this: Context<Secret>,
180
- name: string,
181
- props: _SecretProps,
160
+ id: string,
161
+ props: SecretProps & {
162
+ value: AlchemySecret;
163
+ },
182
164
  ): Promise<Secret> {
183
165
  const api = await createCloudflareApi(props);
184
166
 
167
+ const secretName =
168
+ props.name ?? this.output?.name ?? this.scope.createPhysicalName(id);
169
+
170
+ if (this.phase === "update" && this.output.name !== secretName) {
171
+ this.replace();
172
+ }
173
+
185
174
  const storeId =
186
175
  props.store?.id ??
187
176
  (await findSecretsStoreByName(api, SecretsStore.Default))?.id ??
@@ -195,7 +184,7 @@ const _Secret = Resource(
195
184
 
196
185
  if (this.phase === "delete") {
197
186
  if (props.delete !== false) {
198
- await deleteSecret(api, storeId, name);
187
+ await deleteSecret(api, storeId, secretName);
199
188
  }
200
189
  return this.destroy();
201
190
  }
@@ -206,11 +195,11 @@ const _Secret = Resource(
206
195
  : Date.now();
207
196
 
208
197
  // Insert or update the secret
209
- await insertSecret(api, storeId, name, props.value);
198
+ await insertSecret(api, storeId, secretName, props.value);
210
199
 
211
200
  return this({
212
201
  type: "secrets_store_secret",
213
- name,
202
+ name: secretName,
214
203
  storeId,
215
204
  store: props.store,
216
205
  value: props.value,
@@ -17,7 +17,7 @@ export interface SecretsStoreProps<
17
17
  /**
18
18
  * Name of the secrets store
19
19
  *
20
- * @default id
20
+ * @default ${app}-${stage}-${id}
21
21
  */
22
22
  name?: string;
23
23
 
@@ -179,7 +179,11 @@ const _SecretsStore = Resource("cloudflare::SecretsStore", async function <
179
179
  > {
180
180
  const api = await createCloudflareApi(props);
181
181
 
182
- const name = props.name ?? id;
182
+ const name = props.name ?? this.scope.createPhysicalName(id);
183
+
184
+ if (this.phase === "update" && this.output.name !== name) {
185
+ this.replace();
186
+ }
183
187
 
184
188
  if (this.phase === "delete") {
185
189
  const storeId = this.output?.id;
@@ -209,7 +213,7 @@ const _SecretsStore = Resource("cloudflare::SecretsStore", async function <
209
213
  await insertSecrets(api, storeId, props);
210
214
  } else {
211
215
  // If adopt is true, first check if a store with this name already exists
212
- if (props.adopt) {
216
+ if (props.adopt ?? this.scope.adopt) {
213
217
  const existingStore = await findSecretsStoreByName(api, name);
214
218
 
215
219
  if (existingStore) {
@@ -49,7 +49,7 @@ export interface TunnelProps extends CloudflareApiOptions {
49
49
  * Note: Tunnel names are immutable and cannot be changed after creation.
50
50
  * When updating a tunnel, any name change will be ignored.
51
51
  *
52
- * @default id
52
+ * @default ${app}-${stage}-${id}
53
53
  */
54
54
  name?: string;
55
55
 
@@ -274,6 +274,11 @@ export function isTunnel(resource: Resource): resource is Tunnel {
274
274
  export interface Tunnel
275
275
  extends Resource<"cloudflare::Tunnel">,
276
276
  Omit<TunnelProps, "delete" | "tunnelSecret"> {
277
+ /**
278
+ * The name of the tunnel
279
+ */
280
+ name: string;
281
+
277
282
  /**
278
283
  * The ID of the tunnel
279
284
  */
@@ -488,7 +493,13 @@ export const Tunnel = Resource(
488
493
  // Create Cloudflare API client with automatic account discovery
489
494
  const api = await createCloudflareApi(props);
490
495
 
491
- const name = props.name ?? id;
496
+ const name =
497
+ props.name ?? this.output?.name ?? this.scope.createPhysicalName(id);
498
+
499
+ if (this.phase === "update" && this.output.name !== name) {
500
+ console.log("replacing tunnel", this.output.name, name);
501
+ this.replace(true);
502
+ }
492
503
 
493
504
  if (this.phase === "delete") {
494
505
  // For delete operations, check if the tunnel ID exists in the output
@@ -14,8 +14,10 @@ import {
14
14
  export interface VectorizeIndexProps extends CloudflareApiOptions {
15
15
  /**
16
16
  * Name of the index
17
+ *
18
+ * @default ${app}-${stage}-${id}
17
19
  */
18
- name: string;
20
+ name?: string;
19
21
 
20
22
  /**
21
23
  * Optional description of the index
@@ -68,6 +70,11 @@ export interface VectorizeIndex
68
70
  */
69
71
  id: string;
70
72
 
73
+ /**
74
+ * Name of the Vectorize Index.
75
+ */
76
+ name: string;
77
+
71
78
  /**
72
79
  * Time at which the index was created
73
80
  */
@@ -121,7 +128,8 @@ export const VectorizeIndex = Resource(
121
128
  props: VectorizeIndexProps,
122
129
  ): Promise<VectorizeIndex> {
123
130
  const api = await createCloudflareApi(props);
124
- const indexName = props.name || id;
131
+ const indexName =
132
+ props.name ?? this.output?.name ?? this.scope.createPhysicalName(id);
125
133
 
126
134
  if (this.phase === "delete") {
127
135
  logger.log("Deleting Vectorize index:", indexName);
@@ -145,7 +153,7 @@ export const VectorizeIndex = Resource(
145
153
  } catch (error) {
146
154
  // Check if this is a "index already exists" error and adopt is enabled
147
155
  if (
148
- props.adopt &&
156
+ (props.adopt ?? this.scope.adopt) &&
149
157
  error instanceof CloudflareApiError &&
150
158
  error.message.includes("vectorize.index.duplicate_name")
151
159
  ) {
@@ -158,6 +166,9 @@ export const VectorizeIndex = Resource(
158
166
  }
159
167
  }
160
168
  } else {
169
+ if (this.output.name !== indexName) {
170
+ return this.replace();
171
+ }
161
172
  if (props.delete !== this.props.delete) {
162
173
  // Only allow changing the delete property
163
174
  if (!this.quiet) {