Skip to content

Commit df09d2f

Browse files
authoredMar 20, 2023
feat(css/minifier) Follow the CSS spec more rigorously (#6291)
**Description:** Full refactor of the "calc" simplification to be more compliant with the spec.
1 parent f40175b commit df09d2f

File tree

18 files changed

+1183
-959
lines changed

18 files changed

+1183
-959
lines changed
 

‎crates/swc_css_minifier/src/compressor/calc_sum.rs

+1,059-822
Large diffs are not rendered by default.

‎crates/swc_css_minifier/src/compressor/mod.rs

-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ mod supports;
2525
mod time;
2626
mod transform_function;
2727
mod unicode_range;
28-
mod unit;
2928
mod url;
3029

3130
pub fn compressor() -> impl VisitMut {

‎crates/swc_css_minifier/src/compressor/unit/mod.rs

-122
This file was deleted.

‎crates/swc_css_minifier/tests/fixture/compress-calc/add-sub/output.min.css

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
@container(inline-size>=200px){h2{font-size:calc(1.2em + 1cqi)}}
1+
@container(inline-size>=200px){h2{font-size:calc(1cqi + 1.2em)}}

‎crates/swc_css_minifier/tests/fixture/compress-calc/convert-units/input.css

+110
Original file line numberDiff line numberDiff line change
@@ -85,3 +85,113 @@
8585
.class22 {
8686
width: calc(1px + 2unknown);
8787
}
88+
89+
.class23 {
90+
width: calc(1hz + 1khz);
91+
}
92+
93+
.class24 {
94+
width: calc(1khz + 1hz);
95+
}
96+
97+
.class25 {
98+
width: calc(1ms + 1s);
99+
}
100+
101+
.class26 {
102+
width: calc(1ms + 1s);
103+
}
104+
105+
.class27 {
106+
width: calc(1dppx + 1x);
107+
}
108+
109+
.class28 {
110+
width: calc(1x + 1dppx);
111+
}
112+
113+
.class29 {
114+
width: calc(1x + 96dpi);
115+
}
116+
117+
.class30 {
118+
width: calc(96dpi + 1x);
119+
}
120+
121+
.class31 {
122+
width: calc(1dppx + 96dpi);
123+
}
124+
125+
.class32 {
126+
width: calc(96dpi + 1dppx);
127+
}
128+
129+
.class33 {
130+
width: calc(1dpcm + 1dpi);
131+
}
132+
133+
.class34 {
134+
width: calc(1dpcm + 1dpi);
135+
}
136+
137+
.class35 {
138+
width: calc(1cm + 1mm);
139+
}
140+
141+
.class36 {
142+
width: calc(1mm + 1cm);
143+
}
144+
145+
.class37 {
146+
width: calc(1mm + 1q);
147+
}
148+
149+
.class38 {
150+
width: calc(1q + 1mm);
151+
}
152+
153+
.class39 {
154+
width: calc(1cm + 1q);
155+
}
156+
157+
.class40 {
158+
width: calc(1q + 1cm);
159+
}
160+
161+
.class39 {
162+
width: calc(1in + 1px);
163+
}
164+
165+
.class40 {
166+
width: calc(1px + 1in);
167+
}
168+
169+
.class41 {
170+
width: calc(1pc + 1in);
171+
}
172+
173+
.class42 {
174+
width: calc(1in + 1pc);
175+
}
176+
177+
.class43 {
178+
width: calc(1pt + 1in);
179+
}
180+
181+
.class44 {
182+
width: calc(1in + 1pt);
183+
}
184+
185+
.class45 {
186+
width: calc(1pt + 1pc);
187+
}
188+
189+
.class46 {
190+
width: calc(1pc + 1pt);
191+
}
192+
.class47 {
193+
width: calc(1px + 1pc);
194+
}
195+
.class48 {
196+
width: calc(1pc + 1px);
197+
}

‎crates/swc_css_minifier/tests/fixture/compress-calc/convert-units/output.min.css

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎crates/swc_css_minifier/tests/fixture/compress-calc/css-variables/output.min.css

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎crates/swc_css_minifier/tests/fixture/compress-calc/discard-zero/output.min.css

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎crates/swc_css_minifier/tests/fixture/compress-calc/divide/output.min.css

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
.class1{width:calc(((var(--a) + 4px)*2)*2)}.class2{width:calc(((var(--a) + 4px)*2)*2 + 4px)}
1+
.class1{width:calc(4*(4px + var(--a)))}.class2{width:calc(4px + 4*(4px + var(--a)))}

‎crates/swc_css_minifier/tests/fixture/compress-calc/nested-calc/output.min.css

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
.class1{width:calc(1/100)}.class2{width:calc(5/1e6)}.class3{width:calc(100%/3*3)}.class4{width:calc(calc(100%/3)*3)}
1+
.class1{width:.01}.class2{width:calc(5*1e-6)}.class3,.class4{width:100%}

‎crates/swc_css_minifier/tests/fixture/compress-calc/simple-calc/output.min.css

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎crates/swc_css_minifier/tests/fixture/compress-calc/units/output.min.css

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
.class1,.class2{width:2px}.class3{width:-webkit-calc(50% - 25px)}.class4{width:-webkit-calc(1px + 2px/2)}.class5,.class6{width:2px}
1+
.class1,.class2{width:2px}.class3{width:-webkit-calc(50% - 25px)}.class4,.class5,.class6{width:2px}

‎crates/swc_css_minifier/tests/fixture/compress-length/output.min.css

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎crates/swc_css_minifier/tests/fixture/packages/bootstrap_5_1_3/output.min.css

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

1 commit comments

Comments
 (1)

github-actions[bot] commented on Mar 20, 2023

@github-actions[bot]

Benchmark

Benchmark suite Current: df09d2f Previous: f250f24 Ratio
es/full/bugs-1 319396 ns/iter (± 10060) 300512 ns/iter (± 11863) 1.06
es/full/minify/libraries/antd 1592776475 ns/iter (± 22602425) 1705588855 ns/iter (± 18051346) 0.93
es/full/minify/libraries/d3 296516679 ns/iter (± 4636608) 315287996 ns/iter (± 8061177) 0.94
es/full/minify/libraries/echarts 1230243899 ns/iter (± 23499962) 1293586893 ns/iter (± 11427579) 0.95
es/full/minify/libraries/jquery 90698995 ns/iter (± 1839172) 92503230 ns/iter (± 1312047) 0.98
es/full/minify/libraries/lodash 106334666 ns/iter (± 2060161) 107386812 ns/iter (± 1329869) 0.99
es/full/minify/libraries/moment 53870388 ns/iter (± 1465590) 53176502 ns/iter (± 714105) 1.01
es/full/minify/libraries/react 19199535 ns/iter (± 231004) 19153802 ns/iter (± 126133) 1.00
es/full/minify/libraries/terser 245698545 ns/iter (± 3439455) 254306316 ns/iter (± 4919178) 0.97
es/full/minify/libraries/three 429433326 ns/iter (± 14241033) 455384083 ns/iter (± 5652383) 0.94
es/full/minify/libraries/typescript 3049298367 ns/iter (± 19744414) 3189235644 ns/iter (± 34640844) 0.96
es/full/minify/libraries/victory 659995108 ns/iter (± 12431567) 727142990 ns/iter (± 18132965) 0.91
es/full/minify/libraries/vue 129657193 ns/iter (± 1943476) 132174193 ns/iter (± 1106806) 0.98
es/full/codegen/es3 26620 ns/iter (± 68) 26477 ns/iter (± 63) 1.01
es/full/codegen/es5 26780 ns/iter (± 40) 26581 ns/iter (± 36) 1.01
es/full/codegen/es2015 26831 ns/iter (± 71) 26579 ns/iter (± 55) 1.01
es/full/codegen/es2016 26812 ns/iter (± 51) 26557 ns/iter (± 500) 1.01
es/full/codegen/es2017 26865 ns/iter (± 139) 26583 ns/iter (± 63) 1.01
es/full/codegen/es2018 26793 ns/iter (± 42) 26590 ns/iter (± 41) 1.01
es/full/codegen/es2019 26861 ns/iter (± 55) 26591 ns/iter (± 37) 1.01
es/full/codegen/es2020 26803 ns/iter (± 42) 26559 ns/iter (± 47) 1.01
es/full/all/es3 184901042 ns/iter (± 4221823) 182297281 ns/iter (± 2924503) 1.01
es/full/all/es5 175276948 ns/iter (± 2043984) 172214499 ns/iter (± 2666148) 1.02
es/full/all/es2015 139341326 ns/iter (± 2592026) 139867101 ns/iter (± 1742989) 1.00
es/full/all/es2016 135134056 ns/iter (± 2199212) 134116321 ns/iter (± 3223084) 1.01
es/full/all/es2017 134883310 ns/iter (± 1492464) 136852410 ns/iter (± 1770382) 0.99
es/full/all/es2018 129662613 ns/iter (± 4017272) 133292888 ns/iter (± 2310809) 0.97
es/full/all/es2019 127967465 ns/iter (± 1700295) 129933489 ns/iter (± 1617752) 0.98
es/full/all/es2020 120712735 ns/iter (± 2148233) 119688435 ns/iter (± 901777) 1.01
es/full/parser 541013 ns/iter (± 7953) 542767 ns/iter (± 11948) 1.00
es/full/base/fixer 22308 ns/iter (± 48) 22396 ns/iter (± 56) 1.00
es/full/base/resolver_and_hygiene 82195 ns/iter (± 65) 82545 ns/iter (± 93) 1.00
serialization of ast node 124 ns/iter (± 0) 124 ns/iter (± 0) 1
serialization of serde 126 ns/iter (± 0) 126 ns/iter (± 0) 1
css/minify/libraries/bootstrap 28448216 ns/iter (± 113481) 29827106 ns/iter (± 81997) 0.95
css/visitor/compare/clone 2080982 ns/iter (± 14513) 2141118 ns/iter (± 75686) 0.97
css/visitor/compare/visit_mut_span 2268450 ns/iter (± 5209) 2316981 ns/iter (± 17624) 0.98
css/visitor/compare/visit_mut_span_panic 2325666 ns/iter (± 10961) 2377107 ns/iter (± 11450) 0.98
css/visitor/compare/fold_span 3076964 ns/iter (± 17655) 3140638 ns/iter (± 27346) 0.98
css/visitor/compare/fold_span_panic 3206644 ns/iter (± 17966) 3407327 ns/iter (± 46010) 0.94
css/lexer/bootstrap_5_1_3 5112085 ns/iter (± 17439) 5121666 ns/iter (± 17682) 1.00
css/lexer/foundation_6_7_4 4304774 ns/iter (± 27869) 4312587 ns/iter (± 2913) 1.00
css/lexer/tailwind_3_1_1 817981 ns/iter (± 291) 818388 ns/iter (± 399) 1.00
css/parser/bootstrap_5_1_3 22041932 ns/iter (± 88499) 23085911 ns/iter (± 110072) 0.95
css/parser/foundation_6_7_4 17615931 ns/iter (± 29695) 18261217 ns/iter (± 74463) 0.96
css/parser/tailwind_3_1_1 3390251 ns/iter (± 2849) 3353004 ns/iter (± 3851) 1.01
es/codegen/colors 328421 ns/iter (± 183823) 321446 ns/iter (± 179682) 1.02
es/codegen/large 1178693 ns/iter (± 599923) 1173097 ns/iter (± 605096) 1.00
es/codegen/with-parser/colors 48055 ns/iter (± 397) 47934 ns/iter (± 465) 1.00
es/codegen/with-parser/large 526267 ns/iter (± 1089) 521836 ns/iter (± 1126) 1.01
es/minify/libraries/antd 1415147944 ns/iter (± 30681307) 1560731427 ns/iter (± 14605578) 0.91
es/minify/libraries/d3 256764005 ns/iter (± 5689038) 289558423 ns/iter (± 3032214) 0.89
es/minify/libraries/echarts 1032814837 ns/iter (± 19800835) 1182561910 ns/iter (± 5646564) 0.87
es/minify/libraries/jquery 78570946 ns/iter (± 1140719) 85754137 ns/iter (± 1370167) 0.92
es/minify/libraries/lodash 95205599 ns/iter (± 1548471) 100613050 ns/iter (± 1257598) 0.95
es/minify/libraries/moment 46194047 ns/iter (± 1550389) 48236380 ns/iter (± 794966) 0.96
es/minify/libraries/react 17199361 ns/iter (± 308644) 17322161 ns/iter (± 119085) 0.99
es/minify/libraries/terser 207049579 ns/iter (± 3393463) 219390830 ns/iter (± 2566634) 0.94
es/minify/libraries/three 356480454 ns/iter (± 7416499) 373565899 ns/iter (± 5225472) 0.95
es/minify/libraries/typescript 2579816418 ns/iter (± 23846794) 2728810021 ns/iter (± 44815615) 0.95
es/minify/libraries/victory 559799962 ns/iter (± 22863968) 629527886 ns/iter (± 22041619) 0.89
es/minify/libraries/vue 114811511 ns/iter (± 3040566) 123818286 ns/iter (± 4439200) 0.93
es/visitor/compare/clone 2314766 ns/iter (± 9580) 2300131 ns/iter (± 23938) 1.01
es/visitor/compare/visit_mut_span 2673673 ns/iter (± 4438) 2685831 ns/iter (± 7989) 1.00
es/visitor/compare/visit_mut_span_panic 2703952 ns/iter (± 4945) 2722563 ns/iter (± 9523) 0.99
es/visitor/compare/fold_span 3768369 ns/iter (± 3831) 3829251 ns/iter (± 23095) 0.98
es/visitor/compare/fold_span_panic 3948651 ns/iter (± 5306) 3950020 ns/iter (± 31361) 1.00
es/lexer/colors 15462 ns/iter (± 92) 15401 ns/iter (± 70) 1.00
es/lexer/angular 7425642 ns/iter (± 4267) 7499064 ns/iter (± 18944) 0.99
es/lexer/backbone 988848 ns/iter (± 335) 1002237 ns/iter (± 314) 0.99
es/lexer/jquery 5573328 ns/iter (± 4624) 5624505 ns/iter (± 1341) 0.99
es/lexer/jquery mobile 8556756 ns/iter (± 3389) 8665126 ns/iter (± 8242) 0.99
es/lexer/mootools 4420926 ns/iter (± 2746) 4468543 ns/iter (± 46305) 0.99
es/lexer/underscore 831550 ns/iter (± 204) 841329 ns/iter (± 544) 0.99
es/lexer/three 26232093 ns/iter (± 19901) 26529677 ns/iter (± 22190) 0.99
es/lexer/yui 4669679 ns/iter (± 1637) 4699013 ns/iter (± 3234) 0.99
es/parser/colors 29662 ns/iter (± 116) 29694 ns/iter (± 141) 1.00
es/parser/angular 15384246 ns/iter (± 114616) 16130156 ns/iter (± 284551) 0.95
es/parser/backbone 2235444 ns/iter (± 13095) 2249039 ns/iter (± 12576) 0.99
es/parser/jquery 12174108 ns/iter (± 88296) 12417204 ns/iter (± 156561) 0.98
es/parser/jquery mobile 18989133 ns/iter (± 189279) 20984515 ns/iter (± 710675) 0.90
es/parser/mootools 9275336 ns/iter (± 299442) 9338383 ns/iter (± 121562) 0.99
es/parser/underscore 1892031 ns/iter (± 11579) 1908392 ns/iter (± 10970) 0.99
es/parser/three 53900922 ns/iter (± 1452238) 58078718 ns/iter (± 239020) 0.93
es/parser/yui 9260180 ns/iter (± 63216) 9409410 ns/iter (± 108847) 0.98
es/preset-env/usage/builtin_type 139387 ns/iter (± 32960) 144755 ns/iter (± 35839) 0.96
es/preset-env/usage/property 21182 ns/iter (± 110) 21435 ns/iter (± 102) 0.99
es/resolver/typescript 123076751 ns/iter (± 3342139) 124941206 ns/iter (± 2944315) 0.99
es/fixer/typescript 86041578 ns/iter (± 1018269) 88878927 ns/iter (± 2271320) 0.97
es/hygiene/typescript 183534235 ns/iter (± 4542558) 187118528 ns/iter (± 1580451) 0.98
es/resolver_with_hygiene/typescript 331161660 ns/iter (± 2608594) 335507379 ns/iter (± 2020109) 0.99
es/visitor/base-perf/module_clone 78858 ns/iter (± 824) 80558 ns/iter (± 1265) 0.98
es/visitor/base-perf/fold_empty 88916 ns/iter (± 692) 88967 ns/iter (± 1380) 1.00
es/visitor/base-perf/fold_noop_impl_all 89959 ns/iter (± 868) 89516 ns/iter (± 1850) 1.00
es/visitor/base-perf/fold_noop_impl_vec 91622 ns/iter (± 797) 89844 ns/iter (± 1635) 1.02
es/visitor/base-perf/boxing_boxed_clone 56 ns/iter (± 0) 56 ns/iter (± 0) 1
es/visitor/base-perf/boxing_unboxed_clone 54 ns/iter (± 0) 53 ns/iter (± 0) 1.02
es/visitor/base-perf/boxing_boxed 102 ns/iter (± 0) 101 ns/iter (± 0) 1.01
es/visitor/base-perf/boxing_unboxed 98 ns/iter (± 0) 96 ns/iter (± 0) 1.02
es/visitor/base-perf/visit_contains_this 3467 ns/iter (± 54) 3278 ns/iter (± 64) 1.06
es/base/parallel/resolver/typescript 6815801112 ns/iter (± 359212662) 6664488762 ns/iter (± 407125478) 1.02
es/base/parallel/hygiene/typescript 2188195566 ns/iter (± 18953061) 2136286658 ns/iter (± 22735351) 1.02
misc/visitors/time-complexity/time 5 98 ns/iter (± 0) 89 ns/iter (± 1) 1.10
misc/visitors/time-complexity/time 10 321 ns/iter (± 0) 303 ns/iter (± 6) 1.06
misc/visitors/time-complexity/time 15 670 ns/iter (± 4) 576 ns/iter (± 5) 1.16
misc/visitors/time-complexity/time 20 1256 ns/iter (± 0) 1106 ns/iter (± 11) 1.14
misc/visitors/time-complexity/time 40 6774 ns/iter (± 33) 5979 ns/iter (± 102) 1.13
misc/visitors/time-complexity/time 60 17298 ns/iter (± 27) 15156 ns/iter (± 56) 1.14
es/full-target/es2016 249974 ns/iter (± 434) 246778 ns/iter (± 4882) 1.01
es/full-target/es2017 242265 ns/iter (± 417) 232452 ns/iter (± 1720) 1.04
es/full-target/es2018 231817 ns/iter (± 499) 220973 ns/iter (± 1002) 1.05
es2020_nullish_coalescing 91824 ns/iter (± 418) 86875 ns/iter (± 807) 1.06
es2020_optional_chaining 124727 ns/iter (± 514) 117849 ns/iter (± 1131) 1.06
es2022_class_properties 147529 ns/iter (± 280) 140251 ns/iter (± 1350) 1.05
es2018_object_rest_spread 95475 ns/iter (± 220) 91138 ns/iter (± 1579) 1.05
es2019_optional_catch_binding 84896 ns/iter (± 487) 79868 ns/iter (± 444) 1.06
es2017_async_to_generator 84952 ns/iter (± 204) 80409 ns/iter (± 447) 1.06
es2016_exponentiation 89375 ns/iter (± 208) 84252 ns/iter (± 353) 1.06
es2015_arrow 93654 ns/iter (± 239) 88655 ns/iter (± 789) 1.06
es2015_block_scoped_fn 91461 ns/iter (± 371) 86369 ns/iter (± 604) 1.06
es2015_block_scoping 169570 ns/iter (± 326) 159704 ns/iter (± 966) 1.06

This comment was automatically generated by workflow using github-action-benchmark.

Please sign in to comment.