From 3debd95b1c0654bc6da9afa69544f21044ce4c0d Mon Sep 17 00:00:00 2001 From: Boshen Date: Fri, 10 Jan 2025 19:49:47 +0800 Subject: [PATCH] fix(minifier): do not minify `Object.defineProperty` in sequence expressions --- .../peephole_substitute_alternate_syntax.rs | 15 ++++++---- crates/oxc_minifier/tests/ast_passes/mod.rs | 28 +++++++++++++++++++ 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/crates/oxc_minifier/src/ast_passes/peephole_substitute_alternate_syntax.rs b/crates/oxc_minifier/src/ast_passes/peephole_substitute_alternate_syntax.rs index 9543cc924598c7..700102da0e3f0e 100644 --- a/crates/oxc_minifier/src/ast_passes/peephole_substitute_alternate_syntax.rs +++ b/crates/oxc_minifier/src/ast_passes/peephole_substitute_alternate_syntax.rs @@ -108,15 +108,20 @@ impl<'a> Traverse<'a> for PeepholeSubstituteAlternateSyntax { call_expr: &mut CallExpression<'a>, ctx: &mut TraverseCtx<'a>, ) { - if ctx.parent().is_expression_statement() - && Self::is_object_define_property_exports(call_expr) - { - self.in_define_export = true; + if !self.in_fixed_loop { + let parent = ctx.parent(); + if (parent.is_expression_statement() || parent.is_sequence_expression()) + && Self::is_object_define_property_exports(call_expr) + { + self.in_define_export = true; + } } } fn exit_call_expression(&mut self, expr: &mut CallExpression<'a>, ctx: &mut TraverseCtx<'a>) { - self.in_define_export = false; + if !self.in_fixed_loop { + self.in_define_export = false; + } self.try_compress_call_expression_arguments(expr, ctx); } diff --git a/crates/oxc_minifier/tests/ast_passes/mod.rs b/crates/oxc_minifier/tests/ast_passes/mod.rs index c58a2ecfc4f9c4..f0d68f3529e739 100644 --- a/crates/oxc_minifier/tests/ast_passes/mod.rs +++ b/crates/oxc_minifier/tests/ast_passes/mod.rs @@ -61,7 +61,35 @@ fn cjs() { } });", ); + test_same( + "Object.defineProperty(exports, 'ConnectableObservable', { + enumerable: true, + get: function() { + return ConnectableObservable_1.ConnectableObservable; + } + });", + ); // @babel/types/lib/index.js + test( + r#" + Object.defineProperty(exports, "__esModule", { + value: true + }); + Object.defineProperty(exports, "TargetNames", { + enumerable: true, + get: function () { + return _options.TargetNames; + } + });"#, + r#" + Object.defineProperty(exports, "__esModule", { value: true }), Object.defineProperty(exports, "TargetNames", { + enumerable: true, + get: function() { + return _options.TargetNames; + } + });"#, + ); + test( r#"Object.keys(_index6).forEach(function(key) { if (key === "default" || key === "__esModule") return;