alchemy 0.62.3 → 0.63.1

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 (612) hide show
  1. package/bin/alchemy.js +1517 -1203
  2. package/bin/commands/deploy.ts +2 -0
  3. package/bin/commands/dev.ts +2 -0
  4. package/bin/commands/init.ts +1 -1
  5. package/bin/services/execute-alchemy.ts +11 -0
  6. package/bin/services/github-workflow.ts +2 -2
  7. package/bin/services/template-manager.ts +2 -0
  8. package/bin/types.ts +2 -1
  9. package/lib/alchemy.d.ts +6 -22
  10. package/lib/alchemy.d.ts.map +1 -1
  11. package/lib/alchemy.js +65 -169
  12. package/lib/alchemy.js.map +1 -1
  13. package/lib/apply.d.ts +0 -2
  14. package/lib/apply.d.ts.map +1 -1
  15. package/lib/apply.js +2 -16
  16. package/lib/apply.js.map +1 -1
  17. package/lib/aws/account-id.d.ts.map +1 -1
  18. package/lib/aws/account-id.js +3 -2
  19. package/lib/aws/account-id.js.map +1 -1
  20. package/lib/aws/bucket.d.ts +8 -2
  21. package/lib/aws/bucket.d.ts.map +1 -1
  22. package/lib/aws/bucket.js +21 -14
  23. package/lib/aws/bucket.js.map +1 -1
  24. package/lib/aws/ec2/security-group.d.ts +8 -2
  25. package/lib/aws/ec2/security-group.d.ts.map +1 -1
  26. package/lib/aws/ec2/security-group.js +7 -2
  27. package/lib/aws/ec2/security-group.js.map +1 -1
  28. package/lib/aws/function.d.ts +9 -3
  29. package/lib/aws/function.d.ts.map +1 -1
  30. package/lib/aws/function.js +35 -26
  31. package/lib/aws/function.js.map +1 -1
  32. package/lib/aws/policy-attachment.d.ts.map +1 -1
  33. package/lib/aws/policy-attachment.js +2 -1
  34. package/lib/aws/policy-attachment.js.map +1 -1
  35. package/lib/aws/policy.d.ts +8 -2
  36. package/lib/aws/policy.d.ts.map +1 -1
  37. package/lib/aws/policy.js +13 -4
  38. package/lib/aws/policy.js.map +1 -1
  39. package/lib/aws/queue.d.ts +8 -2
  40. package/lib/aws/queue.d.ts.map +1 -1
  41. package/lib/aws/queue.js +22 -14
  42. package/lib/aws/queue.js.map +1 -1
  43. package/lib/aws/role.d.ts +8 -2
  44. package/lib/aws/role.d.ts.map +1 -1
  45. package/lib/aws/role.js +10 -3
  46. package/lib/aws/role.js.map +1 -1
  47. package/lib/aws/ses.d.ts +1 -1
  48. package/lib/aws/ses.d.ts.map +1 -1
  49. package/lib/aws/ses.js +2 -1
  50. package/lib/aws/ses.js.map +1 -1
  51. package/lib/aws/ssm-parameter.d.ts +8 -2
  52. package/lib/aws/ssm-parameter.d.ts.map +1 -1
  53. package/lib/aws/ssm-parameter.js +15 -10
  54. package/lib/aws/ssm-parameter.js.map +1 -1
  55. package/lib/aws/table.d.ts +8 -2
  56. package/lib/aws/table.d.ts.map +1 -1
  57. package/lib/aws/table.js +17 -9
  58. package/lib/aws/table.js.map +1 -1
  59. package/lib/cloudflare/account-api-token.d.ts +2 -2
  60. package/lib/cloudflare/account-api-token.d.ts.map +1 -1
  61. package/lib/cloudflare/account-api-token.js +7 -6
  62. package/lib/cloudflare/account-api-token.js.map +1 -1
  63. package/lib/cloudflare/ai-gateway.d.ts +9 -4
  64. package/lib/cloudflare/ai-gateway.d.ts.map +1 -1
  65. package/lib/cloudflare/ai-gateway.js +20 -24
  66. package/lib/cloudflare/ai-gateway.js.map +1 -1
  67. package/lib/cloudflare/api-schema.d.ts +2 -2
  68. package/lib/cloudflare/api-schema.d.ts.map +1 -1
  69. package/lib/cloudflare/api-schema.js +6 -2
  70. package/lib/cloudflare/api-schema.js.map +1 -1
  71. package/lib/cloudflare/api-shield.d.ts +5 -1
  72. package/lib/cloudflare/api-shield.d.ts.map +1 -1
  73. package/lib/cloudflare/api-shield.js +6 -1
  74. package/lib/cloudflare/api-shield.js.map +1 -1
  75. package/lib/cloudflare/assets.d.ts +1 -1
  76. package/lib/cloudflare/assets.d.ts.map +1 -1
  77. package/lib/cloudflare/astro/astro.d.ts.map +1 -1
  78. package/lib/cloudflare/astro/astro.js +3 -1
  79. package/lib/cloudflare/astro/astro.js.map +1 -1
  80. package/lib/cloudflare/astro/plugin.d.ts +2 -1
  81. package/lib/cloudflare/astro/plugin.d.ts.map +1 -1
  82. package/lib/cloudflare/astro/plugin.js.map +1 -1
  83. package/lib/cloudflare/bindings.d.ts +2 -2
  84. package/lib/cloudflare/bindings.d.ts.map +1 -1
  85. package/lib/cloudflare/bound.d.ts +1 -1
  86. package/lib/cloudflare/bound.d.ts.map +1 -1
  87. package/lib/cloudflare/bucket.d.ts +120 -1
  88. package/lib/cloudflare/bucket.d.ts.map +1 -1
  89. package/lib/cloudflare/bucket.js +80 -2
  90. package/lib/cloudflare/bucket.js.map +1 -1
  91. package/lib/cloudflare/cloudflare-env-proxy.js +1 -1
  92. package/lib/cloudflare/cloudflare-env-proxy.js.map +1 -1
  93. package/lib/cloudflare/compatibility-date.gen.d.ts +1 -1
  94. package/lib/cloudflare/compatibility-date.gen.js +1 -1
  95. package/lib/cloudflare/container.d.ts +10 -4
  96. package/lib/cloudflare/container.d.ts.map +1 -1
  97. package/lib/cloudflare/container.js +12 -9
  98. package/lib/cloudflare/container.js.map +1 -1
  99. package/lib/cloudflare/custom-domain.js +2 -1
  100. package/lib/cloudflare/custom-domain.js.map +1 -1
  101. package/lib/cloudflare/d1-database.d.ts +1 -1
  102. package/lib/cloudflare/d1-database.d.ts.map +1 -1
  103. package/lib/cloudflare/d1-database.js +6 -2
  104. package/lib/cloudflare/d1-database.js.map +1 -1
  105. package/lib/cloudflare/dispatch-namespace.d.ts +2 -0
  106. package/lib/cloudflare/dispatch-namespace.d.ts.map +1 -1
  107. package/lib/cloudflare/dispatch-namespace.js +7 -5
  108. package/lib/cloudflare/dispatch-namespace.js.map +1 -1
  109. package/lib/cloudflare/durable-object-namespace.d.ts.map +1 -1
  110. package/lib/cloudflare/durable-object-namespace.js.map +1 -1
  111. package/lib/cloudflare/hyperdrive.d.ts +7 -1
  112. package/lib/cloudflare/hyperdrive.d.ts.map +1 -1
  113. package/lib/cloudflare/hyperdrive.js +3 -2
  114. package/lib/cloudflare/hyperdrive.js.map +1 -1
  115. package/lib/cloudflare/kv-namespace.d.ts +3 -0
  116. package/lib/cloudflare/kv-namespace.d.ts.map +1 -1
  117. package/lib/cloudflare/kv-namespace.js +11 -2
  118. package/lib/cloudflare/kv-namespace.js.map +1 -1
  119. package/lib/cloudflare/miniflare/miniflare-worker-proxy.js +3 -1
  120. package/lib/cloudflare/miniflare/miniflare-worker-proxy.js.map +1 -1
  121. package/lib/cloudflare/miniflare/paths.d.ts +4 -0
  122. package/lib/cloudflare/miniflare/paths.d.ts.map +1 -1
  123. package/lib/cloudflare/miniflare/paths.js +11 -0
  124. package/lib/cloudflare/miniflare/paths.js.map +1 -1
  125. package/lib/cloudflare/pipeline.d.ts +14 -3
  126. package/lib/cloudflare/pipeline.d.ts.map +1 -1
  127. package/lib/cloudflare/pipeline.js +31 -2
  128. package/lib/cloudflare/pipeline.js.map +1 -1
  129. package/lib/cloudflare/queue-consumer.js +1 -1
  130. package/lib/cloudflare/queue-consumer.js.map +1 -1
  131. package/lib/cloudflare/queue.d.ts +4 -2
  132. package/lib/cloudflare/queue.d.ts.map +1 -1
  133. package/lib/cloudflare/queue.js +13 -9
  134. package/lib/cloudflare/queue.js.map +1 -1
  135. package/lib/cloudflare/react-router/plugin.d.ts +1 -1
  136. package/lib/cloudflare/react-router/plugin.d.ts.map +1 -1
  137. package/lib/cloudflare/react-router/react-router.d.ts.map +1 -1
  138. package/lib/cloudflare/react-router/react-router.js +32 -2
  139. package/lib/cloudflare/react-router/react-router.js.map +1 -1
  140. package/lib/cloudflare/redwood/plugin.d.ts +2 -1
  141. package/lib/cloudflare/redwood/plugin.d.ts.map +1 -1
  142. package/lib/cloudflare/redwood/plugin.js.map +1 -1
  143. package/lib/cloudflare/route.js +1 -1
  144. package/lib/cloudflare/route.js.map +1 -1
  145. package/lib/cloudflare/ruleset.d.ts +3 -1
  146. package/lib/cloudflare/ruleset.d.ts.map +1 -1
  147. package/lib/cloudflare/ruleset.js +3 -2
  148. package/lib/cloudflare/ruleset.js.map +1 -1
  149. package/lib/cloudflare/secret.d.ts +6 -23
  150. package/lib/cloudflare/secret.d.ts.map +1 -1
  151. package/lib/cloudflare/secret.js +8 -4
  152. package/lib/cloudflare/secret.js.map +1 -1
  153. package/lib/cloudflare/secrets-store.d.ts +1 -1
  154. package/lib/cloudflare/secrets-store.d.ts.map +1 -1
  155. package/lib/cloudflare/secrets-store.js +5 -2
  156. package/lib/cloudflare/secrets-store.js.map +1 -1
  157. package/lib/cloudflare/tunnel.d.ts +5 -1
  158. package/lib/cloudflare/tunnel.d.ts.map +1 -1
  159. package/lib/cloudflare/tunnel.js +5 -1
  160. package/lib/cloudflare/tunnel.js.map +1 -1
  161. package/lib/cloudflare/vectorize-index.d.ts +7 -1
  162. package/lib/cloudflare/vectorize-index.d.ts.map +1 -1
  163. package/lib/cloudflare/vectorize-index.js +5 -2
  164. package/lib/cloudflare/vectorize-index.js.map +1 -1
  165. package/lib/cloudflare/vite/plugin.d.ts +2 -1
  166. package/lib/cloudflare/vite/plugin.d.ts.map +1 -1
  167. package/lib/cloudflare/vite/plugin.js.map +1 -1
  168. package/lib/cloudflare/website.js +1 -1
  169. package/lib/cloudflare/website.js.map +1 -1
  170. package/lib/cloudflare/worker-metadata.js +1 -1
  171. package/lib/cloudflare/worker-metadata.js.map +1 -1
  172. package/lib/cloudflare/worker.d.ts +1 -1
  173. package/lib/cloudflare/worker.d.ts.map +1 -1
  174. package/lib/cloudflare/worker.js +12 -7
  175. package/lib/cloudflare/worker.js.map +1 -1
  176. package/lib/cloudflare/wrangler.json.d.ts +1 -1
  177. package/lib/cloudflare/wrangler.json.d.ts.map +1 -1
  178. package/lib/cloudflare/wrangler.json.js +5 -3
  179. package/lib/cloudflare/wrangler.json.js.map +1 -1
  180. package/lib/docker/container.d.ts +6 -0
  181. package/lib/docker/container.d.ts.map +1 -1
  182. package/lib/docker/container.js +5 -1
  183. package/lib/docker/container.js.map +1 -1
  184. package/lib/docker/network.d.ts +8 -2
  185. package/lib/docker/network.d.ts.map +1 -1
  186. package/lib/docker/network.js +7 -2
  187. package/lib/docker/network.js.map +1 -1
  188. package/lib/docker/volume.d.ts +8 -2
  189. package/lib/docker/volume.d.ts.map +1 -1
  190. package/lib/docker/volume.js +6 -4
  191. package/lib/docker/volume.js.map +1 -1
  192. package/lib/esbuild/bundle.d.ts +1 -1
  193. package/lib/fs/index.d.ts +0 -8
  194. package/lib/fs/index.d.ts.map +1 -1
  195. package/lib/fs/index.js +0 -8
  196. package/lib/fs/index.js.map +1 -1
  197. package/lib/github/client.d.ts +1 -1
  198. package/lib/github/client.d.ts.map +1 -1
  199. package/lib/github/client.js +2 -1
  200. package/lib/github/client.js.map +1 -1
  201. package/lib/github/repository-environment.d.ts +8 -2
  202. package/lib/github/repository-environment.d.ts.map +1 -1
  203. package/lib/github/repository-environment.js +16 -12
  204. package/lib/github/repository-environment.js.map +1 -1
  205. package/lib/neon/project.d.ts +7 -1
  206. package/lib/neon/project.d.ts.map +1 -1
  207. package/lib/neon/project.js +14 -11
  208. package/lib/neon/project.js.map +1 -1
  209. package/lib/planetscale/branch.d.ts +4 -2
  210. package/lib/planetscale/branch.d.ts.map +1 -1
  211. package/lib/planetscale/branch.js +18 -12
  212. package/lib/planetscale/branch.js.map +1 -1
  213. package/lib/planetscale/database.d.ts +8 -2
  214. package/lib/planetscale/database.d.ts.map +1 -1
  215. package/lib/planetscale/database.js +24 -16
  216. package/lib/planetscale/database.js.map +1 -1
  217. package/lib/planetscale/password.d.ts +8 -2
  218. package/lib/planetscale/password.d.ts.map +1 -1
  219. package/lib/planetscale/password.js +2 -2
  220. package/lib/planetscale/password.js.map +1 -1
  221. package/lib/resource.d.ts +0 -2
  222. package/lib/resource.d.ts.map +1 -1
  223. package/lib/resource.js +1 -9
  224. package/lib/resource.js.map +1 -1
  225. package/lib/scope.d.ts +9 -3
  226. package/lib/scope.d.ts.map +1 -1
  227. package/lib/scope.js +21 -34
  228. package/lib/scope.js.map +1 -1
  229. package/lib/sentry/client-key.d.ts +7 -1
  230. package/lib/sentry/client-key.d.ts.map +1 -1
  231. package/lib/sentry/client-key.js +45 -6
  232. package/lib/sentry/client-key.js.map +1 -1
  233. package/lib/sentry/project.d.ts +8 -2
  234. package/lib/sentry/project.d.ts.map +1 -1
  235. package/lib/sentry/project.js +35 -5
  236. package/lib/sentry/project.js.map +1 -1
  237. package/lib/sentry/team.d.ts +8 -2
  238. package/lib/sentry/team.d.ts.map +1 -1
  239. package/lib/sentry/team.js +36 -6
  240. package/lib/sentry/team.js.map +1 -1
  241. package/lib/serde.d.ts +0 -5
  242. package/lib/serde.d.ts.map +1 -1
  243. package/lib/serde.js +0 -28
  244. package/lib/serde.js.map +1 -1
  245. package/lib/state/d1-state-store.d.ts +1 -1
  246. package/lib/state/d1-state-store.d.ts.map +1 -1
  247. package/lib/state/d1-state-store.js +5 -5
  248. package/lib/state/d1-state-store.js.map +1 -1
  249. package/lib/state/sqlite-state-store.d.ts.map +1 -1
  250. package/lib/state/sqlite-state-store.js +7 -11
  251. package/lib/state/sqlite-state-store.js.map +1 -1
  252. package/lib/stripe/card.d.ts.map +1 -1
  253. package/lib/stripe/card.js +3 -2
  254. package/lib/stripe/card.js.map +1 -1
  255. package/lib/stripe/client.d.ts +2 -2
  256. package/lib/stripe/client.d.ts.map +1 -1
  257. package/lib/stripe/client.js +4 -3
  258. package/lib/stripe/client.js.map +1 -1
  259. package/lib/stripe/coupon.d.ts.map +1 -1
  260. package/lib/stripe/coupon.js +4 -3
  261. package/lib/stripe/coupon.js.map +1 -1
  262. package/lib/stripe/customer.js +2 -2
  263. package/lib/stripe/customer.js.map +1 -1
  264. package/lib/stripe/entitlements-feature.d.ts.map +1 -1
  265. package/lib/stripe/entitlements-feature.js +3 -2
  266. package/lib/stripe/entitlements-feature.js.map +1 -1
  267. package/lib/stripe/file.d.ts.map +1 -1
  268. package/lib/stripe/file.js +3 -2
  269. package/lib/stripe/file.js.map +1 -1
  270. package/lib/stripe/meter.js +2 -2
  271. package/lib/stripe/meter.js.map +1 -1
  272. package/lib/stripe/portal-configuration.d.ts.map +1 -1
  273. package/lib/stripe/portal-configuration.js +3 -2
  274. package/lib/stripe/portal-configuration.js.map +1 -1
  275. package/lib/stripe/price.d.ts.map +1 -1
  276. package/lib/stripe/price.js +3 -2
  277. package/lib/stripe/price.js.map +1 -1
  278. package/lib/stripe/product-feature.d.ts.map +1 -1
  279. package/lib/stripe/product-feature.js +3 -2
  280. package/lib/stripe/product-feature.js.map +1 -1
  281. package/lib/stripe/product.d.ts.map +1 -1
  282. package/lib/stripe/product.js +3 -2
  283. package/lib/stripe/product.js.map +1 -1
  284. package/lib/stripe/promotion-code.d.ts.map +1 -1
  285. package/lib/stripe/promotion-code.js +3 -2
  286. package/lib/stripe/promotion-code.js.map +1 -1
  287. package/lib/stripe/shipping-rate.d.ts.map +1 -1
  288. package/lib/stripe/shipping-rate.js +4 -3
  289. package/lib/stripe/shipping-rate.js.map +1 -1
  290. package/lib/stripe/tax-rate.d.ts.map +1 -1
  291. package/lib/stripe/tax-rate.js +3 -2
  292. package/lib/stripe/tax-rate.js.map +1 -1
  293. package/lib/stripe/webhook.d.ts.map +1 -1
  294. package/lib/stripe/webhook.js +4 -3
  295. package/lib/stripe/webhook.js.map +1 -1
  296. package/lib/test/vitest.d.ts.map +1 -1
  297. package/lib/test/vitest.js +1 -0
  298. package/lib/test/vitest.js.map +1 -1
  299. package/lib/upstash/redis.d.ts +8 -2
  300. package/lib/upstash/redis.d.ts.map +1 -1
  301. package/lib/upstash/redis.js +6 -5
  302. package/lib/upstash/redis.js.map +1 -1
  303. package/lib/util/idempotent-spawn.d.ts.map +1 -1
  304. package/lib/util/idempotent-spawn.js +21 -2
  305. package/lib/util/idempotent-spawn.js.map +1 -1
  306. package/lib/util/ignore-matcher.d.ts.map +1 -1
  307. package/lib/util/ignore-matcher.js +3 -1
  308. package/lib/util/ignore-matcher.js.map +1 -1
  309. package/lib/util/peer.d.ts +10 -0
  310. package/lib/util/peer.d.ts.map +1 -0
  311. package/lib/util/peer.js +42 -0
  312. package/lib/util/peer.js.map +1 -0
  313. package/lib/util/xml.js +1 -1
  314. package/lib/util/xml.js.map +1 -1
  315. package/lib/vercel/project.d.ts +7 -1
  316. package/lib/vercel/project.d.ts.map +1 -1
  317. package/lib/vercel/project.js +28 -0
  318. package/lib/vercel/project.js.map +1 -1
  319. package/package.json +88 -74
  320. package/src/alchemy.ts +76 -222
  321. package/src/apply.ts +6 -19
  322. package/src/aws/account-id.ts +6 -3
  323. package/src/aws/bucket.ts +43 -32
  324. package/src/aws/ec2/security-group.ts +15 -3
  325. package/src/aws/function.ts +65 -39
  326. package/src/aws/policy-attachment.ts +10 -6
  327. package/src/aws/policy.ts +33 -15
  328. package/src/aws/queue.ts +50 -29
  329. package/src/aws/role.ts +37 -20
  330. package/src/aws/ses.ts +24 -20
  331. package/src/aws/ssm-parameter.ts +40 -20
  332. package/src/aws/table.ts +35 -17
  333. package/src/cloudflare/account-api-token.ts +9 -7
  334. package/src/cloudflare/ai-gateway.ts +37 -34
  335. package/src/cloudflare/api-schema.ts +33 -26
  336. package/src/cloudflare/api-shield.ts +15 -2
  337. package/src/cloudflare/astro/astro.ts +5 -1
  338. package/src/cloudflare/astro/plugin.ts +2 -1
  339. package/src/cloudflare/bindings.ts +2 -2
  340. package/src/cloudflare/bound.ts +1 -1
  341. package/src/cloudflare/bucket.ts +242 -3
  342. package/src/cloudflare/cloudflare-env-proxy.ts +1 -1
  343. package/src/cloudflare/compatibility-date.gen.ts +1 -1
  344. package/src/cloudflare/container.ts +23 -12
  345. package/src/cloudflare/custom-domain.ts +2 -2
  346. package/src/cloudflare/d1-database.ts +10 -3
  347. package/src/cloudflare/dispatch-namespace.ts +10 -7
  348. package/src/cloudflare/durable-object-namespace.ts +0 -1
  349. package/src/cloudflare/hyperdrive.ts +14 -4
  350. package/src/cloudflare/kv-namespace.ts +25 -2
  351. package/src/cloudflare/miniflare/miniflare-worker-proxy.ts +3 -1
  352. package/src/cloudflare/miniflare/paths.ts +13 -0
  353. package/src/cloudflare/pipeline.ts +76 -28
  354. package/src/cloudflare/queue-consumer.ts +1 -1
  355. package/src/cloudflare/queue.ts +26 -14
  356. package/src/cloudflare/react-router/react-router.ts +28 -2
  357. package/src/cloudflare/redwood/plugin.ts +3 -2
  358. package/src/cloudflare/route.ts +1 -1
  359. package/src/cloudflare/ruleset.ts +7 -2
  360. package/src/cloudflare/secret.ts +20 -31
  361. package/src/cloudflare/secrets-store.ts +7 -3
  362. package/src/cloudflare/tunnel.ts +13 -2
  363. package/src/cloudflare/vectorize-index.ts +14 -3
  364. package/src/cloudflare/vite/plugin.ts +3 -2
  365. package/src/cloudflare/website.ts +1 -1
  366. package/src/cloudflare/worker-metadata.ts +1 -1
  367. package/src/cloudflare/worker.ts +35 -23
  368. package/src/cloudflare/wrangler.json.ts +7 -4
  369. package/src/docker/container.ts +13 -1
  370. package/src/docker/network.ts +18 -3
  371. package/src/docker/volume.ts +17 -6
  372. package/src/fs/index.ts +0 -8
  373. package/src/github/client.ts +6 -2
  374. package/src/github/repository-environment.ts +27 -13
  375. package/src/neon/project.ts +24 -11
  376. package/src/planetscale/branch.ts +24 -13
  377. package/src/planetscale/database.ts +38 -17
  378. package/src/planetscale/password.ts +10 -3
  379. package/src/resource.ts +1 -10
  380. package/src/scope.ts +29 -38
  381. package/src/sentry/client-key.ts +74 -6
  382. package/src/sentry/project.ts +59 -6
  383. package/src/sentry/team.ts +55 -7
  384. package/src/serde.ts +0 -44
  385. package/src/state/d1-state-store.ts +13 -6
  386. package/src/state/sqlite-state-store.ts +16 -17
  387. package/src/stripe/card.ts +5 -2
  388. package/src/stripe/client.ts +10 -3
  389. package/src/stripe/coupon.ts +4 -3
  390. package/src/stripe/customer.ts +2 -2
  391. package/src/stripe/entitlements-feature.ts +5 -2
  392. package/src/stripe/file.ts +3 -2
  393. package/src/stripe/meter.ts +2 -2
  394. package/src/stripe/portal-configuration.ts +5 -2
  395. package/src/stripe/price.ts +3 -2
  396. package/src/stripe/product-feature.ts +5 -2
  397. package/src/stripe/product.ts +3 -2
  398. package/src/stripe/promotion-code.ts +3 -2
  399. package/src/stripe/shipping-rate.ts +4 -3
  400. package/src/stripe/tax-rate.ts +3 -2
  401. package/src/stripe/webhook.ts +4 -3
  402. package/src/test/vitest.ts +1 -0
  403. package/src/upstash/redis.ts +16 -6
  404. package/src/util/idempotent-spawn.ts +23 -2
  405. package/src/util/ignore-matcher.ts +3 -1
  406. package/src/util/peer.ts +53 -0
  407. package/src/util/xml.ts +1 -1
  408. package/src/vercel/project.ts +46 -1
  409. package/templates/hono/README.md +19 -0
  410. package/templates/hono/_env +1 -0
  411. package/templates/hono/_env.example +1 -0
  412. package/templates/hono/_gitignore +34 -0
  413. package/templates/hono/alchemy.run.ts +22 -0
  414. package/templates/hono/package.json +18 -0
  415. package/templates/hono/src/index.ts +17 -0
  416. package/templates/hono/tsconfig.json +13 -0
  417. package/templates/hono/types/env.d.ts +16 -0
  418. package/templates/react-router/vite.config.ts +5 -3
  419. package/workers/cloudflare-state-store.js +69 -74
  420. package/workers/dofs-state-store.js +1 -1
  421. package/bin/bootstrap-s3.ts +0 -255
  422. package/lib/ai/ark.d.ts +0 -12
  423. package/lib/ai/ark.d.ts.map +0 -1
  424. package/lib/ai/ark.js +0 -87
  425. package/lib/ai/ark.js.map +0 -1
  426. package/lib/ai/astro-file.d.ts +0 -138
  427. package/lib/ai/astro-file.d.ts.map +0 -1
  428. package/lib/ai/astro-file.js +0 -158
  429. package/lib/ai/astro-file.js.map +0 -1
  430. package/lib/ai/client.d.ts +0 -51
  431. package/lib/ai/client.d.ts.map +0 -1
  432. package/lib/ai/client.js +0 -58
  433. package/lib/ai/client.js.map +0 -1
  434. package/lib/ai/css-file.d.ts +0 -132
  435. package/lib/ai/css-file.d.ts.map +0 -1
  436. package/lib/ai/css-file.js +0 -142
  437. package/lib/ai/css-file.js.map +0 -1
  438. package/lib/ai/data.d.ts +0 -152
  439. package/lib/ai/data.d.ts.map +0 -1
  440. package/lib/ai/data.js +0 -120
  441. package/lib/ai/data.js.map +0 -1
  442. package/lib/ai/document.d.ts +0 -208
  443. package/lib/ai/document.d.ts.map +0 -1
  444. package/lib/ai/document.js +0 -206
  445. package/lib/ai/document.js.map +0 -1
  446. package/lib/ai/html-file.d.ts +0 -129
  447. package/lib/ai/html-file.d.ts.map +0 -1
  448. package/lib/ai/html-file.js +0 -139
  449. package/lib/ai/html-file.js.map +0 -1
  450. package/lib/ai/index.d.ts +0 -11
  451. package/lib/ai/index.d.ts.map +0 -1
  452. package/lib/ai/index.js +0 -11
  453. package/lib/ai/index.js.map +0 -1
  454. package/lib/ai/json-file.d.ts +0 -161
  455. package/lib/ai/json-file.d.ts.map +0 -1
  456. package/lib/ai/json-file.js +0 -188
  457. package/lib/ai/json-file.js.map +0 -1
  458. package/lib/ai/typescript-file.d.ts +0 -140
  459. package/lib/ai/typescript-file.d.ts.map +0 -1
  460. package/lib/ai/typescript-file.js +0 -146
  461. package/lib/ai/typescript-file.js.map +0 -1
  462. package/lib/ai/vue-file.d.ts +0 -127
  463. package/lib/ai/vue-file.d.ts.map +0 -1
  464. package/lib/ai/vue-file.js +0 -137
  465. package/lib/ai/vue-file.js.map +0 -1
  466. package/lib/ai/yaml-file.d.ts +0 -170
  467. package/lib/ai/yaml-file.d.ts.map +0 -1
  468. package/lib/ai/yaml-file.js +0 -201
  469. package/lib/ai/yaml-file.js.map +0 -1
  470. package/lib/fs/static-astro-file.d.ts +0 -35
  471. package/lib/fs/static-astro-file.d.ts.map +0 -1
  472. package/lib/fs/static-astro-file.js +0 -40
  473. package/lib/fs/static-astro-file.js.map +0 -1
  474. package/lib/fs/static-css-file.d.ts +0 -25
  475. package/lib/fs/static-css-file.d.ts.map +0 -1
  476. package/lib/fs/static-css-file.js +0 -30
  477. package/lib/fs/static-css-file.js.map +0 -1
  478. package/lib/fs/static-html-file.d.ts +0 -32
  479. package/lib/fs/static-html-file.d.ts.map +0 -1
  480. package/lib/fs/static-html-file.js +0 -37
  481. package/lib/fs/static-html-file.js.map +0 -1
  482. package/lib/fs/static-json-file.d.ts +0 -18
  483. package/lib/fs/static-json-file.d.ts.map +0 -1
  484. package/lib/fs/static-json-file.js +0 -19
  485. package/lib/fs/static-json-file.js.map +0 -1
  486. package/lib/fs/static-text-file.d.ts +0 -13
  487. package/lib/fs/static-text-file.d.ts.map +0 -1
  488. package/lib/fs/static-text-file.js +0 -9
  489. package/lib/fs/static-text-file.js.map +0 -1
  490. package/lib/fs/static-typescript-file.d.ts +0 -20
  491. package/lib/fs/static-typescript-file.d.ts.map +0 -1
  492. package/lib/fs/static-typescript-file.js +0 -16
  493. package/lib/fs/static-typescript-file.js.map +0 -1
  494. package/lib/fs/static-vue-file.d.ts +0 -29
  495. package/lib/fs/static-vue-file.d.ts.map +0 -1
  496. package/lib/fs/static-vue-file.js +0 -34
  497. package/lib/fs/static-vue-file.js.map +0 -1
  498. package/lib/fs/static-yaml-file.d.ts +0 -23
  499. package/lib/fs/static-yaml-file.d.ts.map +0 -1
  500. package/lib/fs/static-yaml-file.js +0 -10
  501. package/lib/fs/static-yaml-file.js.map +0 -1
  502. package/lib/internal/docs/providers.d.ts +0 -34
  503. package/lib/internal/docs/providers.d.ts.map +0 -1
  504. package/lib/internal/docs/providers.js +0 -200
  505. package/lib/internal/docs/providers.js.map +0 -1
  506. package/lib/runtime/bind.d.ts +0 -25
  507. package/lib/runtime/bind.d.ts.map +0 -1
  508. package/lib/runtime/bind.js +0 -76
  509. package/lib/runtime/bind.js.map +0 -1
  510. package/lib/runtime/global.d.ts +0 -8
  511. package/lib/runtime/global.d.ts.map +0 -1
  512. package/lib/runtime/global.js +0 -3
  513. package/lib/runtime/global.js.map +0 -1
  514. package/lib/runtime/plugin.d.ts +0 -35
  515. package/lib/runtime/plugin.d.ts.map +0 -1
  516. package/lib/runtime/plugin.js +0 -134
  517. package/lib/runtime/plugin.js.map +0 -1
  518. package/lib/runtime/shims.d.ts +0 -6
  519. package/lib/runtime/shims.d.ts.map +0 -1
  520. package/lib/runtime/shims.js +0 -27
  521. package/lib/runtime/shims.js.map +0 -1
  522. package/lib/runtime/state.d.ts +0 -5
  523. package/lib/runtime/state.d.ts.map +0 -1
  524. package/lib/runtime/state.js +0 -4
  525. package/lib/runtime/state.js.map +0 -1
  526. package/lib/web/astro.d.ts +0 -148
  527. package/lib/web/astro.d.ts.map +0 -1
  528. package/lib/web/astro.js +0 -419
  529. package/lib/web/astro.js.map +0 -1
  530. package/lib/web/shadcn-component.d.ts +0 -30
  531. package/lib/web/shadcn-component.d.ts.map +0 -1
  532. package/lib/web/shadcn-component.js +0 -25
  533. package/lib/web/shadcn-component.js.map +0 -1
  534. package/lib/web/shadcn.d.ts +0 -98
  535. package/lib/web/shadcn.d.ts.map +0 -1
  536. package/lib/web/shadcn.js +0 -102
  537. package/lib/web/shadcn.js.map +0 -1
  538. package/lib/web/tailwind.d.ts +0 -65
  539. package/lib/web/tailwind.d.ts.map +0 -1
  540. package/lib/web/tailwind.js +0 -98
  541. package/lib/web/tailwind.js.map +0 -1
  542. package/lib/web/vite.d.ts +0 -96
  543. package/lib/web/vite.d.ts.map +0 -1
  544. package/lib/web/vite.js +0 -232
  545. package/lib/web/vite.js.map +0 -1
  546. package/lib/web/vitepress/config.d.ts +0 -12
  547. package/lib/web/vitepress/config.d.ts.map +0 -1
  548. package/lib/web/vitepress/config.js +0 -33
  549. package/lib/web/vitepress/config.js.map +0 -1
  550. package/lib/web/vitepress/custom-theme.d.ts +0 -174
  551. package/lib/web/vitepress/custom-theme.d.ts.map +0 -1
  552. package/lib/web/vitepress/custom-theme.js +0 -337
  553. package/lib/web/vitepress/custom-theme.js.map +0 -1
  554. package/lib/web/vitepress/dependencies.d.ts +0 -13
  555. package/lib/web/vitepress/dependencies.d.ts.map +0 -1
  556. package/lib/web/vitepress/dependencies.js +0 -37
  557. package/lib/web/vitepress/dependencies.js.map +0 -1
  558. package/lib/web/vitepress/home-page.d.ts +0 -247
  559. package/lib/web/vitepress/home-page.d.ts.map +0 -1
  560. package/lib/web/vitepress/home-page.js +0 -146
  561. package/lib/web/vitepress/home-page.js.map +0 -1
  562. package/lib/web/vitepress/index.d.ts +0 -6
  563. package/lib/web/vitepress/index.d.ts.map +0 -1
  564. package/lib/web/vitepress/index.js +0 -6
  565. package/lib/web/vitepress/index.js.map +0 -1
  566. package/lib/web/vitepress/process-front-matter-files.d.ts +0 -19
  567. package/lib/web/vitepress/process-front-matter-files.d.ts.map +0 -1
  568. package/lib/web/vitepress/process-front-matter-files.js +0 -73
  569. package/lib/web/vitepress/process-front-matter-files.js.map +0 -1
  570. package/lib/web/vitepress/vitepress.d.ts +0 -75
  571. package/lib/web/vitepress/vitepress.d.ts.map +0 -1
  572. package/lib/web/vitepress/vitepress.js +0 -254
  573. package/lib/web/vitepress/vitepress.js.map +0 -1
  574. package/src/ai/ark.ts +0 -118
  575. package/src/ai/astro-file.ts +0 -270
  576. package/src/ai/client.ts +0 -117
  577. package/src/ai/css-file.ts +0 -247
  578. package/src/ai/data.ts +0 -221
  579. package/src/ai/document.ts +0 -367
  580. package/src/ai/html-file.ts +0 -244
  581. package/src/ai/index.ts +0 -10
  582. package/src/ai/json-file.ts +0 -325
  583. package/src/ai/typescript-file.ts +0 -259
  584. package/src/ai/vue-file.ts +0 -242
  585. package/src/ai/yaml-file.ts +0 -328
  586. package/src/fs/static-astro-file.ts +0 -45
  587. package/src/fs/static-css-file.ts +0 -35
  588. package/src/fs/static-html-file.ts +0 -42
  589. package/src/fs/static-json-file.ts +0 -38
  590. package/src/fs/static-text-file.ts +0 -23
  591. package/src/fs/static-typescript-file.ts +0 -37
  592. package/src/fs/static-vue-file.ts +0 -39
  593. package/src/fs/static-yaml-file.ts +0 -33
  594. package/src/internal/docs/providers.ts +0 -286
  595. package/src/runtime/bind.ts +0 -95
  596. package/src/runtime/global.ts +0 -10
  597. package/src/runtime/plugin.ts +0 -163
  598. package/src/runtime/shims.js +0 -34
  599. package/src/runtime/state.ts +0 -9
  600. package/src/web/astro.ts +0 -643
  601. package/src/web/shadcn-component.ts +0 -72
  602. package/src/web/shadcn.ts +0 -221
  603. package/src/web/tailwind.ts +0 -167
  604. package/src/web/vite.ts +0 -407
  605. package/src/web/vitepress/config.ts +0 -50
  606. package/src/web/vitepress/custom-theme.ts +0 -514
  607. package/src/web/vitepress/dependencies.ts +0 -69
  608. package/src/web/vitepress/home-page.ts +0 -378
  609. package/src/web/vitepress/index.ts +0 -5
  610. package/src/web/vitepress/process-front-matter-files.ts +0 -107
  611. package/src/web/vitepress/vitepress.ts +0 -372
  612. package/templates/sveltekit/bun.lock +0 -1099
package/src/aws/ses.ts CHANGED
@@ -1,27 +1,14 @@
1
- import {
2
- CreateConfigurationSetCommand,
3
- CreateEmailIdentityCommand,
4
- DeleteConfigurationSetCommand,
5
- DeleteEmailIdentityCommand,
6
- type DeliveryOptions,
7
- GetConfigurationSetCommand,
8
- GetEmailIdentityCommand,
9
- NotFoundException,
10
- PutConfigurationSetDeliveryOptionsCommand,
11
- PutConfigurationSetReputationOptionsCommand,
12
- PutConfigurationSetSendingOptionsCommand,
13
- PutConfigurationSetSuppressionOptionsCommand,
14
- PutConfigurationSetTrackingOptionsCommand,
15
- PutEmailIdentityDkimAttributesCommand,
16
- type ReputationOptions,
17
- SESv2Client,
18
- type SendingOptions,
19
- type SuppressionOptions,
20
- type TrackingOptions,
1
+ import type {
2
+ DeliveryOptions,
3
+ ReputationOptions,
4
+ SendingOptions,
5
+ SuppressionOptions,
6
+ TrackingOptions,
21
7
  } from "@aws-sdk/client-sesv2";
22
8
  import type { Context } from "../context.ts";
23
9
  import { Resource } from "../resource.ts";
24
10
  import { ignore } from "../util/ignore.ts";
11
+ import { importPeer } from "../util/peer.ts";
25
12
  import { retry } from "./retry.ts";
26
13
 
27
14
  /**
@@ -165,6 +152,23 @@ export const SES = Resource(
165
152
  props: SESProps,
166
153
  ): Promise<SES> {
167
154
  // Create SES client
155
+ const {
156
+ CreateConfigurationSetCommand,
157
+ CreateEmailIdentityCommand,
158
+ DeleteConfigurationSetCommand,
159
+ DeleteEmailIdentityCommand,
160
+ GetConfigurationSetCommand,
161
+ GetEmailIdentityCommand,
162
+ NotFoundException,
163
+ PutConfigurationSetDeliveryOptionsCommand,
164
+ PutConfigurationSetReputationOptionsCommand,
165
+ PutConfigurationSetSendingOptionsCommand,
166
+ PutConfigurationSetSuppressionOptionsCommand,
167
+ PutConfigurationSetTrackingOptionsCommand,
168
+ PutEmailIdentityDkimAttributesCommand,
169
+ SESv2Client,
170
+ } = await importPeer(import("@aws-sdk/client-sesv2"), "ses::SES");
171
+
168
172
  const client = new SESv2Client({});
169
173
 
170
174
  // Resource ID is either based on the configuration set name or email identity
@@ -1,18 +1,10 @@
1
- import {
2
- AddTagsToResourceCommand,
3
- DeleteParameterCommand,
4
- GetParameterCommand,
5
- ParameterAlreadyExists,
6
- ParameterNotFound,
7
- PutParameterCommand,
8
- SSMClient,
9
- type Tag,
10
- } from "@aws-sdk/client-ssm";
1
+ import type { Tag } from "@aws-sdk/client-ssm";
11
2
  import type { Context } from "../context.ts";
12
3
  import { Resource } from "../resource.ts";
13
4
  import { type Secret, isSecret } from "../secret.ts";
14
5
  import { ignore } from "../util/ignore.ts";
15
6
  import { logger } from "../util/logger.ts";
7
+ import { importPeer } from "../util/peer.ts";
16
8
 
17
9
  /**
18
10
  * Base properties shared by all SSM Parameter types
@@ -20,8 +12,10 @@ import { logger } from "../util/logger.ts";
20
12
  interface SSMParameterBaseProps {
21
13
  /**
22
14
  * Name of the parameter
15
+ *
16
+ * @default ${app}-${stage}-${id}
23
17
  */
24
- name: string;
18
+ name?: string;
25
19
 
26
20
  /**
27
21
  * Description of the parameter's purpose
@@ -101,6 +95,11 @@ export type SSMParameter = Resource<"ssm::Parameter"> & {
101
95
  */
102
96
  arn: string;
103
97
 
98
+ /**
99
+ * Name of the SSM Parameter.
100
+ */
101
+ name: string;
102
+
104
103
  /**
105
104
  * Version of the parameter
106
105
  */
@@ -176,17 +175,33 @@ export const SSMParameter = Resource(
176
175
  "ssm::Parameter",
177
176
  async function (
178
177
  this: Context<SSMParameter>,
179
- _id: string,
178
+ id: string,
180
179
  props: SSMParameterProps,
181
180
  ): Promise<SSMParameter> {
181
+ const {
182
+ AddTagsToResourceCommand,
183
+ DeleteParameterCommand,
184
+ GetParameterCommand,
185
+ ParameterAlreadyExists,
186
+ ParameterNotFound,
187
+ PutParameterCommand,
188
+ SSMClient,
189
+ } = await importPeer(import("@aws-sdk/client-ssm"), "ssm::Parameter");
182
190
  const client = new SSMClient({});
183
191
 
192
+ const parameterName =
193
+ props.name ?? this.output?.name ?? this.scope.createPhysicalName(id);
194
+
195
+ if (this.phase === "update" && this.output.name !== parameterName) {
196
+ this.replace();
197
+ }
198
+
184
199
  if (this.phase === "delete") {
185
200
  try {
186
201
  await ignore(ParameterNotFound.name, () =>
187
202
  client.send(
188
203
  new DeleteParameterCommand({
189
- Name: props.name,
204
+ Name: parameterName,
190
205
  }),
191
206
  ),
192
207
  );
@@ -217,7 +232,7 @@ export const SSMParameter = Resource(
217
232
  try {
218
233
  await client.send(
219
234
  new PutParameterCommand({
220
- Name: props.name,
235
+ Name: parameterName,
221
236
  Value: parameterValue,
222
237
  Type: parameterType,
223
238
  Description: props.description,
@@ -247,7 +262,7 @@ export const SSMParameter = Resource(
247
262
  if (error instanceof ParameterAlreadyExists) {
248
263
  await client.send(
249
264
  new PutParameterCommand({
250
- Name: props.name,
265
+ Name: parameterName,
251
266
  Value: parameterValue,
252
267
  Type: parameterType,
253
268
  Description: props.description,
@@ -278,7 +293,7 @@ export const SSMParameter = Resource(
278
293
  await client.send(
279
294
  new AddTagsToResourceCommand({
280
295
  ResourceType: "Parameter",
281
- ResourceId: props.name,
296
+ ResourceId: parameterName,
282
297
  Tags: tags,
283
298
  }),
284
299
  );
@@ -290,13 +305,15 @@ export const SSMParameter = Resource(
290
305
  // Get the updated parameter
291
306
  const parameter = await client.send(
292
307
  new GetParameterCommand({
293
- Name: props.name,
308
+ Name: parameterName,
294
309
  WithDecryption: true,
295
310
  }),
296
311
  );
297
312
 
298
313
  if (!parameter?.Parameter) {
299
- throw new Error(`Failed to create or update parameter ${props.name}`);
314
+ throw new Error(
315
+ `Failed to create or update parameter ${parameterName}`,
316
+ );
300
317
  }
301
318
 
302
319
  return this({
@@ -304,12 +321,15 @@ export const SSMParameter = Resource(
304
321
  arn: parameter.Parameter.ARN!,
305
322
  version: parameter.Parameter.Version!,
306
323
  lastModifiedDate: parameter.Parameter.LastModifiedDate!,
307
- name: parameter.Parameter.Name ?? props.name,
324
+ name: parameter.Parameter.Name ?? parameterName,
308
325
  value: props.value,
309
326
  type: (parameter.Parameter.Type as any) ?? parameterType,
310
327
  } as SSMParameter);
311
328
  } catch (error: any) {
312
- logger.error(`Error creating/updating parameter ${props.name}:`, error);
329
+ logger.error(
330
+ `Error creating/updating parameter ${parameterName}:`,
331
+ error,
332
+ );
313
333
  throw error;
314
334
  }
315
335
  },
package/src/aws/table.ts CHANGED
@@ -1,14 +1,8 @@
1
- import {
2
- CreateTableCommand,
3
- DeleteTableCommand,
4
- DescribeTableCommand,
5
- DynamoDBClient,
6
- type KeySchemaElement,
7
- ResourceNotFoundException,
8
- } from "@aws-sdk/client-dynamodb";
1
+ import type { KeySchemaElement } from "@aws-sdk/client-dynamodb";
9
2
  import type { Context } from "../context.ts";
10
3
  import { Resource } from "../resource.ts";
11
4
  import { ignore } from "../util/ignore.ts";
5
+ import { importPeer } from "../util/peer.ts";
12
6
  import { retry } from "./retry.ts";
13
7
 
14
8
  /**
@@ -17,8 +11,10 @@ import { retry } from "./retry.ts";
17
11
  export interface TableProps {
18
12
  /**
19
13
  * Name of the DynamoDB table
14
+ *
15
+ * @default ${app}-${stage}-${id}
20
16
  */
21
- tableName: string;
17
+ tableName?: string;
22
18
 
23
19
  /**
24
20
  * Primary partition key (hash key) configuration
@@ -88,6 +84,11 @@ export interface Table extends Resource<"dynamo::Table">, TableProps {
88
84
  */
89
85
  arn: string;
90
86
 
87
+ /**
88
+ * Name of the DynamoDB Table.
89
+ */
90
+ tableName: string;
91
+
91
92
  /**
92
93
  * ARN of the table's stream if enabled
93
94
  * Format: arn:aws:dynamodb:region:account-id:table/table-name/stream/timestamp
@@ -140,17 +141,33 @@ export const Table = Resource(
140
141
  "dynamo::Table",
141
142
  async function (
142
143
  this: Context<Table>,
143
- _id: string,
144
+ id: string,
144
145
  props: TableProps,
145
146
  ): Promise<Table> {
147
+ const {
148
+ CreateTableCommand,
149
+ DeleteTableCommand,
150
+ DescribeTableCommand,
151
+ DynamoDBClient,
152
+ ResourceNotFoundException,
153
+ } = await importPeer(import("@aws-sdk/client-dynamodb"), "dynamo::Table");
146
154
  const client = new DynamoDBClient({});
147
155
 
156
+ const tableName =
157
+ props.tableName ??
158
+ this.output?.tableName ??
159
+ this.scope.createPhysicalName(id);
160
+
161
+ if (this.phase === "update" && this.output?.tableName !== tableName) {
162
+ this.replace();
163
+ }
164
+
148
165
  if (this.phase === "delete") {
149
166
  await retry(async () => {
150
167
  await ignore(ResourceNotFoundException.name, () =>
151
168
  client.send(
152
169
  new DeleteTableCommand({
153
- TableName: props.tableName,
170
+ TableName: tableName,
154
171
  }),
155
172
  ),
156
173
  );
@@ -165,7 +182,7 @@ export const Table = Resource(
165
182
  try {
166
183
  await client.send(
167
184
  new DescribeTableCommand({
168
- TableName: props.tableName,
185
+ TableName: tableName,
169
186
  }),
170
187
  );
171
188
  // If we get here, table still exists
@@ -184,7 +201,7 @@ export const Table = Resource(
184
201
 
185
202
  if (!tableDeleted) {
186
203
  throw new Error(
187
- `Timed out waiting for table ${props.tableName} to be deleted`,
204
+ `Timed out waiting for table ${tableName} to be deleted`,
188
205
  );
189
206
  }
190
207
 
@@ -222,7 +239,7 @@ export const Table = Resource(
222
239
  // First check if table already exists
223
240
  const describeResponse = await client.send(
224
241
  new DescribeTableCommand({
225
- TableName: props.tableName,
242
+ TableName: tableName,
226
243
  }),
227
244
  );
228
245
 
@@ -240,7 +257,7 @@ export const Table = Resource(
240
257
  // Table doesn't exist, try to create it
241
258
  await client.send(
242
259
  new CreateTableCommand({
243
- TableName: props.tableName,
260
+ TableName: tableName,
244
261
  AttributeDefinitions: attributeDefinitions,
245
262
  KeySchema: keySchema,
246
263
  BillingMode: props.billingMode || "PAY_PER_REQUEST",
@@ -277,7 +294,7 @@ export const Table = Resource(
277
294
  async () =>
278
295
  await client.send(
279
296
  new DescribeTableCommand({
280
- TableName: props.tableName,
297
+ TableName: tableName,
281
298
  }),
282
299
  ),
283
300
  );
@@ -302,13 +319,14 @@ export const Table = Resource(
302
319
 
303
320
  if (!tableActive) {
304
321
  throw new Error(
305
- `Timed out waiting for table ${props.tableName} to become active`,
322
+ `Timed out waiting for table ${tableName} to become active`,
306
323
  );
307
324
  }
308
325
 
309
326
  return this({
310
327
  ...props,
311
328
  arn: tableDescription!.TableArn!,
329
+ tableName,
312
330
  streamArn: tableDescription!.LatestStreamArn,
313
331
  tableId: tableDescription!.TableId!,
314
332
  });
@@ -88,7 +88,7 @@ export interface AccountApiTokenProps extends CloudflareApiOptions {
88
88
  /**
89
89
  * Name of the token
90
90
  */
91
- name: string;
91
+ name?: string;
92
92
 
93
93
  /**
94
94
  * Policies that define what the token can access
@@ -252,12 +252,14 @@ export const AccountApiToken = Resource(
252
252
  "cloudflare::AccountApiToken",
253
253
  async function (
254
254
  this: Context<AccountApiToken>,
255
- _id: string,
255
+ id: string,
256
256
  props: AccountApiTokenProps,
257
257
  ): Promise<AccountApiToken> {
258
258
  // Create Cloudflare API client with automatic account discovery
259
259
  const api = await createCloudflareApi(props);
260
260
 
261
+ const tokenName = props.name ?? this.scope.createPhysicalName(id);
262
+
261
263
  if (this.phase === "delete") {
262
264
  // Delete token if we have an ID
263
265
  if (this.output?.id) {
@@ -270,10 +272,10 @@ export const AccountApiToken = Resource(
270
272
  const errorData: any = await deleteResponse.json().catch(() => ({
271
273
  errors: [{ message: deleteResponse.statusText }],
272
274
  }));
273
- logger.error(`Error deleting token '${props.name}':`, errorData);
275
+ logger.error(`Error deleting token '${tokenName}':`, errorData);
274
276
  }
275
277
  } catch (error) {
276
- logger.error(`Error deleting token '${props.name}':`, error);
278
+ logger.error(`Error deleting token '${tokenName}':`, error);
277
279
  }
278
280
  }
279
281
 
@@ -288,7 +290,7 @@ export const AccountApiToken = Resource(
288
290
 
289
291
  // Transform our properties to API format
290
292
  const apiPayload = {
291
- name: props.name,
293
+ name: tokenName,
292
294
  policies: props.policies.map((policy) => ({
293
295
  effect: policy.effect,
294
296
  permission_groups: policy.permissionGroups.map((pg) =>
@@ -362,7 +364,7 @@ export const AccountApiToken = Resource(
362
364
  }));
363
365
 
364
366
  throw new Error(
365
- `Error ${this.phase === "update" ? "updating" : "creating"} token '${props.name}': ${
367
+ `Error ${this.phase === "update" ? "updating" : "creating"} token '${tokenName}': ${
366
368
  errorData.errors?.[0]?.message || response.statusText
367
369
  }`,
368
370
  );
@@ -376,7 +378,7 @@ export const AccountApiToken = Resource(
376
378
  } else {
377
379
  if (!this.output?.value) {
378
380
  throw new Error(
379
- `Token '${props.name}' was created but we have no record of its value. Try deleting and recreating the token.`,
381
+ `Token '${tokenName}' was created but we have no record of its value. Try deleting and recreating the token.`,
380
382
  );
381
383
  }
382
384
  tokenValue = this.output?.value;
@@ -1,15 +1,19 @@
1
1
  import type { Context } from "../context.ts";
2
2
  import { Resource } from "../resource.ts";
3
- import { bind } from "../runtime/bind.ts";
4
3
  import { logger } from "../util/logger.ts";
5
4
  import { handleApiError } from "./api-error.ts";
6
5
  import { createCloudflareApi, type CloudflareApiOptions } from "./api.ts";
7
- import type { Bound } from "./bound.ts";
8
6
 
9
7
  /**
10
8
  * Properties for creating or updating a Cloudflare AI Gateway.
11
9
  */
12
10
  export interface AiGatewayProps extends CloudflareApiOptions {
11
+ /**
12
+ * Name of the AI Gateway.
13
+ *
14
+ * @default ${app.name}-${app.stage}-${id}
15
+ */
16
+ gatewayName?: string;
13
17
  /**
14
18
  * Invalidate cache on update.
15
19
  * @default true
@@ -88,7 +92,7 @@ export interface AiGatewayProps extends CloudflareApiOptions {
88
92
  * Output returned after Cloudflare AI Gateway creation/update.
89
93
  * IMPORTANT: The interface name MUST match the exported resource name.
90
94
  */
91
- export interface AiGatewayResource
95
+ export interface AiGateway
92
96
  extends Resource<"cloudflare::AiGateway">,
93
97
  AiGatewayProps {
94
98
  /**
@@ -128,8 +132,6 @@ export interface AiGatewayResource
128
132
  type: "ai_gateway";
129
133
  }
130
134
 
131
- export type AiGateway = AiGatewayResource & Bound<AiGatewayResource>;
132
-
133
135
  /**
134
136
  * Represents a Cloudflare AI Gateway.
135
137
  *
@@ -154,30 +156,25 @@ export type AiGateway = AiGatewayResource & Bound<AiGatewayResource>;
154
156
  * logpushPublicKey: "mypublickey..." // Replace with actual public key
155
157
  * });
156
158
  */
157
- export async function AiGateway(
158
- name: string,
159
- props: AiGatewayProps = {},
160
- ): Promise<AiGateway> {
161
- const gateway = await AiGatewayResource(name, props);
162
- const binding = await bind(gateway);
163
- return {
164
- ...gateway,
165
- getLog: binding.getLog,
166
- getUrl: binding.getUrl,
167
- patchLog: binding.patchLog,
168
- run: binding.run,
169
- } as AiGateway;
170
- }
171
-
172
- const AiGatewayResource = Resource(
159
+ export const AiGateway = Resource(
173
160
  "cloudflare::AiGateway",
174
161
  async function (
175
- this: Context<AiGatewayResource>,
162
+ this: Context<AiGateway>,
176
163
  id: string,
177
164
  props: AiGatewayProps = {},
178
- ): Promise<AiGatewayResource> {
165
+ ): Promise<AiGateway> {
179
166
  const api = await createCloudflareApi(props);
180
- const gatewayPath = `/accounts/${api.accountId}/ai-gateway/gateways/${id}`;
167
+ const gatewayName =
168
+ props.gatewayName ??
169
+ this.output?.gatewayName ??
170
+ this.output?.id ?? // name and ID are the same
171
+ this.scope.createPhysicalName(id);
172
+
173
+ if (this.phase === "update" && this.output?.id !== gatewayName) {
174
+ this.replace();
175
+ }
176
+
177
+ const gatewayPath = `/accounts/${api.accountId}/ai-gateway/gateways/${gatewayName}`;
181
178
  const gatewaysPath = `/accounts/${api.accountId}/ai-gateway/gateways`;
182
179
 
183
180
  if (this.phase === "delete") {
@@ -185,10 +182,15 @@ const AiGatewayResource = Resource(
185
182
  const deleteResponse = await api.delete(gatewayPath);
186
183
  // Only swallow 404 Not Found errors, all other errors should be handled
187
184
  if (!deleteResponse.ok && deleteResponse.status !== 404) {
188
- await handleApiError(deleteResponse, "delete", "ai gateway", id);
185
+ await handleApiError(
186
+ deleteResponse,
187
+ "delete",
188
+ "ai gateway",
189
+ gatewayName,
190
+ );
189
191
  }
190
192
  } catch (error) {
191
- logger.error(`Error deleting AI Gateway ${id}:`, error);
193
+ logger.error(`Error deleting AI Gateway ${gatewayName}:`, error);
192
194
  throw error;
193
195
  }
194
196
  return this.destroy();
@@ -211,37 +213,37 @@ const AiGatewayResource = Resource(
211
213
  try {
212
214
  if (this.phase === "update") {
213
215
  // Update existing gateway (PUT request)
214
- const requestBody = mapPropsToApi(id, mergedProps, false);
216
+ const requestBody = mapPropsToApi(gatewayName, mergedProps, false);
215
217
  response = await api.put(gatewayPath, requestBody);
216
218
  } else {
217
- // Check if gateway exists before creating (to avoid conflict)
219
+ // Check if gateway exists before creating (to avogatewayName conflict)
218
220
  const getResponse = await api.get(gatewayPath);
219
221
  if (getResponse.status === 200) {
220
222
  // Gateway exists, treat as update (PUT)
221
223
  logger.log(
222
- `AI Gateway '${id}' already exists. Updating existing resource.`,
224
+ `AI Gateway '${gatewayName}' already exists. Updating existing resource.`,
223
225
  );
224
- const requestBody = mapPropsToApi(id, mergedProps, false);
226
+ const requestBody = mapPropsToApi(gatewayName, mergedProps, false);
225
227
  response = await api.put(gatewayPath, requestBody);
226
228
  } else if (getResponse.status === 404) {
227
229
  // Gateway doesn't exist, create new (POST request)
228
- const requestBody = mapPropsToApi(id, mergedProps, true); // Include 'id' in POST body
230
+ const requestBody = mapPropsToApi(gatewayName, mergedProps, true); // Include 'gatewayName' in POST body
229
231
  response = await api.post(gatewaysPath, requestBody);
230
232
  } else {
231
233
  // Unexpected error during GET check
232
- await handleApiError(getResponse, "get", "ai gateway", id);
234
+ await handleApiError(getResponse, "get", "ai gateway", gatewayName);
233
235
  }
234
236
  }
235
237
 
236
238
  if (!response?.ok) {
237
239
  const action = this.phase === "update" ? "update" : "create";
238
- await handleApiError(response!, action, "ai gateway", id);
240
+ await handleApiError(response!, action, "ai gateway", gatewayName);
239
241
  }
240
242
 
241
243
  const data: { result: Record<string, any> } = await response!.json();
242
244
  apiResource = data.result;
243
245
  } catch (error) {
244
- logger.error(`Error ${this.phase} AI Gateway '${id}':`, error);
246
+ logger.error(`Error ${this.phase} AI Gateway '${gatewayName}':`, error);
245
247
  throw error; // Re-throw the error to fail the deployment
246
248
  }
247
249
 
@@ -249,6 +251,7 @@ const AiGatewayResource = Resource(
249
251
  return this({
250
252
  ...mergedProps, // Start with the input props (including defaults)
251
253
  id: apiResource.id,
254
+ gatewayName,
252
255
  accountId: apiResource.account_id,
253
256
  accountTag: apiResource.account_tag,
254
257
  createdAt: apiResource.created_at,
@@ -48,33 +48,33 @@ export interface APISchemaProps<S extends OpenAPIV3.Document>
48
48
  /**
49
49
  * APISchema resource attributes.
50
50
  */
51
- export interface APISchema<S extends OpenAPIV3.Document = OpenAPIV3.Document>
52
- extends Resource<"cloudflare::APISchema"> {
53
- /**
54
- * Schema ID
55
- */
56
- id: string;
57
-
58
- /**
59
- * Name for the schema
60
- */
61
- name: string;
51
+ export type APISchema<S extends OpenAPIV3.Document = OpenAPIV3.Document> =
52
+ Resource<"cloudflare::APISchema"> & {
53
+ /**
54
+ * Schema ID
55
+ */
56
+ id: string;
57
+
58
+ /**
59
+ * Name for the schema
60
+ */
61
+ name: string;
62
62
 
63
- /**
64
- * The API Schema
65
- */
66
- schema: S;
63
+ /**
64
+ * The API Schema
65
+ */
66
+ schema: S;
67
67
 
68
- /**
69
- * Source of the schema
70
- */
71
- source: string;
68
+ /**
69
+ * Source of the schema
70
+ */
71
+ source: string;
72
72
 
73
- /**
74
- * Whether validation is enabled
75
- */
76
- enabled: boolean;
77
- }
73
+ /**
74
+ * Whether validation is enabled
75
+ */
76
+ enabled: boolean;
77
+ };
78
78
 
79
79
  /**
80
80
  * Cloudflare API Gateway Schema manages OpenAPI v3 schemas for API validation.
@@ -160,10 +160,17 @@ export const APISchema = Resource("cloudflare::APISchema", async function <
160
160
 
161
161
  let schemaDetails: CloudflareSchemaDetails;
162
162
 
163
+ const schemaName =
164
+ props.name ?? this.output?.name ?? this.scope.createPhysicalName(id);
165
+
166
+ if (this.phase === "update" && this.output?.name !== schemaName) {
167
+ this.replace();
168
+ }
169
+
163
170
  if (this.phase === "update" && this.output?.id) {
164
171
  // Check if we need to replace due to name, schema content change, or disabling validation
165
172
  if (
166
- props.name !== this.output.name ||
173
+ schemaName !== this.output.name ||
167
174
  JSON.stringify(parsedSchema) !== JSON.stringify(this.output.schema) ||
168
175
  (this.output.enabled === true && props.enabled === false)
169
176
  ) {
@@ -179,7 +186,7 @@ export const APISchema = Resource("cloudflare::APISchema", async function <
179
186
  // Create new schema
180
187
  schemaDetails = await uploadSchema(api, zoneId, {
181
188
  file: yaml.stringify(parsedSchema),
182
- name: props.name || id,
189
+ name: schemaName,
183
190
  validation_enabled: props.enabled !== false,
184
191
  });
185
192
  }
@@ -28,7 +28,7 @@ export interface APIShieldProps<S extends string | URL | OpenAPIV3.Document>
28
28
  /**
29
29
  * The name of the schema validation
30
30
  *
31
- * @default id
31
+ * @default ${app.name}-${app.stage}-${id}
32
32
  */
33
33
  name?: string;
34
34
 
@@ -165,6 +165,11 @@ export interface ValidationSettings {
165
165
  */
166
166
  export interface APIShield<S extends OpenAPIV3.Document = OpenAPIV3.Document>
167
167
  extends Resource<"cloudflare::APIShield"> {
168
+ /**
169
+ * Name of the API Shield.
170
+ */
171
+ name: string;
172
+
168
173
  /**
169
174
  * The schema resource
170
175
  */
@@ -409,6 +414,13 @@ const _APIShield = Resource(
409
414
  return this.destroy();
410
415
  }
411
416
 
417
+ const schemaName =
418
+ props.name ?? this.output?.name ?? this.scope.createPhysicalName(id);
419
+
420
+ if (this.phase === "update" && this.output?.name !== schemaName) {
421
+ this.replace();
422
+ }
423
+
412
424
  // Update global settings
413
425
  const defaultAction = props.defaultMitigation || "none";
414
426
  await updateGlobalSettings(api, zoneId, {
@@ -419,7 +431,7 @@ const _APIShield = Resource(
419
431
  const schema = await APISchema("schema", {
420
432
  schema: props.schema,
421
433
  zone: props.zone,
422
- name: props.name ?? id,
434
+ name: schemaName,
423
435
  enabled: props.enabled,
424
436
  accountId: props.accountId,
425
437
  apiKey: props.apiKey,
@@ -431,6 +443,7 @@ const _APIShield = Resource(
431
443
  return this({
432
444
  zoneId,
433
445
  schema,
446
+ name: schemaName,
434
447
  operations: await Promise.all(
435
448
  parseSchemaOperations(schema.schema).map(async (parsedOp) => {
436
449
  let operationAction = defaultAction;