alchemy 2.0.0-beta.62 → 2.0.0-beta.63
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/README.md +12 -12
- package/bin/exec.js +1959 -70
- package/bin/exec.js.map +1 -1
- package/lib/AWS/AuthProvider.js +1 -1
- package/lib/AWS/AuthProvider.js.map +1 -1
- package/lib/AWS/EC2/hosted.d.ts.map +1 -1
- package/lib/AWS/EC2/hosted.js +2 -1
- package/lib/AWS/EC2/hosted.js.map +1 -1
- package/lib/AWS/ECS/Task.d.ts.map +1 -1
- package/lib/AWS/ECS/Task.js +2 -1
- package/lib/AWS/ECS/Task.js.map +1 -1
- package/lib/AWS/Lambda/Function.d.ts.map +1 -1
- package/lib/AWS/Lambda/Function.js +13 -40
- package/lib/AWS/Lambda/Function.js.map +1 -1
- package/lib/AWS/Lambda/MicrovmRuntimeContext.d.ts.map +1 -1
- package/lib/AWS/Lambda/MicrovmRuntimeContext.js +9 -21
- package/lib/AWS/Lambda/MicrovmRuntimeContext.js.map +1 -1
- package/lib/Action.d.ts +8 -0
- package/lib/Action.d.ts.map +1 -1
- package/lib/Action.js +16 -5
- package/lib/Action.js.map +1 -1
- package/lib/ActionRuntimeContext.d.ts +14 -0
- package/lib/ActionRuntimeContext.d.ts.map +1 -0
- package/lib/ActionRuntimeContext.js +56 -0
- package/lib/ActionRuntimeContext.js.map +1 -0
- package/lib/Apply.d.ts.map +1 -1
- package/lib/Apply.js +40 -6
- package/lib/Apply.js.map +1 -1
- package/lib/Auth/AuthProvider.d.ts +3 -3
- package/lib/Auth/AuthProvider.d.ts.map +1 -1
- package/lib/Auth/AuthProvider.js +1 -1
- package/lib/Auth/AuthProvider.js.map +1 -1
- package/lib/Auth/Lock.d.ts.map +1 -1
- package/lib/Auth/Lock.js +5 -2
- package/lib/Auth/Lock.js.map +1 -1
- package/lib/Bundle/PurePlugin.d.ts.map +1 -1
- package/lib/Bundle/PurePlugin.js +26 -1
- package/lib/Bundle/PurePlugin.js.map +1 -1
- package/lib/Bundle/Vite.d.ts +2 -0
- package/lib/Bundle/Vite.d.ts.map +1 -1
- package/lib/Bundle/Vite.js +24 -1
- package/lib/Bundle/Vite.js.map +1 -1
- package/lib/Cli/LoggingCli.d.ts.map +1 -1
- package/lib/Cli/LoggingCli.js +7 -4
- package/lib/Cli/LoggingCli.js.map +1 -1
- package/lib/Cli/commands/_shared.d.ts +19 -0
- package/lib/Cli/commands/_shared.d.ts.map +1 -1
- package/lib/Cli/commands/_shared.js +22 -0
- package/lib/Cli/commands/_shared.js.map +1 -1
- package/lib/Cli/commands/login.d.ts +7 -3
- package/lib/Cli/commands/login.d.ts.map +1 -1
- package/lib/Cli/commands/login.js +70 -12
- package/lib/Cli/commands/login.js.map +1 -1
- package/lib/Cli/commands/profile.d.ts.map +1 -1
- package/lib/Cli/commands/profile.js +7 -20
- package/lib/Cli/commands/profile.js.map +1 -1
- package/lib/Cloudflare/AI/LanguageModel.js +21 -4
- package/lib/Cloudflare/AI/LanguageModel.js.map +1 -1
- package/lib/Cloudflare/AI/QuerySearchLocal.d.ts +37 -0
- package/lib/Cloudflare/AI/QuerySearchLocal.d.ts.map +1 -0
- package/lib/Cloudflare/AI/QuerySearchLocal.js +53 -0
- package/lib/Cloudflare/AI/QuerySearchLocal.js.map +1 -0
- package/lib/Cloudflare/AI/QuerySearchNamespaceLocal.d.ts +35 -0
- package/lib/Cloudflare/AI/QuerySearchNamespaceLocal.d.ts.map +1 -0
- package/lib/Cloudflare/AI/QuerySearchNamespaceLocal.js +47 -0
- package/lib/Cloudflare/AI/QuerySearchNamespaceLocal.js.map +1 -0
- package/lib/Cloudflare/AI/SearchHttpClient.d.ts +34 -0
- package/lib/Cloudflare/AI/SearchHttpClient.d.ts.map +1 -0
- package/lib/Cloudflare/AI/SearchHttpClient.js +262 -0
- package/lib/Cloudflare/AI/SearchHttpClient.js.map +1 -0
- package/lib/Cloudflare/AI/index.d.ts +2 -0
- package/lib/Cloudflare/AI/index.d.ts.map +1 -1
- package/lib/Cloudflare/AI/index.js +2 -0
- package/lib/Cloudflare/AI/index.js.map +1 -1
- package/lib/Cloudflare/Auth/AuthProvider.js +1 -1
- package/lib/Cloudflare/Auth/AuthProvider.js.map +1 -1
- package/lib/Cloudflare/Containers/ContainerBundle.d.ts.map +1 -1
- package/lib/Cloudflare/Containers/ContainerBundle.js +11 -1
- package/lib/Cloudflare/Containers/ContainerBundle.js.map +1 -1
- package/lib/Cloudflare/Containers/ContainerPlatform.d.ts.map +1 -1
- package/lib/Cloudflare/Containers/ContainerPlatform.js +12 -33
- package/lib/Cloudflare/Containers/ContainerPlatform.js.map +1 -1
- package/lib/Cloudflare/D1/QueryDatabaseHttpClient.d.ts +24 -0
- package/lib/Cloudflare/D1/QueryDatabaseHttpClient.d.ts.map +1 -0
- package/lib/Cloudflare/D1/QueryDatabaseHttpClient.js +106 -0
- package/lib/Cloudflare/D1/QueryDatabaseHttpClient.js.map +1 -0
- package/lib/Cloudflare/D1/QueryDatabaseLocal.d.ts +38 -0
- package/lib/Cloudflare/D1/QueryDatabaseLocal.d.ts.map +1 -0
- package/lib/Cloudflare/D1/QueryDatabaseLocal.js +54 -0
- package/lib/Cloudflare/D1/QueryDatabaseLocal.js.map +1 -0
- package/lib/Cloudflare/D1/index.d.ts +1 -0
- package/lib/Cloudflare/D1/index.d.ts.map +1 -1
- package/lib/Cloudflare/D1/index.js +1 -0
- package/lib/Cloudflare/D1/index.js.map +1 -1
- package/lib/Cloudflare/DNS/DnsHttp.d.ts +16 -1
- package/lib/Cloudflare/DNS/DnsHttp.d.ts.map +1 -1
- package/lib/Cloudflare/DNS/DnsHttp.js +6 -1
- package/lib/Cloudflare/DNS/DnsHttp.js.map +1 -1
- package/lib/Cloudflare/DNS/DnsLocal.d.ts +22 -0
- package/lib/Cloudflare/DNS/DnsLocal.d.ts.map +1 -0
- package/lib/Cloudflare/DNS/DnsLocal.js +31 -0
- package/lib/Cloudflare/DNS/DnsLocal.js.map +1 -0
- package/lib/Cloudflare/DNS/ReadDnsHttp.d.ts +3 -3
- package/lib/Cloudflare/DNS/ReadDnsHttp.d.ts.map +1 -1
- package/lib/Cloudflare/DNS/ReadDnsHttp.js +3 -4
- package/lib/Cloudflare/DNS/ReadDnsHttp.js.map +1 -1
- package/lib/Cloudflare/DNS/ReadDnsLocal.d.ts +32 -0
- package/lib/Cloudflare/DNS/ReadDnsLocal.d.ts.map +1 -0
- package/lib/Cloudflare/DNS/ReadDnsLocal.js +35 -0
- package/lib/Cloudflare/DNS/ReadDnsLocal.js.map +1 -0
- package/lib/Cloudflare/DNS/ReadWriteDnsHttp.d.ts +3 -3
- package/lib/Cloudflare/DNS/ReadWriteDnsHttp.d.ts.map +1 -1
- package/lib/Cloudflare/DNS/ReadWriteDnsHttp.js +4 -4
- package/lib/Cloudflare/DNS/ReadWriteDnsHttp.js.map +1 -1
- package/lib/Cloudflare/DNS/ReadWriteDnsLocal.d.ts +40 -0
- package/lib/Cloudflare/DNS/ReadWriteDnsLocal.d.ts.map +1 -0
- package/lib/Cloudflare/DNS/ReadWriteDnsLocal.js +43 -0
- package/lib/Cloudflare/DNS/ReadWriteDnsLocal.js.map +1 -0
- package/lib/Cloudflare/DNS/WriteDnsHttp.d.ts +3 -3
- package/lib/Cloudflare/DNS/WriteDnsHttp.d.ts.map +1 -1
- package/lib/Cloudflare/DNS/WriteDnsHttp.js +3 -4
- package/lib/Cloudflare/DNS/WriteDnsHttp.js.map +1 -1
- package/lib/Cloudflare/DNS/WriteDnsLocal.d.ts +38 -0
- package/lib/Cloudflare/DNS/WriteDnsLocal.d.ts.map +1 -0
- package/lib/Cloudflare/DNS/WriteDnsLocal.js +41 -0
- package/lib/Cloudflare/DNS/WriteDnsLocal.js.map +1 -0
- package/lib/Cloudflare/DNS/index.d.ts +3 -0
- package/lib/Cloudflare/DNS/index.d.ts.map +1 -1
- package/lib/Cloudflare/DNS/index.js +3 -0
- package/lib/Cloudflare/DNS/index.js.map +1 -1
- package/lib/Cloudflare/Flagship/ReadFlagsHttpClient.d.ts +27 -0
- package/lib/Cloudflare/Flagship/ReadFlagsHttpClient.d.ts.map +1 -0
- package/lib/Cloudflare/Flagship/ReadFlagsHttpClient.js +86 -0
- package/lib/Cloudflare/Flagship/ReadFlagsHttpClient.js.map +1 -0
- package/lib/Cloudflare/Flagship/ReadFlagsLocal.d.ts +41 -0
- package/lib/Cloudflare/Flagship/ReadFlagsLocal.d.ts.map +1 -0
- package/lib/Cloudflare/Flagship/ReadFlagsLocal.js +57 -0
- package/lib/Cloudflare/Flagship/ReadFlagsLocal.js.map +1 -0
- package/lib/Cloudflare/Flagship/index.d.ts +1 -0
- package/lib/Cloudflare/Flagship/index.d.ts.map +1 -1
- package/lib/Cloudflare/Flagship/index.js +1 -0
- package/lib/Cloudflare/Flagship/index.js.map +1 -1
- package/lib/Cloudflare/KV/NamespaceHttp.d.ts +16 -1
- package/lib/Cloudflare/KV/NamespaceHttp.d.ts.map +1 -1
- package/lib/Cloudflare/KV/NamespaceHttp.js +8 -2
- package/lib/Cloudflare/KV/NamespaceHttp.js.map +1 -1
- package/lib/Cloudflare/KV/NamespaceLocal.d.ts +22 -0
- package/lib/Cloudflare/KV/NamespaceLocal.d.ts.map +1 -0
- package/lib/Cloudflare/KV/NamespaceLocal.js +32 -0
- package/lib/Cloudflare/KV/NamespaceLocal.js.map +1 -0
- package/lib/Cloudflare/KV/ReadNamespaceHttp.d.ts +2 -2
- package/lib/Cloudflare/KV/ReadNamespaceHttp.d.ts.map +1 -1
- package/lib/Cloudflare/KV/ReadNamespaceHttp.js +5 -6
- package/lib/Cloudflare/KV/ReadNamespaceHttp.js.map +1 -1
- package/lib/Cloudflare/KV/ReadNamespaceLocal.d.ts +27 -0
- package/lib/Cloudflare/KV/ReadNamespaceLocal.d.ts.map +1 -0
- package/lib/Cloudflare/KV/ReadNamespaceLocal.js +30 -0
- package/lib/Cloudflare/KV/ReadNamespaceLocal.js.map +1 -0
- package/lib/Cloudflare/KV/ReadWriteNamespaceHttp.d.ts +3 -3
- package/lib/Cloudflare/KV/ReadWriteNamespaceHttp.d.ts.map +1 -1
- package/lib/Cloudflare/KV/ReadWriteNamespaceHttp.js +6 -6
- package/lib/Cloudflare/KV/ReadWriteNamespaceHttp.js.map +1 -1
- package/lib/Cloudflare/KV/ReadWriteNamespaceLocal.d.ts +34 -0
- package/lib/Cloudflare/KV/ReadWriteNamespaceLocal.d.ts.map +1 -0
- package/lib/Cloudflare/KV/ReadWriteNamespaceLocal.js +37 -0
- package/lib/Cloudflare/KV/ReadWriteNamespaceLocal.js.map +1 -0
- package/lib/Cloudflare/KV/WriteNamespaceHttp.d.ts +2 -2
- package/lib/Cloudflare/KV/WriteNamespaceHttp.d.ts.map +1 -1
- package/lib/Cloudflare/KV/WriteNamespaceHttp.js +5 -6
- package/lib/Cloudflare/KV/WriteNamespaceHttp.js.map +1 -1
- package/lib/Cloudflare/KV/WriteNamespaceLocal.d.ts +27 -0
- package/lib/Cloudflare/KV/WriteNamespaceLocal.d.ts.map +1 -0
- package/lib/Cloudflare/KV/WriteNamespaceLocal.js +30 -0
- package/lib/Cloudflare/KV/WriteNamespaceLocal.js.map +1 -0
- package/lib/Cloudflare/KV/index.d.ts +3 -0
- package/lib/Cloudflare/KV/index.d.ts.map +1 -1
- package/lib/Cloudflare/KV/index.js +3 -0
- package/lib/Cloudflare/KV/index.js.map +1 -1
- package/lib/Cloudflare/Queues/QueueHttp.d.ts +20 -1
- package/lib/Cloudflare/Queues/QueueHttp.d.ts.map +1 -1
- package/lib/Cloudflare/Queues/QueueHttp.js +2 -2
- package/lib/Cloudflare/Queues/QueueHttp.js.map +1 -1
- package/lib/Cloudflare/Queues/WriteQueueHttp.d.ts +9 -3
- package/lib/Cloudflare/Queues/WriteQueueHttp.d.ts.map +1 -1
- package/lib/Cloudflare/Queues/WriteQueueHttp.js +11 -6
- package/lib/Cloudflare/Queues/WriteQueueHttp.js.map +1 -1
- package/lib/Cloudflare/Queues/WriteQueueLocal.d.ts +36 -0
- package/lib/Cloudflare/Queues/WriteQueueLocal.d.ts.map +1 -0
- package/lib/Cloudflare/Queues/WriteQueueLocal.js +51 -0
- package/lib/Cloudflare/Queues/WriteQueueLocal.js.map +1 -0
- package/lib/Cloudflare/Queues/index.d.ts +1 -0
- package/lib/Cloudflare/Queues/index.d.ts.map +1 -1
- package/lib/Cloudflare/Queues/index.js +1 -0
- package/lib/Cloudflare/Queues/index.js.map +1 -1
- package/lib/Cloudflare/R2/BucketHttp.d.ts +15 -1
- package/lib/Cloudflare/R2/BucketHttp.d.ts.map +1 -1
- package/lib/Cloudflare/R2/BucketHttp.js +3 -3
- package/lib/Cloudflare/R2/BucketHttp.js.map +1 -1
- package/lib/Cloudflare/R2/BucketLocal.d.ts +21 -0
- package/lib/Cloudflare/R2/BucketLocal.d.ts.map +1 -0
- package/lib/Cloudflare/R2/BucketLocal.js +32 -0
- package/lib/Cloudflare/R2/BucketLocal.js.map +1 -0
- package/lib/Cloudflare/R2/ReadBucketHttp.d.ts +2 -2
- package/lib/Cloudflare/R2/ReadBucketHttp.d.ts.map +1 -1
- package/lib/Cloudflare/R2/ReadBucketHttp.js +4 -4
- package/lib/Cloudflare/R2/ReadBucketHttp.js.map +1 -1
- package/lib/Cloudflare/R2/ReadBucketLocal.d.ts +27 -0
- package/lib/Cloudflare/R2/ReadBucketLocal.d.ts.map +1 -0
- package/lib/Cloudflare/R2/ReadBucketLocal.js +30 -0
- package/lib/Cloudflare/R2/ReadBucketLocal.js.map +1 -0
- package/lib/Cloudflare/R2/ReadWriteBucketHttp.d.ts +2 -2
- package/lib/Cloudflare/R2/ReadWriteBucketHttp.d.ts.map +1 -1
- package/lib/Cloudflare/R2/ReadWriteBucketHttp.js +5 -4
- package/lib/Cloudflare/R2/ReadWriteBucketHttp.js.map +1 -1
- package/lib/Cloudflare/R2/ReadWriteBucketLocal.d.ts +30 -0
- package/lib/Cloudflare/R2/ReadWriteBucketLocal.d.ts.map +1 -0
- package/lib/Cloudflare/R2/ReadWriteBucketLocal.js +33 -0
- package/lib/Cloudflare/R2/ReadWriteBucketLocal.js.map +1 -0
- package/lib/Cloudflare/R2/WriteBucketHttp.d.ts +2 -2
- package/lib/Cloudflare/R2/WriteBucketHttp.d.ts.map +1 -1
- package/lib/Cloudflare/R2/WriteBucketHttp.js +4 -4
- package/lib/Cloudflare/R2/WriteBucketHttp.js.map +1 -1
- package/lib/Cloudflare/R2/WriteBucketLocal.d.ts +27 -0
- package/lib/Cloudflare/R2/WriteBucketLocal.d.ts.map +1 -0
- package/lib/Cloudflare/R2/WriteBucketLocal.js +30 -0
- package/lib/Cloudflare/R2/WriteBucketLocal.js.map +1 -0
- package/lib/Cloudflare/R2/index.d.ts +3 -0
- package/lib/Cloudflare/R2/index.d.ts.map +1 -1
- package/lib/Cloudflare/R2/index.js +3 -0
- package/lib/Cloudflare/R2/index.js.map +1 -1
- package/lib/Cloudflare/StateStore/Api.d.ts +2 -0
- package/lib/Cloudflare/Tunnel/ReadTunnel.d.ts +3 -3
- package/lib/Cloudflare/Tunnel/ReadTunnel.d.ts.map +1 -1
- package/lib/Cloudflare/Tunnel/ReadTunnel.js +7 -8
- package/lib/Cloudflare/Tunnel/ReadTunnel.js.map +1 -1
- package/lib/Cloudflare/Tunnel/ReadTunnelLocal.d.ts +29 -0
- package/lib/Cloudflare/Tunnel/ReadTunnelLocal.d.ts.map +1 -0
- package/lib/Cloudflare/Tunnel/ReadTunnelLocal.js +30 -0
- package/lib/Cloudflare/Tunnel/ReadTunnelLocal.js.map +1 -0
- package/lib/Cloudflare/Tunnel/ReadWriteTunnel.d.ts +3 -3
- package/lib/Cloudflare/Tunnel/ReadWriteTunnel.d.ts.map +1 -1
- package/lib/Cloudflare/Tunnel/ReadWriteTunnel.js +4 -4
- package/lib/Cloudflare/Tunnel/ReadWriteTunnel.js.map +1 -1
- package/lib/Cloudflare/Tunnel/ReadWriteTunnelLocal.d.ts +35 -0
- package/lib/Cloudflare/Tunnel/ReadWriteTunnelLocal.d.ts.map +1 -0
- package/lib/Cloudflare/Tunnel/ReadWriteTunnelLocal.js +36 -0
- package/lib/Cloudflare/Tunnel/ReadWriteTunnelLocal.js.map +1 -0
- package/lib/Cloudflare/Tunnel/TunnelBinding.d.ts +17 -1
- package/lib/Cloudflare/Tunnel/TunnelBinding.d.ts.map +1 -1
- package/lib/Cloudflare/Tunnel/TunnelBinding.js +7 -1
- package/lib/Cloudflare/Tunnel/TunnelBinding.js.map +1 -1
- package/lib/Cloudflare/Tunnel/TunnelLocalBinding.d.ts +19 -0
- package/lib/Cloudflare/Tunnel/TunnelLocalBinding.d.ts.map +1 -0
- package/lib/Cloudflare/Tunnel/TunnelLocalBinding.js +29 -0
- package/lib/Cloudflare/Tunnel/TunnelLocalBinding.js.map +1 -0
- package/lib/Cloudflare/Tunnel/WarpConnector.d.ts +3 -3
- package/lib/Cloudflare/Tunnel/WarpConnector.d.ts.map +1 -1
- package/lib/Cloudflare/Tunnel/WarpConnector.js +7 -4
- package/lib/Cloudflare/Tunnel/WarpConnector.js.map +1 -1
- package/lib/Cloudflare/Tunnel/WriteTunnel.d.ts +3 -3
- package/lib/Cloudflare/Tunnel/WriteTunnel.d.ts.map +1 -1
- package/lib/Cloudflare/Tunnel/WriteTunnel.js +7 -8
- package/lib/Cloudflare/Tunnel/WriteTunnel.js.map +1 -1
- package/lib/Cloudflare/Tunnel/WriteTunnelLocal.d.ts +29 -0
- package/lib/Cloudflare/Tunnel/WriteTunnelLocal.d.ts.map +1 -0
- package/lib/Cloudflare/Tunnel/WriteTunnelLocal.js +30 -0
- package/lib/Cloudflare/Tunnel/WriteTunnelLocal.js.map +1 -0
- package/lib/Cloudflare/Tunnel/index.d.ts +3 -0
- package/lib/Cloudflare/Tunnel/index.d.ts.map +1 -1
- package/lib/Cloudflare/Tunnel/index.js +3 -0
- package/lib/Cloudflare/Tunnel/index.js.map +1 -1
- package/lib/Cloudflare/Vectorize/SearchIndexHttpClient.d.ts +30 -0
- package/lib/Cloudflare/Vectorize/SearchIndexHttpClient.d.ts.map +1 -0
- package/lib/Cloudflare/Vectorize/SearchIndexHttpClient.js +100 -0
- package/lib/Cloudflare/Vectorize/SearchIndexHttpClient.js.map +1 -0
- package/lib/Cloudflare/Vectorize/SearchIndexLocal.d.ts +42 -0
- package/lib/Cloudflare/Vectorize/SearchIndexLocal.d.ts.map +1 -0
- package/lib/Cloudflare/Vectorize/SearchIndexLocal.js +58 -0
- package/lib/Cloudflare/Vectorize/SearchIndexLocal.js.map +1 -0
- package/lib/Cloudflare/Vectorize/index.d.ts +1 -0
- package/lib/Cloudflare/Vectorize/index.d.ts.map +1 -1
- package/lib/Cloudflare/Vectorize/index.js +1 -0
- package/lib/Cloudflare/Vectorize/index.js.map +1 -1
- package/lib/Cloudflare/Workers/BrowserHttpClient.d.ts +32 -0
- package/lib/Cloudflare/Workers/BrowserHttpClient.d.ts.map +1 -0
- package/lib/Cloudflare/Workers/BrowserHttpClient.js +100 -0
- package/lib/Cloudflare/Workers/BrowserHttpClient.js.map +1 -0
- package/lib/Cloudflare/Workers/BrowserLocal.d.ts +37 -0
- package/lib/Cloudflare/Workers/BrowserLocal.d.ts.map +1 -0
- package/lib/Cloudflare/Workers/BrowserLocal.js +53 -0
- package/lib/Cloudflare/Workers/BrowserLocal.js.map +1 -0
- package/lib/Cloudflare/Workers/ConfigProvider.d.ts +8 -0
- package/lib/Cloudflare/Workers/ConfigProvider.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/ConfigProvider.js +10 -1
- package/lib/Cloudflare/Workers/ConfigProvider.js.map +1 -1
- package/lib/Cloudflare/Workers/DurableObject.d.ts +137 -3
- package/lib/Cloudflare/Workers/DurableObject.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/DurableObject.js +141 -6
- package/lib/Cloudflare/Workers/DurableObject.js.map +1 -1
- package/lib/Cloudflare/Workers/LocalWorkerProvider.d.ts +2 -185
- package/lib/Cloudflare/Workers/LocalWorkerProvider.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/Vite.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/Vite.js +81 -2
- package/lib/Cloudflare/Workers/Vite.js.map +1 -1
- package/lib/Cloudflare/Workers/Worker.d.ts +15 -1
- package/lib/Cloudflare/Workers/Worker.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/Worker.js.map +1 -1
- package/lib/Cloudflare/Workers/WorkerAsyncBindings.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/WorkerAsyncBindings.js +2 -1
- package/lib/Cloudflare/Workers/WorkerAsyncBindings.js.map +1 -1
- package/lib/Cloudflare/Workers/WorkerBinding.d.ts +22 -1
- package/lib/Cloudflare/Workers/WorkerBinding.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/WorkerBinding.js.map +1 -1
- package/lib/Cloudflare/Workers/WorkerBridge.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/WorkerBridge.js +7 -2
- package/lib/Cloudflare/Workers/WorkerBridge.js.map +1 -1
- package/lib/Cloudflare/Workers/WorkerProvider.d.ts +81 -0
- package/lib/Cloudflare/Workers/WorkerProvider.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/WorkerProvider.js +450 -61
- 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 +11 -37
- 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/Diff.d.ts +16 -0
- package/lib/Diff.d.ts.map +1 -1
- package/lib/Diff.js +33 -0
- package/lib/Diff.js.map +1 -1
- package/lib/GitHub/Secrets.d.ts +1 -1
- package/lib/GitHub/Secrets.js +1 -1
- package/lib/GitHub/Variables.d.ts +1 -1
- package/lib/GitHub/Variables.js +1 -1
- package/lib/Local/RpcSerialization.d.ts.map +1 -1
- package/lib/Local/RpcSerialization.js +6 -2
- package/lib/Local/RpcSerialization.js.map +1 -1
- package/lib/Local/RpcSpawner.d.ts.map +1 -1
- package/lib/Local/RpcSpawner.js +14 -8
- package/lib/Local/RpcSpawner.js.map +1 -1
- package/lib/Neon/AuthProvider.js +1 -1
- package/lib/Neon/AuthProvider.js.map +1 -1
- package/lib/Plan.d.ts.map +1 -1
- package/lib/Plan.js +11 -4
- package/lib/Plan.js.map +1 -1
- package/lib/Planetscale/Database.d.ts +2 -1
- package/lib/Planetscale/Database.d.ts.map +1 -1
- package/lib/Planetscale/MySQL/MySQLClusterSize.d.ts +41 -3
- package/lib/Planetscale/MySQL/MySQLClusterSize.d.ts.map +1 -1
- package/lib/Planetscale/MySQL/MySQLClusterSize.js +88 -11
- package/lib/Planetscale/MySQL/MySQLClusterSize.js.map +1 -1
- package/lib/Planetscale/MySQL/MySQLDatabase.d.ts +14 -0
- package/lib/Planetscale/MySQL/MySQLDatabase.d.ts.map +1 -1
- package/lib/Planetscale/MySQL/MySQLDatabase.js +24 -11
- package/lib/Planetscale/MySQL/MySQLDatabase.js.map +1 -1
- package/lib/Platform.d.ts.map +1 -1
- package/lib/Platform.js +11 -1
- package/lib/Platform.js.map +1 -1
- package/lib/Runtime.d.ts +23 -0
- package/lib/Runtime.d.ts.map +1 -1
- package/lib/Runtime.js +83 -0
- package/lib/Runtime.js.map +1 -1
- package/lib/RuntimeContext.d.ts +46 -0
- package/lib/RuntimeContext.d.ts.map +1 -1
- package/lib/RuntimeContext.js +60 -0
- package/lib/RuntimeContext.js.map +1 -1
- package/lib/Server/Process.d.ts +1 -1
- package/lib/Server/Process.d.ts.map +1 -1
- package/lib/Server/Process.js +8 -8
- package/lib/Server/Process.js.map +1 -1
- package/lib/Stack.js +1 -1
- package/lib/Stack.js.map +1 -1
- package/lib/State/HttpStateApi.d.ts +10 -10
- package/lib/Test/Alchemy.d.ts +74 -0
- package/lib/Test/Alchemy.d.ts.map +1 -0
- package/lib/Test/Alchemy.js +143 -0
- package/lib/Test/Alchemy.js.map +1 -0
- package/lib/Util/cached-function.d.ts +1 -1
- package/lib/Util/cached-function.d.ts.map +1 -1
- package/lib/Util/cached-function.js +2 -2
- package/lib/Util/cached-function.js.map +1 -1
- package/lib/Util/proxy-chain.js +3 -0
- package/lib/Util/proxy-chain.js.map +1 -1
- package/package.json +10 -10
- package/src/AWS/AuthProvider.ts +1 -1
- package/src/AWS/EC2/hosted.ts +2 -1
- package/src/AWS/ECS/Task.ts +2 -1
- package/src/AWS/Lambda/Function.ts +13 -47
- package/src/AWS/Lambda/MicrovmRuntimeContext.ts +11 -38
- package/src/Action.ts +39 -6
- package/src/ActionRuntimeContext.ts +68 -0
- package/src/Apply.ts +46 -8
- package/src/Auth/AuthProvider.ts +1 -1
- package/src/Auth/Lock.ts +5 -2
- package/src/Bundle/PurePlugin.ts +34 -1
- package/src/Bundle/Vite.ts +51 -1
- package/src/Cli/LoggingCli.ts +7 -4
- package/src/Cli/commands/_shared.ts +52 -0
- package/src/Cli/commands/login.ts +90 -14
- package/src/Cli/commands/profile.ts +7 -41
- package/src/Cloudflare/AI/LanguageModel.ts +25 -5
- package/src/Cloudflare/AI/QuerySearchLocal.ts +66 -0
- package/src/Cloudflare/AI/QuerySearchNamespaceLocal.ts +60 -0
- package/src/Cloudflare/AI/SearchHttpClient.ts +423 -0
- package/src/Cloudflare/AI/index.ts +2 -0
- package/src/Cloudflare/Auth/AuthProvider.ts +1 -1
- package/src/Cloudflare/Containers/ContainerBundle.ts +11 -1
- package/src/Cloudflare/Containers/ContainerPlatform.ts +14 -52
- package/src/Cloudflare/D1/QueryDatabaseHttpClient.ts +176 -0
- package/src/Cloudflare/D1/QueryDatabaseLocal.ts +66 -0
- package/src/Cloudflare/D1/index.ts +1 -0
- package/src/Cloudflare/DNS/DnsHttp.ts +24 -2
- package/src/Cloudflare/DNS/DnsLocal.ts +41 -0
- package/src/Cloudflare/DNS/ReadDnsHttp.ts +4 -5
- package/src/Cloudflare/DNS/ReadDnsLocal.ts +38 -0
- package/src/Cloudflare/DNS/ReadWriteDnsHttp.ts +5 -5
- package/src/Cloudflare/DNS/ReadWriteDnsLocal.ts +46 -0
- package/src/Cloudflare/DNS/WriteDnsHttp.ts +4 -5
- package/src/Cloudflare/DNS/WriteDnsLocal.ts +44 -0
- package/src/Cloudflare/DNS/index.ts +3 -0
- package/src/Cloudflare/Flagship/ReadFlagsHttpClient.ts +183 -0
- package/src/Cloudflare/Flagship/ReadFlagsLocal.ts +69 -0
- package/src/Cloudflare/Flagship/index.ts +1 -0
- package/src/Cloudflare/KV/NamespaceHttp.ts +25 -2
- package/src/Cloudflare/KV/NamespaceLocal.ts +42 -0
- package/src/Cloudflare/KV/ReadNamespaceHttp.ts +7 -6
- package/src/Cloudflare/KV/ReadNamespaceLocal.ts +35 -0
- package/src/Cloudflare/KV/ReadWriteNamespaceHttp.ts +11 -6
- package/src/Cloudflare/KV/ReadWriteNamespaceLocal.ts +42 -0
- package/src/Cloudflare/KV/WriteNamespaceHttp.ts +7 -6
- package/src/Cloudflare/KV/WriteNamespaceLocal.ts +35 -0
- package/src/Cloudflare/KV/index.ts +3 -0
- package/src/Cloudflare/Queues/QueueHttp.ts +24 -2
- package/src/Cloudflare/Queues/WriteQueueHttp.ts +16 -7
- package/src/Cloudflare/Queues/WriteQueueLocal.ts +64 -0
- package/src/Cloudflare/Queues/index.ts +1 -0
- package/src/Cloudflare/R2/BucketHttp.ts +20 -3
- package/src/Cloudflare/R2/BucketLocal.ts +47 -0
- package/src/Cloudflare/R2/ReadBucketHttp.ts +10 -5
- package/src/Cloudflare/R2/ReadBucketLocal.ts +33 -0
- package/src/Cloudflare/R2/ReadWriteBucketHttp.ts +11 -5
- package/src/Cloudflare/R2/ReadWriteBucketLocal.ts +36 -0
- package/src/Cloudflare/R2/WriteBucketHttp.ts +10 -5
- package/src/Cloudflare/R2/WriteBucketLocal.ts +33 -0
- package/src/Cloudflare/R2/index.ts +3 -0
- package/src/Cloudflare/Tunnel/ReadTunnel.ts +8 -9
- package/src/Cloudflare/Tunnel/ReadTunnelLocal.ts +33 -0
- package/src/Cloudflare/Tunnel/ReadWriteTunnel.ts +5 -5
- package/src/Cloudflare/Tunnel/ReadWriteTunnelLocal.ts +39 -0
- package/src/Cloudflare/Tunnel/TunnelBinding.ts +26 -2
- package/src/Cloudflare/Tunnel/TunnelLocalBinding.ts +38 -0
- package/src/Cloudflare/Tunnel/WarpConnector.ts +8 -5
- package/src/Cloudflare/Tunnel/WriteTunnel.ts +8 -9
- package/src/Cloudflare/Tunnel/WriteTunnelLocal.ts +33 -0
- package/src/Cloudflare/Tunnel/index.ts +3 -0
- package/src/Cloudflare/Vectorize/SearchIndexHttpClient.ts +183 -0
- package/src/Cloudflare/Vectorize/SearchIndexLocal.ts +70 -0
- package/src/Cloudflare/Vectorize/index.ts +1 -0
- package/src/Cloudflare/Workers/BrowserHttpClient.ts +201 -0
- package/src/Cloudflare/Workers/BrowserLocal.ts +65 -0
- package/src/Cloudflare/Workers/ConfigProvider.ts +15 -1
- package/src/Cloudflare/Workers/DurableObject.ts +227 -6
- package/src/Cloudflare/Workers/Vite.ts +93 -11
- package/src/Cloudflare/Workers/Worker.ts +19 -1
- package/src/Cloudflare/Workers/WorkerAsyncBindings.ts +6 -5
- package/src/Cloudflare/Workers/WorkerBinding.ts +20 -1
- package/src/Cloudflare/Workers/WorkerBridge.ts +12 -2
- package/src/Cloudflare/Workers/WorkerProvider.ts +664 -117
- package/src/Cloudflare/Workers/WorkerRuntimeContext.ts +14 -45
- package/src/Cloudflare/Workers/index.ts +1 -0
- package/src/Diff.ts +33 -0
- package/src/GitHub/Secrets.ts +1 -1
- package/src/GitHub/Variables.ts +1 -1
- package/src/Local/RpcSerialization.ts +6 -2
- package/src/Local/RpcSpawner.ts +21 -8
- package/src/Neon/AuthProvider.ts +1 -1
- package/src/Plan.ts +17 -4
- package/src/Planetscale/Database.ts +2 -1
- package/src/Planetscale/MySQL/MySQLClusterSize.ts +120 -21
- package/src/Planetscale/MySQL/MySQLDatabase.ts +84 -44
- package/src/Platform.ts +12 -3
- package/src/Runtime.ts +92 -0
- package/src/RuntimeContext.ts +79 -0
- package/src/Server/Process.ts +11 -18
- package/src/Stack.ts +1 -1
- package/src/Test/Alchemy.ts +282 -0
- package/src/Util/cached-function.ts +5 -5
- package/src/Util/proxy-chain.ts +3 -0
|
@@ -18,6 +18,7 @@ import {
|
|
|
18
18
|
} from "../Util.ts";
|
|
19
19
|
import {
|
|
20
20
|
ensureMySQLProductionBranchClusterSize,
|
|
21
|
+
observeDefaultKeyspaceReplicas,
|
|
21
22
|
type MySQLClusterSize,
|
|
22
23
|
} from "./MySQLClusterSize.ts";
|
|
23
24
|
import { runMySQLImports, runMySQLMigrations } from "./MySQLMigrations.ts";
|
|
@@ -32,6 +33,16 @@ export interface MySQLDatabaseProps extends BaseDatabaseProps {
|
|
|
32
33
|
*/
|
|
33
34
|
clusterSize: MySQLClusterSize;
|
|
34
35
|
|
|
36
|
+
/**
|
|
37
|
+
* Desired total number of replicas for the database's default keyspace.
|
|
38
|
+
* Each cluster size includes a fixed number of replicas (2 for
|
|
39
|
+
* production `PS_*` sizes); higher values add extra replicas. Changes
|
|
40
|
+
* are reconciled in place via PlanetScale's keyspace resize lifecycle —
|
|
41
|
+
* never by replacing the database.
|
|
42
|
+
* @see https://planetscale.com/docs/vitess/sharding/keyspaces
|
|
43
|
+
*/
|
|
44
|
+
replicas?: number;
|
|
45
|
+
|
|
35
46
|
/**
|
|
36
47
|
* Whether to copy migration data to new branches and in deploy requests.
|
|
37
48
|
*/
|
|
@@ -67,6 +78,12 @@ export interface MySQLDatabaseProps extends BaseDatabaseProps {
|
|
|
67
78
|
* Output attributes of a deployed MySQL PlanetScale database.
|
|
68
79
|
*/
|
|
69
80
|
export interface MySQLDatabaseAttributes extends BaseDatabaseAttributes {
|
|
81
|
+
/**
|
|
82
|
+
* Observed total replica count of the default keyspace on the default
|
|
83
|
+
* branch, or `undefined` while the keyspace is still provisioning.
|
|
84
|
+
*/
|
|
85
|
+
replicas: number | undefined;
|
|
86
|
+
|
|
70
87
|
/**
|
|
71
88
|
* Whether to copy migration data to new branches and in deploy requests.
|
|
72
89
|
*/
|
|
@@ -168,8 +185,14 @@ export const MySQLDatabaseProvider = () =>
|
|
|
168
185
|
) {
|
|
169
186
|
return { action: "replace" } as const;
|
|
170
187
|
}
|
|
171
|
-
|
|
172
|
-
|
|
188
|
+
// Replicas reconcile in place via a keyspace resize — never a
|
|
189
|
+
// replacement. Diff against the observed keyspace replica count so
|
|
190
|
+
// an adopted database whose live state already matches plans no-op.
|
|
191
|
+
if (
|
|
192
|
+
news.replicas !== undefined &&
|
|
193
|
+
news.replicas !== (output?.replicas ?? olds.replicas)
|
|
194
|
+
) {
|
|
195
|
+
return { action: "update" } as const;
|
|
173
196
|
}
|
|
174
197
|
if (news.migrationsDir) {
|
|
175
198
|
const newHashes = yield* hashMigrations(news.migrationsDir);
|
|
@@ -203,46 +226,57 @@ export const MySQLDatabaseProvider = () =>
|
|
|
203
226
|
database: databaseName,
|
|
204
227
|
})
|
|
205
228
|
.pipe(
|
|
206
|
-
Effect.flatMap(
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
229
|
+
Effect.flatMap(
|
|
230
|
+
Effect.fn(function* (data) {
|
|
231
|
+
if (data.kind !== "mysql") {
|
|
232
|
+
return yield* Effect.fail(
|
|
233
|
+
new PlanetscaleConflict({
|
|
234
|
+
message:
|
|
235
|
+
`Planetscale database "${data.name}" has kind "${data.kind}" but this resource ` +
|
|
236
|
+
`is a MySQLDatabase. Use Planetscale.${data.kind === "postgresql" ? "PostgresDatabase" : data.kind}() instead, ` +
|
|
237
|
+
`or delete the existing database and retry.`,
|
|
238
|
+
}),
|
|
239
|
+
);
|
|
240
|
+
}
|
|
241
|
+
// Observe the default keyspace's live replica configuration
|
|
242
|
+
// so adopted databases diff against reality.
|
|
243
|
+
const replicas = yield* observeDefaultKeyspaceReplicas(
|
|
244
|
+
organization,
|
|
245
|
+
data.name,
|
|
246
|
+
data.default_branch ?? "main",
|
|
215
247
|
);
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
248
|
+
return {
|
|
249
|
+
id: data.id,
|
|
250
|
+
name: data.name,
|
|
251
|
+
organization,
|
|
252
|
+
state: data.state,
|
|
253
|
+
defaultBranch: data.default_branch ?? "main",
|
|
254
|
+
replicas,
|
|
255
|
+
plan: data.plan ?? "hobby",
|
|
256
|
+
createdAt: data.created_at,
|
|
257
|
+
updatedAt: data.updated_at,
|
|
258
|
+
htmlUrl: data.html_url,
|
|
259
|
+
region: { slug: data.region.slug },
|
|
260
|
+
migrationsDir: output?.migrationsDir ?? olds?.migrationsDir,
|
|
261
|
+
migrationsTable:
|
|
262
|
+
output?.migrationsTable ?? olds?.migrationsTable,
|
|
263
|
+
migrationsHashes: output?.migrationsHashes ?? {},
|
|
264
|
+
importHashes: output?.importHashes ?? {},
|
|
265
|
+
clusterSize: output?.clusterSize ?? "",
|
|
266
|
+
requireApprovalForDeploy:
|
|
267
|
+
data.require_approval_for_deploy ?? false,
|
|
268
|
+
restrictBranchRegion: data.restrict_branch_region ?? false,
|
|
269
|
+
insightsRawQueries: data.insights_raw_queries ?? false,
|
|
270
|
+
productionBranchWebConsole:
|
|
271
|
+
data.production_branch_web_console ?? false,
|
|
272
|
+
automaticMigrations: data.automatic_migrations ?? false,
|
|
273
|
+
migrationFramework: data.migration_framework ?? undefined,
|
|
274
|
+
migrationTableName: data.migration_table_name ?? undefined,
|
|
275
|
+
allowDataBranching: data.allow_data_branching ?? false,
|
|
276
|
+
allowForeignKeyConstraints: data.foreign_keys_enabled ?? false,
|
|
277
|
+
};
|
|
278
|
+
}),
|
|
279
|
+
),
|
|
246
280
|
Effect.catchTag("NotFound", () => Effect.succeed(undefined)),
|
|
247
281
|
);
|
|
248
282
|
}),
|
|
@@ -272,13 +306,14 @@ export const MySQLDatabaseProvider = () =>
|
|
|
272
306
|
// Ensure — if missing, create.
|
|
273
307
|
if (!observed) {
|
|
274
308
|
yield* session.note("Creating database...");
|
|
309
|
+
// Note: the API rejects the `replicas` param for mysql databases;
|
|
310
|
+
// replicas are converged below via the keyspace resize lifecycle.
|
|
275
311
|
observed = yield* planetscale.createDatabase({
|
|
276
312
|
organization,
|
|
277
313
|
name: newName,
|
|
278
314
|
region: news.region?.slug,
|
|
279
315
|
kind: "mysql",
|
|
280
316
|
cluster_size: clusterSize,
|
|
281
|
-
replicas: news.replicas,
|
|
282
317
|
});
|
|
283
318
|
}
|
|
284
319
|
|
|
@@ -345,13 +380,16 @@ export const MySQLDatabaseProvider = () =>
|
|
|
345
380
|
default_branch: news.defaultBranch,
|
|
346
381
|
});
|
|
347
382
|
|
|
348
|
-
// Sync cluster size on the active default branch
|
|
383
|
+
// Sync cluster size and replicas on the active default branch —
|
|
384
|
+
// both converge in place via PlanetScale's keyspace resize
|
|
385
|
+
// lifecycle, diffed against the observed default keyspace.
|
|
349
386
|
const branch = news.defaultBranch ?? updated.default_branch ?? "main";
|
|
350
|
-
yield* ensureMySQLProductionBranchClusterSize(
|
|
387
|
+
const keyspace = yield* ensureMySQLProductionBranchClusterSize(
|
|
351
388
|
organization,
|
|
352
389
|
updated.name,
|
|
353
390
|
branch,
|
|
354
391
|
news.clusterSize,
|
|
392
|
+
news.replicas,
|
|
355
393
|
);
|
|
356
394
|
|
|
357
395
|
const migrationTarget = {
|
|
@@ -394,6 +432,7 @@ export const MySQLDatabaseProvider = () =>
|
|
|
394
432
|
htmlUrl: updated.html_url,
|
|
395
433
|
region: { slug: updated.region.slug },
|
|
396
434
|
clusterSize,
|
|
435
|
+
replicas: keyspace.replicas,
|
|
397
436
|
migrationsDir: news.migrationsDir,
|
|
398
437
|
migrationsTable: news.migrationsDir ? migrationsTable : undefined,
|
|
399
438
|
migrationsHashes,
|
|
@@ -445,6 +484,7 @@ export const MySQLDatabaseProvider = () =>
|
|
|
445
484
|
migrationsHashes: {},
|
|
446
485
|
importHashes: {},
|
|
447
486
|
clusterSize: "",
|
|
487
|
+
replicas: undefined,
|
|
448
488
|
requireApprovalForDeploy:
|
|
449
489
|
data.require_approval_for_deploy ?? false,
|
|
450
490
|
restrictBranchRegion: data.restrict_branch_region ?? false,
|
package/src/Platform.ts
CHANGED
|
@@ -385,15 +385,24 @@ export const Platform = <
|
|
|
385
385
|
// e.g.
|
|
386
386
|
// export default Cloudflare.Worker("id", { main: "./src/worker.ts" }, Effect.gen(function* () { .. })
|
|
387
387
|
const cls = makeClass(id);
|
|
388
|
-
return
|
|
389
|
-
provideClassLayer(cls.make(props, impl)),
|
|
390
|
-
|
|
388
|
+
return Object.assign(
|
|
389
|
+
cls.Self.pipe(provideClassLayer(cls.make(props, impl)), effectClass),
|
|
390
|
+
// Expose the logical id statically (mirrors `makeClass`) so a class
|
|
391
|
+
// reference identifies its resource without being yielded.
|
|
392
|
+
{ LogicalId: id },
|
|
391
393
|
);
|
|
392
394
|
}
|
|
393
395
|
};
|
|
394
396
|
|
|
395
397
|
const makeClass = (id: string) => {
|
|
396
398
|
class Platform {
|
|
399
|
+
/**
|
|
400
|
+
* Logical id of the resource this class declares. Statically readable
|
|
401
|
+
* — e.g. `DurableObjectProps.transferredFrom` accepts a Worker class
|
|
402
|
+
* and takes its identity from here without yielding it (yielding
|
|
403
|
+
* would add a dependency edge on the referenced resource).
|
|
404
|
+
*/
|
|
405
|
+
static readonly LogicalId = id;
|
|
397
406
|
static readonly Self = Self(`${type}<${id}>`);
|
|
398
407
|
static readonly Platform = Context.Service<Platform, Platform>(
|
|
399
408
|
`Platform<${type}<${id}>>`,
|
package/src/Runtime.ts
CHANGED
|
@@ -6,7 +6,10 @@
|
|
|
6
6
|
* surface tiny and dependency-light.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
+
import * as ConfigProvider from "effect/ConfigProvider";
|
|
10
|
+
import * as Effect from "effect/Effect";
|
|
9
11
|
import * as Layer from "effect/Layer";
|
|
12
|
+
import { isRedactedMarker, sanitizeKey } from "./RuntimeContext.ts";
|
|
10
13
|
import { asEffect } from "./Util/types.ts";
|
|
11
14
|
|
|
12
15
|
/**
|
|
@@ -32,3 +35,92 @@ export const makeEntrypointLayer = (
|
|
|
32
35
|
}
|
|
33
36
|
return Layer.effect(tag, asEffect(entrypoint));
|
|
34
37
|
};
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Unwrap the `{"_tag":"Redacted","value":...}` marker that the deploy-time
|
|
41
|
+
* `Config` interceptor (see `Platform.ts`) and `RuntimeContext.set` use to
|
|
42
|
+
* preserve `Redacted`-ness across the env-var boundary. Returns the inner
|
|
43
|
+
* source value as a string, or `undefined` when `raw` is not a marker.
|
|
44
|
+
*/
|
|
45
|
+
const parseRedactedMarker = (raw: string): string | undefined => {
|
|
46
|
+
if (!raw.startsWith("{")) {
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
const parsed: unknown = JSON.parse(raw);
|
|
51
|
+
if (isRedactedMarker(parsed)) {
|
|
52
|
+
return typeof parsed.value === "string"
|
|
53
|
+
? parsed.value
|
|
54
|
+
: JSON.stringify(parsed.value);
|
|
55
|
+
}
|
|
56
|
+
} catch {
|
|
57
|
+
// not JSON — plain env value, fall through
|
|
58
|
+
}
|
|
59
|
+
return undefined;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Reify an env-var string the way `RuntimeContext.get` does: unwrap the
|
|
64
|
+
* `Redacted` marker, unquote a JSON-stringified string, and pass anything
|
|
65
|
+
* else through verbatim.
|
|
66
|
+
*/
|
|
67
|
+
const reifyEnvString = (raw: string): string => {
|
|
68
|
+
const marker = parseRedactedMarker(raw);
|
|
69
|
+
if (marker !== undefined) {
|
|
70
|
+
return marker;
|
|
71
|
+
}
|
|
72
|
+
if (raw.startsWith('"')) {
|
|
73
|
+
try {
|
|
74
|
+
const parsed: unknown = JSON.parse(raw);
|
|
75
|
+
if (typeof parsed === "string") {
|
|
76
|
+
return parsed;
|
|
77
|
+
}
|
|
78
|
+
} catch {
|
|
79
|
+
// not JSON — plain env value, fall through
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return raw;
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Wrap a runtime's env-backed `ConfigProvider` so values that were
|
|
87
|
+
* auto-bound by the deploy-time `Config` interceptor decode transparently.
|
|
88
|
+
*
|
|
89
|
+
* The engine can't know which config values are sensitive, so the
|
|
90
|
+
* interceptor binds every `Config` read during Init onto the deploy target
|
|
91
|
+
* as a secret, serialized as a `{"_tag":"Redacted","value":<source>}`
|
|
92
|
+
* marker. The interceptor's runtime branch reifies those markers for reads
|
|
93
|
+
* during Init, but effects that run later (request handlers, nested
|
|
94
|
+
* layers) resolve `Config` against the raw env-backed provider — without
|
|
95
|
+
* this wrapper, `Config.number("PORT")` inside a handler sees the marker
|
|
96
|
+
* JSON instead of the source value and fails with a schema error.
|
|
97
|
+
*
|
|
98
|
+
* Two behaviors:
|
|
99
|
+
* - Leaf values that carry the marker are unwrapped to the raw source
|
|
100
|
+
* string before `Config` schemas decode them; everything else passes
|
|
101
|
+
* through untouched.
|
|
102
|
+
* - On a miss, falls back to the flat `sanitizeKey`-canonicalized key
|
|
103
|
+
* (`my.key` → `my_key`) that the interceptor bound the value under, so
|
|
104
|
+
* config names with non-alphanumeric characters resolve at runtime too.
|
|
105
|
+
*/
|
|
106
|
+
export const reifyBoundConfigProvider = (
|
|
107
|
+
base: ConfigProvider.ConfigProvider,
|
|
108
|
+
env: Record<string, unknown>,
|
|
109
|
+
): ConfigProvider.ConfigProvider =>
|
|
110
|
+
ConfigProvider.make((path) =>
|
|
111
|
+
base.load(path).pipe(
|
|
112
|
+
Effect.map((node) => {
|
|
113
|
+
if (node?._tag === "Value") {
|
|
114
|
+
const value = parseRedactedMarker(node.value);
|
|
115
|
+
return value === undefined ? node : ConfigProvider.makeValue(value);
|
|
116
|
+
}
|
|
117
|
+
if (node === undefined) {
|
|
118
|
+
const raw = env[sanitizeKey(path.map((p) => p.toString()).join("_"))];
|
|
119
|
+
if (typeof raw === "string") {
|
|
120
|
+
return ConfigProvider.makeValue(reifyEnvString(raw));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return node;
|
|
124
|
+
}),
|
|
125
|
+
),
|
|
126
|
+
);
|
package/src/RuntimeContext.ts
CHANGED
|
@@ -2,6 +2,7 @@ import * as Context from "effect/Context";
|
|
|
2
2
|
import * as Effect from "effect/Effect";
|
|
3
3
|
import * as Layer from "effect/Layer";
|
|
4
4
|
import * as Option from "effect/Option";
|
|
5
|
+
import * as Redacted from "effect/Redacted";
|
|
5
6
|
import type { HttpEffect } from "./Http.ts";
|
|
6
7
|
import type { Output } from "./Output.ts";
|
|
7
8
|
|
|
@@ -43,6 +44,84 @@ export interface BaseRuntimeContext {
|
|
|
43
44
|
export const sanitizeKey = (key: string): string =>
|
|
44
45
|
key.replaceAll(/[^a-zA-Z0-9]/g, "_");
|
|
45
46
|
|
|
47
|
+
/**
|
|
48
|
+
* The wire format `RuntimeContext.set`/`get` use to carry a `Redacted` value
|
|
49
|
+
* through an environment variable. `JSON.stringify(Redacted)` emits the
|
|
50
|
+
* literal string `"<redacted>"` and loses the value, so secrets are
|
|
51
|
+
* serialized as this marker and the runtime `get` path rebuilds the wrapper.
|
|
52
|
+
*/
|
|
53
|
+
export interface RedactedMarker {
|
|
54
|
+
readonly _tag: "Redacted";
|
|
55
|
+
readonly value: unknown;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Detect the (already JSON-parsed) {@link RedactedMarker} shape. After
|
|
60
|
+
* `JSON.parse` the marker is a plain object — `Redacted.isRedacted` is
|
|
61
|
+
* always `false` on it — so detection is structural.
|
|
62
|
+
*/
|
|
63
|
+
export const isRedactedMarker = (value: unknown): value is RedactedMarker =>
|
|
64
|
+
typeof value === "object" &&
|
|
65
|
+
value !== null &&
|
|
66
|
+
(value as { _tag?: unknown })._tag === "Redacted" &&
|
|
67
|
+
"value" in value;
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Serialize a binding value for an env var: `Redacted` values are packed as
|
|
71
|
+
* a {@link RedactedMarker}, everything else is plain `JSON.stringify`.
|
|
72
|
+
*/
|
|
73
|
+
export const packEnvValue = (value: unknown): string =>
|
|
74
|
+
Redacted.isRedacted(value)
|
|
75
|
+
? JSON.stringify({
|
|
76
|
+
_tag: "Redacted",
|
|
77
|
+
value: Redacted.value(value),
|
|
78
|
+
} satisfies RedactedMarker)
|
|
79
|
+
: JSON.stringify(value);
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Like {@link packEnvValue}, but a `Redacted` input keeps its `Redacted`
|
|
83
|
+
* wrapper on the *outside* of the packed string, so deploy-time code can
|
|
84
|
+
* route secrets through a dedicated channel (Cloudflare `secret_text`,
|
|
85
|
+
* Secrets Store) instead of leaking them as plain env vars. The inner
|
|
86
|
+
* payload still carries the marker for the runtime `get` accessor.
|
|
87
|
+
*/
|
|
88
|
+
export const packEnvValueKeepRedacted = (
|
|
89
|
+
value: unknown,
|
|
90
|
+
): string | Redacted.Redacted<string> =>
|
|
91
|
+
Redacted.isRedacted(value)
|
|
92
|
+
? Redacted.make(packEnvValue(value))
|
|
93
|
+
: packEnvValue(value);
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Parse an env-var string produced by {@link packEnvValue} back into its
|
|
97
|
+
* value: rebuild `Redacted` from the marker, return other JSON values
|
|
98
|
+
* as-is, and fall back to the raw string for non-JSON input (e.g. an env
|
|
99
|
+
* var the user set directly). `undefined` passes through.
|
|
100
|
+
*
|
|
101
|
+
* Runtime `get` accessors MUST feed this from the raw environment
|
|
102
|
+
* (`process.env[key]` / the platform env object) — never through
|
|
103
|
+
* `Config.string`: the ambient runtime `ConfigProvider` reifies bound
|
|
104
|
+
* values (unwrapping the marker before it could be detected here), and
|
|
105
|
+
* during init the ambient provider is the interceptor installed in
|
|
106
|
+
* `Platform.ts`, whose runtime branch calls back into `ctx.get(key)` —
|
|
107
|
+
* resolving through `Config` would re-enter it for the same key and
|
|
108
|
+
* recurse forever.
|
|
109
|
+
*/
|
|
110
|
+
export const unpackEnvValue = <T>(raw: string | undefined): T | undefined => {
|
|
111
|
+
if (raw === undefined) {
|
|
112
|
+
return undefined;
|
|
113
|
+
}
|
|
114
|
+
try {
|
|
115
|
+
const parsed: unknown = JSON.parse(raw);
|
|
116
|
+
if (isRedactedMarker(parsed)) {
|
|
117
|
+
return Redacted.make(parsed.value) as unknown as T;
|
|
118
|
+
}
|
|
119
|
+
return parsed as T;
|
|
120
|
+
} catch {
|
|
121
|
+
return raw as unknown as T; // assume it's just a string
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
|
|
46
125
|
/**
|
|
47
126
|
* Context of the runtime environment.
|
|
48
127
|
*
|
package/src/Server/Process.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import * as Config from "effect/Config";
|
|
2
1
|
import * as Context from "effect/Context";
|
|
3
2
|
import * as Effect from "effect/Effect";
|
|
4
3
|
import { FileSystem } from "effect/FileSystem";
|
|
@@ -9,7 +8,11 @@ import type { ChildProcessSpawner } from "effect/unstable/process/ChildProcessSp
|
|
|
9
8
|
import type { HttpEffect } from "../Http.ts";
|
|
10
9
|
import * as Http from "../Http.ts";
|
|
11
10
|
import * as Output from "../Output.ts";
|
|
12
|
-
import
|
|
11
|
+
import {
|
|
12
|
+
packEnvValue,
|
|
13
|
+
unpackEnvValue,
|
|
14
|
+
type BaseRuntimeContext,
|
|
15
|
+
} from "../RuntimeContext.ts";
|
|
13
16
|
|
|
14
17
|
export type ProcessServices =
|
|
15
18
|
| ChildProcessSpawner
|
|
@@ -74,25 +77,15 @@ export const createHostRuntimeContext =
|
|
|
74
77
|
set: (bindingId: string, output: Output.Output) =>
|
|
75
78
|
Effect.sync(() => {
|
|
76
79
|
const key = bindingId.replaceAll(/[^a-zA-Z0-9]/g, "_");
|
|
77
|
-
|
|
80
|
+
// `packEnvValue` marker-packs Redacted values so they survive the
|
|
81
|
+
// Output → env round-trip.
|
|
82
|
+
env[key] = output.pipe(Output.map(packEnvValue));
|
|
78
83
|
return key;
|
|
79
84
|
}),
|
|
80
85
|
get: <T>(key: string) =>
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
try: () => JSON.parse(value) as T,
|
|
85
|
-
catch: (error) => error as Error,
|
|
86
|
-
}),
|
|
87
|
-
),
|
|
88
|
-
Effect.catch((cause) =>
|
|
89
|
-
Effect.die(
|
|
90
|
-
new Error(`Failed to get environment variable: ${key}`, {
|
|
91
|
-
cause,
|
|
92
|
-
}),
|
|
93
|
-
),
|
|
94
|
-
),
|
|
95
|
-
),
|
|
86
|
+
// Read straight from `process.env` — see `unpackEnvValue` for why
|
|
87
|
+
// this must never resolve through `Config.string`.
|
|
88
|
+
Effect.sync(() => unpackEnvValue<T>(process.env[key]) as T),
|
|
96
89
|
run: (effect: Effect.Effect<void, never, any>) =>
|
|
97
90
|
Effect.sync(() => {
|
|
98
91
|
runners.push(effect);
|
package/src/Stack.ts
CHANGED
|
@@ -238,7 +238,7 @@ export const make =
|
|
|
238
238
|
` providers: Cloudflare.providers(),\n` +
|
|
239
239
|
` state: Cloudflare.state(), // <-- required\n` +
|
|
240
240
|
` }, ...)\n` +
|
|
241
|
-
`See https://
|
|
241
|
+
`See https://alchemy.run/state-store for available state stores.`,
|
|
242
242
|
),
|
|
243
243
|
);
|
|
244
244
|
}
|