alchemy 0.62.3 → 0.63.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (594) hide show
  1. package/bin/alchemy.js +1516 -1202
  2. package/bin/commands/deploy.ts +2 -0
  3. package/bin/commands/dev.ts +2 -0
  4. package/bin/services/execute-alchemy.ts +11 -0
  5. package/bin/services/template-manager.ts +2 -0
  6. package/bin/types.ts +2 -1
  7. package/lib/alchemy.d.ts +6 -22
  8. package/lib/alchemy.d.ts.map +1 -1
  9. package/lib/alchemy.js +65 -169
  10. package/lib/alchemy.js.map +1 -1
  11. package/lib/apply.d.ts +0 -2
  12. package/lib/apply.d.ts.map +1 -1
  13. package/lib/apply.js +2 -16
  14. package/lib/apply.js.map +1 -1
  15. package/lib/aws/account-id.d.ts.map +1 -1
  16. package/lib/aws/account-id.js +3 -2
  17. package/lib/aws/account-id.js.map +1 -1
  18. package/lib/aws/bucket.d.ts +8 -2
  19. package/lib/aws/bucket.d.ts.map +1 -1
  20. package/lib/aws/bucket.js +21 -14
  21. package/lib/aws/bucket.js.map +1 -1
  22. package/lib/aws/ec2/security-group.d.ts +8 -2
  23. package/lib/aws/ec2/security-group.d.ts.map +1 -1
  24. package/lib/aws/ec2/security-group.js +7 -2
  25. package/lib/aws/ec2/security-group.js.map +1 -1
  26. package/lib/aws/function.d.ts +9 -3
  27. package/lib/aws/function.d.ts.map +1 -1
  28. package/lib/aws/function.js +35 -26
  29. package/lib/aws/function.js.map +1 -1
  30. package/lib/aws/policy-attachment.d.ts.map +1 -1
  31. package/lib/aws/policy-attachment.js +2 -1
  32. package/lib/aws/policy-attachment.js.map +1 -1
  33. package/lib/aws/policy.d.ts +8 -2
  34. package/lib/aws/policy.d.ts.map +1 -1
  35. package/lib/aws/policy.js +13 -4
  36. package/lib/aws/policy.js.map +1 -1
  37. package/lib/aws/queue.d.ts +8 -2
  38. package/lib/aws/queue.d.ts.map +1 -1
  39. package/lib/aws/queue.js +22 -14
  40. package/lib/aws/queue.js.map +1 -1
  41. package/lib/aws/role.d.ts +8 -2
  42. package/lib/aws/role.d.ts.map +1 -1
  43. package/lib/aws/role.js +10 -3
  44. package/lib/aws/role.js.map +1 -1
  45. package/lib/aws/ses.d.ts +1 -1
  46. package/lib/aws/ses.d.ts.map +1 -1
  47. package/lib/aws/ses.js +2 -1
  48. package/lib/aws/ses.js.map +1 -1
  49. package/lib/aws/ssm-parameter.d.ts +8 -2
  50. package/lib/aws/ssm-parameter.d.ts.map +1 -1
  51. package/lib/aws/ssm-parameter.js +15 -10
  52. package/lib/aws/ssm-parameter.js.map +1 -1
  53. package/lib/aws/table.d.ts +8 -2
  54. package/lib/aws/table.d.ts.map +1 -1
  55. package/lib/aws/table.js +17 -9
  56. package/lib/aws/table.js.map +1 -1
  57. package/lib/cloudflare/account-api-token.d.ts +2 -2
  58. package/lib/cloudflare/account-api-token.d.ts.map +1 -1
  59. package/lib/cloudflare/account-api-token.js +7 -6
  60. package/lib/cloudflare/account-api-token.js.map +1 -1
  61. package/lib/cloudflare/ai-gateway.d.ts +9 -4
  62. package/lib/cloudflare/ai-gateway.d.ts.map +1 -1
  63. package/lib/cloudflare/ai-gateway.js +20 -24
  64. package/lib/cloudflare/ai-gateway.js.map +1 -1
  65. package/lib/cloudflare/api-schema.d.ts +2 -2
  66. package/lib/cloudflare/api-schema.d.ts.map +1 -1
  67. package/lib/cloudflare/api-schema.js +6 -2
  68. package/lib/cloudflare/api-schema.js.map +1 -1
  69. package/lib/cloudflare/api-shield.d.ts +5 -1
  70. package/lib/cloudflare/api-shield.d.ts.map +1 -1
  71. package/lib/cloudflare/api-shield.js +6 -1
  72. package/lib/cloudflare/api-shield.js.map +1 -1
  73. package/lib/cloudflare/assets.d.ts +1 -1
  74. package/lib/cloudflare/assets.d.ts.map +1 -1
  75. package/lib/cloudflare/astro/astro.d.ts.map +1 -1
  76. package/lib/cloudflare/astro/astro.js +3 -1
  77. package/lib/cloudflare/astro/astro.js.map +1 -1
  78. package/lib/cloudflare/astro/plugin.d.ts +2 -1
  79. package/lib/cloudflare/astro/plugin.d.ts.map +1 -1
  80. package/lib/cloudflare/astro/plugin.js.map +1 -1
  81. package/lib/cloudflare/bindings.d.ts +2 -2
  82. package/lib/cloudflare/bindings.d.ts.map +1 -1
  83. package/lib/cloudflare/bound.d.ts +1 -1
  84. package/lib/cloudflare/bound.d.ts.map +1 -1
  85. package/lib/cloudflare/bucket.d.ts +120 -1
  86. package/lib/cloudflare/bucket.d.ts.map +1 -1
  87. package/lib/cloudflare/bucket.js +80 -2
  88. package/lib/cloudflare/bucket.js.map +1 -1
  89. package/lib/cloudflare/compatibility-date.gen.d.ts +1 -1
  90. package/lib/cloudflare/compatibility-date.gen.js +1 -1
  91. package/lib/cloudflare/container.d.ts +10 -4
  92. package/lib/cloudflare/container.d.ts.map +1 -1
  93. package/lib/cloudflare/container.js +12 -9
  94. package/lib/cloudflare/container.js.map +1 -1
  95. package/lib/cloudflare/custom-domain.js +2 -1
  96. package/lib/cloudflare/custom-domain.js.map +1 -1
  97. package/lib/cloudflare/d1-database.d.ts +1 -1
  98. package/lib/cloudflare/d1-database.d.ts.map +1 -1
  99. package/lib/cloudflare/d1-database.js +6 -2
  100. package/lib/cloudflare/d1-database.js.map +1 -1
  101. package/lib/cloudflare/dispatch-namespace.d.ts +2 -0
  102. package/lib/cloudflare/dispatch-namespace.d.ts.map +1 -1
  103. package/lib/cloudflare/dispatch-namespace.js +7 -5
  104. package/lib/cloudflare/dispatch-namespace.js.map +1 -1
  105. package/lib/cloudflare/hyperdrive.d.ts +7 -1
  106. package/lib/cloudflare/hyperdrive.d.ts.map +1 -1
  107. package/lib/cloudflare/hyperdrive.js +2 -1
  108. package/lib/cloudflare/hyperdrive.js.map +1 -1
  109. package/lib/cloudflare/kv-namespace.d.ts +3 -0
  110. package/lib/cloudflare/kv-namespace.d.ts.map +1 -1
  111. package/lib/cloudflare/kv-namespace.js +11 -2
  112. package/lib/cloudflare/kv-namespace.js.map +1 -1
  113. package/lib/cloudflare/miniflare/miniflare-worker-proxy.js +3 -1
  114. package/lib/cloudflare/miniflare/miniflare-worker-proxy.js.map +1 -1
  115. package/lib/cloudflare/miniflare/paths.d.ts +4 -0
  116. package/lib/cloudflare/miniflare/paths.d.ts.map +1 -1
  117. package/lib/cloudflare/miniflare/paths.js +11 -0
  118. package/lib/cloudflare/miniflare/paths.js.map +1 -1
  119. package/lib/cloudflare/pipeline.d.ts +14 -3
  120. package/lib/cloudflare/pipeline.d.ts.map +1 -1
  121. package/lib/cloudflare/pipeline.js +31 -2
  122. package/lib/cloudflare/pipeline.js.map +1 -1
  123. package/lib/cloudflare/queue-consumer.js +1 -1
  124. package/lib/cloudflare/queue-consumer.js.map +1 -1
  125. package/lib/cloudflare/queue.d.ts +4 -2
  126. package/lib/cloudflare/queue.d.ts.map +1 -1
  127. package/lib/cloudflare/queue.js +13 -9
  128. package/lib/cloudflare/queue.js.map +1 -1
  129. package/lib/cloudflare/react-router/plugin.d.ts +1 -1
  130. package/lib/cloudflare/react-router/plugin.d.ts.map +1 -1
  131. package/lib/cloudflare/react-router/react-router.d.ts.map +1 -1
  132. package/lib/cloudflare/react-router/react-router.js +32 -2
  133. package/lib/cloudflare/react-router/react-router.js.map +1 -1
  134. package/lib/cloudflare/redwood/plugin.d.ts +2 -1
  135. package/lib/cloudflare/redwood/plugin.d.ts.map +1 -1
  136. package/lib/cloudflare/redwood/plugin.js.map +1 -1
  137. package/lib/cloudflare/route.js +1 -1
  138. package/lib/cloudflare/route.js.map +1 -1
  139. package/lib/cloudflare/ruleset.d.ts +3 -1
  140. package/lib/cloudflare/ruleset.d.ts.map +1 -1
  141. package/lib/cloudflare/ruleset.js +3 -2
  142. package/lib/cloudflare/ruleset.js.map +1 -1
  143. package/lib/cloudflare/secret.d.ts +6 -23
  144. package/lib/cloudflare/secret.d.ts.map +1 -1
  145. package/lib/cloudflare/secret.js +8 -4
  146. package/lib/cloudflare/secret.js.map +1 -1
  147. package/lib/cloudflare/secrets-store.d.ts +1 -1
  148. package/lib/cloudflare/secrets-store.d.ts.map +1 -1
  149. package/lib/cloudflare/secrets-store.js +5 -2
  150. package/lib/cloudflare/secrets-store.js.map +1 -1
  151. package/lib/cloudflare/tunnel.d.ts +5 -1
  152. package/lib/cloudflare/tunnel.d.ts.map +1 -1
  153. package/lib/cloudflare/tunnel.js +5 -1
  154. package/lib/cloudflare/tunnel.js.map +1 -1
  155. package/lib/cloudflare/vectorize-index.d.ts +7 -1
  156. package/lib/cloudflare/vectorize-index.d.ts.map +1 -1
  157. package/lib/cloudflare/vectorize-index.js +5 -2
  158. package/lib/cloudflare/vectorize-index.js.map +1 -1
  159. package/lib/cloudflare/vite/plugin.d.ts +2 -1
  160. package/lib/cloudflare/vite/plugin.d.ts.map +1 -1
  161. package/lib/cloudflare/vite/plugin.js.map +1 -1
  162. package/lib/cloudflare/website.js +1 -1
  163. package/lib/cloudflare/website.js.map +1 -1
  164. package/lib/cloudflare/worker.d.ts +1 -1
  165. package/lib/cloudflare/worker.d.ts.map +1 -1
  166. package/lib/cloudflare/worker.js +12 -7
  167. package/lib/cloudflare/worker.js.map +1 -1
  168. package/lib/cloudflare/wrangler.json.d.ts +1 -1
  169. package/lib/cloudflare/wrangler.json.d.ts.map +1 -1
  170. package/lib/cloudflare/wrangler.json.js +5 -3
  171. package/lib/cloudflare/wrangler.json.js.map +1 -1
  172. package/lib/docker/container.d.ts +6 -0
  173. package/lib/docker/container.d.ts.map +1 -1
  174. package/lib/docker/container.js +5 -1
  175. package/lib/docker/container.js.map +1 -1
  176. package/lib/docker/network.d.ts +8 -2
  177. package/lib/docker/network.d.ts.map +1 -1
  178. package/lib/docker/network.js +7 -2
  179. package/lib/docker/network.js.map +1 -1
  180. package/lib/docker/volume.d.ts +8 -2
  181. package/lib/docker/volume.d.ts.map +1 -1
  182. package/lib/docker/volume.js +6 -4
  183. package/lib/docker/volume.js.map +1 -1
  184. package/lib/esbuild/bundle.d.ts +1 -1
  185. package/lib/fs/index.d.ts +0 -8
  186. package/lib/fs/index.d.ts.map +1 -1
  187. package/lib/fs/index.js +0 -8
  188. package/lib/fs/index.js.map +1 -1
  189. package/lib/github/client.d.ts +1 -1
  190. package/lib/github/client.d.ts.map +1 -1
  191. package/lib/github/client.js +2 -1
  192. package/lib/github/client.js.map +1 -1
  193. package/lib/github/repository-environment.d.ts +8 -2
  194. package/lib/github/repository-environment.d.ts.map +1 -1
  195. package/lib/github/repository-environment.js +16 -12
  196. package/lib/github/repository-environment.js.map +1 -1
  197. package/lib/neon/project.d.ts +7 -1
  198. package/lib/neon/project.d.ts.map +1 -1
  199. package/lib/neon/project.js +10 -6
  200. package/lib/neon/project.js.map +1 -1
  201. package/lib/planetscale/branch.d.ts +4 -2
  202. package/lib/planetscale/branch.d.ts.map +1 -1
  203. package/lib/planetscale/branch.js +18 -12
  204. package/lib/planetscale/branch.js.map +1 -1
  205. package/lib/planetscale/database.d.ts +8 -2
  206. package/lib/planetscale/database.d.ts.map +1 -1
  207. package/lib/planetscale/database.js +24 -16
  208. package/lib/planetscale/database.js.map +1 -1
  209. package/lib/planetscale/password.d.ts +8 -2
  210. package/lib/planetscale/password.d.ts.map +1 -1
  211. package/lib/planetscale/password.js +2 -2
  212. package/lib/planetscale/password.js.map +1 -1
  213. package/lib/resource.d.ts +0 -2
  214. package/lib/resource.d.ts.map +1 -1
  215. package/lib/resource.js +1 -9
  216. package/lib/resource.js.map +1 -1
  217. package/lib/scope.d.ts +9 -3
  218. package/lib/scope.d.ts.map +1 -1
  219. package/lib/scope.js +21 -34
  220. package/lib/scope.js.map +1 -1
  221. package/lib/sentry/client-key.d.ts +7 -1
  222. package/lib/sentry/client-key.d.ts.map +1 -1
  223. package/lib/sentry/client-key.js +45 -6
  224. package/lib/sentry/client-key.js.map +1 -1
  225. package/lib/sentry/project.d.ts +8 -2
  226. package/lib/sentry/project.d.ts.map +1 -1
  227. package/lib/sentry/project.js +35 -5
  228. package/lib/sentry/project.js.map +1 -1
  229. package/lib/sentry/team.d.ts +8 -2
  230. package/lib/sentry/team.d.ts.map +1 -1
  231. package/lib/sentry/team.js +36 -6
  232. package/lib/sentry/team.js.map +1 -1
  233. package/lib/serde.d.ts +0 -5
  234. package/lib/serde.d.ts.map +1 -1
  235. package/lib/serde.js +0 -28
  236. package/lib/serde.js.map +1 -1
  237. package/lib/state/d1-state-store.d.ts +1 -1
  238. package/lib/state/d1-state-store.d.ts.map +1 -1
  239. package/lib/state/d1-state-store.js +5 -5
  240. package/lib/state/d1-state-store.js.map +1 -1
  241. package/lib/state/sqlite-state-store.d.ts.map +1 -1
  242. package/lib/state/sqlite-state-store.js +7 -11
  243. package/lib/state/sqlite-state-store.js.map +1 -1
  244. package/lib/stripe/card.d.ts.map +1 -1
  245. package/lib/stripe/card.js +3 -2
  246. package/lib/stripe/card.js.map +1 -1
  247. package/lib/stripe/client.d.ts +2 -2
  248. package/lib/stripe/client.d.ts.map +1 -1
  249. package/lib/stripe/client.js +4 -3
  250. package/lib/stripe/client.js.map +1 -1
  251. package/lib/stripe/coupon.d.ts.map +1 -1
  252. package/lib/stripe/coupon.js +4 -3
  253. package/lib/stripe/coupon.js.map +1 -1
  254. package/lib/stripe/customer.js +2 -2
  255. package/lib/stripe/customer.js.map +1 -1
  256. package/lib/stripe/entitlements-feature.d.ts.map +1 -1
  257. package/lib/stripe/entitlements-feature.js +3 -2
  258. package/lib/stripe/entitlements-feature.js.map +1 -1
  259. package/lib/stripe/file.d.ts.map +1 -1
  260. package/lib/stripe/file.js +3 -2
  261. package/lib/stripe/file.js.map +1 -1
  262. package/lib/stripe/meter.js +2 -2
  263. package/lib/stripe/meter.js.map +1 -1
  264. package/lib/stripe/portal-configuration.d.ts.map +1 -1
  265. package/lib/stripe/portal-configuration.js +3 -2
  266. package/lib/stripe/portal-configuration.js.map +1 -1
  267. package/lib/stripe/price.d.ts.map +1 -1
  268. package/lib/stripe/price.js +3 -2
  269. package/lib/stripe/price.js.map +1 -1
  270. package/lib/stripe/product-feature.d.ts.map +1 -1
  271. package/lib/stripe/product-feature.js +3 -2
  272. package/lib/stripe/product-feature.js.map +1 -1
  273. package/lib/stripe/product.d.ts.map +1 -1
  274. package/lib/stripe/product.js +3 -2
  275. package/lib/stripe/product.js.map +1 -1
  276. package/lib/stripe/promotion-code.d.ts.map +1 -1
  277. package/lib/stripe/promotion-code.js +3 -2
  278. package/lib/stripe/promotion-code.js.map +1 -1
  279. package/lib/stripe/shipping-rate.d.ts.map +1 -1
  280. package/lib/stripe/shipping-rate.js +4 -3
  281. package/lib/stripe/shipping-rate.js.map +1 -1
  282. package/lib/stripe/tax-rate.d.ts.map +1 -1
  283. package/lib/stripe/tax-rate.js +3 -2
  284. package/lib/stripe/tax-rate.js.map +1 -1
  285. package/lib/stripe/webhook.d.ts.map +1 -1
  286. package/lib/stripe/webhook.js +4 -3
  287. package/lib/stripe/webhook.js.map +1 -1
  288. package/lib/test/vitest.d.ts.map +1 -1
  289. package/lib/test/vitest.js +1 -0
  290. package/lib/test/vitest.js.map +1 -1
  291. package/lib/upstash/redis.d.ts +8 -2
  292. package/lib/upstash/redis.d.ts.map +1 -1
  293. package/lib/upstash/redis.js +5 -4
  294. package/lib/upstash/redis.js.map +1 -1
  295. package/lib/util/ignore-matcher.d.ts.map +1 -1
  296. package/lib/util/ignore-matcher.js +3 -1
  297. package/lib/util/ignore-matcher.js.map +1 -1
  298. package/lib/util/peer.d.ts +10 -0
  299. package/lib/util/peer.d.ts.map +1 -0
  300. package/lib/util/peer.js +42 -0
  301. package/lib/util/peer.js.map +1 -0
  302. package/lib/vercel/project.d.ts +7 -1
  303. package/lib/vercel/project.d.ts.map +1 -1
  304. package/lib/vercel/project.js +28 -0
  305. package/lib/vercel/project.js.map +1 -1
  306. package/package.json +88 -74
  307. package/src/alchemy.ts +76 -222
  308. package/src/apply.ts +6 -19
  309. package/src/aws/account-id.ts +6 -3
  310. package/src/aws/bucket.ts +43 -32
  311. package/src/aws/ec2/security-group.ts +15 -3
  312. package/src/aws/function.ts +65 -39
  313. package/src/aws/policy-attachment.ts +10 -6
  314. package/src/aws/policy.ts +33 -15
  315. package/src/aws/queue.ts +50 -29
  316. package/src/aws/role.ts +37 -20
  317. package/src/aws/ses.ts +24 -20
  318. package/src/aws/ssm-parameter.ts +40 -20
  319. package/src/aws/table.ts +35 -17
  320. package/src/cloudflare/account-api-token.ts +9 -7
  321. package/src/cloudflare/ai-gateway.ts +37 -34
  322. package/src/cloudflare/api-schema.ts +33 -26
  323. package/src/cloudflare/api-shield.ts +15 -2
  324. package/src/cloudflare/astro/astro.ts +5 -1
  325. package/src/cloudflare/astro/plugin.ts +2 -1
  326. package/src/cloudflare/bindings.ts +2 -2
  327. package/src/cloudflare/bound.ts +1 -1
  328. package/src/cloudflare/bucket.ts +242 -3
  329. package/src/cloudflare/compatibility-date.gen.ts +1 -1
  330. package/src/cloudflare/container.ts +23 -12
  331. package/src/cloudflare/custom-domain.ts +2 -2
  332. package/src/cloudflare/d1-database.ts +10 -3
  333. package/src/cloudflare/dispatch-namespace.ts +10 -7
  334. package/src/cloudflare/hyperdrive.ts +13 -3
  335. package/src/cloudflare/kv-namespace.ts +25 -2
  336. package/src/cloudflare/miniflare/miniflare-worker-proxy.ts +3 -1
  337. package/src/cloudflare/miniflare/paths.ts +13 -0
  338. package/src/cloudflare/pipeline.ts +76 -28
  339. package/src/cloudflare/queue-consumer.ts +1 -1
  340. package/src/cloudflare/queue.ts +26 -14
  341. package/src/cloudflare/react-router/react-router.ts +28 -2
  342. package/src/cloudflare/redwood/plugin.ts +3 -2
  343. package/src/cloudflare/route.ts +1 -1
  344. package/src/cloudflare/ruleset.ts +7 -2
  345. package/src/cloudflare/secret.ts +20 -31
  346. package/src/cloudflare/secrets-store.ts +7 -3
  347. package/src/cloudflare/tunnel.ts +13 -2
  348. package/src/cloudflare/vectorize-index.ts +14 -3
  349. package/src/cloudflare/vite/plugin.ts +3 -2
  350. package/src/cloudflare/website.ts +1 -1
  351. package/src/cloudflare/worker.ts +35 -23
  352. package/src/cloudflare/wrangler.json.ts +7 -4
  353. package/src/docker/container.ts +13 -1
  354. package/src/docker/network.ts +18 -3
  355. package/src/docker/volume.ts +17 -6
  356. package/src/fs/index.ts +0 -8
  357. package/src/github/client.ts +6 -2
  358. package/src/github/repository-environment.ts +27 -13
  359. package/src/neon/project.ts +20 -6
  360. package/src/planetscale/branch.ts +24 -13
  361. package/src/planetscale/database.ts +38 -17
  362. package/src/planetscale/password.ts +10 -3
  363. package/src/resource.ts +1 -10
  364. package/src/scope.ts +29 -38
  365. package/src/sentry/client-key.ts +74 -6
  366. package/src/sentry/project.ts +59 -6
  367. package/src/sentry/team.ts +55 -7
  368. package/src/serde.ts +0 -44
  369. package/src/state/d1-state-store.ts +13 -6
  370. package/src/state/sqlite-state-store.ts +16 -17
  371. package/src/stripe/card.ts +5 -2
  372. package/src/stripe/client.ts +10 -3
  373. package/src/stripe/coupon.ts +4 -3
  374. package/src/stripe/customer.ts +2 -2
  375. package/src/stripe/entitlements-feature.ts +5 -2
  376. package/src/stripe/file.ts +3 -2
  377. package/src/stripe/meter.ts +2 -2
  378. package/src/stripe/portal-configuration.ts +5 -2
  379. package/src/stripe/price.ts +3 -2
  380. package/src/stripe/product-feature.ts +5 -2
  381. package/src/stripe/product.ts +3 -2
  382. package/src/stripe/promotion-code.ts +3 -2
  383. package/src/stripe/shipping-rate.ts +4 -3
  384. package/src/stripe/tax-rate.ts +3 -2
  385. package/src/stripe/webhook.ts +4 -3
  386. package/src/test/vitest.ts +1 -0
  387. package/src/upstash/redis.ts +15 -5
  388. package/src/util/ignore-matcher.ts +3 -1
  389. package/src/util/peer.ts +53 -0
  390. package/src/vercel/project.ts +46 -1
  391. package/templates/hono/README.md +19 -0
  392. package/templates/hono/_env +1 -0
  393. package/templates/hono/_env.example +1 -0
  394. package/templates/hono/_gitignore +34 -0
  395. package/templates/hono/alchemy.run.ts +22 -0
  396. package/templates/hono/package.json +18 -0
  397. package/templates/hono/src/index.ts +17 -0
  398. package/templates/hono/tsconfig.json +13 -0
  399. package/templates/hono/types/env.d.ts +16 -0
  400. package/templates/react-router/vite.config.ts +5 -3
  401. package/workers/cloudflare-state-store.js +69 -74
  402. package/workers/dofs-state-store.js +1 -1
  403. package/bin/bootstrap-s3.ts +0 -255
  404. package/lib/ai/ark.d.ts +0 -12
  405. package/lib/ai/ark.d.ts.map +0 -1
  406. package/lib/ai/ark.js +0 -87
  407. package/lib/ai/ark.js.map +0 -1
  408. package/lib/ai/astro-file.d.ts +0 -138
  409. package/lib/ai/astro-file.d.ts.map +0 -1
  410. package/lib/ai/astro-file.js +0 -158
  411. package/lib/ai/astro-file.js.map +0 -1
  412. package/lib/ai/client.d.ts +0 -51
  413. package/lib/ai/client.d.ts.map +0 -1
  414. package/lib/ai/client.js +0 -58
  415. package/lib/ai/client.js.map +0 -1
  416. package/lib/ai/css-file.d.ts +0 -132
  417. package/lib/ai/css-file.d.ts.map +0 -1
  418. package/lib/ai/css-file.js +0 -142
  419. package/lib/ai/css-file.js.map +0 -1
  420. package/lib/ai/data.d.ts +0 -152
  421. package/lib/ai/data.d.ts.map +0 -1
  422. package/lib/ai/data.js +0 -120
  423. package/lib/ai/data.js.map +0 -1
  424. package/lib/ai/document.d.ts +0 -208
  425. package/lib/ai/document.d.ts.map +0 -1
  426. package/lib/ai/document.js +0 -206
  427. package/lib/ai/document.js.map +0 -1
  428. package/lib/ai/html-file.d.ts +0 -129
  429. package/lib/ai/html-file.d.ts.map +0 -1
  430. package/lib/ai/html-file.js +0 -139
  431. package/lib/ai/html-file.js.map +0 -1
  432. package/lib/ai/index.d.ts +0 -11
  433. package/lib/ai/index.d.ts.map +0 -1
  434. package/lib/ai/index.js +0 -11
  435. package/lib/ai/index.js.map +0 -1
  436. package/lib/ai/json-file.d.ts +0 -161
  437. package/lib/ai/json-file.d.ts.map +0 -1
  438. package/lib/ai/json-file.js +0 -188
  439. package/lib/ai/json-file.js.map +0 -1
  440. package/lib/ai/typescript-file.d.ts +0 -140
  441. package/lib/ai/typescript-file.d.ts.map +0 -1
  442. package/lib/ai/typescript-file.js +0 -146
  443. package/lib/ai/typescript-file.js.map +0 -1
  444. package/lib/ai/vue-file.d.ts +0 -127
  445. package/lib/ai/vue-file.d.ts.map +0 -1
  446. package/lib/ai/vue-file.js +0 -137
  447. package/lib/ai/vue-file.js.map +0 -1
  448. package/lib/ai/yaml-file.d.ts +0 -170
  449. package/lib/ai/yaml-file.d.ts.map +0 -1
  450. package/lib/ai/yaml-file.js +0 -201
  451. package/lib/ai/yaml-file.js.map +0 -1
  452. package/lib/fs/static-astro-file.d.ts +0 -35
  453. package/lib/fs/static-astro-file.d.ts.map +0 -1
  454. package/lib/fs/static-astro-file.js +0 -40
  455. package/lib/fs/static-astro-file.js.map +0 -1
  456. package/lib/fs/static-css-file.d.ts +0 -25
  457. package/lib/fs/static-css-file.d.ts.map +0 -1
  458. package/lib/fs/static-css-file.js +0 -30
  459. package/lib/fs/static-css-file.js.map +0 -1
  460. package/lib/fs/static-html-file.d.ts +0 -32
  461. package/lib/fs/static-html-file.d.ts.map +0 -1
  462. package/lib/fs/static-html-file.js +0 -37
  463. package/lib/fs/static-html-file.js.map +0 -1
  464. package/lib/fs/static-json-file.d.ts +0 -18
  465. package/lib/fs/static-json-file.d.ts.map +0 -1
  466. package/lib/fs/static-json-file.js +0 -19
  467. package/lib/fs/static-json-file.js.map +0 -1
  468. package/lib/fs/static-text-file.d.ts +0 -13
  469. package/lib/fs/static-text-file.d.ts.map +0 -1
  470. package/lib/fs/static-text-file.js +0 -9
  471. package/lib/fs/static-text-file.js.map +0 -1
  472. package/lib/fs/static-typescript-file.d.ts +0 -20
  473. package/lib/fs/static-typescript-file.d.ts.map +0 -1
  474. package/lib/fs/static-typescript-file.js +0 -16
  475. package/lib/fs/static-typescript-file.js.map +0 -1
  476. package/lib/fs/static-vue-file.d.ts +0 -29
  477. package/lib/fs/static-vue-file.d.ts.map +0 -1
  478. package/lib/fs/static-vue-file.js +0 -34
  479. package/lib/fs/static-vue-file.js.map +0 -1
  480. package/lib/fs/static-yaml-file.d.ts +0 -23
  481. package/lib/fs/static-yaml-file.d.ts.map +0 -1
  482. package/lib/fs/static-yaml-file.js +0 -10
  483. package/lib/fs/static-yaml-file.js.map +0 -1
  484. package/lib/internal/docs/providers.d.ts +0 -34
  485. package/lib/internal/docs/providers.d.ts.map +0 -1
  486. package/lib/internal/docs/providers.js +0 -200
  487. package/lib/internal/docs/providers.js.map +0 -1
  488. package/lib/runtime/bind.d.ts +0 -25
  489. package/lib/runtime/bind.d.ts.map +0 -1
  490. package/lib/runtime/bind.js +0 -76
  491. package/lib/runtime/bind.js.map +0 -1
  492. package/lib/runtime/global.d.ts +0 -8
  493. package/lib/runtime/global.d.ts.map +0 -1
  494. package/lib/runtime/global.js +0 -3
  495. package/lib/runtime/global.js.map +0 -1
  496. package/lib/runtime/plugin.d.ts +0 -35
  497. package/lib/runtime/plugin.d.ts.map +0 -1
  498. package/lib/runtime/plugin.js +0 -134
  499. package/lib/runtime/plugin.js.map +0 -1
  500. package/lib/runtime/shims.d.ts +0 -6
  501. package/lib/runtime/shims.d.ts.map +0 -1
  502. package/lib/runtime/shims.js +0 -27
  503. package/lib/runtime/shims.js.map +0 -1
  504. package/lib/runtime/state.d.ts +0 -5
  505. package/lib/runtime/state.d.ts.map +0 -1
  506. package/lib/runtime/state.js +0 -4
  507. package/lib/runtime/state.js.map +0 -1
  508. package/lib/web/astro.d.ts +0 -148
  509. package/lib/web/astro.d.ts.map +0 -1
  510. package/lib/web/astro.js +0 -419
  511. package/lib/web/astro.js.map +0 -1
  512. package/lib/web/shadcn-component.d.ts +0 -30
  513. package/lib/web/shadcn-component.d.ts.map +0 -1
  514. package/lib/web/shadcn-component.js +0 -25
  515. package/lib/web/shadcn-component.js.map +0 -1
  516. package/lib/web/shadcn.d.ts +0 -98
  517. package/lib/web/shadcn.d.ts.map +0 -1
  518. package/lib/web/shadcn.js +0 -102
  519. package/lib/web/shadcn.js.map +0 -1
  520. package/lib/web/tailwind.d.ts +0 -65
  521. package/lib/web/tailwind.d.ts.map +0 -1
  522. package/lib/web/tailwind.js +0 -98
  523. package/lib/web/tailwind.js.map +0 -1
  524. package/lib/web/vite.d.ts +0 -96
  525. package/lib/web/vite.d.ts.map +0 -1
  526. package/lib/web/vite.js +0 -232
  527. package/lib/web/vite.js.map +0 -1
  528. package/lib/web/vitepress/config.d.ts +0 -12
  529. package/lib/web/vitepress/config.d.ts.map +0 -1
  530. package/lib/web/vitepress/config.js +0 -33
  531. package/lib/web/vitepress/config.js.map +0 -1
  532. package/lib/web/vitepress/custom-theme.d.ts +0 -174
  533. package/lib/web/vitepress/custom-theme.d.ts.map +0 -1
  534. package/lib/web/vitepress/custom-theme.js +0 -337
  535. package/lib/web/vitepress/custom-theme.js.map +0 -1
  536. package/lib/web/vitepress/dependencies.d.ts +0 -13
  537. package/lib/web/vitepress/dependencies.d.ts.map +0 -1
  538. package/lib/web/vitepress/dependencies.js +0 -37
  539. package/lib/web/vitepress/dependencies.js.map +0 -1
  540. package/lib/web/vitepress/home-page.d.ts +0 -247
  541. package/lib/web/vitepress/home-page.d.ts.map +0 -1
  542. package/lib/web/vitepress/home-page.js +0 -146
  543. package/lib/web/vitepress/home-page.js.map +0 -1
  544. package/lib/web/vitepress/index.d.ts +0 -6
  545. package/lib/web/vitepress/index.d.ts.map +0 -1
  546. package/lib/web/vitepress/index.js +0 -6
  547. package/lib/web/vitepress/index.js.map +0 -1
  548. package/lib/web/vitepress/process-front-matter-files.d.ts +0 -19
  549. package/lib/web/vitepress/process-front-matter-files.d.ts.map +0 -1
  550. package/lib/web/vitepress/process-front-matter-files.js +0 -73
  551. package/lib/web/vitepress/process-front-matter-files.js.map +0 -1
  552. package/lib/web/vitepress/vitepress.d.ts +0 -75
  553. package/lib/web/vitepress/vitepress.d.ts.map +0 -1
  554. package/lib/web/vitepress/vitepress.js +0 -254
  555. package/lib/web/vitepress/vitepress.js.map +0 -1
  556. package/src/ai/ark.ts +0 -118
  557. package/src/ai/astro-file.ts +0 -270
  558. package/src/ai/client.ts +0 -117
  559. package/src/ai/css-file.ts +0 -247
  560. package/src/ai/data.ts +0 -221
  561. package/src/ai/document.ts +0 -367
  562. package/src/ai/html-file.ts +0 -244
  563. package/src/ai/index.ts +0 -10
  564. package/src/ai/json-file.ts +0 -325
  565. package/src/ai/typescript-file.ts +0 -259
  566. package/src/ai/vue-file.ts +0 -242
  567. package/src/ai/yaml-file.ts +0 -328
  568. package/src/fs/static-astro-file.ts +0 -45
  569. package/src/fs/static-css-file.ts +0 -35
  570. package/src/fs/static-html-file.ts +0 -42
  571. package/src/fs/static-json-file.ts +0 -38
  572. package/src/fs/static-text-file.ts +0 -23
  573. package/src/fs/static-typescript-file.ts +0 -37
  574. package/src/fs/static-vue-file.ts +0 -39
  575. package/src/fs/static-yaml-file.ts +0 -33
  576. package/src/internal/docs/providers.ts +0 -286
  577. package/src/runtime/bind.ts +0 -95
  578. package/src/runtime/global.ts +0 -10
  579. package/src/runtime/plugin.ts +0 -163
  580. package/src/runtime/shims.js +0 -34
  581. package/src/runtime/state.ts +0 -9
  582. package/src/web/astro.ts +0 -643
  583. package/src/web/shadcn-component.ts +0 -72
  584. package/src/web/shadcn.ts +0 -221
  585. package/src/web/tailwind.ts +0 -167
  586. package/src/web/vite.ts +0 -407
  587. package/src/web/vitepress/config.ts +0 -50
  588. package/src/web/vitepress/custom-theme.ts +0 -514
  589. package/src/web/vitepress/dependencies.ts +0 -69
  590. package/src/web/vitepress/home-page.ts +0 -378
  591. package/src/web/vitepress/index.ts +0 -5
  592. package/src/web/vitepress/process-front-matter-files.ts +0 -107
  593. package/src/web/vitepress/vitepress.ts +0 -372
  594. package/templates/sveltekit/bun.lock +0 -1099
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,
@@ -1,25 +1,14 @@
1
- import {
2
- AddPermissionCommand,
1
+ import type {
3
2
  Architecture,
4
- CreateFunctionCommand,
5
- CreateFunctionUrlConfigCommand,
6
- DeleteFunctionCommand,
7
- DeleteFunctionUrlConfigCommand,
8
- GetFunctionCommand,
9
- GetFunctionConfigurationCommand,
10
- GetFunctionUrlConfigCommand,
11
3
  LambdaClient,
12
- ResourceNotFoundException,
13
4
  Runtime,
14
- UpdateFunctionCodeCommand,
15
- UpdateFunctionConfigurationCommand,
16
- UpdateFunctionUrlConfigCommand,
17
5
  } from "@aws-sdk/client-lambda";
18
6
  import type { Context } from "../context.ts";
19
7
  import type { Bundle } from "../esbuild/bundle.ts";
20
8
  import { Resource } from "../resource.ts";
21
9
  import { ignore } from "../util/ignore.ts";
22
10
  import { logger } from "../util/logger.ts";
11
+ import { importPeer } from "../util/peer.ts";
23
12
  import { retry } from "./retry.ts";
24
13
 
25
14
  /**
@@ -28,8 +17,10 @@ import { retry } from "./retry.ts";
28
17
  export interface FunctionProps {
29
18
  /**
30
19
  * Name of the Lambda function
20
+ *
21
+ * @default ${app}-${stage}-${id}
31
22
  */
32
- functionName: string;
23
+ functionName?: string;
33
24
 
34
25
  /**
35
26
  * Bundle for the function
@@ -151,6 +142,11 @@ export interface Function extends Resource<"lambda::Function">, FunctionProps {
151
142
  */
152
143
  arn: string;
153
144
 
145
+ /**
146
+ * Name of the Function
147
+ */
148
+ functionName: string;
149
+
154
150
  /**
155
151
  * Timestamp of the last function modification
156
152
  */
@@ -309,10 +305,36 @@ export interface Function extends Resource<"lambda::Function">, FunctionProps {
309
305
  */
310
306
  export const Function = Resource(
311
307
  "lambda::Function",
312
- async function (this: Context<Function>, _id: string, props: FunctionProps) {
308
+ async function (this: Context<Function>, id: string, props: FunctionProps) {
309
+ const {
310
+ AddPermissionCommand,
311
+ Architecture,
312
+ CreateFunctionCommand,
313
+ CreateFunctionUrlConfigCommand,
314
+ DeleteFunctionCommand,
315
+ DeleteFunctionUrlConfigCommand,
316
+ GetFunctionCommand,
317
+ GetFunctionConfigurationCommand,
318
+ GetFunctionUrlConfigCommand,
319
+ LambdaClient,
320
+ ResourceNotFoundException,
321
+ Runtime,
322
+ UpdateFunctionCodeCommand,
323
+ UpdateFunctionConfigurationCommand,
324
+ UpdateFunctionUrlConfigCommand,
325
+ } = await importPeer(import("@aws-sdk/client-lambda"), "lambda::Function");
313
326
  const client = new LambdaClient({});
314
327
  const region = await resolveRegion(client);
315
328
 
329
+ const functionName =
330
+ props.functionName ??
331
+ this.output?.functionName ??
332
+ this.scope.createPhysicalName(id);
333
+
334
+ if (this.phase === "update" && this.output.functionName !== functionName) {
335
+ this.replace();
336
+ }
337
+
316
338
  if (this.phase === "delete") {
317
339
  // Delete function URL if it exists
318
340
  if (this.output?.url) {
@@ -320,7 +342,7 @@ export const Function = Resource(
320
342
  await retry(() =>
321
343
  client.send(
322
344
  new DeleteFunctionUrlConfigCommand({
323
- FunctionName: props.functionName,
345
+ FunctionName: functionName,
324
346
  }),
325
347
  ),
326
348
  );
@@ -335,7 +357,7 @@ export const Function = Resource(
335
357
  retry(() =>
336
358
  client.send(
337
359
  new DeleteFunctionCommand({
338
- FunctionName: props.functionName,
360
+ FunctionName: functionName,
339
361
  }),
340
362
  ),
341
363
  ),
@@ -352,33 +374,33 @@ export const Function = Resource(
352
374
  await retry(() =>
353
375
  client.send(
354
376
  new GetFunctionCommand({
355
- FunctionName: props.functionName,
377
+ FunctionName: functionName,
356
378
  }),
357
379
  ),
358
380
  );
359
381
 
360
382
  if (this.phase === "update") {
361
383
  // Wait for function to stabilize
362
- await waitForFunctionStabilization(client, props.functionName);
384
+ await waitForFunctionStabilization(client, functionName);
363
385
 
364
386
  // Update function code
365
387
  await retry(() =>
366
388
  client.send(
367
389
  new UpdateFunctionCodeCommand({
368
- FunctionName: props.functionName,
390
+ FunctionName: functionName,
369
391
  ZipFile: code,
370
392
  }),
371
393
  ),
372
394
  );
373
395
 
374
396
  // Wait for code update to stabilize
375
- await waitForFunctionStabilization(client, props.functionName);
397
+ await waitForFunctionStabilization(client, functionName);
376
398
 
377
399
  // Update function configuration
378
400
  await retry(() =>
379
401
  client.send(
380
402
  new UpdateFunctionConfigurationCommand({
381
- FunctionName: props.functionName,
403
+ FunctionName: functionName,
382
404
  Handler: props.handler,
383
405
  Runtime: props.runtime,
384
406
  Role: props.roleArn,
@@ -394,7 +416,7 @@ export const Function = Resource(
394
416
  );
395
417
 
396
418
  // Wait for configuration update to stabilize
397
- await waitForFunctionStabilization(client, props.functionName);
419
+ await waitForFunctionStabilization(client, functionName);
398
420
 
399
421
  // Handle URL configuration
400
422
  if (props.url) {
@@ -403,7 +425,7 @@ export const Function = Resource(
403
425
  const urlConfig = await retry(() =>
404
426
  client.send(
405
427
  new GetFunctionUrlConfigCommand({
406
- FunctionName: props.functionName,
428
+ FunctionName: functionName,
407
429
  }),
408
430
  ),
409
431
  );
@@ -413,7 +435,7 @@ export const Function = Resource(
413
435
  const updateResult = await retry(() =>
414
436
  client.send(
415
437
  new UpdateFunctionUrlConfigCommand({
416
- FunctionName: props.functionName,
438
+ FunctionName: functionName,
417
439
  AuthType: props.url!.authType || "NONE",
418
440
  InvokeMode: props.url!.invokeMode || "BUFFERED",
419
441
  Cors: props.url!.cors
@@ -437,7 +459,7 @@ export const Function = Resource(
437
459
  await retry(() =>
438
460
  client.send(
439
461
  new AddPermissionCommand({
440
- FunctionName: props.functionName,
462
+ FunctionName: functionName,
441
463
  StatementId: "FunctionURLAllowPublicAccess",
442
464
  Action: "lambda:InvokeFunctionUrl",
443
465
  Principal: "*",
@@ -456,7 +478,7 @@ export const Function = Resource(
456
478
  const createResult = await retry(() =>
457
479
  client.send(
458
480
  new CreateFunctionUrlConfigCommand({
459
- FunctionName: props.functionName,
481
+ FunctionName: functionName,
460
482
  AuthType: props.url!.authType || "NONE",
461
483
  InvokeMode: props.url!.invokeMode || "BUFFERED",
462
484
  Cors: props.url!.cors
@@ -480,7 +502,7 @@ export const Function = Resource(
480
502
  await retry(() =>
481
503
  client.send(
482
504
  new AddPermissionCommand({
483
- FunctionName: props.functionName,
505
+ FunctionName: functionName,
484
506
  StatementId: "FunctionURLAllowPublicAccess",
485
507
  Action: "lambda:InvokeFunctionUrl",
486
508
  Principal: "*",
@@ -501,7 +523,7 @@ export const Function = Resource(
501
523
  const createResult = await retry(() =>
502
524
  client.send(
503
525
  new CreateFunctionUrlConfigCommand({
504
- FunctionName: props.functionName,
526
+ FunctionName: functionName,
505
527
  AuthType: props.url!.authType || "NONE",
506
528
  InvokeMode: props.url!.invokeMode || "BUFFERED",
507
529
  Cors: props.url!.cors
@@ -525,7 +547,7 @@ export const Function = Resource(
525
547
  await retry(() =>
526
548
  client.send(
527
549
  new AddPermissionCommand({
528
- FunctionName: props.functionName,
550
+ FunctionName: functionName,
529
551
  StatementId: "FunctionURLAllowPublicAccess",
530
552
  Action: "lambda:InvokeFunctionUrl",
531
553
  Principal: "*",
@@ -549,7 +571,7 @@ export const Function = Resource(
549
571
  await retry(() =>
550
572
  client.send(
551
573
  new DeleteFunctionUrlConfigCommand({
552
- FunctionName: props.functionName,
574
+ FunctionName: functionName,
553
575
  }),
554
576
  ),
555
577
  );
@@ -572,7 +594,7 @@ export const Function = Resource(
572
594
  await retry(() =>
573
595
  client.send(
574
596
  new CreateFunctionCommand({
575
- FunctionName: props.functionName,
597
+ FunctionName: functionName,
576
598
  Code: { ZipFile: code },
577
599
  Handler: props.handler || "index.handler",
578
600
  Runtime: props.runtime || Runtime.nodejs20x,
@@ -617,7 +639,7 @@ export const Function = Resource(
617
639
  const config = await retry(() =>
618
640
  client.send(
619
641
  new GetFunctionConfigurationCommand({
620
- FunctionName: props.functionName,
642
+ FunctionName: functionName,
621
643
  }),
622
644
  ),
623
645
  );
@@ -632,7 +654,7 @@ export const Function = Resource(
632
654
  await new Promise((resolve) => setTimeout(resolve, 2000));
633
655
 
634
656
  // Verify function is fully stable and role is usable
635
- await waitForFunctionStabilization(client, props.functionName);
657
+ await waitForFunctionStabilization(client, functionName);
636
658
 
637
659
  // Create URL configuration if needed
638
660
  if (props.url) {
@@ -640,7 +662,7 @@ export const Function = Resource(
640
662
  const createResult = await retry(() =>
641
663
  client.send(
642
664
  new CreateFunctionUrlConfigCommand({
643
- FunctionName: props.functionName,
665
+ FunctionName: functionName,
644
666
  AuthType: props.url!.authType || "NONE",
645
667
  InvokeMode: props.url!.invokeMode || "BUFFERED",
646
668
  Cors: props.url!.cors
@@ -664,7 +686,7 @@ export const Function = Resource(
664
686
  await retry(() =>
665
687
  client.send(
666
688
  new AddPermissionCommand({
667
- FunctionName: props.functionName,
689
+ FunctionName: functionName,
668
690
  StatementId: "FunctionURLAllowPublicAccess",
669
691
  Action: "lambda:InvokeFunctionUrl",
670
692
  Principal: "*",
@@ -692,14 +714,14 @@ export const Function = Resource(
692
714
  retry(() =>
693
715
  client.send(
694
716
  new GetFunctionCommand({
695
- FunctionName: props.functionName,
717
+ FunctionName: functionName,
696
718
  }),
697
719
  ),
698
720
  ),
699
721
  retry(() =>
700
722
  client.send(
701
723
  new GetFunctionConfigurationCommand({
702
- FunctionName: props.functionName,
724
+ FunctionName: functionName,
703
725
  }),
704
726
  ),
705
727
  ),
@@ -711,7 +733,7 @@ export const Function = Resource(
711
733
  const urlConfig = await retry(() =>
712
734
  client.send(
713
735
  new GetFunctionUrlConfigCommand({
714
- FunctionName: props.functionName,
736
+ FunctionName: functionName,
715
737
  }),
716
738
  ),
717
739
  );
@@ -726,6 +748,7 @@ export const Function = Resource(
726
748
  return this({
727
749
  ...props,
728
750
  arn: config.FunctionArn!,
751
+ functionName,
729
752
  lastModified: config.LastModified!,
730
753
  version: config.Version!,
731
754
  qualifiedArn: `${config.FunctionArn}:${config.Version}`,
@@ -755,6 +778,9 @@ async function waitForFunctionStabilization(
755
778
  client: LambdaClient,
756
779
  functionName: string,
757
780
  ) {
781
+ const { GetFunctionConfigurationCommand } = await import(
782
+ "@aws-sdk/client-lambda"
783
+ );
758
784
  while (true) {
759
785
  const config = await retry(() =>
760
786
  client.send(
@@ -1,12 +1,7 @@
1
- import {
2
- AttachRolePolicyCommand,
3
- DetachRolePolicyCommand,
4
- IAMClient,
5
- NoSuchEntityException,
6
- } from "@aws-sdk/client-iam";
7
1
  import type { Context } from "../context.ts";
8
2
  import { Resource } from "../resource.ts";
9
3
  import { ignore } from "../util/ignore.ts";
4
+ import { importPeer } from "../util/peer.ts";
10
5
  import { retry } from "./retry.ts";
11
6
 
12
7
  /**
@@ -69,6 +64,15 @@ export const PolicyAttachment = Resource(
69
64
  _id: string,
70
65
  props: PolicyAttachmentProps,
71
66
  ) {
67
+ const {
68
+ AttachRolePolicyCommand,
69
+ DetachRolePolicyCommand,
70
+ IAMClient,
71
+ NoSuchEntityException,
72
+ } = await importPeer(
73
+ import("@aws-sdk/client-iam"),
74
+ "iam::PolicyAttachment",
75
+ );
72
76
  const client = new IAMClient({});
73
77
 
74
78
  if (this.phase === "delete") {