diff --git a/crates/swc/tests/fixture/issues-7xxx/7228/input/.swcrc b/crates/swc/tests/fixture/issues-7xxx/7228/input/.swcrc new file mode 100644 index 000000000000..0e983a3fd444 --- /dev/null +++ b/crates/swc/tests/fixture/issues-7xxx/7228/input/.swcrc @@ -0,0 +1,64 @@ +{ + "jsc": { + "parser": { + "syntax": "ecmascript", + "jsx": false + }, + "target": "es2022", + "loose": false, + "minify": { + "compress": { + "arguments": false, + "arrows": false, + "booleans": false, + "booleans_as_integers": false, + "collapse_vars": false, + "comparisons": false, + "computed_props": false, + "conditionals": false, + "dead_code": false, + "directives": false, + "drop_console": false, + "drop_debugger": false, + "evaluate": false, + "expression": false, + "hoist_funs": false, + "hoist_props": true, + "hoist_vars": false, + "if_return": false, + "join_vars": false, + "keep_classnames": false, + "keep_fargs": false, + "keep_fnames": false, + "keep_infinity": false, + "loops": false, + "negate_iife": false, + "properties": false, + "reduce_funcs": false, + "reduce_vars": false, + "side_effects": false, + "switches": false, + "typeofs": false, + "unsafe": false, + "unsafe_arrows": false, + "unsafe_comps": false, + "unsafe_Function": false, + "unsafe_math": false, + "unsafe_symbols": false, + "unsafe_methods": false, + "unsafe_proto": false, + "unsafe_regexp": false, + "unsafe_undefined": false, + "unused": false, + "const_to_let": false, + "pristine_globals": false + }, + "mangle": false + } + }, + "module": { + "type": "es6" + }, + "minify": false, + "isModule": true +} \ No newline at end of file diff --git a/crates/swc/tests/fixture/issues-7xxx/7228/input/input.js b/crates/swc/tests/fixture/issues-7xxx/7228/input/input.js new file mode 100644 index 000000000000..f30c1f53b7d0 --- /dev/null +++ b/crates/swc/tests/fixture/issues-7xxx/7228/input/input.js @@ -0,0 +1,4 @@ +function f() { + const foos = something.getFoos(); + return foos?.[0]; +} \ No newline at end of file diff --git a/crates/swc/tests/fixture/issues-7xxx/7228/output/input.js b/crates/swc/tests/fixture/issues-7xxx/7228/output/input.js new file mode 100644 index 000000000000..5e38a4538cf1 --- /dev/null +++ b/crates/swc/tests/fixture/issues-7xxx/7228/output/input.js @@ -0,0 +1,3 @@ +function f() { + return something.getFoos()?.[0]; +} diff --git a/crates/swc_ecma_minifier/src/compress/optimize/props.rs b/crates/swc_ecma_minifier/src/compress/optimize/props.rs index 6cbf5c646453..becc6ea2d302 100644 --- a/crates/swc_ecma_minifier/src/compress/optimize/props.rs +++ b/crates/swc_ecma_minifier/src/compress/optimize/props.rs @@ -195,6 +195,10 @@ where pub(super) fn replace_props(&mut self, e: &mut Expr) { let member = match e { Expr::Member(m) => m, + Expr::OptChain(m) => match &mut *m.base { + OptChainBase::Member(m) => m, + _ => return, + }, _ => return, }; if let Expr::Ident(obj) = &*member.obj { diff --git a/crates/swc_ecma_minifier/tests/fixture/issues/7228/1/conifig.json b/crates/swc_ecma_minifier/tests/fixture/issues/7228/1/conifig.json new file mode 100644 index 000000000000..53c3bdfc5752 --- /dev/null +++ b/crates/swc_ecma_minifier/tests/fixture/issues/7228/1/conifig.json @@ -0,0 +1,47 @@ +{ + "arguments": false, + "arrows": false, + "booleans": false, + "booleans_as_integers": false, + "collapse_vars": false, + "comparisons": false, + "computed_props": false, + "conditionals": false, + "dead_code": false, + "directives": false, + "drop_console": false, + "drop_debugger": false, + "evaluate": false, + "expression": false, + "hoist_funs": false, + "hoist_props": true, + "hoist_vars": false, + "if_return": false, + "join_vars": false, + "keep_classnames": false, + "keep_fargs": false, + "keep_fnames": false, + "keep_infinity": false, + "loops": false, + "negate_iife": false, + "properties": false, + "reduce_funcs": false, + "reduce_vars": false, + "side_effects": false, + "switches": false, + "typeofs": false, + "unsafe": false, + "unsafe_arrows": false, + "unsafe_comps": false, + "unsafe_Function": false, + "unsafe_math": false, + "unsafe_symbols": false, + "unsafe_methods": false, + "unsafe_proto": false, + "unsafe_regexp": false, + "unsafe_undefined": false, + "unused": false, + "const_to_let": false, + "pristine_globals": false, + "defaults": true +} diff --git a/crates/swc_ecma_minifier/tests/fixture/issues/7228/1/input.js b/crates/swc_ecma_minifier/tests/fixture/issues/7228/1/input.js new file mode 100644 index 000000000000..645e51d50b69 --- /dev/null +++ b/crates/swc_ecma_minifier/tests/fixture/issues/7228/1/input.js @@ -0,0 +1,4 @@ +export function f() { + const foos = something.getFoos(); + return foos?.[0]; +} diff --git a/crates/swc_ecma_minifier/tests/fixture/issues/7228/1/output.js b/crates/swc_ecma_minifier/tests/fixture/issues/7228/1/output.js new file mode 100644 index 000000000000..645e51d50b69 --- /dev/null +++ b/crates/swc_ecma_minifier/tests/fixture/issues/7228/1/output.js @@ -0,0 +1,4 @@ +export function f() { + const foos = something.getFoos(); + return foos?.[0]; +}