alchemy 0.62.3 → 0.63.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/alchemy.js +1517 -1203
- package/bin/commands/deploy.ts +2 -0
- package/bin/commands/dev.ts +2 -0
- package/bin/commands/init.ts +1 -1
- package/bin/services/execute-alchemy.ts +11 -0
- package/bin/services/github-workflow.ts +2 -2
- 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/cloudflare-env-proxy.js +1 -1
- package/lib/cloudflare/cloudflare-env-proxy.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 +6 -2
- 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/durable-object-namespace.d.ts.map +1 -1
- package/lib/cloudflare/durable-object-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 +3 -2
- 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 +4 -2
- 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/website.js +1 -1
- package/lib/cloudflare/website.js.map +1 -1
- package/lib/cloudflare/worker-metadata.js +1 -1
- package/lib/cloudflare/worker-metadata.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 +14 -11
- 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 +6 -5
- package/lib/upstash/redis.js.map +1 -1
- package/lib/util/idempotent-spawn.d.ts.map +1 -1
- package/lib/util/idempotent-spawn.js +21 -2
- package/lib/util/idempotent-spawn.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/xml.js +1 -1
- package/lib/util/xml.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/cloudflare-env-proxy.ts +1 -1
- 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 +10 -3
- package/src/cloudflare/dispatch-namespace.ts +10 -7
- package/src/cloudflare/durable-object-namespace.ts +0 -1
- package/src/cloudflare/hyperdrive.ts +14 -4
- 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 +26 -14
- 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/website.ts +1 -1
- package/src/cloudflare/worker-metadata.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 +24 -11
- 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 +16 -6
- package/src/util/idempotent-spawn.ts +23 -2
- package/src/util/ignore-matcher.ts +3 -1
- package/src/util/peer.ts +53 -0
- package/src/util/xml.ts +1 -1
- package/src/vercel/project.ts +46 -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/react-router/vite.config.ts +5 -3
- 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/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
|
);
|
package/src/stripe/meter.ts
CHANGED
|
@@ -155,7 +155,7 @@ export const Meter = Resource(
|
|
|
155
155
|
_logicalId: string,
|
|
156
156
|
props: MeterProps,
|
|
157
157
|
): Promise<Meter> {
|
|
158
|
-
const stripe = createStripeClient({ apiKey: props.apiKey });
|
|
158
|
+
const stripe = await createStripeClient({ apiKey: props.apiKey });
|
|
159
159
|
|
|
160
160
|
const currentOutputId = this.output?.id;
|
|
161
161
|
|
|
@@ -303,7 +303,7 @@ export const Meter = Resource(
|
|
|
303
303
|
stripeAPIResponse = await stripe.billing.meters.create(createParams);
|
|
304
304
|
} catch (error) {
|
|
305
305
|
logger.warn("Error creating/updating meter:", error);
|
|
306
|
-
if (isStripeConflictError(error) && props.adopt) {
|
|
306
|
+
if (isStripeConflictError(error) && (props.adopt ?? this.scope.adopt)) {
|
|
307
307
|
throw new Error(
|
|
308
308
|
"Meter adoption is not supported - meters cannot be uniquely identified for adoption",
|
|
309
309
|
);
|
|
@@ -312,7 +312,7 @@ export const PortalConfiguration = Resource(
|
|
|
312
312
|
_id: string,
|
|
313
313
|
props: PortalConfigurationProps,
|
|
314
314
|
): Promise<PortalConfiguration> {
|
|
315
|
-
const stripe = createStripeClient({ apiKey: props.apiKey });
|
|
315
|
+
const stripe = await createStripeClient({ apiKey: props.apiKey });
|
|
316
316
|
|
|
317
317
|
if (this.phase === "delete") {
|
|
318
318
|
try {
|
|
@@ -499,7 +499,10 @@ export const PortalConfiguration = Resource(
|
|
|
499
499
|
configuration =
|
|
500
500
|
await stripe.billingPortal.configurations.create(createParams);
|
|
501
501
|
} catch (error) {
|
|
502
|
-
if (
|
|
502
|
+
if (
|
|
503
|
+
isStripeConflictError(error) &&
|
|
504
|
+
(props.adopt ?? this.scope.adopt)
|
|
505
|
+
) {
|
|
503
506
|
throw new Error(
|
|
504
507
|
"PortalConfiguration adoption is not supported - portal configurations cannot be uniquely identified for adoption",
|
|
505
508
|
);
|
package/src/stripe/price.ts
CHANGED
|
@@ -353,7 +353,8 @@ export const Price = Resource(
|
|
|
353
353
|
_id: string,
|
|
354
354
|
props: PriceProps,
|
|
355
355
|
): Promise<Price> {
|
|
356
|
-
const
|
|
356
|
+
const adopt = props.adopt ?? this.scope.adopt;
|
|
357
|
+
const stripe = await createStripeClient({ apiKey: props.apiKey });
|
|
357
358
|
|
|
358
359
|
if (this.phase === "delete") {
|
|
359
360
|
try {
|
|
@@ -475,7 +476,7 @@ export const Price = Resource(
|
|
|
475
476
|
limit: 1,
|
|
476
477
|
});
|
|
477
478
|
if (existingPrices.data.length > 0) {
|
|
478
|
-
if (
|
|
479
|
+
if (adopt) {
|
|
479
480
|
const existingPrice = existingPrices.data[0];
|
|
480
481
|
const updateParams: Stripe.PriceUpdateParams & {
|
|
481
482
|
expand?: string[];
|
|
@@ -97,7 +97,7 @@ export const ProductFeature = Resource(
|
|
|
97
97
|
_id: string,
|
|
98
98
|
props: ProductFeatureProps,
|
|
99
99
|
): Promise<ProductFeature> {
|
|
100
|
-
const stripe = createStripeClient({ apiKey: props.apiKey });
|
|
100
|
+
const stripe = await createStripeClient({ apiKey: props.apiKey });
|
|
101
101
|
|
|
102
102
|
if (this.phase === "delete") {
|
|
103
103
|
try {
|
|
@@ -124,7 +124,10 @@ export const ProductFeature = Resource(
|
|
|
124
124
|
entitlement_feature: props.entitlementFeature,
|
|
125
125
|
});
|
|
126
126
|
} catch (error) {
|
|
127
|
-
if (
|
|
127
|
+
if (
|
|
128
|
+
isStripeConflictError(error) &&
|
|
129
|
+
(props.adopt ?? this.scope.adopt)
|
|
130
|
+
) {
|
|
128
131
|
throw new Error(
|
|
129
132
|
"ProductFeature adoption is not supported - product features cannot be uniquely identified for adoption",
|
|
130
133
|
);
|
package/src/stripe/product.ts
CHANGED
|
@@ -157,7 +157,8 @@ export const Product = Resource(
|
|
|
157
157
|
_id: string,
|
|
158
158
|
props: ProductProps,
|
|
159
159
|
): Promise<Product> {
|
|
160
|
-
const
|
|
160
|
+
const adopt = props.adopt ?? this.scope.adopt;
|
|
161
|
+
const stripe = await createStripeClient({ apiKey: props.apiKey });
|
|
161
162
|
|
|
162
163
|
if (this.phase === "delete") {
|
|
163
164
|
try {
|
|
@@ -202,7 +203,7 @@ export const Product = Resource(
|
|
|
202
203
|
metadata: props.metadata,
|
|
203
204
|
tax_code: props.taxCode,
|
|
204
205
|
};
|
|
205
|
-
if (
|
|
206
|
+
if (adopt) {
|
|
206
207
|
const existingProducts = await stripe.products.list({
|
|
207
208
|
limit: 100,
|
|
208
209
|
});
|
|
@@ -156,7 +156,8 @@ export const PromotionCode = Resource(
|
|
|
156
156
|
_id: string,
|
|
157
157
|
props: PromotionCodeProps,
|
|
158
158
|
): Promise<PromotionCode> {
|
|
159
|
-
const
|
|
159
|
+
const adopt = props.adopt ?? this.scope.adopt;
|
|
160
|
+
const stripe = await createStripeClient({ apiKey: props.apiKey });
|
|
160
161
|
|
|
161
162
|
if (this.phase === "delete") {
|
|
162
163
|
try {
|
|
@@ -203,7 +204,7 @@ export const PromotionCode = Resource(
|
|
|
203
204
|
try {
|
|
204
205
|
promotionCode = await stripe.promotionCodes.create(createParams);
|
|
205
206
|
} catch (error) {
|
|
206
|
-
if (isStripeConflictError(error) &&
|
|
207
|
+
if (isStripeConflictError(error) && adopt) {
|
|
207
208
|
if (props.code) {
|
|
208
209
|
const existingPromotionCodes = await stripe.promotionCodes.list({
|
|
209
210
|
code: props.code,
|