turbopack_ecmascript/references/
member.rs

1use anyhow::Result;
2use serde::{Deserialize, Serialize};
3use swc_core::{
4    common::DUMMY_SP,
5    ecma::ast::{Expr, MemberExpr, MemberProp},
6    quote,
7};
8use turbo_rcstr::RcStr;
9use turbo_tasks::{NonLocalValue, Vc, debug::ValueDebugFormat, trace::TraceRawVcs};
10use turbopack_core::chunk::ChunkingContext;
11
12use super::AstPath;
13use crate::{
14    code_gen::{CodeGen, CodeGeneration},
15    create_visitor,
16};
17
18#[derive(PartialEq, Eq, Serialize, Deserialize, TraceRawVcs, ValueDebugFormat, NonLocalValue)]
19pub struct MemberReplacement {
20    key: RcStr,
21    value: RcStr,
22    path: AstPath,
23}
24
25impl MemberReplacement {
26    pub fn new(key: RcStr, value: RcStr, path: AstPath) -> Self {
27        MemberReplacement { key, value, path }
28    }
29
30    pub async fn code_generation(
31        &self,
32        _chunking_context: Vc<Box<dyn ChunkingContext>>,
33    ) -> Result<CodeGeneration> {
34        let key = self.key.clone();
35        let value = self.value.clone();
36
37        let visitor = create_visitor!(self.path, visit_mut_expr, |expr: &mut Expr| {
38            let member = Expr::Member(MemberExpr {
39                span: DUMMY_SP,
40                obj: Box::new(Expr::Ident((&*key).into())),
41                prop: MemberProp::Ident((&*value).into()),
42            });
43            *expr = quote!("(\"TURBOPACK member replacement\", $e)" as Expr, e: Expr = member);
44        });
45
46        Ok(CodeGeneration::visitors(vec![visitor]))
47    }
48}
49
50impl From<MemberReplacement> for CodeGen {
51    fn from(val: MemberReplacement) -> Self {
52        CodeGen::MemberReplacement(val)
53    }
54}