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.
Files changed (607) hide show
  1. package/bin/cli.js +9 -1
  2. package/bin/exec.js +15 -5
  3. package/bin/exec.js.map +1 -1
  4. package/lib/AWS/ACM/Certificate.d.ts.map +1 -1
  5. package/lib/AWS/ACM/Certificate.js +9 -2
  6. package/lib/AWS/ACM/Certificate.js.map +1 -1
  7. package/lib/AWS/AutoScaling/AutoScalingGroup.d.ts.map +1 -1
  8. package/lib/AWS/AutoScaling/AutoScalingGroup.js +18 -11
  9. package/lib/AWS/AutoScaling/AutoScalingGroup.js.map +1 -1
  10. package/lib/AWS/AutoScaling/LaunchTemplate.js +6 -1
  11. package/lib/AWS/AutoScaling/LaunchTemplate.js.map +1 -1
  12. package/lib/AWS/AutoScaling/ScalingPolicy.d.ts.map +1 -1
  13. package/lib/AWS/AutoScaling/ScalingPolicy.js +28 -10
  14. package/lib/AWS/AutoScaling/ScalingPolicy.js.map +1 -1
  15. package/lib/AWS/CloudFront/PublicKey.d.ts.map +1 -1
  16. package/lib/AWS/CloudFront/PublicKey.js +5 -1
  17. package/lib/AWS/CloudFront/PublicKey.js.map +1 -1
  18. package/lib/AWS/DynamoDB/Table.js +1 -1
  19. package/lib/AWS/DynamoDB/Table.js.map +1 -1
  20. package/lib/AWS/ECS/Service.d.ts.map +1 -1
  21. package/lib/AWS/ECS/Service.js +29 -4
  22. package/lib/AWS/ECS/Service.js.map +1 -1
  23. package/lib/AWS/IAM/OpenIDConnectProvider.d.ts.map +1 -1
  24. package/lib/AWS/IAM/OpenIDConnectProvider.js +9 -1
  25. package/lib/AWS/IAM/OpenIDConnectProvider.js.map +1 -1
  26. package/lib/AWS/Lambda/Alias.d.ts +26 -0
  27. package/lib/AWS/Lambda/Alias.d.ts.map +1 -1
  28. package/lib/AWS/Lambda/Alias.js +31 -0
  29. package/lib/AWS/Lambda/Alias.js.map +1 -1
  30. package/lib/AWS/Lambda/EventInvokeConfig.d.ts +36 -0
  31. package/lib/AWS/Lambda/EventInvokeConfig.d.ts.map +1 -0
  32. package/lib/AWS/Lambda/EventInvokeConfig.js +76 -0
  33. package/lib/AWS/Lambda/EventInvokeConfig.js.map +1 -0
  34. package/lib/AWS/Lambda/Function.d.ts +27 -2
  35. package/lib/AWS/Lambda/Function.d.ts.map +1 -1
  36. package/lib/AWS/Lambda/Function.js +23 -2
  37. package/lib/AWS/Lambda/Function.js.map +1 -1
  38. package/lib/AWS/Lambda/index.d.ts +1 -0
  39. package/lib/AWS/Lambda/index.d.ts.map +1 -1
  40. package/lib/AWS/Lambda/index.js +1 -0
  41. package/lib/AWS/Lambda/index.js.map +1 -1
  42. package/lib/AWS/Organizations/DelegatedAdministrator.d.ts.map +1 -1
  43. package/lib/AWS/Organizations/DelegatedAdministrator.js +10 -2
  44. package/lib/AWS/Organizations/DelegatedAdministrator.js.map +1 -1
  45. package/lib/AWS/Organizations/PolicyAttachment.d.ts.map +1 -1
  46. package/lib/AWS/Organizations/PolicyAttachment.js +10 -4
  47. package/lib/AWS/Organizations/PolicyAttachment.js.map +1 -1
  48. package/lib/AWS/Organizations/RootPolicyType.d.ts.map +1 -1
  49. package/lib/AWS/Organizations/RootPolicyType.js +9 -4
  50. package/lib/AWS/Organizations/RootPolicyType.js.map +1 -1
  51. package/lib/AWS/Organizations/TrustedServiceAccess.d.ts.map +1 -1
  52. package/lib/AWS/Organizations/TrustedServiceAccess.js +8 -1
  53. package/lib/AWS/Organizations/TrustedServiceAccess.js.map +1 -1
  54. package/lib/AWS/Route53/HostedZone.d.ts.map +1 -1
  55. package/lib/AWS/Route53/HostedZone.js +20 -4
  56. package/lib/AWS/Route53/HostedZone.js.map +1 -1
  57. package/lib/AWS/Route53/Record.d.ts.map +1 -1
  58. package/lib/AWS/Route53/Record.js +32 -9
  59. package/lib/AWS/Route53/Record.js.map +1 -1
  60. package/lib/Apply.js +7 -1
  61. package/lib/Apply.js.map +1 -1
  62. package/lib/Auth/Lock.d.ts +17 -0
  63. package/lib/Auth/Lock.d.ts.map +1 -1
  64. package/lib/Auth/Lock.js +53 -18
  65. package/lib/Auth/Lock.js.map +1 -1
  66. package/lib/Bundle/PurePlugin.d.ts.map +1 -1
  67. package/lib/Bundle/PurePlugin.js +15 -2
  68. package/lib/Bundle/PurePlugin.js.map +1 -1
  69. package/lib/Cli/commands/sync.d.ts +22 -0
  70. package/lib/Cli/commands/sync.d.ts.map +1 -0
  71. package/lib/Cli/commands/sync.js +64 -0
  72. package/lib/Cli/commands/sync.js.map +1 -0
  73. package/lib/Cli/main.d.ts.map +1 -1
  74. package/lib/Cli/main.js +2 -0
  75. package/lib/Cli/main.js.map +1 -1
  76. package/lib/Cloudflare/AI/CustomTopics.d.ts.map +1 -1
  77. package/lib/Cloudflare/AI/CustomTopics.js +3 -1
  78. package/lib/Cloudflare/AI/CustomTopics.js.map +1 -1
  79. package/lib/Cloudflare/AI/Dataset.d.ts.map +1 -1
  80. package/lib/Cloudflare/AI/Dataset.js +3 -1
  81. package/lib/Cloudflare/AI/Dataset.js.map +1 -1
  82. package/lib/Cloudflare/AI/Evaluation.d.ts.map +1 -1
  83. package/lib/Cloudflare/AI/Evaluation.js +3 -1
  84. package/lib/Cloudflare/AI/Evaluation.js.map +1 -1
  85. package/lib/Cloudflare/AI/Gateway.d.ts.map +1 -1
  86. package/lib/Cloudflare/AI/Gateway.js +5 -6
  87. package/lib/Cloudflare/AI/Gateway.js.map +1 -1
  88. package/lib/Cloudflare/AI/GatewayDynamicRouting.d.ts.map +1 -1
  89. package/lib/Cloudflare/AI/GatewayDynamicRouting.js +3 -1
  90. package/lib/Cloudflare/AI/GatewayDynamicRouting.js.map +1 -1
  91. package/lib/Cloudflare/AI/GatewayProvider.d.ts +2 -1
  92. package/lib/Cloudflare/AI/GatewayProvider.d.ts.map +1 -1
  93. package/lib/Cloudflare/AI/GatewayProvider.js +5 -2
  94. package/lib/Cloudflare/AI/GatewayProvider.js.map +1 -1
  95. package/lib/Cloudflare/AI/ProviderKey.d.ts +135 -0
  96. package/lib/Cloudflare/AI/ProviderKey.d.ts.map +1 -0
  97. package/lib/Cloudflare/AI/ProviderKey.js +90 -0
  98. package/lib/Cloudflare/AI/ProviderKey.js.map +1 -0
  99. package/lib/Cloudflare/AI/SearchInstance.d.ts.map +1 -1
  100. package/lib/Cloudflare/AI/SearchInstance.js +5 -4
  101. package/lib/Cloudflare/AI/SearchInstance.js.map +1 -1
  102. package/lib/Cloudflare/AI/SearchNamespace.d.ts.map +1 -1
  103. package/lib/Cloudflare/AI/SearchNamespace.js +5 -4
  104. package/lib/Cloudflare/AI/SearchNamespace.js.map +1 -1
  105. package/lib/Cloudflare/AI/SearchToken.d.ts.map +1 -1
  106. package/lib/Cloudflare/AI/SearchToken.js +3 -1
  107. package/lib/Cloudflare/AI/SearchToken.js.map +1 -1
  108. package/lib/Cloudflare/AI/SecuritySettings.d.ts.map +1 -1
  109. package/lib/Cloudflare/AI/SecuritySettings.js +3 -1
  110. package/lib/Cloudflare/AI/SecuritySettings.js.map +1 -1
  111. package/lib/Cloudflare/AI/index.d.ts +1 -0
  112. package/lib/Cloudflare/AI/index.d.ts.map +1 -1
  113. package/lib/Cloudflare/AI/index.js +1 -0
  114. package/lib/Cloudflare/AI/index.js.map +1 -1
  115. package/lib/Cloudflare/Access/InfrastructureTarget.d.ts.map +1 -1
  116. package/lib/Cloudflare/Access/InfrastructureTarget.js +3 -1
  117. package/lib/Cloudflare/Access/InfrastructureTarget.js.map +1 -1
  118. package/lib/Cloudflare/Access/Organization.d.ts.map +1 -1
  119. package/lib/Cloudflare/Access/Organization.js +1 -1
  120. package/lib/Cloudflare/Access/Organization.js.map +1 -1
  121. package/lib/Cloudflare/Access/Policy.d.ts.map +1 -1
  122. package/lib/Cloudflare/Access/Policy.js +3 -1
  123. package/lib/Cloudflare/Access/Policy.js.map +1 -1
  124. package/lib/Cloudflare/Account/Account.d.ts.map +1 -1
  125. package/lib/Cloudflare/Account/Account.js +3 -1
  126. package/lib/Cloudflare/Account/Account.js.map +1 -1
  127. package/lib/Cloudflare/ApiToken/AccountApiToken.d.ts.map +1 -1
  128. package/lib/Cloudflare/ApiToken/AccountApiToken.js +1 -1
  129. package/lib/Cloudflare/ApiToken/AccountApiToken.js.map +1 -1
  130. package/lib/Cloudflare/ApiToken/UserApiToken.d.ts.map +1 -1
  131. package/lib/Cloudflare/ApiToken/UserApiToken.js +1 -1
  132. package/lib/Cloudflare/ApiToken/UserApiToken.js.map +1 -1
  133. package/lib/Cloudflare/Auth/AuthProvider.d.ts +3 -0
  134. package/lib/Cloudflare/Auth/AuthProvider.d.ts.map +1 -1
  135. package/lib/Cloudflare/Auth/AuthProvider.js +51 -14
  136. package/lib/Cloudflare/Auth/AuthProvider.js.map +1 -1
  137. package/lib/Cloudflare/BotManagement/BotManagement.d.ts.map +1 -1
  138. package/lib/Cloudflare/BotManagement/BotManagement.js +3 -1
  139. package/lib/Cloudflare/BotManagement/BotManagement.js.map +1 -1
  140. package/lib/Cloudflare/Cache/Reserve.d.ts.map +1 -1
  141. package/lib/Cloudflare/Cache/Reserve.js +3 -1
  142. package/lib/Cloudflare/Cache/Reserve.js.map +1 -1
  143. package/lib/Cloudflare/ClientCertificate/ClientCertificate.d.ts.map +1 -1
  144. package/lib/Cloudflare/ClientCertificate/ClientCertificate.js +3 -1
  145. package/lib/Cloudflare/ClientCertificate/ClientCertificate.js.map +1 -1
  146. package/lib/Cloudflare/Containers/Container.d.ts +2 -2
  147. package/lib/Cloudflare/Containers/Container.js +2 -2
  148. package/lib/Cloudflare/ContentScanning/ContentScanning.d.ts.map +1 -1
  149. package/lib/Cloudflare/ContentScanning/ContentScanning.js +3 -1
  150. package/lib/Cloudflare/ContentScanning/ContentScanning.js.map +1 -1
  151. package/lib/Cloudflare/CustomCertificate/CustomCertificate.d.ts.map +1 -1
  152. package/lib/Cloudflare/CustomCertificate/CustomCertificate.js +3 -1
  153. package/lib/Cloudflare/CustomCertificate/CustomCertificate.js.map +1 -1
  154. package/lib/Cloudflare/CustomHostname/CustomHostname.d.ts.map +1 -1
  155. package/lib/Cloudflare/CustomHostname/CustomHostname.js +1 -1
  156. package/lib/Cloudflare/CustomHostname/CustomHostname.js.map +1 -1
  157. package/lib/Cloudflare/CustomHostname/FallbackOrigin.d.ts.map +1 -1
  158. package/lib/Cloudflare/CustomHostname/FallbackOrigin.js +1 -1
  159. package/lib/Cloudflare/CustomHostname/FallbackOrigin.js.map +1 -1
  160. package/lib/Cloudflare/CustomNameserver/CustomNameserver.d.ts.map +1 -1
  161. package/lib/Cloudflare/CustomNameserver/CustomNameserver.js +3 -1
  162. package/lib/Cloudflare/CustomNameserver/CustomNameserver.js.map +1 -1
  163. package/lib/Cloudflare/D1/Database.d.ts.map +1 -1
  164. package/lib/Cloudflare/D1/Database.js +2 -2
  165. package/lib/Cloudflare/D1/Database.js.map +1 -1
  166. package/lib/Cloudflare/DNS/AccountSettings.d.ts.map +1 -1
  167. package/lib/Cloudflare/DNS/AccountSettings.js +3 -1
  168. package/lib/Cloudflare/DNS/AccountSettings.js.map +1 -1
  169. package/lib/Cloudflare/DNS/Dnssec.d.ts.map +1 -1
  170. package/lib/Cloudflare/DNS/Dnssec.js +3 -1
  171. package/lib/Cloudflare/DNS/Dnssec.js.map +1 -1
  172. package/lib/Cloudflare/DNS/Firewall.d.ts.map +1 -1
  173. package/lib/Cloudflare/DNS/Firewall.js +3 -1
  174. package/lib/Cloudflare/DNS/Firewall.js.map +1 -1
  175. package/lib/Cloudflare/DNS/Record.d.ts.map +1 -1
  176. package/lib/Cloudflare/DNS/Record.js +3 -1
  177. package/lib/Cloudflare/DNS/Record.js.map +1 -1
  178. package/lib/Cloudflare/DNS/View.d.ts.map +1 -1
  179. package/lib/Cloudflare/DNS/View.js +3 -1
  180. package/lib/Cloudflare/DNS/View.js.map +1 -1
  181. package/lib/Cloudflare/DNS/ZoneSettings.d.ts.map +1 -1
  182. package/lib/Cloudflare/DNS/ZoneSettings.js +3 -1
  183. package/lib/Cloudflare/DNS/ZoneSettings.js.map +1 -1
  184. package/lib/Cloudflare/DNS/ZoneTransferAcl.d.ts.map +1 -1
  185. package/lib/Cloudflare/DNS/ZoneTransferAcl.js +3 -1
  186. package/lib/Cloudflare/DNS/ZoneTransferAcl.js.map +1 -1
  187. package/lib/Cloudflare/DNS/ZoneTransferIncoming.d.ts.map +1 -1
  188. package/lib/Cloudflare/DNS/ZoneTransferIncoming.js +3 -1
  189. package/lib/Cloudflare/DNS/ZoneTransferIncoming.js.map +1 -1
  190. package/lib/Cloudflare/DNS/ZoneTransferOutgoing.d.ts.map +1 -1
  191. package/lib/Cloudflare/DNS/ZoneTransferOutgoing.js +3 -1
  192. package/lib/Cloudflare/DNS/ZoneTransferOutgoing.js.map +1 -1
  193. package/lib/Cloudflare/DNS/ZoneTransferPeer.d.ts.map +1 -1
  194. package/lib/Cloudflare/DNS/ZoneTransferPeer.js +3 -1
  195. package/lib/Cloudflare/DNS/ZoneTransferPeer.js.map +1 -1
  196. package/lib/Cloudflare/DNS/ZoneTransferTsig.d.ts.map +1 -1
  197. package/lib/Cloudflare/DNS/ZoneTransferTsig.js +3 -1
  198. package/lib/Cloudflare/DNS/ZoneTransferTsig.js.map +1 -1
  199. package/lib/Cloudflare/Email/Address.d.ts.map +1 -1
  200. package/lib/Cloudflare/Email/Address.js +3 -1
  201. package/lib/Cloudflare/Email/Address.js.map +1 -1
  202. package/lib/Cloudflare/Email/AllowPolicy.d.ts.map +1 -1
  203. package/lib/Cloudflare/Email/AllowPolicy.js +1 -1
  204. package/lib/Cloudflare/Email/AllowPolicy.js.map +1 -1
  205. package/lib/Cloudflare/Email/BlockSender.d.ts.map +1 -1
  206. package/lib/Cloudflare/Email/BlockSender.js +1 -1
  207. package/lib/Cloudflare/Email/BlockSender.js.map +1 -1
  208. package/lib/Cloudflare/Email/CatchAll.d.ts.map +1 -1
  209. package/lib/Cloudflare/Email/CatchAll.js +8 -2
  210. package/lib/Cloudflare/Email/CatchAll.js.map +1 -1
  211. package/lib/Cloudflare/Email/Domain.d.ts.map +1 -1
  212. package/lib/Cloudflare/Email/Domain.js +3 -1
  213. package/lib/Cloudflare/Email/Domain.js.map +1 -1
  214. package/lib/Cloudflare/Email/ImpersonationRegistryEntry.d.ts.map +1 -1
  215. package/lib/Cloudflare/Email/ImpersonationRegistryEntry.js +1 -1
  216. package/lib/Cloudflare/Email/ImpersonationRegistryEntry.js.map +1 -1
  217. package/lib/Cloudflare/Email/Routing.d.ts.map +1 -1
  218. package/lib/Cloudflare/Email/Routing.js +3 -1
  219. package/lib/Cloudflare/Email/Routing.js.map +1 -1
  220. package/lib/Cloudflare/Email/Rule.d.ts.map +1 -1
  221. package/lib/Cloudflare/Email/Rule.js +3 -1
  222. package/lib/Cloudflare/Email/Rule.js.map +1 -1
  223. package/lib/Cloudflare/Email/SendingSubdomain.d.ts.map +1 -1
  224. package/lib/Cloudflare/Email/SendingSubdomain.js +1 -1
  225. package/lib/Cloudflare/Email/SendingSubdomain.js.map +1 -1
  226. package/lib/Cloudflare/Email/TrustedDomain.d.ts.map +1 -1
  227. package/lib/Cloudflare/Email/TrustedDomain.js +1 -1
  228. package/lib/Cloudflare/Email/TrustedDomain.js.map +1 -1
  229. package/lib/Cloudflare/Fetcher.d.ts.map +1 -1
  230. package/lib/Cloudflare/Fetcher.js +10 -3
  231. package/lib/Cloudflare/Fetcher.js.map +1 -1
  232. package/lib/Cloudflare/Flagship/App.d.ts.map +1 -1
  233. package/lib/Cloudflare/Flagship/App.js +2 -3
  234. package/lib/Cloudflare/Flagship/App.js.map +1 -1
  235. package/lib/Cloudflare/Fraud/DetectionSettings.d.ts.map +1 -1
  236. package/lib/Cloudflare/Fraud/DetectionSettings.js +3 -1
  237. package/lib/Cloudflare/Fraud/DetectionSettings.js.map +1 -1
  238. package/lib/Cloudflare/GoogleTagGateway/GoogleTagGateway.d.ts.map +1 -1
  239. package/lib/Cloudflare/GoogleTagGateway/GoogleTagGateway.js +8 -2
  240. package/lib/Cloudflare/GoogleTagGateway/GoogleTagGateway.js.map +1 -1
  241. package/lib/Cloudflare/Healthcheck/Healthcheck.d.ts.map +1 -1
  242. package/lib/Cloudflare/Healthcheck/Healthcheck.js +3 -1
  243. package/lib/Cloudflare/Healthcheck/Healthcheck.js.map +1 -1
  244. package/lib/Cloudflare/HostnameTlsSetting/HostnameTlsSetting.d.ts.map +1 -1
  245. package/lib/Cloudflare/HostnameTlsSetting/HostnameTlsSetting.js +3 -1
  246. package/lib/Cloudflare/HostnameTlsSetting/HostnameTlsSetting.js.map +1 -1
  247. package/lib/Cloudflare/Hyperdrive/Connection.d.ts.map +1 -1
  248. package/lib/Cloudflare/Hyperdrive/Connection.js +2 -4
  249. package/lib/Cloudflare/Hyperdrive/Connection.js.map +1 -1
  250. package/lib/Cloudflare/KV/Namespace.d.ts.map +1 -1
  251. package/lib/Cloudflare/KV/Namespace.js +5 -4
  252. package/lib/Cloudflare/KV/Namespace.js.map +1 -1
  253. package/lib/Cloudflare/KeylessCertificate/KeylessCertificate.d.ts.map +1 -1
  254. package/lib/Cloudflare/KeylessCertificate/KeylessCertificate.js +3 -1
  255. package/lib/Cloudflare/KeylessCertificate/KeylessCertificate.js.map +1 -1
  256. package/lib/Cloudflare/LeakedCredentialCheck/LeakedCredentialCheck.d.ts.map +1 -1
  257. package/lib/Cloudflare/LeakedCredentialCheck/LeakedCredentialCheck.js +3 -1
  258. package/lib/Cloudflare/LeakedCredentialCheck/LeakedCredentialCheck.js.map +1 -1
  259. package/lib/Cloudflare/LoadBalancer/LoadBalancer.d.ts.map +1 -1
  260. package/lib/Cloudflare/LoadBalancer/LoadBalancer.js +3 -1
  261. package/lib/Cloudflare/LoadBalancer/LoadBalancer.js.map +1 -1
  262. package/lib/Cloudflare/ManagedTransforms/ManagedTransforms.d.ts.map +1 -1
  263. package/lib/Cloudflare/ManagedTransforms/ManagedTransforms.js +3 -1
  264. package/lib/Cloudflare/ManagedTransforms/ManagedTransforms.js.map +1 -1
  265. package/lib/Cloudflare/MtlsCertificate/MtlsCertificate.d.ts.map +1 -1
  266. package/lib/Cloudflare/MtlsCertificate/MtlsCertificate.js +3 -1
  267. package/lib/Cloudflare/MtlsCertificate/MtlsCertificate.js.map +1 -1
  268. package/lib/Cloudflare/Organization/Organization.d.ts.map +1 -1
  269. package/lib/Cloudflare/Organization/Organization.js +3 -1
  270. package/lib/Cloudflare/Organization/Organization.js.map +1 -1
  271. package/lib/Cloudflare/OriginCaCertificate/OriginCaCertificate.d.ts.map +1 -1
  272. package/lib/Cloudflare/OriginCaCertificate/OriginCaCertificate.js +7 -2
  273. package/lib/Cloudflare/OriginCaCertificate/OriginCaCertificate.js.map +1 -1
  274. package/lib/Cloudflare/OriginPostQuantumEncryption/OriginPostQuantumEncryption.d.ts.map +1 -1
  275. package/lib/Cloudflare/OriginPostQuantumEncryption/OriginPostQuantumEncryption.js +3 -1
  276. package/lib/Cloudflare/OriginPostQuantumEncryption/OriginPostQuantumEncryption.js.map +1 -1
  277. package/lib/Cloudflare/OriginTlsClientAuth/HostnameCertificate.d.ts.map +1 -1
  278. package/lib/Cloudflare/OriginTlsClientAuth/HostnameCertificate.js +5 -1
  279. package/lib/Cloudflare/OriginTlsClientAuth/HostnameCertificate.js.map +1 -1
  280. package/lib/Cloudflare/PageRule/PageRule.d.ts.map +1 -1
  281. package/lib/Cloudflare/PageRule/PageRule.js +3 -1
  282. package/lib/Cloudflare/PageRule/PageRule.js.map +1 -1
  283. package/lib/Cloudflare/Providers.d.ts +29 -0
  284. package/lib/Cloudflare/Providers.d.ts.map +1 -1
  285. package/lib/Cloudflare/Providers.js +30 -19
  286. package/lib/Cloudflare/Providers.js.map +1 -1
  287. package/lib/Cloudflare/Queues/Consumer.d.ts.map +1 -1
  288. package/lib/Cloudflare/Queues/Consumer.js +3 -1
  289. package/lib/Cloudflare/Queues/Consumer.js.map +1 -1
  290. package/lib/Cloudflare/Queues/Queue.d.ts.map +1 -1
  291. package/lib/Cloudflare/Queues/Queue.js +5 -4
  292. package/lib/Cloudflare/Queues/Queue.js.map +1 -1
  293. package/lib/Cloudflare/Queues/Subscription.d.ts.map +1 -1
  294. package/lib/Cloudflare/Queues/Subscription.js +3 -1
  295. package/lib/Cloudflare/Queues/Subscription.js.map +1 -1
  296. package/lib/Cloudflare/R2/Bucket.d.ts +98 -0
  297. package/lib/Cloudflare/R2/Bucket.d.ts.map +1 -1
  298. package/lib/Cloudflare/R2/Bucket.js +141 -3
  299. package/lib/Cloudflare/R2/Bucket.js.map +1 -1
  300. package/lib/Cloudflare/RegionalHostname/RegionalHostname.d.ts.map +1 -1
  301. package/lib/Cloudflare/RegionalHostname/RegionalHostname.js +3 -1
  302. package/lib/Cloudflare/RegionalHostname/RegionalHostname.js.map +1 -1
  303. package/lib/Cloudflare/Ruleset/Ruleset.d.ts.map +1 -1
  304. package/lib/Cloudflare/Ruleset/Ruleset.js +8 -3
  305. package/lib/Cloudflare/Ruleset/Ruleset.js.map +1 -1
  306. package/lib/Cloudflare/SecretsStore/Secret.d.ts.map +1 -1
  307. package/lib/Cloudflare/SecretsStore/Secret.js +31 -5
  308. package/lib/Cloudflare/SecretsStore/Secret.js.map +1 -1
  309. package/lib/Cloudflare/SecurityTxt/SecurityTxt.d.ts.map +1 -1
  310. package/lib/Cloudflare/SecurityTxt/SecurityTxt.js +3 -1
  311. package/lib/Cloudflare/SecurityTxt/SecurityTxt.js.map +1 -1
  312. package/lib/Cloudflare/StateStore/Api.d.ts +15 -0
  313. package/lib/Cloudflare/StateStore/State.d.ts +30 -1
  314. package/lib/Cloudflare/StateStore/State.d.ts.map +1 -1
  315. package/lib/Cloudflare/StateStore/State.js +85 -16
  316. package/lib/Cloudflare/StateStore/State.js.map +1 -1
  317. package/lib/Cloudflare/Tags/AccountResourceTags.d.ts.map +1 -1
  318. package/lib/Cloudflare/Tags/AccountResourceTags.js +8 -3
  319. package/lib/Cloudflare/Tags/AccountResourceTags.js.map +1 -1
  320. package/lib/Cloudflare/Tunnel/Route.d.ts.map +1 -1
  321. package/lib/Cloudflare/Tunnel/Route.js +3 -1
  322. package/lib/Cloudflare/Tunnel/Route.js.map +1 -1
  323. package/lib/Cloudflare/Tunnel/Tunnel.d.ts.map +1 -1
  324. package/lib/Cloudflare/Tunnel/Tunnel.js +3 -1
  325. package/lib/Cloudflare/Tunnel/Tunnel.js.map +1 -1
  326. package/lib/Cloudflare/UrlNormalization/UrlNormalization.d.ts.map +1 -1
  327. package/lib/Cloudflare/UrlNormalization/UrlNormalization.js +3 -1
  328. package/lib/Cloudflare/UrlNormalization/UrlNormalization.js.map +1 -1
  329. package/lib/Cloudflare/Vectorize/VectorizeIndex.d.ts.map +1 -1
  330. package/lib/Cloudflare/Vectorize/VectorizeIndex.js +2 -3
  331. package/lib/Cloudflare/Vectorize/VectorizeIndex.js.map +1 -1
  332. package/lib/Cloudflare/VpcService/VpcService.d.ts.map +1 -1
  333. package/lib/Cloudflare/VpcService/VpcService.js +1 -1
  334. package/lib/Cloudflare/VpcService/VpcService.js.map +1 -1
  335. package/lib/Cloudflare/WaitingRoom/WaitingRoom.d.ts.map +1 -1
  336. package/lib/Cloudflare/WaitingRoom/WaitingRoom.js +3 -1
  337. package/lib/Cloudflare/WaitingRoom/WaitingRoom.js.map +1 -1
  338. package/lib/Cloudflare/Web3/ContentList.d.ts.map +1 -1
  339. package/lib/Cloudflare/Web3/ContentList.js +3 -1
  340. package/lib/Cloudflare/Web3/ContentList.js.map +1 -1
  341. package/lib/Cloudflare/Web3/Hostname.d.ts.map +1 -1
  342. package/lib/Cloudflare/Web3/Hostname.js +3 -1
  343. package/lib/Cloudflare/Web3/Hostname.js.map +1 -1
  344. package/lib/Cloudflare/Workers/Cache.d.ts +71 -0
  345. package/lib/Cloudflare/Workers/Cache.d.ts.map +1 -0
  346. package/lib/Cloudflare/Workers/Cache.js +64 -0
  347. package/lib/Cloudflare/Workers/Cache.js.map +1 -0
  348. package/lib/Cloudflare/Workers/CronEventSource.d.ts +180 -6
  349. package/lib/Cloudflare/Workers/CronEventSource.d.ts.map +1 -1
  350. package/lib/Cloudflare/Workers/CronEventSource.js +180 -6
  351. package/lib/Cloudflare/Workers/CronEventSource.js.map +1 -1
  352. package/lib/Cloudflare/Workers/DurableObject.d.ts +36 -1
  353. package/lib/Cloudflare/Workers/DurableObject.d.ts.map +1 -1
  354. package/lib/Cloudflare/Workers/DurableObject.js +36 -1
  355. package/lib/Cloudflare/Workers/DurableObject.js.map +1 -1
  356. package/lib/Cloudflare/Workers/DurableObjectState.d.ts +11 -0
  357. package/lib/Cloudflare/Workers/DurableObjectState.d.ts.map +1 -1
  358. package/lib/Cloudflare/Workers/DurableObjectState.js +7 -0
  359. package/lib/Cloudflare/Workers/DurableObjectState.js.map +1 -1
  360. package/lib/Cloudflare/Workers/Fetch.js +2 -2
  361. package/lib/Cloudflare/Workers/Fetch.js.map +1 -1
  362. package/lib/Cloudflare/Workers/LocalWorkerProvider.d.ts.map +1 -1
  363. package/lib/Cloudflare/Workers/LocalWorkerProvider.js +3 -0
  364. package/lib/Cloudflare/Workers/LocalWorkerProvider.js.map +1 -1
  365. package/lib/Cloudflare/Workers/Worker.d.ts +230 -4
  366. package/lib/Cloudflare/Workers/Worker.d.ts.map +1 -1
  367. package/lib/Cloudflare/Workers/Worker.js +161 -7
  368. package/lib/Cloudflare/Workers/Worker.js.map +1 -1
  369. package/lib/Cloudflare/Workers/WorkerAsyncBindings.d.ts +9 -0
  370. package/lib/Cloudflare/Workers/WorkerAsyncBindings.d.ts.map +1 -1
  371. package/lib/Cloudflare/Workers/WorkerAsyncBindings.js +15 -0
  372. package/lib/Cloudflare/Workers/WorkerAsyncBindings.js.map +1 -1
  373. package/lib/Cloudflare/Workers/WorkerBinding.d.ts +30 -0
  374. package/lib/Cloudflare/Workers/WorkerBinding.d.ts.map +1 -1
  375. package/lib/Cloudflare/Workers/WorkerBridge.d.ts.map +1 -1
  376. package/lib/Cloudflare/Workers/WorkerBridge.js +27 -5
  377. package/lib/Cloudflare/Workers/WorkerBridge.js.map +1 -1
  378. package/lib/Cloudflare/Workers/WorkerLoader.js +9 -1
  379. package/lib/Cloudflare/Workers/WorkerLoader.js.map +1 -1
  380. package/lib/Cloudflare/Workers/WorkerProvider.d.ts.map +1 -1
  381. package/lib/Cloudflare/Workers/WorkerProvider.js +365 -18
  382. package/lib/Cloudflare/Workers/WorkerProvider.js.map +1 -1
  383. package/lib/Cloudflare/Workers/WorkerRuntimeContext.d.ts.map +1 -1
  384. package/lib/Cloudflare/Workers/WorkerRuntimeContext.js +20 -3
  385. package/lib/Cloudflare/Workers/WorkerRuntimeContext.js.map +1 -1
  386. package/lib/Cloudflare/Workers/index.d.ts +1 -0
  387. package/lib/Cloudflare/Workers/index.d.ts.map +1 -1
  388. package/lib/Cloudflare/Workers/index.js +1 -0
  389. package/lib/Cloudflare/Workers/index.js.map +1 -1
  390. package/lib/Cloudflare/WorkersForPlatforms/DispatchNamespace.d.ts.map +1 -1
  391. package/lib/Cloudflare/WorkersForPlatforms/DispatchNamespace.js +2 -3
  392. package/lib/Cloudflare/WorkersForPlatforms/DispatchNamespace.js.map +1 -1
  393. package/lib/Cloudflare/Workflows/Workflow.d.ts +200 -24
  394. package/lib/Cloudflare/Workflows/Workflow.d.ts.map +1 -1
  395. package/lib/Cloudflare/Workflows/Workflow.js +126 -28
  396. package/lib/Cloudflare/Workflows/Workflow.js.map +1 -1
  397. package/lib/Cloudflare/Workflows/WorkflowBridge.d.ts.map +1 -1
  398. package/lib/Cloudflare/Workflows/WorkflowBridge.js +42 -3
  399. package/lib/Cloudflare/Workflows/WorkflowBridge.js.map +1 -1
  400. package/lib/Cloudflare/Zaraz/Config.d.ts +1 -0
  401. package/lib/Cloudflare/Zaraz/Config.d.ts.map +1 -1
  402. package/lib/Cloudflare/Zaraz/Config.js +8 -2
  403. package/lib/Cloudflare/Zaraz/Config.js.map +1 -1
  404. package/lib/Cloudflare/Zone/Zone.d.ts.map +1 -1
  405. package/lib/Cloudflare/Zone/Zone.js +1 -0
  406. package/lib/Cloudflare/Zone/Zone.js.map +1 -1
  407. package/lib/Docker/Container.d.ts.map +1 -1
  408. package/lib/Docker/Container.js +11 -1
  409. package/lib/Docker/Container.js.map +1 -1
  410. package/lib/Drizzle/Schema.d.ts.map +1 -1
  411. package/lib/Drizzle/Schema.js +12 -5
  412. package/lib/Drizzle/Schema.js.map +1 -1
  413. package/lib/Neon/Branch.d.ts.map +1 -1
  414. package/lib/Neon/Branch.js +15 -3
  415. package/lib/Neon/Branch.js.map +1 -1
  416. package/lib/Output.d.ts +13 -1
  417. package/lib/Output.d.ts.map +1 -1
  418. package/lib/Output.js +17 -3
  419. package/lib/Output.js.map +1 -1
  420. package/lib/Planetscale/Postgres/PostgresRole.js +2 -2
  421. package/lib/Planetscale/Postgres/PostgresRole.js.map +1 -1
  422. package/lib/Provider.d.ts +8 -0
  423. package/lib/Provider.d.ts.map +1 -1
  424. package/lib/Provider.js +38 -3
  425. package/lib/Provider.js.map +1 -1
  426. package/lib/Ref.d.ts +9 -1
  427. package/lib/Ref.d.ts.map +1 -1
  428. package/lib/Ref.js +2 -1
  429. package/lib/Ref.js.map +1 -1
  430. package/lib/Resource.d.ts +44 -0
  431. package/lib/Resource.d.ts.map +1 -1
  432. package/lib/Resource.js +22 -1
  433. package/lib/Resource.js.map +1 -1
  434. package/lib/Stack.js +1 -1
  435. package/lib/Stack.js.map +1 -1
  436. package/lib/State/HttpStateApi.d.ts +4 -4
  437. package/lib/State/HttpStateStore.d.ts +12 -0
  438. package/lib/State/HttpStateStore.d.ts.map +1 -1
  439. package/lib/State/HttpStateStore.js +46 -5
  440. package/lib/State/HttpStateStore.js.map +1 -1
  441. package/lib/Sync.d.ts +109 -0
  442. package/lib/Sync.d.ts.map +1 -0
  443. package/lib/Sync.js +312 -0
  444. package/lib/Sync.js.map +1 -0
  445. package/lib/Test/Bun.d.ts +1 -1
  446. package/lib/Test/Bun.d.ts.map +1 -1
  447. package/lib/Test/Bun.js +1 -1
  448. package/lib/Test/Bun.js.map +1 -1
  449. package/lib/Test/Http.d.ts +67 -0
  450. package/lib/Test/Http.d.ts.map +1 -1
  451. package/lib/Test/Http.js +69 -0
  452. package/lib/Test/Http.js.map +1 -1
  453. package/lib/Test/Vitest.d.ts +1 -1
  454. package/lib/Test/Vitest.d.ts.map +1 -1
  455. package/lib/Test/Vitest.js +1 -0
  456. package/lib/Test/Vitest.js.map +1 -1
  457. package/lib/Util/proxy-chain.js +14 -15
  458. package/lib/Util/proxy-chain.js.map +1 -1
  459. package/lib/index.d.ts +1 -0
  460. package/lib/index.d.ts.map +1 -1
  461. package/lib/index.js +1 -0
  462. package/lib/index.js.map +1 -1
  463. package/package.json +19 -19
  464. package/src/AWS/ACM/Certificate.ts +13 -2
  465. package/src/AWS/AutoScaling/AutoScalingGroup.ts +21 -15
  466. package/src/AWS/AutoScaling/LaunchTemplate.ts +6 -1
  467. package/src/AWS/AutoScaling/ScalingPolicy.ts +31 -17
  468. package/src/AWS/CloudFront/PublicKey.ts +4 -0
  469. package/src/AWS/DynamoDB/Table.ts +1 -1
  470. package/src/AWS/ECS/Service.ts +35 -6
  471. package/src/AWS/IAM/OpenIDConnectProvider.ts +9 -1
  472. package/src/AWS/Lambda/Alias.ts +42 -0
  473. package/src/AWS/Lambda/EventInvokeConfig.ts +150 -0
  474. package/src/AWS/Lambda/Function.ts +35 -2
  475. package/src/AWS/Lambda/index.ts +1 -0
  476. package/src/AWS/Organizations/DelegatedAdministrator.ts +11 -3
  477. package/src/AWS/Organizations/PolicyAttachment.ts +10 -4
  478. package/src/AWS/Organizations/RootPolicyType.ts +9 -4
  479. package/src/AWS/Organizations/TrustedServiceAccess.ts +9 -3
  480. package/src/AWS/Route53/HostedZone.ts +30 -13
  481. package/src/AWS/Route53/Record.ts +44 -22
  482. package/src/Apply.ts +7 -1
  483. package/src/Auth/Lock.ts +62 -18
  484. package/src/Bundle/PurePlugin.ts +15 -2
  485. package/src/Cli/commands/sync.ts +123 -0
  486. package/src/Cli/main.ts +2 -0
  487. package/src/Cloudflare/AI/CustomTopics.ts +3 -1
  488. package/src/Cloudflare/AI/Dataset.ts +3 -1
  489. package/src/Cloudflare/AI/Evaluation.ts +3 -1
  490. package/src/Cloudflare/AI/Gateway.ts +5 -6
  491. package/src/Cloudflare/AI/GatewayDynamicRouting.ts +3 -1
  492. package/src/Cloudflare/AI/GatewayProvider.ts +5 -2
  493. package/src/Cloudflare/AI/ProviderKey.ts +161 -0
  494. package/src/Cloudflare/AI/SearchInstance.ts +5 -4
  495. package/src/Cloudflare/AI/SearchNamespace.ts +5 -4
  496. package/src/Cloudflare/AI/SearchToken.ts +3 -1
  497. package/src/Cloudflare/AI/SecuritySettings.ts +3 -0
  498. package/src/Cloudflare/AI/index.ts +1 -0
  499. package/src/Cloudflare/Access/InfrastructureTarget.ts +4 -1
  500. package/src/Cloudflare/Access/Organization.ts +1 -0
  501. package/src/Cloudflare/Access/Policy.ts +3 -1
  502. package/src/Cloudflare/Account/Account.ts +3 -1
  503. package/src/Cloudflare/ApiToken/AccountApiToken.ts +1 -0
  504. package/src/Cloudflare/ApiToken/UserApiToken.ts +1 -0
  505. package/src/Cloudflare/Auth/AuthProvider.ts +69 -8
  506. package/src/Cloudflare/BotManagement/BotManagement.ts +3 -1
  507. package/src/Cloudflare/Cache/Reserve.ts +3 -1
  508. package/src/Cloudflare/ClientCertificate/ClientCertificate.ts +3 -1
  509. package/src/Cloudflare/Containers/Container.ts +2 -2
  510. package/src/Cloudflare/ContentScanning/ContentScanning.ts +3 -1
  511. package/src/Cloudflare/CustomCertificate/CustomCertificate.ts +3 -1
  512. package/src/Cloudflare/CustomHostname/CustomHostname.ts +1 -0
  513. package/src/Cloudflare/CustomHostname/FallbackOrigin.ts +1 -0
  514. package/src/Cloudflare/CustomNameserver/CustomNameserver.ts +3 -1
  515. package/src/Cloudflare/D1/Database.ts +2 -2
  516. package/src/Cloudflare/DNS/AccountSettings.ts +3 -1
  517. package/src/Cloudflare/DNS/Dnssec.ts +3 -1
  518. package/src/Cloudflare/DNS/Firewall.ts +3 -1
  519. package/src/Cloudflare/DNS/Record.ts +3 -1
  520. package/src/Cloudflare/DNS/View.ts +3 -1
  521. package/src/Cloudflare/DNS/ZoneSettings.ts +3 -1
  522. package/src/Cloudflare/DNS/ZoneTransferAcl.ts +3 -1
  523. package/src/Cloudflare/DNS/ZoneTransferIncoming.ts +3 -1
  524. package/src/Cloudflare/DNS/ZoneTransferOutgoing.ts +3 -1
  525. package/src/Cloudflare/DNS/ZoneTransferPeer.ts +3 -1
  526. package/src/Cloudflare/DNS/ZoneTransferTsig.ts +3 -1
  527. package/src/Cloudflare/Email/Address.ts +3 -1
  528. package/src/Cloudflare/Email/AllowPolicy.ts +1 -0
  529. package/src/Cloudflare/Email/BlockSender.ts +1 -0
  530. package/src/Cloudflare/Email/CatchAll.ts +7 -2
  531. package/src/Cloudflare/Email/Domain.ts +3 -1
  532. package/src/Cloudflare/Email/ImpersonationRegistryEntry.ts +1 -0
  533. package/src/Cloudflare/Email/Routing.ts +3 -1
  534. package/src/Cloudflare/Email/Rule.ts +3 -1
  535. package/src/Cloudflare/Email/SendingSubdomain.ts +1 -0
  536. package/src/Cloudflare/Email/TrustedDomain.ts +1 -0
  537. package/src/Cloudflare/Fetcher.ts +12 -5
  538. package/src/Cloudflare/Flagship/App.ts +2 -3
  539. package/src/Cloudflare/Fraud/DetectionSettings.ts +3 -1
  540. package/src/Cloudflare/GoogleTagGateway/GoogleTagGateway.ts +7 -2
  541. package/src/Cloudflare/Healthcheck/Healthcheck.ts +3 -1
  542. package/src/Cloudflare/HostnameTlsSetting/HostnameTlsSetting.ts +3 -1
  543. package/src/Cloudflare/Hyperdrive/Connection.ts +2 -4
  544. package/src/Cloudflare/KV/Namespace.ts +5 -4
  545. package/src/Cloudflare/KeylessCertificate/KeylessCertificate.ts +3 -1
  546. package/src/Cloudflare/LeakedCredentialCheck/LeakedCredentialCheck.ts +3 -1
  547. package/src/Cloudflare/LoadBalancer/LoadBalancer.ts +3 -1
  548. package/src/Cloudflare/ManagedTransforms/ManagedTransforms.ts +3 -1
  549. package/src/Cloudflare/MtlsCertificate/MtlsCertificate.ts +3 -1
  550. package/src/Cloudflare/Organization/Organization.ts +3 -1
  551. package/src/Cloudflare/OriginCaCertificate/OriginCaCertificate.ts +7 -2
  552. package/src/Cloudflare/OriginPostQuantumEncryption/OriginPostQuantumEncryption.ts +3 -1
  553. package/src/Cloudflare/OriginTlsClientAuth/HostnameCertificate.ts +5 -1
  554. package/src/Cloudflare/PageRule/PageRule.ts +3 -1
  555. package/src/Cloudflare/Providers.ts +34 -19
  556. package/src/Cloudflare/Queues/Consumer.ts +3 -1
  557. package/src/Cloudflare/Queues/Queue.ts +5 -4
  558. package/src/Cloudflare/Queues/Subscription.ts +3 -1
  559. package/src/Cloudflare/R2/Bucket.ts +230 -3
  560. package/src/Cloudflare/RegionalHostname/RegionalHostname.ts +3 -1
  561. package/src/Cloudflare/Ruleset/Ruleset.ts +9 -4
  562. package/src/Cloudflare/SecretsStore/Secret.ts +46 -5
  563. package/src/Cloudflare/SecurityTxt/SecurityTxt.ts +3 -1
  564. package/src/Cloudflare/StateStore/State.ts +89 -24
  565. package/src/Cloudflare/Tags/AccountResourceTags.ts +9 -5
  566. package/src/Cloudflare/Tunnel/Route.ts +3 -1
  567. package/src/Cloudflare/Tunnel/Tunnel.ts +3 -1
  568. package/src/Cloudflare/UrlNormalization/UrlNormalization.ts +3 -1
  569. package/src/Cloudflare/Vectorize/VectorizeIndex.ts +2 -3
  570. package/src/Cloudflare/VpcService/VpcService.ts +1 -0
  571. package/src/Cloudflare/WaitingRoom/WaitingRoom.ts +3 -1
  572. package/src/Cloudflare/Web3/ContentList.ts +3 -1
  573. package/src/Cloudflare/Web3/Hostname.ts +3 -1
  574. package/src/Cloudflare/Workers/Cache.ts +102 -0
  575. package/src/Cloudflare/Workers/CronEventSource.ts +180 -6
  576. package/src/Cloudflare/Workers/DurableObject.ts +36 -1
  577. package/src/Cloudflare/Workers/DurableObjectState.ts +25 -0
  578. package/src/Cloudflare/Workers/Fetch.ts +2 -2
  579. package/src/Cloudflare/Workers/LocalWorkerProvider.ts +3 -0
  580. package/src/Cloudflare/Workers/Worker.ts +315 -9
  581. package/src/Cloudflare/Workers/WorkerAsyncBindings.ts +18 -0
  582. package/src/Cloudflare/Workers/WorkerBridge.ts +37 -10
  583. package/src/Cloudflare/Workers/WorkerLoader.ts +10 -1
  584. package/src/Cloudflare/Workers/WorkerProvider.ts +576 -40
  585. package/src/Cloudflare/Workers/WorkerRuntimeContext.ts +23 -2
  586. package/src/Cloudflare/Workers/index.ts +1 -0
  587. package/src/Cloudflare/WorkersForPlatforms/DispatchNamespace.ts +2 -4
  588. package/src/Cloudflare/Workflows/Workflow.ts +296 -38
  589. package/src/Cloudflare/Workflows/WorkflowBridge.ts +62 -12
  590. package/src/Cloudflare/Zaraz/Config.ts +7 -2
  591. package/src/Cloudflare/Zone/Zone.ts +1 -0
  592. package/src/Docker/Container.ts +10 -1
  593. package/src/Drizzle/Schema.ts +12 -5
  594. package/src/Neon/Branch.ts +15 -3
  595. package/src/Output.ts +18 -2
  596. package/src/Planetscale/Postgres/PostgresRole.ts +2 -2
  597. package/src/Provider.ts +53 -3
  598. package/src/Ref.ts +10 -0
  599. package/src/Resource.ts +50 -1
  600. package/src/Stack.ts +1 -1
  601. package/src/State/HttpStateStore.ts +47 -5
  602. package/src/Sync.ts +494 -0
  603. package/src/Test/Bun.ts +4 -0
  604. package/src/Test/Http.ts +133 -0
  605. package/src/Test/Vitest.ts +11 -0
  606. package/src/Util/proxy-chain.ts +9 -12
  607. 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.putDispatchNamespaceScript({
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.putScript({
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 reconciliation.
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
- const durableObjects = Object.keys(exportMap)
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
- logicalId,
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
- const containers = doClasses.map((className) => ({ className }));
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