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
@@ -155,7 +155,7 @@ export const Meter = Resource(
155
155
  _logicalId: string,
156
156
  props: MeterProps,
157
157
  ): Promise<Meter> {
158
- const stripe = createStripeClient({ apiKey: props.apiKey });
158
+ const stripe = await createStripeClient({ apiKey: props.apiKey });
159
159
 
160
160
  const currentOutputId = this.output?.id;
161
161
 
@@ -303,7 +303,7 @@ export const Meter = Resource(
303
303
  stripeAPIResponse = await stripe.billing.meters.create(createParams);
304
304
  } catch (error) {
305
305
  logger.warn("Error creating/updating meter:", error);
306
- if (isStripeConflictError(error) && props.adopt) {
306
+ if (isStripeConflictError(error) && (props.adopt ?? this.scope.adopt)) {
307
307
  throw new Error(
308
308
  "Meter adoption is not supported - meters cannot be uniquely identified for adoption",
309
309
  );
@@ -312,7 +312,7 @@ export const PortalConfiguration = Resource(
312
312
  _id: string,
313
313
  props: PortalConfigurationProps,
314
314
  ): Promise<PortalConfiguration> {
315
- const stripe = createStripeClient({ apiKey: props.apiKey });
315
+ const stripe = await createStripeClient({ apiKey: props.apiKey });
316
316
 
317
317
  if (this.phase === "delete") {
318
318
  try {
@@ -499,7 +499,10 @@ export const PortalConfiguration = Resource(
499
499
  configuration =
500
500
  await stripe.billingPortal.configurations.create(createParams);
501
501
  } catch (error) {
502
- if (isStripeConflictError(error) && props.adopt) {
502
+ if (
503
+ isStripeConflictError(error) &&
504
+ (props.adopt ?? this.scope.adopt)
505
+ ) {
503
506
  throw new Error(
504
507
  "PortalConfiguration adoption is not supported - portal configurations cannot be uniquely identified for adoption",
505
508
  );
@@ -353,7 +353,8 @@ export const Price = Resource(
353
353
  _id: string,
354
354
  props: PriceProps,
355
355
  ): Promise<Price> {
356
- const stripe = createStripeClient({ apiKey: props.apiKey });
356
+ const adopt = props.adopt ?? this.scope.adopt;
357
+ const stripe = await createStripeClient({ apiKey: props.apiKey });
357
358
 
358
359
  if (this.phase === "delete") {
359
360
  try {
@@ -475,7 +476,7 @@ export const Price = Resource(
475
476
  limit: 1,
476
477
  });
477
478
  if (existingPrices.data.length > 0) {
478
- if (props.adopt) {
479
+ if (adopt) {
479
480
  const existingPrice = existingPrices.data[0];
480
481
  const updateParams: Stripe.PriceUpdateParams & {
481
482
  expand?: string[];
@@ -97,7 +97,7 @@ export const ProductFeature = Resource(
97
97
  _id: string,
98
98
  props: ProductFeatureProps,
99
99
  ): Promise<ProductFeature> {
100
- const stripe = createStripeClient({ apiKey: props.apiKey });
100
+ const stripe = await createStripeClient({ apiKey: props.apiKey });
101
101
 
102
102
  if (this.phase === "delete") {
103
103
  try {
@@ -124,7 +124,10 @@ export const ProductFeature = Resource(
124
124
  entitlement_feature: props.entitlementFeature,
125
125
  });
126
126
  } catch (error) {
127
- if (isStripeConflictError(error) && props.adopt) {
127
+ if (
128
+ isStripeConflictError(error) &&
129
+ (props.adopt ?? this.scope.adopt)
130
+ ) {
128
131
  throw new Error(
129
132
  "ProductFeature adoption is not supported - product features cannot be uniquely identified for adoption",
130
133
  );
@@ -157,7 +157,8 @@ export const Product = Resource(
157
157
  _id: string,
158
158
  props: ProductProps,
159
159
  ): Promise<Product> {
160
- const stripe = createStripeClient({ apiKey: props.apiKey });
160
+ const adopt = props.adopt ?? this.scope.adopt;
161
+ const stripe = await createStripeClient({ apiKey: props.apiKey });
161
162
 
162
163
  if (this.phase === "delete") {
163
164
  try {
@@ -202,7 +203,7 @@ export const Product = Resource(
202
203
  metadata: props.metadata,
203
204
  tax_code: props.taxCode,
204
205
  };
205
- if (props.adopt) {
206
+ if (adopt) {
206
207
  const existingProducts = await stripe.products.list({
207
208
  limit: 100,
208
209
  });
@@ -156,7 +156,8 @@ export const PromotionCode = Resource(
156
156
  _id: string,
157
157
  props: PromotionCodeProps,
158
158
  ): Promise<PromotionCode> {
159
- const stripe = createStripeClient({ apiKey: props.apiKey });
159
+ const adopt = props.adopt ?? this.scope.adopt;
160
+ const stripe = await createStripeClient({ apiKey: props.apiKey });
160
161
 
161
162
  if (this.phase === "delete") {
162
163
  try {
@@ -203,7 +204,7 @@ export const PromotionCode = Resource(
203
204
  try {
204
205
  promotionCode = await stripe.promotionCodes.create(createParams);
205
206
  } catch (error) {
206
- if (isStripeConflictError(error) && props.adopt) {
207
+ if (isStripeConflictError(error) && adopt) {
207
208
  if (props.code) {
208
209
  const existingPromotionCodes = await stripe.promotionCodes.list({
209
210
  code: props.code,
@@ -209,7 +209,8 @@ export const ShippingRate = Resource(
209
209
  _id: string,
210
210
  props: ShippingRateProps,
211
211
  ): Promise<ShippingRate> {
212
- const stripe = createStripeClient({ apiKey: props.apiKey });
212
+ const adopt = props.adopt ?? this.scope.adopt;
213
+ const stripe = await createStripeClient({ apiKey: props.apiKey });
213
214
 
214
215
  if (this.phase === "delete") {
215
216
  try {
@@ -286,7 +287,7 @@ export const ShippingRate = Resource(
286
287
  try {
287
288
  shippingRate = await stripe.shippingRates.create(createParams);
288
289
  } catch (error) {
289
- if (isStripeConflictError(error) && props.adopt) {
290
+ if (isStripeConflictError(error) && adopt) {
290
291
  throw new Error(
291
292
  "ShippingRate adoption is not supported - shipping rates cannot be uniquely identified for adoption",
292
293
  );
@@ -295,7 +296,7 @@ export const ShippingRate = Resource(
295
296
  }
296
297
  }
297
298
  } catch (error) {
298
- if (isStripeConflictError(error) && props.adopt) {
299
+ if (isStripeConflictError(error) && adopt) {
299
300
  throw new Error(
300
301
  "ShippingRate adoption is not supported - shipping rates cannot be uniquely identified for adoption",
301
302
  );
@@ -143,7 +143,8 @@ export const TaxRate = Resource(
143
143
  _id: string,
144
144
  props: TaxRateProps,
145
145
  ): Promise<TaxRate> {
146
- const stripe = createStripeClient({ apiKey: props.apiKey });
146
+ const adopt = props.adopt ?? this.scope.adopt;
147
+ const stripe = await createStripeClient({ apiKey: props.apiKey });
147
148
 
148
149
  if (this.phase === "delete") {
149
150
  try {
@@ -185,7 +186,7 @@ export const TaxRate = Resource(
185
186
  tax_type: props.taxType,
186
187
  });
187
188
  } catch (error) {
188
- if (isStripeConflictError(error) && props.adopt) {
189
+ if (isStripeConflictError(error) && adopt) {
189
190
  throw new Error(
190
191
  "TaxRate adoption is not supported - tax rates cannot be uniquely identified for adoption",
191
192
  );
@@ -155,7 +155,8 @@ export const WebhookEndpoint = Resource(
155
155
  _id: string,
156
156
  props: WebhookEndpointProps,
157
157
  ) {
158
- const stripe = createStripeClient({ apiKey: props.apiKey });
158
+ const adopt = props.adopt ?? this.scope.adopt;
159
+ const stripe = await createStripeClient({ apiKey: props.apiKey });
159
160
 
160
161
  if (this.phase === "delete") {
161
162
  try {
@@ -197,7 +198,7 @@ export const WebhookEndpoint = Resource(
197
198
  try {
198
199
  webhook = await stripe.webhookEndpoints.create(createParams);
199
200
  } catch (error) {
200
- if (isStripeConflictError(error) && props.adopt) {
201
+ if (isStripeConflictError(error) && adopt) {
201
202
  const existingWebhooks = await stripe.webhookEndpoints.list({
202
203
  limit: 100,
203
204
  });
@@ -223,7 +224,7 @@ export const WebhookEndpoint = Resource(
223
224
  }
224
225
  }
225
226
  } catch (error) {
226
- if (isStripeConflictError(error) && props.adopt) {
227
+ if (isStripeConflictError(error) && adopt) {
227
228
  const existingWebhooks = await stripe.webhookEndpoints.list({
228
229
  limit: 100,
229
230
  });
@@ -131,6 +131,7 @@ export function test(
131
131
  phase: "up",
132
132
  telemetryClient: new NoopTelemetryClient(),
133
133
  quiet: defaultOptions.quiet,
134
+ password: process.env.ALCHEMY_PASSWORD,
134
135
  });
135
136
 
136
137
  test.beforeAll = (fn: (scope: Scope) => Promise<void>) => {
@@ -26,8 +26,10 @@ export type UpstashRegion =
26
26
  export interface UpstashRedisProps {
27
27
  /**
28
28
  * Name of the database
29
+ *
30
+ * @default ${app}-${stage}-${id}
29
31
  */
30
- name: string;
32
+ name?: string;
31
33
 
32
34
  /**
33
35
  * Primary region for the database
@@ -71,6 +73,11 @@ export interface UpstashRedis
71
73
  */
72
74
  id: string;
73
75
 
76
+ /**
77
+ * Name of the database.
78
+ */
79
+ name: string;
80
+
74
81
  /**
75
82
  * Type of the database in terms of pricing model
76
83
  */
@@ -157,7 +164,7 @@ export const UpstashRedis = Resource(
157
164
  "upstash::Redis",
158
165
  async function (
159
166
  this: Context<UpstashRedis>,
160
- _id: string,
167
+ id: string,
161
168
  props: UpstashRedisProps,
162
169
  ): Promise<UpstashRedis> {
163
170
  const api = new UpstashApi({
@@ -165,6 +172,9 @@ export const UpstashRedis = Resource(
165
172
  email: props.email,
166
173
  });
167
174
 
175
+ const databaseName =
176
+ props.name ?? this.output?.name ?? this.scope.createPhysicalName(id);
177
+
168
178
  if (this.phase === "delete") {
169
179
  await deleteRedisDatabase(api, this.output.id);
170
180
  return this.destroy();
@@ -177,8 +187,8 @@ export const UpstashRedis = Resource(
177
187
 
178
188
  if (this.phase === "update") {
179
189
  // Update name if changed
180
- if (props.name !== this.output.name) {
181
- await renameRedisDatabase(api, this.output.id, props.name);
190
+ if (databaseName !== this.output.name) {
191
+ await renameRedisDatabase(api, this.output.id, databaseName);
182
192
  }
183
193
 
184
194
  // Update read regions if changed
@@ -208,7 +218,7 @@ export const UpstashRedis = Resource(
208
218
  if (this.phase === "create") {
209
219
  database = await createRedisDatabase(api, {
210
220
  budget: props.budget,
211
- name: props.name,
221
+ name: databaseName,
212
222
  primary_region: props.primaryRegion,
213
223
  read_regions: props.readRegions,
214
224
  region: "global",
@@ -515,7 +515,9 @@ class RuleManager {
515
515
 
516
516
  makeArray(
517
517
  isString(pattern) ? splitPattern(pattern) : (pattern as any),
518
- ).forEach((p) => this._add(p));
518
+ ).forEach((p) => {
519
+ this._add(p);
520
+ });
519
521
 
520
522
  return this._added;
521
523
  }
@@ -0,0 +1,53 @@
1
+ import {
2
+ detectPackageManager,
3
+ type PackageManager,
4
+ } from "./detect-package-manager.ts";
5
+
6
+ export class PeerDependencyError extends Error {
7
+ constructor(input: {
8
+ feature?: string;
9
+ missing: string[];
10
+ packageManager?: PackageManager;
11
+ }) {
12
+ super(
13
+ [
14
+ `Missing peer ${input.missing.length} ${input.missing.length === 1 ? "dependency" : "dependencies"}${input.feature ? ` for ${input.feature}` : ""}:`,
15
+ ...input.missing.map((dep) => `- "${dep}"`),
16
+ "",
17
+ "Please install with:",
18
+ ` ${input.packageManager ?? "npm"} install ${input.missing.join(" ")}`,
19
+ ].join("\n"),
20
+ );
21
+ }
22
+ }
23
+
24
+ const extractPackageName = (error: unknown) => {
25
+ const message =
26
+ typeof error === "object" &&
27
+ error !== null &&
28
+ "message" in error &&
29
+ typeof error.message === "string"
30
+ ? error.message
31
+ : undefined;
32
+ const match = message?.match(/Cannot find (package|module) '([^']+)'/);
33
+ return match?.[2];
34
+ };
35
+
36
+ export async function importPeer<T>(promise: Promise<T>, feature?: string) {
37
+ try {
38
+ return await promise;
39
+ } catch (err) {
40
+ const name = extractPackageName(err);
41
+ if (!name) {
42
+ throw err;
43
+ }
44
+ const packageManager = await detectPackageManager();
45
+ const error = new PeerDependencyError({
46
+ feature,
47
+ missing: [name],
48
+ packageManager,
49
+ });
50
+ Error.captureStackTrace(error, importPeer);
51
+ throw error;
52
+ }
53
+ }
@@ -7,7 +7,7 @@ export const TELEMETRY_DISABLED =
7
7
 
8
8
  // TODO(sam): replace with permanent URL
9
9
  export const POSTHOG_CLIENT_API_HOST =
10
- process.env.POSTHOG_CLIENT_API_HOST ?? "https://ph.alchemy.run";
10
+ process.env.ALCHEMY_POSTHOG_CLIENT_API_HOST ?? "https://ph.alchemy.run";
11
11
  export const POSTHOG_PROJECT_ID =
12
- process.env.POSTHOG_PROJECT_ID ??
12
+ process.env.ALCHEMY_POSTHOG_PROJECT_ID ??
13
13
  "phc_A51Mi7Q63TvnNrvRMgvBxE1il0DAL66rVg4LdWPRsfK";
@@ -47,8 +47,10 @@ export interface ProjectProps {
47
47
  *
48
48
  * Maximum length: `100`
49
49
  * Example: `a-project-name`
50
+ *
51
+ * @default ${app}-${stage}-${id}
50
52
  */
51
- name: string;
53
+ name?: string;
52
54
 
53
55
  /**
54
56
  * Opt-in to preview toolbar on the project level
@@ -244,6 +246,11 @@ export interface Project extends Resource<"vercel::Project">, ProjectProps {
244
246
  */
245
247
  id: string;
246
248
 
249
+ /**
250
+ * The name for the project
251
+ */
252
+ name: string;
253
+
247
254
  /**
248
255
  * The account ID that the project belongs to
249
256
  */
@@ -369,6 +376,31 @@ export const Project = Resource(
369
376
  id: string,
370
377
  { accessToken, ...props }: ProjectProps & { accessToken?: Secret },
371
378
  ): Promise<Project> {
379
+ // it's possible that `this.output.name` is undefined because a previous version
380
+ // of alchemy had a bug where it didn't set the name on the output
381
+ // so, we try to find the project by ID and use the name from the API response
382
+ const lookupName = async () => {
383
+ if (!this.output) {
384
+ return undefined;
385
+ } else if (this.output.name) {
386
+ return this.output.name;
387
+ }
388
+ const name = await getProjectName(
389
+ await createVercelApi({
390
+ baseUrl: "https://api.vercel.com/v9",
391
+ accessToken,
392
+ }),
393
+ this.output.id,
394
+ );
395
+ if (name) {
396
+ this.output.name = name;
397
+ }
398
+ return name;
399
+ };
400
+
401
+ const projectName =
402
+ props.name ?? (await lookupName()) ?? this.scope.createPhysicalName(id);
403
+
372
404
  switch (this.phase) {
373
405
  case "delete": {
374
406
  const api = await createVercelApi({
@@ -423,6 +455,7 @@ export const Project = Resource(
423
455
 
424
456
  return this({
425
457
  id: data.id,
458
+ name: projectName,
426
459
  accountId: data.accountId,
427
460
  createdAt: data.createdAt,
428
461
  updatedAt: data.updatedAt,
@@ -492,3 +525,15 @@ export async function updateEnvironmentVariables(
492
525
  await api.delete(`/projects/${output.id}/env/${previousEnv.id}`);
493
526
  }
494
527
  }
528
+
529
+ async function getProjectName(
530
+ api: VercelApi,
531
+ id: string,
532
+ ): Promise<string | undefined> {
533
+ const response = await api.get(`/v9/projects/${id}`);
534
+ if (!response.ok) {
535
+ throw new Error(`API error: ${response.statusText}`);
536
+ }
537
+
538
+ return ((await response.json()) as { name: string }).name;
539
+ }
@@ -24,4 +24,5 @@ pnpm-debug.log*
24
24
  .idea/
25
25
 
26
26
  .alchemy/
27
- .env
27
+ .env
28
+ .wrangler/
@@ -0,0 +1,19 @@
1
+ ### Minimal Hono + Alchemy Template
2
+
3
+ ### Run
4
+ - bun install
5
+ - bun run dev
6
+
7
+ ### Deploy
8
+ - bun run deploy
9
+ - bun run destroy
10
+
11
+ ### Alchemy
12
+ - Resource: defined in `alchemy.run.ts` (Worker + KV)
13
+ - Binding: `KV` bound to Worker as `c.env.KV`
14
+ - Types: inferred in `types/env.d.ts`
15
+
16
+ ### References
17
+ - Alchemy Getting Started: https://alchemy.run/getting-started
18
+ - Alchemy CLI: https://alchemy.run/concepts/cli
19
+ - Bindings: https://alchemy.run/concepts/bindings
@@ -0,0 +1 @@
1
+ ALCHEMY_PASSWORD=change-me
@@ -0,0 +1 @@
1
+ ALCHEMY_PASSWORD=change-me
@@ -0,0 +1,34 @@
1
+ # prod
2
+ dist/
3
+
4
+ # dev
5
+ .yarn/
6
+ !.yarn/releases
7
+ .vscode/*
8
+ !.vscode/launch.json
9
+ !.vscode/*.code-snippets
10
+ .idea/workspace.xml
11
+ .idea/usage.statistics.xml
12
+ .idea/shelf
13
+
14
+ # deps
15
+ node_modules/
16
+ .wrangler
17
+ .alchemy
18
+
19
+ # env
20
+ .env
21
+ .env.production
22
+ .dev.vars
23
+
24
+ # logs
25
+ logs/
26
+ *.log
27
+ npm-debug.log*
28
+ yarn-debug.log*
29
+ yarn-error.log*
30
+ pnpm-debug.log*
31
+ lerna-debug.log*
32
+
33
+ # misc
34
+ .DS_Store
@@ -0,0 +1,22 @@
1
+ /// <reference types="@types/node" />
2
+
3
+ import alchemy from "alchemy";
4
+ import { KVNamespace, Worker } from "alchemy/cloudflare";
5
+
6
+ const app = await alchemy("{projectName}");
7
+
8
+ const kv = await KVNamespace("kv", {
9
+ title: "kv",
10
+ });
11
+
12
+ export const worker = await Worker("worker", {
13
+ name: `${app.name}-${app.stage}`,
14
+ entrypoint: "src/index.ts",
15
+ bindings: {
16
+ KV: kv,
17
+ },
18
+ });
19
+
20
+ console.log(worker.url);
21
+
22
+ await app.finalize();
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "@alchemy.run/hono-template",
3
+ "type": "module",
4
+ "scripts": {
5
+ "check": "tsc --noEmit",
6
+ "dev": "alchemy dev",
7
+ "deploy": "alchemy deploy",
8
+ "destroy": "alchemy destroy"
9
+ },
10
+ "dependencies": {
11
+ "hono": "^4.9.2"
12
+ },
13
+ "devDependencies": {
14
+ "@cloudflare/workers-types": "^4.20250820.0",
15
+ "@types/node": "^24.3.0",
16
+ "alchemy": "workspace:*"
17
+ }
18
+ }
@@ -0,0 +1,17 @@
1
+ import { Hono } from 'hono'
2
+
3
+ const app = new Hono<{ Bindings: Env }>()
4
+
5
+ app.get('/', (c) => {
6
+ return c.text('Hello Hono!')
7
+ })
8
+
9
+ app.get('/kv', async (c) => {
10
+ const key = 'hello'
11
+ const value = `world@${Date.now()}`
12
+ await c.env.KV.put(key, value)
13
+ const got = await c.env.KV.get(key)
14
+ return c.json({ key, value: got })
15
+ })
16
+
17
+ export default app
@@ -0,0 +1,13 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ESNext",
4
+ "module": "ESNext",
5
+ "moduleResolution": "Bundler",
6
+ "strict": true,
7
+ "skipLibCheck": true,
8
+ "lib": ["ESNext"],
9
+ "jsx": "react-jsx",
10
+ "jsxImportSource": "hono/jsx",
11
+ "types": ["@cloudflare/workers-types"]
12
+ }
13
+ }
@@ -0,0 +1,16 @@
1
+ // This file infers types for the cloudflare:workers environment from your Alchemy Worker.
2
+ // @see https://alchemy.run/concepts/bindings/#type-safe-bindings
3
+
4
+ import type { worker } from "../alchemy.run.ts";
5
+
6
+ export type CloudflareEnv = typeof worker.Env;
7
+
8
+ declare global {
9
+ type Env = CloudflareEnv;
10
+ }
11
+
12
+ declare module "cloudflare:workers" {
13
+ namespace Cloudflare {
14
+ export interface Env extends CloudflareEnv {}
15
+ }
16
+ }
@@ -24,4 +24,5 @@ logs
24
24
  !.env.example
25
25
 
26
26
  .alchemy/
27
- .env
27
+ .env
28
+ .wrangler/
@@ -13,3 +13,4 @@
13
13
 
14
14
  .alchemy/
15
15
  .env
16
+ .wrangler/
@@ -1,14 +1,16 @@
1
1
  import { reactRouter } from "@react-router/dev/vite";
2
2
  import tailwindcss from "@tailwindcss/vite";
3
3
  import alchemy from "alchemy/cloudflare/react-router";
4
- import { defineConfig } from "vite";
4
+ import { defineConfig, type PluginOption } from "vite";
5
5
  import tsconfigPaths from "vite-tsconfig-paths";
6
6
 
7
7
  export default defineConfig({
8
8
  plugins: [
9
- alchemy(),
9
+ alchemy() as PluginOption,
10
10
  tailwindcss(),
11
11
  reactRouter(),
12
- tsconfigPaths(),
12
+ tsconfigPaths({
13
+ root: "."
14
+ }),
13
15
  ],
14
16
  });
@@ -63,9 +63,8 @@ coverage
63
63
  *.tmp
64
64
  *.temp
65
65
 
66
- .wrangler
67
-
68
66
  generated/
69
67
 
70
68
  .alchemy/
71
- .env
69
+ .env
70
+ .wrangler/
@@ -23,4 +23,5 @@ vite.config.js.timestamp-*
23
23
  vite.config.ts.timestamp-*
24
24
 
25
25
  .alchemy/
26
- .env
26
+ .env
27
+ .wrangler/
@@ -19,4 +19,5 @@ yarn.lock
19
19
  /playwright/.cache/
20
20
  .tanstack
21
21
  .alchemy/
22
- .env
22
+ .env
23
+ .wrangler/
@@ -34,4 +34,5 @@ report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json
34
34
  .DS_Store
35
35
 
36
36
  .alchemy/
37
- .env
37
+ .env
38
+ .wrangler/
@@ -24,4 +24,5 @@ dist-ssr
24
24
  *.sw?
25
25
 
26
26
  .alchemy/
27
- .env
27
+ .env
28
+ .wrangler/