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