Skip to content

Commit 387f8d7

Browse files
committed
fix
1 parent 6444ba5 commit 387f8d7

File tree

1 file changed

+76
-6
lines changed

1 file changed

+76
-6
lines changed

src/cjs_parse.rs

Lines changed: 76 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)