alchemy 0.62.2 → 0.63.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/alchemy.js +1518 -1204
- package/bin/commands/deploy.ts +2 -0
- package/bin/commands/dev.ts +2 -0
- package/bin/services/execute-alchemy.ts +11 -0
- package/bin/services/template-manager.ts +2 -0
- package/bin/types.ts +2 -1
- package/lib/alchemy.d.ts +6 -22
- package/lib/alchemy.d.ts.map +1 -1
- package/lib/alchemy.js +65 -169
- package/lib/alchemy.js.map +1 -1
- package/lib/apply.d.ts +0 -2
- package/lib/apply.d.ts.map +1 -1
- package/lib/apply.js +2 -16
- package/lib/apply.js.map +1 -1
- package/lib/aws/account-id.d.ts.map +1 -1
- package/lib/aws/account-id.js +3 -2
- package/lib/aws/account-id.js.map +1 -1
- package/lib/aws/bucket.d.ts +8 -2
- package/lib/aws/bucket.d.ts.map +1 -1
- package/lib/aws/bucket.js +21 -14
- package/lib/aws/bucket.js.map +1 -1
- package/lib/aws/ec2/security-group.d.ts +8 -2
- package/lib/aws/ec2/security-group.d.ts.map +1 -1
- package/lib/aws/ec2/security-group.js +7 -2
- package/lib/aws/ec2/security-group.js.map +1 -1
- package/lib/aws/function.d.ts +9 -3
- package/lib/aws/function.d.ts.map +1 -1
- package/lib/aws/function.js +35 -26
- package/lib/aws/function.js.map +1 -1
- package/lib/aws/policy-attachment.d.ts.map +1 -1
- package/lib/aws/policy-attachment.js +2 -1
- package/lib/aws/policy-attachment.js.map +1 -1
- package/lib/aws/policy.d.ts +8 -2
- package/lib/aws/policy.d.ts.map +1 -1
- package/lib/aws/policy.js +13 -4
- package/lib/aws/policy.js.map +1 -1
- package/lib/aws/queue.d.ts +8 -2
- package/lib/aws/queue.d.ts.map +1 -1
- package/lib/aws/queue.js +22 -14
- package/lib/aws/queue.js.map +1 -1
- package/lib/aws/role.d.ts +8 -2
- package/lib/aws/role.d.ts.map +1 -1
- package/lib/aws/role.js +10 -3
- package/lib/aws/role.js.map +1 -1
- package/lib/aws/ses.d.ts +1 -1
- package/lib/aws/ses.d.ts.map +1 -1
- package/lib/aws/ses.js +2 -1
- package/lib/aws/ses.js.map +1 -1
- package/lib/aws/ssm-parameter.d.ts +8 -2
- package/lib/aws/ssm-parameter.d.ts.map +1 -1
- package/lib/aws/ssm-parameter.js +15 -10
- package/lib/aws/ssm-parameter.js.map +1 -1
- package/lib/aws/table.d.ts +8 -2
- package/lib/aws/table.d.ts.map +1 -1
- package/lib/aws/table.js +17 -9
- package/lib/aws/table.js.map +1 -1
- package/lib/cloudflare/account-api-token.d.ts +2 -2
- package/lib/cloudflare/account-api-token.d.ts.map +1 -1
- package/lib/cloudflare/account-api-token.js +7 -6
- package/lib/cloudflare/account-api-token.js.map +1 -1
- package/lib/cloudflare/ai-gateway.d.ts +9 -4
- package/lib/cloudflare/ai-gateway.d.ts.map +1 -1
- package/lib/cloudflare/ai-gateway.js +20 -24
- package/lib/cloudflare/ai-gateway.js.map +1 -1
- package/lib/cloudflare/api-schema.d.ts +2 -2
- package/lib/cloudflare/api-schema.d.ts.map +1 -1
- package/lib/cloudflare/api-schema.js +6 -2
- package/lib/cloudflare/api-schema.js.map +1 -1
- package/lib/cloudflare/api-shield.d.ts +5 -1
- package/lib/cloudflare/api-shield.d.ts.map +1 -1
- package/lib/cloudflare/api-shield.js +6 -1
- package/lib/cloudflare/api-shield.js.map +1 -1
- package/lib/cloudflare/assets.d.ts +1 -1
- package/lib/cloudflare/assets.d.ts.map +1 -1
- package/lib/cloudflare/astro/astro.d.ts.map +1 -1
- package/lib/cloudflare/astro/astro.js +3 -1
- package/lib/cloudflare/astro/astro.js.map +1 -1
- package/lib/cloudflare/astro/plugin.d.ts +2 -1
- package/lib/cloudflare/astro/plugin.d.ts.map +1 -1
- package/lib/cloudflare/astro/plugin.js.map +1 -1
- package/lib/cloudflare/bindings.d.ts +2 -2
- package/lib/cloudflare/bindings.d.ts.map +1 -1
- package/lib/cloudflare/bound.d.ts +1 -1
- package/lib/cloudflare/bound.d.ts.map +1 -1
- package/lib/cloudflare/bucket.d.ts +120 -1
- package/lib/cloudflare/bucket.d.ts.map +1 -1
- package/lib/cloudflare/bucket.js +80 -2
- package/lib/cloudflare/bucket.js.map +1 -1
- package/lib/cloudflare/compatibility-date.gen.d.ts +1 -1
- package/lib/cloudflare/compatibility-date.gen.js +1 -1
- package/lib/cloudflare/container.d.ts +10 -4
- package/lib/cloudflare/container.d.ts.map +1 -1
- package/lib/cloudflare/container.js +12 -9
- package/lib/cloudflare/container.js.map +1 -1
- package/lib/cloudflare/custom-domain.js +2 -1
- package/lib/cloudflare/custom-domain.js.map +1 -1
- package/lib/cloudflare/d1-database.d.ts +1 -1
- package/lib/cloudflare/d1-database.d.ts.map +1 -1
- package/lib/cloudflare/d1-database.js +7 -3
- package/lib/cloudflare/d1-database.js.map +1 -1
- package/lib/cloudflare/dispatch-namespace.d.ts +2 -0
- package/lib/cloudflare/dispatch-namespace.d.ts.map +1 -1
- package/lib/cloudflare/dispatch-namespace.js +7 -5
- package/lib/cloudflare/dispatch-namespace.js.map +1 -1
- package/lib/cloudflare/hyperdrive.d.ts +7 -1
- package/lib/cloudflare/hyperdrive.d.ts.map +1 -1
- package/lib/cloudflare/hyperdrive.js +2 -1
- package/lib/cloudflare/hyperdrive.js.map +1 -1
- package/lib/cloudflare/kv-namespace.d.ts +3 -0
- package/lib/cloudflare/kv-namespace.d.ts.map +1 -1
- package/lib/cloudflare/kv-namespace.js +11 -2
- package/lib/cloudflare/kv-namespace.js.map +1 -1
- package/lib/cloudflare/miniflare/miniflare-worker-proxy.js +3 -1
- package/lib/cloudflare/miniflare/miniflare-worker-proxy.js.map +1 -1
- package/lib/cloudflare/miniflare/paths.d.ts +4 -0
- package/lib/cloudflare/miniflare/paths.d.ts.map +1 -1
- package/lib/cloudflare/miniflare/paths.js +11 -0
- package/lib/cloudflare/miniflare/paths.js.map +1 -1
- package/lib/cloudflare/pipeline.d.ts +14 -3
- package/lib/cloudflare/pipeline.d.ts.map +1 -1
- package/lib/cloudflare/pipeline.js +31 -2
- package/lib/cloudflare/pipeline.js.map +1 -1
- package/lib/cloudflare/queue-consumer.js +1 -1
- package/lib/cloudflare/queue-consumer.js.map +1 -1
- package/lib/cloudflare/queue.d.ts +6 -4
- package/lib/cloudflare/queue.d.ts.map +1 -1
- package/lib/cloudflare/queue.js +13 -9
- package/lib/cloudflare/queue.js.map +1 -1
- package/lib/cloudflare/react-router/plugin.d.ts +1 -1
- package/lib/cloudflare/react-router/plugin.d.ts.map +1 -1
- package/lib/cloudflare/react-router/react-router.d.ts.map +1 -1
- package/lib/cloudflare/react-router/react-router.js +32 -2
- package/lib/cloudflare/react-router/react-router.js.map +1 -1
- package/lib/cloudflare/redwood/plugin.d.ts +2 -1
- package/lib/cloudflare/redwood/plugin.d.ts.map +1 -1
- package/lib/cloudflare/redwood/plugin.js.map +1 -1
- package/lib/cloudflare/route.js +1 -1
- package/lib/cloudflare/route.js.map +1 -1
- package/lib/cloudflare/ruleset.d.ts +3 -1
- package/lib/cloudflare/ruleset.d.ts.map +1 -1
- package/lib/cloudflare/ruleset.js +3 -2
- package/lib/cloudflare/ruleset.js.map +1 -1
- package/lib/cloudflare/secret.d.ts +6 -23
- package/lib/cloudflare/secret.d.ts.map +1 -1
- package/lib/cloudflare/secret.js +8 -4
- package/lib/cloudflare/secret.js.map +1 -1
- package/lib/cloudflare/secrets-store.d.ts +1 -1
- package/lib/cloudflare/secrets-store.d.ts.map +1 -1
- package/lib/cloudflare/secrets-store.js +5 -2
- package/lib/cloudflare/secrets-store.js.map +1 -1
- package/lib/cloudflare/tunnel.d.ts +5 -1
- package/lib/cloudflare/tunnel.d.ts.map +1 -1
- package/lib/cloudflare/tunnel.js +5 -1
- package/lib/cloudflare/tunnel.js.map +1 -1
- package/lib/cloudflare/vectorize-index.d.ts +7 -1
- package/lib/cloudflare/vectorize-index.d.ts.map +1 -1
- package/lib/cloudflare/vectorize-index.js +5 -2
- package/lib/cloudflare/vectorize-index.js.map +1 -1
- package/lib/cloudflare/vite/plugin.d.ts +2 -1
- package/lib/cloudflare/vite/plugin.d.ts.map +1 -1
- package/lib/cloudflare/vite/plugin.js.map +1 -1
- package/lib/cloudflare/vite/vite.d.ts +1 -1
- package/lib/cloudflare/vite/vite.d.ts.map +1 -1
- package/lib/cloudflare/vite/vite.js +1 -1
- package/lib/cloudflare/vite/vite.js.map +1 -1
- package/lib/cloudflare/website.js +1 -1
- package/lib/cloudflare/website.js.map +1 -1
- package/lib/cloudflare/worker.d.ts +1 -1
- package/lib/cloudflare/worker.d.ts.map +1 -1
- package/lib/cloudflare/worker.js +12 -7
- package/lib/cloudflare/worker.js.map +1 -1
- package/lib/cloudflare/wrangler.json.d.ts +1 -1
- package/lib/cloudflare/wrangler.json.d.ts.map +1 -1
- package/lib/cloudflare/wrangler.json.js +5 -3
- package/lib/cloudflare/wrangler.json.js.map +1 -1
- package/lib/docker/container.d.ts +6 -0
- package/lib/docker/container.d.ts.map +1 -1
- package/lib/docker/container.js +5 -1
- package/lib/docker/container.js.map +1 -1
- package/lib/docker/network.d.ts +8 -2
- package/lib/docker/network.d.ts.map +1 -1
- package/lib/docker/network.js +7 -2
- package/lib/docker/network.js.map +1 -1
- package/lib/docker/volume.d.ts +8 -2
- package/lib/docker/volume.d.ts.map +1 -1
- package/lib/docker/volume.js +6 -4
- package/lib/docker/volume.js.map +1 -1
- package/lib/esbuild/bundle.d.ts +1 -1
- package/lib/fs/index.d.ts +0 -8
- package/lib/fs/index.d.ts.map +1 -1
- package/lib/fs/index.js +0 -8
- package/lib/fs/index.js.map +1 -1
- package/lib/github/client.d.ts +1 -1
- package/lib/github/client.d.ts.map +1 -1
- package/lib/github/client.js +2 -1
- package/lib/github/client.js.map +1 -1
- package/lib/github/repository-environment.d.ts +8 -2
- package/lib/github/repository-environment.d.ts.map +1 -1
- package/lib/github/repository-environment.js +16 -12
- package/lib/github/repository-environment.js.map +1 -1
- package/lib/neon/project.d.ts +7 -1
- package/lib/neon/project.d.ts.map +1 -1
- package/lib/neon/project.js +10 -6
- package/lib/neon/project.js.map +1 -1
- package/lib/planetscale/branch.d.ts +4 -2
- package/lib/planetscale/branch.d.ts.map +1 -1
- package/lib/planetscale/branch.js +18 -12
- package/lib/planetscale/branch.js.map +1 -1
- package/lib/planetscale/database.d.ts +8 -2
- package/lib/planetscale/database.d.ts.map +1 -1
- package/lib/planetscale/database.js +24 -16
- package/lib/planetscale/database.js.map +1 -1
- package/lib/planetscale/password.d.ts +8 -2
- package/lib/planetscale/password.d.ts.map +1 -1
- package/lib/planetscale/password.js +2 -2
- package/lib/planetscale/password.js.map +1 -1
- package/lib/resource.d.ts +0 -2
- package/lib/resource.d.ts.map +1 -1
- package/lib/resource.js +1 -9
- package/lib/resource.js.map +1 -1
- package/lib/scope.d.ts +9 -3
- package/lib/scope.d.ts.map +1 -1
- package/lib/scope.js +21 -34
- package/lib/scope.js.map +1 -1
- package/lib/sentry/client-key.d.ts +7 -1
- package/lib/sentry/client-key.d.ts.map +1 -1
- package/lib/sentry/client-key.js +45 -6
- package/lib/sentry/client-key.js.map +1 -1
- package/lib/sentry/project.d.ts +8 -2
- package/lib/sentry/project.d.ts.map +1 -1
- package/lib/sentry/project.js +35 -5
- package/lib/sentry/project.js.map +1 -1
- package/lib/sentry/team.d.ts +8 -2
- package/lib/sentry/team.d.ts.map +1 -1
- package/lib/sentry/team.js +36 -6
- package/lib/sentry/team.js.map +1 -1
- package/lib/serde.d.ts +0 -5
- package/lib/serde.d.ts.map +1 -1
- package/lib/serde.js +0 -28
- package/lib/serde.js.map +1 -1
- package/lib/state/d1-state-store.d.ts +1 -1
- package/lib/state/d1-state-store.d.ts.map +1 -1
- package/lib/state/d1-state-store.js +5 -5
- package/lib/state/d1-state-store.js.map +1 -1
- package/lib/state/sqlite-state-store.d.ts.map +1 -1
- package/lib/state/sqlite-state-store.js +7 -11
- package/lib/state/sqlite-state-store.js.map +1 -1
- package/lib/stripe/card.d.ts.map +1 -1
- package/lib/stripe/card.js +3 -2
- package/lib/stripe/card.js.map +1 -1
- package/lib/stripe/client.d.ts +2 -2
- package/lib/stripe/client.d.ts.map +1 -1
- package/lib/stripe/client.js +4 -3
- package/lib/stripe/client.js.map +1 -1
- package/lib/stripe/coupon.d.ts.map +1 -1
- package/lib/stripe/coupon.js +4 -3
- package/lib/stripe/coupon.js.map +1 -1
- package/lib/stripe/customer.js +2 -2
- package/lib/stripe/customer.js.map +1 -1
- package/lib/stripe/entitlements-feature.d.ts.map +1 -1
- package/lib/stripe/entitlements-feature.js +3 -2
- package/lib/stripe/entitlements-feature.js.map +1 -1
- package/lib/stripe/file.d.ts.map +1 -1
- package/lib/stripe/file.js +3 -2
- package/lib/stripe/file.js.map +1 -1
- package/lib/stripe/meter.js +2 -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 +3 -2
- package/lib/stripe/portal-configuration.js.map +1 -1
- package/lib/stripe/price.d.ts.map +1 -1
- package/lib/stripe/price.js +3 -2
- package/lib/stripe/price.js.map +1 -1
- package/lib/stripe/product-feature.d.ts.map +1 -1
- package/lib/stripe/product-feature.js +3 -2
- package/lib/stripe/product-feature.js.map +1 -1
- package/lib/stripe/product.d.ts.map +1 -1
- package/lib/stripe/product.js +3 -2
- package/lib/stripe/product.js.map +1 -1
- package/lib/stripe/promotion-code.d.ts.map +1 -1
- package/lib/stripe/promotion-code.js +3 -2
- 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 +4 -3
- 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 +3 -2
- package/lib/stripe/tax-rate.js.map +1 -1
- package/lib/stripe/webhook.d.ts.map +1 -1
- package/lib/stripe/webhook.js +4 -3
- package/lib/stripe/webhook.js.map +1 -1
- package/lib/test/vitest.d.ts.map +1 -1
- package/lib/test/vitest.js +1 -0
- package/lib/test/vitest.js.map +1 -1
- package/lib/upstash/redis.d.ts +8 -2
- package/lib/upstash/redis.d.ts.map +1 -1
- package/lib/upstash/redis.js +5 -4
- package/lib/upstash/redis.js.map +1 -1
- package/lib/util/ignore-matcher.d.ts.map +1 -1
- package/lib/util/ignore-matcher.js +3 -1
- package/lib/util/ignore-matcher.js.map +1 -1
- package/lib/util/peer.d.ts +10 -0
- package/lib/util/peer.d.ts.map +1 -0
- package/lib/util/peer.js +42 -0
- package/lib/util/peer.js.map +1 -0
- package/lib/util/telemetry/constants.d.ts.map +1 -1
- package/lib/util/telemetry/constants.js +2 -2
- package/lib/util/telemetry/constants.js.map +1 -1
- package/lib/vercel/project.d.ts +7 -1
- package/lib/vercel/project.d.ts.map +1 -1
- package/lib/vercel/project.js +28 -0
- package/lib/vercel/project.js.map +1 -1
- package/package.json +88 -74
- package/src/alchemy.ts +76 -222
- package/src/apply.ts +6 -19
- package/src/aws/account-id.ts +6 -3
- package/src/aws/bucket.ts +43 -32
- package/src/aws/ec2/security-group.ts +15 -3
- package/src/aws/function.ts +65 -39
- package/src/aws/policy-attachment.ts +10 -6
- package/src/aws/policy.ts +33 -15
- package/src/aws/queue.ts +50 -29
- package/src/aws/role.ts +37 -20
- package/src/aws/ses.ts +24 -20
- package/src/aws/ssm-parameter.ts +40 -20
- package/src/aws/table.ts +35 -17
- package/src/cloudflare/account-api-token.ts +9 -7
- package/src/cloudflare/ai-gateway.ts +37 -34
- package/src/cloudflare/api-schema.ts +33 -26
- package/src/cloudflare/api-shield.ts +15 -2
- package/src/cloudflare/astro/astro.ts +5 -1
- package/src/cloudflare/astro/plugin.ts +2 -1
- package/src/cloudflare/bindings.ts +2 -2
- package/src/cloudflare/bound.ts +1 -1
- package/src/cloudflare/bucket.ts +242 -3
- package/src/cloudflare/compatibility-date.gen.ts +1 -1
- package/src/cloudflare/container.ts +23 -12
- package/src/cloudflare/custom-domain.ts +2 -2
- package/src/cloudflare/d1-database.ts +11 -4
- package/src/cloudflare/dispatch-namespace.ts +10 -7
- package/src/cloudflare/hyperdrive.ts +13 -3
- package/src/cloudflare/kv-namespace.ts +25 -2
- package/src/cloudflare/miniflare/miniflare-worker-proxy.ts +3 -1
- package/src/cloudflare/miniflare/paths.ts +13 -0
- package/src/cloudflare/pipeline.ts +76 -28
- package/src/cloudflare/queue-consumer.ts +1 -1
- package/src/cloudflare/queue.ts +65 -54
- package/src/cloudflare/react-router/react-router.ts +28 -2
- package/src/cloudflare/redwood/plugin.ts +3 -2
- package/src/cloudflare/route.ts +1 -1
- package/src/cloudflare/ruleset.ts +7 -2
- package/src/cloudflare/secret.ts +20 -31
- package/src/cloudflare/secrets-store.ts +7 -3
- package/src/cloudflare/tunnel.ts +13 -2
- package/src/cloudflare/vectorize-index.ts +14 -3
- package/src/cloudflare/vite/plugin.ts +3 -2
- package/src/cloudflare/vite/vite.ts +2 -3
- package/src/cloudflare/website.ts +1 -1
- package/src/cloudflare/worker.ts +35 -23
- package/src/cloudflare/wrangler.json.ts +7 -4
- package/src/docker/container.ts +13 -1
- package/src/docker/network.ts +18 -3
- package/src/docker/volume.ts +17 -6
- package/src/fs/index.ts +0 -8
- package/src/github/client.ts +6 -2
- package/src/github/repository-environment.ts +27 -13
- package/src/neon/project.ts +20 -6
- package/src/planetscale/branch.ts +24 -13
- package/src/planetscale/database.ts +38 -17
- package/src/planetscale/password.ts +10 -3
- package/src/resource.ts +1 -10
- package/src/scope.ts +29 -38
- package/src/sentry/client-key.ts +74 -6
- package/src/sentry/project.ts +59 -6
- package/src/sentry/team.ts +55 -7
- package/src/serde.ts +0 -44
- package/src/state/d1-state-store.ts +13 -6
- package/src/state/sqlite-state-store.ts +16 -17
- package/src/stripe/card.ts +5 -2
- package/src/stripe/client.ts +10 -3
- package/src/stripe/coupon.ts +4 -3
- package/src/stripe/customer.ts +2 -2
- package/src/stripe/entitlements-feature.ts +5 -2
- package/src/stripe/file.ts +3 -2
- package/src/stripe/meter.ts +2 -2
- package/src/stripe/portal-configuration.ts +5 -2
- package/src/stripe/price.ts +3 -2
- package/src/stripe/product-feature.ts +5 -2
- package/src/stripe/product.ts +3 -2
- package/src/stripe/promotion-code.ts +3 -2
- package/src/stripe/shipping-rate.ts +4 -3
- package/src/stripe/tax-rate.ts +3 -2
- package/src/stripe/webhook.ts +4 -3
- package/src/test/vitest.ts +1 -0
- package/src/upstash/redis.ts +15 -5
- package/src/util/ignore-matcher.ts +3 -1
- package/src/util/peer.ts +53 -0
- package/src/util/telemetry/constants.ts +2 -2
- package/src/vercel/project.ts +46 -1
- package/templates/astro/_gitignore +2 -1
- package/templates/hono/README.md +19 -0
- package/templates/hono/_env +1 -0
- package/templates/hono/_env.example +1 -0
- package/templates/hono/_gitignore +34 -0
- package/templates/hono/alchemy.run.ts +22 -0
- package/templates/hono/package.json +18 -0
- package/templates/hono/src/index.ts +17 -0
- package/templates/hono/tsconfig.json +13 -0
- package/templates/hono/types/env.d.ts +16 -0
- package/templates/nuxt/_gitignore +2 -1
- package/templates/react-router/_gitignore +1 -0
- package/templates/react-router/vite.config.ts +5 -3
- package/templates/rwsdk/_gitignore +2 -3
- package/templates/sveltekit/_gitignore +2 -1
- package/templates/tanstack-start/_gitignore +2 -1
- package/templates/typescript/_gitignore +2 -1
- package/templates/vite/_gitignore +2 -1
- package/workers/cloudflare-state-store.js +69 -74
- package/workers/dofs-state-store.js +1 -1
- package/bin/bootstrap-s3.ts +0 -255
- package/lib/ai/ark.d.ts +0 -12
- package/lib/ai/ark.d.ts.map +0 -1
- package/lib/ai/ark.js +0 -87
- package/lib/ai/ark.js.map +0 -1
- package/lib/ai/astro-file.d.ts +0 -138
- package/lib/ai/astro-file.d.ts.map +0 -1
- package/lib/ai/astro-file.js +0 -158
- package/lib/ai/astro-file.js.map +0 -1
- package/lib/ai/client.d.ts +0 -51
- package/lib/ai/client.d.ts.map +0 -1
- package/lib/ai/client.js +0 -58
- package/lib/ai/client.js.map +0 -1
- package/lib/ai/css-file.d.ts +0 -132
- package/lib/ai/css-file.d.ts.map +0 -1
- package/lib/ai/css-file.js +0 -142
- package/lib/ai/css-file.js.map +0 -1
- package/lib/ai/data.d.ts +0 -152
- package/lib/ai/data.d.ts.map +0 -1
- package/lib/ai/data.js +0 -120
- package/lib/ai/data.js.map +0 -1
- package/lib/ai/document.d.ts +0 -208
- package/lib/ai/document.d.ts.map +0 -1
- package/lib/ai/document.js +0 -206
- package/lib/ai/document.js.map +0 -1
- package/lib/ai/html-file.d.ts +0 -129
- package/lib/ai/html-file.d.ts.map +0 -1
- package/lib/ai/html-file.js +0 -139
- package/lib/ai/html-file.js.map +0 -1
- package/lib/ai/index.d.ts +0 -11
- package/lib/ai/index.d.ts.map +0 -1
- package/lib/ai/index.js +0 -11
- package/lib/ai/index.js.map +0 -1
- package/lib/ai/json-file.d.ts +0 -161
- package/lib/ai/json-file.d.ts.map +0 -1
- package/lib/ai/json-file.js +0 -188
- package/lib/ai/json-file.js.map +0 -1
- package/lib/ai/typescript-file.d.ts +0 -140
- package/lib/ai/typescript-file.d.ts.map +0 -1
- package/lib/ai/typescript-file.js +0 -146
- package/lib/ai/typescript-file.js.map +0 -1
- package/lib/ai/vue-file.d.ts +0 -127
- package/lib/ai/vue-file.d.ts.map +0 -1
- package/lib/ai/vue-file.js +0 -137
- package/lib/ai/vue-file.js.map +0 -1
- package/lib/ai/yaml-file.d.ts +0 -170
- package/lib/ai/yaml-file.d.ts.map +0 -1
- package/lib/ai/yaml-file.js +0 -201
- package/lib/ai/yaml-file.js.map +0 -1
- package/lib/fs/static-astro-file.d.ts +0 -35
- package/lib/fs/static-astro-file.d.ts.map +0 -1
- package/lib/fs/static-astro-file.js +0 -40
- package/lib/fs/static-astro-file.js.map +0 -1
- package/lib/fs/static-css-file.d.ts +0 -25
- package/lib/fs/static-css-file.d.ts.map +0 -1
- package/lib/fs/static-css-file.js +0 -30
- package/lib/fs/static-css-file.js.map +0 -1
- package/lib/fs/static-html-file.d.ts +0 -32
- package/lib/fs/static-html-file.d.ts.map +0 -1
- package/lib/fs/static-html-file.js +0 -37
- package/lib/fs/static-html-file.js.map +0 -1
- package/lib/fs/static-json-file.d.ts +0 -18
- package/lib/fs/static-json-file.d.ts.map +0 -1
- package/lib/fs/static-json-file.js +0 -19
- package/lib/fs/static-json-file.js.map +0 -1
- package/lib/fs/static-text-file.d.ts +0 -13
- package/lib/fs/static-text-file.d.ts.map +0 -1
- package/lib/fs/static-text-file.js +0 -9
- package/lib/fs/static-text-file.js.map +0 -1
- package/lib/fs/static-typescript-file.d.ts +0 -20
- package/lib/fs/static-typescript-file.d.ts.map +0 -1
- package/lib/fs/static-typescript-file.js +0 -16
- package/lib/fs/static-typescript-file.js.map +0 -1
- package/lib/fs/static-vue-file.d.ts +0 -29
- package/lib/fs/static-vue-file.d.ts.map +0 -1
- package/lib/fs/static-vue-file.js +0 -34
- package/lib/fs/static-vue-file.js.map +0 -1
- package/lib/fs/static-yaml-file.d.ts +0 -23
- package/lib/fs/static-yaml-file.d.ts.map +0 -1
- package/lib/fs/static-yaml-file.js +0 -10
- package/lib/fs/static-yaml-file.js.map +0 -1
- package/lib/internal/docs/providers.d.ts +0 -34
- package/lib/internal/docs/providers.d.ts.map +0 -1
- package/lib/internal/docs/providers.js +0 -200
- package/lib/internal/docs/providers.js.map +0 -1
- package/lib/runtime/bind.d.ts +0 -25
- package/lib/runtime/bind.d.ts.map +0 -1
- package/lib/runtime/bind.js +0 -76
- package/lib/runtime/bind.js.map +0 -1
- package/lib/runtime/global.d.ts +0 -8
- package/lib/runtime/global.d.ts.map +0 -1
- package/lib/runtime/global.js +0 -3
- package/lib/runtime/global.js.map +0 -1
- package/lib/runtime/plugin.d.ts +0 -35
- package/lib/runtime/plugin.d.ts.map +0 -1
- package/lib/runtime/plugin.js +0 -134
- package/lib/runtime/plugin.js.map +0 -1
- package/lib/runtime/shims.d.ts +0 -6
- package/lib/runtime/shims.d.ts.map +0 -1
- package/lib/runtime/shims.js +0 -27
- package/lib/runtime/shims.js.map +0 -1
- package/lib/runtime/state.d.ts +0 -5
- package/lib/runtime/state.d.ts.map +0 -1
- package/lib/runtime/state.js +0 -4
- package/lib/runtime/state.js.map +0 -1
- package/lib/web/astro.d.ts +0 -148
- package/lib/web/astro.d.ts.map +0 -1
- package/lib/web/astro.js +0 -419
- package/lib/web/astro.js.map +0 -1
- package/lib/web/shadcn-component.d.ts +0 -30
- package/lib/web/shadcn-component.d.ts.map +0 -1
- package/lib/web/shadcn-component.js +0 -25
- package/lib/web/shadcn-component.js.map +0 -1
- package/lib/web/shadcn.d.ts +0 -98
- package/lib/web/shadcn.d.ts.map +0 -1
- package/lib/web/shadcn.js +0 -102
- package/lib/web/shadcn.js.map +0 -1
- package/lib/web/tailwind.d.ts +0 -65
- package/lib/web/tailwind.d.ts.map +0 -1
- package/lib/web/tailwind.js +0 -98
- package/lib/web/tailwind.js.map +0 -1
- package/lib/web/vite.d.ts +0 -96
- package/lib/web/vite.d.ts.map +0 -1
- package/lib/web/vite.js +0 -232
- package/lib/web/vite.js.map +0 -1
- package/lib/web/vitepress/config.d.ts +0 -12
- package/lib/web/vitepress/config.d.ts.map +0 -1
- package/lib/web/vitepress/config.js +0 -33
- package/lib/web/vitepress/config.js.map +0 -1
- package/lib/web/vitepress/custom-theme.d.ts +0 -174
- package/lib/web/vitepress/custom-theme.d.ts.map +0 -1
- package/lib/web/vitepress/custom-theme.js +0 -337
- package/lib/web/vitepress/custom-theme.js.map +0 -1
- package/lib/web/vitepress/dependencies.d.ts +0 -13
- package/lib/web/vitepress/dependencies.d.ts.map +0 -1
- package/lib/web/vitepress/dependencies.js +0 -37
- package/lib/web/vitepress/dependencies.js.map +0 -1
- package/lib/web/vitepress/home-page.d.ts +0 -247
- package/lib/web/vitepress/home-page.d.ts.map +0 -1
- package/lib/web/vitepress/home-page.js +0 -146
- package/lib/web/vitepress/home-page.js.map +0 -1
- package/lib/web/vitepress/index.d.ts +0 -6
- package/lib/web/vitepress/index.d.ts.map +0 -1
- package/lib/web/vitepress/index.js +0 -6
- package/lib/web/vitepress/index.js.map +0 -1
- package/lib/web/vitepress/process-front-matter-files.d.ts +0 -19
- package/lib/web/vitepress/process-front-matter-files.d.ts.map +0 -1
- package/lib/web/vitepress/process-front-matter-files.js +0 -73
- package/lib/web/vitepress/process-front-matter-files.js.map +0 -1
- package/lib/web/vitepress/vitepress.d.ts +0 -75
- package/lib/web/vitepress/vitepress.d.ts.map +0 -1
- package/lib/web/vitepress/vitepress.js +0 -254
- package/lib/web/vitepress/vitepress.js.map +0 -1
- package/src/ai/ark.ts +0 -118
- package/src/ai/astro-file.ts +0 -270
- package/src/ai/client.ts +0 -117
- package/src/ai/css-file.ts +0 -247
- package/src/ai/data.ts +0 -221
- package/src/ai/document.ts +0 -367
- package/src/ai/html-file.ts +0 -244
- package/src/ai/index.ts +0 -10
- package/src/ai/json-file.ts +0 -325
- package/src/ai/typescript-file.ts +0 -259
- package/src/ai/vue-file.ts +0 -242
- package/src/ai/yaml-file.ts +0 -328
- package/src/fs/static-astro-file.ts +0 -45
- package/src/fs/static-css-file.ts +0 -35
- package/src/fs/static-html-file.ts +0 -42
- package/src/fs/static-json-file.ts +0 -38
- package/src/fs/static-text-file.ts +0 -23
- package/src/fs/static-typescript-file.ts +0 -37
- package/src/fs/static-vue-file.ts +0 -39
- package/src/fs/static-yaml-file.ts +0 -33
- package/src/internal/docs/providers.ts +0 -286
- package/src/runtime/bind.ts +0 -95
- package/src/runtime/global.ts +0 -10
- package/src/runtime/plugin.ts +0 -163
- package/src/runtime/shims.js +0 -34
- package/src/runtime/state.ts +0 -9
- package/src/web/astro.ts +0 -643
- package/src/web/shadcn-component.ts +0 -72
- package/src/web/shadcn.ts +0 -221
- package/src/web/tailwind.ts +0 -167
- package/src/web/vite.ts +0 -407
- package/src/web/vitepress/config.ts +0 -50
- package/src/web/vitepress/custom-theme.ts +0 -514
- package/src/web/vitepress/dependencies.ts +0 -69
- package/src/web/vitepress/home-page.ts +0 -378
- package/src/web/vitepress/index.ts +0 -5
- package/src/web/vitepress/process-front-matter-files.ts +0 -107
- package/src/web/vitepress/vitepress.ts +0 -372
- package/templates/sveltekit/bun.lock +0 -1099
package/src/sentry/client-key.ts
CHANGED
|
@@ -10,6 +10,8 @@ import { SentryApi } from "./api.ts";
|
|
|
10
10
|
export interface ClientKeyProps {
|
|
11
11
|
/**
|
|
12
12
|
* The name of the key
|
|
13
|
+
*
|
|
14
|
+
* @default ${app}-${stage}-${id}
|
|
13
15
|
*/
|
|
14
16
|
name?: string;
|
|
15
17
|
|
|
@@ -68,6 +70,11 @@ export interface ClientKey
|
|
|
68
70
|
*/
|
|
69
71
|
id: string;
|
|
70
72
|
|
|
73
|
+
/**
|
|
74
|
+
* Name of the Client Key.
|
|
75
|
+
*/
|
|
76
|
+
name: string;
|
|
77
|
+
|
|
71
78
|
/**
|
|
72
79
|
* The label of the key
|
|
73
80
|
*/
|
|
@@ -180,11 +187,45 @@ export const ClientKey = Resource(
|
|
|
180
187
|
"sentry::ClientKey",
|
|
181
188
|
async function (
|
|
182
189
|
this: Context<ClientKey>,
|
|
183
|
-
|
|
190
|
+
id: string,
|
|
184
191
|
props: ClientKeyProps,
|
|
185
192
|
): Promise<ClientKey> {
|
|
186
193
|
const api = new SentryApi({ authToken: props.authToken });
|
|
187
194
|
|
|
195
|
+
// it's possible that `this.output.name` is undefined because a previous version
|
|
196
|
+
// of alchemy had a bug where it didn't set the name on the output
|
|
197
|
+
// so, we try to find the key by ID and use the name from the API response
|
|
198
|
+
const lookupName = async () => {
|
|
199
|
+
if (!this.output?.id) {
|
|
200
|
+
// not running in the update phase
|
|
201
|
+
return undefined;
|
|
202
|
+
} else if (this.output.name) {
|
|
203
|
+
return this.output.name;
|
|
204
|
+
}
|
|
205
|
+
const name = (
|
|
206
|
+
await getClientKeyName(api, {
|
|
207
|
+
organization: props.organization,
|
|
208
|
+
project: props.project,
|
|
209
|
+
keyId: this.output.id,
|
|
210
|
+
})
|
|
211
|
+
)?.name;
|
|
212
|
+
|
|
213
|
+
if (name) {
|
|
214
|
+
this.output.name = name;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
return name;
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
const clientKeyName =
|
|
221
|
+
props.name ?? (await lookupName()) ?? this.scope.createPhysicalName(id);
|
|
222
|
+
|
|
223
|
+
if (this.phase === "update") {
|
|
224
|
+
if (this.output.name !== clientKeyName) {
|
|
225
|
+
this.replace();
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
188
229
|
if (this.phase === "delete") {
|
|
189
230
|
try {
|
|
190
231
|
if (this.output?.id) {
|
|
@@ -217,24 +258,24 @@ export const ClientKey = Resource(
|
|
|
217
258
|
} catch (error) {
|
|
218
259
|
// Check if this is a "key already exists" error and adopt is enabled
|
|
219
260
|
if (
|
|
220
|
-
props.adopt &&
|
|
261
|
+
(props.adopt ?? this.scope.adopt) &&
|
|
221
262
|
error instanceof Error &&
|
|
222
263
|
error.message.includes("already exists") &&
|
|
223
|
-
|
|
264
|
+
clientKeyName
|
|
224
265
|
) {
|
|
225
266
|
logger.log(
|
|
226
|
-
`Client key '${
|
|
267
|
+
`Client key '${clientKeyName}' already exists, adopting it`,
|
|
227
268
|
);
|
|
228
269
|
// Find the existing key by name
|
|
229
270
|
const existingKey = await findClientKeyByName(
|
|
230
271
|
api,
|
|
231
272
|
props.organization,
|
|
232
273
|
props.project,
|
|
233
|
-
|
|
274
|
+
clientKeyName,
|
|
234
275
|
);
|
|
235
276
|
if (!existingKey) {
|
|
236
277
|
throw new Error(
|
|
237
|
-
`Failed to find existing client key '${
|
|
278
|
+
`Failed to find existing client key '${clientKeyName}' for adoption`,
|
|
238
279
|
);
|
|
239
280
|
}
|
|
240
281
|
response = await api.get(
|
|
@@ -257,6 +298,7 @@ export const ClientKey = Resource(
|
|
|
257
298
|
return this({
|
|
258
299
|
...props,
|
|
259
300
|
id: data.id,
|
|
301
|
+
name: clientKeyName,
|
|
260
302
|
label: data.label,
|
|
261
303
|
public: data.public,
|
|
262
304
|
secret: data.secret,
|
|
@@ -294,3 +336,29 @@ async function findClientKeyByName(
|
|
|
294
336
|
const key = keys.find((k) => k.name === name);
|
|
295
337
|
return key ? { id: key.id } : null;
|
|
296
338
|
}
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* Find a client key by ID
|
|
342
|
+
*/
|
|
343
|
+
async function getClientKeyName(
|
|
344
|
+
api: SentryApi,
|
|
345
|
+
{
|
|
346
|
+
organization,
|
|
347
|
+
project,
|
|
348
|
+
keyId,
|
|
349
|
+
}: {
|
|
350
|
+
organization: string;
|
|
351
|
+
project: string;
|
|
352
|
+
keyId: string;
|
|
353
|
+
},
|
|
354
|
+
): Promise<{ id: string; name: string } | null> {
|
|
355
|
+
const response = await api.get(
|
|
356
|
+
`/projects/${organization}/${project}/keys/${keyId}`,
|
|
357
|
+
);
|
|
358
|
+
if (!response.ok) {
|
|
359
|
+
throw new Error(`API error: ${response.statusText}`);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
const key = (await response.json()) as { id: string; name: string };
|
|
363
|
+
return key ? { id: key.id, name: key.name } : null;
|
|
364
|
+
}
|
package/src/sentry/project.ts
CHANGED
|
@@ -10,8 +10,10 @@ import { SentryApi } from "./api.ts";
|
|
|
10
10
|
export interface ProjectProps {
|
|
11
11
|
/**
|
|
12
12
|
* The name for the project
|
|
13
|
+
*
|
|
14
|
+
* @default ${app}-${stage}-${id}
|
|
13
15
|
*/
|
|
14
|
-
name
|
|
16
|
+
name?: string;
|
|
15
17
|
|
|
16
18
|
/**
|
|
17
19
|
* Uniquely identifies a project and is used for the interface
|
|
@@ -63,6 +65,11 @@ export interface Project
|
|
|
63
65
|
*/
|
|
64
66
|
id: string;
|
|
65
67
|
|
|
68
|
+
/**
|
|
69
|
+
* The name for the project
|
|
70
|
+
*/
|
|
71
|
+
name: string;
|
|
72
|
+
|
|
66
73
|
/**
|
|
67
74
|
* The team that owns the project
|
|
68
75
|
*/
|
|
@@ -282,11 +289,43 @@ export const Project = Resource(
|
|
|
282
289
|
"sentry::Project",
|
|
283
290
|
async function (
|
|
284
291
|
this: Context<Project>,
|
|
285
|
-
|
|
292
|
+
id: string,
|
|
286
293
|
props: ProjectProps,
|
|
287
294
|
): Promise<Project> {
|
|
288
295
|
const api = new SentryApi({ authToken: props.authToken });
|
|
289
296
|
|
|
297
|
+
// it's possible that `this.output.name` is undefined because a previous version
|
|
298
|
+
// of alchemy had a bug where it didn't set the name on the output
|
|
299
|
+
// so, we try to find the key by ID and use the name from the API response
|
|
300
|
+
const lookupName = async () => {
|
|
301
|
+
if (!this.output) {
|
|
302
|
+
return undefined;
|
|
303
|
+
} else if (this.output.name) {
|
|
304
|
+
return this.output.name;
|
|
305
|
+
}
|
|
306
|
+
const name = await getProjectName(
|
|
307
|
+
api,
|
|
308
|
+
props.organization,
|
|
309
|
+
this.output.id,
|
|
310
|
+
);
|
|
311
|
+
if (name) {
|
|
312
|
+
this.output.name = name;
|
|
313
|
+
}
|
|
314
|
+
return name;
|
|
315
|
+
};
|
|
316
|
+
|
|
317
|
+
const projectName =
|
|
318
|
+
props.name ?? (await lookupName()) ?? this.scope.createPhysicalName(id);
|
|
319
|
+
|
|
320
|
+
if (this.phase === "update" && this.output.name !== projectName) {
|
|
321
|
+
await api.put(
|
|
322
|
+
`/projects/${props.organization}/${this.output.slug || this.output.id}/`,
|
|
323
|
+
{
|
|
324
|
+
name: projectName,
|
|
325
|
+
},
|
|
326
|
+
);
|
|
327
|
+
}
|
|
328
|
+
|
|
290
329
|
if (this.phase === "delete") {
|
|
291
330
|
try {
|
|
292
331
|
if (this.output?.id) {
|
|
@@ -319,22 +358,22 @@ export const Project = Resource(
|
|
|
319
358
|
} catch (error) {
|
|
320
359
|
// Check if this is a "project already exists" error and adopt is enabled
|
|
321
360
|
if (
|
|
322
|
-
props.adopt &&
|
|
361
|
+
(props.adopt ?? this.scope.adopt) &&
|
|
323
362
|
error instanceof Error &&
|
|
324
363
|
error.message.includes("already exists")
|
|
325
364
|
) {
|
|
326
365
|
logger.log(
|
|
327
|
-
`Project '${props.slug ||
|
|
366
|
+
`Project '${props.slug || projectName}' already exists, adopting it`,
|
|
328
367
|
);
|
|
329
368
|
// Find the existing project by slug
|
|
330
369
|
const existingProject = await findProjectBySlug(
|
|
331
370
|
api,
|
|
332
371
|
props.organization,
|
|
333
|
-
props.slug ||
|
|
372
|
+
props.slug || projectName,
|
|
334
373
|
);
|
|
335
374
|
if (!existingProject) {
|
|
336
375
|
throw new Error(
|
|
337
|
-
`Failed to find existing project '${props.slug ||
|
|
376
|
+
`Failed to find existing project '${props.slug || projectName}' for adoption`,
|
|
338
377
|
);
|
|
339
378
|
}
|
|
340
379
|
response = await api.get(
|
|
@@ -357,6 +396,7 @@ export const Project = Resource(
|
|
|
357
396
|
return this({
|
|
358
397
|
...props,
|
|
359
398
|
id: data.id,
|
|
399
|
+
name: projectName,
|
|
360
400
|
team: data.team,
|
|
361
401
|
teams: data.teams,
|
|
362
402
|
isBookmarked: data.isBookmarked,
|
|
@@ -419,3 +459,16 @@ async function findProjectBySlug(
|
|
|
419
459
|
const project = projects.find((p) => p.slug === slug);
|
|
420
460
|
return project ? { id: project.id, slug: project.slug } : null;
|
|
421
461
|
}
|
|
462
|
+
|
|
463
|
+
async function getProjectName(
|
|
464
|
+
api: SentryApi,
|
|
465
|
+
organization: string,
|
|
466
|
+
slug: string,
|
|
467
|
+
): Promise<string | undefined> {
|
|
468
|
+
const response = await api.get(`/projects/${organization}/${slug}/`);
|
|
469
|
+
if (!response.ok) {
|
|
470
|
+
throw new Error(`API error: ${response.statusText}`);
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
return ((await response.json()) as { name: string }).name;
|
|
474
|
+
}
|
package/src/sentry/team.ts
CHANGED
|
@@ -10,8 +10,10 @@ import { SentryApi } from "./api.ts";
|
|
|
10
10
|
export interface TeamProps {
|
|
11
11
|
/**
|
|
12
12
|
* The name for the team
|
|
13
|
+
*
|
|
14
|
+
* @default ${app}-${stage}-${id}
|
|
13
15
|
*/
|
|
14
|
-
name
|
|
16
|
+
name?: string;
|
|
15
17
|
|
|
16
18
|
/**
|
|
17
19
|
* Uniquely identifies a team and is used for the interface
|
|
@@ -46,6 +48,11 @@ export interface Team extends Resource<"sentry::Team">, TeamProps {
|
|
|
46
48
|
*/
|
|
47
49
|
id: string;
|
|
48
50
|
|
|
51
|
+
/**
|
|
52
|
+
* Name of the Team.
|
|
53
|
+
*/
|
|
54
|
+
name: string;
|
|
55
|
+
|
|
49
56
|
/**
|
|
50
57
|
* Time at which the team was created
|
|
51
58
|
*/
|
|
@@ -127,11 +134,36 @@ export const Team = Resource(
|
|
|
127
134
|
"sentry::Team",
|
|
128
135
|
async function (
|
|
129
136
|
this: Context<Team>,
|
|
130
|
-
|
|
137
|
+
id: string,
|
|
131
138
|
props: TeamProps,
|
|
132
139
|
): Promise<Team> {
|
|
133
140
|
const api = new SentryApi({ authToken: props.authToken });
|
|
134
141
|
|
|
142
|
+
// it's possible that `this.output.name` is undefined because a previous version
|
|
143
|
+
// of alchemy had a bug where it didn't set the name on the output
|
|
144
|
+
// so, we try to find the key by ID and use the name from the API response
|
|
145
|
+
const lookupName = async () => {
|
|
146
|
+
if (!this.output) {
|
|
147
|
+
return undefined;
|
|
148
|
+
} else if (this.output?.name) {
|
|
149
|
+
return this.output.name;
|
|
150
|
+
}
|
|
151
|
+
const name = await getTeamName(api, props.organization, this.output.id);
|
|
152
|
+
if (name) {
|
|
153
|
+
this.output.name = name;
|
|
154
|
+
}
|
|
155
|
+
return name;
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
const teamName =
|
|
159
|
+
props.name ?? (await lookupName()) ?? this.scope.createPhysicalName(id);
|
|
160
|
+
|
|
161
|
+
if (this.phase === "update" && this.output.name !== teamName) {
|
|
162
|
+
// TODO(sam): can we rename without destroying?
|
|
163
|
+
// -> no: https://docs.sentry.io/api/teams/update-a-team/
|
|
164
|
+
this.replace();
|
|
165
|
+
}
|
|
166
|
+
|
|
135
167
|
if (this.phase === "delete") {
|
|
136
168
|
try {
|
|
137
169
|
if (this.output?.id) {
|
|
@@ -164,22 +196,22 @@ export const Team = Resource(
|
|
|
164
196
|
} catch (error) {
|
|
165
197
|
// Check if this is a "team already exists" error and adopt is enabled
|
|
166
198
|
if (
|
|
167
|
-
props.adopt &&
|
|
199
|
+
(props.adopt ?? this.scope.adopt) &&
|
|
168
200
|
error instanceof Error &&
|
|
169
201
|
error.message.includes("already exists")
|
|
170
202
|
) {
|
|
171
203
|
logger.log(
|
|
172
|
-
`Team '${props.slug ||
|
|
204
|
+
`Team '${props.slug || teamName}' already exists, adopting it`,
|
|
173
205
|
);
|
|
174
206
|
// Find the existing team by slug
|
|
175
207
|
const existingTeam = await findTeamBySlug(
|
|
176
208
|
api,
|
|
177
209
|
props.organization,
|
|
178
|
-
props.slug ||
|
|
210
|
+
props.slug || teamName,
|
|
179
211
|
);
|
|
180
212
|
if (!existingTeam) {
|
|
181
213
|
throw new Error(
|
|
182
|
-
`Failed to find existing team '${props.slug ||
|
|
214
|
+
`Failed to find existing team '${props.slug || teamName}' for adoption`,
|
|
183
215
|
);
|
|
184
216
|
}
|
|
185
217
|
response = await api.get(
|
|
@@ -192,13 +224,16 @@ export const Team = Resource(
|
|
|
192
224
|
}
|
|
193
225
|
|
|
194
226
|
if (!response.ok) {
|
|
195
|
-
throw new Error(
|
|
227
|
+
throw new Error(
|
|
228
|
+
`API error: ${response.statusText} ${await response.text()}`,
|
|
229
|
+
);
|
|
196
230
|
}
|
|
197
231
|
|
|
198
232
|
const data = (await response.json()) as Omit<Team, keyof TeamProps>;
|
|
199
233
|
return this({
|
|
200
234
|
...props,
|
|
201
235
|
id: data.id,
|
|
236
|
+
name: teamName,
|
|
202
237
|
dateCreated: data.dateCreated,
|
|
203
238
|
isMember: data.isMember,
|
|
204
239
|
teamRole: data.teamRole,
|
|
@@ -234,3 +269,16 @@ async function findTeamBySlug(
|
|
|
234
269
|
const team = teams.find((t) => t.slug === slug);
|
|
235
270
|
return team ? { id: team.id, slug: team.slug } : null;
|
|
236
271
|
}
|
|
272
|
+
|
|
273
|
+
async function getTeamName(
|
|
274
|
+
api: SentryApi,
|
|
275
|
+
organization: string,
|
|
276
|
+
slug: string,
|
|
277
|
+
): Promise<string | undefined> {
|
|
278
|
+
const response = await api.get(`/teams/${organization}/${slug}/`);
|
|
279
|
+
if (!response.ok) {
|
|
280
|
+
throw new Error(`API error: ${response.statusText}`);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
return ((await response.json()) as { name: string }).name;
|
|
284
|
+
}
|
package/src/serde.ts
CHANGED
|
@@ -1,10 +1,4 @@
|
|
|
1
1
|
import { decryptWithKey, encrypt } from "./encrypt.ts";
|
|
2
|
-
import {
|
|
3
|
-
InnerResourceScope,
|
|
4
|
-
ResourceFQN,
|
|
5
|
-
ResourceKind,
|
|
6
|
-
type Resource,
|
|
7
|
-
} from "./resource.ts";
|
|
8
2
|
import { isScope, type Scope } from "./scope.ts";
|
|
9
3
|
import { isSecret, Secret } from "./secret.ts";
|
|
10
4
|
|
|
@@ -65,44 +59,6 @@ export type Serialized<T> = T extends
|
|
|
65
59
|
}
|
|
66
60
|
: T;
|
|
67
61
|
|
|
68
|
-
export type SerializedScope = {
|
|
69
|
-
[fqn: ResourceFQN]: Serialized<Resource>;
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
export async function serializeScope(scope: Scope): Promise<SerializedScope> {
|
|
73
|
-
const map: SerializedScope = {};
|
|
74
|
-
|
|
75
|
-
return serializeScope(scope);
|
|
76
|
-
|
|
77
|
-
async function serializeScope(scope: Scope): Promise<SerializedScope> {
|
|
78
|
-
await Promise.all(
|
|
79
|
-
Array.from(scope.resources.values()).map(async (resource) => {
|
|
80
|
-
if (resource[ResourceKind] === "alchemy::Scope") {
|
|
81
|
-
return;
|
|
82
|
-
}
|
|
83
|
-
map[resource[ResourceFQN]] = await serialize(scope, await resource, {
|
|
84
|
-
transform: (value) => {
|
|
85
|
-
if (isSecret(value)) {
|
|
86
|
-
return {
|
|
87
|
-
"@secret-env": value.name,
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
return value;
|
|
91
|
-
},
|
|
92
|
-
});
|
|
93
|
-
const innerScope = await resource[InnerResourceScope];
|
|
94
|
-
if (innerScope) {
|
|
95
|
-
await serializeScope(innerScope);
|
|
96
|
-
}
|
|
97
|
-
}),
|
|
98
|
-
);
|
|
99
|
-
await Promise.all(
|
|
100
|
-
Array.from(scope.children.values()).map((scope) => serializeScope(scope)),
|
|
101
|
-
);
|
|
102
|
-
return map;
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
|
|
106
62
|
export async function serialize(
|
|
107
63
|
scope: Scope,
|
|
108
64
|
value: any,
|
|
@@ -1,13 +1,16 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { RemoteCallback } from "drizzle-orm/sqlite-proxy";
|
|
2
2
|
import assert from "node:assert";
|
|
3
3
|
import { extractCloudflareResult } from "../cloudflare/api-response.ts";
|
|
4
|
-
import
|
|
4
|
+
import {
|
|
5
|
+
createCloudflareApi,
|
|
6
|
+
type CloudflareApi,
|
|
7
|
+
type CloudflareApiOptions,
|
|
8
|
+
} from "../cloudflare/api.ts";
|
|
5
9
|
import type { Scope } from "../scope.ts";
|
|
6
10
|
import { memoize } from "../util/memoize.ts";
|
|
11
|
+
import { importPeer } from "../util/peer.ts";
|
|
7
12
|
import { MIGRATIONS_DIRECTORY } from "./migrations.ts";
|
|
8
|
-
import { SQLiteStateStoreOperations } from "./operations.ts";
|
|
9
13
|
import { StateStoreProxy } from "./proxy.ts";
|
|
10
|
-
import * as schema from "./schema.ts";
|
|
11
14
|
|
|
12
15
|
export interface D1StateStoreOptions extends CloudflareApiOptions {
|
|
13
16
|
databaseName?: string;
|
|
@@ -26,6 +29,7 @@ export class D1StateStore extends StateStoreProxy {
|
|
|
26
29
|
|
|
27
30
|
async provision(): Promise<StateStoreProxy.Dispatch> {
|
|
28
31
|
const db = await createDatabaseClient(this.options);
|
|
32
|
+
const { SQLiteStateStoreOperations } = await import("./operations.js");
|
|
29
33
|
const operations = new SQLiteStateStoreOperations(db, {
|
|
30
34
|
chain: this.scope.chain,
|
|
31
35
|
});
|
|
@@ -34,7 +38,10 @@ export class D1StateStore extends StateStoreProxy {
|
|
|
34
38
|
}
|
|
35
39
|
|
|
36
40
|
const createDatabaseClient = memoize(async (options: D1StateStoreOptions) => {
|
|
37
|
-
const {
|
|
41
|
+
const { drizzle } = await importPeer(
|
|
42
|
+
import("drizzle-orm/sqlite-proxy"),
|
|
43
|
+
"D1StateStore",
|
|
44
|
+
);
|
|
38
45
|
const api = await createCloudflareApi(options);
|
|
39
46
|
const database = await upsertDatabase(
|
|
40
47
|
api,
|
|
@@ -63,7 +70,7 @@ const createDatabaseClient = memoize(async (options: D1StateStoreOptions) => {
|
|
|
63
70
|
};
|
|
64
71
|
};
|
|
65
72
|
return drizzle(remoteCallback, {
|
|
66
|
-
schema,
|
|
73
|
+
schema: await import("./schema.js"),
|
|
67
74
|
});
|
|
68
75
|
});
|
|
69
76
|
|
|
@@ -3,10 +3,9 @@ import fs from "node:fs";
|
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import type { Scope } from "../scope.ts";
|
|
5
5
|
import { memoize } from "../util/memoize.ts";
|
|
6
|
+
import { importPeer } from "../util/peer.ts";
|
|
6
7
|
import { MIGRATIONS_DIRECTORY } from "./migrations.ts";
|
|
7
|
-
import { SQLiteStateStoreOperations } from "./operations.ts";
|
|
8
8
|
import { StateStoreProxy } from "./proxy.ts";
|
|
9
|
-
import * as schema from "./schema.ts";
|
|
10
9
|
|
|
11
10
|
interface BunSQLiteStateStoreOptions {
|
|
12
11
|
/**
|
|
@@ -82,6 +81,7 @@ export class SQLiteStateStore extends StateStoreProxy {
|
|
|
82
81
|
|
|
83
82
|
async provision(): Promise<StateStoreProxy.Dispatch> {
|
|
84
83
|
const db = await createDatabase(this.options);
|
|
84
|
+
const { SQLiteStateStoreOperations } = await import("./operations.js");
|
|
85
85
|
const operations = new SQLiteStateStoreOperations(db, {
|
|
86
86
|
chain: this.scope.chain,
|
|
87
87
|
});
|
|
@@ -125,12 +125,12 @@ async function createBunSQLiteDatabase(
|
|
|
125
125
|
".alchemy/state.sqlite";
|
|
126
126
|
ensureDirectory(filename);
|
|
127
127
|
const { Database } = await import("bun:sqlite");
|
|
128
|
-
const { drizzle } = await
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
});
|
|
128
|
+
const { drizzle } = await importPeer(
|
|
129
|
+
import("drizzle-orm/bun-sqlite"),
|
|
130
|
+
"SQLiteStateStore",
|
|
131
|
+
);
|
|
133
132
|
const { migrate } = await import("drizzle-orm/bun-sqlite/migrator");
|
|
133
|
+
const schema = await import("./schema.js");
|
|
134
134
|
// Bun's constructor throws if we pass in an empty object or if extraneous
|
|
135
135
|
// options are passed in, so here's some ugly destructuring!
|
|
136
136
|
const { engine: _engine, filename: _filename, ...rest } = options ?? {};
|
|
@@ -154,17 +154,16 @@ async function createLibSQLDatabase(
|
|
|
154
154
|
if (filename) {
|
|
155
155
|
ensureDirectory(filename);
|
|
156
156
|
}
|
|
157
|
-
const {
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
);
|
|
166
|
-
});
|
|
157
|
+
const { drizzle } = await importPeer(
|
|
158
|
+
import("drizzle-orm/libsql"),
|
|
159
|
+
"SQLiteStateStore",
|
|
160
|
+
);
|
|
161
|
+
const { createClient } = await importPeer(
|
|
162
|
+
import("@libsql/client"),
|
|
163
|
+
"SQLiteStateStore (libsql)",
|
|
164
|
+
);
|
|
167
165
|
const { migrate } = await import("drizzle-orm/libsql/migrator");
|
|
166
|
+
const schema = await import("./schema.js");
|
|
168
167
|
const client = createClient({ url, ...options });
|
|
169
168
|
await client.execute("PRAGMA journal_mode = WAL;");
|
|
170
169
|
const db = drizzle(client, {
|
package/src/stripe/card.ts
CHANGED
|
@@ -209,7 +209,7 @@ export const Card = Resource(
|
|
|
209
209
|
_id: string,
|
|
210
210
|
props: CardProps,
|
|
211
211
|
): Promise<Card> {
|
|
212
|
-
const stripe = createStripeClient({ apiKey: props.apiKey });
|
|
212
|
+
const stripe = await createStripeClient({ apiKey: props.apiKey });
|
|
213
213
|
|
|
214
214
|
if (this.phase === "delete") {
|
|
215
215
|
try {
|
|
@@ -279,7 +279,10 @@ export const Card = Resource(
|
|
|
279
279
|
createParams,
|
|
280
280
|
)) as Stripe.Card;
|
|
281
281
|
} catch (error) {
|
|
282
|
-
if (
|
|
282
|
+
if (
|
|
283
|
+
isStripeConflictError(error) &&
|
|
284
|
+
(props.adopt ?? this.scope.adopt)
|
|
285
|
+
) {
|
|
283
286
|
throw new Error(
|
|
284
287
|
"Card adoption is not supported - cards cannot be uniquely identified for adoption",
|
|
285
288
|
);
|
package/src/stripe/client.ts
CHANGED
|
@@ -1,13 +1,20 @@
|
|
|
1
|
-
import Stripe from "stripe";
|
|
1
|
+
import type Stripe from "stripe";
|
|
2
2
|
import type { Secret } from "../secret.ts";
|
|
3
|
-
import { withExponentialBackoff } from "../util/retry.ts";
|
|
4
3
|
import { logger } from "../util/logger.ts";
|
|
4
|
+
import { importPeer } from "../util/peer.ts";
|
|
5
|
+
import { withExponentialBackoff } from "../util/retry.ts";
|
|
5
6
|
|
|
6
7
|
export interface StripeClientOptions {
|
|
7
8
|
apiKey?: Secret | string;
|
|
8
9
|
}
|
|
9
10
|
|
|
10
|
-
export function createStripeClient(
|
|
11
|
+
export async function createStripeClient(
|
|
12
|
+
options: StripeClientOptions = {},
|
|
13
|
+
): Promise<Stripe> {
|
|
14
|
+
const { default: Stripe } = await importPeer(
|
|
15
|
+
import("stripe"),
|
|
16
|
+
"Stripe resources",
|
|
17
|
+
);
|
|
11
18
|
let apiKey: string;
|
|
12
19
|
|
|
13
20
|
if (options.apiKey) {
|
package/src/stripe/coupon.ts
CHANGED
|
@@ -163,7 +163,8 @@ export const Coupon = Resource(
|
|
|
163
163
|
_id: string,
|
|
164
164
|
props: CouponProps,
|
|
165
165
|
): Promise<Coupon> {
|
|
166
|
-
const
|
|
166
|
+
const adopt = props.adopt ?? this.scope.adopt;
|
|
167
|
+
const stripe = await createStripeClient({ apiKey: props.apiKey });
|
|
167
168
|
|
|
168
169
|
if (this.phase === "delete") {
|
|
169
170
|
try {
|
|
@@ -217,7 +218,7 @@ export const Coupon = Resource(
|
|
|
217
218
|
try {
|
|
218
219
|
coupon = await stripe.coupons.create(createParams);
|
|
219
220
|
} catch (error) {
|
|
220
|
-
if (isStripeConflictError(error) &&
|
|
221
|
+
if (isStripeConflictError(error) && adopt) {
|
|
221
222
|
if (props.id) {
|
|
222
223
|
const existingCoupon = await stripe.coupons.retrieve(props.id);
|
|
223
224
|
const updateParams: Stripe.CouponUpdateParams = {
|
|
@@ -236,7 +237,7 @@ export const Coupon = Resource(
|
|
|
236
237
|
}
|
|
237
238
|
}
|
|
238
239
|
} catch (error) {
|
|
239
|
-
if (isStripeConflictError(error) &&
|
|
240
|
+
if (isStripeConflictError(error) && adopt) {
|
|
240
241
|
if (props.id) {
|
|
241
242
|
const existingCoupon = await stripe.coupons.retrieve(props.id);
|
|
242
243
|
const updateParams: Stripe.CouponUpdateParams = {
|
package/src/stripe/customer.ts
CHANGED
|
@@ -282,7 +282,7 @@ export const Customer = Resource(
|
|
|
282
282
|
_id: string,
|
|
283
283
|
props: CustomerProps,
|
|
284
284
|
): Promise<Customer> {
|
|
285
|
-
const stripe = createStripeClient({ apiKey: props.apiKey });
|
|
285
|
+
const stripe = await createStripeClient({ apiKey: props.apiKey });
|
|
286
286
|
|
|
287
287
|
if (this.phase === "delete") {
|
|
288
288
|
try {
|
|
@@ -385,7 +385,7 @@ export const Customer = Resource(
|
|
|
385
385
|
};
|
|
386
386
|
}
|
|
387
387
|
|
|
388
|
-
if (props.adopt && props.email) {
|
|
388
|
+
if ((props.adopt ?? this.scope.adopt) && props.email) {
|
|
389
389
|
const existingCustomers = await stripe.customers.list({
|
|
390
390
|
email: props.email,
|
|
391
391
|
limit: 1,
|
|
@@ -101,7 +101,7 @@ export const EntitlementsFeature = Resource(
|
|
|
101
101
|
_id: string,
|
|
102
102
|
props: EntitlementsFeatureProps,
|
|
103
103
|
): Promise<EntitlementsFeature> {
|
|
104
|
-
const stripe = createStripeClient({ apiKey: props.apiKey });
|
|
104
|
+
const stripe = await createStripeClient({ apiKey: props.apiKey });
|
|
105
105
|
|
|
106
106
|
if (this.phase === "delete") {
|
|
107
107
|
return this.destroy();
|
|
@@ -130,7 +130,10 @@ export const EntitlementsFeature = Resource(
|
|
|
130
130
|
try {
|
|
131
131
|
feature = await stripe.entitlements.features.create(createParams);
|
|
132
132
|
} catch (error) {
|
|
133
|
-
if (
|
|
133
|
+
if (
|
|
134
|
+
isStripeConflictError(error) &&
|
|
135
|
+
(props.adopt ?? this.scope.adopt)
|
|
136
|
+
) {
|
|
134
137
|
const existingFeatures = await stripe.entitlements.features.list({
|
|
135
138
|
lookup_key: props.lookupKey,
|
|
136
139
|
limit: 1,
|
package/src/stripe/file.ts
CHANGED
|
@@ -153,7 +153,8 @@ export const File = Resource(
|
|
|
153
153
|
_id: string,
|
|
154
154
|
props: FileProps,
|
|
155
155
|
): Promise<File> {
|
|
156
|
-
const
|
|
156
|
+
const adopt = props.adopt ?? this.scope.adopt;
|
|
157
|
+
const stripe = await createStripeClient({ apiKey: props.apiKey });
|
|
157
158
|
|
|
158
159
|
if (this.phase === "delete") {
|
|
159
160
|
return this.destroy();
|
|
@@ -171,7 +172,7 @@ export const File = Resource(
|
|
|
171
172
|
purpose: props.purpose,
|
|
172
173
|
});
|
|
173
174
|
} catch (error) {
|
|
174
|
-
if (isStripeConflictError(error) &&
|
|
175
|
+
if (isStripeConflictError(error) && adopt) {
|
|
175
176
|
throw new Error(
|
|
176
177
|
"File adoption is not supported - files are immutable and cannot be adopted",
|
|
177
178
|
);
|