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
package/src/alchemy.ts CHANGED
@@ -1,6 +1,3 @@
1
- import fs from "node:fs/promises";
2
- import path from "node:path";
3
-
4
1
  import { execArgv } from "node:process";
5
2
  import { onExit } from "signal-exit";
6
3
  import { ReplacedSignal } from "./apply.ts";
@@ -14,12 +11,10 @@ import {
14
11
  ResourceSeq,
15
12
  type PendingResource,
16
13
  } from "./resource.ts";
17
- import { isRuntime } from "./runtime/global.ts";
18
14
  import { DEFAULT_STAGE, Scope, type ProviderCredentials } from "./scope.ts";
19
15
  import { secret } from "./secret.ts";
20
16
  import type { StateStoreType } from "./state.ts";
21
17
  import type { LoggerApi } from "./util/cli.ts";
22
- import { logger } from "./util/logger.ts";
23
18
  import { TelemetryClient } from "./util/telemetry/client.ts";
24
19
 
25
20
  /**
@@ -71,10 +66,6 @@ export interface Alchemy {
71
66
  * or locally in the current scope.
72
67
  */
73
68
  secret: typeof secret;
74
- /**
75
- * Whether the current runtime is the Cloudflare Workers runtime.
76
- */
77
- isRuntime: boolean;
78
69
 
79
70
  /**
80
71
  * Creates a new application scope with the given name and options.
@@ -95,74 +86,51 @@ export interface Alchemy {
95
86
  * });
96
87
  */
97
88
  (appName: string, options?: Omit<AlchemyOptions, "appName">): Promise<Scope>;
98
- /**
99
- * Template literal tag that supports file interpolation for documentation.
100
- * Automatically formats the content and appends file contents as code blocks.
101
- *
102
- * @example
103
- * // Generate documentation using file contents
104
- * await Document("api-docs", {
105
- * prompt: await alchemy`
106
- * Generate docs using the contents of:
107
- * ${alchemy.file("README.md")}
108
- * ${alchemy.file("./.cursorrules")}
109
- *
110
- * And here are the source files:
111
- * ${alchemy.files(files)}
112
- * `
113
- * });
114
- */
115
- (template: TemplateStringsArray, ...values: any[]): Promise<string>;
116
89
  }
117
90
 
118
91
  _alchemy.destroy = destroy;
119
92
  _alchemy.run = run;
120
93
  _alchemy.secret = secret;
121
94
  _alchemy.env = env;
122
- _alchemy.isRuntime = isRuntime;
123
95
 
124
96
  /**
125
- * Implementation of the alchemy function that handles both application scoping
126
- * and template string interpolation.
97
+ * Implementation of the alchemy function.
127
98
  */
128
99
  async function _alchemy(
129
- ...args:
130
- | [template: TemplateStringsArray, ...values: any[]]
131
- | [appName: string, options?: Omit<AlchemyOptions, "appName">]
132
- ): Promise<Scope | string | never> {
133
- if (typeof args[0] === "string") {
134
- const [appName, options] = args as [string, AlchemyOptions?];
135
-
136
- const cliArgs = process.argv.slice(2);
137
- const cliOptions = {
138
- phase: cliArgs.includes("--destroy")
139
- ? "destroy"
140
- : cliArgs.includes("--read")
141
- ? "read"
142
- : "up",
143
- local: cliArgs.includes("--local") || cliArgs.includes("--dev"),
144
- watch: cliArgs.includes("--watch") || execArgv.includes("--watch"),
145
- quiet: cliArgs.includes("--quiet"),
146
- force: cliArgs.includes("--force"),
147
- // Parse stage argument (--stage my-stage) functionally and inline as a property declaration
148
- stage: (function parseStage() {
149
- const i = cliArgs.indexOf("--stage");
150
- return i !== -1 && i + 1 < cliArgs.length
151
- ? cliArgs[i + 1]
152
- : process.env.STAGE;
153
- })(),
154
- password: process.env.ALCHEMY_PASSWORD,
155
- } satisfies Partial<AlchemyOptions>;
156
- const mergedOptions = {
157
- ...cliOptions,
158
- ...options,
159
- };
160
- if (
161
- mergedOptions.stateStore === undefined &&
162
- process.env.CI &&
163
- process.env.ALCHEMY_CI_STATE_STORE_CHECK !== "false"
164
- ) {
165
- throw new Error(`You are running Alchemy in a CI environment with the default local state store.
100
+ appName: string,
101
+ options?: Omit<AlchemyOptions, "appName">,
102
+ ): Promise<Scope> {
103
+ const cliArgs = process.argv.slice(2);
104
+ const cliOptions = {
105
+ phase: cliArgs.includes("--destroy")
106
+ ? "destroy"
107
+ : cliArgs.includes("--read")
108
+ ? "read"
109
+ : "up",
110
+ local: cliArgs.includes("--local") || cliArgs.includes("--dev"),
111
+ watch: cliArgs.includes("--watch") || execArgv.includes("--watch"),
112
+ quiet: cliArgs.includes("--quiet"),
113
+ force: cliArgs.includes("--force"),
114
+ // Parse stage argument (--stage my-stage) functionally and inline as a property declaration
115
+ stage: (function parseStage() {
116
+ const i = cliArgs.indexOf("--stage");
117
+ return i !== -1 && i + 1 < cliArgs.length
118
+ ? cliArgs[i + 1]
119
+ : process.env.STAGE;
120
+ })(),
121
+ password: process.env.ALCHEMY_PASSWORD,
122
+ adopt: cliArgs.includes("--adopt"),
123
+ } satisfies Partial<AlchemyOptions>;
124
+ const mergedOptions = {
125
+ ...cliOptions,
126
+ ...options,
127
+ };
128
+ if (
129
+ mergedOptions.stateStore === undefined &&
130
+ process.env.CI &&
131
+ process.env.ALCHEMY_CI_STATE_STORE_CHECK !== "false"
132
+ ) {
133
+ throw new Error(`You are running Alchemy in a CI environment with the default local state store.
166
134
  This can lead to orphaned infrastructure and is rarely what you want to do.
167
135
 
168
136
  Instead, you should choose a persistent state store:
@@ -173,165 +141,45 @@ You can read more about State and State Stores here: https://alchemy.run/concept
173
141
 
174
142
  If this is a mistake, you can disable this check by setting the ALCHEMY_CI_STATE_STORE_CHECK=false.
175
143
  `);
176
- }
144
+ }
177
145
 
178
- const phase = isRuntime ? "read" : (mergedOptions?.phase ?? "up");
179
- const telemetryClient =
180
- mergedOptions?.parent?.telemetryClient ??
181
- TelemetryClient.create({
182
- phase,
183
- enabled: mergedOptions?.telemetry ?? true,
184
- quiet: mergedOptions?.quiet ?? false,
185
- });
186
- const root = new Scope({
187
- ...mergedOptions,
188
- parent: undefined,
189
- scopeName: appName,
146
+ const phase = mergedOptions?.phase ?? "up";
147
+ const telemetryClient =
148
+ mergedOptions?.parent?.telemetryClient ??
149
+ TelemetryClient.create({
190
150
  phase,
191
- password: mergedOptions?.password ?? process.env.ALCHEMY_PASSWORD,
192
- telemetryClient,
151
+ enabled: mergedOptions?.telemetry ?? true,
152
+ quiet: mergedOptions?.quiet ?? false,
193
153
  });
194
- onExit((code) => {
195
- root.cleanup().then(() => {
196
- code = code === 130 ? 0 : (code ?? 0);
197
- process.exit(code);
198
- });
199
- return true;
200
- });
201
- const stageName = mergedOptions?.stage ?? DEFAULT_STAGE;
202
- const stage = new Scope({
203
- ...mergedOptions,
204
- parent: root,
205
- scopeName: stageName,
206
- stage: stageName,
154
+ const root = new Scope({
155
+ ...mergedOptions,
156
+ parent: undefined,
157
+ scopeName: appName,
158
+ phase,
159
+ password: mergedOptions?.password ?? process.env.ALCHEMY_PASSWORD,
160
+ telemetryClient,
161
+ });
162
+ onExit((code) => {
163
+ root.cleanup().then(() => {
164
+ code = code === 130 ? 0 : (code ?? 0);
165
+ process.exit(code);
207
166
  });
208
- try {
209
- Scope.storage.enterWith(root);
210
- Scope.storage.enterWith(stage);
211
- } catch {
212
- // we are in Cloudflare Workers, we will emulate the enterWith behavior
213
- // see Scope.finalize for where we pop the global scope
214
- Scope.globals.push(root);
215
- Scope.globals.push(stage);
216
- }
217
- if (mergedOptions?.phase === "destroy") {
218
- await destroy(stage);
219
- return process.exit(0);
220
- }
221
- return root;
167
+ return true;
168
+ });
169
+ const stageName = mergedOptions?.stage ?? DEFAULT_STAGE;
170
+ const stage = new Scope({
171
+ ...mergedOptions,
172
+ parent: root,
173
+ scopeName: stageName,
174
+ stage: stageName,
175
+ });
176
+ Scope.storage.enterWith(root);
177
+ Scope.storage.enterWith(stage);
178
+ if (mergedOptions?.phase === "destroy") {
179
+ await destroy(stage);
180
+ return process.exit(0);
222
181
  }
223
- const [template, ...values] = args;
224
- const [, secondLine] = template[0].split("\n");
225
- const leadingSpaces = secondLine
226
- ? secondLine.match(/^(\s*)/)?.[1]?.length || 0
227
- : 0;
228
- const indent = " ".repeat(leadingSpaces);
229
-
230
- const [{ isFileRef }, { isFileCollection }] = await Promise.all([
231
- import("./fs/file-ref.js"),
232
- import("./fs/file-collection.js"),
233
- ]);
234
-
235
- const appendices: Record<string, string> = {};
236
-
237
- const stringValues = await Promise.all(
238
- values.map(async function resolve(value): Promise<string> {
239
- if (typeof value === "string") {
240
- return indent + value;
241
- }
242
- if (value === null) {
243
- return "null";
244
- }
245
- if (value === undefined) {
246
- return "undefined";
247
- }
248
- if (
249
- typeof value === "number" ||
250
- typeof value === "boolean" ||
251
- typeof value === "bigint"
252
- ) {
253
- return value.toString();
254
- }
255
- if (value instanceof Promise) {
256
- return resolve(await value);
257
- }
258
- if (isFileRef(value)) {
259
- if (!(value.path in appendices)) {
260
- appendices[value.path] = await fs.readFile(value.path, "utf-8");
261
- }
262
- return `[${path.basename(value.path)}](${value.path})`;
263
- }
264
- if (isFileCollection(value)) {
265
- return Object.entries(value.files)
266
- .map(([filePath, content]) => {
267
- appendices[filePath] = content;
268
- return `[${path.basename(filePath)}](${filePath})`;
269
- })
270
- .join("\n\n");
271
- }
272
- if (Array.isArray(value)) {
273
- return (
274
- await Promise.all(
275
- value.map(async (value, i) => `${i}. ${await resolve(value)}`),
276
- )
277
- ).join("\n");
278
- }
279
- if (typeof value === "object" && typeof value.path === "string") {
280
- if (typeof value.content === "string") {
281
- appendices[value.path] = value.content;
282
- return `[${path.basename(value.path)}](${value.path})`;
283
- }
284
- appendices[value.path] = await fs.readFile(value.path, "utf-8");
285
- return `[${path.basename(value.path)}](${value.path})`;
286
- }
287
- if (typeof value === "object") {
288
- return (
289
- await Promise.all(
290
- Object.entries(value).map(async ([key, value]) => {
291
- return `* ${key}: ${await resolve(value)}`;
292
- }),
293
- )
294
- ).join("\n");
295
- }
296
- // TODO: support other types
297
- logger.log(value);
298
- throw new Error(`Unsupported value type: ${value}`);
299
- }),
300
- );
301
-
302
- // Construct the string template by joining template parts with interpolated values
303
- const lines = template
304
- .map((part) =>
305
- part
306
- .split("\n")
307
- .map((line) =>
308
- line.startsWith(indent) ? line.slice(indent.length) : line,
309
- )
310
- .join("\n"),
311
- )
312
- .flatMap((part, i) =>
313
- i < stringValues.length ? [part, stringValues[i] ?? ""] : [part],
314
- )
315
- .join("")
316
- .split("\n");
317
-
318
- // Collect and sort appendices by file path
319
- return [
320
- // format the user prompt and trim the first line if it's empty
321
- lines.length > 1 && lines[0].replaceAll(" ", "").length === 0
322
- ? lines.slice(1).join("\n")
323
- : lines.join("\n"),
324
-
325
- // sort appendices by path and include at the end of the prompt
326
- Object.entries(appendices)
327
- .sort(([a], [b]) => a.localeCompare(b))
328
- .map(([filePath, content]) => {
329
- const extension = path.extname(filePath).slice(1);
330
- const codeTag = extension ? extension : "";
331
- return `// ${filePath}\n\`\`\`${codeTag}\n${content}\n\`\`\``;
332
- })
333
- .join("\n\n"),
334
- ].join("\n");
182
+ return root;
335
183
  }
336
184
 
337
185
  export type Phase = "up" | "destroy" | "read";
@@ -414,6 +262,12 @@ export interface AlchemyOptions {
414
262
  * If not provided, the default fallback logger will be used.
415
263
  */
416
264
  logger?: LoggerApi;
265
+ /**
266
+ * Whether to adopt resources if they already exist but are not yet managed by your Alchemy app.
267
+ *
268
+ * @default false
269
+ */
270
+ adopt?: boolean;
417
271
  }
418
272
 
419
273
  export interface ScopeOptions extends AlchemyOptions {
@@ -463,7 +317,7 @@ async function run<T>(
463
317
  const telemetryClient =
464
318
  options?.parent?.telemetryClient ??
465
319
  TelemetryClient.create({
466
- phase: isRuntime ? "read" : (options?.phase ?? "up"),
320
+ phase: options?.phase ?? "up",
467
321
  enabled: options?.telemetry ?? true,
468
322
  quiet: options?.quiet ?? false,
469
323
  });
package/src/apply.ts CHANGED
@@ -13,7 +13,7 @@ import {
13
13
  type Resource,
14
14
  type ResourceProps,
15
15
  } from "./resource.ts";
16
- import { Scope, type PendingDeletions } from "./scope.ts";
16
+ import type { PendingDeletions } from "./scope.ts";
17
17
  import { serialize } from "./serde.ts";
18
18
  import { formatFQN } from "./util/cli.ts";
19
19
  import { logger } from "./util/logger.ts";
@@ -22,7 +22,6 @@ import type { Telemetry } from "./util/telemetry/index.ts";
22
22
  export interface ApplyOptions {
23
23
  quiet?: boolean;
24
24
  alwaysUpdate?: boolean;
25
- resolveInnerScope?: (scope: Scope) => void;
26
25
  }
27
26
 
28
27
  export function apply<Out extends Resource>(
@@ -63,12 +62,6 @@ async function _apply<Out extends Resource>(
63
62
  `Resource "${resource[ResourceFQN]}" not found and running in 'read' phase.`,
64
63
  );
65
64
  }
66
- options?.resolveInnerScope?.(
67
- new Scope({
68
- parent: scope,
69
- scopeName: resource[ResourceID],
70
- }),
71
- );
72
65
  scope.telemetryClient.record({
73
66
  event: "resource.read",
74
67
  resource: resource[ResourceKind],
@@ -115,11 +108,6 @@ async function _apply<Out extends Resource>(
115
108
  alwaysUpdate !== true &&
116
109
  !scope.force
117
110
  ) {
118
- const innerScope = new Scope({
119
- parent: scope,
120
- scopeName: resource[ResourceID],
121
- });
122
- innerScope.skip();
123
111
  if (!quiet) {
124
112
  logger.task(resource[ResourceFQN], {
125
113
  prefix: "skipped",
@@ -129,7 +117,6 @@ async function _apply<Out extends Resource>(
129
117
  status: "success",
130
118
  });
131
119
  }
132
- options?.resolveInnerScope?.(innerScope);
133
120
  scope.telemetryClient.record({
134
121
  event: "resource.skip",
135
122
  resource: resource[ResourceKind],
@@ -199,10 +186,8 @@ async function _apply<Out extends Resource>(
199
186
  parent: scope,
200
187
  destroyStrategy: provider.options?.destroyStrategy ?? "sequential",
201
188
  },
202
- async (scope) => {
203
- options?.resolveInnerScope?.(scope);
204
- return provider.handler.bind(ctx)(resource[ResourceID], props);
205
- },
189
+ async () =>
190
+ await provider.handler.bind(ctx)(resource[ResourceID], props),
206
191
  );
207
192
  } catch (error) {
208
193
  if (error instanceof ReplacedSignal) {
@@ -216,7 +201,9 @@ async function _apply<Out extends Resource>(
216
201
  },
217
202
  });
218
203
  } else {
219
- if (scope.children.get(resource[ResourceID])?.children.size! > 0) {
204
+ if (
205
+ (scope.children.get(resource[ResourceID])?.children.size ?? 0) > 0
206
+ ) {
220
207
  throw new Error(
221
208
  `Resource ${resource[ResourceFQN]} has children and cannot be replaced.`,
222
209
  );
@@ -1,6 +1,4 @@
1
- import { GetCallerIdentityCommand, STSClient } from "@aws-sdk/client-sts";
2
-
3
- const sts = new STSClient({});
1
+ import { importPeer } from "../util/peer.ts";
4
2
 
5
3
  export type AccountId = string & {
6
4
  readonly __brand: "AccountId";
@@ -10,6 +8,11 @@ export type AccountId = string & {
10
8
  * Helper to get the current AWS account ID
11
9
  */
12
10
  export async function AccountId(): Promise<AccountId> {
11
+ const { GetCallerIdentityCommand, STSClient } = await importPeer(
12
+ import("@aws-sdk/client-sts"),
13
+ "aws::AccountId",
14
+ );
15
+ const sts = new STSClient({});
13
16
  const identity = await sts.send(new GetCallerIdentityCommand({}));
14
17
  return identity.Account! as AccountId;
15
18
  }
package/src/aws/bucket.ts CHANGED
@@ -1,18 +1,7 @@
1
- import {
2
- CreateBucketCommand,
3
- DeleteBucketCommand,
4
- GetBucketAclCommand,
5
- GetBucketLocationCommand,
6
- GetBucketTaggingCommand,
7
- GetBucketVersioningCommand,
8
- HeadBucketCommand,
9
- NoSuchBucket,
10
- PutBucketTaggingCommand,
11
- S3Client,
12
- } from "@aws-sdk/client-s3";
13
1
  import type { Context } from "../context.ts";
14
2
  import { Resource } from "../resource.ts";
15
3
  import { ignore } from "../util/ignore.ts";
4
+ import { importPeer } from "../util/peer.ts";
16
5
  import { retry } from "./retry.ts";
17
6
 
18
7
  /**
@@ -22,8 +11,10 @@ export interface BucketProps {
22
11
  /**
23
12
  * The name of the bucket. Must be globally unique across all AWS accounts.
24
13
  * Should be lowercase alphanumeric characters or hyphens.
14
+ *
15
+ * @default ${app}-${stage}-${id}
25
16
  */
26
- bucketName: string;
17
+ bucketName?: string;
27
18
 
28
19
  /**
29
20
  * Optional tags to apply to the bucket for organization and cost tracking.
@@ -42,6 +33,11 @@ export interface Bucket extends Resource<"s3::Bucket">, BucketProps {
42
33
  */
43
34
  arn: string;
44
35
 
36
+ /**
37
+ * Name of the Bucket.
38
+ */
39
+ bucketName: string;
40
+
45
41
  /**
46
42
  * The global domain name for the bucket
47
43
  * Format: bucket-name.s3.amazonaws.com
@@ -129,15 +125,36 @@ export interface Bucket extends Resource<"s3::Bucket">, BucketProps {
129
125
  */
130
126
  export const Bucket = Resource(
131
127
  "s3::Bucket",
132
- async function (this: Context<Bucket>, _id: string, props: BucketProps) {
128
+ async function (this: Context<Bucket>, id: string, props: BucketProps) {
129
+ const {
130
+ CreateBucketCommand,
131
+ DeleteBucketCommand,
132
+ GetBucketAclCommand,
133
+ GetBucketLocationCommand,
134
+ GetBucketTaggingCommand,
135
+ GetBucketVersioningCommand,
136
+ HeadBucketCommand,
137
+ NoSuchBucket,
138
+ PutBucketTaggingCommand,
139
+ S3Client,
140
+ } = await importPeer(import("@aws-sdk/client-s3"), "s3::Bucket");
133
141
  const client = new S3Client({});
134
142
 
143
+ const bucketName =
144
+ props.bucketName ??
145
+ this.output?.bucketName ??
146
+ this.scope.createPhysicalName(id);
147
+
148
+ if (this.phase === "update" && this.output.bucketName !== bucketName) {
149
+ this.replace();
150
+ }
151
+
135
152
  if (this.phase === "delete") {
136
153
  await ignore(NoSuchBucket.name, () =>
137
154
  retry(() =>
138
155
  client.send(
139
156
  new DeleteBucketCommand({
140
- Bucket: props.bucketName,
157
+ Bucket: bucketName,
141
158
  }),
142
159
  ),
143
160
  ),
@@ -149,7 +166,7 @@ export const Bucket = Resource(
149
166
  await retry(() =>
150
167
  client.send(
151
168
  new HeadBucketCommand({
152
- Bucket: props.bucketName,
169
+ Bucket: bucketName,
153
170
  }),
154
171
  ),
155
172
  );
@@ -159,7 +176,7 @@ export const Bucket = Resource(
159
176
  await retry(() =>
160
177
  client.send(
161
178
  new PutBucketTaggingCommand({
162
- Bucket: props.bucketName,
179
+ Bucket: bucketName,
163
180
  Tagging: {
164
181
  TagSet: Object.entries(props.tags!).map(([Key, Value]) => ({
165
182
  Key,
@@ -176,7 +193,7 @@ export const Bucket = Resource(
176
193
  await retry(() =>
177
194
  client.send(
178
195
  new CreateBucketCommand({
179
- Bucket: props.bucketName,
196
+ Bucket: bucketName,
180
197
  // Add tags during creation if specified
181
198
  ...(props.tags && {
182
199
  Tagging: {
@@ -198,17 +215,13 @@ export const Bucket = Resource(
198
215
  const [locationResponse, versioningResponse, aclResponse] =
199
216
  await Promise.all([
200
217
  retry(() =>
201
- client.send(
202
- new GetBucketLocationCommand({ Bucket: props.bucketName }),
203
- ),
218
+ client.send(new GetBucketLocationCommand({ Bucket: bucketName })),
204
219
  ),
205
220
  retry(() =>
206
- client.send(
207
- new GetBucketVersioningCommand({ Bucket: props.bucketName }),
208
- ),
221
+ client.send(new GetBucketVersioningCommand({ Bucket: bucketName })),
209
222
  ),
210
223
  retry(() =>
211
- client.send(new GetBucketAclCommand({ Bucket: props.bucketName })),
224
+ client.send(new GetBucketAclCommand({ Bucket: bucketName })),
212
225
  ),
213
226
  ]);
214
227
 
@@ -219,9 +232,7 @@ export const Bucket = Resource(
219
232
  if (!tags) {
220
233
  try {
221
234
  const taggingResponse = await retry(() =>
222
- client.send(
223
- new GetBucketTaggingCommand({ Bucket: props.bucketName }),
224
- ),
235
+ client.send(new GetBucketTaggingCommand({ Bucket: bucketName })),
225
236
  );
226
237
  tags = Object.fromEntries(
227
238
  taggingResponse.TagSet?.map(({ Key, Value }) => [Key, Value]) || [],
@@ -234,10 +245,10 @@ export const Bucket = Resource(
234
245
  }
235
246
 
236
247
  return this({
237
- bucketName: props.bucketName,
238
- arn: `arn:aws:s3:::${props.bucketName}`,
239
- bucketDomainName: `${props.bucketName}.s3.amazonaws.com`,
240
- bucketRegionalDomainName: `${props.bucketName}.s3.${region}.amazonaws.com`,
248
+ bucketName: bucketName,
249
+ arn: `arn:aws:s3:::${bucketName}`,
250
+ bucketDomainName: `${bucketName}.s3.amazonaws.com`,
251
+ bucketRegionalDomainName: `${bucketName}.s3.${region}.amazonaws.com`,
241
252
  region,
242
253
  hostedZoneId: getHostedZoneId(region),
243
254
  versioningEnabled: versioningResponse.Status === "Enabled",
@@ -31,8 +31,10 @@ export interface SecurityGroupProps extends AwsClientProps {
31
31
 
32
32
  /**
33
33
  * The name of the security group.
34
+ *
35
+ * @default ${app}-${stage}-${id}
34
36
  */
35
- groupName: string;
37
+ groupName?: string;
36
38
 
37
39
  /**
38
40
  * The description of the security group.
@@ -62,6 +64,11 @@ export interface SecurityGroup
62
64
  */
63
65
  groupId: string;
64
66
 
67
+ /**
68
+ * The name of the security group.
69
+ */
70
+ groupName: string;
71
+
65
72
  /**
66
73
  * The ID of the VPC the security group belongs to.
67
74
  */
@@ -200,7 +207,7 @@ export const SecurityGroup = Resource(
200
207
  "aws::SecurityGroup",
201
208
  async function (
202
209
  this: Context<SecurityGroup>,
203
- _id: string,
210
+ id: string,
204
211
  props: SecurityGroupProps,
205
212
  ): Promise<SecurityGroup> {
206
213
  // Create EC2 client with credential resolution handled internally
@@ -210,6 +217,10 @@ export const SecurityGroup = Resource(
210
217
  SECURITY_GROUP_TIMEOUT,
211
218
  props.timeout,
212
219
  );
220
+ const groupName = props.groupName ?? this.scope.createPhysicalName(id);
221
+ if (this.phase === "update" && this.output.groupName !== groupName) {
222
+ this.replace();
223
+ }
213
224
 
214
225
  if (this.phase === "delete") {
215
226
  if (this.output?.groupId) {
@@ -259,7 +270,7 @@ export const SecurityGroup = Resource(
259
270
  } else {
260
271
  // Create new security group
261
272
  const createParams: CreateSecurityGroupParams = {
262
- GroupName: props.groupName,
273
+ GroupName: groupName,
263
274
  GroupDescription: props.description,
264
275
  VpcId: vpcId,
265
276
  };
@@ -313,6 +324,7 @@ export const SecurityGroup = Resource(
313
324
 
314
325
  return this({
315
326
  groupId: securityGroup.GroupId,
327
+ groupName,
316
328
  vpcId: securityGroup.VpcId,
317
329
  ownerId: securityGroup.OwnerId,
318
330
  ...props,