alchemy 0.62.3 → 0.63.0

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