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