From 66196a65be7164bf519dbc749c687ac815f22ee7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Donny/=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Wed, 12 Oct 2022 11:29:40 +0900 Subject: [PATCH] feat(es/minifier): Inline pure array literal partially (#6099) --- ...eNotOperatorWithAnyOtherType.2.minified.js | 7 +-- ...peratorConditionIsNumberType.2.minified.js | 6 --- ...peratorConditoinIsStringType.2.minified.js | 8 +--- ...BindingPatternAndAssignment2.2.minified.js | 20 ++++----- ...BindingPatternAndAssignment3.2.minified.js | 12 ++--- .../destructuringControlFlow.2.minified.js | 5 +-- .../indexerWithTuple.2.minified.js | 2 +- ...lNotOperatorWithAnyOtherType.2.minified.js | 7 +-- ...gateOperatorWithAnyOtherType.2.minified.js | 7 +-- ...plusOperatorWithAnyOtherType.2.minified.js | 7 +-- .../typeInferenceWithTupleType.2.minified.js | 5 --- ...voidOperatorWithAnyOtherType.2.minified.js | 7 +-- crates/swc_ecma_minifier/src/analyzer/mod.rs | 1 + .../src/analyzer/storage/normal.rs | 4 ++ .../src/compress/optimize/inline.rs | 37 ++++++++++++++-- .../src/compress/optimize/mod.rs | 5 +++ .../src/compress/optimize/util.rs | 27 +++++++++--- crates/swc_ecma_minifier/tests/TODO.txt | 1 - .../tests/benches-full/echarts.js | 12 ++--- .../fixture/next/react-pdf-renderer/output.js | 16 +++---- .../syncfusion/933-e9f9a6bf671b96fc/output.js | 44 +++++-------------- crates/swc_ecma_minifier/tests/passing.txt | 1 + .../tests/single-pass/1/output.js | 2 +- .../output.js | 5 ++- 24 files changed, 119 insertions(+), 129 deletions(-) diff --git a/crates/swc/tests/tsc-references/bitwiseNotOperatorWithAnyOtherType.2.minified.js b/crates/swc/tests/tsc-references/bitwiseNotOperatorWithAnyOtherType.2.minified.js index bbb2dabd177c..c2e27fcf1391 100644 --- a/crates/swc/tests/tsc-references/bitwiseNotOperatorWithAnyOtherType.2.minified.js +++ b/crates/swc/tests/tsc-references/bitwiseNotOperatorWithAnyOtherType.2.minified.js @@ -1,9 +1,6 @@ //// [bitwiseNotOperatorWithAnyOtherType.ts] import _class_call_check from "@swc/helpers/src/_class_call_check.mjs"; -var M, ANY2 = [ - "", - "" -], obj1 = { +var M, obj1 = { x: "", y: function() {} }, A = function() { @@ -18,4 +15,4 @@ var M, ANY2 = [ M.n = n; }(M || (M = {})); var objA = new A(); -ANY2[0], obj1.x, obj1.y, objA.a, M.n, A.foo(), ANY2[0], obj1.y, objA.a, M.n, obj1.x; +obj1.x, obj1.y, objA.a, M.n, A.foo(), obj1.y, objA.a, M.n, obj1.x; diff --git a/crates/swc/tests/tsc-references/conditionalOperatorConditionIsNumberType.2.minified.js b/crates/swc/tests/tsc-references/conditionalOperatorConditionIsNumberType.2.minified.js index 1cd94bf274fe..553b2c7c0604 100644 --- a/crates/swc/tests/tsc-references/conditionalOperatorConditionIsNumberType.2.minified.js +++ b/crates/swc/tests/tsc-references/conditionalOperatorConditionIsNumberType.2.minified.js @@ -1,7 +1 @@ //// [conditionalOperatorConditionIsNumberType.ts] -var array = [ - 1, - 2, - 3 -]; -array[1], array[1], array[1]; diff --git a/crates/swc/tests/tsc-references/conditionalOperatorConditoinIsStringType.2.minified.js b/crates/swc/tests/tsc-references/conditionalOperatorConditoinIsStringType.2.minified.js index dc6d60235297..ca0e38a45730 100644 --- a/crates/swc/tests/tsc-references/conditionalOperatorConditoinIsStringType.2.minified.js +++ b/crates/swc/tests/tsc-references/conditionalOperatorConditoinIsStringType.2.minified.js @@ -1,11 +1,7 @@ //// [conditionalOperatorConditoinIsStringType.ts] +var condString; import _type_of from "@swc/helpers/src/_type_of.mjs"; function foo() { return "string"; } -var condString, array = [ - "1", - "2", - "3" -]; -void 0 === condString || _type_of(condString), condString.toUpperCase, foo(), array[1], foo(), void 0 === condString || _type_of(condString), condString.toUpperCase, foo(), array[1], void 0 === condString || _type_of(condString), condString.toUpperCase; +void 0 === condString || _type_of(condString), condString.toUpperCase, foo(), foo(), void 0 === condString || _type_of(condString), condString.toUpperCase, foo(), void 0 === condString || _type_of(condString), condString.toUpperCase; diff --git a/crates/swc/tests/tsc-references/destructuringArrayBindingPatternAndAssignment2.2.minified.js b/crates/swc/tests/tsc-references/destructuringArrayBindingPatternAndAssignment2.2.minified.js index 26e6ba073d20..17fa9bb7857a 100644 --- a/crates/swc/tests/tsc-references/destructuringArrayBindingPatternAndAssignment2.2.minified.js +++ b/crates/swc/tests/tsc-references/destructuringArrayBindingPatternAndAssignment2.2.minified.js @@ -1,25 +1,25 @@ //// [destructuringArrayBindingPatternAndAssignment2.ts] import _sliced_to_array from "@swc/helpers/src/_sliced_to_array.mjs"; import _to_consumable_array from "@swc/helpers/src/_to_consumable_array.mjs"; -var ref = [], ref1 = (_sliced_to_array(ref[0], 1)[0], _sliced_to_array(ref[1], 1)); +var ref = (_sliced_to_array([][0], 1)[0], _sliced_to_array([][1], 1)); +_sliced_to_array(ref[0], 1)[0]; +var _undefined = _sliced_to_array(void 0, 2), ref1 = (_sliced_to_array(_undefined[0], 1)[0], _sliced_to_array(_undefined[1], 1)); _sliced_to_array(ref1[0], 1)[0]; -var _undefined = _sliced_to_array(void 0, 2), ref2 = (_sliced_to_array(_undefined[0], 1)[0], _sliced_to_array(_undefined[1], 1)); -_sliced_to_array(ref2[0], 1)[0]; -var ref3 = _sliced_to_array([ +var ref2 = _sliced_to_array([ 1, 2, 3 ], 3); -ref3[0], ref3[1], ref3[2]; +ref2[0], ref2[1], ref2[2]; var temp = [ 1, 2, 3 -], ref4 = _sliced_to_array(_to_consumable_array(temp), 2); +], ref3 = _sliced_to_array(_to_consumable_array(temp), 2); +ref3[0], ref3[1]; +var ref4 = _sliced_to_array(_to_consumable_array(temp), 2); ref4[0], ref4[1]; -var ref5 = _sliced_to_array(_to_consumable_array(temp), 2); -ref5[0], ref5[1]; -var ref6 = _sliced_to_array({ +var ref5 = _sliced_to_array({ 2: !0 }, 3); -ref6[0], ref6[1], ref6[2]; +ref5[0], ref5[1], ref5[2]; diff --git a/crates/swc/tests/tsc-references/destructuringArrayBindingPatternAndAssignment3.2.minified.js b/crates/swc/tests/tsc-references/destructuringArrayBindingPatternAndAssignment3.2.minified.js index 073be4f4d282..bcbc520a3e45 100644 --- a/crates/swc/tests/tsc-references/destructuringArrayBindingPatternAndAssignment3.2.minified.js +++ b/crates/swc/tests/tsc-references/destructuringArrayBindingPatternAndAssignment3.2.minified.js @@ -1,15 +1,9 @@ //// [destructuringArrayBindingPatternAndAssignment3.ts] import _sliced_to_array from "@swc/helpers/src/_sliced_to_array.mjs"; -var ref = [ +var tmp = [ 1 -]; -ref[0], ref[1]; -var ref1 = [ - 1 -], tmp = (ref1[0], ref1[1], ref1[2]), e = void 0 === tmp ? e : tmp, ref2 = [ - 1 -]; -ref2[0], ref2[1], ref2[2], ref2[3], function(param) { +][2], e = void 0 === tmp ? e : tmp; +!function(param) { var _param = _sliced_to_array(param, 2); _param[0], _param[1]; }([ diff --git a/crates/swc/tests/tsc-references/destructuringControlFlow.2.minified.js b/crates/swc/tests/tsc-references/destructuringControlFlow.2.minified.js index 7cda32caea06..85ea1db5a1e6 100644 --- a/crates/swc/tests/tsc-references/destructuringControlFlow.2.minified.js +++ b/crates/swc/tests/tsc-references/destructuringControlFlow.2.minified.js @@ -1,5 +1,4 @@ //// [destructuringControlFlow.ts] -var ref = [ +(0, [ "foo" -]; -(ref[0], ref[1]).toUpperCase(); +][1]).toUpperCase(); diff --git a/crates/swc/tests/tsc-references/indexerWithTuple.2.minified.js b/crates/swc/tests/tsc-references/indexerWithTuple.2.minified.js index 0e7c3eec4913..9dc0b3f5dc64 100644 --- a/crates/swc/tests/tsc-references/indexerWithTuple.2.minified.js +++ b/crates/swc/tests/tsc-references/indexerWithTuple.2.minified.js @@ -15,4 +15,4 @@ var strNumTuple = [ !0, "foo" ]; -strNumTuple[0], strNumTuple[1], strNumTuple[2], strNumTuple[0], strNumTuple[1], strNumTuple["0"], strNumTuple["1"], numTupleTuple[1], numTupleTuple[2], strNumTuple[-1], unionTuple1[0], unionTuple1[1], unionTuple1[2], unionTuple1[0], unionTuple1[1], unionTuple1["0"], unionTuple1["1"], unionTuple2[0], unionTuple2[1], unionTuple2[2], unionTuple2[0], unionTuple2[1], unionTuple2["0"], unionTuple2["1"]; +strNumTuple["0"], strNumTuple["1"], numTupleTuple[1], numTupleTuple[2], unionTuple1["0"], unionTuple1["1"], unionTuple2[0], unionTuple2[1], unionTuple2[2], unionTuple2[0], unionTuple2[1], unionTuple2["0"], unionTuple2["1"]; diff --git a/crates/swc/tests/tsc-references/logicalNotOperatorWithAnyOtherType.2.minified.js b/crates/swc/tests/tsc-references/logicalNotOperatorWithAnyOtherType.2.minified.js index 02964b5bdebe..2177c05c2aea 100644 --- a/crates/swc/tests/tsc-references/logicalNotOperatorWithAnyOtherType.2.minified.js +++ b/crates/swc/tests/tsc-references/logicalNotOperatorWithAnyOtherType.2.minified.js @@ -1,9 +1,6 @@ //// [logicalNotOperatorWithAnyOtherType.ts] import _class_call_check from "@swc/helpers/src/_class_call_check.mjs"; -var M, ANY2 = [ - "", - "" -], obj1 = { +var M, obj1 = { x: "", y: function() {} }, A = function() { @@ -18,4 +15,4 @@ var M, ANY2 = [ M.n = n; }(M || (M = {})); var objA = new A(); -ANY2[0], obj1.x, obj1.y, objA.a, M.n, A.foo(), ANY2[0], objA.a, M.n; +obj1.x, obj1.y, objA.a, M.n, A.foo(), objA.a, M.n; diff --git a/crates/swc/tests/tsc-references/negateOperatorWithAnyOtherType.2.minified.js b/crates/swc/tests/tsc-references/negateOperatorWithAnyOtherType.2.minified.js index f48e250bd47f..a7948645b656 100644 --- a/crates/swc/tests/tsc-references/negateOperatorWithAnyOtherType.2.minified.js +++ b/crates/swc/tests/tsc-references/negateOperatorWithAnyOtherType.2.minified.js @@ -1,9 +1,6 @@ //// [negateOperatorWithAnyOtherType.ts] import _class_call_check from "@swc/helpers/src/_class_call_check.mjs"; -var M, ANY2 = [ - "", - "" -], obj1 = { +var M, obj1 = { x: "", y: function() {} }, A = function() { @@ -18,4 +15,4 @@ var M, ANY2 = [ M.n = n; }(M || (M = {})); var objA = new A(); -ANY2[0], obj1.x, obj1.y, objA.a, M.n, A.foo(), ANY2[0], objA.a, M.n; +obj1.x, obj1.y, objA.a, M.n, A.foo(), objA.a, M.n; diff --git a/crates/swc/tests/tsc-references/plusOperatorWithAnyOtherType.2.minified.js b/crates/swc/tests/tsc-references/plusOperatorWithAnyOtherType.2.minified.js index 19aff69d7dc0..70a82417f4e3 100644 --- a/crates/swc/tests/tsc-references/plusOperatorWithAnyOtherType.2.minified.js +++ b/crates/swc/tests/tsc-references/plusOperatorWithAnyOtherType.2.minified.js @@ -1,9 +1,6 @@ //// [plusOperatorWithAnyOtherType.ts] import _class_call_check from "@swc/helpers/src/_class_call_check.mjs"; -var M, ANY2 = [ - "", - "" -], obj1 = { +var M, obj1 = { x: function(s) {}, y: function(s1) {} }, A = function() { @@ -18,4 +15,4 @@ var M, ANY2 = [ M.n = n; }(M || (M = {})); var objA = new A(); -ANY2[0], obj1.x, obj1.y, objA.a, M.n, A.foo(), ANY2[0], objA.a, M.n; +obj1.x, obj1.y, objA.a, M.n, A.foo(), objA.a, M.n; diff --git a/crates/swc/tests/tsc-references/typeInferenceWithTupleType.2.minified.js b/crates/swc/tests/tsc-references/typeInferenceWithTupleType.2.minified.js index c74d0085732f..448c7ea6966d 100644 --- a/crates/swc/tests/tsc-references/typeInferenceWithTupleType.2.minified.js +++ b/crates/swc/tests/tsc-references/typeInferenceWithTupleType.2.minified.js @@ -1,9 +1,4 @@ //// [typeInferenceWithTupleType.ts] -var combineResult = [ - "string", - 10 -]; -combineResult[0], combineResult[1]; var zipResult = function(array1, array2) { if (array1.length != array2.length) return [ [ diff --git a/crates/swc/tests/tsc-references/voidOperatorWithAnyOtherType.2.minified.js b/crates/swc/tests/tsc-references/voidOperatorWithAnyOtherType.2.minified.js index d0e41f9b7b6d..bd0fdd837542 100644 --- a/crates/swc/tests/tsc-references/voidOperatorWithAnyOtherType.2.minified.js +++ b/crates/swc/tests/tsc-references/voidOperatorWithAnyOtherType.2.minified.js @@ -1,9 +1,6 @@ //// [voidOperatorWithAnyOtherType.ts] import _class_call_check from "@swc/helpers/src/_class_call_check.mjs"; -var M, ANY2 = [ - "", - "" -], obj1 = { +var M, obj1 = { x: "", y: 1 }, A = function() { @@ -18,4 +15,4 @@ var M, ANY2 = [ M.n = n; }(M || (M = {})); var objA = new A(); -ANY2[0], obj1.x, obj1.y, objA.a, M.n, A.foo(), ANY2[0], objA.a, M.n; +obj1.x, obj1.y, objA.a, M.n, A.foo(), objA.a, M.n; diff --git a/crates/swc_ecma_minifier/src/analyzer/mod.rs b/crates/swc_ecma_minifier/src/analyzer/mod.rs index bf4a9825f4c2..e96d8c3af637 100644 --- a/crates/swc_ecma_minifier/src/analyzer/mod.rs +++ b/crates/swc_ecma_minifier/src/analyzer/mod.rs @@ -137,6 +137,7 @@ pub(crate) struct VarUsageInfo { infects: Vec, pub used_in_non_child_fn: bool, + /// Only **string** properties. pub accessed_props: Box>, pub used_recursively: bool, diff --git a/crates/swc_ecma_minifier/src/analyzer/storage/normal.rs b/crates/swc_ecma_minifier/src/analyzer/storage/normal.rs index 94262996d6bd..bc257328e36e 100644 --- a/crates/swc_ecma_minifier/src/analyzer/storage/normal.rs +++ b/crates/swc_ecma_minifier/src/analyzer/storage/normal.rs @@ -104,6 +104,10 @@ impl Storage for ProgramData { e.get_mut().is_fn_local &= var_info.is_fn_local; e.get_mut().used_in_non_child_fn |= var_info.used_in_non_child_fn; + for (k, v) in *var_info.accessed_props { + *e.get_mut().accessed_props.entry(k).or_default() += v; + } + match kind { ScopeKind::Fn => { e.get_mut().is_fn_local = false; diff --git a/crates/swc_ecma_minifier/src/compress/optimize/inline.rs b/crates/swc_ecma_minifier/src/compress/optimize/inline.rs index c955670d70d1..7151641e32ea 100644 --- a/crates/swc_ecma_minifier/src/compress/optimize/inline.rs +++ b/crates/swc_ecma_minifier/src/compress/optimize/inline.rs @@ -89,8 +89,42 @@ where return; } + let is_inline_enabled = + self.options.reduce_vars || self.options.collapse_vars || self.options.inline != 0; + self.vars.inline_with_multi_replacer(init); + // We inline arrays partially if it's pure (all elements are literal), and not + // modified. + // We don't drop definition, but we just inline array accesses with numeric + // literal key. + // + // TODO: Allow `length` in usage.accessed_props + if usage.declared + && !usage.reassigned() + && !usage.mutated + && !usage.has_property_mutation + && usage.accessed_props.is_empty() + && !usage.is_infected() + && is_inline_enabled + { + if let Expr::Array(arr) = init { + if arr.elems.len() < 32 + && arr.elems.iter().all(|e| match e { + Some(ExprOrSpread { spread: None, expr }) => match &**expr { + Expr::Lit(..) => true, + _ => false, + }, + _ => false, + }) + { + self.vars + .lits_for_array_access + .insert(ident.to_id(), Box::new(init.clone())); + } + } + } + if !usage.is_fn_local { match init { Expr::Lit(..) | Expr::Ident(..) => {} @@ -133,9 +167,6 @@ where self.mode.store(ident.to_id(), &*init); } - let is_inline_enabled = - self.options.reduce_vars || self.options.collapse_vars || self.options.inline != 0; - // Mutation of properties are ok if is_inline_enabled && usage.declared_count == 1 diff --git a/crates/swc_ecma_minifier/src/compress/optimize/mod.rs b/crates/swc_ecma_minifier/src/compress/optimize/mod.rs index cbae2b3cc4c7..d54de1b35d12 100644 --- a/crates/swc_ecma_minifier/src/compress/optimize/mod.rs +++ b/crates/swc_ecma_minifier/src/compress/optimize/mod.rs @@ -246,6 +246,9 @@ struct Vars { /// https://github.com/swc-project/swc/issues/4415 lits_for_cmp: FxHashMap>, + /// This stores [Expr::Array] if all elements are literals. + lits_for_array_access: FxHashMap>, + /// Used for copying functions. /// /// We use this to distinguish [Callee::Expr] from other [Expr]s. @@ -271,11 +274,13 @@ impl Vars { let mut changed = false; if !self.simple_functions.is_empty() || !self.lits_for_cmp.is_empty() + || !self.lits_for_array_access.is_empty() || !self.removed.is_empty() { let mut v = Finalizer { simple_functions: &self.simple_functions, lits_for_cmp: &self.lits_for_cmp, + lits_for_array_access: &self.lits_for_array_access, vars_to_remove: &self.removed, changed: false, }; diff --git a/crates/swc_ecma_minifier/src/compress/optimize/util.rs b/crates/swc_ecma_minifier/src/compress/optimize/util.rs index 25a9283fbd26..86efd53ad3f4 100644 --- a/crates/swc_ecma_minifier/src/compress/optimize/util.rs +++ b/crates/swc_ecma_minifier/src/compress/optimize/util.rs @@ -164,6 +164,7 @@ impl VisitMut for Remapper { pub(crate) struct Finalizer<'a> { pub simple_functions: &'a FxHashMap>, pub lits_for_cmp: &'a FxHashMap>, + pub lits_for_array_access: &'a FxHashMap>, pub vars_to_remove: &'a FxHashSet, @@ -183,8 +184,9 @@ impl Parallel for Finalizer<'_> { impl<'a> Finalizer<'a> { fn var(&mut self, i: &Id, mode: FinalizerMode) -> Option> { let mut e = match mode { - FinalizerMode::OnlyCallee => self.simple_functions.get(i).cloned()?, - FinalizerMode::OnlyComparisonWithLit => self.lits_for_cmp.get(i).cloned()?, + FinalizerMode::Callee => self.simple_functions.get(i).cloned()?, + FinalizerMode::ComparisonWithLit => self.lits_for_cmp.get(i).cloned()?, + FinalizerMode::MemberAccess => self.lits_for_array_access.get(i).cloned()?, }; e.visit_mut_children_with(self); @@ -215,8 +217,9 @@ impl<'a> Finalizer<'a> { #[derive(Debug, Clone, Copy)] enum FinalizerMode { - OnlyCallee, - OnlyComparisonWithLit, + Callee, + ComparisonWithLit, + MemberAccess, } impl VisitMut for Finalizer<'_> { @@ -226,7 +229,17 @@ impl VisitMut for Finalizer<'_> { e.visit_mut_children_with(self); if let Callee::Expr(e) = e { - self.check(e, FinalizerMode::OnlyCallee); + self.check(e, FinalizerMode::Callee); + } + } + + fn visit_mut_member_expr(&mut self, e: &mut MemberExpr) { + e.visit_mut_children_with(self); + + if let MemberProp::Computed(ref mut prop) = e.prop { + if let Expr::Lit(Lit::Num(..)) = &*prop.expr { + self.check(&mut e.obj, FinalizerMode::MemberAccess); + } } } @@ -237,9 +250,9 @@ impl VisitMut for Finalizer<'_> { op!("===") | op!("!==") | op!("==") | op!("!=") => { // if e.left.is_lit() { - self.check(&mut e.right, FinalizerMode::OnlyComparisonWithLit); + self.check(&mut e.right, FinalizerMode::ComparisonWithLit); } else if e.right.is_lit() { - self.check(&mut e.left, FinalizerMode::OnlyComparisonWithLit); + self.check(&mut e.left, FinalizerMode::ComparisonWithLit); } } _ => {} diff --git a/crates/swc_ecma_minifier/tests/TODO.txt b/crates/swc_ecma_minifier/tests/TODO.txt index 1d929ad93cdd..8691aef5e1b3 100644 --- a/crates/swc_ecma_minifier/tests/TODO.txt +++ b/crates/swc_ecma_minifier/tests/TODO.txt @@ -3,7 +3,6 @@ arrays/constant_join/input.js arrays/constant_join_2/input.js arrays/constant_join_3/input.js arrays/for_loop/input.js -arrays/index/input.js arrays/index_length/input.js arrow/issue_2084/input.js arrow/issue_2105_1/input.js diff --git a/crates/swc_ecma_minifier/tests/benches-full/echarts.js b/crates/swc_ecma_minifier/tests/benches-full/echarts.js index fbe4e936d604..7db3233fad39 100644 --- a/crates/swc_ecma_minifier/tests/benches-full/echarts.js +++ b/crates/swc_ecma_minifier/tests/benches-full/echarts.js @@ -28249,10 +28249,7 @@ seriesType: 'candlestick', plan: createRenderPlanner(), reset: function(seriesModel) { - var seriesModel1, data, extent, baseAxis, bandWidth, barMaxWidth, barMinWidth, barWidth, coordSys = seriesModel.coordinateSystem, data1 = seriesModel.getData(), candleWidth = (seriesModel1 = seriesModel, data = data1, bandWidth = 'category' === (baseAxis = seriesModel1.getBaseAxis()).type ? baseAxis.getBandWidth() : Math.abs((extent = baseAxis.getExtent())[1] - extent[0]) / data.count(), barMaxWidth = parsePercent$1(retrieve2(seriesModel1.get('barMaxWidth'), bandWidth), bandWidth), barMinWidth = parsePercent$1(retrieve2(seriesModel1.get('barMinWidth'), 1), bandWidth), null != (barWidth = seriesModel1.get('barWidth')) ? parsePercent$1(barWidth, bandWidth) : Math.max(Math.min(bandWidth / 2, barMaxWidth), barMinWidth)), coordDims = [ - 'x', - 'y' - ], cDim = data1.mapDimension(coordDims[0]), vDims = data1.mapDimensionsAll(coordDims[1]), openDim = vDims[0], closeDim = vDims[1], lowestDim = vDims[2], highestDim = vDims[3]; + var seriesModel1, data, extent, baseAxis, bandWidth, barMaxWidth, barMinWidth, barWidth, coordSys = seriesModel.coordinateSystem, data1 = seriesModel.getData(), candleWidth = (seriesModel1 = seriesModel, data = data1, bandWidth = 'category' === (baseAxis = seriesModel1.getBaseAxis()).type ? baseAxis.getBandWidth() : Math.abs((extent = baseAxis.getExtent())[1] - extent[0]) / data.count(), barMaxWidth = parsePercent$1(retrieve2(seriesModel1.get('barMaxWidth'), bandWidth), bandWidth), barMinWidth = parsePercent$1(retrieve2(seriesModel1.get('barMinWidth'), 1), bandWidth), null != (barWidth = seriesModel1.get('barWidth')) ? parsePercent$1(barWidth, bandWidth) : Math.max(Math.min(bandWidth / 2, barMaxWidth), barMinWidth)), cDim = data1.mapDimension('x'), vDims = data1.mapDimensionsAll('y'), openDim = vDims[0], closeDim = vDims[1], lowestDim = vDims[2], highestDim = vDims[3]; if (data1.setLayout({ candleWidth: candleWidth, isSimpleBox: candleWidth <= 1.3 @@ -39656,10 +39653,7 @@ color: '#333' } }, VisualMapModel; - }(ComponentModel), DEFAULT_BAR_BOUND = [ - 20, - 140 - ], ContinuousModel = function(_super) { + }(ComponentModel), ContinuousModel = function(_super) { function ContinuousModel() { var _this = null !== _super && _super.apply(this, arguments) || this; return _this.type = ContinuousModel.type, _this; @@ -39671,7 +39665,7 @@ }, ContinuousModel.prototype.resetItemSize = function() { _super.prototype.resetItemSize.apply(this, arguments); var itemSize = this.itemSize; - (null == itemSize[0] || isNaN(itemSize[0])) && (itemSize[0] = DEFAULT_BAR_BOUND[0]), (null == itemSize[1] || isNaN(itemSize[1])) && (itemSize[1] = DEFAULT_BAR_BOUND[1]); + (null == itemSize[0] || isNaN(itemSize[0])) && (itemSize[0] = 20), (null == itemSize[1] || isNaN(itemSize[1])) && (itemSize[1] = 140); }, ContinuousModel.prototype._resetRange = function() { var dataExtent = this.getExtent(), range = this.option.range; !range || range.auto ? (dataExtent.auto = 1, this.option.range = dataExtent) : isArray(range) && (range[0] > range[1] && range.reverse(), range[0] = Math.max(range[0], dataExtent[0]), range[1] = Math.min(range[1], dataExtent[1])); diff --git a/crates/swc_ecma_minifier/tests/fixture/next/react-pdf-renderer/output.js b/crates/swc_ecma_minifier/tests/fixture/next/react-pdf-renderer/output.js index 46acbbef0024..6c22015d58c9 100644 --- a/crates/swc_ecma_minifier/tests/fixture/next/react-pdf-renderer/output.js +++ b/crates/swc_ecma_minifier/tests/fixture/next/react-pdf-renderer/output.js @@ -4697,19 +4697,15 @@ 4214: function(e, t) { "use strict"; t.__esModule = !0, t.default = void 0; - var r = [ - 1, - 1, - 0 - ], n = function(e, t) { - var n = ("" + t).split(" "); + var r = function(e, t) { + var r = ("" + t).split(" "); return { - flexGrow: n[0] || r[0], - flexShrink: n[1] || r[1], - flexBasis: n[2] || r[2] + flexGrow: r[0] || 1, + flexShrink: r[1] || 1, + flexBasis: r[2] || 0 }; }; - t.default = n; + t.default = r; }, 9214: function(e, t, r) { "use strict"; diff --git a/crates/swc_ecma_minifier/tests/fixture/next/syncfusion/933-e9f9a6bf671b96fc/output.js b/crates/swc_ecma_minifier/tests/fixture/next/syncfusion/933-e9f9a6bf671b96fc/output.js index 673c22305e66..1d675e531988 100644 --- a/crates/swc_ecma_minifier/tests/fixture/next/syncfusion/933-e9f9a6bf671b96fc/output.js +++ b/crates/swc_ecma_minifier/tests/fixture/next/syncfusion/933-e9f9a6bf671b96fc/output.js @@ -2415,13 +2415,7 @@ ls: 'maximumSignificantDigits', mf: 'minimumFractionDigits', lf: 'maximumFractionDigits' - }, mapper = [ - 'infinity', - 'nan', - 'group', - 'decimal', - 'exponential' - ], NumberFormat = function() { + }, NumberFormat = function() { function NumberFormat() {} return NumberFormat.numberFormatter = function(culture, option, cldr) { var symbolPattern, _this = this, fOptions = util_extend({}, option), cOptions = {}, dOptions = {}, dependable = intl_base_IntlBase.getDependables(cldr, culture, '', !0); @@ -2431,7 +2425,7 @@ else { util_extend(fOptions, intl_base_IntlBase.getProperNumericSkeleton(option.format || 'N')), fOptions.isCurrency = 'currency' === fOptions.type, fOptions.isPercent = 'percent' === fOptions.type, symbolPattern = intl_base_IntlBase.getSymbolPattern(fOptions.type, dOptions.numberMapper.numberSystem, dependable.numericObject, fOptions.isAccount), fOptions.groupOne = this.checkValueRange(fOptions.maximumSignificantDigits, fOptions.minimumSignificantDigits, !0), this.checkValueRange(fOptions.maximumFractionDigits, fOptions.minimumFractionDigits, !1, !0), util_isUndefined(fOptions.fractionDigits) || (fOptions.minimumFractionDigits = fOptions.maximumFractionDigits = fOptions.fractionDigits), util_isUndefined(fOptions.useGrouping) && (fOptions.useGrouping = !0), fOptions.isCurrency && (symbolPattern = symbolPattern.replace(/\u00A4/g, intl_base_IntlBase.defaultCurrency)); var split = symbolPattern.split(';'); - if (cOptions.nData = intl_base_IntlBase.getFormatData(split[1] || '-' + split[0], !0, dOptions.currencySymbol), cOptions.pData = intl_base_IntlBase.getFormatData(split[0], !1, dOptions.currencySymbol), fOptions.useGrouping && (fOptions.groupSeparator = symbols[mapper[2]], fOptions.groupData = this.getGroupingDetails(split[0])), util_isUndefined(fOptions.minimumFractionDigits) && (fOptions.minimumFractionDigits = cOptions.nData.minimumFraction), util_isUndefined(fOptions.maximumFractionDigits)) { + if (cOptions.nData = intl_base_IntlBase.getFormatData(split[1] || '-' + split[0], !0, dOptions.currencySymbol), cOptions.pData = intl_base_IntlBase.getFormatData(split[0], !1, dOptions.currencySymbol), fOptions.useGrouping && (fOptions.groupSeparator = symbols.group, fOptions.groupData = this.getGroupingDetails(split[0])), util_isUndefined(fOptions.minimumFractionDigits) && (fOptions.minimumFractionDigits = cOptions.nData.minimumFraction), util_isUndefined(fOptions.maximumFractionDigits)) { var mval = cOptions.nData.maximumFraction; fOptions.maximumFractionDigits = util_isUndefined(mval) && fOptions.isPercent ? 0 : mval; } @@ -2439,7 +2433,7 @@ util_isUndefined(mfrac) || util_isUndefined(lfrac) || !(mfrac > lfrac) || (fOptions.maximumFractionDigits = mfrac); } return util_extend(cOptions.nData, fOptions), util_extend(cOptions.pData, fOptions), function(value) { - return isNaN(value) ? symbols[mapper[1]] : isFinite(value) ? _this.intNumberFormatter(value, cOptions, dOptions) : symbols[mapper[0]]; + return isNaN(value) ? symbols.nan : isFinite(value) ? _this.intNumberFormatter(value, cOptions, dOptions) : symbols.infinity; }; }, NumberFormat.getGroupingDetails = function(pattern) { var ret = {}, match = pattern.match(intl_base_IntlBase.negativeDataRegex); @@ -2473,7 +2467,7 @@ if (!util_isUndefined(fOptions.nData.type)) { value < 0 ? (value *= -1, curData = fOptions.nData) : curData = 0 === value && fOptions.zeroData || fOptions.pData; var curData, fValue = ''; - return (curData.isPercent && (value *= 100), curData.groupOne ? fValue = this.processSignificantDigits(value, curData.minimumSignificantDigits, curData.maximumSignificantDigits) : (fValue = this.processFraction(value, curData.minimumFractionDigits, curData.maximumFractionDigits), curData.minimumIntegerDigits && (fValue = this.processMinimumIntegers(fValue, curData.minimumIntegerDigits))), 'scientific' === curData.type && (fValue = (fValue = value.toExponential(curData.maximumFractionDigits)).replace('e', dOptions.numberMapper.numberSymbols[mapper[4]])), fValue = fValue.replace('.', dOptions.numberMapper.numberSymbols[mapper[3]]), curData.useGrouping && (fValue = this.groupNumbers(fValue, curData.groupData.primary, curData.groupSeparator || ',', dOptions.numberMapper.numberSymbols[mapper[3]] || '.', curData.groupData.secondary)), fValue = ParserBase.convertValueParts(fValue, intl_base_IntlBase.latnParseRegex, dOptions.numberMapper.mapper), 'N/A' === curData.nlead) ? curData.nlead : curData.nlead + fValue + curData.nend; + return (curData.isPercent && (value *= 100), curData.groupOne ? fValue = this.processSignificantDigits(value, curData.minimumSignificantDigits, curData.maximumSignificantDigits) : (fValue = this.processFraction(value, curData.minimumFractionDigits, curData.maximumFractionDigits), curData.minimumIntegerDigits && (fValue = this.processMinimumIntegers(fValue, curData.minimumIntegerDigits))), 'scientific' === curData.type && (fValue = (fValue = value.toExponential(curData.maximumFractionDigits)).replace('e', dOptions.numberMapper.numberSymbols.exponential)), fValue = fValue.replace('.', dOptions.numberMapper.numberSymbols.decimal), curData.useGrouping && (fValue = this.groupNumbers(fValue, curData.groupData.primary, curData.groupSeparator || ',', dOptions.numberMapper.numberSymbols.decimal || '.', curData.groupData.secondary)), fValue = ParserBase.convertValueParts(fValue, intl_base_IntlBase.latnParseRegex, dOptions.numberMapper.mapper), 'N/A' === curData.nlead) ? curData.nlead : curData.nlead + fValue + curData.nend; } }, NumberFormat.processSignificantDigits = function(value, min, max) { var temp = value + ''; @@ -2660,16 +2654,13 @@ var value = this.internalNumberParser(ival, num); return flag ? -value : value; }, DateParser; - }(), parseRegex = /^([^0-9]*)(([0-9,]*[0-9]+)(\.[0-9]+)?)([Ee][+-]?[0-9]+)?([^0-9]*)$/, groupRegex = /,/g, keys = [ - 'minusSign', - 'infinity' - ], NumberParser = function() { + }(), parseRegex = /^([^0-9]*)(([0-9,]*[0-9]+)(\.[0-9]+)?)([Ee][+-]?[0-9]+)?([^0-9]*)$/, groupRegex = /,/g, NumberParser = function() { function NumberParser() {} return NumberParser.numberParser = function(culture, option, cldr) { var numOptions, symbolpattern, _this = this, dependable = intl_base_IntlBase.getDependables(cldr, culture, '', !0), parseOptions = { custom: !0 }; - if (intl_base_IntlBase.formatRegex.test(option.format) || !option.format ? (util_extend(parseOptions, intl_base_IntlBase.getProperNumericSkeleton(option.format || 'N')), parseOptions.custom = !1, !parseOptions.fractionDigits && option.maximumFractionDigits && (parseOptions.maximumFractionDigits = option.maximumFractionDigits)) : util_extend(parseOptions, intl_base_IntlBase.customFormat(option.format, null, null)), util_getValue('numbers', dependable.parserObject), numOptions = ParserBase.getCurrentNumericOptions(dependable.parserObject, ParserBase.getNumberingSystem(cldr), !0, !1), parseOptions.symbolRegex = ParserBase.getSymbolRegex(Object.keys(numOptions.symbolMatch)), parseOptions.infinity = numOptions.symbolNumberSystem[keys[1]], symbolpattern = intl_base_IntlBase.getSymbolPattern(parseOptions.type, numOptions.numberSystem, dependable.numericObject, parseOptions.isAccount)) { + if (intl_base_IntlBase.formatRegex.test(option.format) || !option.format ? (util_extend(parseOptions, intl_base_IntlBase.getProperNumericSkeleton(option.format || 'N')), parseOptions.custom = !1, !parseOptions.fractionDigits && option.maximumFractionDigits && (parseOptions.maximumFractionDigits = option.maximumFractionDigits)) : util_extend(parseOptions, intl_base_IntlBase.customFormat(option.format, null, null)), util_getValue('numbers', dependable.parserObject), numOptions = ParserBase.getCurrentNumericOptions(dependable.parserObject, ParserBase.getNumberingSystem(cldr), !0, !1), parseOptions.symbolRegex = ParserBase.getSymbolRegex(Object.keys(numOptions.symbolMatch)), parseOptions.infinity = numOptions.symbolNumberSystem.infinity, symbolpattern = intl_base_IntlBase.getSymbolPattern(parseOptions.type, numOptions.numberSystem, dependable.numericObject, parseOptions.isAccount)) { var split = (symbolpattern = symbolpattern.replace(/\u00A4/g, intl_base_IntlBase.defaultCurrency)).split(';'); parseOptions.nData = intl_base_IntlBase.getFormatData(split[1] || '-' + split[0], !0, ''), parseOptions.pData = intl_base_IntlBase.getFormatData(split[0], !0, ''); } @@ -2777,10 +2768,7 @@ for(var _i = 0; _i < boundedEvents.length; _i++)if (boundedEvents[_i].handler === handler) return !0; return !1; }, Observer; - }(), onIntlChange = new Observer(), cldrData = {}, defaultCulture = 'en-US', defaultCurrencyCode = 'USD', internationalization_mapper = [ - 'numericObject', - 'dateObject' - ], Internationalization = function() { + }(), onIntlChange = new Observer(), cldrData = {}, defaultCulture = 'en-US', defaultCurrencyCode = 'USD', Internationalization = function() { function Internationalization(cultureName) { cultureName && (this.culture = cultureName); } @@ -2819,7 +2807,7 @@ }, Internationalization; }(); function getNumericObject(locale, type) { - var numObject = intl_base_IntlBase.getDependables(cldrData, locale, '', !0)[internationalization_mapper[0]], dateObject = intl_base_IntlBase.getDependables(cldrData, locale, '')[internationalization_mapper[1]], numSystem = util_getValue('defaultNumberingSystem', numObject), symbPattern = util_getValue('symbols-numberSystem-' + numSystem, numObject), pattern = intl_base_IntlBase.getSymbolPattern(type || 'decimal', numSystem, numObject, !1); + var numObject = intl_base_IntlBase.getDependables(cldrData, locale, '', !0).numericObject, dateObject = intl_base_IntlBase.getDependables(cldrData, locale, '').dateObject, numSystem = util_getValue('defaultNumberingSystem', numObject), symbPattern = util_getValue('symbols-numberSystem-' + numSystem, numObject), pattern = intl_base_IntlBase.getSymbolPattern(type || 'decimal', numSystem, numObject, !1); return util_extend(symbPattern, intl_base_IntlBase.getFormatData(pattern, !0, '', !0), { dateSeparator: intl_base_IntlBase.getDateSeparator(dateObject) }); @@ -2849,12 +2837,7 @@ IntlBase.negativeDataRegex = /^(('[^']+'|''|[^*#@0,.E])*)(\*.)?((([#,]*[0,]*0+)(\.0*[0-9]*#*)?)|([#,]*@+#*))(E\+?0+)?(('[^']+'|''|[^*#@0,.E])*)$/, IntlBase.customRegex = /^(('[^']+'|''|[^*#@0,.])*)(\*.)?((([0#,]*[0,]*[0#]*[0#\ ]*)(\.[0#]*)?)|([#,]*@+#*))(E\+?0+)?(('[^']+'|''|[^*#@0,.E])*)$/, IntlBase.latnParseRegex = /0|1|2|3|4|5|6|7|8|9/g; var fractionRegex = /[0-9]/g; IntlBase.defaultCurrency = '$'; - var mapper = [ - 'infinity', - 'nan', - 'group', - 'decimal' - ], patternRegex = /G|M|L|H|c|'| a|yy|y|EEEE|E/g, patternMatch = { + var patternRegex = /G|M|L|H|c|'| a|yy|y|EEEE|E/g, patternMatch = { G: '', M: 'm', L: 'm', @@ -2964,7 +2947,7 @@ cOptions.nend ], '%', dOptions.percentSymbol))), !util_isNullOrUndefined(numObject)) { var symbolPattern = getSymbolPattern(cOptions.type, dOptions.numberMapper.numberSystem, numObject, !1); - cOptions.useGrouping && (cOptions.groupSeparator = spaceGrouping ? ' ' : dOptions.numberMapper.numberSymbols[mapper[2]], cOptions.groupData = NumberFormat.getGroupingDetails(symbolPattern.split(';')[0])), cOptions.nlead = cOptions.nlead.replace(/'/g, ''), cOptions.nend = spaceCapture ? ' ' + cOptions.nend.replace(/'/g, '') : cOptions.nend.replace(/'/g, ''); + cOptions.useGrouping && (cOptions.groupSeparator = spaceGrouping ? ' ' : dOptions.numberMapper.numberSymbols.group, cOptions.groupData = NumberFormat.getGroupingDetails(symbolPattern.split(';')[0])), cOptions.nlead = cOptions.nlead.replace(/'/g, ''), cOptions.nend = spaceCapture ? ' ' + cOptions.nend.replace(/'/g, '') : cOptions.nend.replace(/'/g, ''); } return cOptions; } @@ -5473,17 +5456,14 @@ var newX = pnt.clientX, newY = pnt.clientY, newT = Date.now(), xDist = newX - this.startPoint.clientX, yDist = newY - this.startPoint.clientX; return Math.sqrt(xDist * xDist + yDist * yDist) / (newT - this.tStampStart); }, Touch.prototype.checkSwipe = function(ele, flag) { - var keys = [ - 'scroll', - 'offset' - ], temp = flag ? [ + var temp = flag ? [ 'Height', 'Top' ] : [ 'Width', 'Left' ]; - return ele[keys[0] + temp[0]] <= ele[keys[1] + temp[0]] || 0 === ele[keys[0] + temp[1]] || ele[keys[1] + temp[0]] + ele[keys[0] + temp[1]] >= ele[keys[0] + temp[0]]; + return ele['scroll' + temp[0]] <= ele['offset' + temp[0]] || 0 === ele['scroll' + temp[1]] || ele['offset' + temp[0]] + ele['scroll' + temp[1]] >= ele['scroll' + temp[0]]; }, Touch.prototype.updateChangeTouches = function(evt) { return evt.changedTouches && 0 !== evt.changedTouches.length ? evt.changedTouches[0] : evt; }, touch_decorate([ diff --git a/crates/swc_ecma_minifier/tests/passing.txt b/crates/swc_ecma_minifier/tests/passing.txt index 08ffe567a915..aa3903511fe5 100644 --- a/crates/swc_ecma_minifier/tests/passing.txt +++ b/crates/swc_ecma_minifier/tests/passing.txt @@ -12,6 +12,7 @@ arguments/replace_index_keep_fargs_strict/input.js arguments/replace_index_strict/input.js array_constructor/array_constructor/input.js arrays/holes_and_undefined/input.js +arrays/index/input.js arrays/length/input.js arrays/spread_with_array_at_end/input.js arrays/spread_with_logical_expression_at_end/input.js diff --git a/crates/swc_ecma_minifier/tests/single-pass/1/output.js b/crates/swc_ecma_minifier/tests/single-pass/1/output.js index 776aeb157ca9..044920070c42 100644 --- a/crates/swc_ecma_minifier/tests/single-pass/1/output.js +++ b/crates/swc_ecma_minifier/tests/single-pass/1/output.js @@ -6,4 +6,4 @@ var condString, exprAny1, exprBoolean1, exprNumber1, exprString1, exprIsObject1, "2", "3" ]; -condString.toUpperCase, foo(), array[1], foo(), condString.toUpperCase, foo(), array[1], condString.toUpperCase; +condString.toUpperCase, foo(), foo(), condString.toUpperCase, foo(), condString.toUpperCase; diff --git a/crates/swc_ecma_minifier/tests/terser/compress/reduce_vars/named_function_with_recursive_ref_reuse/output.js b/crates/swc_ecma_minifier/tests/terser/compress/reduce_vars/named_function_with_recursive_ref_reuse/output.js index 676290ce7eb4..a5014a045d26 100644 --- a/crates/swc_ecma_minifier/tests/terser/compress/reduce_vars/named_function_with_recursive_ref_reuse/output.js +++ b/crates/swc_ecma_minifier/tests/terser/compress/reduce_vars/named_function_with_recursive_ref_reuse/output.js @@ -2,5 +2,8 @@ var result = []; var do_not_inline = function foo() { result.push(foo); }; -[0, 1].map(() => do_not_inline()); +[ + 0, + 1 +].map(()=>do_not_inline()); console.log(result[0] === result[1]);