alchemy 0.62.2 → 0.63.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (611) hide show
  1. package/bin/alchemy.js +1518 -1204
  2. package/bin/commands/deploy.ts +2 -0
  3. package/bin/commands/dev.ts +2 -0
  4. package/bin/services/execute-alchemy.ts +11 -0
  5. package/bin/services/template-manager.ts +2 -0
  6. package/bin/types.ts +2 -1
  7. package/lib/alchemy.d.ts +6 -22
  8. package/lib/alchemy.d.ts.map +1 -1
  9. package/lib/alchemy.js +65 -169
  10. package/lib/alchemy.js.map +1 -1
  11. package/lib/apply.d.ts +0 -2
  12. package/lib/apply.d.ts.map +1 -1
  13. package/lib/apply.js +2 -16
  14. package/lib/apply.js.map +1 -1
  15. package/lib/aws/account-id.d.ts.map +1 -1
  16. package/lib/aws/account-id.js +3 -2
  17. package/lib/aws/account-id.js.map +1 -1
  18. package/lib/aws/bucket.d.ts +8 -2
  19. package/lib/aws/bucket.d.ts.map +1 -1
  20. package/lib/aws/bucket.js +21 -14
  21. package/lib/aws/bucket.js.map +1 -1
  22. package/lib/aws/ec2/security-group.d.ts +8 -2
  23. package/lib/aws/ec2/security-group.d.ts.map +1 -1
  24. package/lib/aws/ec2/security-group.js +7 -2
  25. package/lib/aws/ec2/security-group.js.map +1 -1
  26. package/lib/aws/function.d.ts +9 -3
  27. package/lib/aws/function.d.ts.map +1 -1
  28. package/lib/aws/function.js +35 -26
  29. package/lib/aws/function.js.map +1 -1
  30. package/lib/aws/policy-attachment.d.ts.map +1 -1
  31. package/lib/aws/policy-attachment.js +2 -1
  32. package/lib/aws/policy-attachment.js.map +1 -1
  33. package/lib/aws/policy.d.ts +8 -2
  34. package/lib/aws/policy.d.ts.map +1 -1
  35. package/lib/aws/policy.js +13 -4
  36. package/lib/aws/policy.js.map +1 -1
  37. package/lib/aws/queue.d.ts +8 -2
  38. package/lib/aws/queue.d.ts.map +1 -1
  39. package/lib/aws/queue.js +22 -14
  40. package/lib/aws/queue.js.map +1 -1
  41. package/lib/aws/role.d.ts +8 -2
  42. package/lib/aws/role.d.ts.map +1 -1
  43. package/lib/aws/role.js +10 -3
  44. package/lib/aws/role.js.map +1 -1
  45. package/lib/aws/ses.d.ts +1 -1
  46. package/lib/aws/ses.d.ts.map +1 -1
  47. package/lib/aws/ses.js +2 -1
  48. package/lib/aws/ses.js.map +1 -1
  49. package/lib/aws/ssm-parameter.d.ts +8 -2
  50. package/lib/aws/ssm-parameter.d.ts.map +1 -1
  51. package/lib/aws/ssm-parameter.js +15 -10
  52. package/lib/aws/ssm-parameter.js.map +1 -1
  53. package/lib/aws/table.d.ts +8 -2
  54. package/lib/aws/table.d.ts.map +1 -1
  55. package/lib/aws/table.js +17 -9
  56. package/lib/aws/table.js.map +1 -1
  57. package/lib/cloudflare/account-api-token.d.ts +2 -2
  58. package/lib/cloudflare/account-api-token.d.ts.map +1 -1
  59. package/lib/cloudflare/account-api-token.js +7 -6
  60. package/lib/cloudflare/account-api-token.js.map +1 -1
  61. package/lib/cloudflare/ai-gateway.d.ts +9 -4
  62. package/lib/cloudflare/ai-gateway.d.ts.map +1 -1
  63. package/lib/cloudflare/ai-gateway.js +20 -24
  64. package/lib/cloudflare/ai-gateway.js.map +1 -1
  65. package/lib/cloudflare/api-schema.d.ts +2 -2
  66. package/lib/cloudflare/api-schema.d.ts.map +1 -1
  67. package/lib/cloudflare/api-schema.js +6 -2
  68. package/lib/cloudflare/api-schema.js.map +1 -1
  69. package/lib/cloudflare/api-shield.d.ts +5 -1
  70. package/lib/cloudflare/api-shield.d.ts.map +1 -1
  71. package/lib/cloudflare/api-shield.js +6 -1
  72. package/lib/cloudflare/api-shield.js.map +1 -1
  73. package/lib/cloudflare/assets.d.ts +1 -1
  74. package/lib/cloudflare/assets.d.ts.map +1 -1
  75. package/lib/cloudflare/astro/astro.d.ts.map +1 -1
  76. package/lib/cloudflare/astro/astro.js +3 -1
  77. package/lib/cloudflare/astro/astro.js.map +1 -1
  78. package/lib/cloudflare/astro/plugin.d.ts +2 -1
  79. package/lib/cloudflare/astro/plugin.d.ts.map +1 -1
  80. package/lib/cloudflare/astro/plugin.js.map +1 -1
  81. package/lib/cloudflare/bindings.d.ts +2 -2
  82. package/lib/cloudflare/bindings.d.ts.map +1 -1
  83. package/lib/cloudflare/bound.d.ts +1 -1
  84. package/lib/cloudflare/bound.d.ts.map +1 -1
  85. package/lib/cloudflare/bucket.d.ts +120 -1
  86. package/lib/cloudflare/bucket.d.ts.map +1 -1
  87. package/lib/cloudflare/bucket.js +80 -2
  88. package/lib/cloudflare/bucket.js.map +1 -1
  89. package/lib/cloudflare/compatibility-date.gen.d.ts +1 -1
  90. package/lib/cloudflare/compatibility-date.gen.js +1 -1
  91. package/lib/cloudflare/container.d.ts +10 -4
  92. package/lib/cloudflare/container.d.ts.map +1 -1
  93. package/lib/cloudflare/container.js +12 -9
  94. package/lib/cloudflare/container.js.map +1 -1
  95. package/lib/cloudflare/custom-domain.js +2 -1
  96. package/lib/cloudflare/custom-domain.js.map +1 -1
  97. package/lib/cloudflare/d1-database.d.ts +1 -1
  98. package/lib/cloudflare/d1-database.d.ts.map +1 -1
  99. package/lib/cloudflare/d1-database.js +7 -3
  100. package/lib/cloudflare/d1-database.js.map +1 -1
  101. package/lib/cloudflare/dispatch-namespace.d.ts +2 -0
  102. package/lib/cloudflare/dispatch-namespace.d.ts.map +1 -1
  103. package/lib/cloudflare/dispatch-namespace.js +7 -5
  104. package/lib/cloudflare/dispatch-namespace.js.map +1 -1
  105. package/lib/cloudflare/hyperdrive.d.ts +7 -1
  106. package/lib/cloudflare/hyperdrive.d.ts.map +1 -1
  107. package/lib/cloudflare/hyperdrive.js +2 -1
  108. package/lib/cloudflare/hyperdrive.js.map +1 -1
  109. package/lib/cloudflare/kv-namespace.d.ts +3 -0
  110. package/lib/cloudflare/kv-namespace.d.ts.map +1 -1
  111. package/lib/cloudflare/kv-namespace.js +11 -2
  112. package/lib/cloudflare/kv-namespace.js.map +1 -1
  113. package/lib/cloudflare/miniflare/miniflare-worker-proxy.js +3 -1
  114. package/lib/cloudflare/miniflare/miniflare-worker-proxy.js.map +1 -1
  115. package/lib/cloudflare/miniflare/paths.d.ts +4 -0
  116. package/lib/cloudflare/miniflare/paths.d.ts.map +1 -1
  117. package/lib/cloudflare/miniflare/paths.js +11 -0
  118. package/lib/cloudflare/miniflare/paths.js.map +1 -1
  119. package/lib/cloudflare/pipeline.d.ts +14 -3
  120. package/lib/cloudflare/pipeline.d.ts.map +1 -1
  121. package/lib/cloudflare/pipeline.js +31 -2
  122. package/lib/cloudflare/pipeline.js.map +1 -1
  123. package/lib/cloudflare/queue-consumer.js +1 -1
  124. package/lib/cloudflare/queue-consumer.js.map +1 -1
  125. package/lib/cloudflare/queue.d.ts +6 -4
  126. package/lib/cloudflare/queue.d.ts.map +1 -1
  127. package/lib/cloudflare/queue.js +13 -9
  128. package/lib/cloudflare/queue.js.map +1 -1
  129. package/lib/cloudflare/react-router/plugin.d.ts +1 -1
  130. package/lib/cloudflare/react-router/plugin.d.ts.map +1 -1
  131. package/lib/cloudflare/react-router/react-router.d.ts.map +1 -1
  132. package/lib/cloudflare/react-router/react-router.js +32 -2
  133. package/lib/cloudflare/react-router/react-router.js.map +1 -1
  134. package/lib/cloudflare/redwood/plugin.d.ts +2 -1
  135. package/lib/cloudflare/redwood/plugin.d.ts.map +1 -1
  136. package/lib/cloudflare/redwood/plugin.js.map +1 -1
  137. package/lib/cloudflare/route.js +1 -1
  138. package/lib/cloudflare/route.js.map +1 -1
  139. package/lib/cloudflare/ruleset.d.ts +3 -1
  140. package/lib/cloudflare/ruleset.d.ts.map +1 -1
  141. package/lib/cloudflare/ruleset.js +3 -2
  142. package/lib/cloudflare/ruleset.js.map +1 -1
  143. package/lib/cloudflare/secret.d.ts +6 -23
  144. package/lib/cloudflare/secret.d.ts.map +1 -1
  145. package/lib/cloudflare/secret.js +8 -4
  146. package/lib/cloudflare/secret.js.map +1 -1
  147. package/lib/cloudflare/secrets-store.d.ts +1 -1
  148. package/lib/cloudflare/secrets-store.d.ts.map +1 -1
  149. package/lib/cloudflare/secrets-store.js +5 -2
  150. package/lib/cloudflare/secrets-store.js.map +1 -1
  151. package/lib/cloudflare/tunnel.d.ts +5 -1
  152. package/lib/cloudflare/tunnel.d.ts.map +1 -1
  153. package/lib/cloudflare/tunnel.js +5 -1
  154. package/lib/cloudflare/tunnel.js.map +1 -1
  155. package/lib/cloudflare/vectorize-index.d.ts +7 -1
  156. package/lib/cloudflare/vectorize-index.d.ts.map +1 -1
  157. package/lib/cloudflare/vectorize-index.js +5 -2
  158. package/lib/cloudflare/vectorize-index.js.map +1 -1
  159. package/lib/cloudflare/vite/plugin.d.ts +2 -1
  160. package/lib/cloudflare/vite/plugin.d.ts.map +1 -1
  161. package/lib/cloudflare/vite/plugin.js.map +1 -1
  162. package/lib/cloudflare/vite/vite.d.ts +1 -1
  163. package/lib/cloudflare/vite/vite.d.ts.map +1 -1
  164. package/lib/cloudflare/vite/vite.js +1 -1
  165. package/lib/cloudflare/vite/vite.js.map +1 -1
  166. package/lib/cloudflare/website.js +1 -1
  167. package/lib/cloudflare/website.js.map +1 -1
  168. package/lib/cloudflare/worker.d.ts +1 -1
  169. package/lib/cloudflare/worker.d.ts.map +1 -1
  170. package/lib/cloudflare/worker.js +12 -7
  171. package/lib/cloudflare/worker.js.map +1 -1
  172. package/lib/cloudflare/wrangler.json.d.ts +1 -1
  173. package/lib/cloudflare/wrangler.json.d.ts.map +1 -1
  174. package/lib/cloudflare/wrangler.json.js +5 -3
  175. package/lib/cloudflare/wrangler.json.js.map +1 -1
  176. package/lib/docker/container.d.ts +6 -0
  177. package/lib/docker/container.d.ts.map +1 -1
  178. package/lib/docker/container.js +5 -1
  179. package/lib/docker/container.js.map +1 -1
  180. package/lib/docker/network.d.ts +8 -2
  181. package/lib/docker/network.d.ts.map +1 -1
  182. package/lib/docker/network.js +7 -2
  183. package/lib/docker/network.js.map +1 -1
  184. package/lib/docker/volume.d.ts +8 -2
  185. package/lib/docker/volume.d.ts.map +1 -1
  186. package/lib/docker/volume.js +6 -4
  187. package/lib/docker/volume.js.map +1 -1
  188. package/lib/esbuild/bundle.d.ts +1 -1
  189. package/lib/fs/index.d.ts +0 -8
  190. package/lib/fs/index.d.ts.map +1 -1
  191. package/lib/fs/index.js +0 -8
  192. package/lib/fs/index.js.map +1 -1
  193. package/lib/github/client.d.ts +1 -1
  194. package/lib/github/client.d.ts.map +1 -1
  195. package/lib/github/client.js +2 -1
  196. package/lib/github/client.js.map +1 -1
  197. package/lib/github/repository-environment.d.ts +8 -2
  198. package/lib/github/repository-environment.d.ts.map +1 -1
  199. package/lib/github/repository-environment.js +16 -12
  200. package/lib/github/repository-environment.js.map +1 -1
  201. package/lib/neon/project.d.ts +7 -1
  202. package/lib/neon/project.d.ts.map +1 -1
  203. package/lib/neon/project.js +10 -6
  204. package/lib/neon/project.js.map +1 -1
  205. package/lib/planetscale/branch.d.ts +4 -2
  206. package/lib/planetscale/branch.d.ts.map +1 -1
  207. package/lib/planetscale/branch.js +18 -12
  208. package/lib/planetscale/branch.js.map +1 -1
  209. package/lib/planetscale/database.d.ts +8 -2
  210. package/lib/planetscale/database.d.ts.map +1 -1
  211. package/lib/planetscale/database.js +24 -16
  212. package/lib/planetscale/database.js.map +1 -1
  213. package/lib/planetscale/password.d.ts +8 -2
  214. package/lib/planetscale/password.d.ts.map +1 -1
  215. package/lib/planetscale/password.js +2 -2
  216. package/lib/planetscale/password.js.map +1 -1
  217. package/lib/resource.d.ts +0 -2
  218. package/lib/resource.d.ts.map +1 -1
  219. package/lib/resource.js +1 -9
  220. package/lib/resource.js.map +1 -1
  221. package/lib/scope.d.ts +9 -3
  222. package/lib/scope.d.ts.map +1 -1
  223. package/lib/scope.js +21 -34
  224. package/lib/scope.js.map +1 -1
  225. package/lib/sentry/client-key.d.ts +7 -1
  226. package/lib/sentry/client-key.d.ts.map +1 -1
  227. package/lib/sentry/client-key.js +45 -6
  228. package/lib/sentry/client-key.js.map +1 -1
  229. package/lib/sentry/project.d.ts +8 -2
  230. package/lib/sentry/project.d.ts.map +1 -1
  231. package/lib/sentry/project.js +35 -5
  232. package/lib/sentry/project.js.map +1 -1
  233. package/lib/sentry/team.d.ts +8 -2
  234. package/lib/sentry/team.d.ts.map +1 -1
  235. package/lib/sentry/team.js +36 -6
  236. package/lib/sentry/team.js.map +1 -1
  237. package/lib/serde.d.ts +0 -5
  238. package/lib/serde.d.ts.map +1 -1
  239. package/lib/serde.js +0 -28
  240. package/lib/serde.js.map +1 -1
  241. package/lib/state/d1-state-store.d.ts +1 -1
  242. package/lib/state/d1-state-store.d.ts.map +1 -1
  243. package/lib/state/d1-state-store.js +5 -5
  244. package/lib/state/d1-state-store.js.map +1 -1
  245. package/lib/state/sqlite-state-store.d.ts.map +1 -1
  246. package/lib/state/sqlite-state-store.js +7 -11
  247. package/lib/state/sqlite-state-store.js.map +1 -1
  248. package/lib/stripe/card.d.ts.map +1 -1
  249. package/lib/stripe/card.js +3 -2
  250. package/lib/stripe/card.js.map +1 -1
  251. package/lib/stripe/client.d.ts +2 -2
  252. package/lib/stripe/client.d.ts.map +1 -1
  253. package/lib/stripe/client.js +4 -3
  254. package/lib/stripe/client.js.map +1 -1
  255. package/lib/stripe/coupon.d.ts.map +1 -1
  256. package/lib/stripe/coupon.js +4 -3
  257. package/lib/stripe/coupon.js.map +1 -1
  258. package/lib/stripe/customer.js +2 -2
  259. package/lib/stripe/customer.js.map +1 -1
  260. package/lib/stripe/entitlements-feature.d.ts.map +1 -1
  261. package/lib/stripe/entitlements-feature.js +3 -2
  262. package/lib/stripe/entitlements-feature.js.map +1 -1
  263. package/lib/stripe/file.d.ts.map +1 -1
  264. package/lib/stripe/file.js +3 -2
  265. package/lib/stripe/file.js.map +1 -1
  266. package/lib/stripe/meter.js +2 -2
  267. package/lib/stripe/meter.js.map +1 -1
  268. package/lib/stripe/portal-configuration.d.ts.map +1 -1
  269. package/lib/stripe/portal-configuration.js +3 -2
  270. package/lib/stripe/portal-configuration.js.map +1 -1
  271. package/lib/stripe/price.d.ts.map +1 -1
  272. package/lib/stripe/price.js +3 -2
  273. package/lib/stripe/price.js.map +1 -1
  274. package/lib/stripe/product-feature.d.ts.map +1 -1
  275. package/lib/stripe/product-feature.js +3 -2
  276. package/lib/stripe/product-feature.js.map +1 -1
  277. package/lib/stripe/product.d.ts.map +1 -1
  278. package/lib/stripe/product.js +3 -2
  279. package/lib/stripe/product.js.map +1 -1
  280. package/lib/stripe/promotion-code.d.ts.map +1 -1
  281. package/lib/stripe/promotion-code.js +3 -2
  282. package/lib/stripe/promotion-code.js.map +1 -1
  283. package/lib/stripe/shipping-rate.d.ts.map +1 -1
  284. package/lib/stripe/shipping-rate.js +4 -3
  285. package/lib/stripe/shipping-rate.js.map +1 -1
  286. package/lib/stripe/tax-rate.d.ts.map +1 -1
  287. package/lib/stripe/tax-rate.js +3 -2
  288. package/lib/stripe/tax-rate.js.map +1 -1
  289. package/lib/stripe/webhook.d.ts.map +1 -1
  290. package/lib/stripe/webhook.js +4 -3
  291. package/lib/stripe/webhook.js.map +1 -1
  292. package/lib/test/vitest.d.ts.map +1 -1
  293. package/lib/test/vitest.js +1 -0
  294. package/lib/test/vitest.js.map +1 -1
  295. package/lib/upstash/redis.d.ts +8 -2
  296. package/lib/upstash/redis.d.ts.map +1 -1
  297. package/lib/upstash/redis.js +5 -4
  298. package/lib/upstash/redis.js.map +1 -1
  299. package/lib/util/ignore-matcher.d.ts.map +1 -1
  300. package/lib/util/ignore-matcher.js +3 -1
  301. package/lib/util/ignore-matcher.js.map +1 -1
  302. package/lib/util/peer.d.ts +10 -0
  303. package/lib/util/peer.d.ts.map +1 -0
  304. package/lib/util/peer.js +42 -0
  305. package/lib/util/peer.js.map +1 -0
  306. package/lib/util/telemetry/constants.d.ts.map +1 -1
  307. package/lib/util/telemetry/constants.js +2 -2
  308. package/lib/util/telemetry/constants.js.map +1 -1
  309. package/lib/vercel/project.d.ts +7 -1
  310. package/lib/vercel/project.d.ts.map +1 -1
  311. package/lib/vercel/project.js +28 -0
  312. package/lib/vercel/project.js.map +1 -1
  313. package/package.json +88 -74
  314. package/src/alchemy.ts +76 -222
  315. package/src/apply.ts +6 -19
  316. package/src/aws/account-id.ts +6 -3
  317. package/src/aws/bucket.ts +43 -32
  318. package/src/aws/ec2/security-group.ts +15 -3
  319. package/src/aws/function.ts +65 -39
  320. package/src/aws/policy-attachment.ts +10 -6
  321. package/src/aws/policy.ts +33 -15
  322. package/src/aws/queue.ts +50 -29
  323. package/src/aws/role.ts +37 -20
  324. package/src/aws/ses.ts +24 -20
  325. package/src/aws/ssm-parameter.ts +40 -20
  326. package/src/aws/table.ts +35 -17
  327. package/src/cloudflare/account-api-token.ts +9 -7
  328. package/src/cloudflare/ai-gateway.ts +37 -34
  329. package/src/cloudflare/api-schema.ts +33 -26
  330. package/src/cloudflare/api-shield.ts +15 -2
  331. package/src/cloudflare/astro/astro.ts +5 -1
  332. package/src/cloudflare/astro/plugin.ts +2 -1
  333. package/src/cloudflare/bindings.ts +2 -2
  334. package/src/cloudflare/bound.ts +1 -1
  335. package/src/cloudflare/bucket.ts +242 -3
  336. package/src/cloudflare/compatibility-date.gen.ts +1 -1
  337. package/src/cloudflare/container.ts +23 -12
  338. package/src/cloudflare/custom-domain.ts +2 -2
  339. package/src/cloudflare/d1-database.ts +11 -4
  340. package/src/cloudflare/dispatch-namespace.ts +10 -7
  341. package/src/cloudflare/hyperdrive.ts +13 -3
  342. package/src/cloudflare/kv-namespace.ts +25 -2
  343. package/src/cloudflare/miniflare/miniflare-worker-proxy.ts +3 -1
  344. package/src/cloudflare/miniflare/paths.ts +13 -0
  345. package/src/cloudflare/pipeline.ts +76 -28
  346. package/src/cloudflare/queue-consumer.ts +1 -1
  347. package/src/cloudflare/queue.ts +65 -54
  348. package/src/cloudflare/react-router/react-router.ts +28 -2
  349. package/src/cloudflare/redwood/plugin.ts +3 -2
  350. package/src/cloudflare/route.ts +1 -1
  351. package/src/cloudflare/ruleset.ts +7 -2
  352. package/src/cloudflare/secret.ts +20 -31
  353. package/src/cloudflare/secrets-store.ts +7 -3
  354. package/src/cloudflare/tunnel.ts +13 -2
  355. package/src/cloudflare/vectorize-index.ts +14 -3
  356. package/src/cloudflare/vite/plugin.ts +3 -2
  357. package/src/cloudflare/vite/vite.ts +2 -3
  358. package/src/cloudflare/website.ts +1 -1
  359. package/src/cloudflare/worker.ts +35 -23
  360. package/src/cloudflare/wrangler.json.ts +7 -4
  361. package/src/docker/container.ts +13 -1
  362. package/src/docker/network.ts +18 -3
  363. package/src/docker/volume.ts +17 -6
  364. package/src/fs/index.ts +0 -8
  365. package/src/github/client.ts +6 -2
  366. package/src/github/repository-environment.ts +27 -13
  367. package/src/neon/project.ts +20 -6
  368. package/src/planetscale/branch.ts +24 -13
  369. package/src/planetscale/database.ts +38 -17
  370. package/src/planetscale/password.ts +10 -3
  371. package/src/resource.ts +1 -10
  372. package/src/scope.ts +29 -38
  373. package/src/sentry/client-key.ts +74 -6
  374. package/src/sentry/project.ts +59 -6
  375. package/src/sentry/team.ts +55 -7
  376. package/src/serde.ts +0 -44
  377. package/src/state/d1-state-store.ts +13 -6
  378. package/src/state/sqlite-state-store.ts +16 -17
  379. package/src/stripe/card.ts +5 -2
  380. package/src/stripe/client.ts +10 -3
  381. package/src/stripe/coupon.ts +4 -3
  382. package/src/stripe/customer.ts +2 -2
  383. package/src/stripe/entitlements-feature.ts +5 -2
  384. package/src/stripe/file.ts +3 -2
  385. package/src/stripe/meter.ts +2 -2
  386. package/src/stripe/portal-configuration.ts +5 -2
  387. package/src/stripe/price.ts +3 -2
  388. package/src/stripe/product-feature.ts +5 -2
  389. package/src/stripe/product.ts +3 -2
  390. package/src/stripe/promotion-code.ts +3 -2
  391. package/src/stripe/shipping-rate.ts +4 -3
  392. package/src/stripe/tax-rate.ts +3 -2
  393. package/src/stripe/webhook.ts +4 -3
  394. package/src/test/vitest.ts +1 -0
  395. package/src/upstash/redis.ts +15 -5
  396. package/src/util/ignore-matcher.ts +3 -1
  397. package/src/util/peer.ts +53 -0
  398. package/src/util/telemetry/constants.ts +2 -2
  399. package/src/vercel/project.ts +46 -1
  400. package/templates/astro/_gitignore +2 -1
  401. package/templates/hono/README.md +19 -0
  402. package/templates/hono/_env +1 -0
  403. package/templates/hono/_env.example +1 -0
  404. package/templates/hono/_gitignore +34 -0
  405. package/templates/hono/alchemy.run.ts +22 -0
  406. package/templates/hono/package.json +18 -0
  407. package/templates/hono/src/index.ts +17 -0
  408. package/templates/hono/tsconfig.json +13 -0
  409. package/templates/hono/types/env.d.ts +16 -0
  410. package/templates/nuxt/_gitignore +2 -1
  411. package/templates/react-router/_gitignore +1 -0
  412. package/templates/react-router/vite.config.ts +5 -3
  413. package/templates/rwsdk/_gitignore +2 -3
  414. package/templates/sveltekit/_gitignore +2 -1
  415. package/templates/tanstack-start/_gitignore +2 -1
  416. package/templates/typescript/_gitignore +2 -1
  417. package/templates/vite/_gitignore +2 -1
  418. package/workers/cloudflare-state-store.js +69 -74
  419. package/workers/dofs-state-store.js +1 -1
  420. package/bin/bootstrap-s3.ts +0 -255
  421. package/lib/ai/ark.d.ts +0 -12
  422. package/lib/ai/ark.d.ts.map +0 -1
  423. package/lib/ai/ark.js +0 -87
  424. package/lib/ai/ark.js.map +0 -1
  425. package/lib/ai/astro-file.d.ts +0 -138
  426. package/lib/ai/astro-file.d.ts.map +0 -1
  427. package/lib/ai/astro-file.js +0 -158
  428. package/lib/ai/astro-file.js.map +0 -1
  429. package/lib/ai/client.d.ts +0 -51
  430. package/lib/ai/client.d.ts.map +0 -1
  431. package/lib/ai/client.js +0 -58
  432. package/lib/ai/client.js.map +0 -1
  433. package/lib/ai/css-file.d.ts +0 -132
  434. package/lib/ai/css-file.d.ts.map +0 -1
  435. package/lib/ai/css-file.js +0 -142
  436. package/lib/ai/css-file.js.map +0 -1
  437. package/lib/ai/data.d.ts +0 -152
  438. package/lib/ai/data.d.ts.map +0 -1
  439. package/lib/ai/data.js +0 -120
  440. package/lib/ai/data.js.map +0 -1
  441. package/lib/ai/document.d.ts +0 -208
  442. package/lib/ai/document.d.ts.map +0 -1
  443. package/lib/ai/document.js +0 -206
  444. package/lib/ai/document.js.map +0 -1
  445. package/lib/ai/html-file.d.ts +0 -129
  446. package/lib/ai/html-file.d.ts.map +0 -1
  447. package/lib/ai/html-file.js +0 -139
  448. package/lib/ai/html-file.js.map +0 -1
  449. package/lib/ai/index.d.ts +0 -11
  450. package/lib/ai/index.d.ts.map +0 -1
  451. package/lib/ai/index.js +0 -11
  452. package/lib/ai/index.js.map +0 -1
  453. package/lib/ai/json-file.d.ts +0 -161
  454. package/lib/ai/json-file.d.ts.map +0 -1
  455. package/lib/ai/json-file.js +0 -188
  456. package/lib/ai/json-file.js.map +0 -1
  457. package/lib/ai/typescript-file.d.ts +0 -140
  458. package/lib/ai/typescript-file.d.ts.map +0 -1
  459. package/lib/ai/typescript-file.js +0 -146
  460. package/lib/ai/typescript-file.js.map +0 -1
  461. package/lib/ai/vue-file.d.ts +0 -127
  462. package/lib/ai/vue-file.d.ts.map +0 -1
  463. package/lib/ai/vue-file.js +0 -137
  464. package/lib/ai/vue-file.js.map +0 -1
  465. package/lib/ai/yaml-file.d.ts +0 -170
  466. package/lib/ai/yaml-file.d.ts.map +0 -1
  467. package/lib/ai/yaml-file.js +0 -201
  468. package/lib/ai/yaml-file.js.map +0 -1
  469. package/lib/fs/static-astro-file.d.ts +0 -35
  470. package/lib/fs/static-astro-file.d.ts.map +0 -1
  471. package/lib/fs/static-astro-file.js +0 -40
  472. package/lib/fs/static-astro-file.js.map +0 -1
  473. package/lib/fs/static-css-file.d.ts +0 -25
  474. package/lib/fs/static-css-file.d.ts.map +0 -1
  475. package/lib/fs/static-css-file.js +0 -30
  476. package/lib/fs/static-css-file.js.map +0 -1
  477. package/lib/fs/static-html-file.d.ts +0 -32
  478. package/lib/fs/static-html-file.d.ts.map +0 -1
  479. package/lib/fs/static-html-file.js +0 -37
  480. package/lib/fs/static-html-file.js.map +0 -1
  481. package/lib/fs/static-json-file.d.ts +0 -18
  482. package/lib/fs/static-json-file.d.ts.map +0 -1
  483. package/lib/fs/static-json-file.js +0 -19
  484. package/lib/fs/static-json-file.js.map +0 -1
  485. package/lib/fs/static-text-file.d.ts +0 -13
  486. package/lib/fs/static-text-file.d.ts.map +0 -1
  487. package/lib/fs/static-text-file.js +0 -9
  488. package/lib/fs/static-text-file.js.map +0 -1
  489. package/lib/fs/static-typescript-file.d.ts +0 -20
  490. package/lib/fs/static-typescript-file.d.ts.map +0 -1
  491. package/lib/fs/static-typescript-file.js +0 -16
  492. package/lib/fs/static-typescript-file.js.map +0 -1
  493. package/lib/fs/static-vue-file.d.ts +0 -29
  494. package/lib/fs/static-vue-file.d.ts.map +0 -1
  495. package/lib/fs/static-vue-file.js +0 -34
  496. package/lib/fs/static-vue-file.js.map +0 -1
  497. package/lib/fs/static-yaml-file.d.ts +0 -23
  498. package/lib/fs/static-yaml-file.d.ts.map +0 -1
  499. package/lib/fs/static-yaml-file.js +0 -10
  500. package/lib/fs/static-yaml-file.js.map +0 -1
  501. package/lib/internal/docs/providers.d.ts +0 -34
  502. package/lib/internal/docs/providers.d.ts.map +0 -1
  503. package/lib/internal/docs/providers.js +0 -200
  504. package/lib/internal/docs/providers.js.map +0 -1
  505. package/lib/runtime/bind.d.ts +0 -25
  506. package/lib/runtime/bind.d.ts.map +0 -1
  507. package/lib/runtime/bind.js +0 -76
  508. package/lib/runtime/bind.js.map +0 -1
  509. package/lib/runtime/global.d.ts +0 -8
  510. package/lib/runtime/global.d.ts.map +0 -1
  511. package/lib/runtime/global.js +0 -3
  512. package/lib/runtime/global.js.map +0 -1
  513. package/lib/runtime/plugin.d.ts +0 -35
  514. package/lib/runtime/plugin.d.ts.map +0 -1
  515. package/lib/runtime/plugin.js +0 -134
  516. package/lib/runtime/plugin.js.map +0 -1
  517. package/lib/runtime/shims.d.ts +0 -6
  518. package/lib/runtime/shims.d.ts.map +0 -1
  519. package/lib/runtime/shims.js +0 -27
  520. package/lib/runtime/shims.js.map +0 -1
  521. package/lib/runtime/state.d.ts +0 -5
  522. package/lib/runtime/state.d.ts.map +0 -1
  523. package/lib/runtime/state.js +0 -4
  524. package/lib/runtime/state.js.map +0 -1
  525. package/lib/web/astro.d.ts +0 -148
  526. package/lib/web/astro.d.ts.map +0 -1
  527. package/lib/web/astro.js +0 -419
  528. package/lib/web/astro.js.map +0 -1
  529. package/lib/web/shadcn-component.d.ts +0 -30
  530. package/lib/web/shadcn-component.d.ts.map +0 -1
  531. package/lib/web/shadcn-component.js +0 -25
  532. package/lib/web/shadcn-component.js.map +0 -1
  533. package/lib/web/shadcn.d.ts +0 -98
  534. package/lib/web/shadcn.d.ts.map +0 -1
  535. package/lib/web/shadcn.js +0 -102
  536. package/lib/web/shadcn.js.map +0 -1
  537. package/lib/web/tailwind.d.ts +0 -65
  538. package/lib/web/tailwind.d.ts.map +0 -1
  539. package/lib/web/tailwind.js +0 -98
  540. package/lib/web/tailwind.js.map +0 -1
  541. package/lib/web/vite.d.ts +0 -96
  542. package/lib/web/vite.d.ts.map +0 -1
  543. package/lib/web/vite.js +0 -232
  544. package/lib/web/vite.js.map +0 -1
  545. package/lib/web/vitepress/config.d.ts +0 -12
  546. package/lib/web/vitepress/config.d.ts.map +0 -1
  547. package/lib/web/vitepress/config.js +0 -33
  548. package/lib/web/vitepress/config.js.map +0 -1
  549. package/lib/web/vitepress/custom-theme.d.ts +0 -174
  550. package/lib/web/vitepress/custom-theme.d.ts.map +0 -1
  551. package/lib/web/vitepress/custom-theme.js +0 -337
  552. package/lib/web/vitepress/custom-theme.js.map +0 -1
  553. package/lib/web/vitepress/dependencies.d.ts +0 -13
  554. package/lib/web/vitepress/dependencies.d.ts.map +0 -1
  555. package/lib/web/vitepress/dependencies.js +0 -37
  556. package/lib/web/vitepress/dependencies.js.map +0 -1
  557. package/lib/web/vitepress/home-page.d.ts +0 -247
  558. package/lib/web/vitepress/home-page.d.ts.map +0 -1
  559. package/lib/web/vitepress/home-page.js +0 -146
  560. package/lib/web/vitepress/home-page.js.map +0 -1
  561. package/lib/web/vitepress/index.d.ts +0 -6
  562. package/lib/web/vitepress/index.d.ts.map +0 -1
  563. package/lib/web/vitepress/index.js +0 -6
  564. package/lib/web/vitepress/index.js.map +0 -1
  565. package/lib/web/vitepress/process-front-matter-files.d.ts +0 -19
  566. package/lib/web/vitepress/process-front-matter-files.d.ts.map +0 -1
  567. package/lib/web/vitepress/process-front-matter-files.js +0 -73
  568. package/lib/web/vitepress/process-front-matter-files.js.map +0 -1
  569. package/lib/web/vitepress/vitepress.d.ts +0 -75
  570. package/lib/web/vitepress/vitepress.d.ts.map +0 -1
  571. package/lib/web/vitepress/vitepress.js +0 -254
  572. package/lib/web/vitepress/vitepress.js.map +0 -1
  573. package/src/ai/ark.ts +0 -118
  574. package/src/ai/astro-file.ts +0 -270
  575. package/src/ai/client.ts +0 -117
  576. package/src/ai/css-file.ts +0 -247
  577. package/src/ai/data.ts +0 -221
  578. package/src/ai/document.ts +0 -367
  579. package/src/ai/html-file.ts +0 -244
  580. package/src/ai/index.ts +0 -10
  581. package/src/ai/json-file.ts +0 -325
  582. package/src/ai/typescript-file.ts +0 -259
  583. package/src/ai/vue-file.ts +0 -242
  584. package/src/ai/yaml-file.ts +0 -328
  585. package/src/fs/static-astro-file.ts +0 -45
  586. package/src/fs/static-css-file.ts +0 -35
  587. package/src/fs/static-html-file.ts +0 -42
  588. package/src/fs/static-json-file.ts +0 -38
  589. package/src/fs/static-text-file.ts +0 -23
  590. package/src/fs/static-typescript-file.ts +0 -37
  591. package/src/fs/static-vue-file.ts +0 -39
  592. package/src/fs/static-yaml-file.ts +0 -33
  593. package/src/internal/docs/providers.ts +0 -286
  594. package/src/runtime/bind.ts +0 -95
  595. package/src/runtime/global.ts +0 -10
  596. package/src/runtime/plugin.ts +0 -163
  597. package/src/runtime/shims.js +0 -34
  598. package/src/runtime/state.ts +0 -9
  599. package/src/web/astro.ts +0 -643
  600. package/src/web/shadcn-component.ts +0 -72
  601. package/src/web/shadcn.ts +0 -221
  602. package/src/web/tailwind.ts +0 -167
  603. package/src/web/vite.ts +0 -407
  604. package/src/web/vitepress/config.ts +0 -50
  605. package/src/web/vitepress/custom-theme.ts +0 -514
  606. package/src/web/vitepress/dependencies.ts +0 -69
  607. package/src/web/vitepress/home-page.ts +0 -378
  608. package/src/web/vitepress/index.ts +0 -5
  609. package/src/web/vitepress/process-front-matter-files.ts +0 -107
  610. package/src/web/vitepress/vitepress.ts +0 -372
  611. 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
 
@@ -100,57 +100,56 @@ export function isQueue(eventSource: any): eventSource is Queue {
100
100
  /**
101
101
  * Output returned after Cloudflare Queue creation/update
102
102
  */
103
- export interface Queue<Body = unknown>
104
- extends Resource<"cloudflare::Queue">,
105
- Omit<QueueProps, "dev"> {
106
- /**
107
- * Type identifier for Cloudflare Queue
108
- */
109
- type: "queue";
110
-
111
- /**
112
- * The unique ID of the queue
113
- */
114
- id: string;
115
-
116
- /**
117
- * The name of the queue
118
- */
119
- name: string;
103
+ export type Queue<Body = unknown> = Resource<"cloudflare::Queue"> &
104
+ Omit<QueueProps, "dev"> & {
105
+ /**
106
+ * Type identifier for Cloudflare Queue
107
+ */
108
+ type: "queue";
120
109
 
121
- /**
122
- * Time when the queue was created
123
- */
124
- createdOn: string;
110
+ /**
111
+ * The unique ID of the queue
112
+ */
113
+ id: string;
125
114
 
126
- /**
127
- * Modified timestamp
128
- */
129
- modifiedOn: string;
115
+ /**
116
+ * The name of the queue
117
+ */
118
+ name: string;
130
119
 
131
- /**
132
- * Phantom property to allow type inference
133
- */
134
- Body: Body;
120
+ /**
121
+ * Time when the queue was created
122
+ */
123
+ createdOn: string;
135
124
 
136
- Batch: MessageBatch<Body>;
125
+ /**
126
+ * Modified timestamp
127
+ */
128
+ modifiedOn: string;
137
129
 
138
- /**
139
- * Development mode properties
140
- * @internal
141
- */
142
- dev: {
143
130
  /**
144
- * The ID of the queue in development mode
131
+ * Phantom property to allow type inference
145
132
  */
146
- id: string;
133
+ Body: Body;
134
+
135
+ Batch: MessageBatch<Body>;
147
136
 
148
137
  /**
149
- * Whether the queue is running remotely
138
+ * Development mode properties
139
+ * @internal
150
140
  */
151
- remote: boolean;
141
+ dev: {
142
+ /**
143
+ * The ID of the queue in development mode
144
+ */
145
+ id: string;
146
+
147
+ /**
148
+ * Whether the queue is running remotely
149
+ */
150
+ remote: boolean;
151
+ };
152
152
  };
153
- }
154
153
 
155
154
  /**
156
155
  * Creates and manages Cloudflare Queues.
@@ -249,7 +248,9 @@ const _Queue = Resource("cloudflare::Queue", async function <
249
248
  >(this: Context<Queue<T>>, id: string, props: QueueProps = {}): Promise<
250
249
  Queue<T>
251
250
  > {
252
- const queueName = props.name ?? id;
251
+ const queueName =
252
+ props.name ?? this.output?.name ?? this.scope.createPhysicalName(id);
253
+
253
254
  const dev = {
254
255
  id: this.output?.dev?.id ?? this.output?.id ?? id,
255
256
  remote: props.dev?.remote ?? false,
@@ -286,7 +287,7 @@ const _Queue = Resource("cloudflare::Queue", async function <
286
287
  queueData = await createQueue(api, queueName, props);
287
288
  } catch (error) {
288
289
  if (error instanceof CloudflareApiError && error.status === 409) {
289
- if (!props.adopt) {
290
+ if (!(props.adopt ?? this.scope.adopt)) {
290
291
  throw error;
291
292
  }
292
293
  // Queue already exists, try to find it by name
@@ -297,7 +298,10 @@ const _Queue = Resource("cloudflare::Queue", async function <
297
298
  );
298
299
  }
299
300
  queueData = existingQueue;
300
- queueData = await updateQueue(api, queueData.result.queue_id!, props);
301
+ queueData = await updateQueue(api, queueData.result.queue_id!, {
302
+ ...props,
303
+ name: queueName,
304
+ });
301
305
  } else {
302
306
  throw error;
303
307
  }
@@ -305,15 +309,11 @@ const _Queue = Resource("cloudflare::Queue", async function <
305
309
  } else {
306
310
  // Update operation
307
311
  if (this.output?.id) {
308
- // Check if name is being changed, which is not allowed
309
- if (queueName !== this.output.name) {
310
- throw new Error(
311
- `Cannot update Queue name after creation. Queue name is immutable. Before: ${this.output.name}, After: ${queueName}`,
312
- );
313
- }
314
-
315
312
  // Update the queue with new settings
316
- queueData = await updateQueue(api, this.output.id, props);
313
+ queueData = await updateQueue(api, this.output.id, {
314
+ ...props,
315
+ name: queueName,
316
+ });
317
317
  } else {
318
318
  // If no ID exists, fall back to creating a new queue
319
319
  queueData = await createQueue(api, queueName, props);
@@ -453,10 +453,21 @@ export async function deleteQueue(
453
453
  export async function updateQueue(
454
454
  api: CloudflareApi,
455
455
  queueId: string,
456
- props: QueueProps,
456
+ props: QueueProps & {
457
+ name: string;
458
+ },
457
459
  ): Promise<CloudflareQueueResponse> {
458
460
  // Prepare the update payload - only include settings
459
- 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
+ };
460
471
 
461
472
  // Add settings if provided
462
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) {