turbopack_env/
embeddable.rs

1use anyhow::Result;
2use turbo_rcstr::RcStr;
3use turbo_tasks::{ResolvedVc, Vc};
4use turbo_tasks_env::{EnvMap, ProcessEnv};
5use turbopack_ecmascript::utils::StringifyJs;
6
7/// Encodes values as JS strings so that they can be safely injected into a JS
8/// output.
9#[turbo_tasks::value]
10pub struct EmbeddableProcessEnv {
11    prior: ResolvedVc<Box<dyn ProcessEnv>>,
12}
13
14#[turbo_tasks::value_impl]
15impl EmbeddableProcessEnv {
16    #[turbo_tasks::function]
17    pub fn new(prior: ResolvedVc<Box<dyn ProcessEnv>>) -> Result<Vc<Self>> {
18        Ok(EmbeddableProcessEnv { prior }.cell())
19    }
20}
21
22#[turbo_tasks::value_impl]
23impl ProcessEnv for EmbeddableProcessEnv {
24    #[turbo_tasks::function]
25    async fn read_all(&self) -> Result<Vc<EnvMap>> {
26        let prior = self.prior.read_all().await?;
27
28        let encoded = prior
29            .iter()
30            .map(|(k, v)| (k.clone(), StringifyJs(v).to_string().into()))
31            .collect();
32
33        Ok(Vc::cell(encoded))
34    }
35
36    #[turbo_tasks::function]
37    async fn read(&self, name: RcStr) -> Result<Vc<Option<RcStr>>> {
38        let prior = self.prior.read(name).await?;
39        let encoded = prior
40            .as_deref()
41            .map(|s| StringifyJs(s).to_string())
42            .map(RcStr::from);
43        Ok(Vc::cell(encoded))
44    }
45}