don't rewrite module.exports if assign target is update or replace (#3147)

* don't rewrite `module.exports` if assign target is `update` or `replace`

* missing `is_delete_target`, check de-opt before rewriting
This commit is contained in:
Dylan Conway
2023-05-31 23:51:32 -07:00
committed by GitHub
parent a73a4d1e0b
commit 689434e012

View File

@@ -16156,6 +16156,7 @@ fn NewParser_(
.{
.is_call_target = is_call_target,
.assign_target = in.assign_target,
.is_delete_target = is_delete_target,
// .is_template_tag = p.template_tag != null,
},
)) |_expr| {
@@ -17438,14 +17439,6 @@ fn NewParser_(
p.recordUsage(p.require_ref);
return p.newExpr(E.Identifier{ .ref = p.require_ref }, name_loc);
} else if (!p.commonjs_named_exports_deoptimized and strings.eqlComptime(name, "exports")) {
// Deoptimizations:
// delete module.exports
// module.exports();
if (identifier_opts.is_call_target or identifier_opts.is_delete_target or identifier_opts.assign_target == .update) {
p.deoptimizeCommonJSNamedExports();
return null;
}
// Detect if we are doing
//
@@ -17453,7 +17446,13 @@ fn NewParser_(
// foo: "bar"
// }
//
if (identifier_opts.assign_target == .replace and
// Note that it cannot be any of these:
//
// module.exports += { };
// delete module.exports = {};
// module.exports()
if (!(identifier_opts.is_call_target or identifier_opts.is_delete_target) and
identifier_opts.assign_target == .replace and
p.stmt_expr_value == .e_binary and
p.stmt_expr_value.e_binary.op == .bin_assign)
{
@@ -17596,6 +17595,14 @@ fn NewParser_(
return p.newExpr(E.Missing{}, name_loc);
}
// Deoptimizations:
// delete module.exports
// module.exports();
if (identifier_opts.is_call_target or identifier_opts.is_delete_target or identifier_opts.assign_target != .none) {
p.deoptimizeCommonJSNamedExports();
return null;
}
// rewrite `module.exports` to `exports`
return p.newExpr(E.Identifier{ .ref = p.exports_ref }, name_loc);
} else if (p.options.bundle and strings.eqlComptime(name, "id") and identifier_opts.assign_target == .none) {