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;
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}