mirror of
https://github.com/danbulant/oxc
synced 2026-05-24 12:21:58 +00:00
fix(minifier): handle Object.definedPropert(exports for @babel/types/lib/index.js (#4933)
Discoverd in `monitor-oxc`
```javascript
Object.keys(_index6).forEach(function(key) {
if (key === "default" || key === "__esModule") return;
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
if (key in exports && exports[key] === _index6[key]) return;
Object.defineProperty(exports, key, {
enumerable: true,
get: function() {
return _index6[key];
}
});
});
```
🙃
This commit is contained in:
parent
248a757b34
commit
46cb1c1b7b
3 changed files with 39 additions and 15 deletions
|
|
@ -4,7 +4,7 @@ use oxc_syntax::{
|
||||||
number::NumberBase,
|
number::NumberBase,
|
||||||
operator::{BinaryOperator, UnaryOperator},
|
operator::{BinaryOperator, UnaryOperator},
|
||||||
};
|
};
|
||||||
use oxc_traverse::{Ancestor, Traverse, TraverseCtx};
|
use oxc_traverse::{Traverse, TraverseCtx};
|
||||||
|
|
||||||
use crate::{CompressOptions, CompressorPass};
|
use crate::{CompressOptions, CompressorPass};
|
||||||
|
|
||||||
|
|
@ -56,10 +56,7 @@ impl<'a> Traverse<'a> for SubstituteAlternateSyntax<'a> {
|
||||||
call_expr: &mut CallExpression<'a>,
|
call_expr: &mut CallExpression<'a>,
|
||||||
ctx: &mut TraverseCtx<'a>,
|
ctx: &mut TraverseCtx<'a>,
|
||||||
) {
|
) {
|
||||||
// Check if this call expression is a top level `ExpressionStatement`.
|
if ctx.parent().is_expression_statement()
|
||||||
// NB: 1 = global, 2 = Program, 3 = ExpressionStatement
|
|
||||||
if ctx.ancestors_depth() == 3
|
|
||||||
&& matches!(ctx.parent(), Ancestor::ExpressionStatementExpression(_))
|
|
||||||
&& Self::is_object_define_property_exports(call_expr)
|
&& Self::is_object_define_property_exports(call_expr)
|
||||||
{
|
{
|
||||||
self.in_define_export = true;
|
self.in_define_export = true;
|
||||||
|
|
|
||||||
|
|
@ -19,16 +19,6 @@ fn test_same(source_text: &str) {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn cjs() {
|
fn cjs() {
|
||||||
// Export is undefined when `enumerable` is "!0".
|
|
||||||
// https://github.com/nodejs/cjs-module-lexer/issues/64
|
|
||||||
test_same(
|
|
||||||
"Object.defineProperty(exports, 'ConnectableObservable', {
|
|
||||||
enumerable: true,
|
|
||||||
get: function() {
|
|
||||||
return ConnectableObservable_1.ConnectableObservable;
|
|
||||||
}
|
|
||||||
});",
|
|
||||||
);
|
|
||||||
// Bail `cjs-module-lexer`.
|
// Bail `cjs-module-lexer`.
|
||||||
test_same("0 && (module.exports = { version });");
|
test_same("0 && (module.exports = { version });");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,43 @@ fn test(source_text: &str, expected: &str) {
|
||||||
crate::test(source_text, expected, options);
|
crate::test(source_text, expected, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn test_same(source_text: &str) {
|
||||||
|
test(source_text, source_text);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Oxc
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn cjs() {
|
||||||
|
// Bail `cjs-module-lexer`.
|
||||||
|
// Export is undefined when `enumerable` is "!0".
|
||||||
|
// https://github.com/nodejs/cjs-module-lexer/issues/64
|
||||||
|
test_same(
|
||||||
|
"Object.defineProperty(exports, 'ConnectableObservable', {
|
||||||
|
enumerable: true,
|
||||||
|
get: function() {
|
||||||
|
return ConnectableObservable_1.ConnectableObservable;
|
||||||
|
}
|
||||||
|
});",
|
||||||
|
);
|
||||||
|
// @babel/types/lib/index.js
|
||||||
|
test_same(
|
||||||
|
r#"Object.keys(_index6).forEach(function(key) {
|
||||||
|
if (key === "default" || key === "__esModule") return;
|
||||||
|
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
||||||
|
if (key in exports && exports[key] === _index6[key]) return;
|
||||||
|
Object.defineProperty(exports, key, {
|
||||||
|
enumerable: true,
|
||||||
|
get: function() {
|
||||||
|
return _index6[key];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});"#,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Google Closure Compiler
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn fold_return_result() {
|
fn fold_return_result() {
|
||||||
test("function f(){return !1;}", "function f(){return !1}");
|
test("function f(){return !1;}", "function f(){return !1}");
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue