@@ -184,8 +184,10 @@ impl Visit for CjsVisitor {
184184 self . visit_object_define ( call_expr)
185185 } else if is_export_callee ( & call_expr. callee ) {
186186 // __export, __exportStar, tslib.__export, etc...
187- if let Some ( name) = get_export_require_arg ( call_expr) {
188- self . add_reexport ( name) ;
187+ if let Some ( name) =
188+ get_export_require_arg ( call_expr, & self . var_assignments )
189+ {
190+ self . add_reexport ( & name) ;
189191 }
190192 }
191193
@@ -223,7 +225,10 @@ impl Visit for CjsVisitor {
223225 false
224226 }
225227
226- fn get_export_require_arg ( call_expr : & CallExpr ) -> Option < & str > {
228+ fn get_export_require_arg (
229+ call_expr : & CallExpr ,
230+ var_assignments : & HashMap < String , String > ,
231+ ) -> Option < String > {
227232 if call_expr. args . iter ( ) . any ( |a| a. spread . is_some ( ) ) {
228233 return None ;
229234 }
@@ -233,10 +238,18 @@ impl Visit for CjsVisitor {
233238 // (0, tslib_1.__exportStar)(require("./file"), exports);
234239 || call_expr. args . len ( ) == 2 && is_exports_expr ( & call_expr. args [ 1 ] . expr )
235240 {
236- get_expr_require_value ( & call_expr. args [ 0 ] . expr )
237- } else {
238- None
241+ if let Some ( require_value) =
242+ get_expr_require_value ( & call_expr. args [ 0 ] . expr )
243+ {
244+ return Some ( require_value. to_string ( ) ) ;
245+ }
246+ if let Some ( ident) = call_expr. args [ 0 ] . expr . as_ident ( ) {
247+ // Handle __export(bound_ident) where bound_ident = require("...").
248+ return var_assignments. get ( & * ident. sym ) . cloned ( ) ;
249+ }
239250 }
251+
252+ None
240253 }
241254 }
242255
@@ -288,6 +301,8 @@ impl Visit for CjsVisitor {
288301 }
289302 }
290303 }
304+
305+ assign_expr. visit_children_with ( self ) ;
291306 }
292307}
293308
@@ -683,6 +698,61 @@ mod test {
683698 ] ) ;
684699 }
685700
701+ #[ test]
702+ fn typescript_reexports_via_bound_ident ( ) {
703+ let tester = parse_cjs (
704+ r#"
705+ "use strict";
706+ var reexported_1 = require("./reexported");
707+ __export(reexported_1);
708+ "# ,
709+ ) ;
710+
711+ tester. assert_reexports ( vec ! [ "./reexported" ] ) ;
712+ }
713+
714+ #[ test]
715+ fn typescript_enum_exports ( ) {
716+ let tester = parse_cjs (
717+ r#"
718+ "use strict";
719+ var MyEnum;
720+ (function (MyEnum) {
721+ MyEnum[MyEnum["A"] = 0] = "A";
722+ MyEnum[MyEnum["B"] = 1] = "B";
723+ })(MyEnum || (MyEnum = {}));
724+ exports.MyEnum = MyEnum;
725+ exports.Outer = (exports.Inner = {});
726+ "# ,
727+ ) ;
728+
729+ tester. assert_exports ( vec ! [ "Inner" , "MyEnum" , "Outer" ] ) ;
730+ }
731+
732+ #[ test]
733+ fn nested_exports_assignment_in_expression ( ) {
734+ let tester = parse_cjs (
735+ r#"
736+ "use strict";
737+ exports.A = (exports.B = (exports.C = {}));
738+ "# ,
739+ ) ;
740+
741+ tester. assert_exports ( vec ! [ "A" , "B" , "C" ] ) ;
742+ }
743+
744+ #[ test]
745+ fn exports_assignment_in_logical_or_expression ( ) {
746+ let tester = parse_cjs (
747+ r#"
748+ "use strict";
749+ exports.Foo = exports.Foo || {};
750+ "# ,
751+ ) ;
752+
753+ tester. assert_exports ( vec ! [ "Foo" ] ) ;
754+ }
755+
686756 #[ test]
687757 fn rollup_babel_reexport_getter ( ) {
688758 let tester = parse_cjs (
0 commit comments