diff --git a/packages/transformers/js/core/src/collect.rs b/packages/transformers/js/core/src/collect.rs index 778bf98c735..c329d097322 100644 --- a/packages/transformers/js/core/src/collect.rs +++ b/packages/transformers/js/core/src/collect.rs @@ -683,30 +683,38 @@ impl Visit for Collect { match &*node.obj { Expr::Member(member) => { if match_member_expr(member, vec!["module", "exports"], self.unresolved_mark) { + // module.exports[...] handle_export!(); + node.prop.visit_with(self); return; - } else { - member.visit_with(self); } } Expr::Ident(ident) => { - if &*ident.sym == "exports" && is_unresolved(&ident, self.unresolved_mark) { + if &*ident.sym == "exports" && is_unresolved(ident, self.unresolved_mark) { + // exports[...] handle_export!(); - } else if ident.sym == js_word!("module") && is_unresolved(&ident, self.unresolved_mark) { + node.prop.visit_with(self); + return; + } else if ident.sym == js_word!("module") && is_unresolved(ident, self.unresolved_mark) { + // module[...] self.has_cjs_exports = true; self.static_cjs_exports = false; self.should_wrap = true; self.add_bailout(node.span, BailoutReason::FreeModule); + node.prop.visit_with(self); + return; } else if match_property_name(node).is_none() { + // something[some_var] self .non_static_access .entry(id!(ident)) .or_default() .push(node.span); } else if self.imports.contains_key(&id!(ident)) { + // anImport[...] self.used_imports.insert(id!(ident)); } - return; + // continue to visit children... } Expr::This(_this) => { if self.in_module_this { @@ -718,6 +726,7 @@ impl Visit for Collect { self.this_exprs.insert(id!(prop), (prop.clone(), node.span)); } } + node.prop.visit_with(self); return; } _ => {} @@ -799,7 +808,8 @@ impl Visit for Collect { // This visitor helps us identify used imports in cases like: // // import { foo } from "bar"; - // const baz = { foo }; + // { foo } + // something[foo] if self.imports.contains_key(&id!(node)) { self.used_imports.insert(id!(node)); } diff --git a/packages/transformers/js/core/src/hoist.rs b/packages/transformers/js/core/src/hoist.rs index 070cdc01cc3..51e739d0851 100644 --- a/packages/transformers/js/core/src/hoist.rs +++ b/packages/transformers/js/core/src/hoist.rs @@ -1349,7 +1349,7 @@ mod tests { let (collect, _code, _hoist) = parse( r#" - import { a, b, c, d, e } from "other"; + import { a, b, c, d, e, f } from "other"; import * as x from "other"; import * as y from "other"; @@ -1359,11 +1359,12 @@ mod tests { log(x); y.foo(); e.foo.bar(); + global[f] = 1; "#, ); assert_eq_set!( collect.used_imports, - set! { w!("a"), w!("b"), w!("c"), w!("e"), w!("x"), w!("y") } + set! { w!("a"), w!("b"), w!("c"), w!("e"), w!("f"), w!("x"), w!("y") } ); assert_eq_imports!( collect.imports, @@ -1373,6 +1374,7 @@ mod tests { w!("c") => (w!("other"), w!("c"), false), w!("d") => (w!("other"), w!("d"), false), w!("e") => (w!("other"), w!("e"), false), + w!("f") => (w!("other"), w!("f"), false), w!("x") => (w!("other"), w!("*"), false), w!("y") => (w!("other"), w!("*"), false) }