turbopack_ecmascript/references/
constant_condition.rs

1use anyhow::Result;
2use serde::{Deserialize, Serialize};
3use swc_core::quote;
4use turbo_tasks::{NonLocalValue, Vc, debug::ValueDebugFormat, trace::TraceRawVcs};
5use turbopack_core::chunk::ChunkingContext;
6
7use super::AstPath;
8use crate::{
9    code_gen::{CodeGen, CodeGeneration},
10    create_visitor,
11};
12
13#[derive(
14    Copy, Clone, Hash, PartialEq, Eq, Debug, Serialize, Deserialize, TraceRawVcs, NonLocalValue,
15)]
16pub enum ConstantConditionValue {
17    Truthy,
18    Falsy,
19    Nullish,
20}
21
22#[derive(PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, ValueDebugFormat, NonLocalValue)]
23pub struct ConstantConditionCodeGen {
24    value: ConstantConditionValue,
25    path: AstPath,
26}
27
28impl ConstantConditionCodeGen {
29    pub fn new(value: ConstantConditionValue, path: AstPath) -> Self {
30        ConstantConditionCodeGen { value, path }
31    }
32
33    pub async fn code_generation(
34        &self,
35        _chunking_context: Vc<Box<dyn ChunkingContext>>,
36    ) -> Result<CodeGeneration> {
37        let value = self.value;
38        let visitors = [create_visitor!(
39            exact,
40            self.path,
41            visit_mut_expr,
42            |expr: &mut Expr| {
43                *expr = match value {
44                    ConstantConditionValue::Truthy => {
45                        quote!("(\"TURBOPACK compile-time truthy\", 1)" as Expr)
46                    }
47                    ConstantConditionValue::Falsy => {
48                        quote!("(\"TURBOPACK compile-time falsy\", 0)" as Expr)
49                    }
50                    ConstantConditionValue::Nullish => {
51                        quote!("(\"TURBOPACK compile-time nullish\", null)" as Expr)
52                    }
53                };
54            }
55        )]
56        .into();
57
58        Ok(CodeGeneration::visitors(visitors))
59    }
60}
61
62impl From<ConstantConditionCodeGen> for CodeGen {
63    fn from(val: ConstantConditionCodeGen) -> Self {
64        CodeGen::ConstantConditionCodeGen(val)
65    }
66}