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/alchemy.ts
CHANGED
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
import fs from "node:fs/promises";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
|
|
4
1
|
import { execArgv } from "node:process";
|
|
5
2
|
import { onExit } from "signal-exit";
|
|
6
3
|
import { ReplacedSignal } from "./apply.ts";
|
|
@@ -14,12 +11,10 @@ import {
|
|
|
14
11
|
ResourceSeq,
|
|
15
12
|
type PendingResource,
|
|
16
13
|
} from "./resource.ts";
|
|
17
|
-
import { isRuntime } from "./runtime/global.ts";
|
|
18
14
|
import { DEFAULT_STAGE, Scope, type ProviderCredentials } from "./scope.ts";
|
|
19
15
|
import { secret } from "./secret.ts";
|
|
20
16
|
import type { StateStoreType } from "./state.ts";
|
|
21
17
|
import type { LoggerApi } from "./util/cli.ts";
|
|
22
|
-
import { logger } from "./util/logger.ts";
|
|
23
18
|
import { TelemetryClient } from "./util/telemetry/client.ts";
|
|
24
19
|
|
|
25
20
|
/**
|
|
@@ -71,10 +66,6 @@ export interface Alchemy {
|
|
|
71
66
|
* or locally in the current scope.
|
|
72
67
|
*/
|
|
73
68
|
secret: typeof secret;
|
|
74
|
-
/**
|
|
75
|
-
* Whether the current runtime is the Cloudflare Workers runtime.
|
|
76
|
-
*/
|
|
77
|
-
isRuntime: boolean;
|
|
78
69
|
|
|
79
70
|
/**
|
|
80
71
|
* Creates a new application scope with the given name and options.
|
|
@@ -95,74 +86,51 @@ export interface Alchemy {
|
|
|
95
86
|
* });
|
|
96
87
|
*/
|
|
97
88
|
(appName: string, options?: Omit<AlchemyOptions, "appName">): Promise<Scope>;
|
|
98
|
-
/**
|
|
99
|
-
* Template literal tag that supports file interpolation for documentation.
|
|
100
|
-
* Automatically formats the content and appends file contents as code blocks.
|
|
101
|
-
*
|
|
102
|
-
* @example
|
|
103
|
-
* // Generate documentation using file contents
|
|
104
|
-
* await Document("api-docs", {
|
|
105
|
-
* prompt: await alchemy`
|
|
106
|
-
* Generate docs using the contents of:
|
|
107
|
-
* ${alchemy.file("README.md")}
|
|
108
|
-
* ${alchemy.file("./.cursorrules")}
|
|
109
|
-
*
|
|
110
|
-
* And here are the source files:
|
|
111
|
-
* ${alchemy.files(files)}
|
|
112
|
-
* `
|
|
113
|
-
* });
|
|
114
|
-
*/
|
|
115
|
-
(template: TemplateStringsArray, ...values: any[]): Promise<string>;
|
|
116
89
|
}
|
|
117
90
|
|
|
118
91
|
_alchemy.destroy = destroy;
|
|
119
92
|
_alchemy.run = run;
|
|
120
93
|
_alchemy.secret = secret;
|
|
121
94
|
_alchemy.env = env;
|
|
122
|
-
_alchemy.isRuntime = isRuntime;
|
|
123
95
|
|
|
124
96
|
/**
|
|
125
|
-
* Implementation of the alchemy function
|
|
126
|
-
* and template string interpolation.
|
|
97
|
+
* Implementation of the alchemy function.
|
|
127
98
|
*/
|
|
128
99
|
async function _alchemy(
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
process.env.ALCHEMY_CI_STATE_STORE_CHECK !== "false"
|
|
164
|
-
) {
|
|
165
|
-
throw new Error(`You are running Alchemy in a CI environment with the default local state store.
|
|
100
|
+
appName: string,
|
|
101
|
+
options?: Omit<AlchemyOptions, "appName">,
|
|
102
|
+
): Promise<Scope> {
|
|
103
|
+
const cliArgs = process.argv.slice(2);
|
|
104
|
+
const cliOptions = {
|
|
105
|
+
phase: cliArgs.includes("--destroy")
|
|
106
|
+
? "destroy"
|
|
107
|
+
: cliArgs.includes("--read")
|
|
108
|
+
? "read"
|
|
109
|
+
: "up",
|
|
110
|
+
local: cliArgs.includes("--local") || cliArgs.includes("--dev"),
|
|
111
|
+
watch: cliArgs.includes("--watch") || execArgv.includes("--watch"),
|
|
112
|
+
quiet: cliArgs.includes("--quiet"),
|
|
113
|
+
force: cliArgs.includes("--force"),
|
|
114
|
+
// Parse stage argument (--stage my-stage) functionally and inline as a property declaration
|
|
115
|
+
stage: (function parseStage() {
|
|
116
|
+
const i = cliArgs.indexOf("--stage");
|
|
117
|
+
return i !== -1 && i + 1 < cliArgs.length
|
|
118
|
+
? cliArgs[i + 1]
|
|
119
|
+
: process.env.STAGE;
|
|
120
|
+
})(),
|
|
121
|
+
password: process.env.ALCHEMY_PASSWORD,
|
|
122
|
+
adopt: cliArgs.includes("--adopt"),
|
|
123
|
+
} satisfies Partial<AlchemyOptions>;
|
|
124
|
+
const mergedOptions = {
|
|
125
|
+
...cliOptions,
|
|
126
|
+
...options,
|
|
127
|
+
};
|
|
128
|
+
if (
|
|
129
|
+
mergedOptions.stateStore === undefined &&
|
|
130
|
+
process.env.CI &&
|
|
131
|
+
process.env.ALCHEMY_CI_STATE_STORE_CHECK !== "false"
|
|
132
|
+
) {
|
|
133
|
+
throw new Error(`You are running Alchemy in a CI environment with the default local state store.
|
|
166
134
|
This can lead to orphaned infrastructure and is rarely what you want to do.
|
|
167
135
|
|
|
168
136
|
Instead, you should choose a persistent state store:
|
|
@@ -173,165 +141,45 @@ You can read more about State and State Stores here: https://alchemy.run/concept
|
|
|
173
141
|
|
|
174
142
|
If this is a mistake, you can disable this check by setting the ALCHEMY_CI_STATE_STORE_CHECK=false.
|
|
175
143
|
`);
|
|
176
|
-
|
|
144
|
+
}
|
|
177
145
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
phase,
|
|
183
|
-
enabled: mergedOptions?.telemetry ?? true,
|
|
184
|
-
quiet: mergedOptions?.quiet ?? false,
|
|
185
|
-
});
|
|
186
|
-
const root = new Scope({
|
|
187
|
-
...mergedOptions,
|
|
188
|
-
parent: undefined,
|
|
189
|
-
scopeName: appName,
|
|
146
|
+
const phase = mergedOptions?.phase ?? "up";
|
|
147
|
+
const telemetryClient =
|
|
148
|
+
mergedOptions?.parent?.telemetryClient ??
|
|
149
|
+
TelemetryClient.create({
|
|
190
150
|
phase,
|
|
191
|
-
|
|
192
|
-
|
|
151
|
+
enabled: mergedOptions?.telemetry ?? true,
|
|
152
|
+
quiet: mergedOptions?.quiet ?? false,
|
|
193
153
|
});
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
stage: stageName,
|
|
154
|
+
const root = new Scope({
|
|
155
|
+
...mergedOptions,
|
|
156
|
+
parent: undefined,
|
|
157
|
+
scopeName: appName,
|
|
158
|
+
phase,
|
|
159
|
+
password: mergedOptions?.password ?? process.env.ALCHEMY_PASSWORD,
|
|
160
|
+
telemetryClient,
|
|
161
|
+
});
|
|
162
|
+
onExit((code) => {
|
|
163
|
+
root.cleanup().then(() => {
|
|
164
|
+
code = code === 130 ? 0 : (code ?? 0);
|
|
165
|
+
process.exit(code);
|
|
207
166
|
});
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
return
|
|
167
|
+
return true;
|
|
168
|
+
});
|
|
169
|
+
const stageName = mergedOptions?.stage ?? DEFAULT_STAGE;
|
|
170
|
+
const stage = new Scope({
|
|
171
|
+
...mergedOptions,
|
|
172
|
+
parent: root,
|
|
173
|
+
scopeName: stageName,
|
|
174
|
+
stage: stageName,
|
|
175
|
+
});
|
|
176
|
+
Scope.storage.enterWith(root);
|
|
177
|
+
Scope.storage.enterWith(stage);
|
|
178
|
+
if (mergedOptions?.phase === "destroy") {
|
|
179
|
+
await destroy(stage);
|
|
180
|
+
return process.exit(0);
|
|
222
181
|
}
|
|
223
|
-
|
|
224
|
-
const [, secondLine] = template[0].split("\n");
|
|
225
|
-
const leadingSpaces = secondLine
|
|
226
|
-
? secondLine.match(/^(\s*)/)?.[1]?.length || 0
|
|
227
|
-
: 0;
|
|
228
|
-
const indent = " ".repeat(leadingSpaces);
|
|
229
|
-
|
|
230
|
-
const [{ isFileRef }, { isFileCollection }] = await Promise.all([
|
|
231
|
-
import("./fs/file-ref.js"),
|
|
232
|
-
import("./fs/file-collection.js"),
|
|
233
|
-
]);
|
|
234
|
-
|
|
235
|
-
const appendices: Record<string, string> = {};
|
|
236
|
-
|
|
237
|
-
const stringValues = await Promise.all(
|
|
238
|
-
values.map(async function resolve(value): Promise<string> {
|
|
239
|
-
if (typeof value === "string") {
|
|
240
|
-
return indent + value;
|
|
241
|
-
}
|
|
242
|
-
if (value === null) {
|
|
243
|
-
return "null";
|
|
244
|
-
}
|
|
245
|
-
if (value === undefined) {
|
|
246
|
-
return "undefined";
|
|
247
|
-
}
|
|
248
|
-
if (
|
|
249
|
-
typeof value === "number" ||
|
|
250
|
-
typeof value === "boolean" ||
|
|
251
|
-
typeof value === "bigint"
|
|
252
|
-
) {
|
|
253
|
-
return value.toString();
|
|
254
|
-
}
|
|
255
|
-
if (value instanceof Promise) {
|
|
256
|
-
return resolve(await value);
|
|
257
|
-
}
|
|
258
|
-
if (isFileRef(value)) {
|
|
259
|
-
if (!(value.path in appendices)) {
|
|
260
|
-
appendices[value.path] = await fs.readFile(value.path, "utf-8");
|
|
261
|
-
}
|
|
262
|
-
return `[${path.basename(value.path)}](${value.path})`;
|
|
263
|
-
}
|
|
264
|
-
if (isFileCollection(value)) {
|
|
265
|
-
return Object.entries(value.files)
|
|
266
|
-
.map(([filePath, content]) => {
|
|
267
|
-
appendices[filePath] = content;
|
|
268
|
-
return `[${path.basename(filePath)}](${filePath})`;
|
|
269
|
-
})
|
|
270
|
-
.join("\n\n");
|
|
271
|
-
}
|
|
272
|
-
if (Array.isArray(value)) {
|
|
273
|
-
return (
|
|
274
|
-
await Promise.all(
|
|
275
|
-
value.map(async (value, i) => `${i}. ${await resolve(value)}`),
|
|
276
|
-
)
|
|
277
|
-
).join("\n");
|
|
278
|
-
}
|
|
279
|
-
if (typeof value === "object" && typeof value.path === "string") {
|
|
280
|
-
if (typeof value.content === "string") {
|
|
281
|
-
appendices[value.path] = value.content;
|
|
282
|
-
return `[${path.basename(value.path)}](${value.path})`;
|
|
283
|
-
}
|
|
284
|
-
appendices[value.path] = await fs.readFile(value.path, "utf-8");
|
|
285
|
-
return `[${path.basename(value.path)}](${value.path})`;
|
|
286
|
-
}
|
|
287
|
-
if (typeof value === "object") {
|
|
288
|
-
return (
|
|
289
|
-
await Promise.all(
|
|
290
|
-
Object.entries(value).map(async ([key, value]) => {
|
|
291
|
-
return `* ${key}: ${await resolve(value)}`;
|
|
292
|
-
}),
|
|
293
|
-
)
|
|
294
|
-
).join("\n");
|
|
295
|
-
}
|
|
296
|
-
// TODO: support other types
|
|
297
|
-
logger.log(value);
|
|
298
|
-
throw new Error(`Unsupported value type: ${value}`);
|
|
299
|
-
}),
|
|
300
|
-
);
|
|
301
|
-
|
|
302
|
-
// Construct the string template by joining template parts with interpolated values
|
|
303
|
-
const lines = template
|
|
304
|
-
.map((part) =>
|
|
305
|
-
part
|
|
306
|
-
.split("\n")
|
|
307
|
-
.map((line) =>
|
|
308
|
-
line.startsWith(indent) ? line.slice(indent.length) : line,
|
|
309
|
-
)
|
|
310
|
-
.join("\n"),
|
|
311
|
-
)
|
|
312
|
-
.flatMap((part, i) =>
|
|
313
|
-
i < stringValues.length ? [part, stringValues[i] ?? ""] : [part],
|
|
314
|
-
)
|
|
315
|
-
.join("")
|
|
316
|
-
.split("\n");
|
|
317
|
-
|
|
318
|
-
// Collect and sort appendices by file path
|
|
319
|
-
return [
|
|
320
|
-
// format the user prompt and trim the first line if it's empty
|
|
321
|
-
lines.length > 1 && lines[0].replaceAll(" ", "").length === 0
|
|
322
|
-
? lines.slice(1).join("\n")
|
|
323
|
-
: lines.join("\n"),
|
|
324
|
-
|
|
325
|
-
// sort appendices by path and include at the end of the prompt
|
|
326
|
-
Object.entries(appendices)
|
|
327
|
-
.sort(([a], [b]) => a.localeCompare(b))
|
|
328
|
-
.map(([filePath, content]) => {
|
|
329
|
-
const extension = path.extname(filePath).slice(1);
|
|
330
|
-
const codeTag = extension ? extension : "";
|
|
331
|
-
return `// ${filePath}\n\`\`\`${codeTag}\n${content}\n\`\`\``;
|
|
332
|
-
})
|
|
333
|
-
.join("\n\n"),
|
|
334
|
-
].join("\n");
|
|
182
|
+
return root;
|
|
335
183
|
}
|
|
336
184
|
|
|
337
185
|
export type Phase = "up" | "destroy" | "read";
|
|
@@ -414,6 +262,12 @@ export interface AlchemyOptions {
|
|
|
414
262
|
* If not provided, the default fallback logger will be used.
|
|
415
263
|
*/
|
|
416
264
|
logger?: LoggerApi;
|
|
265
|
+
/**
|
|
266
|
+
* Whether to adopt resources if they already exist but are not yet managed by your Alchemy app.
|
|
267
|
+
*
|
|
268
|
+
* @default false
|
|
269
|
+
*/
|
|
270
|
+
adopt?: boolean;
|
|
417
271
|
}
|
|
418
272
|
|
|
419
273
|
export interface ScopeOptions extends AlchemyOptions {
|
|
@@ -463,7 +317,7 @@ async function run<T>(
|
|
|
463
317
|
const telemetryClient =
|
|
464
318
|
options?.parent?.telemetryClient ??
|
|
465
319
|
TelemetryClient.create({
|
|
466
|
-
phase:
|
|
320
|
+
phase: options?.phase ?? "up",
|
|
467
321
|
enabled: options?.telemetry ?? true,
|
|
468
322
|
quiet: options?.quiet ?? false,
|
|
469
323
|
});
|
package/src/apply.ts
CHANGED
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
type Resource,
|
|
14
14
|
type ResourceProps,
|
|
15
15
|
} from "./resource.ts";
|
|
16
|
-
import {
|
|
16
|
+
import type { PendingDeletions } from "./scope.ts";
|
|
17
17
|
import { serialize } from "./serde.ts";
|
|
18
18
|
import { formatFQN } from "./util/cli.ts";
|
|
19
19
|
import { logger } from "./util/logger.ts";
|
|
@@ -22,7 +22,6 @@ import type { Telemetry } from "./util/telemetry/index.ts";
|
|
|
22
22
|
export interface ApplyOptions {
|
|
23
23
|
quiet?: boolean;
|
|
24
24
|
alwaysUpdate?: boolean;
|
|
25
|
-
resolveInnerScope?: (scope: Scope) => void;
|
|
26
25
|
}
|
|
27
26
|
|
|
28
27
|
export function apply<Out extends Resource>(
|
|
@@ -63,12 +62,6 @@ async function _apply<Out extends Resource>(
|
|
|
63
62
|
`Resource "${resource[ResourceFQN]}" not found and running in 'read' phase.`,
|
|
64
63
|
);
|
|
65
64
|
}
|
|
66
|
-
options?.resolveInnerScope?.(
|
|
67
|
-
new Scope({
|
|
68
|
-
parent: scope,
|
|
69
|
-
scopeName: resource[ResourceID],
|
|
70
|
-
}),
|
|
71
|
-
);
|
|
72
65
|
scope.telemetryClient.record({
|
|
73
66
|
event: "resource.read",
|
|
74
67
|
resource: resource[ResourceKind],
|
|
@@ -115,11 +108,6 @@ async function _apply<Out extends Resource>(
|
|
|
115
108
|
alwaysUpdate !== true &&
|
|
116
109
|
!scope.force
|
|
117
110
|
) {
|
|
118
|
-
const innerScope = new Scope({
|
|
119
|
-
parent: scope,
|
|
120
|
-
scopeName: resource[ResourceID],
|
|
121
|
-
});
|
|
122
|
-
innerScope.skip();
|
|
123
111
|
if (!quiet) {
|
|
124
112
|
logger.task(resource[ResourceFQN], {
|
|
125
113
|
prefix: "skipped",
|
|
@@ -129,7 +117,6 @@ async function _apply<Out extends Resource>(
|
|
|
129
117
|
status: "success",
|
|
130
118
|
});
|
|
131
119
|
}
|
|
132
|
-
options?.resolveInnerScope?.(innerScope);
|
|
133
120
|
scope.telemetryClient.record({
|
|
134
121
|
event: "resource.skip",
|
|
135
122
|
resource: resource[ResourceKind],
|
|
@@ -199,10 +186,8 @@ async function _apply<Out extends Resource>(
|
|
|
199
186
|
parent: scope,
|
|
200
187
|
destroyStrategy: provider.options?.destroyStrategy ?? "sequential",
|
|
201
188
|
},
|
|
202
|
-
async (
|
|
203
|
-
|
|
204
|
-
return provider.handler.bind(ctx)(resource[ResourceID], props);
|
|
205
|
-
},
|
|
189
|
+
async () =>
|
|
190
|
+
await provider.handler.bind(ctx)(resource[ResourceID], props),
|
|
206
191
|
);
|
|
207
192
|
} catch (error) {
|
|
208
193
|
if (error instanceof ReplacedSignal) {
|
|
@@ -216,7 +201,9 @@ async function _apply<Out extends Resource>(
|
|
|
216
201
|
},
|
|
217
202
|
});
|
|
218
203
|
} else {
|
|
219
|
-
if (
|
|
204
|
+
if (
|
|
205
|
+
(scope.children.get(resource[ResourceID])?.children.size ?? 0) > 0
|
|
206
|
+
) {
|
|
220
207
|
throw new Error(
|
|
221
208
|
`Resource ${resource[ResourceFQN]} has children and cannot be replaced.`,
|
|
222
209
|
);
|
package/src/aws/account-id.ts
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
const sts = new STSClient({});
|
|
1
|
+
import { importPeer } from "../util/peer.ts";
|
|
4
2
|
|
|
5
3
|
export type AccountId = string & {
|
|
6
4
|
readonly __brand: "AccountId";
|
|
@@ -10,6 +8,11 @@ export type AccountId = string & {
|
|
|
10
8
|
* Helper to get the current AWS account ID
|
|
11
9
|
*/
|
|
12
10
|
export async function AccountId(): Promise<AccountId> {
|
|
11
|
+
const { GetCallerIdentityCommand, STSClient } = await importPeer(
|
|
12
|
+
import("@aws-sdk/client-sts"),
|
|
13
|
+
"aws::AccountId",
|
|
14
|
+
);
|
|
15
|
+
const sts = new STSClient({});
|
|
13
16
|
const identity = await sts.send(new GetCallerIdentityCommand({}));
|
|
14
17
|
return identity.Account! as AccountId;
|
|
15
18
|
}
|
package/src/aws/bucket.ts
CHANGED
|
@@ -1,18 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
CreateBucketCommand,
|
|
3
|
-
DeleteBucketCommand,
|
|
4
|
-
GetBucketAclCommand,
|
|
5
|
-
GetBucketLocationCommand,
|
|
6
|
-
GetBucketTaggingCommand,
|
|
7
|
-
GetBucketVersioningCommand,
|
|
8
|
-
HeadBucketCommand,
|
|
9
|
-
NoSuchBucket,
|
|
10
|
-
PutBucketTaggingCommand,
|
|
11
|
-
S3Client,
|
|
12
|
-
} from "@aws-sdk/client-s3";
|
|
13
1
|
import type { Context } from "../context.ts";
|
|
14
2
|
import { Resource } from "../resource.ts";
|
|
15
3
|
import { ignore } from "../util/ignore.ts";
|
|
4
|
+
import { importPeer } from "../util/peer.ts";
|
|
16
5
|
import { retry } from "./retry.ts";
|
|
17
6
|
|
|
18
7
|
/**
|
|
@@ -22,8 +11,10 @@ export interface BucketProps {
|
|
|
22
11
|
/**
|
|
23
12
|
* The name of the bucket. Must be globally unique across all AWS accounts.
|
|
24
13
|
* Should be lowercase alphanumeric characters or hyphens.
|
|
14
|
+
*
|
|
15
|
+
* @default ${app}-${stage}-${id}
|
|
25
16
|
*/
|
|
26
|
-
bucketName
|
|
17
|
+
bucketName?: string;
|
|
27
18
|
|
|
28
19
|
/**
|
|
29
20
|
* Optional tags to apply to the bucket for organization and cost tracking.
|
|
@@ -42,6 +33,11 @@ export interface Bucket extends Resource<"s3::Bucket">, BucketProps {
|
|
|
42
33
|
*/
|
|
43
34
|
arn: string;
|
|
44
35
|
|
|
36
|
+
/**
|
|
37
|
+
* Name of the Bucket.
|
|
38
|
+
*/
|
|
39
|
+
bucketName: string;
|
|
40
|
+
|
|
45
41
|
/**
|
|
46
42
|
* The global domain name for the bucket
|
|
47
43
|
* Format: bucket-name.s3.amazonaws.com
|
|
@@ -129,15 +125,36 @@ export interface Bucket extends Resource<"s3::Bucket">, BucketProps {
|
|
|
129
125
|
*/
|
|
130
126
|
export const Bucket = Resource(
|
|
131
127
|
"s3::Bucket",
|
|
132
|
-
async function (this: Context<Bucket>,
|
|
128
|
+
async function (this: Context<Bucket>, id: string, props: BucketProps) {
|
|
129
|
+
const {
|
|
130
|
+
CreateBucketCommand,
|
|
131
|
+
DeleteBucketCommand,
|
|
132
|
+
GetBucketAclCommand,
|
|
133
|
+
GetBucketLocationCommand,
|
|
134
|
+
GetBucketTaggingCommand,
|
|
135
|
+
GetBucketVersioningCommand,
|
|
136
|
+
HeadBucketCommand,
|
|
137
|
+
NoSuchBucket,
|
|
138
|
+
PutBucketTaggingCommand,
|
|
139
|
+
S3Client,
|
|
140
|
+
} = await importPeer(import("@aws-sdk/client-s3"), "s3::Bucket");
|
|
133
141
|
const client = new S3Client({});
|
|
134
142
|
|
|
143
|
+
const bucketName =
|
|
144
|
+
props.bucketName ??
|
|
145
|
+
this.output?.bucketName ??
|
|
146
|
+
this.scope.createPhysicalName(id);
|
|
147
|
+
|
|
148
|
+
if (this.phase === "update" && this.output.bucketName !== bucketName) {
|
|
149
|
+
this.replace();
|
|
150
|
+
}
|
|
151
|
+
|
|
135
152
|
if (this.phase === "delete") {
|
|
136
153
|
await ignore(NoSuchBucket.name, () =>
|
|
137
154
|
retry(() =>
|
|
138
155
|
client.send(
|
|
139
156
|
new DeleteBucketCommand({
|
|
140
|
-
Bucket:
|
|
157
|
+
Bucket: bucketName,
|
|
141
158
|
}),
|
|
142
159
|
),
|
|
143
160
|
),
|
|
@@ -149,7 +166,7 @@ export const Bucket = Resource(
|
|
|
149
166
|
await retry(() =>
|
|
150
167
|
client.send(
|
|
151
168
|
new HeadBucketCommand({
|
|
152
|
-
Bucket:
|
|
169
|
+
Bucket: bucketName,
|
|
153
170
|
}),
|
|
154
171
|
),
|
|
155
172
|
);
|
|
@@ -159,7 +176,7 @@ export const Bucket = Resource(
|
|
|
159
176
|
await retry(() =>
|
|
160
177
|
client.send(
|
|
161
178
|
new PutBucketTaggingCommand({
|
|
162
|
-
Bucket:
|
|
179
|
+
Bucket: bucketName,
|
|
163
180
|
Tagging: {
|
|
164
181
|
TagSet: Object.entries(props.tags!).map(([Key, Value]) => ({
|
|
165
182
|
Key,
|
|
@@ -176,7 +193,7 @@ export const Bucket = Resource(
|
|
|
176
193
|
await retry(() =>
|
|
177
194
|
client.send(
|
|
178
195
|
new CreateBucketCommand({
|
|
179
|
-
Bucket:
|
|
196
|
+
Bucket: bucketName,
|
|
180
197
|
// Add tags during creation if specified
|
|
181
198
|
...(props.tags && {
|
|
182
199
|
Tagging: {
|
|
@@ -198,17 +215,13 @@ export const Bucket = Resource(
|
|
|
198
215
|
const [locationResponse, versioningResponse, aclResponse] =
|
|
199
216
|
await Promise.all([
|
|
200
217
|
retry(() =>
|
|
201
|
-
client.send(
|
|
202
|
-
new GetBucketLocationCommand({ Bucket: props.bucketName }),
|
|
203
|
-
),
|
|
218
|
+
client.send(new GetBucketLocationCommand({ Bucket: bucketName })),
|
|
204
219
|
),
|
|
205
220
|
retry(() =>
|
|
206
|
-
client.send(
|
|
207
|
-
new GetBucketVersioningCommand({ Bucket: props.bucketName }),
|
|
208
|
-
),
|
|
221
|
+
client.send(new GetBucketVersioningCommand({ Bucket: bucketName })),
|
|
209
222
|
),
|
|
210
223
|
retry(() =>
|
|
211
|
-
client.send(new GetBucketAclCommand({ Bucket:
|
|
224
|
+
client.send(new GetBucketAclCommand({ Bucket: bucketName })),
|
|
212
225
|
),
|
|
213
226
|
]);
|
|
214
227
|
|
|
@@ -219,9 +232,7 @@ export const Bucket = Resource(
|
|
|
219
232
|
if (!tags) {
|
|
220
233
|
try {
|
|
221
234
|
const taggingResponse = await retry(() =>
|
|
222
|
-
client.send(
|
|
223
|
-
new GetBucketTaggingCommand({ Bucket: props.bucketName }),
|
|
224
|
-
),
|
|
235
|
+
client.send(new GetBucketTaggingCommand({ Bucket: bucketName })),
|
|
225
236
|
);
|
|
226
237
|
tags = Object.fromEntries(
|
|
227
238
|
taggingResponse.TagSet?.map(({ Key, Value }) => [Key, Value]) || [],
|
|
@@ -234,10 +245,10 @@ export const Bucket = Resource(
|
|
|
234
245
|
}
|
|
235
246
|
|
|
236
247
|
return this({
|
|
237
|
-
bucketName:
|
|
238
|
-
arn: `arn:aws:s3:::${
|
|
239
|
-
bucketDomainName: `${
|
|
240
|
-
bucketRegionalDomainName: `${
|
|
248
|
+
bucketName: bucketName,
|
|
249
|
+
arn: `arn:aws:s3:::${bucketName}`,
|
|
250
|
+
bucketDomainName: `${bucketName}.s3.amazonaws.com`,
|
|
251
|
+
bucketRegionalDomainName: `${bucketName}.s3.${region}.amazonaws.com`,
|
|
241
252
|
region,
|
|
242
253
|
hostedZoneId: getHostedZoneId(region),
|
|
243
254
|
versioningEnabled: versioningResponse.Status === "Enabled",
|
|
@@ -31,8 +31,10 @@ export interface SecurityGroupProps extends AwsClientProps {
|
|
|
31
31
|
|
|
32
32
|
/**
|
|
33
33
|
* The name of the security group.
|
|
34
|
+
*
|
|
35
|
+
* @default ${app}-${stage}-${id}
|
|
34
36
|
*/
|
|
35
|
-
groupName
|
|
37
|
+
groupName?: string;
|
|
36
38
|
|
|
37
39
|
/**
|
|
38
40
|
* The description of the security group.
|
|
@@ -62,6 +64,11 @@ export interface SecurityGroup
|
|
|
62
64
|
*/
|
|
63
65
|
groupId: string;
|
|
64
66
|
|
|
67
|
+
/**
|
|
68
|
+
* The name of the security group.
|
|
69
|
+
*/
|
|
70
|
+
groupName: string;
|
|
71
|
+
|
|
65
72
|
/**
|
|
66
73
|
* The ID of the VPC the security group belongs to.
|
|
67
74
|
*/
|
|
@@ -200,7 +207,7 @@ export const SecurityGroup = Resource(
|
|
|
200
207
|
"aws::SecurityGroup",
|
|
201
208
|
async function (
|
|
202
209
|
this: Context<SecurityGroup>,
|
|
203
|
-
|
|
210
|
+
id: string,
|
|
204
211
|
props: SecurityGroupProps,
|
|
205
212
|
): Promise<SecurityGroup> {
|
|
206
213
|
// Create EC2 client with credential resolution handled internally
|
|
@@ -210,6 +217,10 @@ export const SecurityGroup = Resource(
|
|
|
210
217
|
SECURITY_GROUP_TIMEOUT,
|
|
211
218
|
props.timeout,
|
|
212
219
|
);
|
|
220
|
+
const groupName = props.groupName ?? this.scope.createPhysicalName(id);
|
|
221
|
+
if (this.phase === "update" && this.output.groupName !== groupName) {
|
|
222
|
+
this.replace();
|
|
223
|
+
}
|
|
213
224
|
|
|
214
225
|
if (this.phase === "delete") {
|
|
215
226
|
if (this.output?.groupId) {
|
|
@@ -259,7 +270,7 @@ export const SecurityGroup = Resource(
|
|
|
259
270
|
} else {
|
|
260
271
|
// Create new security group
|
|
261
272
|
const createParams: CreateSecurityGroupParams = {
|
|
262
|
-
GroupName:
|
|
273
|
+
GroupName: groupName,
|
|
263
274
|
GroupDescription: props.description,
|
|
264
275
|
VpcId: vpcId,
|
|
265
276
|
};
|
|
@@ -313,6 +324,7 @@ export const SecurityGroup = Resource(
|
|
|
313
324
|
|
|
314
325
|
return this({
|
|
315
326
|
groupId: securityGroup.GroupId,
|
|
327
|
+
groupName,
|
|
316
328
|
vpcId: securityGroup.VpcId,
|
|
317
329
|
ownerId: securityGroup.OwnerId,
|
|
318
330
|
...props,
|