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, module_graph::ModuleGraph};
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        _module_graph: Vc<ModuleGraph>,
33        _chunking_context: Vc<Box<dyn ChunkingContext>>,
34    ) -> Result<CodeGeneration> {
35        let key = self.key.clone();
36        let value = self.value.clone();
37
38        let visitor = create_visitor!(self.path, visit_mut_expr(expr: &mut Expr) {
39            let member = Expr::Member(MemberExpr {
40                span: DUMMY_SP,
41                obj: Box::new(Expr::Ident((&*key).into())),
42                prop: MemberProp::Ident((&*value).into()),
43            });
44            *expr = quote!("(\"TURBOPACK member replacement\", $e)" as Expr, e: Expr = member);
45        });
46
47        Ok(CodeGeneration::visitors(vec![visitor]))
48    }
49}
50
51impl From<MemberReplacement> for CodeGen {
52    fn from(val: MemberReplacement) -> Self {
53        CodeGen::MemberReplacement(val)
54    }
55}