alchemy 0.24.1 → 0.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -0
- package/lib/ai/astro-file.d.ts.map +1 -1
- package/lib/ai/astro-file.js +2 -1
- package/lib/ai/astro-file.js.map +1 -1
- package/lib/ai/client.d.ts.map +1 -1
- package/lib/ai/client.js +3 -2
- package/lib/ai/client.js.map +1 -1
- package/lib/alchemy.d.ts +7 -0
- package/lib/alchemy.d.ts.map +1 -1
- package/lib/alchemy.js +19 -3
- package/lib/alchemy.js.map +1 -1
- package/lib/apply.d.ts.map +1 -1
- package/lib/apply.js +63 -5
- package/lib/apply.js.map +1 -1
- package/lib/aws/control/client.js +5 -4
- package/lib/aws/control/client.js.map +1 -1
- package/lib/aws/control/properties.d.ts +6 -0
- package/lib/aws/control/properties.d.ts.map +1 -1
- package/lib/aws/control/properties.js +48 -0
- package/lib/aws/control/properties.js.map +1 -1
- package/lib/aws/control/resource.d.ts.map +1 -1
- package/lib/aws/control/resource.js +5 -3
- package/lib/aws/control/resource.js.map +1 -1
- package/lib/aws/control/types.d.ts +3969 -4862
- package/lib/aws/control/types.d.ts.map +1 -1
- package/lib/aws/control/types.js.map +1 -1
- package/lib/aws/function.d.ts.map +1 -1
- package/lib/aws/function.js +9 -8
- package/lib/aws/function.js.map +1 -1
- package/lib/aws/oidc/oidc-provider.d.ts.map +1 -1
- package/lib/aws/oidc/oidc-provider.js +3 -2
- package/lib/aws/oidc/oidc-provider.js.map +1 -1
- package/lib/aws/queue.d.ts.map +1 -1
- package/lib/aws/queue.js +3 -2
- package/lib/aws/queue.js.map +1 -1
- package/lib/aws/role.d.ts.map +1 -1
- package/lib/aws/role.js +3 -1
- package/lib/aws/role.js.map +1 -1
- package/lib/aws/ssm-parameter.d.ts.map +1 -1
- package/lib/aws/ssm-parameter.js +2 -1
- package/lib/aws/ssm-parameter.js.map +1 -1
- package/lib/cloudflare/account-api-token.d.ts.map +1 -1
- package/lib/cloudflare/account-api-token.js +3 -2
- package/lib/cloudflare/account-api-token.js.map +1 -1
- package/lib/cloudflare/ai-gateway.d.ts.map +1 -1
- package/lib/cloudflare/ai-gateway.js +4 -3
- package/lib/cloudflare/ai-gateway.js.map +1 -1
- package/lib/cloudflare/ai.d.ts +21 -0
- package/lib/cloudflare/ai.d.ts.map +1 -1
- package/lib/cloudflare/ai.js +21 -0
- package/lib/cloudflare/ai.js.map +1 -1
- package/lib/cloudflare/api-error.d.ts +0 -9
- package/lib/cloudflare/api-error.d.ts.map +1 -1
- package/lib/cloudflare/api-error.js +24 -0
- package/lib/cloudflare/api-error.js.map +1 -1
- package/lib/cloudflare/api.d.ts.map +1 -1
- package/lib/cloudflare/api.js +5 -4
- package/lib/cloudflare/api.js.map +1 -1
- package/lib/cloudflare/assets.d.ts.map +1 -1
- package/lib/cloudflare/assets.js +26 -6
- package/lib/cloudflare/assets.js.map +1 -1
- package/lib/cloudflare/astro.d.ts +63 -0
- package/lib/cloudflare/astro.d.ts.map +1 -0
- package/lib/cloudflare/astro.js +133 -0
- package/lib/cloudflare/astro.js.map +1 -0
- package/lib/cloudflare/auth.d.ts.map +1 -1
- package/lib/cloudflare/auth.js +3 -2
- package/lib/cloudflare/auth.js.map +1 -1
- package/lib/cloudflare/bindings.d.ts +23 -2
- package/lib/cloudflare/bindings.d.ts.map +1 -1
- package/lib/cloudflare/bindings.js.map +1 -1
- package/lib/cloudflare/bound.d.ts +7 -1
- package/lib/cloudflare/bound.d.ts.map +1 -1
- package/lib/cloudflare/bucket.d.ts.map +1 -1
- package/lib/cloudflare/bucket.js +12 -8
- package/lib/cloudflare/bucket.js.map +1 -1
- package/lib/cloudflare/bundle/bundle-worker.d.ts.map +1 -1
- package/lib/cloudflare/bundle/bundle-worker.js +2 -1
- package/lib/cloudflare/bundle/bundle-worker.js.map +1 -1
- package/lib/cloudflare/bundle/nodejs-compat-mode.d.ts.map +1 -1
- package/lib/cloudflare/bundle/nodejs-compat-mode.js +2 -1
- package/lib/cloudflare/bundle/nodejs-compat-mode.js.map +1 -1
- package/lib/cloudflare/custom-domain.d.ts.map +1 -1
- package/lib/cloudflare/custom-domain.js +10 -9
- package/lib/cloudflare/custom-domain.js.map +1 -1
- package/lib/cloudflare/d1-database.d.ts.map +1 -1
- package/lib/cloudflare/d1-database.js +11 -10
- package/lib/cloudflare/d1-database.js.map +1 -1
- package/lib/cloudflare/d1-export.d.ts.map +1 -1
- package/lib/cloudflare/d1-export.js +2 -1
- package/lib/cloudflare/d1-export.js.map +1 -1
- package/lib/cloudflare/d1-import.d.ts.map +1 -1
- package/lib/cloudflare/d1-import.js +2 -1
- package/lib/cloudflare/d1-import.js.map +1 -1
- package/lib/cloudflare/d1-migrations.d.ts.map +1 -1
- package/lib/cloudflare/d1-migrations.js +2 -1
- package/lib/cloudflare/d1-migrations.js.map +1 -1
- package/lib/cloudflare/dns-records.d.ts.map +1 -1
- package/lib/cloudflare/dns-records.js +5 -4
- package/lib/cloudflare/dns-records.js.map +1 -1
- package/lib/cloudflare/do-state-store/worker.d.ts.map +1 -1
- package/lib/cloudflare/do-state-store/worker.js +4 -0
- package/lib/cloudflare/do-state-store/worker.js.map +1 -1
- package/lib/cloudflare/email-address.d.ts +79 -0
- package/lib/cloudflare/email-address.d.ts.map +1 -0
- package/lib/cloudflare/email-address.js +112 -0
- package/lib/cloudflare/email-address.js.map +1 -0
- package/lib/cloudflare/email-catch-all.d.ts +123 -0
- package/lib/cloudflare/email-catch-all.d.ts.map +1 -0
- package/lib/cloudflare/email-catch-all.js +124 -0
- package/lib/cloudflare/email-catch-all.js.map +1 -0
- package/lib/cloudflare/email-routing.d.ts +89 -0
- package/lib/cloudflare/email-routing.d.ts.map +1 -0
- package/lib/cloudflare/email-routing.js +120 -0
- package/lib/cloudflare/email-routing.js.map +1 -0
- package/lib/cloudflare/email-rule.d.ts +196 -0
- package/lib/cloudflare/email-rule.d.ts.map +1 -0
- package/lib/cloudflare/email-rule.js +153 -0
- package/lib/cloudflare/email-rule.js.map +1 -0
- package/lib/cloudflare/hyperdrive.d.ts.map +1 -1
- package/lib/cloudflare/hyperdrive.js +5 -4
- package/lib/cloudflare/hyperdrive.js.map +1 -1
- package/lib/cloudflare/images.d.ts +60 -0
- package/lib/cloudflare/images.d.ts.map +1 -0
- package/lib/cloudflare/images.js +60 -0
- package/lib/cloudflare/images.js.map +1 -0
- package/lib/cloudflare/index.d.ts +9 -0
- package/lib/cloudflare/index.d.ts.map +1 -1
- package/lib/cloudflare/index.js +9 -0
- package/lib/cloudflare/index.js.map +1 -1
- package/lib/cloudflare/kv-namespace.d.ts.map +1 -1
- package/lib/cloudflare/kv-namespace.js +2 -1
- package/lib/cloudflare/kv-namespace.js.map +1 -1
- package/lib/cloudflare/pipeline.d.ts +7 -0
- package/lib/cloudflare/pipeline.d.ts.map +1 -1
- package/lib/cloudflare/pipeline.js +28 -2
- package/lib/cloudflare/pipeline.js.map +1 -1
- package/lib/cloudflare/queue-consumer.d.ts.map +1 -1
- package/lib/cloudflare/queue-consumer.js +2 -1
- package/lib/cloudflare/queue-consumer.js.map +1 -1
- package/lib/cloudflare/queue.d.ts.map +1 -1
- package/lib/cloudflare/queue.js +0 -8
- package/lib/cloudflare/queue.js.map +1 -1
- package/lib/cloudflare/route.d.ts +26 -1
- package/lib/cloudflare/route.d.ts.map +1 -1
- package/lib/cloudflare/route.js +84 -16
- package/lib/cloudflare/route.js.map +1 -1
- package/lib/cloudflare/secret.d.ts +137 -0
- package/lib/cloudflare/secret.d.ts.map +1 -0
- package/lib/cloudflare/secret.js +122 -0
- package/lib/cloudflare/secret.js.map +1 -0
- package/lib/cloudflare/secrets-store.d.ts +145 -0
- package/lib/cloudflare/secrets-store.d.ts.map +1 -0
- package/lib/cloudflare/secrets-store.js +213 -0
- package/lib/cloudflare/secrets-store.js.map +1 -0
- package/lib/cloudflare/sveltekit.d.ts +49 -0
- package/lib/cloudflare/sveltekit.d.ts.map +1 -0
- package/lib/cloudflare/sveltekit.js +56 -0
- package/lib/cloudflare/sveltekit.js.map +1 -0
- package/lib/cloudflare/user.d.ts.map +1 -1
- package/lib/cloudflare/user.js +2 -1
- package/lib/cloudflare/user.js.map +1 -1
- package/lib/cloudflare/vectorize-index.d.ts.map +1 -1
- package/lib/cloudflare/vectorize-index.js +6 -5
- package/lib/cloudflare/vectorize-index.js.map +1 -1
- package/lib/cloudflare/vectorize-metadata-index.d.ts.map +1 -1
- package/lib/cloudflare/vectorize-metadata-index.js +2 -1
- package/lib/cloudflare/vectorize-metadata-index.js.map +1 -1
- package/lib/cloudflare/website.d.ts.map +1 -1
- package/lib/cloudflare/website.js +7 -2
- package/lib/cloudflare/website.js.map +1 -1
- package/lib/cloudflare/worker-assets.d.ts +18 -0
- package/lib/cloudflare/worker-assets.d.ts.map +1 -1
- package/lib/cloudflare/worker-assets.js +61 -57
- package/lib/cloudflare/worker-assets.js.map +1 -1
- package/lib/cloudflare/worker-metadata.d.ts.map +1 -1
- package/lib/cloudflare/worker-metadata.js +16 -1
- package/lib/cloudflare/worker-metadata.js.map +1 -1
- package/lib/cloudflare/worker.d.ts +31 -1
- package/lib/cloudflare/worker.d.ts.map +1 -1
- package/lib/cloudflare/worker.js +34 -8
- package/lib/cloudflare/worker.js.map +1 -1
- package/lib/cloudflare/wrangler.json.d.ts +14 -0
- package/lib/cloudflare/wrangler.json.d.ts.map +1 -1
- package/lib/cloudflare/wrangler.json.js +23 -0
- package/lib/cloudflare/wrangler.json.js.map +1 -1
- package/lib/cloudflare/zone.d.ts +30 -2
- package/lib/cloudflare/zone.d.ts.map +1 -1
- package/lib/cloudflare/zone.js +57 -3
- package/lib/cloudflare/zone.js.map +1 -1
- package/lib/destroy.d.ts.map +1 -1
- package/lib/destroy.js +30 -13
- package/lib/destroy.js.map +1 -1
- package/lib/dns/godaddy.d.ts.map +1 -1
- package/lib/dns/godaddy.js +3 -2
- package/lib/dns/godaddy.js.map +1 -1
- package/lib/dns/import-dns.d.ts.map +1 -1
- package/lib/dns/import-dns.js +2 -1
- package/lib/dns/import-dns.js.map +1 -1
- package/lib/esbuild/bundle.d.ts +1 -1
- package/lib/esbuild/bundle.d.ts.map +1 -1
- package/lib/esbuild/bundle.js +2 -1
- package/lib/esbuild/bundle.js.map +1 -1
- package/lib/fs/copy-file.d.ts.map +1 -1
- package/lib/fs/copy-file.js +2 -1
- package/lib/fs/copy-file.js.map +1 -1
- package/lib/fs/file.d.ts.map +1 -1
- package/lib/fs/file.js +2 -1
- package/lib/fs/file.js.map +1 -1
- package/lib/github/client.d.ts.map +1 -1
- package/lib/github/client.js +11 -10
- package/lib/github/client.js.map +1 -1
- package/lib/github/repository-environment.d.ts.map +1 -1
- package/lib/github/repository-environment.js +5 -4
- package/lib/github/repository-environment.js.map +1 -1
- package/lib/github/secret.d.ts.map +1 -1
- package/lib/github/secret.js +7 -6
- package/lib/github/secret.js.map +1 -1
- package/lib/index.d.ts +2 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib/neon/project.d.ts.map +1 -1
- package/lib/neon/project.js +3 -2
- package/lib/neon/project.js.map +1 -1
- package/lib/planetscale/api.d.ts +53 -0
- package/lib/planetscale/api.d.ts.map +1 -0
- package/lib/planetscale/api.js +84 -0
- package/lib/planetscale/api.js.map +1 -0
- package/lib/planetscale/branch.d.ts +129 -0
- package/lib/planetscale/branch.d.ts.map +1 -0
- package/lib/planetscale/branch.js +161 -0
- package/lib/planetscale/branch.js.map +1 -0
- package/lib/planetscale/database.d.ts +143 -0
- package/lib/planetscale/database.d.ts.map +1 -0
- package/lib/planetscale/database.js +184 -0
- package/lib/planetscale/database.js.map +1 -0
- package/lib/planetscale/index.d.ts +5 -0
- package/lib/planetscale/index.d.ts.map +1 -0
- package/lib/planetscale/index.js +5 -0
- package/lib/planetscale/index.js.map +1 -0
- package/lib/planetscale/utils.d.ts +15 -0
- package/lib/planetscale/utils.d.ts.map +1 -0
- package/lib/planetscale/utils.js +95 -0
- package/lib/planetscale/utils.js.map +1 -0
- package/lib/resource.js +7 -1
- package/lib/resource.js.map +1 -1
- package/lib/runtime/plugin.d.ts.map +1 -1
- package/lib/runtime/plugin.js +2 -1
- package/lib/runtime/plugin.js.map +1 -1
- package/lib/scope.d.ts +13 -2
- package/lib/scope.d.ts.map +1 -1
- package/lib/scope.js +53 -10
- package/lib/scope.js.map +1 -1
- package/lib/sentry/client-key.d.ts.map +1 -1
- package/lib/sentry/client-key.js +5 -4
- package/lib/sentry/client-key.js.map +1 -1
- package/lib/sentry/project.d.ts.map +1 -1
- package/lib/sentry/project.js +5 -4
- package/lib/sentry/project.js.map +1 -1
- package/lib/sentry/team.d.ts.map +1 -1
- package/lib/sentry/team.js +5 -4
- package/lib/sentry/team.js.map +1 -1
- package/lib/stripe/card.d.ts.map +1 -1
- package/lib/stripe/card.js +2 -1
- package/lib/stripe/card.js.map +1 -1
- package/lib/stripe/client.d.ts.map +1 -1
- package/lib/stripe/client.js +3 -2
- package/lib/stripe/client.js.map +1 -1
- package/lib/stripe/coupon.d.ts.map +1 -1
- package/lib/stripe/coupon.js +2 -1
- package/lib/stripe/coupon.js.map +1 -1
- package/lib/stripe/customer.d.ts.map +1 -1
- package/lib/stripe/customer.js +2 -1
- package/lib/stripe/customer.js.map +1 -1
- package/lib/stripe/entitlements-feature.d.ts.map +1 -1
- package/lib/stripe/entitlements-feature.js +2 -1
- package/lib/stripe/entitlements-feature.js.map +1 -1
- package/lib/stripe/file.d.ts.map +1 -1
- package/lib/stripe/file.js +2 -1
- package/lib/stripe/file.js.map +1 -1
- package/lib/stripe/meter.d.ts.map +1 -1
- package/lib/stripe/meter.js +4 -2
- package/lib/stripe/meter.js.map +1 -1
- package/lib/stripe/portal-configuration.d.ts.map +1 -1
- package/lib/stripe/portal-configuration.js +2 -1
- package/lib/stripe/portal-configuration.js.map +1 -1
- package/lib/stripe/price.d.ts.map +1 -1
- package/lib/stripe/price.js +2 -1
- package/lib/stripe/price.js.map +1 -1
- package/lib/stripe/product-feature.d.ts.map +1 -1
- package/lib/stripe/product-feature.js +2 -1
- package/lib/stripe/product-feature.js.map +1 -1
- package/lib/stripe/product.d.ts.map +1 -1
- package/lib/stripe/product.js +2 -1
- package/lib/stripe/product.js.map +1 -1
- package/lib/stripe/promotion-code.d.ts.map +1 -1
- package/lib/stripe/promotion-code.js +2 -1
- package/lib/stripe/promotion-code.js.map +1 -1
- package/lib/stripe/shipping-rate.d.ts.map +1 -1
- package/lib/stripe/shipping-rate.js +2 -1
- package/lib/stripe/shipping-rate.js.map +1 -1
- package/lib/stripe/tax-rate.d.ts.map +1 -1
- package/lib/stripe/tax-rate.js +2 -1
- package/lib/stripe/tax-rate.js.map +1 -1
- package/lib/stripe/webhook.d.ts.map +1 -1
- package/lib/stripe/webhook.js +3 -2
- package/lib/stripe/webhook.js.map +1 -1
- package/lib/test/bun.d.ts.map +1 -1
- package/lib/test/bun.js +6 -1
- package/lib/test/bun.js.map +1 -1
- package/lib/test/prune.js +7 -1
- package/lib/test/prune.js.map +1 -1
- package/lib/test/vitest.d.ts.map +1 -1
- package/lib/test/vitest.js +2 -0
- package/lib/test/vitest.js.map +1 -1
- package/lib/upstash/redis.d.ts.map +1 -1
- package/lib/upstash/redis.js +2 -1
- package/lib/upstash/redis.js.map +1 -1
- package/lib/util/async-queue.d.ts +35 -0
- package/lib/util/async-queue.d.ts.map +1 -0
- package/lib/util/async-queue.js +87 -0
- package/lib/util/async-queue.js.map +1 -0
- package/lib/util/cli.d.ts +37 -0
- package/lib/util/cli.d.ts.map +1 -0
- package/lib/util/cli.js +90 -0
- package/lib/util/cli.js.map +1 -0
- package/lib/util/ignore-matcher.d.ts +94 -0
- package/lib/util/ignore-matcher.d.ts.map +1 -0
- package/lib/util/ignore-matcher.js +616 -0
- package/lib/util/ignore-matcher.js.map +1 -0
- package/lib/util/logger.d.ts +3 -0
- package/lib/util/logger.d.ts.map +1 -0
- package/lib/util/logger.js +15 -0
- package/lib/util/logger.js.map +1 -0
- package/lib/util/retry.d.ts.map +1 -1
- package/lib/util/retry.js +0 -1
- package/lib/util/retry.js.map +1 -1
- package/lib/util/safe-fetch.d.ts.map +1 -1
- package/lib/util/safe-fetch.js +2 -1
- package/lib/util/safe-fetch.js.map +1 -1
- package/lib/util/telemetry/client.d.ts +32 -0
- package/lib/util/telemetry/client.d.ts.map +1 -0
- package/lib/util/telemetry/client.js +94 -0
- package/lib/util/telemetry/client.js.map +1 -0
- package/lib/util/telemetry/constants.d.ts +4 -0
- package/lib/util/telemetry/constants.d.ts.map +1 -0
- package/lib/util/telemetry/constants.js +8 -0
- package/lib/util/telemetry/constants.js.map +1 -0
- package/lib/util/telemetry/context.d.ts +15 -0
- package/lib/util/telemetry/context.d.ts.map +1 -0
- package/lib/util/telemetry/context.js +128 -0
- package/lib/util/telemetry/context.js.map +1 -0
- package/lib/util/telemetry/index.d.ts +3 -0
- package/lib/util/telemetry/index.d.ts.map +1 -0
- package/lib/util/telemetry/index.js +3 -0
- package/lib/util/telemetry/index.js.map +1 -0
- package/lib/util/telemetry/types.d.ts +59 -0
- package/lib/util/telemetry/types.d.ts.map +1 -0
- package/lib/util/telemetry/types.js +1 -0
- package/lib/util/telemetry/types.js.map +1 -0
- package/lib/util/xdg-paths.d.ts +9 -0
- package/lib/util/xdg-paths.d.ts.map +1 -0
- package/lib/util/xdg-paths.js +41 -0
- package/lib/util/xdg-paths.js.map +1 -0
- package/lib/vercel/project.d.ts.map +1 -1
- package/lib/vercel/project.js +2 -1
- package/lib/vercel/project.js.map +1 -1
- package/lib/web/astro.d.ts.map +1 -1
- package/lib/web/astro.js +2 -1
- package/lib/web/astro.js.map +1 -1
- package/lib/web/shadcn.d.ts.map +1 -1
- package/lib/web/shadcn.js +2 -1
- package/lib/web/shadcn.js.map +1 -1
- package/lib/web/vite.d.ts.map +1 -1
- package/lib/web/vite.js +3 -2
- package/lib/web/vite.js.map +1 -1
- package/lib/web/vitepress/dependencies.d.ts.map +1 -1
- package/lib/web/vitepress/dependencies.js +2 -1
- package/lib/web/vitepress/dependencies.js.map +1 -1
- package/lib/web/vitepress/vitepress.d.ts.map +1 -1
- package/lib/web/vitepress/vitepress.js +2 -1
- package/lib/web/vitepress/vitepress.js.map +1 -1
- package/package.json +7 -5
- package/src/ai/astro-file.ts +2 -1
- package/src/ai/client.ts +3 -2
- package/src/alchemy.ts +28 -3
- package/src/apply.ts +66 -5
- package/src/aws/control/client.ts +5 -5
- package/src/aws/control/properties.ts +48 -0
- package/src/aws/control/resource.ts +5 -3
- package/src/aws/control/types.ts +3988 -6301
- package/src/aws/function.ts +9 -8
- package/src/aws/oidc/oidc-provider.ts +3 -2
- package/src/aws/queue.ts +3 -2
- package/src/aws/role.ts +3 -1
- package/src/aws/ssm-parameter.ts +2 -1
- package/src/cloudflare/account-api-token.ts +3 -2
- package/src/cloudflare/ai-gateway.ts +4 -3
- package/src/cloudflare/ai.ts +21 -0
- package/src/cloudflare/api-error.ts +36 -0
- package/src/cloudflare/api.ts +9 -4
- package/src/cloudflare/assets.ts +30 -6
- package/src/cloudflare/astro.ts +176 -0
- package/src/cloudflare/auth.ts +3 -2
- package/src/cloudflare/bindings.ts +27 -0
- package/src/cloudflare/bound.ts +31 -17
- package/src/cloudflare/bucket.ts +15 -8
- package/src/cloudflare/bundle/bundle-worker.ts +2 -1
- package/src/cloudflare/bundle/nodejs-compat-mode.ts +2 -1
- package/src/cloudflare/custom-domain.ts +10 -9
- package/src/cloudflare/d1-database.ts +11 -10
- package/src/cloudflare/d1-export.ts +2 -1
- package/src/cloudflare/d1-import.ts +2 -1
- package/src/cloudflare/d1-migrations.ts +2 -1
- package/src/cloudflare/dns-records.ts +5 -4
- package/src/cloudflare/do-state-store/worker.ts +4 -0
- package/src/cloudflare/email-address.ts +203 -0
- package/src/cloudflare/email-catch-all.ts +248 -0
- package/src/cloudflare/email-routing.ts +230 -0
- package/src/cloudflare/email-rule.ts +322 -0
- package/src/cloudflare/hyperdrive.ts +5 -4
- package/src/cloudflare/images.ts +59 -0
- package/src/cloudflare/index.ts +9 -0
- package/src/cloudflare/kv-namespace.ts +2 -1
- package/src/cloudflare/pipeline.ts +38 -2
- package/src/cloudflare/queue-consumer.ts +2 -1
- package/src/cloudflare/queue.ts +0 -12
- package/src/cloudflare/route.ts +118 -18
- package/src/cloudflare/secret.ts +253 -0
- package/src/cloudflare/secrets-store.ts +420 -0
- package/src/cloudflare/sveltekit.ts +72 -0
- package/src/cloudflare/user.ts +2 -1
- package/src/cloudflare/vectorize-index.ts +6 -5
- package/src/cloudflare/vectorize-metadata-index.ts +2 -1
- package/src/cloudflare/website.ts +76 -66
- package/src/cloudflare/worker-assets.ts +95 -77
- package/src/cloudflare/worker-metadata.ts +14 -1
- package/src/cloudflare/worker.ts +76 -9
- package/src/cloudflare/wrangler.json.ts +42 -0
- package/src/cloudflare/zone.ts +79 -5
- package/src/destroy.ts +35 -17
- package/src/dns/godaddy.ts +3 -2
- package/src/dns/import-dns.ts +2 -1
- package/src/esbuild/bundle.ts +2 -1
- package/src/fs/copy-file.ts +2 -1
- package/src/fs/file.ts +3 -1
- package/src/github/client.ts +11 -10
- package/src/github/repository-environment.ts +5 -4
- package/src/github/secret.ts +7 -6
- package/src/index.ts +2 -1
- package/src/neon/project.ts +3 -2
- package/src/planetscale/api.ts +115 -0
- package/src/planetscale/branch.ts +352 -0
- package/src/planetscale/database.ts +394 -0
- package/src/planetscale/index.ts +4 -0
- package/src/planetscale/utils.ts +189 -0
- package/src/resource.ts +7 -1
- package/src/runtime/plugin.ts +2 -1
- package/src/scope.ts +64 -13
- package/src/sentry/client-key.ts +5 -4
- package/src/sentry/project.ts +5 -4
- package/src/sentry/team.ts +5 -4
- package/src/stripe/card.ts +2 -1
- package/src/stripe/client.ts +3 -2
- package/src/stripe/coupon.ts +2 -1
- package/src/stripe/customer.ts +2 -1
- package/src/stripe/entitlements-feature.ts +2 -1
- package/src/stripe/file.ts +2 -1
- package/src/stripe/meter.ts +4 -2
- package/src/stripe/portal-configuration.ts +2 -1
- package/src/stripe/price.ts +2 -1
- package/src/stripe/product-feature.ts +2 -1
- package/src/stripe/product.ts +2 -1
- package/src/stripe/promotion-code.ts +2 -1
- package/src/stripe/shipping-rate.ts +2 -1
- package/src/stripe/tax-rate.ts +2 -1
- package/src/stripe/webhook.ts +3 -2
- package/src/test/bun.ts +6 -1
- package/src/test/prune.ts +7 -1
- package/src/test/vitest.ts +2 -0
- package/src/upstash/redis.ts +2 -1
- package/src/util/async-queue.ts +97 -0
- package/src/util/cli.tsx +221 -0
- package/src/util/ignore-matcher.ts +873 -0
- package/src/util/logger.ts +17 -0
- package/src/util/retry.ts +0 -1
- package/src/util/safe-fetch.ts +2 -1
- package/src/util/telemetry/client.ts +127 -0
- package/src/util/telemetry/constants.ts +13 -0
- package/src/util/telemetry/context.ts +154 -0
- package/src/util/telemetry/index.ts +2 -0
- package/src/util/telemetry/types.ts +83 -0
- package/src/util/xdg-paths.ts +48 -0
- package/src/vercel/project.ts +2 -1
- package/src/web/astro.ts +2 -1
- package/src/web/shadcn.ts +2 -1
- package/src/web/vite.ts +3 -2
- package/src/web/vitepress/dependencies.ts +2 -1
- package/src/web/vitepress/vitepress.ts +2 -1
package/lib/cloudflare/route.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { Resource } from "../resource.js";
|
|
2
|
+
import { logger } from "../util/logger.js";
|
|
2
3
|
import { CloudflareApiError, handleApiError } from "./api-error.js";
|
|
3
4
|
import { createCloudflareApi, } from "./api.js";
|
|
5
|
+
import { getZoneByDomain } from "./zone.js";
|
|
4
6
|
/**
|
|
5
7
|
* Creates and manages Cloudflare Worker Routes.
|
|
6
8
|
*
|
|
@@ -33,31 +35,61 @@ import { createCloudflareApi, } from "./api.js";
|
|
|
33
35
|
* zoneId: "your-zone-id"
|
|
34
36
|
* });
|
|
35
37
|
*
|
|
38
|
+
* @example
|
|
39
|
+
* // Create a route with automatic zone ID inference
|
|
40
|
+
* // The zone ID will be automatically determined from the domain in the pattern
|
|
41
|
+
* const autoRoute = await Route("auto-route", {
|
|
42
|
+
* pattern: "api.example.com/*", // Zone ID inferred from example.com
|
|
43
|
+
* script: "my-worker"
|
|
44
|
+
* });
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* // Works with wildcard patterns too
|
|
48
|
+
* const wildcardRoute = await Route("wildcard-route", {
|
|
49
|
+
* pattern: "*.example.com/api/*", // Zone ID inferred from example.com
|
|
50
|
+
* script: "api-worker"
|
|
51
|
+
* });
|
|
52
|
+
*
|
|
36
53
|
* @see https://developers.cloudflare.com/workers/configuration/routes/
|
|
37
54
|
*/
|
|
38
55
|
export const Route = Resource("cloudflare::Route", async function (_id, props) {
|
|
39
56
|
const api = await createCloudflareApi(props);
|
|
40
57
|
// Get script name from script prop (either a string or a Worker resource)
|
|
41
58
|
const scriptName = typeof props.script === "string" ? props.script : props.script.name;
|
|
42
|
-
// Get zone ID from props
|
|
43
|
-
const { zoneId } = props;
|
|
44
59
|
if (this.phase === "delete") {
|
|
45
|
-
|
|
46
|
-
// Only delete if we have
|
|
47
|
-
|
|
48
|
-
|
|
60
|
+
logger.log("Deleting Route:", props.pattern);
|
|
61
|
+
// Only delete if we have complete output data (both ID and zoneId)
|
|
62
|
+
// If creation failed, we won't have proper output, so just skip deletion
|
|
63
|
+
if (this.output?.id && this.output?.zoneId) {
|
|
64
|
+
await deleteRoute(api, this.output.zoneId, this.output.id);
|
|
49
65
|
}
|
|
50
66
|
// Return void (a deleted route has no content)
|
|
51
67
|
return this.destroy();
|
|
52
68
|
}
|
|
69
|
+
// Get or infer zone ID (only needed for create/update phases)
|
|
70
|
+
let zoneId = props.zoneId;
|
|
71
|
+
if (!zoneId) {
|
|
72
|
+
const inferredZoneId = await inferZoneIdFromPattern(props.pattern, {
|
|
73
|
+
accountId: props.accountId,
|
|
74
|
+
apiKey: props.apiKey,
|
|
75
|
+
apiToken: props.apiToken,
|
|
76
|
+
baseUrl: props.baseUrl,
|
|
77
|
+
email: props.email,
|
|
78
|
+
});
|
|
79
|
+
if (!inferredZoneId) {
|
|
80
|
+
throw new Error(`Could not infer zone ID for route pattern "${props.pattern}". ` +
|
|
81
|
+
"Please ensure the domain is managed by Cloudflare or specify an explicit zoneId.");
|
|
82
|
+
}
|
|
83
|
+
zoneId = inferredZoneId;
|
|
84
|
+
}
|
|
53
85
|
let routeData;
|
|
54
86
|
if (this.phase === "update" && this.output?.id) {
|
|
55
|
-
|
|
87
|
+
logger.log("Updating Route:", props.pattern);
|
|
56
88
|
// Update existing route
|
|
57
89
|
routeData = await updateRoute(api, zoneId, this.output.id, props.pattern, scriptName);
|
|
58
90
|
}
|
|
59
91
|
else {
|
|
60
|
-
|
|
92
|
+
logger.log("Creating Route:", props.pattern);
|
|
61
93
|
try {
|
|
62
94
|
// Create new route
|
|
63
95
|
routeData = await createRoute(api, zoneId, props.pattern, scriptName);
|
|
@@ -67,19 +99,14 @@ export const Route = Resource("cloudflare::Route", async function (_id, props) {
|
|
|
67
99
|
if (props.adopt &&
|
|
68
100
|
error instanceof CloudflareApiError &&
|
|
69
101
|
error.status === 409) {
|
|
70
|
-
|
|
102
|
+
logger.log(`Route with pattern '${props.pattern}' already exists, adopting it`);
|
|
71
103
|
// Find the existing route by pattern
|
|
72
104
|
const existingRoute = await findRouteByPattern(api, zoneId, props.pattern);
|
|
73
105
|
if (!existingRoute) {
|
|
74
106
|
throw new Error(`Failed to find existing route with pattern '${props.pattern}' for adoption`);
|
|
75
107
|
}
|
|
76
|
-
//
|
|
77
|
-
routeData =
|
|
78
|
-
result: existingRoute,
|
|
79
|
-
success: true,
|
|
80
|
-
errors: [],
|
|
81
|
-
messages: [],
|
|
82
|
-
};
|
|
108
|
+
// Update the existing route to point to our script
|
|
109
|
+
routeData = await updateRoute(api, zoneId, existingRoute.id, props.pattern, scriptName);
|
|
83
110
|
}
|
|
84
111
|
else {
|
|
85
112
|
// Re-throw the error if adopt is false or it's not a 409 error
|
|
@@ -169,4 +196,45 @@ async function findRouteByPattern(api, zoneId, pattern) {
|
|
|
169
196
|
const match = data.result.find((route) => route.pattern === pattern);
|
|
170
197
|
return match || null;
|
|
171
198
|
}
|
|
199
|
+
/**
|
|
200
|
+
* Extract domain from a route pattern, similar to wrangler's logic
|
|
201
|
+
* @param pattern The route pattern (e.g., "api.example.com/*", "*.example.com/api/*")
|
|
202
|
+
* @returns The domain part of the pattern
|
|
203
|
+
*/
|
|
204
|
+
function extractDomainFromPattern(pattern) {
|
|
205
|
+
// Remove protocol if present
|
|
206
|
+
let domain = pattern.replace(/^https?:\/\//, "");
|
|
207
|
+
// Remove path part (everything after the first '/')
|
|
208
|
+
domain = domain.split("/")[0];
|
|
209
|
+
// Remove port if present
|
|
210
|
+
domain = domain.split(":")[0];
|
|
211
|
+
return domain;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Infer zone ID from a route pattern using Cloudflare API
|
|
215
|
+
* This implements similar logic to wrangler's zone inference
|
|
216
|
+
* @param pattern The route pattern
|
|
217
|
+
* @param apiOptions API options for Cloudflare API calls
|
|
218
|
+
* @returns Promise resolving to zone ID or null if not found
|
|
219
|
+
*/
|
|
220
|
+
async function inferZoneIdFromPattern(pattern, apiOptions) {
|
|
221
|
+
const domain = extractDomainFromPattern(pattern);
|
|
222
|
+
// Handle wildcard domains by removing the wildcard part
|
|
223
|
+
const cleanDomain = domain.replace(/^\*\./, "");
|
|
224
|
+
// Try to find zone for the exact domain first
|
|
225
|
+
let zone = await getZoneByDomain(cleanDomain, apiOptions);
|
|
226
|
+
if (zone) {
|
|
227
|
+
return zone.id;
|
|
228
|
+
}
|
|
229
|
+
// If not found, try parent domains (similar to wrangler's logic)
|
|
230
|
+
const domainParts = cleanDomain.split(".");
|
|
231
|
+
for (let i = 1; i < domainParts.length - 1; i++) {
|
|
232
|
+
const parentDomain = domainParts.slice(i).join(".");
|
|
233
|
+
zone = await getZoneByDomain(parentDomain, apiOptions);
|
|
234
|
+
if (zone) {
|
|
235
|
+
return zone.id;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return null;
|
|
239
|
+
}
|
|
172
240
|
//# sourceMappingURL=route.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.js","sourceRoot":"","sources":["../../src/cloudflare/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EACL,mBAAmB,GAGpB,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"route.js","sourceRoot":"","sources":["../../src/cloudflare/route.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { Resource } from "../resource.ts";
|
|
2
|
+
import { type Secret as AlchemySecret } from "../secret.ts";
|
|
3
|
+
import { type CloudflareApi, type CloudflareApiOptions } from "./api.ts";
|
|
4
|
+
import type { SecretsStore } from "./secrets-store.ts";
|
|
5
|
+
/**
|
|
6
|
+
* Properties for creating or updating a Secret in a Secrets Store (internal interface)
|
|
7
|
+
*/
|
|
8
|
+
interface _SecretProps extends CloudflareApiOptions {
|
|
9
|
+
/**
|
|
10
|
+
* The secrets store to add this secret to
|
|
11
|
+
*/
|
|
12
|
+
store: SecretsStore<any>;
|
|
13
|
+
/**
|
|
14
|
+
* The secret value to store (must be an AlchemySecret for security)
|
|
15
|
+
*/
|
|
16
|
+
value: AlchemySecret;
|
|
17
|
+
/**
|
|
18
|
+
* Whether to delete the secret.
|
|
19
|
+
* If set to false, the secret will remain but the resource will be removed from state
|
|
20
|
+
*
|
|
21
|
+
* @default true
|
|
22
|
+
*/
|
|
23
|
+
delete?: boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Properties for creating or updating a Secret in a Secrets Store (public interface)
|
|
27
|
+
*/
|
|
28
|
+
export interface SecretProps extends CloudflareApiOptions {
|
|
29
|
+
/**
|
|
30
|
+
* The secrets store to add this secret to
|
|
31
|
+
*/
|
|
32
|
+
store: SecretsStore<any>;
|
|
33
|
+
/**
|
|
34
|
+
* The secret value to store
|
|
35
|
+
* Can be a string or an existing Secret instance
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```ts
|
|
39
|
+
* const secret = await Secret("api-key", {
|
|
40
|
+
* store: mySecretsStore,
|
|
41
|
+
* value: alchemy.secret(process.env.API_KEY)
|
|
42
|
+
* });
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
value: string | AlchemySecret;
|
|
46
|
+
/**
|
|
47
|
+
* Whether to delete the secret.
|
|
48
|
+
* If set to false, the secret will remain but the resource will be removed from state
|
|
49
|
+
*
|
|
50
|
+
* @default true
|
|
51
|
+
*/
|
|
52
|
+
delete?: boolean;
|
|
53
|
+
}
|
|
54
|
+
export declare function isSecret(resource: Resource): resource is Secret;
|
|
55
|
+
export interface Secret extends Resource<"cloudflare::Secret">, Omit<_SecretProps, "delete"> {
|
|
56
|
+
/**
|
|
57
|
+
* The name of the secret
|
|
58
|
+
*/
|
|
59
|
+
name: string;
|
|
60
|
+
/**
|
|
61
|
+
* The unique identifier of the secrets store this secret belongs to
|
|
62
|
+
*/
|
|
63
|
+
storeId: string;
|
|
64
|
+
/**
|
|
65
|
+
* The secret value (as an alchemy Secret instance)
|
|
66
|
+
*/
|
|
67
|
+
value: AlchemySecret;
|
|
68
|
+
/**
|
|
69
|
+
* Timestamp when the secret was created
|
|
70
|
+
*/
|
|
71
|
+
createdAt: number;
|
|
72
|
+
/**
|
|
73
|
+
* Timestamp when the secret was last modified
|
|
74
|
+
*/
|
|
75
|
+
modifiedAt: number;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* A Cloudflare Secret represents an individual secret stored in a Secrets Store.
|
|
79
|
+
*
|
|
80
|
+
* Use this resource to add individual secrets to an existing Secrets Store,
|
|
81
|
+
* providing fine-grained control over secret management.
|
|
82
|
+
*
|
|
83
|
+
* @see https://developers.cloudflare.com/api/resources/secrets_store/subresources/stores/subresources/secrets/
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* // Create a secrets store first
|
|
87
|
+
* const store = await SecretsStore("my-store", {
|
|
88
|
+
* name: "production-secrets"
|
|
89
|
+
* });
|
|
90
|
+
*
|
|
91
|
+
* // Add individual secrets to the store
|
|
92
|
+
* const apiKey = await Secret("api-key", {
|
|
93
|
+
* store: store,
|
|
94
|
+
* value: alchemy.secret(process.env.API_KEY)
|
|
95
|
+
* });
|
|
96
|
+
*
|
|
97
|
+
* const dbUrl = await Secret("database-url", {
|
|
98
|
+
* store: store,
|
|
99
|
+
* value: process.env.DATABASE_URL
|
|
100
|
+
* });
|
|
101
|
+
*
|
|
102
|
+
* @example
|
|
103
|
+
* // Use in a Worker binding
|
|
104
|
+
* const worker = await Worker("my-worker", {
|
|
105
|
+
* bindings: {
|
|
106
|
+
* SECRETS: store
|
|
107
|
+
* },
|
|
108
|
+
* code: `
|
|
109
|
+
* export default {
|
|
110
|
+
* async fetch(request, env) {
|
|
111
|
+
* const apiKey = await env.SECRETS.get("api-key");
|
|
112
|
+
* const dbUrl = await env.SECRETS.get("database-url");
|
|
113
|
+
* return new Response(\`API: \${apiKey ? "set" : "unset"}\`);
|
|
114
|
+
* }
|
|
115
|
+
* }
|
|
116
|
+
* `
|
|
117
|
+
* });
|
|
118
|
+
*
|
|
119
|
+
* @example
|
|
120
|
+
* // When removing from Alchemy state, keep the secret in Cloudflare
|
|
121
|
+
* const preservedSecret = await Secret("preserve-secret", {
|
|
122
|
+
* store: myStore,
|
|
123
|
+
* value: "preserved-value",
|
|
124
|
+
* delete: false
|
|
125
|
+
* });
|
|
126
|
+
*/
|
|
127
|
+
export declare function Secret(name: string, props: SecretProps): Promise<Secret>;
|
|
128
|
+
/**
|
|
129
|
+
* Insert or update a secret in a secrets store
|
|
130
|
+
*/
|
|
131
|
+
export declare function insertSecret(api: CloudflareApi, storeId: string, secretName: string, secretValue: AlchemySecret): Promise<void>;
|
|
132
|
+
/**
|
|
133
|
+
* Delete a secret from a secrets store
|
|
134
|
+
*/
|
|
135
|
+
export declare function deleteSecret(api: CloudflareApi, storeId: string, secretName: string): Promise<void>;
|
|
136
|
+
export {};
|
|
137
|
+
//# sourceMappingURL=secret.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret.d.ts","sourceRoot":"","sources":["../../src/cloudflare/secret.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAgB,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAEL,KAAK,MAAM,IAAI,aAAa,EAC7B,MAAM,cAAc,CAAC;AAEtB,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,oBAAoB,EAC1B,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;GAEG;AACH,UAAU,YAAa,SAAQ,oBAAoB;IACjD;;OAEG;IACH,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC;IAEzB;;OAEG;IACH,KAAK,EAAE,aAAa,CAAC;IAErB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,WAAY,SAAQ,oBAAoB;IACvD;;OAEG;IACH,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC;IAEzB;;;;;;;;;;;OAWG;IACH,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC;IAE9B;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,IAAI,MAAM,CAE/D;AAED,MAAM,WAAW,MACf,SAAQ,QAAQ,CAAC,oBAAoB,CAAC,EACpC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC;IAC9B;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,KAAK,EAAE,aAAa,CAAC;IAErB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AACH,wBAAsB,MAAM,CAC1B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,WAAW,GACjB,OAAO,CAAC,MAAM,CAAC,CAUjB;AAqCD;;GAEG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,aAAa,EAClB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,aAAa,GACzB,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,aAAa,EAClB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAcf"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { Resource, ResourceKind } from "../resource.js";
|
|
2
|
+
import { secret as alchemySecret, } from "../secret.js";
|
|
3
|
+
import { handleApiError } from "./api-error.js";
|
|
4
|
+
import { createCloudflareApi, } from "./api.js";
|
|
5
|
+
export function isSecret(resource) {
|
|
6
|
+
return resource[ResourceKind] === "cloudflare::Secret";
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* A Cloudflare Secret represents an individual secret stored in a Secrets Store.
|
|
10
|
+
*
|
|
11
|
+
* Use this resource to add individual secrets to an existing Secrets Store,
|
|
12
|
+
* providing fine-grained control over secret management.
|
|
13
|
+
*
|
|
14
|
+
* @see https://developers.cloudflare.com/api/resources/secrets_store/subresources/stores/subresources/secrets/
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* // Create a secrets store first
|
|
18
|
+
* const store = await SecretsStore("my-store", {
|
|
19
|
+
* name: "production-secrets"
|
|
20
|
+
* });
|
|
21
|
+
*
|
|
22
|
+
* // Add individual secrets to the store
|
|
23
|
+
* const apiKey = await Secret("api-key", {
|
|
24
|
+
* store: store,
|
|
25
|
+
* value: alchemy.secret(process.env.API_KEY)
|
|
26
|
+
* });
|
|
27
|
+
*
|
|
28
|
+
* const dbUrl = await Secret("database-url", {
|
|
29
|
+
* store: store,
|
|
30
|
+
* value: process.env.DATABASE_URL
|
|
31
|
+
* });
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* // Use in a Worker binding
|
|
35
|
+
* const worker = await Worker("my-worker", {
|
|
36
|
+
* bindings: {
|
|
37
|
+
* SECRETS: store
|
|
38
|
+
* },
|
|
39
|
+
* code: `
|
|
40
|
+
* export default {
|
|
41
|
+
* async fetch(request, env) {
|
|
42
|
+
* const apiKey = await env.SECRETS.get("api-key");
|
|
43
|
+
* const dbUrl = await env.SECRETS.get("database-url");
|
|
44
|
+
* return new Response(\`API: \${apiKey ? "set" : "unset"}\`);
|
|
45
|
+
* }
|
|
46
|
+
* }
|
|
47
|
+
* `
|
|
48
|
+
* });
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* // When removing from Alchemy state, keep the secret in Cloudflare
|
|
52
|
+
* const preservedSecret = await Secret("preserve-secret", {
|
|
53
|
+
* store: myStore,
|
|
54
|
+
* value: "preserved-value",
|
|
55
|
+
* delete: false
|
|
56
|
+
* });
|
|
57
|
+
*/
|
|
58
|
+
export async function Secret(name, props) {
|
|
59
|
+
// Convert string value to AlchemySecret if needed to prevent plain text serialization
|
|
60
|
+
const secretValue = typeof props.value === "string" ? alchemySecret(props.value) : props.value;
|
|
61
|
+
// Call the internal resource with secure props
|
|
62
|
+
return _Secret(name, {
|
|
63
|
+
...props,
|
|
64
|
+
value: secretValue,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
const _Secret = Resource("cloudflare::Secret", async function (name, props) {
|
|
68
|
+
const api = await createCloudflareApi(props);
|
|
69
|
+
if (this.phase === "delete") {
|
|
70
|
+
if (props.delete !== false) {
|
|
71
|
+
await deleteSecret(api, props.store.id, name);
|
|
72
|
+
}
|
|
73
|
+
return this.destroy();
|
|
74
|
+
}
|
|
75
|
+
const createdAt = this.phase === "update"
|
|
76
|
+
? this.output?.createdAt || Date.now()
|
|
77
|
+
: Date.now();
|
|
78
|
+
// Insert or update the secret
|
|
79
|
+
await insertSecret(api, props.store.id, name, props.value);
|
|
80
|
+
return this({
|
|
81
|
+
name,
|
|
82
|
+
storeId: props.store.id,
|
|
83
|
+
store: props.store,
|
|
84
|
+
value: props.value,
|
|
85
|
+
createdAt,
|
|
86
|
+
modifiedAt: Date.now(),
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
/**
|
|
90
|
+
* Insert or update a secret in a secrets store
|
|
91
|
+
*/
|
|
92
|
+
export async function insertSecret(api, storeId, secretName, secretValue) {
|
|
93
|
+
const response = await api.post(`/accounts/${api.accountId}/secrets_store/stores/${storeId}/secrets`, [
|
|
94
|
+
{
|
|
95
|
+
name: secretName,
|
|
96
|
+
value: secretValue.unencrypted,
|
|
97
|
+
scopes: [],
|
|
98
|
+
},
|
|
99
|
+
]);
|
|
100
|
+
if (!response.ok) {
|
|
101
|
+
const errorData = await response.json().catch(() => ({
|
|
102
|
+
errors: [{ message: response.statusText }],
|
|
103
|
+
}));
|
|
104
|
+
const errorMessage = errorData.errors?.[0]?.message || response.statusText;
|
|
105
|
+
throw new Error(`Error creating secret '${secretName}': ${errorMessage}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Delete a secret from a secrets store
|
|
110
|
+
*/
|
|
111
|
+
export async function deleteSecret(api, storeId, secretName) {
|
|
112
|
+
const response = await api.delete(`/accounts/${api.accountId}/secrets_store/stores/${storeId}/secrets`, {
|
|
113
|
+
body: JSON.stringify([secretName]),
|
|
114
|
+
headers: {
|
|
115
|
+
"Content-Type": "application/json",
|
|
116
|
+
},
|
|
117
|
+
});
|
|
118
|
+
if (!response.ok && response.status !== 404) {
|
|
119
|
+
await handleApiError(response, "delete", "secret", secretName);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=secret.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret.js","sourceRoot":"","sources":["../../src/cloudflare/secret.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { Resource } from "../resource.ts";
|
|
2
|
+
import { type Secret } from "../secret.ts";
|
|
3
|
+
import { type CloudflareApi, type CloudflareApiOptions } from "./api.ts";
|
|
4
|
+
import type { Bound } from "./bound.ts";
|
|
5
|
+
/**
|
|
6
|
+
* Properties for creating or updating a Secrets Store
|
|
7
|
+
*/
|
|
8
|
+
export interface SecretsStoreProps<S extends Record<string, Secret> | undefined = undefined> extends CloudflareApiOptions {
|
|
9
|
+
/**
|
|
10
|
+
* Name of the secrets store
|
|
11
|
+
*
|
|
12
|
+
* @default id
|
|
13
|
+
*/
|
|
14
|
+
name?: string;
|
|
15
|
+
/**
|
|
16
|
+
* Secrets to store in the secrets store
|
|
17
|
+
* Maps secret names to secret values (string) or Secret instances
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```ts
|
|
21
|
+
* const store = await SecretsStore("my-store", {
|
|
22
|
+
* secrets: {
|
|
23
|
+
* API_KEY: "my-api-key-value",
|
|
24
|
+
* DATABASE_URL: alchemy.secret(process.env.DATABASE_URL)
|
|
25
|
+
* }
|
|
26
|
+
* });
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
secrets?: {
|
|
30
|
+
[K in keyof S]: string | Secret;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Whether to adopt an existing store with the same name if it exists
|
|
34
|
+
* If true and a store with the same name exists, it will be adopted rather than creating a new one
|
|
35
|
+
*
|
|
36
|
+
* @default false
|
|
37
|
+
*/
|
|
38
|
+
adopt?: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Whether to delete the store.
|
|
41
|
+
* If set to false, the store will remain but the resource will be removed from state
|
|
42
|
+
*
|
|
43
|
+
* @default true
|
|
44
|
+
*/
|
|
45
|
+
delete?: boolean;
|
|
46
|
+
}
|
|
47
|
+
export declare function isSecretsStore(resource: Resource): resource is SecretsStore<any>;
|
|
48
|
+
export interface SecretsStore<S extends Record<string, Secret> | undefined = undefined> extends Resource<"cloudflare::SecretsStore">, Omit<SecretsStoreProps<S>, "delete"> {
|
|
49
|
+
/**
|
|
50
|
+
* The binding type for Cloudflare Workers
|
|
51
|
+
*/
|
|
52
|
+
type: "secrets_store";
|
|
53
|
+
/**
|
|
54
|
+
* The unique identifier of the secrets store
|
|
55
|
+
*/
|
|
56
|
+
id: string;
|
|
57
|
+
/**
|
|
58
|
+
* The name of the secrets store
|
|
59
|
+
*/
|
|
60
|
+
name: string;
|
|
61
|
+
/**
|
|
62
|
+
* The secrets stored in this secrets store
|
|
63
|
+
* Maps secret names to Secret instances created with alchemy.secret()
|
|
64
|
+
*/
|
|
65
|
+
secrets?: S;
|
|
66
|
+
/**
|
|
67
|
+
* Timestamp when the secrets store was created
|
|
68
|
+
*/
|
|
69
|
+
createdAt: number;
|
|
70
|
+
/**
|
|
71
|
+
* Timestamp when the secrets store was last modified
|
|
72
|
+
*/
|
|
73
|
+
modifiedAt: number;
|
|
74
|
+
}
|
|
75
|
+
export type SecretsStoreWithBinding<S extends Record<string, Secret> | undefined = undefined> = SecretsStore<S> & Bound<SecretsStore<S>>;
|
|
76
|
+
/**
|
|
77
|
+
* A Cloudflare Secrets Store is a secure, centralized location for storing account-level secrets.
|
|
78
|
+
*
|
|
79
|
+
* @see https://developers.cloudflare.com/secrets-store/
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* // Create a basic secrets store
|
|
83
|
+
* const store = await SecretsStore("my-secrets", {
|
|
84
|
+
* name: "production-secrets"
|
|
85
|
+
* });
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* // Create a secrets store with initial secrets
|
|
89
|
+
* const store = await SecretsStore("my-secrets", {
|
|
90
|
+
* name: "production-secrets",
|
|
91
|
+
* secrets: {
|
|
92
|
+
* API_KEY: alchemy.secret(process.env.API_KEY),
|
|
93
|
+
* DATABASE_URL: alchemy.secret(process.env.DATABASE_URL),
|
|
94
|
+
* JWT_SECRET: alchemy.secret(process.env.JWT_SECRET)
|
|
95
|
+
* }
|
|
96
|
+
* });
|
|
97
|
+
*
|
|
98
|
+
* @example
|
|
99
|
+
* // Adopt an existing store if it already exists
|
|
100
|
+
* const existingStore = await SecretsStore("existing-store", {
|
|
101
|
+
* name: "existing-secrets-store",
|
|
102
|
+
* adopt: true,
|
|
103
|
+
* secrets: {
|
|
104
|
+
* NEW_SECRET: alchemy.secret("new-value")
|
|
105
|
+
* }
|
|
106
|
+
* });
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* // When removing from Alchemy state, keep the store in Cloudflare
|
|
110
|
+
* const preservedStore = await SecretsStore("preserve-store", {
|
|
111
|
+
* name: "preserved-secrets-store",
|
|
112
|
+
* delete: false
|
|
113
|
+
* });
|
|
114
|
+
*
|
|
115
|
+
* @example
|
|
116
|
+
* // Use in a Worker binding to access secrets
|
|
117
|
+
* const worker = await Worker("my-worker", {
|
|
118
|
+
* bindings: {
|
|
119
|
+
* SECRETS: store
|
|
120
|
+
* },
|
|
121
|
+
* code: `
|
|
122
|
+
* export default {
|
|
123
|
+
* async fetch(request, env) {
|
|
124
|
+
* const apiKey = await env.SECRETS.get("API_KEY");
|
|
125
|
+
* return new Response(apiKey ? "Secret found" : "No secret");
|
|
126
|
+
* }
|
|
127
|
+
* }
|
|
128
|
+
* `
|
|
129
|
+
* });
|
|
130
|
+
*/
|
|
131
|
+
export declare function SecretsStore<const S extends Record<string, Secret> | undefined = undefined>(name: string, props?: SecretsStoreProps<S>): Promise<SecretsStoreWithBinding<S>>;
|
|
132
|
+
export declare function createSecretsStore<S extends Record<string, Secret> | undefined = undefined>(api: CloudflareApi, props: SecretsStoreProps<S> & {
|
|
133
|
+
name: string;
|
|
134
|
+
}): Promise<{
|
|
135
|
+
id: string;
|
|
136
|
+
}>;
|
|
137
|
+
export declare function deleteSecretsStore(api: CloudflareApi, storeId: string): Promise<void>;
|
|
138
|
+
export declare function findSecretsStoreByName(api: CloudflareApi, name: string): Promise<{
|
|
139
|
+
id: string;
|
|
140
|
+
createdAt?: number;
|
|
141
|
+
} | null>;
|
|
142
|
+
export declare function insertSecrets<S extends Record<string, Secret> | undefined = undefined>(api: CloudflareApi, storeId: string, props: SecretsStoreProps<S>): Promise<void>;
|
|
143
|
+
export declare function deleteSecrets(api: CloudflareApi, storeId: string, secretNames: string[]): Promise<void>;
|
|
144
|
+
export declare function listSecrets(api: CloudflareApi, storeId: string): Promise<string[]>;
|
|
145
|
+
//# sourceMappingURL=secrets-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets-store.d.ts","sourceRoot":"","sources":["../../src/cloudflare/secrets-store.ts"],"names":[],"mappings":"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"}
|