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, module_graph::ModuleGraph};
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        _module_graph: Vc<ModuleGraph>,
36        _chunking_context: Vc<Box<dyn ChunkingContext>>,
37    ) -> Result<CodeGeneration> {
38        let value = self.value;
39        let visitors = [
40            create_visitor!(exact self.path, visit_mut_expr(expr: &mut Expr) {
41                *expr = match value {
42                    ConstantConditionValue::Truthy => quote!("(\"TURBOPACK compile-time truthy\", 1)" as Expr),
43                    ConstantConditionValue::Falsy => quote!("(\"TURBOPACK compile-time falsy\", 0)" as Expr),
44                    ConstantConditionValue::Nullish => quote!("(\"TURBOPACK compile-time nullish\", null)" as Expr),
45                };
46            }),
47        ]
48        .into();
49
50        Ok(CodeGeneration::visitors(visitors))
51    }
52}
53
54impl From<ConstantConditionCodeGen> for CodeGen {
55    fn from(val: ConstantConditionCodeGen) -> Self {
56        CodeGen::ConstantConditionCodeGen(val)
57    }
58}