alchemy 0.25.0 → 0.26.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 (499) hide show
  1. package/README.md +7 -0
  2. package/lib/ai/astro-file.d.ts.map +1 -1
  3. package/lib/ai/astro-file.js +2 -1
  4. package/lib/ai/astro-file.js.map +1 -1
  5. package/lib/ai/client.d.ts.map +1 -1
  6. package/lib/ai/client.js +3 -2
  7. package/lib/ai/client.js.map +1 -1
  8. package/lib/alchemy.d.ts +7 -0
  9. package/lib/alchemy.d.ts.map +1 -1
  10. package/lib/alchemy.js +19 -3
  11. package/lib/alchemy.js.map +1 -1
  12. package/lib/apply.d.ts.map +1 -1
  13. package/lib/apply.js +63 -5
  14. package/lib/apply.js.map +1 -1
  15. package/lib/aws/control/client.js +4 -3
  16. package/lib/aws/control/client.js.map +1 -1
  17. package/lib/aws/control/properties.d.ts +6 -0
  18. package/lib/aws/control/properties.d.ts.map +1 -1
  19. package/lib/aws/control/properties.js +48 -0
  20. package/lib/aws/control/properties.js.map +1 -1
  21. package/lib/aws/control/resource.d.ts.map +1 -1
  22. package/lib/aws/control/resource.js +3 -2
  23. package/lib/aws/control/resource.js.map +1 -1
  24. package/lib/aws/control/types.d.ts +3969 -4862
  25. package/lib/aws/control/types.d.ts.map +1 -1
  26. package/lib/aws/control/types.js.map +1 -1
  27. package/lib/aws/function.d.ts.map +1 -1
  28. package/lib/aws/function.js +9 -8
  29. package/lib/aws/function.js.map +1 -1
  30. package/lib/aws/oidc/oidc-provider.d.ts.map +1 -1
  31. package/lib/aws/oidc/oidc-provider.js +3 -2
  32. package/lib/aws/oidc/oidc-provider.js.map +1 -1
  33. package/lib/aws/queue.d.ts.map +1 -1
  34. package/lib/aws/queue.js +3 -2
  35. package/lib/aws/queue.js.map +1 -1
  36. package/lib/aws/role.d.ts.map +1 -1
  37. package/lib/aws/role.js +3 -1
  38. package/lib/aws/role.js.map +1 -1
  39. package/lib/aws/ssm-parameter.d.ts.map +1 -1
  40. package/lib/aws/ssm-parameter.js +2 -1
  41. package/lib/aws/ssm-parameter.js.map +1 -1
  42. package/lib/cloudflare/account-api-token.d.ts.map +1 -1
  43. package/lib/cloudflare/account-api-token.js +3 -2
  44. package/lib/cloudflare/account-api-token.js.map +1 -1
  45. package/lib/cloudflare/ai-gateway.d.ts.map +1 -1
  46. package/lib/cloudflare/ai-gateway.js +4 -3
  47. package/lib/cloudflare/ai-gateway.js.map +1 -1
  48. package/lib/cloudflare/api-error.d.ts +0 -9
  49. package/lib/cloudflare/api-error.d.ts.map +1 -1
  50. package/lib/cloudflare/api-error.js +24 -0
  51. package/lib/cloudflare/api-error.js.map +1 -1
  52. package/lib/cloudflare/api.d.ts.map +1 -1
  53. package/lib/cloudflare/api.js +5 -4
  54. package/lib/cloudflare/api.js.map +1 -1
  55. package/lib/cloudflare/assets.d.ts.map +1 -1
  56. package/lib/cloudflare/assets.js +26 -6
  57. package/lib/cloudflare/assets.js.map +1 -1
  58. package/lib/cloudflare/astro.d.ts +63 -0
  59. package/lib/cloudflare/astro.d.ts.map +1 -0
  60. package/lib/cloudflare/astro.js +133 -0
  61. package/lib/cloudflare/astro.js.map +1 -0
  62. package/lib/cloudflare/auth.d.ts.map +1 -1
  63. package/lib/cloudflare/auth.js +3 -2
  64. package/lib/cloudflare/auth.js.map +1 -1
  65. package/lib/cloudflare/bindings.d.ts +24 -2
  66. package/lib/cloudflare/bindings.d.ts.map +1 -1
  67. package/lib/cloudflare/bindings.js.map +1 -1
  68. package/lib/cloudflare/bound.d.ts +10 -1
  69. package/lib/cloudflare/bound.d.ts.map +1 -1
  70. package/lib/cloudflare/bucket.d.ts.map +1 -1
  71. package/lib/cloudflare/bucket.js +12 -8
  72. package/lib/cloudflare/bucket.js.map +1 -1
  73. package/lib/cloudflare/bundle/bundle-worker.d.ts.map +1 -1
  74. package/lib/cloudflare/bundle/bundle-worker.js +2 -1
  75. package/lib/cloudflare/bundle/bundle-worker.js.map +1 -1
  76. package/lib/cloudflare/bundle/nodejs-compat-mode.d.ts.map +1 -1
  77. package/lib/cloudflare/bundle/nodejs-compat-mode.js +2 -1
  78. package/lib/cloudflare/bundle/nodejs-compat-mode.js.map +1 -1
  79. package/lib/cloudflare/custom-domain.d.ts.map +1 -1
  80. package/lib/cloudflare/custom-domain.js +10 -9
  81. package/lib/cloudflare/custom-domain.js.map +1 -1
  82. package/lib/cloudflare/d1-database.d.ts.map +1 -1
  83. package/lib/cloudflare/d1-database.js +11 -10
  84. package/lib/cloudflare/d1-database.js.map +1 -1
  85. package/lib/cloudflare/d1-export.d.ts.map +1 -1
  86. package/lib/cloudflare/d1-export.js +2 -1
  87. package/lib/cloudflare/d1-export.js.map +1 -1
  88. package/lib/cloudflare/d1-import.d.ts.map +1 -1
  89. package/lib/cloudflare/d1-import.js +2 -1
  90. package/lib/cloudflare/d1-import.js.map +1 -1
  91. package/lib/cloudflare/d1-migrations.d.ts.map +1 -1
  92. package/lib/cloudflare/d1-migrations.js +2 -1
  93. package/lib/cloudflare/d1-migrations.js.map +1 -1
  94. package/lib/cloudflare/dispatch-namespace.d.ts +94 -0
  95. package/lib/cloudflare/dispatch-namespace.d.ts.map +1 -0
  96. package/lib/cloudflare/dispatch-namespace.js +143 -0
  97. package/lib/cloudflare/dispatch-namespace.js.map +1 -0
  98. package/lib/cloudflare/dns-records.d.ts.map +1 -1
  99. package/lib/cloudflare/dns-records.js +5 -4
  100. package/lib/cloudflare/dns-records.js.map +1 -1
  101. package/lib/cloudflare/do-state-store/worker.d.ts.map +1 -1
  102. package/lib/cloudflare/do-state-store/worker.js +4 -0
  103. package/lib/cloudflare/do-state-store/worker.js.map +1 -1
  104. package/lib/cloudflare/email-address.d.ts +79 -0
  105. package/lib/cloudflare/email-address.d.ts.map +1 -0
  106. package/lib/cloudflare/email-address.js +112 -0
  107. package/lib/cloudflare/email-address.js.map +1 -0
  108. package/lib/cloudflare/email-catch-all.d.ts +123 -0
  109. package/lib/cloudflare/email-catch-all.d.ts.map +1 -0
  110. package/lib/cloudflare/email-catch-all.js +124 -0
  111. package/lib/cloudflare/email-catch-all.js.map +1 -0
  112. package/lib/cloudflare/email-routing.d.ts +89 -0
  113. package/lib/cloudflare/email-routing.d.ts.map +1 -0
  114. package/lib/cloudflare/email-routing.js +120 -0
  115. package/lib/cloudflare/email-routing.js.map +1 -0
  116. package/lib/cloudflare/email-rule.d.ts +196 -0
  117. package/lib/cloudflare/email-rule.d.ts.map +1 -0
  118. package/lib/cloudflare/email-rule.js +153 -0
  119. package/lib/cloudflare/email-rule.js.map +1 -0
  120. package/lib/cloudflare/hyperdrive.d.ts.map +1 -1
  121. package/lib/cloudflare/hyperdrive.js +5 -4
  122. package/lib/cloudflare/hyperdrive.js.map +1 -1
  123. package/lib/cloudflare/images.d.ts +60 -0
  124. package/lib/cloudflare/images.d.ts.map +1 -0
  125. package/lib/cloudflare/images.js +60 -0
  126. package/lib/cloudflare/images.js.map +1 -0
  127. package/lib/cloudflare/index.d.ts +10 -0
  128. package/lib/cloudflare/index.d.ts.map +1 -1
  129. package/lib/cloudflare/index.js +10 -0
  130. package/lib/cloudflare/index.js.map +1 -1
  131. package/lib/cloudflare/kv-namespace.d.ts.map +1 -1
  132. package/lib/cloudflare/kv-namespace.js +2 -1
  133. package/lib/cloudflare/kv-namespace.js.map +1 -1
  134. package/lib/cloudflare/pipeline.d.ts +7 -0
  135. package/lib/cloudflare/pipeline.d.ts.map +1 -1
  136. package/lib/cloudflare/pipeline.js +28 -2
  137. package/lib/cloudflare/pipeline.js.map +1 -1
  138. package/lib/cloudflare/queue-consumer.d.ts.map +1 -1
  139. package/lib/cloudflare/queue-consumer.js +2 -1
  140. package/lib/cloudflare/queue-consumer.js.map +1 -1
  141. package/lib/cloudflare/queue.d.ts.map +1 -1
  142. package/lib/cloudflare/queue.js +0 -8
  143. package/lib/cloudflare/queue.js.map +1 -1
  144. package/lib/cloudflare/route.d.ts +26 -1
  145. package/lib/cloudflare/route.d.ts.map +1 -1
  146. package/lib/cloudflare/route.js +84 -16
  147. package/lib/cloudflare/route.js.map +1 -1
  148. package/lib/cloudflare/secret.d.ts +137 -0
  149. package/lib/cloudflare/secret.d.ts.map +1 -0
  150. package/lib/cloudflare/secret.js +122 -0
  151. package/lib/cloudflare/secret.js.map +1 -0
  152. package/lib/cloudflare/secrets-store.d.ts +145 -0
  153. package/lib/cloudflare/secrets-store.d.ts.map +1 -0
  154. package/lib/cloudflare/secrets-store.js +213 -0
  155. package/lib/cloudflare/secrets-store.js.map +1 -0
  156. package/lib/cloudflare/sveltekit.d.ts +49 -0
  157. package/lib/cloudflare/sveltekit.d.ts.map +1 -0
  158. package/lib/cloudflare/sveltekit.js +56 -0
  159. package/lib/cloudflare/sveltekit.js.map +1 -0
  160. package/lib/cloudflare/user.d.ts.map +1 -1
  161. package/lib/cloudflare/user.js +2 -1
  162. package/lib/cloudflare/user.js.map +1 -1
  163. package/lib/cloudflare/vectorize-index.d.ts.map +1 -1
  164. package/lib/cloudflare/vectorize-index.js +6 -5
  165. package/lib/cloudflare/vectorize-index.js.map +1 -1
  166. package/lib/cloudflare/vectorize-metadata-index.d.ts.map +1 -1
  167. package/lib/cloudflare/vectorize-metadata-index.js +2 -1
  168. package/lib/cloudflare/vectorize-metadata-index.js.map +1 -1
  169. package/lib/cloudflare/website.d.ts.map +1 -1
  170. package/lib/cloudflare/website.js +7 -2
  171. package/lib/cloudflare/website.js.map +1 -1
  172. package/lib/cloudflare/worker-assets.d.ts +18 -0
  173. package/lib/cloudflare/worker-assets.d.ts.map +1 -1
  174. package/lib/cloudflare/worker-assets.js +61 -67
  175. package/lib/cloudflare/worker-assets.js.map +1 -1
  176. package/lib/cloudflare/worker-metadata.d.ts.map +1 -1
  177. package/lib/cloudflare/worker-metadata.js +23 -1
  178. package/lib/cloudflare/worker-metadata.js.map +1 -1
  179. package/lib/cloudflare/worker.d.ts +43 -2
  180. package/lib/cloudflare/worker.d.ts.map +1 -1
  181. package/lib/cloudflare/worker.js +50 -11
  182. package/lib/cloudflare/worker.js.map +1 -1
  183. package/lib/cloudflare/wrangler.json.d.ts +21 -0
  184. package/lib/cloudflare/wrangler.json.d.ts.map +1 -1
  185. package/lib/cloudflare/wrangler.json.js +33 -0
  186. package/lib/cloudflare/wrangler.json.js.map +1 -1
  187. package/lib/cloudflare/zone.d.ts.map +1 -1
  188. package/lib/cloudflare/zone.js +4 -3
  189. package/lib/cloudflare/zone.js.map +1 -1
  190. package/lib/destroy.d.ts.map +1 -1
  191. package/lib/destroy.js +30 -13
  192. package/lib/destroy.js.map +1 -1
  193. package/lib/dns/godaddy.d.ts.map +1 -1
  194. package/lib/dns/godaddy.js +3 -2
  195. package/lib/dns/godaddy.js.map +1 -1
  196. package/lib/dns/import-dns.d.ts.map +1 -1
  197. package/lib/dns/import-dns.js +2 -1
  198. package/lib/dns/import-dns.js.map +1 -1
  199. package/lib/esbuild/bundle.d.ts +1 -1
  200. package/lib/esbuild/bundle.d.ts.map +1 -1
  201. package/lib/esbuild/bundle.js +2 -1
  202. package/lib/esbuild/bundle.js.map +1 -1
  203. package/lib/fs/copy-file.d.ts.map +1 -1
  204. package/lib/fs/copy-file.js +2 -1
  205. package/lib/fs/copy-file.js.map +1 -1
  206. package/lib/fs/file.d.ts.map +1 -1
  207. package/lib/fs/file.js +2 -1
  208. package/lib/fs/file.js.map +1 -1
  209. package/lib/github/client.d.ts.map +1 -1
  210. package/lib/github/client.js +11 -10
  211. package/lib/github/client.js.map +1 -1
  212. package/lib/github/repository-environment.d.ts.map +1 -1
  213. package/lib/github/repository-environment.js +5 -4
  214. package/lib/github/repository-environment.js.map +1 -1
  215. package/lib/github/secret.d.ts.map +1 -1
  216. package/lib/github/secret.js +7 -6
  217. package/lib/github/secret.js.map +1 -1
  218. package/lib/index.d.ts +2 -1
  219. package/lib/index.d.ts.map +1 -1
  220. package/lib/index.js +1 -0
  221. package/lib/index.js.map +1 -1
  222. package/lib/neon/project.d.ts.map +1 -1
  223. package/lib/neon/project.js +3 -2
  224. package/lib/neon/project.js.map +1 -1
  225. package/lib/planetscale/api.d.ts +53 -0
  226. package/lib/planetscale/api.d.ts.map +1 -0
  227. package/lib/planetscale/api.js +84 -0
  228. package/lib/planetscale/api.js.map +1 -0
  229. package/lib/planetscale/branch.d.ts +129 -0
  230. package/lib/planetscale/branch.d.ts.map +1 -0
  231. package/lib/planetscale/branch.js +161 -0
  232. package/lib/planetscale/branch.js.map +1 -0
  233. package/lib/planetscale/database.d.ts +143 -0
  234. package/lib/planetscale/database.d.ts.map +1 -0
  235. package/lib/planetscale/database.js +184 -0
  236. package/lib/planetscale/database.js.map +1 -0
  237. package/lib/planetscale/index.d.ts +5 -0
  238. package/lib/planetscale/index.d.ts.map +1 -0
  239. package/lib/planetscale/index.js +5 -0
  240. package/lib/planetscale/index.js.map +1 -0
  241. package/lib/planetscale/utils.d.ts +15 -0
  242. package/lib/planetscale/utils.d.ts.map +1 -0
  243. package/lib/planetscale/utils.js +95 -0
  244. package/lib/planetscale/utils.js.map +1 -0
  245. package/lib/resource.js +7 -1
  246. package/lib/resource.js.map +1 -1
  247. package/lib/runtime/plugin.d.ts.map +1 -1
  248. package/lib/runtime/plugin.js +2 -1
  249. package/lib/runtime/plugin.js.map +1 -1
  250. package/lib/scope.d.ts +13 -2
  251. package/lib/scope.d.ts.map +1 -1
  252. package/lib/scope.js +53 -10
  253. package/lib/scope.js.map +1 -1
  254. package/lib/sentry/client-key.d.ts.map +1 -1
  255. package/lib/sentry/client-key.js +5 -4
  256. package/lib/sentry/client-key.js.map +1 -1
  257. package/lib/sentry/project.d.ts.map +1 -1
  258. package/lib/sentry/project.js +5 -4
  259. package/lib/sentry/project.js.map +1 -1
  260. package/lib/sentry/team.d.ts.map +1 -1
  261. package/lib/sentry/team.js +5 -4
  262. package/lib/sentry/team.js.map +1 -1
  263. package/lib/stripe/card.d.ts.map +1 -1
  264. package/lib/stripe/card.js +2 -1
  265. package/lib/stripe/card.js.map +1 -1
  266. package/lib/stripe/client.d.ts.map +1 -1
  267. package/lib/stripe/client.js +3 -2
  268. package/lib/stripe/client.js.map +1 -1
  269. package/lib/stripe/coupon.d.ts.map +1 -1
  270. package/lib/stripe/coupon.js +2 -1
  271. package/lib/stripe/coupon.js.map +1 -1
  272. package/lib/stripe/customer.d.ts.map +1 -1
  273. package/lib/stripe/customer.js +2 -1
  274. package/lib/stripe/customer.js.map +1 -1
  275. package/lib/stripe/entitlements-feature.d.ts.map +1 -1
  276. package/lib/stripe/entitlements-feature.js +2 -1
  277. package/lib/stripe/entitlements-feature.js.map +1 -1
  278. package/lib/stripe/file.d.ts.map +1 -1
  279. package/lib/stripe/file.js +2 -1
  280. package/lib/stripe/file.js.map +1 -1
  281. package/lib/stripe/meter.d.ts.map +1 -1
  282. package/lib/stripe/meter.js +4 -2
  283. package/lib/stripe/meter.js.map +1 -1
  284. package/lib/stripe/portal-configuration.d.ts.map +1 -1
  285. package/lib/stripe/portal-configuration.js +2 -1
  286. package/lib/stripe/portal-configuration.js.map +1 -1
  287. package/lib/stripe/price.d.ts.map +1 -1
  288. package/lib/stripe/price.js +2 -1
  289. package/lib/stripe/price.js.map +1 -1
  290. package/lib/stripe/product-feature.d.ts.map +1 -1
  291. package/lib/stripe/product-feature.js +2 -1
  292. package/lib/stripe/product-feature.js.map +1 -1
  293. package/lib/stripe/product.d.ts.map +1 -1
  294. package/lib/stripe/product.js +2 -1
  295. package/lib/stripe/product.js.map +1 -1
  296. package/lib/stripe/promotion-code.d.ts.map +1 -1
  297. package/lib/stripe/promotion-code.js +2 -1
  298. package/lib/stripe/promotion-code.js.map +1 -1
  299. package/lib/stripe/shipping-rate.d.ts.map +1 -1
  300. package/lib/stripe/shipping-rate.js +2 -1
  301. package/lib/stripe/shipping-rate.js.map +1 -1
  302. package/lib/stripe/tax-rate.d.ts.map +1 -1
  303. package/lib/stripe/tax-rate.js +2 -1
  304. package/lib/stripe/tax-rate.js.map +1 -1
  305. package/lib/stripe/webhook.d.ts.map +1 -1
  306. package/lib/stripe/webhook.js +3 -2
  307. package/lib/stripe/webhook.js.map +1 -1
  308. package/lib/test/bun.d.ts.map +1 -1
  309. package/lib/test/bun.js +6 -1
  310. package/lib/test/bun.js.map +1 -1
  311. package/lib/test/prune.js +7 -1
  312. package/lib/test/prune.js.map +1 -1
  313. package/lib/test/vitest.d.ts.map +1 -1
  314. package/lib/test/vitest.js +10 -3
  315. package/lib/test/vitest.js.map +1 -1
  316. package/lib/upstash/redis.d.ts.map +1 -1
  317. package/lib/upstash/redis.js +2 -1
  318. package/lib/upstash/redis.js.map +1 -1
  319. package/lib/util/async-queue.d.ts +35 -0
  320. package/lib/util/async-queue.d.ts.map +1 -0
  321. package/lib/util/async-queue.js +87 -0
  322. package/lib/util/async-queue.js.map +1 -0
  323. package/lib/util/cli.d.ts +37 -0
  324. package/lib/util/cli.d.ts.map +1 -0
  325. package/lib/util/cli.js +90 -0
  326. package/lib/util/cli.js.map +1 -0
  327. package/lib/util/ignore-matcher.d.ts +94 -0
  328. package/lib/util/ignore-matcher.d.ts.map +1 -0
  329. package/lib/util/ignore-matcher.js +616 -0
  330. package/lib/util/ignore-matcher.js.map +1 -0
  331. package/lib/util/logger.d.ts +3 -0
  332. package/lib/util/logger.d.ts.map +1 -0
  333. package/lib/util/logger.js +15 -0
  334. package/lib/util/logger.js.map +1 -0
  335. package/lib/util/retry.d.ts.map +1 -1
  336. package/lib/util/retry.js +0 -1
  337. package/lib/util/retry.js.map +1 -1
  338. package/lib/util/safe-fetch.d.ts.map +1 -1
  339. package/lib/util/safe-fetch.js +2 -1
  340. package/lib/util/safe-fetch.js.map +1 -1
  341. package/lib/util/telemetry/client.d.ts +32 -0
  342. package/lib/util/telemetry/client.d.ts.map +1 -0
  343. package/lib/util/telemetry/client.js +94 -0
  344. package/lib/util/telemetry/client.js.map +1 -0
  345. package/lib/util/telemetry/constants.d.ts +4 -0
  346. package/lib/util/telemetry/constants.d.ts.map +1 -0
  347. package/lib/util/telemetry/constants.js +8 -0
  348. package/lib/util/telemetry/constants.js.map +1 -0
  349. package/lib/util/telemetry/context.d.ts +15 -0
  350. package/lib/util/telemetry/context.d.ts.map +1 -0
  351. package/lib/util/telemetry/context.js +128 -0
  352. package/lib/util/telemetry/context.js.map +1 -0
  353. package/lib/util/telemetry/index.d.ts +3 -0
  354. package/lib/util/telemetry/index.d.ts.map +1 -0
  355. package/lib/util/telemetry/index.js +3 -0
  356. package/lib/util/telemetry/index.js.map +1 -0
  357. package/lib/util/telemetry/types.d.ts +59 -0
  358. package/lib/util/telemetry/types.d.ts.map +1 -0
  359. package/lib/util/telemetry/types.js +1 -0
  360. package/lib/util/telemetry/types.js.map +1 -0
  361. package/lib/util/xdg-paths.d.ts +9 -0
  362. package/lib/util/xdg-paths.d.ts.map +1 -0
  363. package/lib/util/xdg-paths.js +41 -0
  364. package/lib/util/xdg-paths.js.map +1 -0
  365. package/lib/vercel/project.d.ts.map +1 -1
  366. package/lib/vercel/project.js +2 -1
  367. package/lib/vercel/project.js.map +1 -1
  368. package/lib/web/astro.d.ts.map +1 -1
  369. package/lib/web/astro.js +2 -1
  370. package/lib/web/astro.js.map +1 -1
  371. package/lib/web/shadcn.d.ts.map +1 -1
  372. package/lib/web/shadcn.js +2 -1
  373. package/lib/web/shadcn.js.map +1 -1
  374. package/lib/web/vite.d.ts.map +1 -1
  375. package/lib/web/vite.js +3 -2
  376. package/lib/web/vite.js.map +1 -1
  377. package/lib/web/vitepress/dependencies.d.ts.map +1 -1
  378. package/lib/web/vitepress/dependencies.js +2 -1
  379. package/lib/web/vitepress/dependencies.js.map +1 -1
  380. package/lib/web/vitepress/vitepress.d.ts.map +1 -1
  381. package/lib/web/vitepress/vitepress.js +2 -1
  382. package/lib/web/vitepress/vitepress.js.map +1 -1
  383. package/package.json +6 -4
  384. package/src/ai/astro-file.ts +2 -1
  385. package/src/ai/client.ts +3 -2
  386. package/src/alchemy.ts +28 -3
  387. package/src/apply.ts +66 -5
  388. package/src/aws/control/client.ts +4 -4
  389. package/src/aws/control/properties.ts +48 -0
  390. package/src/aws/control/resource.ts +3 -2
  391. package/src/aws/control/types.ts +3988 -6301
  392. package/src/aws/function.ts +9 -8
  393. package/src/aws/oidc/oidc-provider.ts +3 -2
  394. package/src/aws/queue.ts +3 -2
  395. package/src/aws/role.ts +3 -1
  396. package/src/aws/ssm-parameter.ts +2 -1
  397. package/src/cloudflare/account-api-token.ts +3 -2
  398. package/src/cloudflare/ai-gateway.ts +4 -3
  399. package/src/cloudflare/api-error.ts +36 -0
  400. package/src/cloudflare/api.ts +9 -4
  401. package/src/cloudflare/assets.ts +30 -6
  402. package/src/cloudflare/astro.ts +176 -0
  403. package/src/cloudflare/auth.ts +3 -2
  404. package/src/cloudflare/bindings.ts +29 -0
  405. package/src/cloudflare/bound.ts +38 -21
  406. package/src/cloudflare/bucket.ts +15 -8
  407. package/src/cloudflare/bundle/bundle-worker.ts +2 -1
  408. package/src/cloudflare/bundle/nodejs-compat-mode.ts +2 -1
  409. package/src/cloudflare/custom-domain.ts +10 -9
  410. package/src/cloudflare/d1-database.ts +11 -10
  411. package/src/cloudflare/d1-export.ts +2 -1
  412. package/src/cloudflare/d1-import.ts +2 -1
  413. package/src/cloudflare/d1-migrations.ts +2 -1
  414. package/src/cloudflare/dispatch-namespace.ts +281 -0
  415. package/src/cloudflare/dns-records.ts +5 -4
  416. package/src/cloudflare/do-state-store/worker.ts +4 -0
  417. package/src/cloudflare/email-address.ts +203 -0
  418. package/src/cloudflare/email-catch-all.ts +248 -0
  419. package/src/cloudflare/email-routing.ts +230 -0
  420. package/src/cloudflare/email-rule.ts +322 -0
  421. package/src/cloudflare/hyperdrive.ts +5 -4
  422. package/src/cloudflare/images.ts +59 -0
  423. package/src/cloudflare/index.ts +10 -0
  424. package/src/cloudflare/kv-namespace.ts +2 -1
  425. package/src/cloudflare/pipeline.ts +38 -2
  426. package/src/cloudflare/queue-consumer.ts +2 -1
  427. package/src/cloudflare/queue.ts +0 -12
  428. package/src/cloudflare/route.ts +118 -18
  429. package/src/cloudflare/secret.ts +253 -0
  430. package/src/cloudflare/secrets-store.ts +420 -0
  431. package/src/cloudflare/sveltekit.ts +72 -0
  432. package/src/cloudflare/user.ts +2 -1
  433. package/src/cloudflare/vectorize-index.ts +6 -5
  434. package/src/cloudflare/vectorize-metadata-index.ts +2 -1
  435. package/src/cloudflare/website.ts +76 -66
  436. package/src/cloudflare/worker-assets.ts +95 -89
  437. package/src/cloudflare/worker-metadata.ts +20 -1
  438. package/src/cloudflare/worker.ts +116 -18
  439. package/src/cloudflare/wrangler.json.ts +63 -0
  440. package/src/cloudflare/zone.ts +4 -3
  441. package/src/destroy.ts +35 -17
  442. package/src/dns/godaddy.ts +3 -2
  443. package/src/dns/import-dns.ts +2 -1
  444. package/src/esbuild/bundle.ts +2 -1
  445. package/src/fs/copy-file.ts +2 -1
  446. package/src/fs/file.ts +3 -1
  447. package/src/github/client.ts +11 -10
  448. package/src/github/repository-environment.ts +5 -4
  449. package/src/github/secret.ts +7 -6
  450. package/src/index.ts +2 -1
  451. package/src/neon/project.ts +3 -2
  452. package/src/planetscale/api.ts +115 -0
  453. package/src/planetscale/branch.ts +352 -0
  454. package/src/planetscale/database.ts +394 -0
  455. package/src/planetscale/index.ts +4 -0
  456. package/src/planetscale/utils.ts +189 -0
  457. package/src/resource.ts +7 -1
  458. package/src/runtime/plugin.ts +2 -1
  459. package/src/scope.ts +64 -13
  460. package/src/sentry/client-key.ts +5 -4
  461. package/src/sentry/project.ts +5 -4
  462. package/src/sentry/team.ts +5 -4
  463. package/src/stripe/card.ts +2 -1
  464. package/src/stripe/client.ts +3 -2
  465. package/src/stripe/coupon.ts +2 -1
  466. package/src/stripe/customer.ts +2 -1
  467. package/src/stripe/entitlements-feature.ts +2 -1
  468. package/src/stripe/file.ts +2 -1
  469. package/src/stripe/meter.ts +4 -2
  470. package/src/stripe/portal-configuration.ts +2 -1
  471. package/src/stripe/price.ts +2 -1
  472. package/src/stripe/product-feature.ts +2 -1
  473. package/src/stripe/product.ts +2 -1
  474. package/src/stripe/promotion-code.ts +2 -1
  475. package/src/stripe/shipping-rate.ts +2 -1
  476. package/src/stripe/tax-rate.ts +2 -1
  477. package/src/stripe/webhook.ts +3 -2
  478. package/src/test/bun.ts +6 -1
  479. package/src/test/prune.ts +7 -1
  480. package/src/test/vitest.ts +14 -3
  481. package/src/upstash/redis.ts +2 -1
  482. package/src/util/async-queue.ts +97 -0
  483. package/src/util/cli.tsx +221 -0
  484. package/src/util/ignore-matcher.ts +873 -0
  485. package/src/util/logger.ts +17 -0
  486. package/src/util/retry.ts +0 -1
  487. package/src/util/safe-fetch.ts +2 -1
  488. package/src/util/telemetry/client.ts +127 -0
  489. package/src/util/telemetry/constants.ts +13 -0
  490. package/src/util/telemetry/context.ts +154 -0
  491. package/src/util/telemetry/index.ts +2 -0
  492. package/src/util/telemetry/types.ts +83 -0
  493. package/src/util/xdg-paths.ts +48 -0
  494. package/src/vercel/project.ts +2 -1
  495. package/src/web/astro.ts +2 -1
  496. package/src/web/shadcn.ts +2 -1
  497. package/src/web/vite.ts +3 -2
  498. package/src/web/vitepress/dependencies.ts +2 -1
  499. package/src/web/vitepress/vitepress.ts +2 -1
@@ -2,6 +2,7 @@ import type { Context } from "../context.ts";
2
2
  import { Resource, ResourceKind } from "../resource.ts";
3
3
  import { bind } from "../runtime/bind.ts";
4
4
  import type { Secret } from "../secret.ts";
5
+ import { logger } from "../util/logger.ts";
5
6
  import { CloudflareApiError, handleApiError } from "./api-error.ts";
6
7
  import {
7
8
  createCloudflareApi,
@@ -211,6 +212,14 @@ export interface PipelineProps extends CloudflareApiOptions {
211
212
  * @default true
212
213
  */
213
214
  delete?: boolean;
215
+
216
+ /**
217
+ * Whether to adopt an existing pipeline instead of creating a new one.
218
+ * If set to true, the resource will attempt to adopt an existing pipeline with the same name
219
+ *
220
+ * @default false
221
+ */
222
+ adopt?: boolean;
214
223
  }
215
224
 
216
225
  /**
@@ -359,7 +368,34 @@ const PipelineResource = Resource("cloudflare::Pipeline", async function <
359
368
  let pipelineData: CloudflarePipelineResponse;
360
369
 
361
370
  if (this.phase === "create") {
362
- pipelineData = await createPipeline(api, pipelineName, props);
371
+ console.log(props);
372
+ // Check if we should adopt an existing pipeline
373
+ try {
374
+ // Try to create pipeline first
375
+ console.log("Creating new Cloudflare Pipeline:", pipelineName);
376
+ pipelineData = await createPipeline(api, pipelineName, props);
377
+ } catch (error) {
378
+ // If creation fails with 409 (conflict), adopt existing pipeline
379
+ if (
380
+ error instanceof CloudflareApiError &&
381
+ (error.status === 409 ||
382
+ (error.status === 400 &&
383
+ error.message.includes("Pipeline with this name already exists")))
384
+ ) {
385
+ if (props.adopt) {
386
+ console.log(
387
+ "Pipeline already exists, adopting existing Cloudflare Pipeline:",
388
+ pipelineName,
389
+ );
390
+ pipelineData = await getPipeline(api, pipelineName);
391
+ } else {
392
+ throw error;
393
+ }
394
+ } else {
395
+ // For any other error, rethrow
396
+ throw error;
397
+ }
398
+ }
363
399
  } else {
364
400
  // Update operation
365
401
  if (this.output?.id) {
@@ -374,7 +410,7 @@ const PipelineResource = Resource("cloudflare::Pipeline", async function <
374
410
  pipelineData = await updatePipeline(api, pipelineName, props);
375
411
  } else {
376
412
  // If no ID exists, fall back to creating a new pipeline
377
- console.log(
413
+ logger.log(
378
414
  "No existing Pipeline ID found, creating new Cloudflare Pipeline:",
379
415
  pipelineName,
380
416
  );
@@ -1,5 +1,6 @@
1
1
  import type { Context } from "../context.ts";
2
2
  import { Resource } from "../resource.ts";
3
+ import { logger } from "../util/logger.ts";
3
4
  import { CloudflareApiError, handleApiError } from "./api-error.ts";
4
5
  import {
5
6
  createCloudflareApi,
@@ -157,7 +158,7 @@ export const QueueConsumer = Resource(
157
158
  }
158
159
 
159
160
  if (this.phase === "delete") {
160
- console.log(`Deleting Queue Consumer for queue ${queueId}`);
161
+ logger.log(`Deleting Queue Consumer for queue ${queueId}`);
161
162
  if (props.delete !== false && this.output?.id) {
162
163
  // Delete the consumer
163
164
  await deleteQueueConsumer(api, queueId, this.output.id);
@@ -200,12 +200,8 @@ const QueueResource = Resource("cloudflare::Queue", async function <
200
200
  const queueName = props.name ?? id;
201
201
 
202
202
  if (this.phase === "delete") {
203
- console.log("Deleting Cloudflare Queue:", queueName);
204
203
  if (props.delete !== false) {
205
204
  // Delete Queue
206
- if (!this.output?.id) {
207
- console.log(this.output);
208
- }
209
205
  await deleteQueue(api, this.output?.id);
210
206
  }
211
207
 
@@ -215,7 +211,6 @@ const QueueResource = Resource("cloudflare::Queue", async function <
215
211
  let queueData: CloudflareQueueResponse;
216
212
 
217
213
  if (this.phase === "create") {
218
- console.log("Creating Cloudflare Queue:", queueName);
219
214
  try {
220
215
  queueData = await createQueue(api, queueName, props);
221
216
  } catch (error) {
@@ -239,8 +234,6 @@ const QueueResource = Resource("cloudflare::Queue", async function <
239
234
  } else {
240
235
  // Update operation
241
236
  if (this.output?.id) {
242
- console.log("Updating Cloudflare Queue:", queueName);
243
-
244
237
  // Check if name is being changed, which is not allowed
245
238
  if (queueName !== this.output.name) {
246
239
  throw new Error(
@@ -252,10 +245,6 @@ const QueueResource = Resource("cloudflare::Queue", async function <
252
245
  queueData = await updateQueue(api, this.output.id, props);
253
246
  } else {
254
247
  // If no ID exists, fall back to creating a new queue
255
- console.log(
256
- "No existing Queue ID found, creating new Cloudflare Queue:",
257
- queueName,
258
- );
259
248
  queueData = await createQueue(api, queueName, props);
260
249
  }
261
250
  }
@@ -368,7 +357,6 @@ export async function deleteQueue(
368
357
  queueId?: string,
369
358
  ): Promise<void> {
370
359
  if (!queueId) {
371
- console.log("No Queue ID provided, skipping delete");
372
360
  return;
373
361
  }
374
362
 
@@ -1,5 +1,6 @@
1
1
  import type { Context } from "../context.ts";
2
2
  import { Resource } from "../resource.ts";
3
+ import { logger } from "../util/logger.ts";
3
4
  import { CloudflareApiError, handleApiError } from "./api-error.ts";
4
5
  import {
5
6
  createCloudflareApi,
@@ -7,6 +8,7 @@ import {
7
8
  type CloudflareApiOptions,
8
9
  } from "./api.ts";
9
10
  import type { Worker } from "./worker.ts";
11
+ import { getZoneByDomain } from "./zone.ts";
10
12
 
11
13
  /**
12
14
  * Properties for creating or updating a Route
@@ -26,8 +28,18 @@ export interface RouteProps extends CloudflareApiOptions {
26
28
 
27
29
  /**
28
30
  * Zone ID for the route
31
+ * If not provided, will be automatically inferred from the route pattern using Cloudflare's zones API.
32
+ * The system will attempt to find a zone that matches the domain in the route pattern.
33
+ *
34
+ * @example
35
+ * // Explicit zone ID:
36
+ * { pattern: "api.example.com/*", zoneId: "abc123def456" }
37
+ *
38
+ * // Automatic inference (recommended):
39
+ * { pattern: "api.example.com/*" } // Zone ID automatically inferred from "example.com"
40
+ * { pattern: "*.example.com/api/*" } // Zone ID inferred from "example.com"
29
41
  */
30
- zoneId: string;
42
+ zoneId?: string;
31
43
 
32
44
  /**
33
45
  * Whether to adopt an existing route with the same pattern if it exists
@@ -95,6 +107,21 @@ export interface Route extends Resource<"cloudflare::Route">, RouteProps {
95
107
  * zoneId: "your-zone-id"
96
108
  * });
97
109
  *
110
+ * @example
111
+ * // Create a route with automatic zone ID inference
112
+ * // The zone ID will be automatically determined from the domain in the pattern
113
+ * const autoRoute = await Route("auto-route", {
114
+ * pattern: "api.example.com/*", // Zone ID inferred from example.com
115
+ * script: "my-worker"
116
+ * });
117
+ *
118
+ * @example
119
+ * // Works with wildcard patterns too
120
+ * const wildcardRoute = await Route("wildcard-route", {
121
+ * pattern: "*.example.com/api/*", // Zone ID inferred from example.com
122
+ * script: "api-worker"
123
+ * });
124
+ *
98
125
  * @see https://developers.cloudflare.com/workers/configuration/routes/
99
126
  */
100
127
  export const Route = Resource(
@@ -110,25 +137,44 @@ export const Route = Resource(
110
137
  const scriptName =
111
138
  typeof props.script === "string" ? props.script : props.script.name;
112
139
 
113
- // Get zone ID from props
114
- const { zoneId } = props;
115
-
116
140
  if (this.phase === "delete") {
117
- console.log("Deleting Route:", props.pattern);
141
+ logger.log("Deleting Route:", props.pattern);
118
142
 
119
- // Only delete if we have an ID
120
- if (this.output?.id) {
121
- await deleteRoute(api, zoneId, this.output.id);
143
+ // Only delete if we have complete output data (both ID and zoneId)
144
+ // If creation failed, we won't have proper output, so just skip deletion
145
+ if (this.output?.id && this.output?.zoneId) {
146
+ await deleteRoute(api, this.output.zoneId, this.output.id);
122
147
  }
123
148
 
124
149
  // Return void (a deleted route has no content)
125
150
  return this.destroy();
126
151
  }
127
152
 
153
+ // Get or infer zone ID (only needed for create/update phases)
154
+ let zoneId = props.zoneId;
155
+ if (!zoneId) {
156
+ const inferredZoneId = await inferZoneIdFromPattern(props.pattern, {
157
+ accountId: props.accountId,
158
+ apiKey: props.apiKey,
159
+ apiToken: props.apiToken,
160
+ baseUrl: props.baseUrl,
161
+ email: props.email,
162
+ });
163
+
164
+ if (!inferredZoneId) {
165
+ throw new Error(
166
+ `Could not infer zone ID for route pattern "${props.pattern}". ` +
167
+ "Please ensure the domain is managed by Cloudflare or specify an explicit zoneId.",
168
+ );
169
+ }
170
+
171
+ zoneId = inferredZoneId;
172
+ }
173
+
128
174
  let routeData: CloudflareRouteResponse;
129
175
 
130
176
  if (this.phase === "update" && this.output?.id) {
131
- console.log("Updating Route:", props.pattern);
177
+ logger.log("Updating Route:", props.pattern);
132
178
 
133
179
  // Update existing route
134
180
  routeData = await updateRoute(
@@ -139,7 +185,7 @@ export const Route = Resource(
139
185
  scriptName,
140
186
  );
141
187
  } else {
142
- console.log("Creating Route:", props.pattern);
188
+ logger.log("Creating Route:", props.pattern);
143
189
 
144
190
  try {
145
191
  // Create new route
@@ -151,7 +197,7 @@ export const Route = Resource(
151
197
  error instanceof CloudflareApiError &&
152
198
  error.status === 409
153
199
  ) {
154
- console.log(
200
+ logger.log(
155
201
  `Route with pattern '${props.pattern}' already exists, adopting it`,
156
202
  );
157
203
  // Find the existing route by pattern
@@ -167,13 +213,14 @@ export const Route = Resource(
167
213
  );
168
214
  }
169
215
 
170
- // Use the existing route data
171
- routeData = {
172
- result: existingRoute,
173
- success: true,
174
- errors: [],
175
- messages: [],
176
- };
216
+ // Update the existing route to point to our script
217
+ routeData = await updateRoute(
218
+ api,
219
+ zoneId,
220
+ existingRoute.id,
221
+ props.pattern,
222
+ scriptName,
223
+ );
177
224
  } else {
178
225
  // Re-throw the error if adopt is false or it's not a 409 error
179
226
  throw error;
@@ -350,3 +397,56 @@ async function findRouteByPattern(
350
397
  const match = data.result.find((route) => route.pattern === pattern);
351
398
  return match || null;
352
399
  }
400
+
401
+ /**
402
+ * Extract domain from a route pattern, similar to wrangler's logic
403
+ * @param pattern The route pattern (e.g., "api.example.com/*", "*.example.com/api/*")
404
+ * @returns The domain part of the pattern
405
+ */
406
+ function extractDomainFromPattern(pattern: string): string {
407
+ // Remove protocol if present
408
+ let domain = pattern.replace(/^https?:\/\//, "");
409
+
410
+ // Remove path part (everything after the first '/')
411
+ domain = domain.split("/")[0];
412
+
413
+ // Remove port if present
414
+ domain = domain.split(":")[0];
415
+
416
+ return domain;
417
+ }
418
+
419
+ /**
420
+ * Infer zone ID from a route pattern using Cloudflare API
421
+ * This implements similar logic to wrangler's zone inference
422
+ * @param pattern The route pattern
423
+ * @param apiOptions API options for Cloudflare API calls
424
+ * @returns Promise resolving to zone ID or null if not found
425
+ */
426
+ async function inferZoneIdFromPattern(
427
+ pattern: string,
428
+ apiOptions: Partial<CloudflareApiOptions>,
429
+ ): Promise<string | null> {
430
+ const domain = extractDomainFromPattern(pattern);
431
+
432
+ // Handle wildcard domains by removing the wildcard part
433
+ const cleanDomain = domain.replace(/^\*\./, "");
434
+
435
+ // Try to find zone for the exact domain first
436
+ let zone = await getZoneByDomain(cleanDomain, apiOptions);
437
+ if (zone) {
438
+ return zone.id;
439
+ }
440
+
441
+ // If not found, try parent domains (similar to wrangler's logic)
442
+ const domainParts = cleanDomain.split(".");
443
+ for (let i = 1; i < domainParts.length - 1; i++) {
444
+ const parentDomain = domainParts.slice(i).join(".");
445
+ zone = await getZoneByDomain(parentDomain, apiOptions);
446
+ if (zone) {
447
+ return zone.id;
448
+ }
449
+ }
450
+
451
+ return null;
452
+ }
@@ -0,0 +1,253 @@
1
+ import type { Context } from "../context.ts";
2
+ import { Resource, ResourceKind } from "../resource.ts";
3
+ import {
4
+ secret as alchemySecret,
5
+ type Secret as AlchemySecret,
6
+ } from "../secret.ts";
7
+ import { handleApiError } from "./api-error.ts";
8
+ import {
9
+ createCloudflareApi,
10
+ type CloudflareApi,
11
+ type CloudflareApiOptions,
12
+ } from "./api.ts";
13
+ import type { SecretsStore } from "./secrets-store.ts";
14
+
15
+ /**
16
+ * Properties for creating or updating a Secret in a Secrets Store (internal interface)
17
+ */
18
+ interface _SecretProps extends CloudflareApiOptions {
19
+ /**
20
+ * The secrets store to add this secret to
21
+ */
22
+ store: SecretsStore<any>;
23
+
24
+ /**
25
+ * The secret value to store (must be an AlchemySecret for security)
26
+ */
27
+ value: AlchemySecret;
28
+
29
+ /**
30
+ * Whether to delete the secret.
31
+ * If set to false, the secret will remain but the resource will be removed from state
32
+ *
33
+ * @default true
34
+ */
35
+ delete?: boolean;
36
+ }
37
+
38
+ /**
39
+ * Properties for creating or updating a Secret in a Secrets Store (public interface)
40
+ */
41
+ export interface SecretProps extends CloudflareApiOptions {
42
+ /**
43
+ * The secrets store to add this secret to
44
+ */
45
+ store: SecretsStore<any>;
46
+
47
+ /**
48
+ * The secret value to store
49
+ * Can be a string or an existing Secret instance
50
+ *
51
+ * @example
52
+ * ```ts
53
+ * const secret = await Secret("api-key", {
54
+ * store: mySecretsStore,
55
+ * value: alchemy.secret(process.env.API_KEY)
56
+ * });
57
+ * ```
58
+ */
59
+ value: string | AlchemySecret;
60
+
61
+ /**
62
+ * Whether to delete the secret.
63
+ * If set to false, the secret will remain but the resource will be removed from state
64
+ *
65
+ * @default true
66
+ */
67
+ delete?: boolean;
68
+ }
69
+
70
+ export function isSecret(resource: Resource): resource is Secret {
71
+ return resource[ResourceKind] === "cloudflare::Secret";
72
+ }
73
+
74
+ export interface Secret
75
+ extends Resource<"cloudflare::Secret">,
76
+ Omit<_SecretProps, "delete"> {
77
+ /**
78
+ * The name of the secret
79
+ */
80
+ name: string;
81
+
82
+ /**
83
+ * The unique identifier of the secrets store this secret belongs to
84
+ */
85
+ storeId: string;
86
+
87
+ /**
88
+ * The secret value (as an alchemy Secret instance)
89
+ */
90
+ value: AlchemySecret;
91
+
92
+ /**
93
+ * Timestamp when the secret was created
94
+ */
95
+ createdAt: number;
96
+
97
+ /**
98
+ * Timestamp when the secret was last modified
99
+ */
100
+ modifiedAt: number;
101
+ }
102
+
103
+ /**
104
+ * A Cloudflare Secret represents an individual secret stored in a Secrets Store.
105
+ *
106
+ * Use this resource to add individual secrets to an existing Secrets Store,
107
+ * providing fine-grained control over secret management.
108
+ *
109
+ * @see https://developers.cloudflare.com/api/resources/secrets_store/subresources/stores/subresources/secrets/
110
+ *
111
+ * @example
112
+ * // Create a secrets store first
113
+ * const store = await SecretsStore("my-store", {
114
+ * name: "production-secrets"
115
+ * });
116
+ *
117
+ * // Add individual secrets to the store
118
+ * const apiKey = await Secret("api-key", {
119
+ * store: store,
120
+ * value: alchemy.secret(process.env.API_KEY)
121
+ * });
122
+ *
123
+ * const dbUrl = await Secret("database-url", {
124
+ * store: store,
125
+ * value: process.env.DATABASE_URL
126
+ * });
127
+ *
128
+ * @example
129
+ * // Use in a Worker binding
130
+ * const worker = await Worker("my-worker", {
131
+ * bindings: {
132
+ * SECRETS: store
133
+ * },
134
+ * code: `
135
+ * export default {
136
+ * async fetch(request, env) {
137
+ * const apiKey = await env.SECRETS.get("api-key");
138
+ * const dbUrl = await env.SECRETS.get("database-url");
139
+ * return new Response(\`API: \${apiKey ? "set" : "unset"}\`);
140
+ * }
141
+ * }
142
+ * `
143
+ * });
144
+ *
145
+ * @example
146
+ * // When removing from Alchemy state, keep the secret in Cloudflare
147
+ * const preservedSecret = await Secret("preserve-secret", {
148
+ * store: myStore,
149
+ * value: "preserved-value",
150
+ * delete: false
151
+ * });
152
+ */
153
+ export async function Secret(
154
+ name: string,
155
+ props: SecretProps,
156
+ ): Promise<Secret> {
157
+ // Convert string value to AlchemySecret if needed to prevent plain text serialization
158
+ const secretValue =
159
+ typeof props.value === "string" ? alchemySecret(props.value) : props.value;
160
+
161
+ // Call the internal resource with secure props
162
+ return _Secret(name, {
163
+ ...props,
164
+ value: secretValue,
165
+ });
166
+ }
167
+
168
+ const _Secret = Resource(
169
+ "cloudflare::Secret",
170
+ async function (
171
+ this: Context<Secret>,
172
+ name: string,
173
+ props: _SecretProps,
174
+ ): Promise<Secret> {
175
+ const api = await createCloudflareApi(props);
176
+
177
+ if (this.phase === "delete") {
178
+ if (props.delete !== false) {
179
+ await deleteSecret(api, props.store.id, name);
180
+ }
181
+ return this.destroy();
182
+ }
183
+
184
+ const createdAt =
185
+ this.phase === "update"
186
+ ? this.output?.createdAt || Date.now()
187
+ : Date.now();
188
+
189
+ // Insert or update the secret
190
+ await insertSecret(api, props.store.id, name, props.value);
191
+
192
+ return this({
193
+ name,
194
+ storeId: props.store.id,
195
+ store: props.store,
196
+ value: props.value,
197
+ createdAt,
198
+ modifiedAt: Date.now(),
199
+ });
200
+ },
201
+ );
202
+
203
+ /**
204
+ * Insert or update a secret in a secrets store
205
+ */
206
+ export async function insertSecret(
207
+ api: CloudflareApi,
208
+ storeId: string,
209
+ secretName: string,
210
+ secretValue: AlchemySecret,
211
+ ): Promise<void> {
212
+ const response = await api.post(
213
+ `/accounts/${api.accountId}/secrets_store/stores/${storeId}/secrets`,
214
+ [
215
+ {
216
+ name: secretName,
217
+ value: secretValue.unencrypted,
218
+ scopes: [],
219
+ },
220
+ ],
221
+ );
222
+
223
+ if (!response.ok) {
224
+ const errorData: any = await response.json().catch(() => ({
225
+ errors: [{ message: response.statusText }],
226
+ }));
227
+ const errorMessage = errorData.errors?.[0]?.message || response.statusText;
228
+ throw new Error(`Error creating secret '${secretName}': ${errorMessage}`);
229
+ }
230
+ }
231
+
232
+ /**
233
+ * Delete a secret from a secrets store
234
+ */
235
+ export async function deleteSecret(
236
+ api: CloudflareApi,
237
+ storeId: string,
238
+ secretName: string,
239
+ ): Promise<void> {
240
+ const response = await api.delete(
241
+ `/accounts/${api.accountId}/secrets_store/stores/${storeId}/secrets`,
242
+ {
243
+ body: JSON.stringify([secretName]),
244
+ headers: {
245
+ "Content-Type": "application/json",
246
+ },
247
+ },
248
+ );
249
+
250
+ if (!response.ok && response.status !== 404) {
251
+ await handleApiError(response, "delete", "secret", secretName);
252
+ }
253
+ }