turbopack_ecmascript/references/
constant_condition.rs1use 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}