alchemy 2.0.0-beta.36 → 2.0.0-beta.38
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/exec.js +646 -104
- package/bin/exec.js.map +1 -1
- package/lib/AWS/AutoScaling/LaunchTemplate.d.ts +1 -1
- package/lib/AWS/CloudWatch/common.d.ts +1 -1
- package/lib/AWS/Credentials.d.ts.map +1 -1
- package/lib/AWS/Credentials.js +1 -2
- package/lib/AWS/Credentials.js.map +1 -1
- package/lib/AWS/DynamoDB/Stream.d.ts.map +1 -1
- package/lib/AWS/DynamoDB/Stream.js +1 -1
- package/lib/AWS/DynamoDB/Stream.js.map +1 -1
- package/lib/AWS/EC2/Instance.d.ts +1 -1
- package/lib/AWS/EC2/hosted.d.ts +1 -1
- package/lib/AWS/EC2/hosted.d.ts.map +1 -1
- package/lib/AWS/EC2/hosted.js +3 -5
- package/lib/AWS/EC2/hosted.js.map +1 -1
- package/lib/AWS/ECS/Task.d.ts +1 -1
- package/lib/AWS/ECS/Task.d.ts.map +1 -1
- package/lib/AWS/ECS/Task.js +3 -5
- package/lib/AWS/ECS/Task.js.map +1 -1
- package/lib/AWS/Endpoint.d.ts.map +1 -1
- package/lib/AWS/Endpoint.js +1 -2
- package/lib/AWS/Endpoint.js.map +1 -1
- package/lib/AWS/Environment.d.ts +2 -2
- package/lib/AWS/EventBridge/EventSource.d.ts.map +1 -1
- package/lib/AWS/EventBridge/EventSource.js +1 -1
- package/lib/AWS/EventBridge/EventSource.js.map +1 -1
- package/lib/AWS/Kinesis/StreamEventSource.d.ts.map +1 -1
- package/lib/AWS/Kinesis/StreamEventSource.js +1 -1
- package/lib/AWS/Kinesis/StreamEventSource.js.map +1 -1
- package/lib/AWS/Lambda/BucketEventSource.d.ts +1 -1
- package/lib/AWS/Lambda/EventBridgeEventSource.d.ts +1 -1
- package/lib/AWS/Lambda/Function.d.ts +1 -1
- package/lib/AWS/Lambda/Function.d.ts.map +1 -1
- package/lib/AWS/Lambda/Function.js +29 -13
- package/lib/AWS/Lambda/Function.js.map +1 -1
- package/lib/AWS/Lambda/QueueEventSource.d.ts +1 -1
- package/lib/AWS/Lambda/StreamEventSource.d.ts +1 -1
- package/lib/AWS/Lambda/TableEventSource.d.ts +1 -1
- package/lib/AWS/Lambda/TopicEventSource.d.ts +1 -1
- package/lib/AWS/Organizations/common.d.ts +1 -1
- package/lib/AWS/Providers.d.ts.map +1 -1
- package/lib/AWS/Providers.js +21 -3
- package/lib/AWS/Providers.js.map +1 -1
- package/lib/AWS/Region.d.ts +1 -1
- package/lib/AWS/Region.d.ts.map +1 -1
- package/lib/AWS/Region.js +2 -3
- package/lib/AWS/Region.js.map +1 -1
- package/lib/AWS/S3/Bucket.d.ts.map +1 -1
- package/lib/AWS/S3/Bucket.js +5 -2
- package/lib/AWS/S3/Bucket.js.map +1 -1
- package/lib/AWS/S3/BucketNotifications.d.ts.map +1 -1
- package/lib/AWS/S3/BucketNotifications.js +1 -1
- package/lib/AWS/S3/BucketNotifications.js.map +1 -1
- package/lib/AWS/SNS/TopicEventSource.d.ts.map +1 -1
- package/lib/AWS/SNS/TopicEventSource.js +1 -1
- package/lib/AWS/SNS/TopicEventSource.js.map +1 -1
- package/lib/AWS/SQS/Queue.d.ts.map +1 -1
- package/lib/AWS/SQS/Queue.js +23 -5
- package/lib/AWS/SQS/Queue.js.map +1 -1
- package/lib/Action.d.ts +77 -0
- package/lib/Action.d.ts.map +1 -0
- package/lib/Action.js +89 -0
- package/lib/Action.js.map +1 -0
- package/lib/AlchemyContext.d.ts +1 -1
- package/lib/Apply.d.ts.map +1 -1
- package/lib/Apply.js +228 -4
- package/lib/Apply.js.map +1 -1
- package/lib/Artifacts.d.ts +1 -1
- package/lib/Artifacts.d.ts.map +1 -1
- package/lib/Artifacts.js +1 -1
- package/lib/Artifacts.js.map +1 -1
- package/lib/Auth/AuthProvider.js +1 -1
- package/lib/Auth/AuthProvider.js.map +1 -1
- package/lib/Auth/Env.d.ts.map +1 -1
- package/lib/Auth/Env.js +4 -12
- package/lib/Auth/Env.js.map +1 -1
- package/lib/Binding.d.ts.map +1 -1
- package/lib/Binding.js +5 -5
- package/lib/Binding.js.map +1 -1
- package/lib/Build/Command.d.ts +1 -1
- package/lib/Build/Memo.d.ts +1 -1
- package/lib/Bundle/Docker.d.ts +3 -3
- package/lib/Bundle/Docker.js +1 -1
- package/lib/Bundle/Docker.js.map +1 -1
- package/lib/Bundle/TempRoot.d.ts +3 -3
- package/lib/Cli/Event.d.ts +1 -1
- package/lib/Cli/Event.d.ts.map +1 -1
- package/lib/Cli/NamespaceTree.d.ts +11 -5
- package/lib/Cli/NamespaceTree.d.ts.map +1 -1
- package/lib/Cli/NamespaceTree.js +28 -1
- package/lib/Cli/NamespaceTree.js.map +1 -1
- package/lib/Cli/commands/_shared.d.ts +1 -1
- package/lib/Cli/commands/_shared.js +2 -2
- package/lib/Cli/commands/_shared.js.map +1 -1
- package/lib/Cli/commands/aws.d.ts +1 -1
- package/lib/Cli/commands/cloudflare.d.ts +2 -2
- package/lib/Cli/commands/cloudflare.d.ts.map +1 -1
- package/lib/Cli/commands/deploy.d.ts +9 -9
- package/lib/Cli/commands/deploy.js +1 -1
- package/lib/Cli/commands/deploy.js.map +1 -1
- package/lib/Cli/commands/login.d.ts +1 -1
- package/lib/Cli/commands/logs.d.ts +1 -1
- package/lib/Cli/commands/logs.js.map +1 -1
- package/lib/Cli/commands/profile.d.ts +1 -3
- package/lib/Cli/commands/profile.d.ts.map +1 -1
- package/lib/Cli/commands/state.d.ts +1 -1
- package/lib/Cli/commands/state.d.ts.map +1 -1
- package/lib/Cli/commands/tail.d.ts +1 -1
- package/lib/Cli/commands/tail.js.map +1 -1
- package/lib/Cli/tui/components/Plan.d.ts.map +1 -1
- package/lib/Cli/tui/components/Plan.js +27 -13
- package/lib/Cli/tui/components/Plan.js.map +1 -1
- package/lib/Cli/tui/components/PlanProgress.d.ts +8 -1
- package/lib/Cli/tui/components/PlanProgress.d.ts.map +1 -1
- package/lib/Cli/tui/components/PlanProgress.js +95 -16
- package/lib/Cli/tui/components/PlanProgress.js.map +1 -1
- package/lib/Cloudflare/Access.js +0 -1
- package/lib/Cloudflare/Access.js.map +1 -1
- package/lib/Cloudflare/AnalyticsEngine/AnalyticsEngineDataset.d.ts +54 -0
- package/lib/Cloudflare/AnalyticsEngine/AnalyticsEngineDataset.d.ts.map +1 -0
- package/lib/Cloudflare/AnalyticsEngine/AnalyticsEngineDataset.js +17 -0
- package/lib/Cloudflare/AnalyticsEngine/AnalyticsEngineDataset.js.map +1 -0
- package/lib/Cloudflare/AnalyticsEngine/AnalyticsEngineDatasetBinding.d.ts +37 -0
- package/lib/Cloudflare/AnalyticsEngine/AnalyticsEngineDatasetBinding.d.ts.map +1 -0
- package/lib/Cloudflare/AnalyticsEngine/AnalyticsEngineDatasetBinding.js +45 -0
- package/lib/Cloudflare/AnalyticsEngine/AnalyticsEngineDatasetBinding.js.map +1 -0
- package/lib/Cloudflare/AnalyticsEngine/index.d.ts +3 -0
- package/lib/Cloudflare/AnalyticsEngine/index.d.ts.map +1 -0
- package/lib/Cloudflare/AnalyticsEngine/index.js +3 -0
- package/lib/Cloudflare/AnalyticsEngine/index.js.map +1 -0
- package/lib/Cloudflare/Artifacts/ArtifactsBinding.js +1 -1
- package/lib/Cloudflare/Artifacts/ArtifactsBinding.js.map +1 -1
- package/lib/Cloudflare/CloudflareEnvironment.d.ts +1 -1
- package/lib/Cloudflare/Container/Container.js +0 -1
- package/lib/Cloudflare/Container/Container.js.map +1 -1
- package/lib/Cloudflare/Container/ContainerApplication.d.ts +1 -1
- package/lib/Cloudflare/Container/ContainerApplication.d.ts.map +1 -1
- package/lib/Cloudflare/Container/ContainerApplication.js +4 -6
- package/lib/Cloudflare/Container/ContainerApplication.js.map +1 -1
- package/lib/Cloudflare/Container/ContainerBinding.js +2 -2
- package/lib/Cloudflare/Container/ContainerBinding.js.map +1 -1
- package/lib/Cloudflare/D1/D1Connection.d.ts +47 -3
- package/lib/Cloudflare/D1/D1Connection.d.ts.map +1 -1
- package/lib/Cloudflare/D1/D1Connection.js +62 -5
- package/lib/Cloudflare/D1/D1Connection.js.map +1 -1
- package/lib/Cloudflare/D1/D1Database.d.ts +1 -1
- package/lib/Cloudflare/D1/D1SqlFile.d.ts +2 -2
- package/lib/Cloudflare/Email/EmailAddress.d.ts +45 -0
- package/lib/Cloudflare/Email/EmailAddress.d.ts.map +1 -0
- package/lib/Cloudflare/Email/EmailAddress.js +99 -0
- package/lib/Cloudflare/Email/EmailAddress.js.map +1 -0
- package/lib/Cloudflare/Email/EmailRouting.d.ts +42 -0
- package/lib/Cloudflare/Email/EmailRouting.d.ts.map +1 -0
- package/lib/Cloudflare/Email/EmailRouting.js +89 -0
- package/lib/Cloudflare/Email/EmailRouting.js.map +1 -0
- package/lib/Cloudflare/Email/EmailRule.d.ts +80 -0
- package/lib/Cloudflare/Email/EmailRule.d.ts.map +1 -0
- package/lib/Cloudflare/Email/EmailRule.js +110 -0
- package/lib/Cloudflare/Email/EmailRule.js.map +1 -0
- package/lib/Cloudflare/Email/SendEmail.d.ts +74 -0
- package/lib/Cloudflare/Email/SendEmail.d.ts.map +1 -0
- package/lib/Cloudflare/Email/SendEmail.js +19 -0
- package/lib/Cloudflare/Email/SendEmail.js.map +1 -0
- package/lib/Cloudflare/Email/SendEmailBinding.d.ts +64 -0
- package/lib/Cloudflare/Email/SendEmailBinding.d.ts.map +1 -0
- package/lib/Cloudflare/Email/SendEmailBinding.js +54 -0
- package/lib/Cloudflare/Email/SendEmailBinding.js.map +1 -0
- package/lib/Cloudflare/Email/index.d.ts +6 -0
- package/lib/Cloudflare/Email/index.d.ts.map +1 -0
- package/lib/Cloudflare/Email/index.js +6 -0
- package/lib/Cloudflare/Email/index.js.map +1 -0
- package/lib/Cloudflare/Hyperdrive/Hyperdrive.d.ts +1 -1
- package/lib/Cloudflare/Images/ImagesBinding.js +1 -1
- package/lib/Cloudflare/Images/ImagesBinding.js.map +1 -1
- package/lib/Cloudflare/KV/KVNamespaceBinding.js +1 -1
- package/lib/Cloudflare/KV/KVNamespaceBinding.js.map +1 -1
- package/lib/Cloudflare/Local/Sidecar.d.ts +1 -1
- package/lib/Cloudflare/Local/SidecarHandlers.d.ts +1 -1
- package/lib/Cloudflare/Local/SidecarHandlers.js +9 -1
- package/lib/Cloudflare/Local/SidecarHandlers.js.map +1 -1
- package/lib/Cloudflare/Local/SidecarServer.js +1 -1
- package/lib/Cloudflare/Local/SidecarServer.js.map +1 -1
- package/lib/Cloudflare/Providers.d.ts.map +1 -1
- package/lib/Cloudflare/Providers.js +9 -1
- package/lib/Cloudflare/Providers.js.map +1 -1
- package/lib/Cloudflare/Queue/QueueBinding.js +1 -1
- package/lib/Cloudflare/Queue/QueueBinding.js.map +1 -1
- package/lib/Cloudflare/R2/R2Bucket.d.ts.map +1 -1
- package/lib/Cloudflare/R2/R2Bucket.js +16 -0
- package/lib/Cloudflare/R2/R2Bucket.js.map +1 -1
- package/lib/Cloudflare/R2/R2BucketBinding.js +1 -1
- package/lib/Cloudflare/R2/R2BucketBinding.js.map +1 -1
- package/lib/Cloudflare/SecretsStore/SecretBinding.js +1 -1
- package/lib/Cloudflare/SecretsStore/SecretBinding.js.map +1 -1
- package/lib/Cloudflare/StateStore/Api.d.ts +7 -2
- package/lib/Cloudflare/StateStore/Api.d.ts.map +1 -1
- package/lib/Cloudflare/StateStore/Api.js +23 -1
- package/lib/Cloudflare/StateStore/Api.js.map +1 -1
- package/lib/Cloudflare/StateStore/State.d.ts +2 -2
- package/lib/Cloudflare/StateStore/Store.d.ts +16 -1
- package/lib/Cloudflare/StateStore/Store.d.ts.map +1 -1
- package/lib/Cloudflare/StateStore/Store.js +22 -5
- package/lib/Cloudflare/StateStore/Store.js.map +1 -1
- package/lib/Cloudflare/Workers/Assets.d.ts +2 -2
- package/lib/Cloudflare/Workers/Assets.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/Assets.js +5 -4
- package/lib/Cloudflare/Workers/Assets.js.map +1 -1
- package/lib/Cloudflare/Workers/CronEventSource.d.ts +35 -0
- package/lib/Cloudflare/Workers/CronEventSource.d.ts.map +1 -0
- package/lib/Cloudflare/Workers/CronEventSource.js +55 -0
- package/lib/Cloudflare/Workers/CronEventSource.js.map +1 -0
- package/lib/Cloudflare/Workers/InferEnv.d.ts +37 -2
- package/lib/Cloudflare/Workers/InferEnv.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/LocalWorkerProvider.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/LocalWorkerProvider.js +2 -1
- package/lib/Cloudflare/Workers/LocalWorkerProvider.js.map +1 -1
- package/lib/Cloudflare/Workers/Rpc.d.ts +76 -3
- package/lib/Cloudflare/Workers/Rpc.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/Rpc.js +197 -13
- package/lib/Cloudflare/Workers/Rpc.js.map +1 -1
- package/lib/Cloudflare/Workers/Worker.d.ts +24 -4
- package/lib/Cloudflare/Workers/Worker.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/Worker.js +187 -45
- package/lib/Cloudflare/Workers/Worker.js.map +1 -1
- package/lib/Cloudflare/Workers/WorkerBundle.d.ts +1 -1
- package/lib/Cloudflare/Workers/WorkerBundle.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/WorkerBundle.js +19 -11
- package/lib/Cloudflare/Workers/WorkerBundle.js.map +1 -1
- package/lib/Cloudflare/Workers/WorkerName.d.ts +1 -1
- package/lib/Cloudflare/Workers/Workflow.d.ts +50 -47
- package/lib/Cloudflare/Workers/Workflow.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/Workflow.js +43 -37
- package/lib/Cloudflare/Workers/Workflow.js.map +1 -1
- package/lib/Cloudflare/Workers/index.d.ts +1 -0
- package/lib/Cloudflare/Workers/index.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/index.js +1 -0
- package/lib/Cloudflare/Workers/index.js.map +1 -1
- package/lib/Cloudflare/index.d.ts +2 -0
- package/lib/Cloudflare/index.d.ts.map +1 -1
- package/lib/Cloudflare/index.js +2 -0
- package/lib/Cloudflare/index.js.map +1 -1
- package/lib/Construct.d.ts +3 -3
- package/lib/Construct.d.ts.map +1 -1
- package/lib/Construct.js.map +1 -1
- package/lib/Deploy.d.ts +5 -2
- package/lib/Deploy.d.ts.map +1 -1
- package/lib/Deploy.js +2 -2
- package/lib/Deploy.js.map +1 -1
- package/lib/Destroy.d.ts +5 -2
- package/lib/Destroy.d.ts.map +1 -1
- package/lib/Destroy.js +3 -2
- package/lib/Destroy.js.map +1 -1
- package/lib/Drizzle/Providers.d.ts +1 -1
- package/lib/Drizzle/Schema.d.ts +1 -1
- package/lib/GitHub/Providers.d.ts +1 -1
- package/lib/Http.d.ts +1 -1
- package/lib/Http.d.ts.map +1 -1
- package/lib/Http.js +1 -1
- package/lib/Http.js.map +1 -1
- package/lib/Namespace.d.ts.map +1 -1
- package/lib/Namespace.js +3 -4
- package/lib/Namespace.js.map +1 -1
- package/lib/Neon/Branch.d.ts +2 -2
- package/lib/Neon/Branch.d.ts.map +1 -1
- package/lib/Neon/Branch.js +59 -27
- package/lib/Neon/Branch.js.map +1 -1
- package/lib/Neon/Credentials.d.ts +2 -2
- package/lib/Neon/Credentials.d.ts.map +1 -1
- package/lib/Neon/Credentials.js +2 -2
- package/lib/Neon/Credentials.js.map +1 -1
- package/lib/Neon/NeonEnvironment.d.ts +1 -1
- package/lib/Neon/Project.d.ts +25 -1
- package/lib/Neon/Project.d.ts.map +1 -1
- package/lib/Neon/Project.js +121 -42
- package/lib/Neon/Project.js.map +1 -1
- package/lib/Neon/Providers.d.ts +1 -1
- package/lib/Neon/SqlFile.d.ts +2 -2
- package/lib/Output.d.ts +47 -8
- package/lib/Output.d.ts.map +1 -1
- package/lib/Output.js +106 -7
- package/lib/Output.js.map +1 -1
- package/lib/PhysicalName.d.ts +1 -1
- package/lib/Plan.d.ts +36 -1
- package/lib/Plan.d.ts.map +1 -1
- package/lib/Plan.js +284 -37
- package/lib/Plan.js.map +1 -1
- package/lib/Platform.d.ts.map +1 -1
- package/lib/Platform.js +22 -9
- package/lib/Platform.js.map +1 -1
- package/lib/Provider.d.ts +1 -1
- package/lib/Provider.d.ts.map +1 -1
- package/lib/Provider.js +1 -1
- package/lib/Provider.js.map +1 -1
- package/lib/Random.d.ts +1 -1
- package/lib/Random.d.ts.map +1 -1
- package/lib/Random.js +1 -1
- package/lib/Random.js.map +1 -1
- package/lib/Ref.d.ts +4 -1
- package/lib/Ref.d.ts.map +1 -1
- package/lib/Ref.js +1 -1
- package/lib/Ref.js.map +1 -1
- package/lib/Resource.d.ts +8 -0
- package/lib/Resource.d.ts.map +1 -1
- package/lib/Resource.js +12 -25
- package/lib/Resource.js.map +1 -1
- package/lib/Runtime.d.ts +24 -0
- package/lib/Runtime.d.ts.map +1 -0
- package/lib/Runtime.js +31 -0
- package/lib/Runtime.js.map +1 -0
- package/lib/RuntimeContext.d.ts +3 -1
- package/lib/RuntimeContext.d.ts.map +1 -1
- package/lib/RuntimeContext.js.map +1 -1
- package/lib/Secret.d.ts +50 -0
- package/lib/Secret.d.ts.map +1 -0
- package/lib/Secret.js +23 -0
- package/lib/Secret.js.map +1 -0
- package/lib/Serverless/Function.d.ts +9 -1
- package/lib/Serverless/Function.d.ts.map +1 -1
- package/lib/Sidecar/RpcClient.d.ts +1 -1
- package/lib/Sidecar/RpcPaths.d.ts +1 -1
- package/lib/Sidecar/RpcServer.d.ts +1 -1
- package/lib/Sidecar/RpcServices.d.ts +1 -1
- package/lib/Stack.d.ts +20 -6
- package/lib/Stack.d.ts.map +1 -1
- package/lib/Stack.js +35 -23
- package/lib/Stack.js.map +1 -1
- package/lib/State/ActionState.d.ts +48 -0
- package/lib/State/ActionState.d.ts.map +1 -0
- package/lib/State/ActionState.js +1 -0
- package/lib/State/ActionState.js.map +1 -0
- package/lib/State/HttpStateApi.d.ts +15 -1
- package/lib/State/HttpStateApi.d.ts.map +1 -1
- package/lib/State/HttpStateApi.js +11 -0
- package/lib/State/HttpStateApi.js.map +1 -1
- package/lib/State/HttpStateStore.d.ts.map +1 -1
- package/lib/State/HttpStateStore.js +12 -1
- package/lib/State/HttpStateStore.js.map +1 -1
- package/lib/State/InMemoryState.d.ts +2 -2
- package/lib/State/InMemoryState.d.ts.map +1 -1
- package/lib/State/InMemoryState.js +12 -6
- package/lib/State/InMemoryState.js.map +1 -1
- package/lib/State/LocalState.d.ts +2 -2
- package/lib/State/LocalState.d.ts.map +1 -1
- package/lib/State/LocalState.js +11 -2
- package/lib/State/LocalState.js.map +1 -1
- package/lib/State/ResourceState.d.ts +5 -0
- package/lib/State/ResourceState.d.ts.map +1 -1
- package/lib/State/State.d.ts +31 -2
- package/lib/State/State.d.ts.map +1 -1
- package/lib/State/State.js +2 -0
- package/lib/State/State.js.map +1 -1
- package/lib/State/index.d.ts +1 -0
- package/lib/State/index.d.ts.map +1 -1
- package/lib/State/index.js +1 -0
- package/lib/State/index.js.map +1 -1
- package/lib/Test/Bun.d.ts.map +1 -1
- package/lib/Test/Bun.js +30 -7
- package/lib/Test/Bun.js.map +1 -1
- package/lib/Test/Core.d.ts +19 -4
- package/lib/Test/Core.d.ts.map +1 -1
- package/lib/Test/Core.js +33 -12
- package/lib/Test/Core.js.map +1 -1
- package/lib/Test/Vitest.d.ts.map +1 -1
- package/lib/Test/Vitest.js +24 -5
- package/lib/Test/Vitest.js.map +1 -1
- package/lib/Util/FileLogger.d.ts +1 -1
- package/lib/Util/LocalhostDns.d.ts +14 -10
- package/lib/Util/LocalhostDns.d.ts.map +1 -1
- package/lib/Util/LocalhostDns.js +27 -36
- package/lib/Util/LocalhostDns.js.map +1 -1
- package/lib/Util/effect.d.ts +7 -0
- package/lib/Util/effect.d.ts.map +1 -1
- package/lib/Util/effect.js +10 -4
- package/lib/Util/effect.js.map +1 -1
- package/lib/Util/exec.d.ts.map +1 -0
- package/lib/Util/exec.js.map +1 -0
- package/lib/Util/hash.d.ts +8 -0
- package/lib/Util/hash.d.ts.map +1 -0
- package/lib/Util/hash.js +11 -0
- package/lib/Util/hash.js.map +1 -0
- package/lib/Util/ignore.d.ts +40 -0
- package/lib/Util/ignore.d.ts.map +1 -0
- package/lib/Util/ignore.js +591 -0
- package/lib/Util/ignore.js.map +1 -0
- package/lib/Variable.d.ts +29 -0
- package/lib/Variable.d.ts.map +1 -0
- package/lib/Variable.js +9 -0
- package/lib/Variable.js.map +1 -0
- package/lib/index.d.ts +4 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +4 -0
- package/lib/index.js.map +1 -1
- package/lib/tsconfig.test.tsbuildinfo +1 -1
- package/package.json +22 -29
- package/src/AWS/Credentials.ts +1 -2
- package/src/AWS/DynamoDB/Stream.ts +1 -4
- package/src/AWS/EC2/hosted.ts +14 -16
- package/src/AWS/ECS/Task.ts +14 -16
- package/src/AWS/Endpoint.ts +2 -5
- package/src/AWS/EventBridge/EventSource.ts +1 -4
- package/src/AWS/Kinesis/StreamEventSource.ts +1 -4
- package/src/AWS/Lambda/Function.ts +47 -23
- package/src/AWS/Providers.ts +22 -3
- package/src/AWS/Region.ts +2 -3
- package/src/AWS/S3/Bucket.ts +7 -2
- package/src/AWS/S3/BucketNotifications.ts +1 -4
- package/src/AWS/SNS/TopicEventSource.ts +1 -4
- package/src/AWS/SQS/Queue.ts +40 -6
- package/src/Action.ts +280 -0
- package/src/Apply.ts +359 -24
- package/src/Artifacts.ts +2 -4
- package/src/Auth/AuthProvider.ts +1 -1
- package/src/Auth/Env.ts +12 -20
- package/src/Binding.ts +5 -9
- package/src/Bundle/Docker.ts +1 -1
- package/src/Cli/Event.ts +4 -0
- package/src/Cli/NamespaceTree.ts +52 -5
- package/src/Cli/commands/_shared.ts +2 -2
- package/src/Cli/commands/deploy.ts +1 -1
- package/src/Cli/commands/logs.ts +4 -4
- package/src/Cli/commands/tail.ts +4 -4
- package/src/Cli/tui/components/Plan.tsx +65 -17
- package/src/Cli/tui/components/PlanProgress.tsx +142 -32
- package/src/Cloudflare/Access.ts +1 -1
- package/src/Cloudflare/AnalyticsEngine/AnalyticsEngineDataset.ts +82 -0
- package/src/Cloudflare/AnalyticsEngine/AnalyticsEngineDatasetBinding.ts +106 -0
- package/src/Cloudflare/AnalyticsEngine/index.ts +2 -0
- package/src/Cloudflare/Artifacts/ArtifactsBinding.ts +1 -1
- package/src/Cloudflare/Container/Container.ts +1 -1
- package/src/Cloudflare/Container/ContainerApplication.ts +4 -6
- package/src/Cloudflare/Container/ContainerBinding.ts +2 -2
- package/src/Cloudflare/D1/D1Connection.ts +95 -12
- package/src/Cloudflare/Email/EmailAddress.ts +155 -0
- package/src/Cloudflare/Email/EmailRouting.ts +138 -0
- package/src/Cloudflare/Email/EmailRule.ts +210 -0
- package/src/Cloudflare/Email/SendEmail.ts +95 -0
- package/src/Cloudflare/Email/SendEmailBinding.ts +124 -0
- package/src/Cloudflare/Email/index.ts +5 -0
- package/src/Cloudflare/Images/ImagesBinding.ts +1 -1
- package/src/Cloudflare/KV/KVNamespaceBinding.ts +1 -1
- package/src/Cloudflare/Local/SidecarHandlers.ts +9 -1
- package/src/Cloudflare/Local/SidecarServer.ts +1 -1
- package/src/Cloudflare/Providers.ts +14 -0
- package/src/Cloudflare/Queue/QueueBinding.ts +1 -1
- package/src/Cloudflare/R2/R2Bucket.ts +31 -0
- package/src/Cloudflare/R2/R2BucketBinding.ts +1 -1
- package/src/Cloudflare/SecretsStore/SecretBinding.ts +1 -1
- package/src/Cloudflare/StateStore/Api.ts +34 -1
- package/src/Cloudflare/StateStore/Store.ts +40 -10
- package/src/Cloudflare/Workers/Assets.ts +5 -6
- package/src/Cloudflare/Workers/CronEventSource.ts +89 -0
- package/src/Cloudflare/Workers/InferEnv.ts +94 -20
- package/src/Cloudflare/Workers/LocalWorkerProvider.ts +9 -1
- package/src/Cloudflare/Workers/Rpc.ts +227 -18
- package/src/Cloudflare/Workers/Worker.ts +294 -65
- package/src/Cloudflare/Workers/WorkerBundle.ts +19 -11
- package/src/Cloudflare/Workers/Workflow.ts +76 -72
- package/src/Cloudflare/Workers/index.ts +1 -0
- package/src/Cloudflare/index.ts +2 -0
- package/src/Construct.ts +3 -7
- package/src/Deploy.ts +5 -1
- package/src/Destroy.ts +6 -1
- package/src/Http.ts +1 -1
- package/src/Namespace.ts +4 -4
- package/src/Neon/Branch.ts +93 -59
- package/src/Neon/Credentials.ts +2 -2
- package/src/Neon/Project.ts +193 -64
- package/src/Output.ts +129 -18
- package/src/Plan.ts +375 -36
- package/src/Platform.ts +26 -11
- package/src/Provider.ts +8 -3
- package/src/Random.ts +1 -1
- package/src/Ref.ts +10 -5
- package/src/Resource.ts +24 -25
- package/src/Runtime.ts +38 -0
- package/src/RuntimeContext.ts +1 -0
- package/src/Secret.ts +87 -0
- package/src/Serverless/Function.ts +10 -1
- package/src/Stack.ts +62 -35
- package/src/State/ActionState.ts +51 -0
- package/src/State/HttpStateApi.ts +21 -0
- package/src/State/HttpStateStore.ts +27 -2
- package/src/State/InMemoryState.ts +31 -10
- package/src/State/LocalState.ts +28 -4
- package/src/State/ResourceState.ts +5 -0
- package/src/State/State.ts +38 -2
- package/src/State/index.ts +1 -0
- package/src/Test/Bun.ts +43 -7
- package/src/Test/Core.ts +33 -11
- package/src/Test/Vitest.ts +33 -4
- package/src/Util/LocalhostDns.ts +30 -36
- package/src/Util/effect.ts +29 -4
- package/src/Util/hash.ts +14 -0
- package/src/Util/ignore.ts +815 -0
- package/src/Variable.ts +44 -0
- package/src/index.ts +9 -0
- package/lib/Agent/Agent.d.ts +0 -9
- package/lib/Agent/Agent.d.ts.map +0 -1
- package/lib/Agent/Agent.js +0 -10
- package/lib/Agent/Agent.js.map +0 -1
- package/lib/Agent/Aspect.d.ts +0 -51
- package/lib/Agent/Aspect.d.ts.map +0 -1
- package/lib/Agent/Aspect.js +0 -45
- package/lib/Agent/Aspect.js.map +0 -1
- package/lib/Agent/AspectGraph.d.ts +0 -45
- package/lib/Agent/AspectGraph.d.ts.map +0 -1
- package/lib/Agent/AspectGraph.js +0 -39
- package/lib/Agent/AspectGraph.js.map +0 -1
- package/lib/Agent/ContextPlugin.d.ts +0 -8
- package/lib/Agent/ContextPlugin.d.ts.map +0 -1
- package/lib/Agent/ContextPlugin.js +0 -3
- package/lib/Agent/ContextPlugin.js.map +0 -1
- package/lib/Agent/Plugin.d.ts +0 -18
- package/lib/Agent/Plugin.d.ts.map +0 -1
- package/lib/Agent/Plugin.js +0 -8
- package/lib/Agent/Plugin.js.map +0 -1
- package/lib/Agent/chat/channel.d.ts +0 -9
- package/lib/Agent/chat/channel.d.ts.map +0 -1
- package/lib/Agent/chat/channel.js +0 -10
- package/lib/Agent/chat/channel.js.map +0 -1
- package/lib/Agent/chat/event.d.ts +0 -32
- package/lib/Agent/chat/event.d.ts.map +0 -1
- package/lib/Agent/chat/event.js +0 -32
- package/lib/Agent/chat/event.js.map +0 -1
- package/lib/Agent/chat/message.d.ts +0 -22
- package/lib/Agent/chat/message.d.ts.map +0 -1
- package/lib/Agent/chat/message.js +0 -31
- package/lib/Agent/chat/message.js.map +0 -1
- package/lib/Agent/chat/service.d.ts +0 -102
- package/lib/Agent/chat/service.d.ts.map +0 -1
- package/lib/Agent/chat/service.js +0 -79
- package/lib/Agent/chat/service.js.map +0 -1
- package/lib/Agent/chat/thread.d.ts +0 -13
- package/lib/Agent/chat/thread.d.ts.map +0 -1
- package/lib/Agent/chat/thread.js +0 -16
- package/lib/Agent/chat/thread.js.map +0 -1
- package/lib/Agent/coding/bash.d.ts +0 -36
- package/lib/Agent/coding/bash.d.ts.map +0 -1
- package/lib/Agent/coding/bash.js +0 -170
- package/lib/Agent/coding/bash.js.map +0 -1
- package/lib/Agent/coding/edit.d.ts +0 -31
- package/lib/Agent/coding/edit.d.ts.map +0 -1
- package/lib/Agent/coding/edit.js +0 -90
- package/lib/Agent/coding/edit.js.map +0 -1
- package/lib/Agent/coding/glob.d.ts +0 -23
- package/lib/Agent/coding/glob.d.ts.map +0 -1
- package/lib/Agent/coding/glob.js +0 -78
- package/lib/Agent/coding/glob.js.map +0 -1
- package/lib/Agent/coding/grep.d.ts +0 -26
- package/lib/Agent/coding/grep.d.ts.map +0 -1
- package/lib/Agent/coding/grep.js +0 -105
- package/lib/Agent/coding/grep.js.map +0 -1
- package/lib/Agent/coding/index.d.ts +0 -8
- package/lib/Agent/coding/index.d.ts.map +0 -1
- package/lib/Agent/coding/index.js +0 -8
- package/lib/Agent/coding/index.js.map +0 -1
- package/lib/Agent/coding/read.d.ts +0 -27
- package/lib/Agent/coding/read.d.ts.map +0 -1
- package/lib/Agent/coding/read.js +0 -89
- package/lib/Agent/coding/read.js.map +0 -1
- package/lib/Agent/coding/readlints.d.ts +0 -19
- package/lib/Agent/coding/readlints.d.ts.map +0 -1
- package/lib/Agent/coding/readlints.js +0 -53
- package/lib/Agent/coding/readlints.js.map +0 -1
- package/lib/Agent/coding/write.d.ts +0 -22
- package/lib/Agent/coding/write.d.ts.map +0 -1
- package/lib/Agent/coding/write.js +0 -53
- package/lib/Agent/coding/write.js.map +0 -1
- package/lib/Agent/fs/file.d.ts +0 -12
- package/lib/Agent/fs/file.d.ts.map +0 -1
- package/lib/Agent/fs/file.js +0 -8
- package/lib/Agent/fs/file.js.map +0 -1
- package/lib/Agent/fs/folder.d.ts +0 -5
- package/lib/Agent/fs/folder.d.ts.map +0 -1
- package/lib/Agent/fs/folder.js +0 -3
- package/lib/Agent/fs/folder.js.map +0 -1
- package/lib/Agent/index.d.ts +0 -9
- package/lib/Agent/index.d.ts.map +0 -1
- package/lib/Agent/index.js +0 -9
- package/lib/Agent/index.js.map +0 -1
- package/lib/Agent/llm/error.d.ts +0 -208
- package/lib/Agent/llm/error.d.ts.map +0 -1
- package/lib/Agent/llm/error.js +0 -209
- package/lib/Agent/llm/error.js.map +0 -1
- package/lib/Agent/llm/index.d.ts +0 -5
- package/lib/Agent/llm/index.d.ts.map +0 -1
- package/lib/Agent/llm/index.js +0 -5
- package/lib/Agent/llm/index.js.map +0 -1
- package/lib/Agent/llm/llm.d.ts +0 -32
- package/lib/Agent/llm/llm.d.ts.map +0 -1
- package/lib/Agent/llm/llm.js +0 -74
- package/lib/Agent/llm/llm.js.map +0 -1
- package/lib/Agent/llm/stream-collectors.d.ts +0 -46
- package/lib/Agent/llm/stream-collectors.d.ts.map +0 -1
- package/lib/Agent/llm/stream-collectors.js +0 -33
- package/lib/Agent/llm/stream-collectors.js.map +0 -1
- package/lib/Agent/llm/stream-text-part.d.ts +0 -5
- package/lib/Agent/llm/stream-text-part.d.ts.map +0 -1
- package/lib/Agent/llm/stream-text-part.js +0 -4
- package/lib/Agent/llm/stream-text-part.js.map +0 -1
- package/lib/Agent/lsp/client.d.ts +0 -122
- package/lib/Agent/lsp/client.d.ts.map +0 -1
- package/lib/Agent/lsp/client.js +0 -180
- package/lib/Agent/lsp/client.js.map +0 -1
- package/lib/Agent/lsp/diagnostics.d.ts +0 -16
- package/lib/Agent/lsp/diagnostics.d.ts.map +0 -1
- package/lib/Agent/lsp/diagnostics.js +0 -48
- package/lib/Agent/lsp/diagnostics.js.map +0 -1
- package/lib/Agent/lsp/jsonrpc.d.ts +0 -90
- package/lib/Agent/lsp/jsonrpc.d.ts.map +0 -1
- package/lib/Agent/lsp/jsonrpc.js +0 -178
- package/lib/Agent/lsp/jsonrpc.js.map +0 -1
- package/lib/Agent/lsp/manager.d.ts +0 -38
- package/lib/Agent/lsp/manager.d.ts.map +0 -1
- package/lib/Agent/lsp/manager.js +0 -98
- package/lib/Agent/lsp/manager.js.map +0 -1
- package/lib/Agent/lsp/servers.d.ts +0 -28
- package/lib/Agent/lsp/servers.d.ts.map +0 -1
- package/lib/Agent/lsp/servers.js +0 -21
- package/lib/Agent/lsp/servers.js.map +0 -1
- package/lib/Agent/process/driver.d.ts +0 -10
- package/lib/Agent/process/driver.d.ts.map +0 -1
- package/lib/Agent/process/driver.js +0 -153
- package/lib/Agent/process/driver.js.map +0 -1
- package/lib/Agent/process/issue-service.d.ts +0 -44
- package/lib/Agent/process/issue-service.d.ts.map +0 -1
- package/lib/Agent/process/issue-service.js +0 -28
- package/lib/Agent/process/issue-service.js.map +0 -1
- package/lib/Agent/process/issue-tools.d.ts +0 -28
- package/lib/Agent/process/issue-tools.d.ts.map +0 -1
- package/lib/Agent/process/issue-tools.js +0 -28
- package/lib/Agent/process/issue-tools.js.map +0 -1
- package/lib/Agent/process/issue.d.ts +0 -16
- package/lib/Agent/process/issue.d.ts.map +0 -1
- package/lib/Agent/process/issue.js +0 -17
- package/lib/Agent/process/issue.js.map +0 -1
- package/lib/Agent/process/organization.d.ts +0 -4
- package/lib/Agent/process/organization.d.ts.map +0 -1
- package/lib/Agent/process/organization.js +0 -3
- package/lib/Agent/process/organization.js.map +0 -1
- package/lib/Agent/process/process.d.ts +0 -5
- package/lib/Agent/process/process.d.ts.map +0 -1
- package/lib/Agent/process/process.js +0 -3
- package/lib/Agent/process/process.js.map +0 -1
- package/lib/Agent/process/reply.d.ts +0 -16
- package/lib/Agent/process/reply.d.ts.map +0 -1
- package/lib/Agent/process/reply.js +0 -18
- package/lib/Agent/process/reply.js.map +0 -1
- package/lib/Agent/process/task.d.ts +0 -25
- package/lib/Agent/process/task.d.ts.map +0 -1
- package/lib/Agent/process/task.js +0 -26
- package/lib/Agent/process/task.js.map +0 -1
- package/lib/Agent/tool/index.d.ts +0 -4
- package/lib/Agent/tool/index.d.ts.map +0 -1
- package/lib/Agent/tool/index.js +0 -4
- package/lib/Agent/tool/index.js.map +0 -1
- package/lib/Agent/tool/parameter.d.ts +0 -12
- package/lib/Agent/tool/parameter.d.ts.map +0 -1
- package/lib/Agent/tool/parameter.js +0 -6
- package/lib/Agent/tool/parameter.js.map +0 -1
- package/lib/Agent/tool/result.d.ts +0 -17
- package/lib/Agent/tool/result.d.ts.map +0 -1
- package/lib/Agent/tool/result.js +0 -6
- package/lib/Agent/tool/result.js.map +0 -1
- package/lib/Agent/tool/tool.d.ts +0 -32
- package/lib/Agent/tool/tool.d.ts.map +0 -1
- package/lib/Agent/tool/tool.js +0 -16
- package/lib/Agent/tool/tool.js.map +0 -1
- package/lib/Agent/util/command-validator.d.ts +0 -12
- package/lib/Agent/util/command-validator.d.ts.map +0 -1
- package/lib/Agent/util/command-validator.js +0 -74
- package/lib/Agent/util/command-validator.js.map +0 -1
- package/lib/Agent/util/exec.d.ts.map +0 -1
- package/lib/Agent/util/exec.js.map +0 -1
- package/lib/Agent/util/parser.d.ts +0 -5
- package/lib/Agent/util/parser.d.ts.map +0 -1
- package/lib/Agent/util/parser.js +0 -41
- package/lib/Agent/util/parser.js.map +0 -1
- package/lib/Agent/util/replace.d.ts +0 -38
- package/lib/Agent/util/replace.d.ts.map +0 -1
- package/lib/Agent/util/replace.js +0 -458
- package/lib/Agent/util/replace.js.map +0 -1
- package/lib/Agent/util/ripgrep.d.ts +0 -109
- package/lib/Agent/util/ripgrep.d.ts.map +0 -1
- package/lib/Agent/util/ripgrep.js +0 -221
- package/lib/Agent/util/ripgrep.js.map +0 -1
- package/lib/Neon/api.d.ts +0 -258
- package/lib/Neon/api.d.ts.map +0 -1
- package/lib/Neon/api.js +0 -215
- package/lib/Neon/api.js.map +0 -1
- package/src/Agent/Agent.ts +0 -26
- package/src/Agent/Aspect.ts +0 -173
- package/src/Agent/AspectGraph.ts +0 -98
- package/src/Agent/ContextPlugin.ts +0 -18
- package/src/Agent/Plugin.ts +0 -29
- package/src/Agent/chat/channel.ts +0 -26
- package/src/Agent/chat/event.ts +0 -43
- package/src/Agent/chat/message.ts +0 -35
- package/src/Agent/chat/service.ts +0 -133
- package/src/Agent/chat/thread.ts +0 -17
- package/src/Agent/coding/bash.ts +0 -197
- package/src/Agent/coding/edit.ts +0 -152
- package/src/Agent/coding/glob.ts +0 -96
- package/src/Agent/coding/grep.ts +0 -143
- package/src/Agent/coding/index.ts +0 -7
- package/src/Agent/coding/read.ts +0 -119
- package/src/Agent/coding/readlints.ts +0 -78
- package/src/Agent/coding/write.ts +0 -79
- package/src/Agent/fs/file.ts +0 -22
- package/src/Agent/fs/folder.ts +0 -16
- package/src/Agent/index.ts +0 -9
- package/src/Agent/llm/error.ts +0 -330
- package/src/Agent/llm/index.ts +0 -4
- package/src/Agent/llm/llm.ts +0 -131
- package/src/Agent/llm/stream-collectors.ts +0 -58
- package/src/Agent/llm/stream-text-part.ts +0 -7
- package/src/Agent/lsp/client.ts +0 -293
- package/src/Agent/lsp/diagnostics.ts +0 -64
- package/src/Agent/lsp/jsonrpc.ts +0 -317
- package/src/Agent/lsp/manager.ts +0 -213
- package/src/Agent/lsp/servers.ts +0 -37
- package/src/Agent/process/driver.ts +0 -168
- package/src/Agent/process/issue-service.ts +0 -48
- package/src/Agent/process/issue-tools.ts +0 -33
- package/src/Agent/process/issue.ts +0 -22
- package/src/Agent/process/organization.ts +0 -16
- package/src/Agent/process/process.ts +0 -16
- package/src/Agent/process/reply.ts +0 -21
- package/src/Agent/process/task.ts +0 -34
- package/src/Agent/tool/index.ts +0 -3
- package/src/Agent/tool/parameter.ts +0 -35
- package/src/Agent/tool/result.ts +0 -51
- package/src/Agent/tool/tool.ts +0 -74
- package/src/Agent/util/command-validator.ts +0 -98
- package/src/Agent/util/parser.ts +0 -39
- package/src/Agent/util/replace.ts +0 -559
- package/src/Agent/util/ripgrep.ts +0 -256
- package/src/Neon/api.ts +0 -579
- /package/lib/{Agent/util → Util}/exec.d.ts +0 -0
- /package/lib/{Agent/util → Util}/exec.js +0 -0
- /package/src/{Agent/util → Util}/exec.ts +0 -0
package/src/Plan.ts
CHANGED
|
@@ -42,12 +42,17 @@ import {
|
|
|
42
42
|
State,
|
|
43
43
|
type CreatedResourceState,
|
|
44
44
|
type CreatingResourceState,
|
|
45
|
+
isActionState,
|
|
46
|
+
type RanActionState,
|
|
45
47
|
type ReplacedResourceState,
|
|
46
48
|
type ReplacingResourceState,
|
|
47
49
|
type ResourceState,
|
|
50
|
+
type ActionState,
|
|
48
51
|
type UpdatedResourceState,
|
|
49
52
|
type UpdatingReourceState,
|
|
50
53
|
} from "./State/index.ts";
|
|
54
|
+
import { isAction, type ActionLike } from "./Action.ts";
|
|
55
|
+
import { hashInput } from "./Util/hash.ts";
|
|
51
56
|
import { findCycleMembers } from "./Util/scc.ts";
|
|
52
57
|
|
|
53
58
|
export type PlanError = never;
|
|
@@ -148,13 +153,66 @@ export interface Replace<
|
|
|
148
153
|
| ReplacedResourceState;
|
|
149
154
|
}
|
|
150
155
|
|
|
156
|
+
// ── Tasks ──────────────────────────────────────────────────────────────────
|
|
157
|
+
//
|
|
158
|
+
// Tasks live in the same FQN namespace as resources and participate in the
|
|
159
|
+
// same DAG (downstream/upstream edges, cycle detection). Their plan nodes
|
|
160
|
+
// have a different shape because they have no provider lifecycle.
|
|
161
|
+
|
|
162
|
+
export type ActionApply<T extends ActionLike = ActionLike> =
|
|
163
|
+
| ActionRun<T>
|
|
164
|
+
| ActionNoop<T>;
|
|
165
|
+
|
|
166
|
+
export interface ActionNodeBase<T extends ActionLike = ActionLike> {
|
|
167
|
+
readonly kind: "action";
|
|
168
|
+
def: T;
|
|
169
|
+
downstream: string[];
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
export interface ActionRun<
|
|
173
|
+
T extends ActionLike = ActionLike,
|
|
174
|
+
> extends ActionNodeBase<T> {
|
|
175
|
+
action: "run";
|
|
176
|
+
/** Input expression — resolved against tracker outputs during apply. */
|
|
177
|
+
input: T["Input"];
|
|
178
|
+
/** Previous state, if any. `undefined` on the first run. */
|
|
179
|
+
state: ActionState | undefined;
|
|
180
|
+
/** True when `--force` triggered the re-run regardless of input drift. */
|
|
181
|
+
forced: boolean;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
export interface ActionNoop<
|
|
185
|
+
T extends ActionLike = ActionLike,
|
|
186
|
+
> extends ActionNodeBase<T> {
|
|
187
|
+
action: "noop";
|
|
188
|
+
state: RanActionState;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export interface ActionDelete<
|
|
192
|
+
T extends ActionLike = ActionLike,
|
|
193
|
+
> extends ActionNodeBase<T> {
|
|
194
|
+
action: "delete";
|
|
195
|
+
state: ActionState;
|
|
196
|
+
}
|
|
197
|
+
|
|
151
198
|
export type Plan<Output = any> = {
|
|
152
199
|
resources: {
|
|
153
200
|
[id in string]: Apply<any>;
|
|
154
201
|
};
|
|
202
|
+
/**
|
|
203
|
+
* Tasks scheduled for this apply. Keyed by FQN, same namespace as
|
|
204
|
+
* `resources` — Apply's scheduler merges both into a single DAG.
|
|
205
|
+
*/
|
|
206
|
+
actions: {
|
|
207
|
+
[id in string]: ActionApply;
|
|
208
|
+
};
|
|
155
209
|
deletions: {
|
|
156
210
|
[id in string]?: Delete<ResourceLike>;
|
|
157
211
|
};
|
|
212
|
+
/** Tasks whose state should be dropped (no body invoked on removal). */
|
|
213
|
+
actionDeletions: {
|
|
214
|
+
[id in string]?: ActionDelete;
|
|
215
|
+
};
|
|
158
216
|
output: Output;
|
|
159
217
|
/**
|
|
160
218
|
* FQNs of resources that participate in a strongly-connected component
|
|
@@ -179,6 +237,7 @@ export const make = <A>(
|
|
|
179
237
|
const state = yield* State;
|
|
180
238
|
|
|
181
239
|
const resources = Object.values(stack.resources);
|
|
240
|
+
const actions = Object.values(stack.actions ?? {});
|
|
182
241
|
|
|
183
242
|
// TODO(sam): rename terminology to Stack
|
|
184
243
|
const stackName = stack.name;
|
|
@@ -215,6 +274,12 @@ export const make = <A>(
|
|
|
215
274
|
resourceExpr: Output.ResourceExpr<any, any>,
|
|
216
275
|
): Effect.Effect<any> =>
|
|
217
276
|
Effect.gen(function* () {
|
|
277
|
+
// Tasks share the ResourceExpr machinery but have no provider /
|
|
278
|
+
// stable-properties story at plan time. Leave the expression
|
|
279
|
+
// unsubstituted — Apply resolves it from the tracker at run time.
|
|
280
|
+
if (isAction(resourceExpr.src as any)) {
|
|
281
|
+
return resourceExpr;
|
|
282
|
+
}
|
|
218
283
|
// @ts-expect-error
|
|
219
284
|
return yield* (resolvedResources[resourceExpr.src.FQN] ??=
|
|
220
285
|
yield* Effect.cached(
|
|
@@ -223,11 +288,16 @@ export const make = <A>(
|
|
|
223
288
|
|
|
224
289
|
const provider = yield* findProviderByType(resource.Type);
|
|
225
290
|
const props = yield* resolveInput(resource.Props);
|
|
226
|
-
const
|
|
291
|
+
const persisted = yield* state.get({
|
|
227
292
|
stack: stackName,
|
|
228
293
|
stage: stage,
|
|
229
294
|
fqn: resource.FQN,
|
|
230
295
|
});
|
|
296
|
+
const oldState: ResourceState | undefined = isActionState(
|
|
297
|
+
persisted,
|
|
298
|
+
)
|
|
299
|
+
? undefined
|
|
300
|
+
: (persisted as ResourceState | undefined);
|
|
231
301
|
|
|
232
302
|
if (!oldState || oldState.status === "creating") {
|
|
233
303
|
return resourceExpr;
|
|
@@ -349,8 +419,53 @@ export const make = <A>(
|
|
|
349
419
|
});
|
|
350
420
|
} else if (Output.isLiteralExpr(expr)) {
|
|
351
421
|
return expr.value;
|
|
422
|
+
} else if (Output.isRefExpr(expr)) {
|
|
423
|
+
const refStack = expr.stack ?? stackName;
|
|
424
|
+
const refStage = expr.stage ?? stage;
|
|
425
|
+
const refState = yield* state
|
|
426
|
+
.get({
|
|
427
|
+
stack: refStack,
|
|
428
|
+
stage: refStage,
|
|
429
|
+
fqn: expr.resourceId,
|
|
430
|
+
})
|
|
431
|
+
.pipe(Effect.orDie);
|
|
432
|
+
if (!refState) {
|
|
433
|
+
return yield* Effect.die(
|
|
434
|
+
new Output.InvalidReferenceError({
|
|
435
|
+
message: `Reference to '${expr.resourceId}' in stack '${refStack}' and stage '${refStage}' not found. Have you deployed '${refStage}' of '${refStack}'?`,
|
|
436
|
+
stack: refStack,
|
|
437
|
+
stage: refStage,
|
|
438
|
+
resourceId: expr.resourceId,
|
|
439
|
+
}),
|
|
440
|
+
);
|
|
441
|
+
}
|
|
442
|
+
return (refState as any).attr ?? (refState as any).output;
|
|
443
|
+
} else if (Output.isStackRefExpr(expr)) {
|
|
444
|
+
const refStack = expr.stack;
|
|
445
|
+
const refStage = expr.stage ?? stage;
|
|
446
|
+
const output = yield* state
|
|
447
|
+
.getOutput({
|
|
448
|
+
stack: refStack,
|
|
449
|
+
stage: refStage,
|
|
450
|
+
})
|
|
451
|
+
.pipe(Effect.orDie);
|
|
452
|
+
if (output == null) {
|
|
453
|
+
return yield* Effect.die(
|
|
454
|
+
new Output.InvalidReferenceError({
|
|
455
|
+
message: `Reference to stack '${refStack}' at stage '${refStage}' not found. Have you deployed stage '${refStage}' of '${refStack}'?`,
|
|
456
|
+
stack: refStack,
|
|
457
|
+
stage: refStage,
|
|
458
|
+
resourceId: refStack,
|
|
459
|
+
}),
|
|
460
|
+
);
|
|
461
|
+
}
|
|
462
|
+
return output;
|
|
463
|
+
} else if (Output.isNamedExpr(expr)) {
|
|
464
|
+
return yield* resolveOutput(expr.expr);
|
|
352
465
|
}
|
|
353
|
-
return yield* Effect.die(
|
|
466
|
+
return yield* Effect.die(
|
|
467
|
+
new Error("Not implemented yet" + (expr as any).kind),
|
|
468
|
+
);
|
|
354
469
|
});
|
|
355
470
|
|
|
356
471
|
// map of resource FQN -> its downstream dependencies (resources that depend on it)
|
|
@@ -364,16 +479,30 @@ export const make = <A>(
|
|
|
364
479
|
|
|
365
480
|
// Build a set of FQNs for the new resources to detect orphans
|
|
366
481
|
const newResourceFqns = new Set(resources.map((r) => r.FQN));
|
|
482
|
+
const newActionFqns = new Set(actions.map((t) => t.FQN));
|
|
483
|
+
// Unified set used wherever the DAG must include both kinds.
|
|
484
|
+
const newNodeFqns = new Set<string>([...newResourceFqns, ...newActionFqns]);
|
|
367
485
|
|
|
368
|
-
// Map FQN -> list of upstream FQNs (resources this one depends on via props)
|
|
486
|
+
// Map FQN -> list of upstream FQNs (resources this one depends on via props).
|
|
487
|
+
// Tasks contribute upstream edges through their `Input` expression.
|
|
369
488
|
const newUpstreamDependencies: {
|
|
370
489
|
[fqn: string]: string[];
|
|
371
|
-
} = Object.fromEntries(
|
|
372
|
-
resources.map(
|
|
373
|
-
resource
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
490
|
+
} = Object.fromEntries([
|
|
491
|
+
...resources.map(
|
|
492
|
+
(resource) =>
|
|
493
|
+
[
|
|
494
|
+
resource.FQN,
|
|
495
|
+
Object.values(Output.upstreamAny(resource.Props)).map((r) => r.FQN),
|
|
496
|
+
] as const,
|
|
497
|
+
),
|
|
498
|
+
...actions.map(
|
|
499
|
+
(action) =>
|
|
500
|
+
[
|
|
501
|
+
action.FQN,
|
|
502
|
+
Object.values(Output.upstreamAny(action.Input)).map((r) => r.FQN),
|
|
503
|
+
] as const,
|
|
504
|
+
),
|
|
505
|
+
]);
|
|
377
506
|
|
|
378
507
|
// Map FQN -> list of upstream FQNs from bindings
|
|
379
508
|
const bindingUpstreamDependencies: {
|
|
@@ -392,38 +521,101 @@ export const make = <A>(
|
|
|
392
521
|
// tell whether any surviving resource still points at an orphan.
|
|
393
522
|
const rawUpstreamDependencies: {
|
|
394
523
|
[fqn: string]: string[];
|
|
395
|
-
} = Object.fromEntries(
|
|
396
|
-
resources.map((resource) => {
|
|
524
|
+
} = Object.fromEntries<string[]>([
|
|
525
|
+
...resources.map((resource): [string, string[]] => {
|
|
397
526
|
const fqn = resource.FQN;
|
|
398
527
|
const propDeps = newUpstreamDependencies[fqn] ?? [];
|
|
399
528
|
const bindDeps = bindingUpstreamDependencies[fqn] ?? [];
|
|
400
529
|
return [fqn, [...new Set([...propDeps, ...bindDeps])]];
|
|
401
530
|
}),
|
|
402
|
-
|
|
531
|
+
// Actions have no bindings — their upstream is purely their input.
|
|
532
|
+
...actions.map((action): [string, string[]] => {
|
|
533
|
+
const fqn = action.FQN;
|
|
534
|
+
return [fqn, newUpstreamDependencies[fqn] ?? []];
|
|
535
|
+
}),
|
|
536
|
+
]);
|
|
403
537
|
|
|
404
|
-
// Combined prop + binding upstream, filtered to resources in this
|
|
405
|
-
// scheduling and cycle detection.
|
|
538
|
+
// Combined prop + binding upstream, filtered to resources/tasks in this
|
|
539
|
+
// graph for scheduling and cycle detection.
|
|
406
540
|
const allUpstreamDependencies: {
|
|
407
541
|
[fqn: string]: string[];
|
|
408
|
-
} = Object.fromEntries(
|
|
409
|
-
resources.map((resource) => {
|
|
542
|
+
} = Object.fromEntries([
|
|
543
|
+
...resources.map((resource) => {
|
|
410
544
|
const fqn = resource.FQN;
|
|
411
545
|
const deps = rawUpstreamDependencies[fqn] ?? [];
|
|
412
|
-
return [fqn, deps.filter((dep) =>
|
|
546
|
+
return [fqn, deps.filter((dep) => newNodeFqns.has(dep))] as const;
|
|
413
547
|
}),
|
|
414
|
-
|
|
548
|
+
...actions.map((action) => {
|
|
549
|
+
const fqn = action.FQN;
|
|
550
|
+
const deps = newUpstreamDependencies[fqn] ?? [];
|
|
551
|
+
return [fqn, deps.filter((dep) => newNodeFqns.has(dep))] as const;
|
|
552
|
+
}),
|
|
553
|
+
]);
|
|
554
|
+
|
|
555
|
+
// Resources that participate in a cycle when both prop and binding
|
|
556
|
+
// edges are considered. Used below to decide whether an acyclic
|
|
557
|
+
// binding edge should also become a downstream edge.
|
|
558
|
+
const combinedCycleMembers = findCycleMembers(allUpstreamDependencies);
|
|
559
|
+
|
|
560
|
+
// Map FQN -> list of downstream FQNs (resources/actions that depend on
|
|
561
|
+
// this one).
|
|
562
|
+
//
|
|
563
|
+
// Prop edges always become downstream edges — they can't form cycles
|
|
564
|
+
// (the resource graph is a DAG by construction once props are fully
|
|
565
|
+
// resolved). Binding edges become downstream edges too, except when
|
|
566
|
+
// they participate in a cycle in the combined graph: mutual bindings
|
|
567
|
+
// (A binds to B's data, B binds to A's data) intentionally do not
|
|
568
|
+
// create downstream edges, so deletion does not deadlock waiting on
|
|
569
|
+
// each other (see the "binding-only cycles inside a construct" test
|
|
570
|
+
// in `plan.test.ts`).
|
|
571
|
+
//
|
|
572
|
+
// Including acyclic binding edges is required for cloud APIs that
|
|
573
|
+
// enforce the binding at the provider level — e.g. a Cloudflare
|
|
574
|
+
// Worker with a `service` binding to another Worker cannot delete
|
|
575
|
+
// the upstream worker until the downstream worker's binding has been
|
|
576
|
+
// removed. Without the binding edge in `downstream`, the two delete
|
|
577
|
+
// concurrently and the upstream delete fails with
|
|
578
|
+
// `ServiceBindingConflict`.
|
|
579
|
+
//
|
|
580
|
+
// Actions don't have bindings, so for action upstreams we use only
|
|
581
|
+
// prop edges (which collapse to `newUpstreamDependencies` lookups).
|
|
582
|
+
const computeDownstream = (upFqn: string): string[] => {
|
|
583
|
+
const downstream: string[] = [];
|
|
584
|
+
for (const [downFqn, upstreams] of Object.entries(
|
|
585
|
+
rawUpstreamDependencies,
|
|
586
|
+
)) {
|
|
587
|
+
if (downFqn === upFqn) continue;
|
|
588
|
+
if (!upstreams.includes(upFqn)) continue;
|
|
589
|
+
const isPropEdge = (newUpstreamDependencies[downFqn] ?? []).includes(
|
|
590
|
+
upFqn,
|
|
591
|
+
);
|
|
592
|
+
if (isPropEdge) {
|
|
593
|
+
downstream.push(downFqn);
|
|
594
|
+
continue;
|
|
595
|
+
}
|
|
596
|
+
// Binding-only edge — exclude when both endpoints sit inside
|
|
597
|
+
// the same SCC of the combined graph.
|
|
598
|
+
if (
|
|
599
|
+
combinedCycleMembers.has(upFqn) &&
|
|
600
|
+
combinedCycleMembers.has(downFqn)
|
|
601
|
+
) {
|
|
602
|
+
continue;
|
|
603
|
+
}
|
|
604
|
+
downstream.push(downFqn);
|
|
605
|
+
}
|
|
606
|
+
return downstream;
|
|
607
|
+
};
|
|
415
608
|
|
|
416
|
-
// Map FQN -> list of downstream FQNs (resources that depend on this one)
|
|
417
609
|
const newDownstreamDependencies: {
|
|
418
610
|
[fqn: string]: string[];
|
|
419
|
-
} = Object.fromEntries(
|
|
420
|
-
resources.map(
|
|
421
|
-
resource.FQN,
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
);
|
|
611
|
+
} = Object.fromEntries([
|
|
612
|
+
...resources.map(
|
|
613
|
+
(resource) => [resource.FQN, computeDownstream(resource.FQN)] as const,
|
|
614
|
+
),
|
|
615
|
+
...actions.map(
|
|
616
|
+
(action) => [action.FQN, computeDownstream(action.FQN)] as const,
|
|
617
|
+
),
|
|
618
|
+
]);
|
|
427
619
|
|
|
428
620
|
const resourceGraph = Object.fromEntries(
|
|
429
621
|
(yield* Effect.all(
|
|
@@ -438,11 +630,17 @@ export const make = <A>(
|
|
|
438
630
|
const newBindings: ResourceBinding[] = yield* resolveInput(
|
|
439
631
|
stack.bindings[fqn] ?? [],
|
|
440
632
|
);
|
|
441
|
-
|
|
633
|
+
const persisted = yield* state.get({
|
|
442
634
|
stack: stackName,
|
|
443
635
|
stage: stage,
|
|
444
636
|
fqn,
|
|
445
637
|
});
|
|
638
|
+
// A Task previously held this FQN. Treat as if there were no
|
|
639
|
+
// prior state — the Task's row will be reaped by `actionDeletions`
|
|
640
|
+
// below and the resource starts from scratch.
|
|
641
|
+
let oldState: ResourceState | undefined = isActionState(persisted)
|
|
642
|
+
? undefined
|
|
643
|
+
: (persisted as ResourceState | undefined);
|
|
446
644
|
|
|
447
645
|
// Engine-level adoption. When there is no prior state, always
|
|
448
646
|
// consult `provider.read` (if implemented) so the engine — not
|
|
@@ -789,10 +987,76 @@ export const make = <A>(
|
|
|
789
987
|
)).map((update) => [update.resource.FQN, update]),
|
|
790
988
|
) as Plan["resources"];
|
|
791
989
|
|
|
792
|
-
//
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
990
|
+
// ── Action plan nodes ────────────────────────────────────────────────
|
|
991
|
+
const actionGraph = Object.fromEntries(
|
|
992
|
+
(yield* Effect.all(
|
|
993
|
+
actions.map(
|
|
994
|
+
Effect.fn("plan.diff.action")(function* (action) {
|
|
995
|
+
const fqn = action.FQN;
|
|
996
|
+
const downstream = newDownstreamDependencies[fqn] ?? [];
|
|
997
|
+
const resolvedInput = yield* resolveInput(action.Input);
|
|
998
|
+
const inputHash = yield* hashInput(resolvedInput);
|
|
999
|
+
const oldState = yield* state.get({
|
|
1000
|
+
stack: stackName,
|
|
1001
|
+
stage,
|
|
1002
|
+
fqn,
|
|
1003
|
+
});
|
|
1004
|
+
|
|
1005
|
+
if (oldState && !isActionState(oldState)) {
|
|
1006
|
+
// FQN collision with a resource — surface as a fatal error so
|
|
1007
|
+
// the user resolves it before we touch anything.
|
|
1008
|
+
return [
|
|
1009
|
+
fqn,
|
|
1010
|
+
{
|
|
1011
|
+
kind: "action",
|
|
1012
|
+
action: "run",
|
|
1013
|
+
def: action,
|
|
1014
|
+
input: action.Input,
|
|
1015
|
+
state: undefined,
|
|
1016
|
+
downstream,
|
|
1017
|
+
forced: false,
|
|
1018
|
+
} satisfies ActionRun,
|
|
1019
|
+
] as const;
|
|
1020
|
+
}
|
|
1021
|
+
|
|
1022
|
+
const prior = oldState as ActionState | undefined;
|
|
1023
|
+
const sameInput =
|
|
1024
|
+
prior?.status === "ran" && prior.inputHash === inputHash;
|
|
1025
|
+
if (sameInput && !options.force) {
|
|
1026
|
+
return [
|
|
1027
|
+
fqn,
|
|
1028
|
+
{
|
|
1029
|
+
kind: "action",
|
|
1030
|
+
action: "noop",
|
|
1031
|
+
def: action,
|
|
1032
|
+
state: prior as RanActionState,
|
|
1033
|
+
downstream,
|
|
1034
|
+
} satisfies ActionNoop,
|
|
1035
|
+
] as const;
|
|
1036
|
+
}
|
|
1037
|
+
return [
|
|
1038
|
+
fqn,
|
|
1039
|
+
{
|
|
1040
|
+
kind: "action",
|
|
1041
|
+
action: "run",
|
|
1042
|
+
def: action,
|
|
1043
|
+
input: action.Input,
|
|
1044
|
+
state: prior,
|
|
1045
|
+
downstream,
|
|
1046
|
+
forced: !!options.force,
|
|
1047
|
+
} satisfies ActionRun,
|
|
1048
|
+
] as const;
|
|
1049
|
+
}),
|
|
1050
|
+
),
|
|
1051
|
+
{ concurrency: "unbounded" },
|
|
1052
|
+
)) as ReadonlyArray<readonly [string, ActionApply]>,
|
|
1053
|
+
) as Plan["actions"];
|
|
1054
|
+
|
|
1055
|
+
// SCC membership of the combined upstream graph. Apply uses it to
|
|
1056
|
+
// decide whether an update node must publish its prior attr early to
|
|
1057
|
+
// break a cycle, or can simply wait for upstreams like a DAG node
|
|
1058
|
+
// (the common case). Computed once, above, for the downstream graph.
|
|
1059
|
+
const cycleMembers = combinedCycleMembers;
|
|
796
1060
|
|
|
797
1061
|
// Detect unsatisfiable dependency cycles among create/replace nodes.
|
|
798
1062
|
// Update/noop nodes signal their Deferred before waitForDeps when in a
|
|
@@ -855,18 +1119,61 @@ export const make = <A>(
|
|
|
855
1119
|
}
|
|
856
1120
|
}
|
|
857
1121
|
|
|
1122
|
+
// Task deletions: state rows previously written by tasks that no
|
|
1123
|
+
// longer appear in the stack. The body is NOT invoked — we just drop
|
|
1124
|
+
// the row.
|
|
1125
|
+
const actionDeletions: Plan["actionDeletions"] = Object.fromEntries(
|
|
1126
|
+
(yield* Effect.all(
|
|
1127
|
+
(yield* state.list({ stack: stackName, stage })).map(
|
|
1128
|
+
Effect.fn("plan.diff.actionDeletion")(function* (fqn) {
|
|
1129
|
+
if (newActionFqns.has(fqn) || newResourceFqns.has(fqn)) return;
|
|
1130
|
+
const persisted = yield* state.get({
|
|
1131
|
+
stack: stackName,
|
|
1132
|
+
stage,
|
|
1133
|
+
fqn,
|
|
1134
|
+
});
|
|
1135
|
+
if (!isActionState(persisted)) return;
|
|
1136
|
+
const { logicalId } = parseFqn(fqn);
|
|
1137
|
+
return [
|
|
1138
|
+
fqn,
|
|
1139
|
+
{
|
|
1140
|
+
kind: "action",
|
|
1141
|
+
action: "delete",
|
|
1142
|
+
state: persisted,
|
|
1143
|
+
downstream: persisted.downstream ?? [],
|
|
1144
|
+
def: {
|
|
1145
|
+
Kind: "action",
|
|
1146
|
+
Namespace: persisted.namespace,
|
|
1147
|
+
FQN: fqn,
|
|
1148
|
+
LogicalId: logicalId,
|
|
1149
|
+
Type: persisted.actionType,
|
|
1150
|
+
Input: persisted.input,
|
|
1151
|
+
Run: () => undefined as any,
|
|
1152
|
+
Output: undefined as any,
|
|
1153
|
+
} satisfies ActionLike,
|
|
1154
|
+
} satisfies ActionDelete,
|
|
1155
|
+
] as const;
|
|
1156
|
+
}),
|
|
1157
|
+
),
|
|
1158
|
+
{ concurrency: "unbounded" },
|
|
1159
|
+
)).filter((v): v is NonNullable<typeof v> => !!v),
|
|
1160
|
+
);
|
|
1161
|
+
|
|
858
1162
|
const deletions = Object.fromEntries(
|
|
859
1163
|
(yield* Effect.all(
|
|
860
1164
|
(yield* state.list({ stack: stackName, stage: stage })).map(
|
|
861
1165
|
Effect.fn("plan.diff.deletion")(function* (fqn) {
|
|
862
|
-
if (newResourceFqns.has(fqn)) {
|
|
1166
|
+
if (newResourceFqns.has(fqn) || newActionFqns.has(fqn)) {
|
|
863
1167
|
return;
|
|
864
1168
|
}
|
|
865
|
-
const
|
|
1169
|
+
const persisted = yield* state.get({
|
|
866
1170
|
stack: stackName,
|
|
867
1171
|
stage: stage,
|
|
868
1172
|
fqn,
|
|
869
1173
|
});
|
|
1174
|
+
// Tasks are routed through `actionDeletions` above.
|
|
1175
|
+
if (isActionState(persisted)) return;
|
|
1176
|
+
const oldState = persisted as ResourceState | undefined;
|
|
870
1177
|
let attr: any = oldState?.attr;
|
|
871
1178
|
if (oldState) {
|
|
872
1179
|
const { logicalId } = parseFqn(fqn);
|
|
@@ -936,7 +1243,9 @@ export const make = <A>(
|
|
|
936
1243
|
|
|
937
1244
|
return {
|
|
938
1245
|
resources: resourceGraph,
|
|
1246
|
+
actions: actionGraph,
|
|
939
1247
|
deletions,
|
|
1248
|
+
actionDeletions,
|
|
940
1249
|
output: stack.output,
|
|
941
1250
|
cycleMembers,
|
|
942
1251
|
} satisfies Plan<A> as Plan<A>;
|
|
@@ -1036,7 +1345,10 @@ export const printPlan = (plan: Plan): string => {
|
|
|
1036
1345
|
"╠════════════════════════════════════════════════════════════════╣",
|
|
1037
1346
|
);
|
|
1038
1347
|
lines.push(
|
|
1039
|
-
"║ Legend: + create, ~ update, - delete, ± replace, = noop
|
|
1348
|
+
"║ Legend: + create, ~ update, - delete, ± replace, = noop, ║",
|
|
1349
|
+
);
|
|
1350
|
+
lines.push(
|
|
1351
|
+
"║ λ run task, · skip task ║",
|
|
1040
1352
|
);
|
|
1041
1353
|
lines.push(
|
|
1042
1354
|
"╚════════════════════════════════════════════════════════════════╝",
|
|
@@ -1065,6 +1377,28 @@ export const printPlan = (plan: Plan): string => {
|
|
|
1065
1377
|
);
|
|
1066
1378
|
lines.push("");
|
|
1067
1379
|
|
|
1380
|
+
// Print tasks section
|
|
1381
|
+
lines.push(
|
|
1382
|
+
"┌─ Tasks ────────────────────────────────────────────────────────┐",
|
|
1383
|
+
);
|
|
1384
|
+
const taskIds = Object.keys(plan.actions ?? {}).sort();
|
|
1385
|
+
for (const id of taskIds) {
|
|
1386
|
+
const node = plan.actions[id];
|
|
1387
|
+
const symbol = node.action === "run" ? "λ" : "·";
|
|
1388
|
+
const type = node.def.Type;
|
|
1389
|
+
const downstream = node.downstream.length
|
|
1390
|
+
? ` → [${node.downstream.join(", ")}]`
|
|
1391
|
+
: "";
|
|
1392
|
+
lines.push(`│ [${symbol}] ${id} (${type})${downstream}`);
|
|
1393
|
+
}
|
|
1394
|
+
if (taskIds.length === 0) {
|
|
1395
|
+
lines.push("│ (none)");
|
|
1396
|
+
}
|
|
1397
|
+
lines.push(
|
|
1398
|
+
"└────────────────────────────────────────────────────────────────┘",
|
|
1399
|
+
);
|
|
1400
|
+
lines.push("");
|
|
1401
|
+
|
|
1068
1402
|
// Print deletions section
|
|
1069
1403
|
lines.push(
|
|
1070
1404
|
"┌─ Deletions ────────────────────────────────────────────────────┐",
|
|
@@ -1078,7 +1412,12 @@ export const printPlan = (plan: Plan): string => {
|
|
|
1078
1412
|
: "";
|
|
1079
1413
|
lines.push(`│ [-] ${id} (${type})${downstream}`);
|
|
1080
1414
|
}
|
|
1081
|
-
|
|
1415
|
+
const taskDeletionIds = Object.keys(plan.actionDeletions ?? {}).sort();
|
|
1416
|
+
for (const id of taskDeletionIds) {
|
|
1417
|
+
const node = plan.actionDeletions[id]!;
|
|
1418
|
+
lines.push(`│ [-] ${id} (${node.def.Type}) [action]`);
|
|
1419
|
+
}
|
|
1420
|
+
if (deletionIds.length === 0 && taskDeletionIds.length === 0) {
|
|
1082
1421
|
lines.push("│ (none)");
|
|
1083
1422
|
}
|
|
1084
1423
|
lines.push(
|
package/src/Platform.ts
CHANGED
|
@@ -242,8 +242,18 @@ export const Platform = <
|
|
|
242
242
|
}),
|
|
243
243
|
)
|
|
244
244
|
).pipe(
|
|
245
|
-
Effect.tap(
|
|
246
|
-
|
|
245
|
+
Effect.tap((resource) =>
|
|
246
|
+
hooks.onCreate
|
|
247
|
+
? Effect.flatMap(
|
|
248
|
+
// `props` may itself be an Effect (e.g. when wrapped by
|
|
249
|
+
// `Cloudflare.Vite` via `Effect.map`); resolve it before
|
|
250
|
+
// handing it to the hook so `onCreate` always sees the
|
|
251
|
+
// plain props object — the second call site (in
|
|
252
|
+
// `cls.make`) already does this.
|
|
253
|
+
Effect.isEffect(props) ? props : Effect.succeed(props ?? {}),
|
|
254
|
+
(resolved) => hooks.onCreate!(resource as R, resolved),
|
|
255
|
+
)
|
|
256
|
+
: Effect.void,
|
|
247
257
|
),
|
|
248
258
|
);
|
|
249
259
|
return Object.assign(
|
|
@@ -260,7 +270,7 @@ export const Platform = <
|
|
|
260
270
|
asEffect,
|
|
261
271
|
// @ts-expect-error
|
|
262
272
|
pipe: (...args: any[]) => asEffect().pipe(...args),
|
|
263
|
-
[Symbol.iterator]: () => new SingleShotGen(
|
|
273
|
+
[Symbol.iterator]: () => new SingleShotGen(asEffect()),
|
|
264
274
|
},
|
|
265
275
|
);
|
|
266
276
|
} else {
|
|
@@ -279,18 +289,18 @@ export const Platform = <
|
|
|
279
289
|
`Platform<${type}<${id}>>`,
|
|
280
290
|
);
|
|
281
291
|
static [Symbol.iterator](): Iterator<
|
|
282
|
-
Effect.
|
|
292
|
+
Effect.Effect<void, never, Self>,
|
|
283
293
|
Resource,
|
|
284
294
|
void
|
|
285
295
|
> {
|
|
286
|
-
return new SingleShotGen(this) as any;
|
|
296
|
+
return new SingleShotGen(this.asEffect()) as any;
|
|
287
297
|
}
|
|
288
298
|
static asEffect() {
|
|
289
|
-
return this.Self
|
|
299
|
+
return this.Self;
|
|
290
300
|
}
|
|
291
301
|
static pipe(...args: any[]) {
|
|
292
302
|
// @ts-expect-error
|
|
293
|
-
return pipe(this
|
|
303
|
+
return pipe(this, ...args);
|
|
294
304
|
}
|
|
295
305
|
static of = (shape: any) => shape;
|
|
296
306
|
static make = (impl: Impl) => {
|
|
@@ -324,8 +334,13 @@ export const Platform = <
|
|
|
324
334
|
yield* impl.pipe(
|
|
325
335
|
Effect.flatMap((impl) =>
|
|
326
336
|
impl?.fetch
|
|
327
|
-
?
|
|
328
|
-
|
|
337
|
+
? // Hand the full impl to `serve` so the runtime can
|
|
338
|
+
// expose any non-handler methods on the impl shape
|
|
339
|
+
// (e.g. RPC methods on a Cloudflare Worker) alongside
|
|
340
|
+
// the standard `fetch` handler.
|
|
341
|
+
(runtimeContext.serve?.(impl.fetch, {
|
|
342
|
+
shape: impl as Record<string, unknown>,
|
|
343
|
+
}) ?? Effect.die("No serve handler"))
|
|
329
344
|
: Effect.void,
|
|
330
345
|
),
|
|
331
346
|
Effect.provide(
|
|
@@ -360,7 +375,7 @@ export const Platform = <
|
|
|
360
375
|
}),
|
|
361
376
|
),
|
|
362
377
|
);
|
|
363
|
-
const self = Self
|
|
378
|
+
const self = Self as any; // TODO(sam): why do we need to cast?
|
|
364
379
|
|
|
365
380
|
return Layer.provideMerge(
|
|
366
381
|
Layer.mergeAll(
|
|
@@ -380,7 +395,7 @@ export const Platform = <
|
|
|
380
395
|
|
|
381
396
|
const instance = Object.assign(constructor, resource, {
|
|
382
397
|
Platform: Platform,
|
|
383
|
-
asEffect: () => resource.Self
|
|
398
|
+
asEffect: () => resource.Self,
|
|
384
399
|
...methods,
|
|
385
400
|
}) as any;
|
|
386
401
|
return instance;
|
package/src/Provider.ts
CHANGED
|
@@ -16,7 +16,9 @@ import type {
|
|
|
16
16
|
ResourceLike,
|
|
17
17
|
} from "./Resource.ts";
|
|
18
18
|
|
|
19
|
-
export interface Provider<
|
|
19
|
+
export interface Provider<
|
|
20
|
+
R extends ResourceLike = ResourceLike,
|
|
21
|
+
> extends Effect.Effect<ProviderService<R>, never, Provider<R>> {
|
|
20
22
|
asEffect: () => Effect.Effect<ProviderService<R>, never, Provider<R>>;
|
|
21
23
|
[Symbol.iterator]: () => Effect.EffectIterator<Provider<R>>;
|
|
22
24
|
of: <
|
|
@@ -316,7 +318,7 @@ export const collection = <
|
|
|
316
318
|
yield* Effect.all(
|
|
317
319
|
resources.map((resource) =>
|
|
318
320
|
"Provider" in resource
|
|
319
|
-
? resource.Provider.
|
|
321
|
+
? resource.Provider.pipe(
|
|
320
322
|
Effect.map((provider) => [resource.Type, provider] as const),
|
|
321
323
|
)
|
|
322
324
|
: Effect.succeed([
|
|
@@ -372,7 +374,10 @@ export const tryFindProviderByType: {
|
|
|
372
374
|
} = Effect.fnUntraced(function* <R extends ResourceLike>(
|
|
373
375
|
resourceType: R["Type"],
|
|
374
376
|
) {
|
|
375
|
-
const Tag = Provider<R>(resourceType) as Context.Service<
|
|
377
|
+
const Tag = Provider<R>(resourceType) as unknown as Context.Service<
|
|
378
|
+
Provider<R>,
|
|
379
|
+
any
|
|
380
|
+
>;
|
|
376
381
|
const direct = yield* Effect.serviceOption(Tag);
|
|
377
382
|
if (Option.isSome(direct)) {
|
|
378
383
|
return direct;
|
package/src/Random.ts
CHANGED
|
@@ -20,7 +20,7 @@ export type Random = Resource<
|
|
|
20
20
|
>;
|
|
21
21
|
|
|
22
22
|
export const makeRandom = (id: string, props?: RandomProps) =>
|
|
23
|
-
Random(id, props).pipe(Effect.
|
|
23
|
+
Random(id, props).pipe(Effect.map((rand) => rand.text));
|
|
24
24
|
|
|
25
25
|
/**
|
|
26
26
|
* A deterministic-in-state random secret generator.
|