alchemy 2.0.0-beta.10 → 2.0.0-beta.13
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 +1122 -450
- package/bin/alchemy.js.map +1 -1
- package/bin/alchemy.sh +15 -0
- package/bin/alchemy.ts +22 -727
- package/bin/commands/_shared.ts +237 -0
- package/bin/commands/bootstrap.ts +117 -0
- package/bin/commands/deploy.ts +144 -0
- package/bin/commands/login.ts +93 -0
- package/bin/commands/logs.ts +157 -0
- package/bin/commands/tail.ts +138 -0
- package/lib/AWS/AuthProvider.d.ts +7 -71
- package/lib/AWS/AuthProvider.d.ts.map +1 -1
- package/lib/AWS/AuthProvider.js +27 -22
- package/lib/AWS/AuthProvider.js.map +1 -1
- package/lib/AWS/AutoScaling/LaunchTemplate.d.ts +3 -3
- package/lib/AWS/AutoScaling/LaunchTemplate.d.ts.map +1 -1
- package/lib/AWS/AutoScaling/LaunchTemplate.js +2 -2
- package/lib/AWS/AutoScaling/LaunchTemplate.js.map +1 -1
- package/lib/AWS/Bootstrap.d.ts +2 -1
- package/lib/AWS/Bootstrap.d.ts.map +1 -1
- package/lib/AWS/Bootstrap.js +27 -29
- package/lib/AWS/Bootstrap.js.map +1 -1
- package/lib/AWS/CloudWatch/Alarm.d.ts +2 -2
- package/lib/AWS/CloudWatch/Alarm.d.ts.map +1 -1
- package/lib/AWS/CloudWatch/Alarm.js +2 -2
- package/lib/AWS/CloudWatch/Alarm.js.map +1 -1
- package/lib/AWS/CloudWatch/AlarmMuteRule.d.ts +2 -2
- package/lib/AWS/CloudWatch/AlarmMuteRule.d.ts.map +1 -1
- package/lib/AWS/CloudWatch/AlarmMuteRule.js +2 -2
- package/lib/AWS/CloudWatch/AlarmMuteRule.js.map +1 -1
- package/lib/AWS/CloudWatch/CompositeAlarm.d.ts +2 -2
- package/lib/AWS/CloudWatch/CompositeAlarm.d.ts.map +1 -1
- package/lib/AWS/CloudWatch/CompositeAlarm.js +2 -2
- package/lib/AWS/CloudWatch/CompositeAlarm.js.map +1 -1
- package/lib/AWS/CloudWatch/Dashboard.d.ts +2 -2
- package/lib/AWS/CloudWatch/Dashboard.d.ts.map +1 -1
- package/lib/AWS/CloudWatch/Dashboard.js +2 -2
- package/lib/AWS/CloudWatch/Dashboard.js.map +1 -1
- package/lib/AWS/CloudWatch/InsightRule.d.ts +2 -2
- package/lib/AWS/CloudWatch/InsightRule.d.ts.map +1 -1
- package/lib/AWS/CloudWatch/InsightRule.js +2 -2
- package/lib/AWS/CloudWatch/InsightRule.js.map +1 -1
- package/lib/AWS/CloudWatch/MetricStream.d.ts +2 -2
- package/lib/AWS/CloudWatch/MetricStream.d.ts.map +1 -1
- package/lib/AWS/CloudWatch/MetricStream.js +2 -2
- package/lib/AWS/CloudWatch/MetricStream.js.map +1 -1
- package/lib/AWS/Credentials.d.ts +5 -10
- package/lib/AWS/Credentials.d.ts.map +1 -1
- package/lib/AWS/Credentials.js +6 -30
- package/lib/AWS/Credentials.js.map +1 -1
- package/lib/AWS/DynamoDB/Table.d.ts +1 -1
- package/lib/AWS/DynamoDB/Table.d.ts.map +1 -1
- package/lib/AWS/EC2/EIP.d.ts +3 -3
- package/lib/AWS/EC2/EIP.d.ts.map +1 -1
- package/lib/AWS/EC2/EIP.js +2 -2
- package/lib/AWS/EC2/EIP.js.map +1 -1
- package/lib/AWS/EC2/EgressOnlyInternetGateway.d.ts +3 -3
- package/lib/AWS/EC2/EgressOnlyInternetGateway.d.ts.map +1 -1
- package/lib/AWS/EC2/EgressOnlyInternetGateway.js +2 -2
- package/lib/AWS/EC2/EgressOnlyInternetGateway.js.map +1 -1
- package/lib/AWS/EC2/Instance.d.ts +3 -3
- package/lib/AWS/EC2/Instance.d.ts.map +1 -1
- package/lib/AWS/EC2/Instance.js +2 -2
- package/lib/AWS/EC2/Instance.js.map +1 -1
- package/lib/AWS/EC2/InternetGateway.d.ts +3 -3
- package/lib/AWS/EC2/InternetGateway.d.ts.map +1 -1
- package/lib/AWS/EC2/InternetGateway.js +2 -2
- package/lib/AWS/EC2/InternetGateway.js.map +1 -1
- package/lib/AWS/EC2/NatGateway.d.ts +3 -3
- package/lib/AWS/EC2/NatGateway.d.ts.map +1 -1
- package/lib/AWS/EC2/NatGateway.js +2 -2
- package/lib/AWS/EC2/NatGateway.js.map +1 -1
- package/lib/AWS/EC2/Network.d.ts +1 -1
- package/lib/AWS/EC2/NetworkAcl.d.ts +3 -3
- package/lib/AWS/EC2/NetworkAcl.d.ts.map +1 -1
- package/lib/AWS/EC2/NetworkAcl.js +2 -2
- package/lib/AWS/EC2/NetworkAcl.js.map +1 -1
- package/lib/AWS/EC2/RouteTable.d.ts +3 -3
- package/lib/AWS/EC2/RouteTable.d.ts.map +1 -1
- package/lib/AWS/EC2/RouteTable.js +2 -2
- package/lib/AWS/EC2/RouteTable.js.map +1 -1
- package/lib/AWS/EC2/SecurityGroup.d.ts +3 -3
- package/lib/AWS/EC2/SecurityGroup.d.ts.map +1 -1
- package/lib/AWS/EC2/SecurityGroup.js +2 -2
- package/lib/AWS/EC2/SecurityGroup.js.map +1 -1
- package/lib/AWS/EC2/Subnet.d.ts +1 -1
- package/lib/AWS/EC2/Subnet.d.ts.map +1 -1
- package/lib/AWS/EC2/Vpc.d.ts +3 -3
- package/lib/AWS/EC2/Vpc.d.ts.map +1 -1
- package/lib/AWS/EC2/Vpc.js +2 -2
- package/lib/AWS/EC2/Vpc.js.map +1 -1
- package/lib/AWS/EC2/VpcEndpoint.d.ts +3 -3
- package/lib/AWS/EC2/VpcEndpoint.d.ts.map +1 -1
- package/lib/AWS/EC2/VpcEndpoint.js +2 -2
- package/lib/AWS/EC2/VpcEndpoint.js.map +1 -1
- package/lib/AWS/ECR/Repository.d.ts +1 -1
- package/lib/AWS/ECR/Repository.d.ts.map +1 -1
- package/lib/AWS/ECR/Repository.js +0 -1
- package/lib/AWS/ECR/Repository.js.map +1 -1
- package/lib/AWS/ECS/Cluster.d.ts +2 -2
- package/lib/AWS/ECS/Cluster.d.ts.map +1 -1
- package/lib/AWS/ECS/Cluster.js +2 -2
- package/lib/AWS/ECS/Cluster.js.map +1 -1
- package/lib/AWS/ECS/Service.d.ts +1 -1
- package/lib/AWS/ECS/Service.d.ts.map +1 -1
- package/lib/AWS/ECS/Task.d.ts +2 -2
- package/lib/AWS/ECS/Task.d.ts.map +1 -1
- package/lib/AWS/ECS/Task.js +2 -2
- package/lib/AWS/ECS/Task.js.map +1 -1
- package/lib/AWS/EKS/Cluster.d.ts +1 -1
- package/lib/AWS/EKS/Cluster.d.ts.map +1 -1
- package/lib/AWS/ELBv2/Listener.d.ts +1 -1
- package/lib/AWS/ELBv2/Listener.d.ts.map +1 -1
- package/lib/AWS/ELBv2/LoadBalancer.d.ts +1 -1
- package/lib/AWS/ELBv2/LoadBalancer.d.ts.map +1 -1
- package/lib/AWS/ELBv2/TargetGroup.d.ts +1 -1
- package/lib/AWS/ELBv2/TargetGroup.d.ts.map +1 -1
- package/lib/AWS/Endpoint.d.ts +7 -2
- package/lib/AWS/Endpoint.d.ts.map +1 -1
- package/lib/AWS/Endpoint.js +7 -2
- package/lib/AWS/Endpoint.js.map +1 -1
- package/lib/AWS/Environment.d.ts +68 -0
- package/lib/AWS/Environment.d.ts.map +1 -0
- package/lib/AWS/Environment.js +53 -0
- package/lib/AWS/Environment.js.map +1 -0
- package/lib/AWS/EventBridge/EventBus.d.ts +2 -2
- package/lib/AWS/EventBridge/EventBus.d.ts.map +1 -1
- package/lib/AWS/EventBridge/EventBus.js +2 -2
- package/lib/AWS/EventBridge/EventBus.js.map +1 -1
- package/lib/AWS/EventBridge/ListRules.d.ts +2 -2
- package/lib/AWS/EventBridge/ListRules.d.ts.map +1 -1
- package/lib/AWS/EventBridge/ListRules.js +2 -2
- package/lib/AWS/EventBridge/ListRules.js.map +1 -1
- package/lib/AWS/EventBridge/PutEvents.d.ts +2 -2
- package/lib/AWS/EventBridge/PutEvents.d.ts.map +1 -1
- package/lib/AWS/EventBridge/PutEvents.js +2 -2
- package/lib/AWS/EventBridge/PutEvents.js.map +1 -1
- package/lib/AWS/EventBridge/Rule.d.ts +2 -2
- package/lib/AWS/EventBridge/Rule.d.ts.map +1 -1
- package/lib/AWS/EventBridge/Rule.js +2 -2
- package/lib/AWS/EventBridge/Rule.js.map +1 -1
- package/lib/AWS/IAM/OpenIDConnectProvider.d.ts +2 -2
- package/lib/AWS/IAM/OpenIDConnectProvider.d.ts.map +1 -1
- package/lib/AWS/IAM/OpenIDConnectProvider.js +2 -2
- package/lib/AWS/IAM/OpenIDConnectProvider.js.map +1 -1
- package/lib/AWS/IAM/Policy.d.ts +3 -3
- package/lib/AWS/IAM/Policy.d.ts.map +1 -1
- package/lib/AWS/IAM/Policy.js +2 -2
- package/lib/AWS/IAM/Policy.js.map +1 -1
- package/lib/AWS/IAM/Role.d.ts +3 -3
- package/lib/AWS/IAM/Role.d.ts.map +1 -1
- package/lib/AWS/IAM/Role.js +3 -3
- package/lib/AWS/IAM/Role.js.map +1 -1
- package/lib/AWS/Kinesis/Stream.d.ts +2 -2
- package/lib/AWS/Kinesis/Stream.d.ts.map +1 -1
- package/lib/AWS/Kinesis/Stream.js +2 -2
- package/lib/AWS/Kinesis/Stream.js.map +1 -1
- package/lib/AWS/Lambda/BucketEventSource.d.ts +1 -1
- package/lib/AWS/Lambda/BucketEventSource.d.ts.map +1 -1
- package/lib/AWS/Lambda/EventBridgeEventSource.d.ts +1 -1
- package/lib/AWS/Lambda/EventBridgeEventSource.d.ts.map +1 -1
- package/lib/AWS/Lambda/EventSourceMapping.d.ts +2 -2
- package/lib/AWS/Lambda/EventSourceMapping.d.ts.map +1 -1
- package/lib/AWS/Lambda/EventSourceMapping.js +2 -2
- package/lib/AWS/Lambda/EventSourceMapping.js.map +1 -1
- package/lib/AWS/Lambda/Function.d.ts +2 -2
- package/lib/AWS/Lambda/Function.d.ts.map +1 -1
- package/lib/AWS/Lambda/Function.js +2 -2
- package/lib/AWS/Lambda/Function.js.map +1 -1
- package/lib/AWS/Lambda/Permission.d.ts +1 -1
- package/lib/AWS/Lambda/Permission.js +1 -1
- package/lib/AWS/Lambda/QueueEventSource.d.ts +1 -1
- package/lib/AWS/Lambda/QueueEventSource.d.ts.map +1 -1
- package/lib/AWS/Lambda/StreamEventSource.d.ts +1 -1
- package/lib/AWS/Lambda/StreamEventSource.d.ts.map +1 -1
- package/lib/AWS/Lambda/TableEventSource.d.ts +1 -1
- package/lib/AWS/Lambda/TableEventSource.d.ts.map +1 -1
- package/lib/AWS/Lambda/TopicEventSource.d.ts +1 -1
- package/lib/AWS/Lambda/TopicEventSource.d.ts.map +1 -1
- package/lib/AWS/Logs/LogGroup.d.ts +3 -3
- package/lib/AWS/Logs/LogGroup.d.ts.map +1 -1
- package/lib/AWS/Logs/LogGroup.js +2 -2
- package/lib/AWS/Logs/LogGroup.js.map +1 -1
- package/lib/AWS/Providers.d.ts +1 -2
- package/lib/AWS/Providers.d.ts.map +1 -1
- package/lib/AWS/Providers.js +3 -3
- package/lib/AWS/Providers.js.map +1 -1
- package/lib/AWS/Region.d.ts +6 -22
- package/lib/AWS/Region.d.ts.map +1 -1
- package/lib/AWS/Region.js +6 -39
- package/lib/AWS/Region.js.map +1 -1
- package/lib/AWS/S3/Bucket.d.ts +2 -2
- package/lib/AWS/S3/Bucket.d.ts.map +1 -1
- package/lib/AWS/S3/Bucket.js +2 -2
- package/lib/AWS/S3/Bucket.js.map +1 -1
- package/lib/AWS/SNS/Topic.d.ts +1 -1
- package/lib/AWS/SNS/Topic.d.ts.map +1 -1
- package/lib/AWS/SQS/Queue.d.ts +3 -3
- package/lib/AWS/SQS/Queue.d.ts.map +1 -1
- package/lib/AWS/SQS/Queue.js +2 -2
- package/lib/AWS/SQS/Queue.js.map +1 -1
- package/lib/AWS/index.d.ts +1 -3
- package/lib/AWS/index.d.ts.map +1 -1
- package/lib/AWS/index.js +1 -3
- package/lib/AWS/index.js.map +1 -1
- package/lib/Apply.d.ts.map +1 -1
- package/lib/Apply.js +2 -2
- package/lib/Apply.js.map +1 -1
- package/lib/Auth/AuthProvider.d.ts +51 -7
- package/lib/Auth/AuthProvider.d.ts.map +1 -1
- package/lib/Auth/AuthProvider.js +37 -0
- package/lib/Auth/AuthProvider.js.map +1 -1
- package/lib/Auth/Profile.d.ts +71 -10
- package/lib/Auth/Profile.d.ts.map +1 -1
- package/lib/Auth/Profile.js +47 -30
- package/lib/Auth/Profile.js.map +1 -1
- package/lib/Auth/index.d.ts +1 -1
- package/lib/Auth/index.d.ts.map +1 -1
- package/lib/Cloudflare/Auth/AuthProvider.d.ts +14 -31
- package/lib/Cloudflare/Auth/AuthProvider.d.ts.map +1 -1
- package/lib/Cloudflare/Auth/AuthProvider.js +59 -38
- package/lib/Cloudflare/Auth/AuthProvider.js.map +1 -1
- package/lib/Cloudflare/CloudflareEnvironment.d.ts +11 -0
- package/lib/Cloudflare/CloudflareEnvironment.d.ts.map +1 -0
- package/lib/Cloudflare/CloudflareEnvironment.js +26 -0
- package/lib/Cloudflare/CloudflareEnvironment.js.map +1 -0
- package/lib/Cloudflare/Container/ContainerApplication.d.ts +70 -42
- package/lib/Cloudflare/Container/ContainerApplication.d.ts.map +1 -1
- package/lib/Cloudflare/Container/ContainerApplication.js +49 -24
- package/lib/Cloudflare/Container/ContainerApplication.js.map +1 -1
- package/lib/Cloudflare/Credentials.d.ts +11 -0
- package/lib/Cloudflare/Credentials.d.ts.map +1 -0
- package/lib/Cloudflare/Credentials.js +34 -0
- package/lib/Cloudflare/Credentials.js.map +1 -0
- package/lib/Cloudflare/D1/D1Database.d.ts +2 -2
- package/lib/Cloudflare/D1/D1Database.d.ts.map +1 -1
- package/lib/Cloudflare/D1/D1Database.js +2 -2
- package/lib/Cloudflare/D1/D1Database.js.map +1 -1
- package/lib/Cloudflare/KV/KVNamespace.d.ts +2 -2
- package/lib/Cloudflare/KV/KVNamespace.d.ts.map +1 -1
- package/lib/Cloudflare/KV/KVNamespace.js +2 -2
- package/lib/Cloudflare/KV/KVNamespace.js.map +1 -1
- package/lib/Cloudflare/Providers.d.ts +2 -3
- package/lib/Cloudflare/Providers.d.ts.map +1 -1
- package/lib/Cloudflare/Providers.js +12 -4
- package/lib/Cloudflare/Providers.js.map +1 -1
- package/lib/Cloudflare/Queue/Queue.d.ts +52 -0
- package/lib/Cloudflare/Queue/Queue.d.ts.map +1 -0
- package/lib/Cloudflare/Queue/Queue.js +136 -0
- package/lib/Cloudflare/Queue/Queue.js.map +1 -0
- package/lib/Cloudflare/Queue/QueueBinding.d.ts +35 -0
- package/lib/Cloudflare/Queue/QueueBinding.d.ts.map +1 -0
- package/lib/Cloudflare/Queue/QueueBinding.js +51 -0
- package/lib/Cloudflare/Queue/QueueBinding.js.map +1 -0
- package/lib/Cloudflare/Queue/QueueConsumer.d.ts +86 -0
- package/lib/Cloudflare/Queue/QueueConsumer.d.ts.map +1 -0
- package/lib/Cloudflare/Queue/QueueConsumer.js +138 -0
- package/lib/Cloudflare/Queue/QueueConsumer.js.map +1 -0
- package/lib/Cloudflare/Queue/index.d.ts +4 -0
- package/lib/Cloudflare/Queue/index.d.ts.map +1 -0
- package/lib/Cloudflare/Queue/index.js +4 -0
- package/lib/Cloudflare/Queue/index.js.map +1 -0
- package/lib/Cloudflare/R2/R2Bucket.d.ts +2 -2
- package/lib/Cloudflare/R2/R2Bucket.d.ts.map +1 -1
- package/lib/Cloudflare/R2/R2Bucket.js +2 -2
- package/lib/Cloudflare/R2/R2Bucket.js.map +1 -1
- package/lib/Cloudflare/SecretsStore/Secret.d.ts +74 -0
- package/lib/Cloudflare/SecretsStore/Secret.d.ts.map +1 -0
- package/lib/Cloudflare/SecretsStore/Secret.js +161 -0
- package/lib/Cloudflare/SecretsStore/Secret.js.map +1 -0
- package/lib/Cloudflare/SecretsStore/SecretBinding.d.ts +42 -0
- package/lib/Cloudflare/SecretsStore/SecretBinding.d.ts.map +1 -0
- package/lib/Cloudflare/SecretsStore/SecretBinding.js +49 -0
- package/lib/Cloudflare/SecretsStore/SecretBinding.js.map +1 -0
- package/lib/Cloudflare/SecretsStore/SecretsStore.d.ts +37 -0
- package/lib/Cloudflare/SecretsStore/SecretsStore.d.ts.map +1 -0
- package/lib/Cloudflare/SecretsStore/SecretsStore.js +88 -0
- package/lib/Cloudflare/SecretsStore/SecretsStore.js.map +1 -0
- package/lib/Cloudflare/SecretsStore/index.d.ts +4 -0
- package/lib/Cloudflare/SecretsStore/index.d.ts.map +1 -0
- package/lib/Cloudflare/SecretsStore/index.js +4 -0
- package/lib/Cloudflare/SecretsStore/index.js.map +1 -0
- package/lib/Cloudflare/Workers/InferEnv.d.ts +1 -1
- package/lib/Cloudflare/Workers/InferEnv.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/Worker.d.ts +5 -3
- package/lib/Cloudflare/Workers/Worker.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/Worker.js +61 -7
- package/lib/Cloudflare/Workers/Worker.js.map +1 -1
- package/lib/Cloudflare/Workers/Workflow.d.ts +10 -4
- package/lib/Cloudflare/Workers/Workflow.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/Workflow.js +3 -3
- package/lib/Cloudflare/Workers/Workflow.js.map +1 -1
- package/lib/Cloudflare/index.d.ts +3 -1
- package/lib/Cloudflare/index.d.ts.map +1 -1
- package/lib/Cloudflare/index.js +3 -1
- package/lib/Cloudflare/index.js.map +1 -1
- package/lib/Stack.d.ts +3 -2
- package/lib/Stack.d.ts.map +1 -1
- package/lib/Stack.js +10 -7
- package/lib/Stack.js.map +1 -1
- package/lib/State/LocalState.d.ts.map +1 -1
- package/lib/State/LocalState.js +40 -12
- package/lib/State/LocalState.js.map +1 -1
- package/lib/Test/Bun.d.ts.map +1 -1
- package/lib/Test/Bun.js +3 -2
- package/lib/Test/Bun.js.map +1 -1
- package/lib/Test/Vitest.d.ts +3 -1
- package/lib/Test/Vitest.d.ts.map +1 -1
- package/lib/Test/Vitest.js +19 -16
- package/lib/Test/Vitest.js.map +1 -1
- package/lib/Util/PlatformServices.d.ts +14 -3
- package/lib/Util/PlatformServices.d.ts.map +1 -1
- package/lib/Util/PlatformServices.js +21 -3
- package/lib/Util/PlatformServices.js.map +1 -1
- package/package.json +5 -5
- package/src/AWS/AuthProvider.ts +67 -67
- package/src/AWS/AutoScaling/LaunchTemplate.ts +3 -3
- package/src/AWS/Bootstrap.ts +32 -37
- package/src/AWS/CloudWatch/Alarm.ts +2 -2
- package/src/AWS/CloudWatch/AlarmMuteRule.ts +2 -2
- package/src/AWS/CloudWatch/CompositeAlarm.ts +2 -2
- package/src/AWS/CloudWatch/Dashboard.ts +2 -2
- package/src/AWS/CloudWatch/InsightRule.ts +2 -2
- package/src/AWS/CloudWatch/MetricStream.ts +2 -2
- package/src/AWS/Credentials.ts +9 -44
- package/src/AWS/DynamoDB/Table.ts +1 -1
- package/src/AWS/EC2/EIP.ts +3 -3
- package/src/AWS/EC2/EgressOnlyInternetGateway.ts +3 -3
- package/src/AWS/EC2/Instance.ts +3 -3
- package/src/AWS/EC2/InternetGateway.ts +3 -3
- package/src/AWS/EC2/NatGateway.ts +3 -3
- package/src/AWS/EC2/NetworkAcl.ts +3 -3
- package/src/AWS/EC2/RouteTable.ts +3 -3
- package/src/AWS/EC2/SecurityGroup.ts +3 -3
- package/src/AWS/EC2/Subnet.ts +1 -1
- package/src/AWS/EC2/Vpc.ts +3 -3
- package/src/AWS/EC2/VpcEndpoint.ts +3 -3
- package/src/AWS/ECR/Repository.ts +1 -1
- package/src/AWS/ECS/Cluster.ts +2 -2
- package/src/AWS/ECS/Service.ts +1 -1
- package/src/AWS/ECS/Task.ts +2 -2
- package/src/AWS/EKS/Cluster.ts +1 -1
- package/src/AWS/ELBv2/Listener.ts +1 -1
- package/src/AWS/ELBv2/LoadBalancer.ts +1 -1
- package/src/AWS/ELBv2/TargetGroup.ts +1 -1
- package/src/AWS/Endpoint.ts +12 -8
- package/src/AWS/Environment.ts +123 -0
- package/src/AWS/EventBridge/EventBus.ts +2 -2
- package/src/AWS/EventBridge/ListRules.ts +2 -2
- package/src/AWS/EventBridge/PutEvents.ts +2 -2
- package/src/AWS/EventBridge/Rule.ts +2 -2
- package/src/AWS/IAM/OpenIDConnectProvider.ts +2 -2
- package/src/AWS/IAM/Policy.ts +3 -3
- package/src/AWS/IAM/Role.ts +4 -4
- package/src/AWS/Kinesis/Stream.ts +2 -2
- package/src/AWS/Lambda/EventSourceMapping.ts +2 -2
- package/src/AWS/Lambda/Function.ts +2 -2
- package/src/AWS/Lambda/Permission.ts +1 -1
- package/src/AWS/Logs/LogGroup.ts +3 -3
- package/src/AWS/Providers.ts +7 -7
- package/src/AWS/Region.ts +9 -66
- package/src/AWS/S3/Bucket.ts +2 -2
- package/src/AWS/SNS/Topic.ts +1 -1
- package/src/AWS/SQS/Queue.ts +3 -3
- package/src/AWS/index.ts +1 -3
- package/src/Apply.ts +55 -57
- package/src/Auth/AuthProvider.ts +188 -8
- package/src/Auth/Profile.ts +117 -54
- package/src/Auth/index.ts +1 -1
- package/src/Cloudflare/Auth/AuthProvider.ts +127 -98
- package/src/Cloudflare/CloudflareEnvironment.ts +49 -0
- package/src/Cloudflare/Container/ContainerApplication.ts +172 -94
- package/src/Cloudflare/Credentials.ts +75 -0
- package/src/Cloudflare/D1/D1Database.ts +2 -2
- package/src/Cloudflare/KV/KVNamespace.ts +2 -2
- package/src/Cloudflare/Providers.ts +20 -10
- package/src/Cloudflare/Queue/Queue.ts +174 -0
- package/src/Cloudflare/Queue/QueueBinding.ts +110 -0
- package/src/Cloudflare/Queue/QueueConsumer.ts +219 -0
- package/src/Cloudflare/Queue/index.ts +3 -0
- package/src/Cloudflare/R2/R2Bucket.ts +2 -2
- package/src/Cloudflare/SecretsStore/Secret.ts +229 -0
- package/src/Cloudflare/SecretsStore/SecretBinding.ts +107 -0
- package/src/Cloudflare/SecretsStore/SecretsStore.ts +106 -0
- package/src/Cloudflare/SecretsStore/index.ts +3 -0
- package/src/Cloudflare/Workers/InferEnv.ts +5 -3
- package/src/Cloudflare/Workers/Worker.ts +63 -7
- package/src/Cloudflare/Workers/Workflow.ts +19 -9
- package/src/Cloudflare/index.ts +3 -1
- package/src/Stack.ts +40 -29
- package/src/State/LocalState.ts +43 -16
- package/src/Test/Bun.ts +3 -0
- package/src/Test/Vitest.ts +31 -23
- package/src/Util/PlatformServices.ts +54 -13
- package/bin/process-manager.ts +0 -10
- package/lib/AWS/Account.d.ts +0 -26
- package/lib/AWS/Account.d.ts.map +0 -1
- package/lib/AWS/Account.js +0 -32
- package/lib/AWS/Account.js.map +0 -1
- package/lib/AWS/Profile.d.ts +0 -6
- package/lib/AWS/Profile.d.ts.map +0 -1
- package/lib/AWS/Profile.js +0 -4
- package/lib/AWS/Profile.js.map +0 -1
- package/lib/AWS/StageConfig.d.ts +0 -25
- package/lib/AWS/StageConfig.d.ts.map +0 -1
- package/lib/AWS/StageConfig.js +0 -23
- package/lib/AWS/StageConfig.js.map +0 -1
- package/lib/Cloudflare/Account.d.ts +0 -10
- package/lib/Cloudflare/Account.d.ts.map +0 -1
- package/lib/Cloudflare/Account.js +0 -24
- package/lib/Cloudflare/Account.js.map +0 -1
- package/lib/Cloudflare/StageConfig.d.ts +0 -8
- package/lib/Cloudflare/StageConfig.d.ts.map +0 -1
- package/lib/Cloudflare/StageConfig.js +0 -4
- package/lib/Cloudflare/StageConfig.js.map +0 -1
- package/src/AWS/Account.ts +0 -56
- package/src/AWS/Profile.ts +0 -5
- package/src/AWS/StageConfig.ts +0 -44
- package/src/Cloudflare/Account.ts +0 -38
- package/src/Cloudflare/StageConfig.ts +0 -8
|
@@ -6,28 +6,29 @@ import * as Effect from "effect/Effect";
|
|
|
6
6
|
import * as FileSystem from "effect/FileSystem";
|
|
7
7
|
import * as Layer from "effect/Layer";
|
|
8
8
|
import * as Match from "effect/Match";
|
|
9
|
-
import * as Path from "effect/Path";
|
|
10
9
|
import * as Redacted from "effect/Redacted";
|
|
11
10
|
import * as FetchHttpClient from "effect/unstable/http/FetchHttpClient";
|
|
12
11
|
import * as HttpClient from "effect/unstable/http/HttpClient";
|
|
13
|
-
import
|
|
14
|
-
|
|
12
|
+
import {
|
|
13
|
+
AuthError,
|
|
14
|
+
AuthProviderLayer,
|
|
15
|
+
type ConfigureContext,
|
|
16
|
+
} from "../../Auth/AuthProvider.ts";
|
|
15
17
|
import {
|
|
16
18
|
deleteCredentials,
|
|
17
19
|
displayRedacted,
|
|
18
20
|
readCredentials,
|
|
19
21
|
writeCredentials,
|
|
20
22
|
} from "../../Auth/Credentials.ts";
|
|
21
|
-
import {
|
|
23
|
+
import {
|
|
24
|
+
getEnv,
|
|
25
|
+
getEnvRedacted,
|
|
26
|
+
getEnvRequired,
|
|
27
|
+
retryOnce,
|
|
28
|
+
} from "../../Auth/Env.ts";
|
|
22
29
|
import * as Clank from "../../Util/Clank.ts";
|
|
23
30
|
import * as OAuthClient from "./OAuthClient.ts";
|
|
24
31
|
|
|
25
|
-
export type CloudflareAuthConfig =
|
|
26
|
-
| { method: "env"; accountId?: string }
|
|
27
|
-
| { method: "stored"; credentialType: "apiToken"; accountId?: string }
|
|
28
|
-
| { method: "stored"; credentialType: "apiKey"; accountId?: string }
|
|
29
|
-
| { method: "oauth"; scopes: string[]; accountId?: string };
|
|
30
|
-
|
|
31
32
|
const options: Array<{
|
|
32
33
|
value: CloudflareAuthConfig["method"];
|
|
33
34
|
label: string;
|
|
@@ -50,69 +51,77 @@ const options: Array<{
|
|
|
50
51
|
},
|
|
51
52
|
];
|
|
52
53
|
|
|
54
|
+
export type CloudflareAuthConfig =
|
|
55
|
+
| { method: "env" }
|
|
56
|
+
| { method: "stored"; credentialType: "apiToken" }
|
|
57
|
+
| { method: "stored"; credentialType: "apiKey" }
|
|
58
|
+
| { method: "oauth"; scopes: string[]; accountId: string };
|
|
59
|
+
|
|
53
60
|
export type CloudflareStoredCredentials =
|
|
54
|
-
| { type: "apiToken"; apiToken: string }
|
|
55
|
-
| { type: "apiKey"; apiKey: string; email: string };
|
|
61
|
+
| { type: "apiToken"; apiToken: string; accountId: string }
|
|
62
|
+
| { type: "apiKey"; apiKey: string; email: string; accountId: string };
|
|
56
63
|
|
|
57
64
|
export type CloudflareResolvedCredentials =
|
|
58
65
|
| {
|
|
59
66
|
type: "apiToken";
|
|
60
67
|
apiToken: Redacted.Redacted<string>;
|
|
68
|
+
accountId: string;
|
|
61
69
|
source: { type: CloudflareAuthConfig["method"]; details?: string };
|
|
62
70
|
}
|
|
63
71
|
| {
|
|
64
72
|
type: "apiKey";
|
|
65
73
|
apiKey: Redacted.Redacted<string>;
|
|
66
74
|
email: Redacted.Redacted<string>;
|
|
75
|
+
accountId: string;
|
|
67
76
|
source: { type: CloudflareAuthConfig["method"]; details?: string };
|
|
68
77
|
}
|
|
69
78
|
| {
|
|
70
79
|
type: "oauth";
|
|
71
80
|
accessToken: Redacted.Redacted<string>;
|
|
72
81
|
expires: number;
|
|
82
|
+
accountId: string;
|
|
73
83
|
source: { type: CloudflareAuthConfig["method"]; details?: string };
|
|
74
84
|
};
|
|
75
85
|
|
|
76
|
-
export const
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
prettyPrint: (profileName, config) =>
|
|
94
|
-
prettyPrint(profileName, config).pipe(Effect.provide(context)),
|
|
95
|
-
|
|
96
|
-
read: (profileName, config) =>
|
|
97
|
-
resolveCredentials(profileName, config).pipe(Effect.provide(context)),
|
|
98
|
-
} satisfies AuthProvider<CloudflareAuthConfig, CloudflareResolvedCredentials>;
|
|
86
|
+
export const CLOUDFLARE_AUTH_PROVIDER_NAME = "Cloudflare";
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Layer that registers the Cloudflare {@link AuthProvider} into the
|
|
90
|
+
* {@link AuthProviders} registry when built. Include this in the Cloudflare
|
|
91
|
+
* `providers()` layer so `alchemy login` can discover it.
|
|
92
|
+
*/
|
|
93
|
+
export const CloudflareAuth = AuthProviderLayer<
|
|
94
|
+
CloudflareAuthConfig,
|
|
95
|
+
CloudflareResolvedCredentials
|
|
96
|
+
>()(CLOUDFLARE_AUTH_PROVIDER_NAME, {
|
|
97
|
+
configure: (profileName, ctx) => configureCredentials(profileName, ctx),
|
|
98
|
+
logout: (profileName, config) => logout(profileName, config),
|
|
99
|
+
login: (profileName, config) => login(profileName, config),
|
|
100
|
+
prettyPrint: (profileName, config) => prettyPrint(profileName, config),
|
|
101
|
+
read: (profileName, config) => resolveCredentials(profileName, config),
|
|
99
102
|
});
|
|
100
103
|
|
|
101
104
|
const resolveCredentials = (
|
|
102
105
|
profileName: string,
|
|
103
106
|
config: CloudflareAuthConfig,
|
|
104
|
-
)
|
|
107
|
+
): Effect.Effect<
|
|
108
|
+
CloudflareResolvedCredentials,
|
|
109
|
+
AuthError,
|
|
110
|
+
FileSystem.FileSystem
|
|
111
|
+
> =>
|
|
105
112
|
Match.value(config).pipe(
|
|
106
113
|
Match.when(
|
|
107
114
|
{ method: "env" },
|
|
108
115
|
Effect.fnUntraced(function* () {
|
|
116
|
+
const accountId = yield* getEnvRequired("CLOUDFLARE_ACCOUNT_ID");
|
|
109
117
|
const apiToken = yield* getEnvRedacted("CLOUDFLARE_API_TOKEN");
|
|
110
118
|
if (apiToken) {
|
|
111
119
|
return {
|
|
112
120
|
type: "apiToken" as const,
|
|
113
121
|
apiToken,
|
|
114
|
-
|
|
115
|
-
|
|
122
|
+
accountId,
|
|
123
|
+
source: { type: "env" as const },
|
|
124
|
+
};
|
|
116
125
|
}
|
|
117
126
|
const apiKey = yield* getEnvRedacted("CLOUDFLARE_API_KEY");
|
|
118
127
|
const email = yield* getEnvRedacted("CLOUDFLARE_EMAIL");
|
|
@@ -121,8 +130,9 @@ const resolveCredentials = (
|
|
|
121
130
|
type: "apiKey" as const,
|
|
122
131
|
apiKey,
|
|
123
132
|
email,
|
|
124
|
-
|
|
125
|
-
|
|
133
|
+
accountId,
|
|
134
|
+
source: { type: "env" as const },
|
|
135
|
+
};
|
|
126
136
|
}
|
|
127
137
|
return yield* new AuthError({
|
|
128
138
|
message:
|
|
@@ -148,41 +158,63 @@ const resolveCredentials = (
|
|
|
148
158
|
Match.when({ type: "apiToken" }, (c) => ({
|
|
149
159
|
type: "apiToken" as const,
|
|
150
160
|
apiToken: Redacted.make(c.apiToken),
|
|
161
|
+
accountId: c.accountId,
|
|
151
162
|
source: { type: "stored" as const },
|
|
152
163
|
})),
|
|
153
164
|
Match.when({ type: "apiKey" }, (c) => ({
|
|
154
165
|
type: "apiKey" as const,
|
|
155
166
|
apiKey: Redacted.make(c.apiKey),
|
|
156
167
|
email: Redacted.make(c.email),
|
|
168
|
+
accountId: c.accountId,
|
|
157
169
|
source: { type: "stored" as const },
|
|
158
170
|
})),
|
|
159
171
|
Match.exhaustive,
|
|
160
|
-
)
|
|
172
|
+
),
|
|
161
173
|
),
|
|
162
174
|
),
|
|
163
175
|
),
|
|
164
176
|
),
|
|
165
|
-
Match.when({ method: "oauth" }, () =>
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
177
|
+
Match.when({ method: "oauth" }, (cfg) =>
|
|
178
|
+
Effect.gen(function* () {
|
|
179
|
+
const creds = yield* readCredentials<OAuthClient.OAuthCredentials>(
|
|
180
|
+
profileName,
|
|
181
|
+
"cf-oauth",
|
|
182
|
+
);
|
|
183
|
+
if (creds == null || creds.type !== "oauth") {
|
|
184
|
+
return yield* Effect.fail(
|
|
185
|
+
new AuthError({
|
|
186
|
+
message:
|
|
187
|
+
"Cloudflare OAuth credentials not found. Run: alchemy login",
|
|
188
|
+
}),
|
|
189
|
+
);
|
|
190
|
+
}
|
|
191
|
+
// Refresh proactively if the token has expired (or is within
|
|
192
|
+
// 10s of expiring). Persist the refreshed creds so subsequent
|
|
193
|
+
// resolves don't repeat the round-trip.
|
|
194
|
+
const fresh =
|
|
195
|
+
creds.expires > Date.now() + 10_000
|
|
196
|
+
? creds
|
|
197
|
+
: yield* OAuthClient.refresh(creds).pipe(
|
|
198
|
+
Effect.tap((refreshed) =>
|
|
199
|
+
writeCredentials(profileName, "cf-oauth", refreshed),
|
|
200
|
+
),
|
|
201
|
+
Effect.mapError(
|
|
202
|
+
(e) =>
|
|
203
|
+
new AuthError({
|
|
204
|
+
message:
|
|
205
|
+
"Cloudflare OAuth refresh failed. Run: alchemy login",
|
|
206
|
+
cause: e,
|
|
207
|
+
}),
|
|
208
|
+
),
|
|
209
|
+
);
|
|
210
|
+
return {
|
|
211
|
+
type: "oauth" as const,
|
|
212
|
+
accessToken: Redacted.make(fresh.access),
|
|
213
|
+
expires: fresh.expires,
|
|
214
|
+
accountId: cfg.accountId,
|
|
215
|
+
source: { type: "oauth" as const },
|
|
216
|
+
};
|
|
217
|
+
}),
|
|
186
218
|
),
|
|
187
219
|
Match.exhaustive,
|
|
188
220
|
);
|
|
@@ -272,30 +304,36 @@ const login = (profileName: string, config: CloudflareAuthConfig) =>
|
|
|
272
304
|
),
|
|
273
305
|
);
|
|
274
306
|
|
|
275
|
-
const configureCredentials = (profileName: string) =>
|
|
307
|
+
const configureCredentials = (profileName: string, ctx: ConfigureContext) =>
|
|
308
|
+
Effect.gen(function* () {
|
|
309
|
+
if (ctx.ci) {
|
|
310
|
+
return { method: "env" as const };
|
|
311
|
+
}
|
|
312
|
+
return yield* configureInteractive(profileName);
|
|
313
|
+
}).pipe(
|
|
314
|
+
Effect.mapError(
|
|
315
|
+
(e) =>
|
|
316
|
+
new AuthError({
|
|
317
|
+
message: "failed to configure credentials",
|
|
318
|
+
cause: e,
|
|
319
|
+
}),
|
|
320
|
+
),
|
|
321
|
+
);
|
|
322
|
+
|
|
323
|
+
const configureInteractive = (profileName: string) =>
|
|
276
324
|
Clank.select({
|
|
277
325
|
message: "Cloudflare authentication method",
|
|
278
326
|
options,
|
|
279
|
-
})
|
|
280
|
-
.
|
|
281
|
-
|
|
282
|
-
Match.
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
Match.exhaustive,
|
|
287
|
-
),
|
|
288
|
-
),
|
|
289
|
-
)
|
|
290
|
-
.pipe(
|
|
291
|
-
Effect.mapError(
|
|
292
|
-
(e) =>
|
|
293
|
-
new AuthError({
|
|
294
|
-
message: "failed to configure credentials",
|
|
295
|
-
cause: e,
|
|
296
|
-
}),
|
|
327
|
+
}).pipe(
|
|
328
|
+
Effect.flatMap((method) =>
|
|
329
|
+
Match.value(method).pipe(
|
|
330
|
+
Match.when("env", () => Effect.succeed({ method: "env" as const })),
|
|
331
|
+
Match.when("oauth", () => configureOAuth(profileName)),
|
|
332
|
+
Match.when("stored", () => loginStored(profileName)),
|
|
333
|
+
Match.exhaustive,
|
|
297
334
|
),
|
|
298
|
-
)
|
|
335
|
+
),
|
|
336
|
+
);
|
|
299
337
|
|
|
300
338
|
const configureOAuth = Effect.fnUntraced(function* (profileName: string) {
|
|
301
339
|
const scopes = yield* promptOAuthScopes();
|
|
@@ -335,18 +373,17 @@ const loginStored = Effect.fnUntraced(function* (profileName: string) {
|
|
|
335
373
|
message: "Cloudflare API Token",
|
|
336
374
|
validate: (v) => (v.length === 0 ? "Required" : undefined),
|
|
337
375
|
}).pipe(retryOnce);
|
|
376
|
+
const accountId = yield* promptAccountId();
|
|
338
377
|
|
|
339
378
|
yield* writeCredentials<CloudflareStoredCredentials>(
|
|
340
379
|
profileName,
|
|
341
380
|
"cf-stored",
|
|
342
|
-
{ type: "apiToken", apiToken },
|
|
381
|
+
{ type: "apiToken", apiToken, accountId },
|
|
343
382
|
);
|
|
344
383
|
yield* Clank.success("Cloudflare: credentials saved.");
|
|
345
|
-
const accountId = yield* promptAccountId();
|
|
346
384
|
return {
|
|
347
385
|
method: "stored" as const,
|
|
348
386
|
credentialType: "apiToken" as const,
|
|
349
|
-
...(accountId ? { accountId } : {}),
|
|
350
387
|
};
|
|
351
388
|
}),
|
|
352
389
|
),
|
|
@@ -361,18 +398,17 @@ const loginStored = Effect.fnUntraced(function* (profileName: string) {
|
|
|
361
398
|
message: "Cloudflare Email",
|
|
362
399
|
validate: (v) => (v.length === 0 ? "Required" : undefined),
|
|
363
400
|
}).pipe(retryOnce);
|
|
401
|
+
const accountId = yield* promptAccountId();
|
|
364
402
|
|
|
365
403
|
yield* writeCredentials<CloudflareStoredCredentials>(
|
|
366
404
|
profileName,
|
|
367
405
|
"cf-stored",
|
|
368
|
-
{ type: "apiKey", apiKey, email },
|
|
406
|
+
{ type: "apiKey", apiKey, email, accountId },
|
|
369
407
|
);
|
|
370
408
|
yield* Clank.success("Cloudflare: credentials saved.");
|
|
371
|
-
const accountId = yield* promptAccountId();
|
|
372
409
|
return {
|
|
373
410
|
method: "stored" as const,
|
|
374
411
|
credentialType: "apiKey" as const,
|
|
375
|
-
...(accountId ? { accountId } : {}),
|
|
376
412
|
};
|
|
377
413
|
}),
|
|
378
414
|
),
|
|
@@ -495,6 +531,7 @@ const prettyPrint = (profileName: string, config: CloudflareAuthConfig) =>
|
|
|
495
531
|
Match.when({ type: "apiToken" }, (c) =>
|
|
496
532
|
Effect.all([
|
|
497
533
|
Console.log(` apiToken: ${displayRedacted(c.apiToken, 9)}`),
|
|
534
|
+
Console.log(` accountId: ${c.accountId}`),
|
|
498
535
|
Console.log(` source: ${sourceStr}`),
|
|
499
536
|
]),
|
|
500
537
|
),
|
|
@@ -502,6 +539,7 @@ const prettyPrint = (profileName: string, config: CloudflareAuthConfig) =>
|
|
|
502
539
|
Effect.all([
|
|
503
540
|
Console.log(` apiKey: ${displayRedacted(c.apiKey)}`),
|
|
504
541
|
Console.log(` email: ${displayRedacted(c.email)}`),
|
|
542
|
+
Console.log(` accountId: ${c.accountId}`),
|
|
505
543
|
Console.log(` source: ${sourceStr}`),
|
|
506
544
|
]),
|
|
507
545
|
),
|
|
@@ -515,22 +553,13 @@ const prettyPrint = (profileName: string, config: CloudflareAuthConfig) =>
|
|
|
515
553
|
return Effect.all([
|
|
516
554
|
Console.log(` accessToken: ${displayRedacted(c.accessToken)}`),
|
|
517
555
|
Console.log(` expires: ${expiresStr}`),
|
|
556
|
+
Console.log(` accountId: ${c.accountId}`),
|
|
518
557
|
Console.log(` source: ${sourceStr}`),
|
|
519
558
|
]);
|
|
520
559
|
}),
|
|
521
560
|
Match.exhaustive,
|
|
522
561
|
);
|
|
523
562
|
}),
|
|
524
|
-
Effect.andThen(
|
|
525
|
-
getEnv("CLOUDFLARE_ACCOUNT_ID").pipe(
|
|
526
|
-
Effect.flatMap((envAccountId) => {
|
|
527
|
-
const resolved = config.accountId ?? envAccountId;
|
|
528
|
-
return Console.log(
|
|
529
|
-
` accountId: ${resolved ?? "(not set — configure or set CLOUDFLARE_ACCOUNT_ID)"}`,
|
|
530
|
-
);
|
|
531
|
-
}),
|
|
532
|
-
),
|
|
533
|
-
),
|
|
534
563
|
Effect.catch((e) =>
|
|
535
564
|
Console.error(` Failed to retrieve credentials: ${e}`),
|
|
536
565
|
),
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import * as Config from "effect/Config";
|
|
2
|
+
import * as Context from "effect/Context";
|
|
3
|
+
import * as Effect from "effect/Effect";
|
|
4
|
+
import * as Layer from "effect/Layer";
|
|
5
|
+
import * as Option from "effect/Option";
|
|
6
|
+
import { getAuthProvider } from "../Auth/AuthProvider.ts";
|
|
7
|
+
import { ALCHEMY_PROFILE, loadOrConfigure } from "../Auth/Profile.ts";
|
|
8
|
+
import {
|
|
9
|
+
CLOUDFLARE_AUTH_PROVIDER_NAME,
|
|
10
|
+
type CloudflareAuthConfig,
|
|
11
|
+
type CloudflareResolvedCredentials,
|
|
12
|
+
} from "./Auth/AuthProvider.ts";
|
|
13
|
+
|
|
14
|
+
export class CloudflareEnvironment extends Context.Service<
|
|
15
|
+
CloudflareEnvironment,
|
|
16
|
+
CloudflareResolvedCredentials
|
|
17
|
+
>()("Cloudflare::CloudflareEnvironment") {}
|
|
18
|
+
|
|
19
|
+
const CLOUDFLARE_ACCOUNT_ID = Config.string("CLOUDFLARE_ACCOUNT_ID");
|
|
20
|
+
|
|
21
|
+
export const fromEnv = () =>
|
|
22
|
+
Layer.effect(
|
|
23
|
+
CloudflareEnvironment,
|
|
24
|
+
Effect.gen(function* () {
|
|
25
|
+
const accountId = yield* CLOUDFLARE_ACCOUNT_ID.pipe(
|
|
26
|
+
Config.option,
|
|
27
|
+
Config.map(Option.getOrUndefined),
|
|
28
|
+
);
|
|
29
|
+
return { account: accountId } as any;
|
|
30
|
+
}),
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
export const fromProfile = () =>
|
|
34
|
+
Layer.effect(
|
|
35
|
+
CloudflareEnvironment,
|
|
36
|
+
Effect.gen(function* () {
|
|
37
|
+
const auth = yield* getAuthProvider<
|
|
38
|
+
CloudflareAuthConfig,
|
|
39
|
+
CloudflareResolvedCredentials
|
|
40
|
+
>(CLOUDFLARE_AUTH_PROVIDER_NAME);
|
|
41
|
+
const profileName = yield* ALCHEMY_PROFILE;
|
|
42
|
+
const ci = yield* Config.boolean("CI").pipe(Config.withDefault(false));
|
|
43
|
+
// `loadOrConfigure` reads the persisted config under the canonical
|
|
44
|
+
// provider name (`Cloudflare`); only runs `configure` (and persists the
|
|
45
|
+
// result) if no stored config exists.
|
|
46
|
+
const config = yield* loadOrConfigure(auth, profileName, { ci });
|
|
47
|
+
return yield* auth.read(profileName, config as CloudflareAuthConfig);
|
|
48
|
+
}),
|
|
49
|
+
);
|