alchemy 2.0.0-beta.60 → 2.0.0-beta.61
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/cli.js +9 -1
- package/bin/exec.js +15 -5
- package/bin/exec.js.map +1 -1
- package/lib/AWS/ACM/Certificate.d.ts.map +1 -1
- package/lib/AWS/ACM/Certificate.js +9 -2
- package/lib/AWS/ACM/Certificate.js.map +1 -1
- package/lib/AWS/AutoScaling/AutoScalingGroup.d.ts.map +1 -1
- package/lib/AWS/AutoScaling/AutoScalingGroup.js +18 -11
- package/lib/AWS/AutoScaling/AutoScalingGroup.js.map +1 -1
- package/lib/AWS/AutoScaling/LaunchTemplate.js +6 -1
- package/lib/AWS/AutoScaling/LaunchTemplate.js.map +1 -1
- package/lib/AWS/AutoScaling/ScalingPolicy.d.ts.map +1 -1
- package/lib/AWS/AutoScaling/ScalingPolicy.js +28 -10
- package/lib/AWS/AutoScaling/ScalingPolicy.js.map +1 -1
- package/lib/AWS/CloudFront/PublicKey.d.ts.map +1 -1
- package/lib/AWS/CloudFront/PublicKey.js +5 -1
- package/lib/AWS/CloudFront/PublicKey.js.map +1 -1
- package/lib/AWS/DynamoDB/Table.js +1 -1
- package/lib/AWS/DynamoDB/Table.js.map +1 -1
- package/lib/AWS/ECS/Service.d.ts.map +1 -1
- package/lib/AWS/ECS/Service.js +29 -4
- package/lib/AWS/ECS/Service.js.map +1 -1
- package/lib/AWS/IAM/OpenIDConnectProvider.d.ts.map +1 -1
- package/lib/AWS/IAM/OpenIDConnectProvider.js +9 -1
- package/lib/AWS/IAM/OpenIDConnectProvider.js.map +1 -1
- package/lib/AWS/Lambda/Alias.d.ts +26 -0
- package/lib/AWS/Lambda/Alias.d.ts.map +1 -1
- package/lib/AWS/Lambda/Alias.js +31 -0
- package/lib/AWS/Lambda/Alias.js.map +1 -1
- package/lib/AWS/Lambda/EventInvokeConfig.d.ts +36 -0
- package/lib/AWS/Lambda/EventInvokeConfig.d.ts.map +1 -0
- package/lib/AWS/Lambda/EventInvokeConfig.js +76 -0
- package/lib/AWS/Lambda/EventInvokeConfig.js.map +1 -0
- package/lib/AWS/Lambda/Function.d.ts +27 -2
- package/lib/AWS/Lambda/Function.d.ts.map +1 -1
- package/lib/AWS/Lambda/Function.js +23 -2
- package/lib/AWS/Lambda/Function.js.map +1 -1
- package/lib/AWS/Lambda/index.d.ts +1 -0
- package/lib/AWS/Lambda/index.d.ts.map +1 -1
- package/lib/AWS/Lambda/index.js +1 -0
- package/lib/AWS/Lambda/index.js.map +1 -1
- package/lib/AWS/Organizations/DelegatedAdministrator.d.ts.map +1 -1
- package/lib/AWS/Organizations/DelegatedAdministrator.js +10 -2
- package/lib/AWS/Organizations/DelegatedAdministrator.js.map +1 -1
- package/lib/AWS/Organizations/PolicyAttachment.d.ts.map +1 -1
- package/lib/AWS/Organizations/PolicyAttachment.js +10 -4
- package/lib/AWS/Organizations/PolicyAttachment.js.map +1 -1
- package/lib/AWS/Organizations/RootPolicyType.d.ts.map +1 -1
- package/lib/AWS/Organizations/RootPolicyType.js +9 -4
- package/lib/AWS/Organizations/RootPolicyType.js.map +1 -1
- package/lib/AWS/Organizations/TrustedServiceAccess.d.ts.map +1 -1
- package/lib/AWS/Organizations/TrustedServiceAccess.js +8 -1
- package/lib/AWS/Organizations/TrustedServiceAccess.js.map +1 -1
- package/lib/AWS/Route53/HostedZone.d.ts.map +1 -1
- package/lib/AWS/Route53/HostedZone.js +20 -4
- package/lib/AWS/Route53/HostedZone.js.map +1 -1
- package/lib/AWS/Route53/Record.d.ts.map +1 -1
- package/lib/AWS/Route53/Record.js +32 -9
- package/lib/AWS/Route53/Record.js.map +1 -1
- package/lib/Apply.js +7 -1
- package/lib/Apply.js.map +1 -1
- package/lib/Auth/Lock.d.ts +17 -0
- package/lib/Auth/Lock.d.ts.map +1 -1
- package/lib/Auth/Lock.js +53 -18
- package/lib/Auth/Lock.js.map +1 -1
- package/lib/Bundle/PurePlugin.d.ts.map +1 -1
- package/lib/Bundle/PurePlugin.js +15 -2
- package/lib/Bundle/PurePlugin.js.map +1 -1
- package/lib/Cli/commands/sync.d.ts +22 -0
- package/lib/Cli/commands/sync.d.ts.map +1 -0
- package/lib/Cli/commands/sync.js +64 -0
- package/lib/Cli/commands/sync.js.map +1 -0
- package/lib/Cli/main.d.ts.map +1 -1
- package/lib/Cli/main.js +2 -0
- package/lib/Cli/main.js.map +1 -1
- package/lib/Cloudflare/AI/CustomTopics.d.ts.map +1 -1
- package/lib/Cloudflare/AI/CustomTopics.js +3 -1
- package/lib/Cloudflare/AI/CustomTopics.js.map +1 -1
- package/lib/Cloudflare/AI/Dataset.d.ts.map +1 -1
- package/lib/Cloudflare/AI/Dataset.js +3 -1
- package/lib/Cloudflare/AI/Dataset.js.map +1 -1
- package/lib/Cloudflare/AI/Evaluation.d.ts.map +1 -1
- package/lib/Cloudflare/AI/Evaluation.js +3 -1
- package/lib/Cloudflare/AI/Evaluation.js.map +1 -1
- package/lib/Cloudflare/AI/Gateway.d.ts.map +1 -1
- package/lib/Cloudflare/AI/Gateway.js +5 -6
- package/lib/Cloudflare/AI/Gateway.js.map +1 -1
- package/lib/Cloudflare/AI/GatewayDynamicRouting.d.ts.map +1 -1
- package/lib/Cloudflare/AI/GatewayDynamicRouting.js +3 -1
- package/lib/Cloudflare/AI/GatewayDynamicRouting.js.map +1 -1
- package/lib/Cloudflare/AI/GatewayProvider.d.ts +2 -1
- package/lib/Cloudflare/AI/GatewayProvider.d.ts.map +1 -1
- package/lib/Cloudflare/AI/GatewayProvider.js +5 -2
- package/lib/Cloudflare/AI/GatewayProvider.js.map +1 -1
- package/lib/Cloudflare/AI/ProviderKey.d.ts +135 -0
- package/lib/Cloudflare/AI/ProviderKey.d.ts.map +1 -0
- package/lib/Cloudflare/AI/ProviderKey.js +90 -0
- package/lib/Cloudflare/AI/ProviderKey.js.map +1 -0
- package/lib/Cloudflare/AI/SearchInstance.d.ts.map +1 -1
- package/lib/Cloudflare/AI/SearchInstance.js +5 -4
- package/lib/Cloudflare/AI/SearchInstance.js.map +1 -1
- package/lib/Cloudflare/AI/SearchNamespace.d.ts.map +1 -1
- package/lib/Cloudflare/AI/SearchNamespace.js +5 -4
- package/lib/Cloudflare/AI/SearchNamespace.js.map +1 -1
- package/lib/Cloudflare/AI/SearchToken.d.ts.map +1 -1
- package/lib/Cloudflare/AI/SearchToken.js +3 -1
- package/lib/Cloudflare/AI/SearchToken.js.map +1 -1
- package/lib/Cloudflare/AI/SecuritySettings.d.ts.map +1 -1
- package/lib/Cloudflare/AI/SecuritySettings.js +3 -1
- package/lib/Cloudflare/AI/SecuritySettings.js.map +1 -1
- package/lib/Cloudflare/AI/index.d.ts +1 -0
- package/lib/Cloudflare/AI/index.d.ts.map +1 -1
- package/lib/Cloudflare/AI/index.js +1 -0
- package/lib/Cloudflare/AI/index.js.map +1 -1
- package/lib/Cloudflare/Access/InfrastructureTarget.d.ts.map +1 -1
- package/lib/Cloudflare/Access/InfrastructureTarget.js +3 -1
- package/lib/Cloudflare/Access/InfrastructureTarget.js.map +1 -1
- package/lib/Cloudflare/Access/Organization.d.ts.map +1 -1
- package/lib/Cloudflare/Access/Organization.js +1 -1
- package/lib/Cloudflare/Access/Organization.js.map +1 -1
- package/lib/Cloudflare/Access/Policy.d.ts.map +1 -1
- package/lib/Cloudflare/Access/Policy.js +3 -1
- package/lib/Cloudflare/Access/Policy.js.map +1 -1
- package/lib/Cloudflare/Account/Account.d.ts.map +1 -1
- package/lib/Cloudflare/Account/Account.js +3 -1
- package/lib/Cloudflare/Account/Account.js.map +1 -1
- package/lib/Cloudflare/ApiToken/AccountApiToken.d.ts.map +1 -1
- package/lib/Cloudflare/ApiToken/AccountApiToken.js +1 -1
- package/lib/Cloudflare/ApiToken/AccountApiToken.js.map +1 -1
- package/lib/Cloudflare/ApiToken/UserApiToken.d.ts.map +1 -1
- package/lib/Cloudflare/ApiToken/UserApiToken.js +1 -1
- package/lib/Cloudflare/ApiToken/UserApiToken.js.map +1 -1
- package/lib/Cloudflare/Auth/AuthProvider.d.ts +3 -0
- package/lib/Cloudflare/Auth/AuthProvider.d.ts.map +1 -1
- package/lib/Cloudflare/Auth/AuthProvider.js +51 -14
- package/lib/Cloudflare/Auth/AuthProvider.js.map +1 -1
- package/lib/Cloudflare/BotManagement/BotManagement.d.ts.map +1 -1
- package/lib/Cloudflare/BotManagement/BotManagement.js +3 -1
- package/lib/Cloudflare/BotManagement/BotManagement.js.map +1 -1
- package/lib/Cloudflare/Cache/Reserve.d.ts.map +1 -1
- package/lib/Cloudflare/Cache/Reserve.js +3 -1
- package/lib/Cloudflare/Cache/Reserve.js.map +1 -1
- package/lib/Cloudflare/ClientCertificate/ClientCertificate.d.ts.map +1 -1
- package/lib/Cloudflare/ClientCertificate/ClientCertificate.js +3 -1
- package/lib/Cloudflare/ClientCertificate/ClientCertificate.js.map +1 -1
- package/lib/Cloudflare/Containers/Container.d.ts +2 -2
- package/lib/Cloudflare/Containers/Container.js +2 -2
- package/lib/Cloudflare/ContentScanning/ContentScanning.d.ts.map +1 -1
- package/lib/Cloudflare/ContentScanning/ContentScanning.js +3 -1
- package/lib/Cloudflare/ContentScanning/ContentScanning.js.map +1 -1
- package/lib/Cloudflare/CustomCertificate/CustomCertificate.d.ts.map +1 -1
- package/lib/Cloudflare/CustomCertificate/CustomCertificate.js +3 -1
- package/lib/Cloudflare/CustomCertificate/CustomCertificate.js.map +1 -1
- package/lib/Cloudflare/CustomHostname/CustomHostname.d.ts.map +1 -1
- package/lib/Cloudflare/CustomHostname/CustomHostname.js +1 -1
- package/lib/Cloudflare/CustomHostname/CustomHostname.js.map +1 -1
- package/lib/Cloudflare/CustomHostname/FallbackOrigin.d.ts.map +1 -1
- package/lib/Cloudflare/CustomHostname/FallbackOrigin.js +1 -1
- package/lib/Cloudflare/CustomHostname/FallbackOrigin.js.map +1 -1
- package/lib/Cloudflare/CustomNameserver/CustomNameserver.d.ts.map +1 -1
- package/lib/Cloudflare/CustomNameserver/CustomNameserver.js +3 -1
- package/lib/Cloudflare/CustomNameserver/CustomNameserver.js.map +1 -1
- package/lib/Cloudflare/D1/Database.d.ts.map +1 -1
- package/lib/Cloudflare/D1/Database.js +2 -2
- package/lib/Cloudflare/D1/Database.js.map +1 -1
- package/lib/Cloudflare/DNS/AccountSettings.d.ts.map +1 -1
- package/lib/Cloudflare/DNS/AccountSettings.js +3 -1
- package/lib/Cloudflare/DNS/AccountSettings.js.map +1 -1
- package/lib/Cloudflare/DNS/Dnssec.d.ts.map +1 -1
- package/lib/Cloudflare/DNS/Dnssec.js +3 -1
- package/lib/Cloudflare/DNS/Dnssec.js.map +1 -1
- package/lib/Cloudflare/DNS/Firewall.d.ts.map +1 -1
- package/lib/Cloudflare/DNS/Firewall.js +3 -1
- package/lib/Cloudflare/DNS/Firewall.js.map +1 -1
- package/lib/Cloudflare/DNS/Record.d.ts.map +1 -1
- package/lib/Cloudflare/DNS/Record.js +3 -1
- package/lib/Cloudflare/DNS/Record.js.map +1 -1
- package/lib/Cloudflare/DNS/View.d.ts.map +1 -1
- package/lib/Cloudflare/DNS/View.js +3 -1
- package/lib/Cloudflare/DNS/View.js.map +1 -1
- package/lib/Cloudflare/DNS/ZoneSettings.d.ts.map +1 -1
- package/lib/Cloudflare/DNS/ZoneSettings.js +3 -1
- package/lib/Cloudflare/DNS/ZoneSettings.js.map +1 -1
- package/lib/Cloudflare/DNS/ZoneTransferAcl.d.ts.map +1 -1
- package/lib/Cloudflare/DNS/ZoneTransferAcl.js +3 -1
- package/lib/Cloudflare/DNS/ZoneTransferAcl.js.map +1 -1
- package/lib/Cloudflare/DNS/ZoneTransferIncoming.d.ts.map +1 -1
- package/lib/Cloudflare/DNS/ZoneTransferIncoming.js +3 -1
- package/lib/Cloudflare/DNS/ZoneTransferIncoming.js.map +1 -1
- package/lib/Cloudflare/DNS/ZoneTransferOutgoing.d.ts.map +1 -1
- package/lib/Cloudflare/DNS/ZoneTransferOutgoing.js +3 -1
- package/lib/Cloudflare/DNS/ZoneTransferOutgoing.js.map +1 -1
- package/lib/Cloudflare/DNS/ZoneTransferPeer.d.ts.map +1 -1
- package/lib/Cloudflare/DNS/ZoneTransferPeer.js +3 -1
- package/lib/Cloudflare/DNS/ZoneTransferPeer.js.map +1 -1
- package/lib/Cloudflare/DNS/ZoneTransferTsig.d.ts.map +1 -1
- package/lib/Cloudflare/DNS/ZoneTransferTsig.js +3 -1
- package/lib/Cloudflare/DNS/ZoneTransferTsig.js.map +1 -1
- package/lib/Cloudflare/Email/Address.d.ts.map +1 -1
- package/lib/Cloudflare/Email/Address.js +3 -1
- package/lib/Cloudflare/Email/Address.js.map +1 -1
- package/lib/Cloudflare/Email/AllowPolicy.d.ts.map +1 -1
- package/lib/Cloudflare/Email/AllowPolicy.js +1 -1
- package/lib/Cloudflare/Email/AllowPolicy.js.map +1 -1
- package/lib/Cloudflare/Email/BlockSender.d.ts.map +1 -1
- package/lib/Cloudflare/Email/BlockSender.js +1 -1
- package/lib/Cloudflare/Email/BlockSender.js.map +1 -1
- package/lib/Cloudflare/Email/CatchAll.d.ts.map +1 -1
- package/lib/Cloudflare/Email/CatchAll.js +8 -2
- package/lib/Cloudflare/Email/CatchAll.js.map +1 -1
- package/lib/Cloudflare/Email/Domain.d.ts.map +1 -1
- package/lib/Cloudflare/Email/Domain.js +3 -1
- package/lib/Cloudflare/Email/Domain.js.map +1 -1
- package/lib/Cloudflare/Email/ImpersonationRegistryEntry.d.ts.map +1 -1
- package/lib/Cloudflare/Email/ImpersonationRegistryEntry.js +1 -1
- package/lib/Cloudflare/Email/ImpersonationRegistryEntry.js.map +1 -1
- package/lib/Cloudflare/Email/Routing.d.ts.map +1 -1
- package/lib/Cloudflare/Email/Routing.js +3 -1
- package/lib/Cloudflare/Email/Routing.js.map +1 -1
- package/lib/Cloudflare/Email/Rule.d.ts.map +1 -1
- package/lib/Cloudflare/Email/Rule.js +3 -1
- package/lib/Cloudflare/Email/Rule.js.map +1 -1
- package/lib/Cloudflare/Email/SendingSubdomain.d.ts.map +1 -1
- package/lib/Cloudflare/Email/SendingSubdomain.js +1 -1
- package/lib/Cloudflare/Email/SendingSubdomain.js.map +1 -1
- package/lib/Cloudflare/Email/TrustedDomain.d.ts.map +1 -1
- package/lib/Cloudflare/Email/TrustedDomain.js +1 -1
- package/lib/Cloudflare/Email/TrustedDomain.js.map +1 -1
- package/lib/Cloudflare/Fetcher.d.ts.map +1 -1
- package/lib/Cloudflare/Fetcher.js +10 -3
- package/lib/Cloudflare/Fetcher.js.map +1 -1
- package/lib/Cloudflare/Flagship/App.d.ts.map +1 -1
- package/lib/Cloudflare/Flagship/App.js +2 -3
- package/lib/Cloudflare/Flagship/App.js.map +1 -1
- package/lib/Cloudflare/Fraud/DetectionSettings.d.ts.map +1 -1
- package/lib/Cloudflare/Fraud/DetectionSettings.js +3 -1
- package/lib/Cloudflare/Fraud/DetectionSettings.js.map +1 -1
- package/lib/Cloudflare/GoogleTagGateway/GoogleTagGateway.d.ts.map +1 -1
- package/lib/Cloudflare/GoogleTagGateway/GoogleTagGateway.js +8 -2
- package/lib/Cloudflare/GoogleTagGateway/GoogleTagGateway.js.map +1 -1
- package/lib/Cloudflare/Healthcheck/Healthcheck.d.ts.map +1 -1
- package/lib/Cloudflare/Healthcheck/Healthcheck.js +3 -1
- package/lib/Cloudflare/Healthcheck/Healthcheck.js.map +1 -1
- package/lib/Cloudflare/HostnameTlsSetting/HostnameTlsSetting.d.ts.map +1 -1
- package/lib/Cloudflare/HostnameTlsSetting/HostnameTlsSetting.js +3 -1
- package/lib/Cloudflare/HostnameTlsSetting/HostnameTlsSetting.js.map +1 -1
- package/lib/Cloudflare/Hyperdrive/Connection.d.ts.map +1 -1
- package/lib/Cloudflare/Hyperdrive/Connection.js +2 -4
- package/lib/Cloudflare/Hyperdrive/Connection.js.map +1 -1
- package/lib/Cloudflare/KV/Namespace.d.ts.map +1 -1
- package/lib/Cloudflare/KV/Namespace.js +5 -4
- package/lib/Cloudflare/KV/Namespace.js.map +1 -1
- package/lib/Cloudflare/KeylessCertificate/KeylessCertificate.d.ts.map +1 -1
- package/lib/Cloudflare/KeylessCertificate/KeylessCertificate.js +3 -1
- package/lib/Cloudflare/KeylessCertificate/KeylessCertificate.js.map +1 -1
- package/lib/Cloudflare/LeakedCredentialCheck/LeakedCredentialCheck.d.ts.map +1 -1
- package/lib/Cloudflare/LeakedCredentialCheck/LeakedCredentialCheck.js +3 -1
- package/lib/Cloudflare/LeakedCredentialCheck/LeakedCredentialCheck.js.map +1 -1
- package/lib/Cloudflare/LoadBalancer/LoadBalancer.d.ts.map +1 -1
- package/lib/Cloudflare/LoadBalancer/LoadBalancer.js +3 -1
- package/lib/Cloudflare/LoadBalancer/LoadBalancer.js.map +1 -1
- package/lib/Cloudflare/ManagedTransforms/ManagedTransforms.d.ts.map +1 -1
- package/lib/Cloudflare/ManagedTransforms/ManagedTransforms.js +3 -1
- package/lib/Cloudflare/ManagedTransforms/ManagedTransforms.js.map +1 -1
- package/lib/Cloudflare/MtlsCertificate/MtlsCertificate.d.ts.map +1 -1
- package/lib/Cloudflare/MtlsCertificate/MtlsCertificate.js +3 -1
- package/lib/Cloudflare/MtlsCertificate/MtlsCertificate.js.map +1 -1
- package/lib/Cloudflare/Organization/Organization.d.ts.map +1 -1
- package/lib/Cloudflare/Organization/Organization.js +3 -1
- package/lib/Cloudflare/Organization/Organization.js.map +1 -1
- package/lib/Cloudflare/OriginCaCertificate/OriginCaCertificate.d.ts.map +1 -1
- package/lib/Cloudflare/OriginCaCertificate/OriginCaCertificate.js +7 -2
- package/lib/Cloudflare/OriginCaCertificate/OriginCaCertificate.js.map +1 -1
- package/lib/Cloudflare/OriginPostQuantumEncryption/OriginPostQuantumEncryption.d.ts.map +1 -1
- package/lib/Cloudflare/OriginPostQuantumEncryption/OriginPostQuantumEncryption.js +3 -1
- package/lib/Cloudflare/OriginPostQuantumEncryption/OriginPostQuantumEncryption.js.map +1 -1
- package/lib/Cloudflare/OriginTlsClientAuth/HostnameCertificate.d.ts.map +1 -1
- package/lib/Cloudflare/OriginTlsClientAuth/HostnameCertificate.js +5 -1
- package/lib/Cloudflare/OriginTlsClientAuth/HostnameCertificate.js.map +1 -1
- package/lib/Cloudflare/PageRule/PageRule.d.ts.map +1 -1
- package/lib/Cloudflare/PageRule/PageRule.js +3 -1
- package/lib/Cloudflare/PageRule/PageRule.js.map +1 -1
- package/lib/Cloudflare/Providers.d.ts +29 -0
- package/lib/Cloudflare/Providers.d.ts.map +1 -1
- package/lib/Cloudflare/Providers.js +30 -19
- package/lib/Cloudflare/Providers.js.map +1 -1
- package/lib/Cloudflare/Queues/Consumer.d.ts.map +1 -1
- package/lib/Cloudflare/Queues/Consumer.js +3 -1
- package/lib/Cloudflare/Queues/Consumer.js.map +1 -1
- package/lib/Cloudflare/Queues/Queue.d.ts.map +1 -1
- package/lib/Cloudflare/Queues/Queue.js +5 -4
- package/lib/Cloudflare/Queues/Queue.js.map +1 -1
- package/lib/Cloudflare/Queues/Subscription.d.ts.map +1 -1
- package/lib/Cloudflare/Queues/Subscription.js +3 -1
- package/lib/Cloudflare/Queues/Subscription.js.map +1 -1
- package/lib/Cloudflare/R2/Bucket.d.ts +98 -0
- package/lib/Cloudflare/R2/Bucket.d.ts.map +1 -1
- package/lib/Cloudflare/R2/Bucket.js +141 -3
- package/lib/Cloudflare/R2/Bucket.js.map +1 -1
- package/lib/Cloudflare/RegionalHostname/RegionalHostname.d.ts.map +1 -1
- package/lib/Cloudflare/RegionalHostname/RegionalHostname.js +3 -1
- package/lib/Cloudflare/RegionalHostname/RegionalHostname.js.map +1 -1
- package/lib/Cloudflare/Ruleset/Ruleset.d.ts.map +1 -1
- package/lib/Cloudflare/Ruleset/Ruleset.js +8 -3
- package/lib/Cloudflare/Ruleset/Ruleset.js.map +1 -1
- package/lib/Cloudflare/SecretsStore/Secret.d.ts.map +1 -1
- package/lib/Cloudflare/SecretsStore/Secret.js +31 -5
- package/lib/Cloudflare/SecretsStore/Secret.js.map +1 -1
- package/lib/Cloudflare/SecurityTxt/SecurityTxt.d.ts.map +1 -1
- package/lib/Cloudflare/SecurityTxt/SecurityTxt.js +3 -1
- package/lib/Cloudflare/SecurityTxt/SecurityTxt.js.map +1 -1
- package/lib/Cloudflare/StateStore/Api.d.ts +15 -0
- package/lib/Cloudflare/StateStore/State.d.ts +30 -1
- package/lib/Cloudflare/StateStore/State.d.ts.map +1 -1
- package/lib/Cloudflare/StateStore/State.js +85 -16
- package/lib/Cloudflare/StateStore/State.js.map +1 -1
- package/lib/Cloudflare/Tags/AccountResourceTags.d.ts.map +1 -1
- package/lib/Cloudflare/Tags/AccountResourceTags.js +8 -3
- package/lib/Cloudflare/Tags/AccountResourceTags.js.map +1 -1
- package/lib/Cloudflare/Tunnel/Route.d.ts.map +1 -1
- package/lib/Cloudflare/Tunnel/Route.js +3 -1
- package/lib/Cloudflare/Tunnel/Route.js.map +1 -1
- package/lib/Cloudflare/Tunnel/Tunnel.d.ts.map +1 -1
- package/lib/Cloudflare/Tunnel/Tunnel.js +3 -1
- package/lib/Cloudflare/Tunnel/Tunnel.js.map +1 -1
- package/lib/Cloudflare/UrlNormalization/UrlNormalization.d.ts.map +1 -1
- package/lib/Cloudflare/UrlNormalization/UrlNormalization.js +3 -1
- package/lib/Cloudflare/UrlNormalization/UrlNormalization.js.map +1 -1
- package/lib/Cloudflare/Vectorize/VectorizeIndex.d.ts.map +1 -1
- package/lib/Cloudflare/Vectorize/VectorizeIndex.js +2 -3
- package/lib/Cloudflare/Vectorize/VectorizeIndex.js.map +1 -1
- package/lib/Cloudflare/VpcService/VpcService.d.ts.map +1 -1
- package/lib/Cloudflare/VpcService/VpcService.js +1 -1
- package/lib/Cloudflare/VpcService/VpcService.js.map +1 -1
- package/lib/Cloudflare/WaitingRoom/WaitingRoom.d.ts.map +1 -1
- package/lib/Cloudflare/WaitingRoom/WaitingRoom.js +3 -1
- package/lib/Cloudflare/WaitingRoom/WaitingRoom.js.map +1 -1
- package/lib/Cloudflare/Web3/ContentList.d.ts.map +1 -1
- package/lib/Cloudflare/Web3/ContentList.js +3 -1
- package/lib/Cloudflare/Web3/ContentList.js.map +1 -1
- package/lib/Cloudflare/Web3/Hostname.d.ts.map +1 -1
- package/lib/Cloudflare/Web3/Hostname.js +3 -1
- package/lib/Cloudflare/Web3/Hostname.js.map +1 -1
- package/lib/Cloudflare/Workers/Cache.d.ts +71 -0
- package/lib/Cloudflare/Workers/Cache.d.ts.map +1 -0
- package/lib/Cloudflare/Workers/Cache.js +64 -0
- package/lib/Cloudflare/Workers/Cache.js.map +1 -0
- package/lib/Cloudflare/Workers/CronEventSource.d.ts +180 -6
- package/lib/Cloudflare/Workers/CronEventSource.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/CronEventSource.js +180 -6
- package/lib/Cloudflare/Workers/CronEventSource.js.map +1 -1
- package/lib/Cloudflare/Workers/DurableObject.d.ts +36 -1
- package/lib/Cloudflare/Workers/DurableObject.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/DurableObject.js +36 -1
- package/lib/Cloudflare/Workers/DurableObject.js.map +1 -1
- package/lib/Cloudflare/Workers/DurableObjectState.d.ts +11 -0
- package/lib/Cloudflare/Workers/DurableObjectState.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/DurableObjectState.js +7 -0
- package/lib/Cloudflare/Workers/DurableObjectState.js.map +1 -1
- package/lib/Cloudflare/Workers/Fetch.js +2 -2
- package/lib/Cloudflare/Workers/Fetch.js.map +1 -1
- package/lib/Cloudflare/Workers/LocalWorkerProvider.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/LocalWorkerProvider.js +3 -0
- package/lib/Cloudflare/Workers/LocalWorkerProvider.js.map +1 -1
- package/lib/Cloudflare/Workers/Worker.d.ts +230 -4
- package/lib/Cloudflare/Workers/Worker.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/Worker.js +161 -7
- package/lib/Cloudflare/Workers/Worker.js.map +1 -1
- package/lib/Cloudflare/Workers/WorkerAsyncBindings.d.ts +9 -0
- package/lib/Cloudflare/Workers/WorkerAsyncBindings.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/WorkerAsyncBindings.js +15 -0
- package/lib/Cloudflare/Workers/WorkerAsyncBindings.js.map +1 -1
- package/lib/Cloudflare/Workers/WorkerBinding.d.ts +30 -0
- package/lib/Cloudflare/Workers/WorkerBinding.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/WorkerBridge.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/WorkerBridge.js +27 -5
- package/lib/Cloudflare/Workers/WorkerBridge.js.map +1 -1
- package/lib/Cloudflare/Workers/WorkerLoader.js +9 -1
- package/lib/Cloudflare/Workers/WorkerLoader.js.map +1 -1
- package/lib/Cloudflare/Workers/WorkerProvider.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/WorkerProvider.js +365 -18
- package/lib/Cloudflare/Workers/WorkerProvider.js.map +1 -1
- package/lib/Cloudflare/Workers/WorkerRuntimeContext.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/WorkerRuntimeContext.js +20 -3
- package/lib/Cloudflare/Workers/WorkerRuntimeContext.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/WorkersForPlatforms/DispatchNamespace.d.ts.map +1 -1
- package/lib/Cloudflare/WorkersForPlatforms/DispatchNamespace.js +2 -3
- package/lib/Cloudflare/WorkersForPlatforms/DispatchNamespace.js.map +1 -1
- package/lib/Cloudflare/Workflows/Workflow.d.ts +200 -24
- package/lib/Cloudflare/Workflows/Workflow.d.ts.map +1 -1
- package/lib/Cloudflare/Workflows/Workflow.js +126 -28
- package/lib/Cloudflare/Workflows/Workflow.js.map +1 -1
- package/lib/Cloudflare/Workflows/WorkflowBridge.d.ts.map +1 -1
- package/lib/Cloudflare/Workflows/WorkflowBridge.js +42 -3
- package/lib/Cloudflare/Workflows/WorkflowBridge.js.map +1 -1
- package/lib/Cloudflare/Zaraz/Config.d.ts +1 -0
- package/lib/Cloudflare/Zaraz/Config.d.ts.map +1 -1
- package/lib/Cloudflare/Zaraz/Config.js +8 -2
- package/lib/Cloudflare/Zaraz/Config.js.map +1 -1
- package/lib/Cloudflare/Zone/Zone.d.ts.map +1 -1
- package/lib/Cloudflare/Zone/Zone.js +1 -0
- package/lib/Cloudflare/Zone/Zone.js.map +1 -1
- package/lib/Docker/Container.d.ts.map +1 -1
- package/lib/Docker/Container.js +11 -1
- package/lib/Docker/Container.js.map +1 -1
- package/lib/Drizzle/Schema.d.ts.map +1 -1
- package/lib/Drizzle/Schema.js +12 -5
- package/lib/Drizzle/Schema.js.map +1 -1
- package/lib/Neon/Branch.d.ts.map +1 -1
- package/lib/Neon/Branch.js +15 -3
- package/lib/Neon/Branch.js.map +1 -1
- package/lib/Output.d.ts +13 -1
- package/lib/Output.d.ts.map +1 -1
- package/lib/Output.js +17 -3
- package/lib/Output.js.map +1 -1
- package/lib/Planetscale/Postgres/PostgresRole.js +2 -2
- package/lib/Planetscale/Postgres/PostgresRole.js.map +1 -1
- package/lib/Provider.d.ts +8 -0
- package/lib/Provider.d.ts.map +1 -1
- package/lib/Provider.js +38 -3
- package/lib/Provider.js.map +1 -1
- package/lib/Ref.d.ts +9 -1
- package/lib/Ref.d.ts.map +1 -1
- package/lib/Ref.js +2 -1
- package/lib/Ref.js.map +1 -1
- package/lib/Resource.d.ts +44 -0
- package/lib/Resource.d.ts.map +1 -1
- package/lib/Resource.js +22 -1
- package/lib/Resource.js.map +1 -1
- package/lib/Stack.js +1 -1
- package/lib/Stack.js.map +1 -1
- package/lib/State/HttpStateApi.d.ts +4 -4
- package/lib/State/HttpStateStore.d.ts +12 -0
- package/lib/State/HttpStateStore.d.ts.map +1 -1
- package/lib/State/HttpStateStore.js +46 -5
- package/lib/State/HttpStateStore.js.map +1 -1
- package/lib/Sync.d.ts +109 -0
- package/lib/Sync.d.ts.map +1 -0
- package/lib/Sync.js +312 -0
- package/lib/Sync.js.map +1 -0
- package/lib/Test/Bun.d.ts +1 -1
- package/lib/Test/Bun.d.ts.map +1 -1
- package/lib/Test/Bun.js +1 -1
- package/lib/Test/Bun.js.map +1 -1
- package/lib/Test/Http.d.ts +67 -0
- package/lib/Test/Http.d.ts.map +1 -1
- package/lib/Test/Http.js +69 -0
- package/lib/Test/Http.js.map +1 -1
- package/lib/Test/Vitest.d.ts +1 -1
- package/lib/Test/Vitest.d.ts.map +1 -1
- package/lib/Test/Vitest.js +1 -0
- package/lib/Test/Vitest.js.map +1 -1
- package/lib/Util/proxy-chain.js +14 -15
- package/lib/Util/proxy-chain.js.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/package.json +19 -19
- package/src/AWS/ACM/Certificate.ts +13 -2
- package/src/AWS/AutoScaling/AutoScalingGroup.ts +21 -15
- package/src/AWS/AutoScaling/LaunchTemplate.ts +6 -1
- package/src/AWS/AutoScaling/ScalingPolicy.ts +31 -17
- package/src/AWS/CloudFront/PublicKey.ts +4 -0
- package/src/AWS/DynamoDB/Table.ts +1 -1
- package/src/AWS/ECS/Service.ts +35 -6
- package/src/AWS/IAM/OpenIDConnectProvider.ts +9 -1
- package/src/AWS/Lambda/Alias.ts +42 -0
- package/src/AWS/Lambda/EventInvokeConfig.ts +150 -0
- package/src/AWS/Lambda/Function.ts +35 -2
- package/src/AWS/Lambda/index.ts +1 -0
- package/src/AWS/Organizations/DelegatedAdministrator.ts +11 -3
- package/src/AWS/Organizations/PolicyAttachment.ts +10 -4
- package/src/AWS/Organizations/RootPolicyType.ts +9 -4
- package/src/AWS/Organizations/TrustedServiceAccess.ts +9 -3
- package/src/AWS/Route53/HostedZone.ts +30 -13
- package/src/AWS/Route53/Record.ts +44 -22
- package/src/Apply.ts +7 -1
- package/src/Auth/Lock.ts +62 -18
- package/src/Bundle/PurePlugin.ts +15 -2
- package/src/Cli/commands/sync.ts +123 -0
- package/src/Cli/main.ts +2 -0
- package/src/Cloudflare/AI/CustomTopics.ts +3 -1
- package/src/Cloudflare/AI/Dataset.ts +3 -1
- package/src/Cloudflare/AI/Evaluation.ts +3 -1
- package/src/Cloudflare/AI/Gateway.ts +5 -6
- package/src/Cloudflare/AI/GatewayDynamicRouting.ts +3 -1
- package/src/Cloudflare/AI/GatewayProvider.ts +5 -2
- package/src/Cloudflare/AI/ProviderKey.ts +161 -0
- package/src/Cloudflare/AI/SearchInstance.ts +5 -4
- package/src/Cloudflare/AI/SearchNamespace.ts +5 -4
- package/src/Cloudflare/AI/SearchToken.ts +3 -1
- package/src/Cloudflare/AI/SecuritySettings.ts +3 -0
- package/src/Cloudflare/AI/index.ts +1 -0
- package/src/Cloudflare/Access/InfrastructureTarget.ts +4 -1
- package/src/Cloudflare/Access/Organization.ts +1 -0
- package/src/Cloudflare/Access/Policy.ts +3 -1
- package/src/Cloudflare/Account/Account.ts +3 -1
- package/src/Cloudflare/ApiToken/AccountApiToken.ts +1 -0
- package/src/Cloudflare/ApiToken/UserApiToken.ts +1 -0
- package/src/Cloudflare/Auth/AuthProvider.ts +69 -8
- package/src/Cloudflare/BotManagement/BotManagement.ts +3 -1
- package/src/Cloudflare/Cache/Reserve.ts +3 -1
- package/src/Cloudflare/ClientCertificate/ClientCertificate.ts +3 -1
- package/src/Cloudflare/Containers/Container.ts +2 -2
- package/src/Cloudflare/ContentScanning/ContentScanning.ts +3 -1
- package/src/Cloudflare/CustomCertificate/CustomCertificate.ts +3 -1
- package/src/Cloudflare/CustomHostname/CustomHostname.ts +1 -0
- package/src/Cloudflare/CustomHostname/FallbackOrigin.ts +1 -0
- package/src/Cloudflare/CustomNameserver/CustomNameserver.ts +3 -1
- package/src/Cloudflare/D1/Database.ts +2 -2
- package/src/Cloudflare/DNS/AccountSettings.ts +3 -1
- package/src/Cloudflare/DNS/Dnssec.ts +3 -1
- package/src/Cloudflare/DNS/Firewall.ts +3 -1
- package/src/Cloudflare/DNS/Record.ts +3 -1
- package/src/Cloudflare/DNS/View.ts +3 -1
- package/src/Cloudflare/DNS/ZoneSettings.ts +3 -1
- package/src/Cloudflare/DNS/ZoneTransferAcl.ts +3 -1
- package/src/Cloudflare/DNS/ZoneTransferIncoming.ts +3 -1
- package/src/Cloudflare/DNS/ZoneTransferOutgoing.ts +3 -1
- package/src/Cloudflare/DNS/ZoneTransferPeer.ts +3 -1
- package/src/Cloudflare/DNS/ZoneTransferTsig.ts +3 -1
- package/src/Cloudflare/Email/Address.ts +3 -1
- package/src/Cloudflare/Email/AllowPolicy.ts +1 -0
- package/src/Cloudflare/Email/BlockSender.ts +1 -0
- package/src/Cloudflare/Email/CatchAll.ts +7 -2
- package/src/Cloudflare/Email/Domain.ts +3 -1
- package/src/Cloudflare/Email/ImpersonationRegistryEntry.ts +1 -0
- package/src/Cloudflare/Email/Routing.ts +3 -1
- package/src/Cloudflare/Email/Rule.ts +3 -1
- package/src/Cloudflare/Email/SendingSubdomain.ts +1 -0
- package/src/Cloudflare/Email/TrustedDomain.ts +1 -0
- package/src/Cloudflare/Fetcher.ts +12 -5
- package/src/Cloudflare/Flagship/App.ts +2 -3
- package/src/Cloudflare/Fraud/DetectionSettings.ts +3 -1
- package/src/Cloudflare/GoogleTagGateway/GoogleTagGateway.ts +7 -2
- package/src/Cloudflare/Healthcheck/Healthcheck.ts +3 -1
- package/src/Cloudflare/HostnameTlsSetting/HostnameTlsSetting.ts +3 -1
- package/src/Cloudflare/Hyperdrive/Connection.ts +2 -4
- package/src/Cloudflare/KV/Namespace.ts +5 -4
- package/src/Cloudflare/KeylessCertificate/KeylessCertificate.ts +3 -1
- package/src/Cloudflare/LeakedCredentialCheck/LeakedCredentialCheck.ts +3 -1
- package/src/Cloudflare/LoadBalancer/LoadBalancer.ts +3 -1
- package/src/Cloudflare/ManagedTransforms/ManagedTransforms.ts +3 -1
- package/src/Cloudflare/MtlsCertificate/MtlsCertificate.ts +3 -1
- package/src/Cloudflare/Organization/Organization.ts +3 -1
- package/src/Cloudflare/OriginCaCertificate/OriginCaCertificate.ts +7 -2
- package/src/Cloudflare/OriginPostQuantumEncryption/OriginPostQuantumEncryption.ts +3 -1
- package/src/Cloudflare/OriginTlsClientAuth/HostnameCertificate.ts +5 -1
- package/src/Cloudflare/PageRule/PageRule.ts +3 -1
- package/src/Cloudflare/Providers.ts +34 -19
- package/src/Cloudflare/Queues/Consumer.ts +3 -1
- package/src/Cloudflare/Queues/Queue.ts +5 -4
- package/src/Cloudflare/Queues/Subscription.ts +3 -1
- package/src/Cloudflare/R2/Bucket.ts +230 -3
- package/src/Cloudflare/RegionalHostname/RegionalHostname.ts +3 -1
- package/src/Cloudflare/Ruleset/Ruleset.ts +9 -4
- package/src/Cloudflare/SecretsStore/Secret.ts +46 -5
- package/src/Cloudflare/SecurityTxt/SecurityTxt.ts +3 -1
- package/src/Cloudflare/StateStore/State.ts +89 -24
- package/src/Cloudflare/Tags/AccountResourceTags.ts +9 -5
- package/src/Cloudflare/Tunnel/Route.ts +3 -1
- package/src/Cloudflare/Tunnel/Tunnel.ts +3 -1
- package/src/Cloudflare/UrlNormalization/UrlNormalization.ts +3 -1
- package/src/Cloudflare/Vectorize/VectorizeIndex.ts +2 -3
- package/src/Cloudflare/VpcService/VpcService.ts +1 -0
- package/src/Cloudflare/WaitingRoom/WaitingRoom.ts +3 -1
- package/src/Cloudflare/Web3/ContentList.ts +3 -1
- package/src/Cloudflare/Web3/Hostname.ts +3 -1
- package/src/Cloudflare/Workers/Cache.ts +102 -0
- package/src/Cloudflare/Workers/CronEventSource.ts +180 -6
- package/src/Cloudflare/Workers/DurableObject.ts +36 -1
- package/src/Cloudflare/Workers/DurableObjectState.ts +25 -0
- package/src/Cloudflare/Workers/Fetch.ts +2 -2
- package/src/Cloudflare/Workers/LocalWorkerProvider.ts +3 -0
- package/src/Cloudflare/Workers/Worker.ts +315 -9
- package/src/Cloudflare/Workers/WorkerAsyncBindings.ts +18 -0
- package/src/Cloudflare/Workers/WorkerBridge.ts +37 -10
- package/src/Cloudflare/Workers/WorkerLoader.ts +10 -1
- package/src/Cloudflare/Workers/WorkerProvider.ts +576 -40
- package/src/Cloudflare/Workers/WorkerRuntimeContext.ts +23 -2
- package/src/Cloudflare/Workers/index.ts +1 -0
- package/src/Cloudflare/WorkersForPlatforms/DispatchNamespace.ts +2 -4
- package/src/Cloudflare/Workflows/Workflow.ts +296 -38
- package/src/Cloudflare/Workflows/WorkflowBridge.ts +62 -12
- package/src/Cloudflare/Zaraz/Config.ts +7 -2
- package/src/Cloudflare/Zone/Zone.ts +1 -0
- package/src/Docker/Container.ts +10 -1
- package/src/Drizzle/Schema.ts +12 -5
- package/src/Neon/Branch.ts +15 -3
- package/src/Output.ts +18 -2
- package/src/Planetscale/Postgres/PostgresRole.ts +2 -2
- package/src/Provider.ts +53 -3
- package/src/Ref.ts +10 -0
- package/src/Resource.ts +50 -1
- package/src/Stack.ts +1 -1
- package/src/State/HttpStateStore.ts +47 -5
- package/src/Sync.ts +494 -0
- package/src/Test/Bun.ts +4 -0
- package/src/Test/Http.ts +133 -0
- package/src/Test/Vitest.ts +11 -0
- package/src/Util/proxy-chain.ts +9 -12
- package/src/index.ts +1 -0
|
@@ -17,14 +17,16 @@ import * as ProviderLayer from "../../Local/ProviderLayer.js";
|
|
|
17
17
|
import * as Provider from "../../Provider.js";
|
|
18
18
|
import {} from "../../Resource.js";
|
|
19
19
|
import { Stack } from "../../Stack.js";
|
|
20
|
+
import { sha256Object } from "../../Util/sha256.js";
|
|
20
21
|
import { CloudflareEnvironment } from "../CloudflareEnvironment.js";
|
|
21
22
|
import { CloudflareLogs } from "../Logs.js";
|
|
23
|
+
import { listAllZones, resolveZoneId } from "../Zone/lookup.js";
|
|
22
24
|
import { readAssets, uploadAssets } from "./Assets.js";
|
|
23
25
|
import { getCompatibility } from "./Compatibility.js";
|
|
24
26
|
import { isDurableObjectExport } from "./DurableObject.js";
|
|
25
27
|
import { LocalWorkerProvider } from "./LocalWorkerProvider.js";
|
|
26
28
|
import { Worker } from "./Worker.js";
|
|
27
|
-
import { getCronBindings } from "./WorkerAsyncBindings.js";
|
|
29
|
+
import { getCacheBinding, getCronBindings } from "./WorkerAsyncBindings.js";
|
|
28
30
|
import { readPrebuiltWorkerBundle, WorkerBundle } from "./WorkerBundle.js";
|
|
29
31
|
import { isWorkerLoader } from "./WorkerLoader.js";
|
|
30
32
|
import { createWorkerName } from "./WorkerName.js";
|
|
@@ -79,28 +81,66 @@ Effect.gen(function* () {
|
|
|
79
81
|
scriptName,
|
|
80
82
|
});
|
|
81
83
|
});
|
|
84
|
+
/**
|
|
85
|
+
* Deploy-time binding validation rejects an upload whose bindings
|
|
86
|
+
* reference a resource Cloudflare can't see (each resource type has
|
|
87
|
+
* its own typed not-found error, verified against the live API).
|
|
88
|
+
* Every bound resource is provisioned before the Worker deploys —
|
|
89
|
+
* dependency order for KV/R2/D1/queues/etc., a pre-created stub
|
|
90
|
+
* (which exports the Durable Object classes) for circular
|
|
91
|
+
* Worker↔Worker references — so a not-found here is either
|
|
92
|
+
* propagation lag on a just-created resource (a Secrets Store secret
|
|
93
|
+
* still `pending`, a stub script not yet in the registry) that
|
|
94
|
+
* retrying converges, or a genuine misconfiguration that keeps
|
|
95
|
+
* failing and surfaces as the typed error once the bounded budget is
|
|
96
|
+
* exhausted.
|
|
97
|
+
*/
|
|
98
|
+
const isBindingTargetNotFound = (e) => e._tag === "SecretsStoreBindingNotFound" ||
|
|
99
|
+
e._tag === "KVNamespaceNotFound" ||
|
|
100
|
+
e._tag === "R2BucketNotFound" ||
|
|
101
|
+
e._tag === "D1DatabaseNotFound" ||
|
|
102
|
+
e._tag === "QueueNotFound" ||
|
|
103
|
+
e._tag === "ServiceBindingNotFound" ||
|
|
104
|
+
e._tag === "DurableObjectClassNotFound" ||
|
|
105
|
+
e._tag === "HyperdriveConfigNotFound" ||
|
|
106
|
+
e._tag === "VectorizeIndexNotFound" ||
|
|
107
|
+
e._tag === "DispatchNamespaceNotFound" ||
|
|
108
|
+
e._tag === "MtlsCertificateNotFound";
|
|
109
|
+
const bindingTargetNotFoundRetrySchedule = () => Schedule.fixed("2 seconds").pipe(Schedule.both(Schedule.recurs(10)));
|
|
82
110
|
/**
|
|
83
111
|
* Upsert a Worker script, routing to the dispatch-namespace endpoint when
|
|
84
|
-
* `dispatchNamespace` is set. The metadata/files contract is identical
|
|
112
|
+
* `dispatchNamespace` is set. The metadata/files contract is identical, and
|
|
113
|
+
* both endpoints run the same binding validation (see
|
|
114
|
+
* {@link isBindingTargetNotFound}), so both get the same bounded retry.
|
|
85
115
|
*
|
|
86
116
|
* @internal
|
|
87
117
|
*/
|
|
88
118
|
const putWorkerScript = (params) => Effect.gen(function* () {
|
|
89
119
|
if (params.dispatchNamespace) {
|
|
90
|
-
return yield* wfp
|
|
120
|
+
return yield* wfp
|
|
121
|
+
.putDispatchNamespaceScript({
|
|
91
122
|
accountId: params.accountId,
|
|
92
123
|
dispatchNamespace: params.dispatchNamespace,
|
|
93
124
|
scriptName: params.scriptName,
|
|
94
125
|
metadata: params.metadata,
|
|
95
126
|
files: params.files,
|
|
96
|
-
})
|
|
127
|
+
})
|
|
128
|
+
.pipe(Effect.retry({
|
|
129
|
+
while: isBindingTargetNotFound,
|
|
130
|
+
schedule: bindingTargetNotFoundRetrySchedule(),
|
|
131
|
+
}));
|
|
97
132
|
}
|
|
98
|
-
return yield* workers
|
|
133
|
+
return yield* workers
|
|
134
|
+
.putScript({
|
|
99
135
|
accountId: params.accountId,
|
|
100
136
|
scriptName: params.scriptName,
|
|
101
137
|
metadata: params.metadata,
|
|
102
138
|
files: params.files,
|
|
103
|
-
})
|
|
139
|
+
})
|
|
140
|
+
.pipe(Effect.retry({
|
|
141
|
+
while: isBindingTargetNotFound,
|
|
142
|
+
schedule: bindingTargetNotFoundRetrySchedule(),
|
|
143
|
+
}));
|
|
104
144
|
});
|
|
105
145
|
/**
|
|
106
146
|
* Delete a Worker script, routing to the dispatch-namespace endpoint when
|
|
@@ -137,6 +177,95 @@ export const normalizeStateDomains = (domains) => (domains ?? []).flatMap((u) =>
|
|
|
137
177
|
const hostname = u?.hostname;
|
|
138
178
|
return typeof hostname === "string" ? [`https://${hostname}`] : [];
|
|
139
179
|
});
|
|
180
|
+
/**
|
|
181
|
+
* Deeply materialize an arbitrary value into a JSON-stable shape for hashing:
|
|
182
|
+
* unwrap `Redacted` secrets by value, ISO-stringify `Date`s, keep plain
|
|
183
|
+
* objects/arrays/primitives, and drop Effects, functions, `undefined`, and
|
|
184
|
+
* class instances (which don't round-trip through `JSON.stringify`). Redacted
|
|
185
|
+
* values contribute by value, not by reference identity, so two
|
|
186
|
+
* independently-constructed secrets with the same contents hash identically.
|
|
187
|
+
*
|
|
188
|
+
* Effects are dropped, never executed: resource-typed `env` entries (Worker
|
|
189
|
+
* effect-classes, R2 buckets, Provider/Context tags, ...) are all Effects
|
|
190
|
+
* whose evaluation requires plan-phase context that is not available inside
|
|
191
|
+
* lifecycle operations (running one here fails with `Service not found:
|
|
192
|
+
* Cloudflare.Worker`). Their deploy-time identity is already captured by the
|
|
193
|
+
* resolved `bindings` data hashed alongside `env`, so skipping them loses no
|
|
194
|
+
* change-detection.
|
|
195
|
+
*/
|
|
196
|
+
const resolveMetadataHashValue = (value) => Effect.gen(function* () {
|
|
197
|
+
if (Effect.isEffect(value)) {
|
|
198
|
+
return undefined;
|
|
199
|
+
}
|
|
200
|
+
const resolved = Redacted.isRedacted(value) ? Redacted.value(value) : value;
|
|
201
|
+
if (resolved === null ||
|
|
202
|
+
Predicate.isString(resolved) ||
|
|
203
|
+
Predicate.isNumber(resolved) ||
|
|
204
|
+
Predicate.isBoolean(resolved)) {
|
|
205
|
+
return resolved;
|
|
206
|
+
}
|
|
207
|
+
if (resolved === undefined || Predicate.isFunction(resolved)) {
|
|
208
|
+
return undefined;
|
|
209
|
+
}
|
|
210
|
+
if (Predicate.isDate(resolved)) {
|
|
211
|
+
return resolved.toISOString();
|
|
212
|
+
}
|
|
213
|
+
if (Array.isArray(resolved)) {
|
|
214
|
+
return yield* Effect.all(resolved.map((item) => resolveMetadataHashValue(item)), { concurrency: "unbounded" });
|
|
215
|
+
}
|
|
216
|
+
if (Predicate.isObject(resolved)) {
|
|
217
|
+
// Only plain objects round-trip predictably. A class instance would
|
|
218
|
+
// serialize to `{}` (or throw), so drop it rather than hash a lie.
|
|
219
|
+
const prototype = Object.getPrototypeOf(resolved);
|
|
220
|
+
if (prototype !== Object.prototype && prototype !== null) {
|
|
221
|
+
return undefined;
|
|
222
|
+
}
|
|
223
|
+
const entries = yield* Effect.all(Object.entries(resolved).map(([key, nested]) => resolveMetadataHashValue(nested).pipe(Effect.map((materializedNested) => [key, materializedNested]))), { concurrency: "unbounded" });
|
|
224
|
+
return Object.fromEntries(entries.filter(([, nested]) => nested !== undefined));
|
|
225
|
+
}
|
|
226
|
+
return undefined;
|
|
227
|
+
});
|
|
228
|
+
// The asset router config the resource declares (htmlHandling,
|
|
229
|
+
// notFoundHandling, ...), minus the local `directory` path (machine-specific,
|
|
230
|
+
// would break hash stability across machines) and the precomputed `hash`
|
|
231
|
+
// (already compared via `output.hash.assets`). A bare string `assets` is just
|
|
232
|
+
// a directory path, so it contributes nothing here.
|
|
233
|
+
const workerAssetConfigForHash = (assets) => {
|
|
234
|
+
if (!assets || typeof assets === "string") {
|
|
235
|
+
return undefined;
|
|
236
|
+
}
|
|
237
|
+
const { directory: _directory, ...config } = assets;
|
|
238
|
+
if (Predicate.hasProperty(config, "hash")) {
|
|
239
|
+
const { hash: _hash, ...configWithoutHash } = config;
|
|
240
|
+
return configWithoutHash;
|
|
241
|
+
}
|
|
242
|
+
return config;
|
|
243
|
+
};
|
|
244
|
+
/**
|
|
245
|
+
* Hash a Worker's deploy-time metadata surface so metadata-only edits are
|
|
246
|
+
* detected by the diff (#745). Previously the update decision compared only
|
|
247
|
+
* the bundle/vite/asset-content hashes, so a change to e.g. a compatibility
|
|
248
|
+
* flag or observability config planned as a noop and silently never deployed.
|
|
249
|
+
*/
|
|
250
|
+
const resolveWorkerMetadataHash = ({ props, bindings, accountId, stack, }) => resolveMetadataHashValue({
|
|
251
|
+
accountId,
|
|
252
|
+
stack: { name: stack.name, stage: stack.stage },
|
|
253
|
+
compatibility: getCompatibility(props),
|
|
254
|
+
env: props.env,
|
|
255
|
+
bindings: bindings.map((binding) => ({
|
|
256
|
+
sid: binding.sid,
|
|
257
|
+
data: binding.data,
|
|
258
|
+
})),
|
|
259
|
+
assets: workerAssetConfigForHash(props.assets),
|
|
260
|
+
cache: props.cache,
|
|
261
|
+
limits: props.limits,
|
|
262
|
+
logpush: props.logpush,
|
|
263
|
+
observability: props.observability,
|
|
264
|
+
placement: props.placement,
|
|
265
|
+
subdomain: props.subdomain,
|
|
266
|
+
tags: props.tags,
|
|
267
|
+
url: props.url,
|
|
268
|
+
}).pipe(Effect.flatMap((metadata) => sha256Object({ metadata })));
|
|
140
269
|
export const WorkerProvider = () => ProviderLayer.select({
|
|
141
270
|
live: () => LiveWorkerProvider(),
|
|
142
271
|
local: () => LocalWorkerProvider(),
|
|
@@ -342,6 +471,143 @@ export const LiveWorkerProvider = () => Provider.effect(Worker, Effect.gen(funct
|
|
|
342
471
|
});
|
|
343
472
|
return applied;
|
|
344
473
|
});
|
|
474
|
+
const routeKey = (route) => `${route.zoneId}:${route.pattern}`;
|
|
475
|
+
// Derive a concrete hostname inside the zone from a route pattern so
|
|
476
|
+
// zone inference can walk the DNS label hierarchy. A wildcard label
|
|
477
|
+
// (`*.example.com/*`) is replaced with a stand-in label — only the
|
|
478
|
+
// parent labels matter for finding the zone.
|
|
479
|
+
const hostnameFromPattern = (pattern) => {
|
|
480
|
+
const hostPart = pattern.split("/")[0] ?? pattern;
|
|
481
|
+
return hostPart.startsWith("*.")
|
|
482
|
+
? `routes.${hostPart.slice(2)}`
|
|
483
|
+
: hostPart;
|
|
484
|
+
};
|
|
485
|
+
// Resolve each route's zone to a concrete zone id: an explicit
|
|
486
|
+
// `zoneId` wins, then `zone` / `zoneName` via `resolveZoneId`, and
|
|
487
|
+
// finally inference from the pattern's hostname. Duplicate
|
|
488
|
+
// `(zoneId, pattern)` pairs are dropped — Cloudflare enforces one
|
|
489
|
+
// route per pattern per zone.
|
|
490
|
+
const normalizeRoutes = (routes) => Effect.gen(function* () {
|
|
491
|
+
if (!routes?.length)
|
|
492
|
+
return [];
|
|
493
|
+
const { accountId } = yield* yield* CloudflareEnvironment;
|
|
494
|
+
const zoneCache = new Map();
|
|
495
|
+
const normalized = [];
|
|
496
|
+
const seen = new Set();
|
|
497
|
+
for (const route of routes) {
|
|
498
|
+
const pattern = route.pattern.trim();
|
|
499
|
+
const zoneId = route.zoneId
|
|
500
|
+
? route.zoneId
|
|
501
|
+
: route.zone || route.zoneName
|
|
502
|
+
? yield* resolveZoneId({
|
|
503
|
+
accountId,
|
|
504
|
+
zone: route.zone ?? route.zoneName,
|
|
505
|
+
hostname: hostnameFromPattern(pattern),
|
|
506
|
+
})
|
|
507
|
+
: yield* inferZoneIdForHostname(hostnameFromPattern(pattern), zoneCache);
|
|
508
|
+
const key = routeKey({ pattern, zoneId });
|
|
509
|
+
if (seen.has(key))
|
|
510
|
+
continue;
|
|
511
|
+
seen.add(key);
|
|
512
|
+
normalized.push({ pattern, zoneId });
|
|
513
|
+
}
|
|
514
|
+
return normalized;
|
|
515
|
+
});
|
|
516
|
+
// List the routes attached to `scriptName` across the given zones.
|
|
517
|
+
// Routes without an id/pattern or owned by another script are
|
|
518
|
+
// ignored. Zones the token can't read are skipped rather than
|
|
519
|
+
// failing the whole listing.
|
|
520
|
+
const listWorkerRoutesInZones = (scriptName, zoneIds) => {
|
|
521
|
+
const uniqueZoneIds = Array.from(new Set(zoneIds));
|
|
522
|
+
if (uniqueZoneIds.length === 0) {
|
|
523
|
+
return Effect.succeed([]);
|
|
524
|
+
}
|
|
525
|
+
const routesByZone = Effect.all(uniqueZoneIds.map((zoneId) => workers.listRoutes({ zoneId }).pipe(Effect.map((response) => (response.result ?? []).flatMap((route) => route.id && route.pattern && route.script === scriptName
|
|
526
|
+
? [{ id: route.id, pattern: route.pattern, zoneId }]
|
|
527
|
+
: [])), Effect.catch(() => Effect.succeed([])))), { concurrency: "unbounded" });
|
|
528
|
+
return Effect.map(routesByZone, (routes) => routes.flat());
|
|
529
|
+
};
|
|
530
|
+
// Observe every route attached to `scriptName` account-wide. Routes
|
|
531
|
+
// are zone-scoped with no account-level enumeration API, so fan out
|
|
532
|
+
// over all of the account's zones. Any failure to enumerate zones
|
|
533
|
+
// (e.g. a token without zone read scope) degrades to "no routes"
|
|
534
|
+
// rather than failing the read.
|
|
535
|
+
const readWorkerRoutes = (scriptName) => Effect.gen(function* () {
|
|
536
|
+
const { accountId } = yield* yield* CloudflareEnvironment;
|
|
537
|
+
const accountZones = yield* listAllZones(accountId).pipe(Effect.catch(() => Effect.succeed([])));
|
|
538
|
+
return yield* listWorkerRoutesInZones(scriptName, accountZones.map((zone) => zone.id));
|
|
539
|
+
});
|
|
540
|
+
// Converge the zone routes attached to `scriptName` to `desired`.
|
|
541
|
+
// Observed cloud state (not `previous`) is the diff baseline —
|
|
542
|
+
// `previous` only contributes zone ids so routes moved out of a zone
|
|
543
|
+
// are still cleaned up after state loss or an interrupted apply.
|
|
544
|
+
const reconcileRoutes = (scriptName, desired, previous) => Effect.gen(function* () {
|
|
545
|
+
const zoneIds = Array.from(new Set([
|
|
546
|
+
...desired.map((route) => route.zoneId),
|
|
547
|
+
...previous.map((route) => route.zoneId),
|
|
548
|
+
]));
|
|
549
|
+
const liveAll = yield* listWorkerRoutesInZones(scriptName, zoneIds);
|
|
550
|
+
const desiredKeys = new Set(desired.map(routeKey));
|
|
551
|
+
const liveByKey = new Map(liveAll.map((route) => [routeKey(route), route]));
|
|
552
|
+
const toRemove = liveAll.filter((route) => !desiredKeys.has(routeKey(route)));
|
|
553
|
+
yield* Effect.all(toRemove.map((route) => workers
|
|
554
|
+
.deleteRoute({ zoneId: route.zoneId, routeId: route.id })
|
|
555
|
+
.pipe(Effect.catchTag("RouteNotFound", () => Effect.void))), { concurrency: "unbounded" });
|
|
556
|
+
if (desired.length === 0)
|
|
557
|
+
return [];
|
|
558
|
+
const attachRoute = Effect.fn(function* (route) {
|
|
559
|
+
const existing = liveByKey.get(routeKey(route));
|
|
560
|
+
if (existing)
|
|
561
|
+
return existing;
|
|
562
|
+
const zoneRoutes = yield* workers
|
|
563
|
+
.listRoutes({ zoneId: route.zoneId })
|
|
564
|
+
.pipe(Effect.map((response) => response.result ?? []), Effect.catch(() => Effect.succeed([])));
|
|
565
|
+
const otherOwner = zoneRoutes.find((candidate) => candidate.pattern === route.pattern &&
|
|
566
|
+
candidate.script &&
|
|
567
|
+
candidate.script !== scriptName);
|
|
568
|
+
if (otherOwner) {
|
|
569
|
+
return yield* Effect.die(new Error(`Cannot attach route '${route.pattern}' to Worker '${scriptName}': ` +
|
|
570
|
+
`it is already attached to Worker '${otherOwner.script}'. ` +
|
|
571
|
+
`Remove it from that Worker first, or pick a different pattern.`));
|
|
572
|
+
}
|
|
573
|
+
// A duplicate-pattern failure means another actor (or a crashed
|
|
574
|
+
// previous reconcile) created the route between our observation
|
|
575
|
+
// and now — re-list and converge if it points at this script.
|
|
576
|
+
const created = yield* workers
|
|
577
|
+
.createRoute({
|
|
578
|
+
zoneId: route.zoneId,
|
|
579
|
+
pattern: route.pattern,
|
|
580
|
+
script: scriptName,
|
|
581
|
+
})
|
|
582
|
+
.pipe(
|
|
583
|
+
// Same eventual-consistency window as `putDomain`: creating
|
|
584
|
+
// a route right after `putScript` can race Cloudflare's
|
|
585
|
+
// script registry, which rejects with code 10019 ("Cannot
|
|
586
|
+
// configure a route for a Worker which does not exist") —
|
|
587
|
+
// typed as `RouteScriptNotFound` via the createRoute patch.
|
|
588
|
+
Effect.retry({
|
|
589
|
+
while: (error) => error._tag === "RouteScriptNotFound",
|
|
590
|
+
schedule: Schedule.exponential(200).pipe(Schedule.both(Schedule.recurs(15))),
|
|
591
|
+
}), Effect.catchTag("InvalidRoute", (originalError) => Effect.gen(function* () {
|
|
592
|
+
const match = yield* workers
|
|
593
|
+
.listRoutes({ zoneId: route.zoneId })
|
|
594
|
+
.pipe(Effect.map((response) => (response.result ?? []).find((candidate) => candidate.pattern === route.pattern &&
|
|
595
|
+
candidate.script === scriptName)), Effect.catch(() => Effect.succeed(undefined)));
|
|
596
|
+
if (!match?.id) {
|
|
597
|
+
return yield* Effect.fail(originalError);
|
|
598
|
+
}
|
|
599
|
+
return { id: match.id, pattern: match.pattern };
|
|
600
|
+
})));
|
|
601
|
+
return {
|
|
602
|
+
id: created.id,
|
|
603
|
+
pattern: created.pattern,
|
|
604
|
+
zoneId: route.zoneId,
|
|
605
|
+
};
|
|
606
|
+
});
|
|
607
|
+
return yield* Effect.all(desired.map(attachRoute), {
|
|
608
|
+
concurrency: "unbounded",
|
|
609
|
+
});
|
|
610
|
+
});
|
|
345
611
|
const createAlchemyWorkerTags = (id) => [
|
|
346
612
|
`alchemy:stack:${stack.name}`,
|
|
347
613
|
`alchemy:stage:${stack.stage}`,
|
|
@@ -557,9 +823,16 @@ export const LiveWorkerProvider = () => Provider.effect(Worker, Effect.gen(funct
|
|
|
557
823
|
// hash that `readAssets` produces is the manifest-derived
|
|
558
824
|
// hash, which is shaped differently from any upstream
|
|
559
825
|
// build-input hash and will never match it on the next pass.
|
|
826
|
+
const metadataHash = yield* resolveWorkerMetadataHash({
|
|
827
|
+
props: news,
|
|
828
|
+
bindings,
|
|
829
|
+
accountId,
|
|
830
|
+
stack: { name: stack.name, stage: stack.stage },
|
|
831
|
+
});
|
|
560
832
|
const hash = {
|
|
561
833
|
...preparedHash,
|
|
562
834
|
assets: prebuiltAssets?.hash ?? preparedHash.assets,
|
|
835
|
+
metadata: metadataHash,
|
|
563
836
|
};
|
|
564
837
|
const metadataBindings = bindings.flatMap((b) => b.data.bindings ?? []);
|
|
565
838
|
const expectedDurableObjectClassNames = getExpectedDurableObjectClassNames(metadataBindings, name);
|
|
@@ -781,6 +1054,7 @@ export const LiveWorkerProvider = () => Provider.effect(Worker, Effect.gen(funct
|
|
|
781
1054
|
assets: metadataAssets,
|
|
782
1055
|
bindings: metadataBindings,
|
|
783
1056
|
bodyPart: undefined,
|
|
1057
|
+
cache: news.cache ?? getCacheBinding(bindings),
|
|
784
1058
|
compatibilityDate: compatibility.date,
|
|
785
1059
|
compatibilityFlags: compatibility.flags,
|
|
786
1060
|
containers: metadataContainers.length > 0 ? metadataContainers : undefined,
|
|
@@ -840,7 +1114,8 @@ export const LiveWorkerProvider = () => Provider.effect(Worker, Effect.gen(funct
|
|
|
840
1114
|
const { settings, durableObjectNamespaces } = yield* getWorkerSettingsWithDurableObjects(name, expectedDurableObjectClassNames, dispatchNamespace);
|
|
841
1115
|
// Workers for Platforms user workers are invoked via dynamic dispatch,
|
|
842
1116
|
// never routed directly — they have no workers.dev subdomain, custom
|
|
843
|
-
// domains, or cron triggers. Skip all of that
|
|
1117
|
+
// domains, zone routes, or cron triggers. Skip all of that
|
|
1118
|
+
// reconciliation.
|
|
844
1119
|
if (dispatchNamespace) {
|
|
845
1120
|
return {
|
|
846
1121
|
workerId: worker.id ?? name,
|
|
@@ -852,6 +1127,7 @@ export const LiveWorkerProvider = () => Provider.effect(Worker, Effect.gen(funct
|
|
|
852
1127
|
durableObjectNamespaces,
|
|
853
1128
|
accountId,
|
|
854
1129
|
domains: [],
|
|
1130
|
+
routes: [],
|
|
855
1131
|
crons: [],
|
|
856
1132
|
hash,
|
|
857
1133
|
};
|
|
@@ -904,6 +1180,12 @@ export const LiveWorkerProvider = () => Provider.effect(Worker, Effect.gen(funct
|
|
|
904
1180
|
...reconciled.map((d) => `https://${d.hostname}`),
|
|
905
1181
|
...(workersDevUrl ? [workersDevUrl] : []),
|
|
906
1182
|
];
|
|
1183
|
+
const desiredRoutes = yield* normalizeRoutes(news.routes);
|
|
1184
|
+
const previousRoutes = output?.routes ?? [];
|
|
1185
|
+
if (desiredRoutes.length > 0 || previousRoutes.length > 0) {
|
|
1186
|
+
yield* session.note(`Reconciling worker routes (${desiredRoutes.length}) ...`);
|
|
1187
|
+
}
|
|
1188
|
+
const routes = yield* reconcileRoutes(name, desiredRoutes, previousRoutes);
|
|
907
1189
|
const crons = yield* reconcileCrons(name, normalizeCrons([...getCronBindings(bindings), ...(news.crons ?? [])]), output?.crons ?? [], session);
|
|
908
1190
|
return {
|
|
909
1191
|
workerId: worker.id ?? name,
|
|
@@ -915,11 +1197,29 @@ export const LiveWorkerProvider = () => Provider.effect(Worker, Effect.gen(funct
|
|
|
915
1197
|
durableObjectNamespaces,
|
|
916
1198
|
accountId,
|
|
917
1199
|
domains,
|
|
1200
|
+
routes,
|
|
918
1201
|
crons,
|
|
919
1202
|
hash,
|
|
920
1203
|
};
|
|
921
1204
|
});
|
|
922
|
-
const hasChanged = Effect.fn(function* (id, props, output) {
|
|
1205
|
+
const hasChanged = Effect.fn(function* (id, props, output, bindings, accountId) {
|
|
1206
|
+
// #745: metadata-only edits (compatibility, observability, placement,
|
|
1207
|
+
// limits, logpush, env literals, bindings, subdomain config, tags)
|
|
1208
|
+
// don't touch the bundle/vite/asset-content hashes below, so compare a
|
|
1209
|
+
// hash of that surface first. Skipped when bindings are still
|
|
1210
|
+
// unresolved: the hash can't be computed deterministically here, and
|
|
1211
|
+
// the eventual apply stores it once bindings resolve.
|
|
1212
|
+
if (bindings) {
|
|
1213
|
+
const metadataHash = yield* resolveWorkerMetadataHash({
|
|
1214
|
+
props,
|
|
1215
|
+
bindings,
|
|
1216
|
+
accountId,
|
|
1217
|
+
stack: { name: stack.name, stage: stack.stage },
|
|
1218
|
+
});
|
|
1219
|
+
if (metadataHash !== output.hash?.metadata) {
|
|
1220
|
+
return true;
|
|
1221
|
+
}
|
|
1222
|
+
}
|
|
923
1223
|
if (props.script !== undefined) {
|
|
924
1224
|
const scriptHash = yield* hashScript(props.script);
|
|
925
1225
|
if (scriptHash !== output.hash?.bundle) {
|
|
@@ -1012,6 +1312,7 @@ export const LiveWorkerProvider = () => Provider.effect(Worker, Effect.gen(funct
|
|
|
1012
1312
|
tags: script.tags ?? undefined,
|
|
1013
1313
|
durableObjectNamespaces: {},
|
|
1014
1314
|
domains: [],
|
|
1315
|
+
routes: [],
|
|
1015
1316
|
crons: [],
|
|
1016
1317
|
},
|
|
1017
1318
|
]
|
|
@@ -1059,6 +1360,12 @@ export const LiveWorkerProvider = () => Provider.effect(Worker, Effect.gen(funct
|
|
|
1059
1360
|
const oldCrons = [...(output?.crons ?? [])].sort();
|
|
1060
1361
|
const cronsChanged = newCrons.length !== oldCrons.length ||
|
|
1061
1362
|
newCrons.some((cron, index) => cron !== oldCrons[index]);
|
|
1363
|
+
const newRouteKeys = (yield* normalizeRoutes(news.routes))
|
|
1364
|
+
.map(routeKey)
|
|
1365
|
+
.sort();
|
|
1366
|
+
const oldRouteKeys = (output?.routes ?? []).map(routeKey).sort();
|
|
1367
|
+
const routesChanged = newRouteKeys.length !== oldRouteKeys.length ||
|
|
1368
|
+
newRouteKeys.some((key, index) => key !== oldRouteKeys[index]);
|
|
1062
1369
|
// `url` is `domains[0]`: the first custom domain in user order if
|
|
1063
1370
|
// any, otherwise the workers.dev URL (derived from the stable
|
|
1064
1371
|
// worker name + account subdomain). It's stable across this update
|
|
@@ -1100,8 +1407,11 @@ export const LiveWorkerProvider = () => Provider.effect(Worker, Effect.gen(funct
|
|
|
1100
1407
|
newDoClassNames.length === oldDoClassNames.length &&
|
|
1101
1408
|
newDoClassNames.every((name, i) => name === oldDoClassNames[i]);
|
|
1102
1409
|
if (domainsChanged ||
|
|
1410
|
+
routesChanged ||
|
|
1103
1411
|
cronsChanged ||
|
|
1104
|
-
(yield* hasChanged(id, news, output)
|
|
1412
|
+
(yield* hasChanged(id, news, output, Array.isArray(newBindings)
|
|
1413
|
+
? newBindings
|
|
1414
|
+
: undefined, accountId))) {
|
|
1105
1415
|
// `workerId` is always stable across an update; seed it so it
|
|
1106
1416
|
// survives now that `diff.stables` overrides `provider.stables`
|
|
1107
1417
|
// rather than being merged with it.
|
|
@@ -1121,7 +1431,7 @@ export const LiveWorkerProvider = () => Provider.effect(Worker, Effect.gen(funct
|
|
|
1121
1431
|
};
|
|
1122
1432
|
}
|
|
1123
1433
|
}),
|
|
1124
|
-
precreate: Effect.fn(function* ({ id, news, session }) {
|
|
1434
|
+
precreate: Effect.fn(function* ({ id, news, session, bindings }) {
|
|
1125
1435
|
const { accountId } = yield* yield* CloudflareEnvironment;
|
|
1126
1436
|
const name = yield* createWorkerName(id, news.name);
|
|
1127
1437
|
// A Workers for Platforms user worker can't be pre-created: precreate
|
|
@@ -1144,19 +1454,32 @@ export const LiveWorkerProvider = () => Provider.effect(Worker, Effect.gen(funct
|
|
|
1144
1454
|
durableObjectNamespaces: {},
|
|
1145
1455
|
accountId,
|
|
1146
1456
|
domains: [],
|
|
1457
|
+
routes: [],
|
|
1147
1458
|
crons: [],
|
|
1148
1459
|
};
|
|
1149
1460
|
}
|
|
1150
1461
|
const dispatchNamespace = resolveNamespaceName(news.namespace);
|
|
1151
1462
|
const exportMap = news.exports ?? {};
|
|
1152
|
-
|
|
1463
|
+
// A worker hosts Durable Object classes from two independent sources:
|
|
1464
|
+
// Effect-native DO *exports* (classes defined in the worker entry) and
|
|
1465
|
+
// DO *bindings* declared in `env` — e.g. a bare `Cloudflare.DurableObject`
|
|
1466
|
+
// that fronts a Container image. The placeholder must declare *every*
|
|
1467
|
+
// hosted class so each namespace is created here. A class that exists
|
|
1468
|
+
// only as a binding (a container-fronted DO) is otherwise absent from
|
|
1469
|
+
// this stub, and a resource caught in a worker<->container dependency
|
|
1470
|
+
// cycle — which resolves `worker.durableObjectNamespaces[className]`
|
|
1471
|
+
// against the precreate stub rather than the final reconcile output —
|
|
1472
|
+
// fails because the namespace id it needs never surfaced.
|
|
1473
|
+
const exportDerived = Object.keys(exportMap)
|
|
1153
1474
|
.filter((logicalId) => isDurableObjectExport(exportMap[logicalId]))
|
|
1154
|
-
.map((logicalId) => ({
|
|
1155
|
-
|
|
1156
|
-
className: logicalId,
|
|
1157
|
-
}));
|
|
1475
|
+
.map((logicalId) => ({ logicalId, className: logicalId }));
|
|
1476
|
+
const durableObjects = mergeDurableObjectClasses(exportDerived, getDurableObjectBindings(bindings, name));
|
|
1158
1477
|
const doClasses = durableObjects.map((binding) => binding.className);
|
|
1159
|
-
|
|
1478
|
+
// Only attach container metadata for classes actually fronted by a
|
|
1479
|
+
// Container binding (mirrors reconcile's `containerClassNames`).
|
|
1480
|
+
// Mapping every DO class to a container would wrongly mark plain DOs
|
|
1481
|
+
// as container-backed in the placeholder.
|
|
1482
|
+
const containers = Array.from(new Set(bindings.flatMap((b) => (b.data.containers ?? []).map((c) => c.className)))).map((className) => ({ className }));
|
|
1160
1483
|
const alchemyDoTags = durableObjects.map(({ logicalId, className }) => `alchemy:do:${logicalId}:${className}`);
|
|
1161
1484
|
const tags = Array.from(new Set([
|
|
1162
1485
|
...createAlchemyWorkerTags(id),
|
|
@@ -1258,6 +1581,7 @@ export const LiveWorkerProvider = () => Provider.effect(Worker, Effect.gen(funct
|
|
|
1258
1581
|
durableObjectNamespaces,
|
|
1259
1582
|
accountId,
|
|
1260
1583
|
domains: [],
|
|
1584
|
+
routes: [],
|
|
1261
1585
|
crons: [],
|
|
1262
1586
|
};
|
|
1263
1587
|
}),
|
|
@@ -1282,6 +1606,7 @@ export const LiveWorkerProvider = () => Provider.effect(Worker, Effect.gen(funct
|
|
|
1282
1606
|
tags: settings.tags ?? undefined,
|
|
1283
1607
|
durableObjectNamespaces: getDurableObjects(settings.bindings),
|
|
1284
1608
|
domains: [],
|
|
1609
|
+
routes: [],
|
|
1285
1610
|
crons: [],
|
|
1286
1611
|
};
|
|
1287
1612
|
return hasAlchemyWorkerTags(id, settings.tags ?? [])
|
|
@@ -1296,7 +1621,7 @@ export const LiveWorkerProvider = () => Provider.effect(Worker, Effect.gen(funct
|
|
|
1296
1621
|
// `WorkerNotFound` if the script doesn't exist, which the
|
|
1297
1622
|
// surrounding `Effect.catchTag` turns into `undefined` — that's
|
|
1298
1623
|
// all the existence check we need.
|
|
1299
|
-
const [subdomain, settings, domainsList] = yield* Effect.all([
|
|
1624
|
+
const [subdomain, settings, domainsList, routesList] = yield* Effect.all([
|
|
1300
1625
|
workers.getScriptSubdomain({
|
|
1301
1626
|
accountId,
|
|
1302
1627
|
scriptName: workerName,
|
|
@@ -1311,7 +1636,8 @@ export const LiveWorkerProvider = () => Provider.effect(Worker, Effect.gen(funct
|
|
|
1311
1636
|
service: workerName,
|
|
1312
1637
|
})
|
|
1313
1638
|
.pipe(Effect.map((r) => r.result ?? [])),
|
|
1314
|
-
|
|
1639
|
+
readWorkerRoutes(workerName),
|
|
1640
|
+
], { concurrency: "unbounded" });
|
|
1315
1641
|
// Preserve the order the user provided in `olds.domain`. The
|
|
1316
1642
|
// Cloudflare API returns domains in non-deterministic order,
|
|
1317
1643
|
// which would cause downstream `worker.domains[0]` reads to flip
|
|
@@ -1343,6 +1669,7 @@ export const LiveWorkerProvider = () => Provider.effect(Worker, Effect.gen(funct
|
|
|
1343
1669
|
tags: settings.tags ?? undefined,
|
|
1344
1670
|
durableObjectNamespaces: getDurableObjects(settings.bindings),
|
|
1345
1671
|
domains,
|
|
1672
|
+
routes: routesList,
|
|
1346
1673
|
crons,
|
|
1347
1674
|
};
|
|
1348
1675
|
// Centralized ownership decision: the engine routes `read`'s
|
|
@@ -1420,6 +1747,17 @@ export const LiveWorkerProvider = () => Provider.effect(Worker, Effect.gen(funct
|
|
|
1420
1747
|
]
|
|
1421
1748
|
: []), { concurrency: "unbounded" });
|
|
1422
1749
|
}
|
|
1750
|
+
// Routes are zone-scoped; enumerating every zone live is
|
|
1751
|
+
// expensive, so trust the persisted route ids (refreshed by
|
|
1752
|
+
// `read`) and tolerate already-deleted routes.
|
|
1753
|
+
if (output.routes?.length) {
|
|
1754
|
+
yield* Effect.all(output.routes.map((route) => workers
|
|
1755
|
+
.deleteRoute({
|
|
1756
|
+
zoneId: route.zoneId,
|
|
1757
|
+
routeId: route.id,
|
|
1758
|
+
})
|
|
1759
|
+
.pipe(Effect.catchTag("RouteNotFound", () => Effect.void))), { concurrency: "unbounded" });
|
|
1760
|
+
}
|
|
1423
1761
|
yield* deleteWorkerScript(output.accountId, output.workerName, undefined).pipe(Effect.catchTag("WorkerNotFound", () => Effect.void));
|
|
1424
1762
|
}),
|
|
1425
1763
|
tail: ({ output }) => telemetry.tailScript({
|
|
@@ -1470,6 +1808,15 @@ function bumpMigrationTagVersion(oldTag) {
|
|
|
1470
1808
|
return "alchemy:v1";
|
|
1471
1809
|
return `alchemy:v${parseInt(version, 10) + 1}`;
|
|
1472
1810
|
}
|
|
1811
|
+
/**
|
|
1812
|
+
* Merges a worker's export-derived and binding-derived Durable Object class
|
|
1813
|
+
* lists for the precreate placeholder, deduping by class name. The
|
|
1814
|
+
* binding-derived entry wins on a collision so the `alchemy:do:` tag keys off
|
|
1815
|
+
* the same logical id (the binding sid) that `reconcile` writes.
|
|
1816
|
+
*/
|
|
1817
|
+
function mergeDurableObjectClasses(exportDerived, bindingDerived) {
|
|
1818
|
+
return Array.from(new Map([...exportDerived, ...bindingDerived].map((binding) => [binding.className, binding])).values());
|
|
1819
|
+
}
|
|
1473
1820
|
function getDurableObjectBindings(bindings, workerName) {
|
|
1474
1821
|
// Resource authors (and the `make`/`yield* Tag`/plan-vs-apply machinery)
|
|
1475
1822
|
// can register the same DO binding multiple times under the same logical
|