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/ai/vue-file.ts
DELETED
|
@@ -1,242 +0,0 @@
|
|
|
1
|
-
import { generateText } from "ai";
|
|
2
|
-
import type { Context } from "../context.ts";
|
|
3
|
-
import { StaticVueFile } from "../fs/static-vue-file.ts";
|
|
4
|
-
import { Resource } from "../resource.ts";
|
|
5
|
-
import type { Secret } from "../secret.ts";
|
|
6
|
-
import { type ModelConfig, createModel } from "./client.ts";
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Properties for creating or updating a VueFile
|
|
10
|
-
*/
|
|
11
|
-
export interface VueFileProps {
|
|
12
|
-
/**
|
|
13
|
-
* Path to the Vue file
|
|
14
|
-
*/
|
|
15
|
-
path: string;
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Base URL for the OpenAI API
|
|
19
|
-
* @default 'https://api.openai.com/v1'
|
|
20
|
-
*/
|
|
21
|
-
baseURL?: string;
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Prompt for generating content
|
|
25
|
-
* Use alchemy template literals to include file context:
|
|
26
|
-
* @example
|
|
27
|
-
* prompt: await alchemy`
|
|
28
|
-
* Generate a Vue component using:
|
|
29
|
-
* ${alchemy.file("src/api.ts")}
|
|
30
|
-
* `
|
|
31
|
-
*/
|
|
32
|
-
prompt: string;
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* System prompt for the model
|
|
36
|
-
* This is used to provide instructions to the model about how to format the response
|
|
37
|
-
* The default system prompt instructs the model to return a single Vue component inside ```vue fences
|
|
38
|
-
* @default "You are a Vue component generator. Create a single Vue component based on the user's requirements. Your response MUST include only a single Vue component inside ```vue fences. Do not include any other text, explanations, or multiple code blocks."
|
|
39
|
-
*/
|
|
40
|
-
system?: string;
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* OpenAI API key to use for generating content
|
|
44
|
-
* If not provided, will use OPENAI_API_KEY environment variable
|
|
45
|
-
*/
|
|
46
|
-
apiKey?: Secret;
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Model configuration
|
|
50
|
-
*/
|
|
51
|
-
model?: ModelConfig;
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Temperature for controlling randomness in generation.
|
|
55
|
-
* Higher values (e.g., 0.8) make output more random,
|
|
56
|
-
* lower values (e.g., 0.2) make it more deterministic.
|
|
57
|
-
* @default 0.7
|
|
58
|
-
*/
|
|
59
|
-
temperature?: number;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* A Vue file that can be created, updated, and deleted
|
|
64
|
-
*/
|
|
65
|
-
export interface VueFile extends VueFileProps, Resource<"ai::VueFile"> {
|
|
66
|
-
/**
|
|
67
|
-
* Content of the Vue file
|
|
68
|
-
*/
|
|
69
|
-
content: string;
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* Time at which the file was created
|
|
73
|
-
*/
|
|
74
|
-
createdAt: number;
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* Time at which the file was last updated
|
|
78
|
-
*/
|
|
79
|
-
updatedAt: number;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* Default system prompt for Vue file generation
|
|
84
|
-
*/
|
|
85
|
-
const DEFAULT_VUE_SYSTEM_PROMPT =
|
|
86
|
-
"You are a Vue component generator. Create a single Vue component based on the user's requirements. Your response MUST include only a single Vue component inside ```vue fences. Do not include any other text, explanations, or multiple code blocks.";
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Resource for generating Vue files using AI models.
|
|
90
|
-
* Extracts Vue code from between ```vue fences and validates the response.
|
|
91
|
-
*
|
|
92
|
-
* @example
|
|
93
|
-
* // Create a simple Vue component
|
|
94
|
-
* const button = await VueFile("button-component", {
|
|
95
|
-
* path: "./src/components/Button.vue",
|
|
96
|
-
* prompt: await alchemy`
|
|
97
|
-
* Generate a customizable button Vue component with:
|
|
98
|
-
* - Primary, secondary, and outline variants
|
|
99
|
-
* - Small, medium, and large sizes
|
|
100
|
-
* - Loading state with spinner
|
|
101
|
-
* - Disabled state
|
|
102
|
-
* `,
|
|
103
|
-
* model: {
|
|
104
|
-
* id: "gpt-4o",
|
|
105
|
-
* provider: "openai"
|
|
106
|
-
* }
|
|
107
|
-
* });
|
|
108
|
-
*
|
|
109
|
-
* @example
|
|
110
|
-
* // Generate a Vue component using existing files as reference
|
|
111
|
-
* const userCard = await VueFile("user-card", {
|
|
112
|
-
* path: "./src/components/UserCard.vue",
|
|
113
|
-
* prompt: await alchemy`
|
|
114
|
-
* Create a UserCard Vue component that displays user information.
|
|
115
|
-
* Follow the styling patterns from:
|
|
116
|
-
* ${alchemy.file("src/components/Card.vue")}
|
|
117
|
-
*
|
|
118
|
-
* Use the user type from:
|
|
119
|
-
* ${alchemy.file("src/types/User.ts")}
|
|
120
|
-
* `,
|
|
121
|
-
* temperature: 0.2
|
|
122
|
-
* });
|
|
123
|
-
*
|
|
124
|
-
* @example
|
|
125
|
-
* // Generate a complex form component with validation and custom system prompt
|
|
126
|
-
* const form = await VueFile("registration-form", {
|
|
127
|
-
* path: "./src/components/RegistrationForm.vue",
|
|
128
|
-
* prompt: await alchemy`
|
|
129
|
-
* Generate a registration form Vue component with:
|
|
130
|
-
* - Email, password, and confirm password fields
|
|
131
|
-
* - Form validation using Vuelidate or similar
|
|
132
|
-
* - Error messages for each field
|
|
133
|
-
* - Submit handler that emits form data
|
|
134
|
-
*
|
|
135
|
-
* Follow these style guidelines:
|
|
136
|
-
* ${alchemy.file("src/styles/guidelines.md")}
|
|
137
|
-
* `,
|
|
138
|
-
* system: "You are an expert Vue component creator specializing in form components with validation. Create a single Vue component inside ```vue fences with no additional text.",
|
|
139
|
-
* model: {
|
|
140
|
-
* id: "claude-3-opus-20240229",
|
|
141
|
-
* provider: "anthropic"
|
|
142
|
-
* }
|
|
143
|
-
* });
|
|
144
|
-
*/
|
|
145
|
-
export const VueFile = Resource(
|
|
146
|
-
"ai::VueFile",
|
|
147
|
-
async function (
|
|
148
|
-
this: Context<VueFile>,
|
|
149
|
-
_id: string,
|
|
150
|
-
props: VueFileProps,
|
|
151
|
-
): Promise<VueFile> {
|
|
152
|
-
// Handle deletion phase
|
|
153
|
-
if (this.phase === "delete") {
|
|
154
|
-
return this.destroy();
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
// Use provided system prompt or default
|
|
158
|
-
const system = props.system || DEFAULT_VUE_SYSTEM_PROMPT;
|
|
159
|
-
|
|
160
|
-
// Generate initial content
|
|
161
|
-
const { text } = await generateText({
|
|
162
|
-
model: createModel(props),
|
|
163
|
-
prompt: props.prompt,
|
|
164
|
-
system,
|
|
165
|
-
providerOptions: props.model?.options,
|
|
166
|
-
...(props.temperature === undefined
|
|
167
|
-
? {}
|
|
168
|
-
: { temperature: props.temperature }),
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
// Extract and validate Vue code
|
|
172
|
-
let { code, error } = await extractVueCode(text);
|
|
173
|
-
|
|
174
|
-
// Re-prompt if there are validation errors
|
|
175
|
-
if (error) {
|
|
176
|
-
const errorSystem = `${system}\n\nERROR: ${error}\n\nPlease try again and ensure your response contains exactly one Vue component inside \`\`\`vue fences.`;
|
|
177
|
-
|
|
178
|
-
const { text: retryText } = await generateText({
|
|
179
|
-
model: createModel(props),
|
|
180
|
-
prompt: props.prompt,
|
|
181
|
-
system: errorSystem,
|
|
182
|
-
providerOptions: props.model?.options,
|
|
183
|
-
...(props.temperature === undefined
|
|
184
|
-
? {}
|
|
185
|
-
: { temperature: props.temperature }),
|
|
186
|
-
});
|
|
187
|
-
|
|
188
|
-
const retryResult = await extractVueCode(retryText);
|
|
189
|
-
|
|
190
|
-
if (retryResult.error) {
|
|
191
|
-
throw new Error(
|
|
192
|
-
`Failed to generate valid Vue code: ${retryResult.error}`,
|
|
193
|
-
);
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
code = retryResult.code;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
// Use StaticVueFile to create/update the file
|
|
200
|
-
const file = await StaticVueFile("file", props.path, code);
|
|
201
|
-
|
|
202
|
-
// Return the resource
|
|
203
|
-
return this({
|
|
204
|
-
...props,
|
|
205
|
-
content: file.content,
|
|
206
|
-
createdAt: Date.now(),
|
|
207
|
-
updatedAt: Date.now(),
|
|
208
|
-
});
|
|
209
|
-
},
|
|
210
|
-
);
|
|
211
|
-
|
|
212
|
-
/**
|
|
213
|
-
* Extracts Vue code from between ```vue fences
|
|
214
|
-
* Validates that exactly one Vue code block exists
|
|
215
|
-
*
|
|
216
|
-
* @param text The text to extract Vue code from
|
|
217
|
-
* @returns The extracted Vue code or error message
|
|
218
|
-
*/
|
|
219
|
-
async function extractVueCode(
|
|
220
|
-
text: string,
|
|
221
|
-
): Promise<{ code: string; error?: string }> {
|
|
222
|
-
const vueCodeRegex = /```vue\s*([\s\S]*?)```/g;
|
|
223
|
-
const matches = Array.from(text.matchAll(vueCodeRegex));
|
|
224
|
-
|
|
225
|
-
if (matches.length === 0) {
|
|
226
|
-
return {
|
|
227
|
-
code: "",
|
|
228
|
-
error:
|
|
229
|
-
"No Vue code block found in the response. Please include your code within ```vue fences.",
|
|
230
|
-
};
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
if (matches.length > 1) {
|
|
234
|
-
return {
|
|
235
|
-
code: "",
|
|
236
|
-
error:
|
|
237
|
-
"Multiple Vue code blocks found in the response. Please provide exactly one code block within ```vue fences.",
|
|
238
|
-
};
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
return { code: matches[0][1].trim() };
|
|
242
|
-
}
|
package/src/ai/yaml-file.ts
DELETED
|
@@ -1,328 +0,0 @@
|
|
|
1
|
-
import { generateObject, generateText } from "ai";
|
|
2
|
-
import type { JsonSchema, Type, type } from "arktype";
|
|
3
|
-
import type { Context } from "../context.ts";
|
|
4
|
-
import { StaticYamlFile } from "../fs/static-yaml-file.ts";
|
|
5
|
-
import { Resource } from "../resource.ts";
|
|
6
|
-
import type { Secret } from "../secret.ts";
|
|
7
|
-
import { ark } from "./ark.ts";
|
|
8
|
-
import { type ModelConfig, createModel } from "./client.ts";
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Properties for creating or updating a YAMLFile
|
|
12
|
-
*/
|
|
13
|
-
export interface YAMLFileProps<
|
|
14
|
-
T extends Type<any, any> | undefined = undefined,
|
|
15
|
-
> {
|
|
16
|
-
/**
|
|
17
|
-
* Path to the YAML file
|
|
18
|
-
*/
|
|
19
|
-
path: string;
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Optional ArkType schema to validate and structure the generated YAML
|
|
23
|
-
* When provided, the resource will use generateObject with schema validation
|
|
24
|
-
* When not provided, it will extract YAML from between ```yaml fences
|
|
25
|
-
*/
|
|
26
|
-
schema?: T;
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Base URL for the OpenAI API
|
|
30
|
-
* @default 'https://api.openai.com/v1'
|
|
31
|
-
*/
|
|
32
|
-
baseURL?: string;
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Prompt for generating content
|
|
36
|
-
* Use alchemy template literals to include file context:
|
|
37
|
-
* @example
|
|
38
|
-
* prompt: await alchemy`
|
|
39
|
-
* Generate a YAML configuration for:
|
|
40
|
-
* ${alchemy.file("src/serverless.js")}
|
|
41
|
-
* `
|
|
42
|
-
*/
|
|
43
|
-
prompt: string;
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* System prompt for the model
|
|
47
|
-
* This is used to provide instructions to the model about how to format the response
|
|
48
|
-
* @default Depends on whether schema is provided
|
|
49
|
-
*/
|
|
50
|
-
system?: string;
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* OpenAI API key to use for generating content
|
|
54
|
-
* If not provided, will use OPENAI_API_KEY environment variable
|
|
55
|
-
*/
|
|
56
|
-
apiKey?: Secret;
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Model configuration
|
|
60
|
-
*/
|
|
61
|
-
model?: ModelConfig;
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Temperature for controlling randomness in generation.
|
|
65
|
-
* Higher values (e.g., 0.8) make output more random,
|
|
66
|
-
* lower values (e.g., 0.2) make it more deterministic.
|
|
67
|
-
* @default 0.7
|
|
68
|
-
*/
|
|
69
|
-
temperature?: number;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* A YAML file that can be created, updated, and deleted
|
|
74
|
-
*/
|
|
75
|
-
export interface YAMLFile<T = any>
|
|
76
|
-
extends Omit<YAMLFileProps, "schema">,
|
|
77
|
-
Resource<"ai::YAMLFile"> {
|
|
78
|
-
/**
|
|
79
|
-
* Content of the YAML file as a string
|
|
80
|
-
*/
|
|
81
|
-
content: string;
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* Parsed YAML object
|
|
85
|
-
*/
|
|
86
|
-
yaml: T;
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Schema used to validate the YAML (if provided)
|
|
90
|
-
*/
|
|
91
|
-
schema?: JsonSchema;
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* Time at which the file was created
|
|
95
|
-
*/
|
|
96
|
-
createdAt: number;
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Time at which the file was last updated
|
|
100
|
-
*/
|
|
101
|
-
updatedAt: number;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* Default system prompt for YAML file generation without schema
|
|
106
|
-
*/
|
|
107
|
-
const DEFAULT_YAML_SYSTEM_PROMPT =
|
|
108
|
-
"You are a YAML generator. Create valid YAML based on the user's requirements. Your response MUST include only YAML inside ```yaml fences. Do not include any other text, explanations, or multiple code blocks. Use standard YAML syntax with proper indentation. Use quotes around strings that contain special characters when necessary.";
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Resource for generating YAML files using AI models.
|
|
112
|
-
* Can operate in two modes:
|
|
113
|
-
* 1. With schema: Uses generateObject with type validation, then converts to YAML
|
|
114
|
-
* 2. Without schema: Extracts YAML from between ```yaml fences
|
|
115
|
-
*
|
|
116
|
-
* @example
|
|
117
|
-
* // Generate a serverless configuration file
|
|
118
|
-
* const serverlessConfig = await YAMLFile("serverless-config", {
|
|
119
|
-
* path: "./serverless.yml",
|
|
120
|
-
* prompt: await alchemy`
|
|
121
|
-
* Generate a serverless.yml configuration for an AWS Lambda API with:
|
|
122
|
-
* - A service name "user-api"
|
|
123
|
-
* - Node.js 16.x runtime
|
|
124
|
-
* - Three functions: createUser, getUser, and listUsers
|
|
125
|
-
* - API Gateway endpoints for each function
|
|
126
|
-
* - DynamoDB table for users
|
|
127
|
-
* - IAM permissions for DynamoDB access
|
|
128
|
-
* `,
|
|
129
|
-
* model: {
|
|
130
|
-
* id: "gpt-4o",
|
|
131
|
-
* provider: "openai"
|
|
132
|
-
* }
|
|
133
|
-
* });
|
|
134
|
-
*
|
|
135
|
-
* @example
|
|
136
|
-
* // Generate YAML with schema validation
|
|
137
|
-
* import { type } from "arktype";
|
|
138
|
-
*
|
|
139
|
-
* const k8sConfigSchema = type({
|
|
140
|
-
* apiVersion: "string",
|
|
141
|
-
* kind: "string",
|
|
142
|
-
* metadata: {
|
|
143
|
-
* name: "string",
|
|
144
|
-
* namespace: "string?",
|
|
145
|
-
* labels: "Record<string, string>?"
|
|
146
|
-
* },
|
|
147
|
-
* spec: {
|
|
148
|
-
* replicas: "number",
|
|
149
|
-
* selector: {
|
|
150
|
-
* matchLabels: "Record<string, string>"
|
|
151
|
-
* },
|
|
152
|
-
* template: {
|
|
153
|
-
* metadata: {
|
|
154
|
-
* labels: "Record<string, string>"
|
|
155
|
-
* },
|
|
156
|
-
* spec: {
|
|
157
|
-
* containers: [{
|
|
158
|
-
* name: "string",
|
|
159
|
-
* image: "string",
|
|
160
|
-
* ports: [{
|
|
161
|
-
* containerPort: "number"
|
|
162
|
-
* }]
|
|
163
|
-
* }]
|
|
164
|
-
* }
|
|
165
|
-
* }
|
|
166
|
-
* }
|
|
167
|
-
* });
|
|
168
|
-
*
|
|
169
|
-
* const deployment = await YAMLFile("k8s-deployment", {
|
|
170
|
-
* path: "./kubernetes/deployment.yaml",
|
|
171
|
-
* schema: k8sConfigSchema,
|
|
172
|
-
* prompt: "Generate a Kubernetes deployment for a web application named 'frontend' with 3 replicas using the nginx:latest image and exposing port 80",
|
|
173
|
-
* temperature: 0.2
|
|
174
|
-
* });
|
|
175
|
-
*
|
|
176
|
-
* @example
|
|
177
|
-
* // Generate GitHub Actions workflow with custom system prompt
|
|
178
|
-
* const workflow = await YAMLFile("github-workflow", {
|
|
179
|
-
* path: "./.github/workflows/ci.yml",
|
|
180
|
-
* prompt: await alchemy`
|
|
181
|
-
* Create a GitHub Actions workflow for a Node.js project that:
|
|
182
|
-
* - Runs on push to main and pull requests
|
|
183
|
-
* - Sets up Node.js 18
|
|
184
|
-
* - Installs dependencies with npm
|
|
185
|
-
* - Runs linting and tests
|
|
186
|
-
* - Builds the project
|
|
187
|
-
* - Deploys to GitHub Pages on success (main branch only)
|
|
188
|
-
* `,
|
|
189
|
-
* system: "You are a DevOps expert specializing in GitHub Actions workflows. Create a single YAML file inside ```yaml fences with no additional text. Follow GitHub Actions best practices and use proper YAML syntax.",
|
|
190
|
-
* model: {
|
|
191
|
-
* id: "claude-3-opus-20240229",
|
|
192
|
-
* provider: "anthropic"
|
|
193
|
-
* }
|
|
194
|
-
* });
|
|
195
|
-
*/
|
|
196
|
-
export const YAMLFile = Resource("ai::YAMLFile", async function <
|
|
197
|
-
const T extends Type<any, any> | undefined = undefined,
|
|
198
|
-
>(this: Context<YAMLFile<T extends Type<any, any> ? type.infer<T> : any>>, _id: string, props: YAMLFileProps<T>): Promise<
|
|
199
|
-
YAMLFile<T extends Type<any, any> ? type.infer<T> : any>
|
|
200
|
-
> {
|
|
201
|
-
// Handle deletion phase
|
|
202
|
-
if (this.phase === "delete") {
|
|
203
|
-
return this.destroy();
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
let yamlContent: string;
|
|
207
|
-
let yamlObject: any;
|
|
208
|
-
|
|
209
|
-
// Check if schema is provided
|
|
210
|
-
if (props.schema) {
|
|
211
|
-
// Use schema-based generation
|
|
212
|
-
const { object } = await generateObject({
|
|
213
|
-
model: createModel(props),
|
|
214
|
-
schema: ark.schema<type.infer<typeof props.schema>>(props.schema),
|
|
215
|
-
providerOptions: props.model?.options,
|
|
216
|
-
system:
|
|
217
|
-
props.system ||
|
|
218
|
-
"Generate a valid object based on the provided requirements.",
|
|
219
|
-
prompt: props.prompt,
|
|
220
|
-
...(props.temperature === undefined
|
|
221
|
-
? {}
|
|
222
|
-
: { temperature: props.temperature }),
|
|
223
|
-
});
|
|
224
|
-
|
|
225
|
-
yamlObject = object;
|
|
226
|
-
|
|
227
|
-
// Let StaticYamlFile handle the YAML conversion
|
|
228
|
-
const file = await StaticYamlFile("file", props.path, yamlObject);
|
|
229
|
-
yamlContent = file.content;
|
|
230
|
-
} else {
|
|
231
|
-
// Use fence-based extraction
|
|
232
|
-
// Use provided system prompt or default
|
|
233
|
-
const system = props.system || DEFAULT_YAML_SYSTEM_PROMPT;
|
|
234
|
-
|
|
235
|
-
// Generate initial content
|
|
236
|
-
const { text } = await generateText({
|
|
237
|
-
model: createModel(props),
|
|
238
|
-
prompt: props.prompt,
|
|
239
|
-
system,
|
|
240
|
-
providerOptions: props.model?.options,
|
|
241
|
-
...(props.temperature === undefined
|
|
242
|
-
? {}
|
|
243
|
-
: { temperature: props.temperature }),
|
|
244
|
-
});
|
|
245
|
-
|
|
246
|
-
// Extract and validate YAML content
|
|
247
|
-
let { content, error } = await extractYAMLContent(text);
|
|
248
|
-
|
|
249
|
-
// Re-prompt if there are validation errors
|
|
250
|
-
if (error) {
|
|
251
|
-
const errorSystem = `${system}\n\nERROR: ${error}\n\nPlease try again and ensure your response contains exactly one YAML block inside \`\`\`yaml fences.`;
|
|
252
|
-
|
|
253
|
-
const { text: retryText } = await generateText({
|
|
254
|
-
model: createModel(props),
|
|
255
|
-
prompt: props.prompt,
|
|
256
|
-
system: errorSystem,
|
|
257
|
-
providerOptions: props.model?.options,
|
|
258
|
-
...(props.temperature === undefined
|
|
259
|
-
? {}
|
|
260
|
-
: { temperature: props.temperature }),
|
|
261
|
-
});
|
|
262
|
-
|
|
263
|
-
const retryResult = await extractYAMLContent(retryText);
|
|
264
|
-
|
|
265
|
-
if (retryResult.error) {
|
|
266
|
-
throw new Error(`Failed to generate valid YAML: ${retryResult.error}`);
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
content = retryResult.content;
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
yamlContent = content;
|
|
273
|
-
|
|
274
|
-
// Create the file with the string content
|
|
275
|
-
const _file = await StaticYamlFile("file", props.path, yamlContent);
|
|
276
|
-
|
|
277
|
-
// We need to parse the YAML to get the object representation
|
|
278
|
-
const yaml = await import("yaml");
|
|
279
|
-
yamlObject = yaml.parse(yamlContent);
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
// Return the resource
|
|
283
|
-
return this({
|
|
284
|
-
...props,
|
|
285
|
-
schema: props.schema,
|
|
286
|
-
content: yamlContent,
|
|
287
|
-
yaml: yamlObject,
|
|
288
|
-
createdAt: Date.now(),
|
|
289
|
-
updatedAt: Date.now(),
|
|
290
|
-
});
|
|
291
|
-
});
|
|
292
|
-
|
|
293
|
-
/**
|
|
294
|
-
* Extracts YAML content from between ```yaml fences
|
|
295
|
-
* Validates that exactly one YAML code block exists
|
|
296
|
-
*
|
|
297
|
-
* @param text The text to extract YAML from
|
|
298
|
-
* @returns The extracted YAML or error message
|
|
299
|
-
*/
|
|
300
|
-
async function extractYAMLContent(
|
|
301
|
-
text: string,
|
|
302
|
-
): Promise<{ content: string; error?: string }> {
|
|
303
|
-
// Check for yaml or yml fence blocks
|
|
304
|
-
const yamlCodeRegex = /```(yaml|yml)\s*([\s\S]*?)```/g;
|
|
305
|
-
const matches = Array.from(text.matchAll(yamlCodeRegex));
|
|
306
|
-
|
|
307
|
-
if (matches.length === 0) {
|
|
308
|
-
return {
|
|
309
|
-
content: "",
|
|
310
|
-
error:
|
|
311
|
-
"No YAML code block found in the response. Please include your YAML within ```yaml fences.",
|
|
312
|
-
};
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
if (matches.length > 1) {
|
|
316
|
-
return {
|
|
317
|
-
content: "",
|
|
318
|
-
error:
|
|
319
|
-
"Multiple YAML code blocks found in the response. Please provide exactly one YAML block within ```yaml fences.",
|
|
320
|
-
};
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
const content = matches[0][2].trim();
|
|
324
|
-
|
|
325
|
-
// We don't validate YAML parsing here because js-yaml might not be available
|
|
326
|
-
// Validation will happen at usage time if needed
|
|
327
|
-
return { content };
|
|
328
|
-
}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { File } from "./file.ts";
|
|
2
|
-
|
|
3
|
-
export type StaticAstroFile = File;
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Creates a static Astro component file
|
|
7
|
-
*
|
|
8
|
-
* @example
|
|
9
|
-
* // Create an Astro component file with content
|
|
10
|
-
* const header = await StaticAstroFile("Header.astro",
|
|
11
|
-
* `---
|
|
12
|
-
* import Logo from '../components/Logo.astro';
|
|
13
|
-
* const navItems = ['Home', 'About', 'Contact'];
|
|
14
|
-
* ---
|
|
15
|
-
*
|
|
16
|
-
* <header class="header">
|
|
17
|
-
* <Logo />
|
|
18
|
-
* <nav>
|
|
19
|
-
* <ul>
|
|
20
|
-
* {navItems.map(item => (
|
|
21
|
-
* <li><a href={`/${item.toLowerCase()}`}>{item}</a></li>
|
|
22
|
-
* ))}
|
|
23
|
-
* </ul>
|
|
24
|
-
* </nav>
|
|
25
|
-
* </header>
|
|
26
|
-
*
|
|
27
|
-
* <style>
|
|
28
|
-
* .header {
|
|
29
|
-
* display: flex;
|
|
30
|
-
* justify-content: space-between;
|
|
31
|
-
* padding: 1rem;
|
|
32
|
-
* }
|
|
33
|
-
* </style>`
|
|
34
|
-
* );
|
|
35
|
-
*/
|
|
36
|
-
export function StaticAstroFile(
|
|
37
|
-
id: string,
|
|
38
|
-
...args: [content: string] | [path: string, content: string]
|
|
39
|
-
): Promise<StaticAstroFile> {
|
|
40
|
-
const [path, content] = args.length === 1 ? [id, args[0]] : args;
|
|
41
|
-
return File(id, {
|
|
42
|
-
path,
|
|
43
|
-
content,
|
|
44
|
-
});
|
|
45
|
-
}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { File } from "./file.ts";
|
|
2
|
-
|
|
3
|
-
export type StaticCSSFile = File;
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Creates a static CSS file
|
|
7
|
-
*
|
|
8
|
-
* @example
|
|
9
|
-
* // Create a CSS file with styles
|
|
10
|
-
* const styles = await StaticCSSFile("styles.css",
|
|
11
|
-
* `.container {
|
|
12
|
-
* max-width: 1200px;
|
|
13
|
-
* margin: 0 auto;
|
|
14
|
-
* padding: 0 1rem;
|
|
15
|
-
* }
|
|
16
|
-
*
|
|
17
|
-
* .button {
|
|
18
|
-
* background-color: #0062ff;
|
|
19
|
-
* color: white;
|
|
20
|
-
* border: none;
|
|
21
|
-
* padding: 0.5rem 1rem;
|
|
22
|
-
* border-radius: 4px;
|
|
23
|
-
* }`
|
|
24
|
-
* );
|
|
25
|
-
*/
|
|
26
|
-
export function StaticCSSFile(
|
|
27
|
-
id: string,
|
|
28
|
-
...args: [content: string] | [path: string, content: string]
|
|
29
|
-
): Promise<StaticCSSFile> {
|
|
30
|
-
const [path, content] = args.length === 1 ? [id, args[0]] : args;
|
|
31
|
-
return File(id, {
|
|
32
|
-
path,
|
|
33
|
-
content,
|
|
34
|
-
});
|
|
35
|
-
}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { File } from "./file.ts";
|
|
2
|
-
|
|
3
|
-
export type StaticHTMLFile = File;
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Creates a static HTML file
|
|
7
|
-
*
|
|
8
|
-
* @example
|
|
9
|
-
* // Create an HTML file with content
|
|
10
|
-
* const page = await StaticHTMLFile("index.html",
|
|
11
|
-
* `<!DOCTYPE html>
|
|
12
|
-
* <html lang="en">
|
|
13
|
-
* <head>
|
|
14
|
-
* <meta charset="UTF-8">
|
|
15
|
-
* <meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
16
|
-
* <title>My Website</title>
|
|
17
|
-
* <link rel="stylesheet" href="styles.css">
|
|
18
|
-
* </head>
|
|
19
|
-
* <body>
|
|
20
|
-
* <header>
|
|
21
|
-
* <h1>Welcome to My Website</h1>
|
|
22
|
-
* </header>
|
|
23
|
-
* <main>
|
|
24
|
-
* <p>This is the main content of the page.</p>
|
|
25
|
-
* </main>
|
|
26
|
-
* <footer>
|
|
27
|
-
* <p>© 2024 My Company</p>
|
|
28
|
-
* </footer>
|
|
29
|
-
* </body>
|
|
30
|
-
* </html>`
|
|
31
|
-
* );
|
|
32
|
-
*/
|
|
33
|
-
export function StaticHTMLFile(
|
|
34
|
-
id: string,
|
|
35
|
-
...args: [content: string] | [path: string, content: string]
|
|
36
|
-
): Promise<StaticHTMLFile> {
|
|
37
|
-
const [path, content] = args.length === 1 ? [id, args[0]] : args;
|
|
38
|
-
return File(id, {
|
|
39
|
-
path,
|
|
40
|
-
content,
|
|
41
|
-
});
|
|
42
|
-
}
|