Skip to content

Commit

Permalink
fix(es/minifier): Preserve cooked while compressing template litera…
Browse files Browse the repository at this point in the history
…ls (#7773)

**Related issue:**

 - Closes #7770
  • Loading branch information
kdy1 committed Aug 17, 2023
1 parent 05200ad commit 05990a9
Show file tree
Hide file tree
Showing 5 changed files with 71 additions and 5 deletions.
19 changes: 14 additions & 5 deletions crates/swc_ecma_minifier/src/compress/pure/strings.rs
Original file line number Diff line number Diff line change
Expand Up @@ -240,7 +240,7 @@ impl Pure<'_> {
let mut quasis = vec![];
let mut exprs = vec![];
let mut cur_raw = String::new();
let mut cur_cooked = String::new();
let mut cur_cooked = Some(String::new());

for i in 0..(tpl.exprs.len() + tpl.quasis.len()) {
if i % 2 == 0 {
Expand All @@ -249,7 +249,13 @@ impl Pure<'_> {

cur_raw.push_str(&q.raw);
if let Some(cooked) = q.cooked {
cur_cooked.push_str(&cooked);
if let Some(cur_cooked) = &mut cur_cooked {
cur_cooked.push_str(&cooked);
}
} else {
// If cooked is None, it means that the template literal contains invalid escape
// sequences.
cur_cooked = None;
}
} else {
let i = i / 2;
Expand All @@ -258,15 +264,18 @@ impl Pure<'_> {
match *e {
Expr::Lit(Lit::Str(s)) => {
cur_raw.push_str(&convert_str_value_to_tpl_raw(&s.value));
cur_cooked.push_str(&convert_str_value_to_tpl_cooked(&s.value));
if let Some(cur_cooked) = &mut cur_cooked {
cur_cooked.push_str(&convert_str_value_to_tpl_cooked(&s.value));
}
}
_ => {
quasis.push(TplElement {
span: DUMMY_SP,
tail: true,
cooked: Some(Atom::from(&*cur_cooked)),
cooked: cur_cooked.take().map(From::from),
raw: take(&mut cur_raw).into(),
});
cur_cooked = Some(String::new());

exprs.push(e);
}
Expand All @@ -279,7 +288,7 @@ impl Pure<'_> {
quasis.push(TplElement {
span: DUMMY_SP,
tail: true,
cooked: None,
cooked: cur_cooked.map(From::from),
raw: cur_raw.into(),
});

Expand Down
13 changes: 13 additions & 0 deletions crates/swc_ecma_minifier/tests/fixture/issues/7770/1/input.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
exports.MainCSS1 = foo`
\x<-invalid, so no cooked
${'this breaks splits the quasis'}
this should have a cooked
`;
exports.MainCSS2 = foo`
\x<-invalid, so no cooked
${'this breaks splits the quasis'}
this should have a cooked
${'this breaks splits the quasis'}
this should also have a cooked
`;
11 changes: 11 additions & 0 deletions crates/swc_ecma_minifier/tests/fixture/issues/7770/1/output.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
exports.MainCSS1 = foo`
\x<-invalid, so no cooked
${'this breaks splits the quasis'}
this should have a cooked
`, exports.MainCSS2 = foo`
\x<-invalid, so no cooked
${'this breaks splits the quasis'}
this should have a cooked
${'this breaks splits the quasis'}
this should also have a cooked
`;
20 changes: 20 additions & 0 deletions crates/swc_ecma_minifier/tests/fixture/issues/7770/2/input.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
const sWidth = "asdasd";
function absolute() {
return `
`;
}
function flex() {
return `
`;
}
exports.MainCSS = `
.ThisshouldOnlyBeonTop {
${absolute()}
}
.abcBlablaOne .asdsad {
${flex()}
}
.aasdasdasd .asdsada {
we: ${sWidth} !important;
}
`;
13 changes: 13 additions & 0 deletions crates/swc_ecma_minifier/tests/fixture/issues/7770/2/output.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
exports.MainCSS = `
.ThisshouldOnlyBeonTop {
}
.abcBlablaOne .asdsad {
}
.aasdasdasd .asdsada {
we: asdasd !important;
}
`;

1 comment on commit 05990a9

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark

Benchmark suite Current: 05990a9 Previous: 3766a7c Ratio
es/full/bugs-1 292142 ns/iter (± 7667) 286839 ns/iter (± 4443) 1.02
es/full/minify/libraries/antd 1462453404 ns/iter (± 19299243) 1329731362 ns/iter (± 11252319) 1.10
es/full/minify/libraries/d3 304000041 ns/iter (± 4682457) 282376631 ns/iter (± 3658050) 1.08
es/full/minify/libraries/echarts 1129253951 ns/iter (± 12824764) 1062696736 ns/iter (± 11457907) 1.06
es/full/minify/libraries/jquery 86949177 ns/iter (± 307072) 85084248 ns/iter (± 180263) 1.02
es/full/minify/libraries/lodash 100624351 ns/iter (± 2185149) 98819869 ns/iter (± 277500) 1.02
es/full/minify/libraries/moment 51093703 ns/iter (± 185040) 49961158 ns/iter (± 90444) 1.02
es/full/minify/libraries/react 18235835 ns/iter (± 156538) 18057998 ns/iter (± 18926) 1.01
es/full/minify/libraries/terser 227755386 ns/iter (± 1539678) 219592298 ns/iter (± 856112) 1.04
es/full/minify/libraries/three 406187871 ns/iter (± 3669768) 384714725 ns/iter (± 2058930) 1.06
es/full/minify/libraries/typescript 2805000332 ns/iter (± 21684575) 2672267565 ns/iter (± 10841699) 1.05
es/full/minify/libraries/victory 606003738 ns/iter (± 7153622) 580117099 ns/iter (± 5730054) 1.04
es/full/minify/libraries/vue 123632212 ns/iter (± 712488) 120860051 ns/iter (± 668720) 1.02
es/full/codegen/es3 34039 ns/iter (± 167) 34549 ns/iter (± 47) 0.99
es/full/codegen/es5 34007 ns/iter (± 117) 34531 ns/iter (± 138) 0.98
es/full/codegen/es2015 34155 ns/iter (± 219) 34480 ns/iter (± 128) 0.99
es/full/codegen/es2016 34292 ns/iter (± 119) 34450 ns/iter (± 95) 1.00
es/full/codegen/es2017 33967 ns/iter (± 164) 34542 ns/iter (± 63) 0.98
es/full/codegen/es2018 34227 ns/iter (± 100) 34374 ns/iter (± 124) 1.00
es/full/codegen/es2019 34222 ns/iter (± 143) 34529 ns/iter (± 126) 0.99
es/full/codegen/es2020 34249 ns/iter (± 147) 34499 ns/iter (± 107) 0.99
es/full/all/es3 171312128 ns/iter (± 3973609) 166774930 ns/iter (± 1760351) 1.03
es/full/all/es5 160688415 ns/iter (± 619877) 159402412 ns/iter (± 1291786) 1.01
es/full/all/es2015 120424516 ns/iter (± 794392) 119282165 ns/iter (± 1283627) 1.01
es/full/all/es2016 119180808 ns/iter (± 553457) 119158669 ns/iter (± 714347) 1.00
es/full/all/es2017 118910295 ns/iter (± 711627) 118066499 ns/iter (± 818082) 1.01
es/full/all/es2018 116481838 ns/iter (± 933449) 115652690 ns/iter (± 624789) 1.01
es/full/all/es2019 116757737 ns/iter (± 1119356) 115247115 ns/iter (± 691107) 1.01
es/full/all/es2020 111063565 ns/iter (± 714218) 110169684 ns/iter (± 599516) 1.01
es/full/parser 493582 ns/iter (± 6297) 485816 ns/iter (± 4889) 1.02
es/full/base/fixer 18937 ns/iter (± 201) 18627 ns/iter (± 106) 1.02
es/full/base/resolver_and_hygiene 81815 ns/iter (± 126) 79920 ns/iter (± 226) 1.02
serialization of serde 296 ns/iter (± 3) 290 ns/iter (± 0) 1.02
css/minify/libraries/bootstrap 29008115 ns/iter (± 155494) 29465014 ns/iter (± 113581) 0.98
css/visitor/compare/clone 1672464 ns/iter (± 7529) 1839233 ns/iter (± 8121) 0.91
css/visitor/compare/visit_mut_span 1802521 ns/iter (± 2135) 1964988 ns/iter (± 6280) 0.92
css/visitor/compare/visit_mut_span_panic 1861330 ns/iter (± 7829) 2055110 ns/iter (± 5246) 0.91
css/visitor/compare/fold_span 2628009 ns/iter (± 19765) 2907054 ns/iter (± 9569) 0.90
css/visitor/compare/fold_span_panic 2791650 ns/iter (± 13041) 3105780 ns/iter (± 22730) 0.90
css/lexer/bootstrap_5_1_3 4495221 ns/iter (± 9066) 4470285 ns/iter (± 4908) 1.01
css/lexer/foundation_6_7_4 3786589 ns/iter (± 2312) 3769100 ns/iter (± 6213) 1.00
css/lexer/tailwind_3_1_1 721948 ns/iter (± 979) 716660 ns/iter (± 567) 1.01
css/parser/bootstrap_5_1_3 19955592 ns/iter (± 98990) 19256261 ns/iter (± 64404) 1.04
css/parser/foundation_6_7_4 15885479 ns/iter (± 55878) 15466825 ns/iter (± 21061) 1.03
css/parser/tailwind_3_1_1 3030695 ns/iter (± 10663) 2968021 ns/iter (± 3294) 1.02
es/codegen/colors 727216 ns/iter (± 398883) 726474 ns/iter (± 396165) 1.00
es/codegen/large 2934175 ns/iter (± 1606982) 2912785 ns/iter (± 1532892) 1.01
es/codegen/with-parser/colors 45337 ns/iter (± 590) 46281 ns/iter (± 135) 0.98
es/codegen/with-parser/large 488432 ns/iter (± 1630) 488569 ns/iter (± 445) 1.00
es/minify/libraries/antd 1228383395 ns/iter (± 13665869) 1164267533 ns/iter (± 15444887) 1.06
es/minify/libraries/d3 250457823 ns/iter (± 3373177) 243230501 ns/iter (± 992170) 1.03
es/minify/libraries/echarts 986487631 ns/iter (± 7207525) 922787511 ns/iter (± 9527834) 1.07
es/minify/libraries/jquery 75968237 ns/iter (± 274300) 74459515 ns/iter (± 160540) 1.02
es/minify/libraries/lodash 90041367 ns/iter (± 563031) 89136558 ns/iter (± 235944) 1.01
es/minify/libraries/moment 44223422 ns/iter (± 110637) 43934091 ns/iter (± 67386) 1.01
es/minify/libraries/react 16296193 ns/iter (± 93970) 16174887 ns/iter (± 70895) 1.01
es/minify/libraries/terser 196026944 ns/iter (± 3225543) 189480013 ns/iter (± 741215) 1.03
es/minify/libraries/three 347123575 ns/iter (± 4388935) 326133320 ns/iter (± 1705496) 1.06
es/minify/libraries/typescript 2405346405 ns/iter (± 25176615) 2293086208 ns/iter (± 8900333) 1.05
es/minify/libraries/victory 513150230 ns/iter (± 5910433) 483053318 ns/iter (± 3048788) 1.06
es/minify/libraries/vue 110616428 ns/iter (± 1267681) 108175881 ns/iter (± 216779) 1.02
es/visitor/compare/clone 1973338 ns/iter (± 6217) 1962534 ns/iter (± 4432) 1.01
es/visitor/compare/visit_mut_span 2276469 ns/iter (± 6614) 2281414 ns/iter (± 7014) 1.00
es/visitor/compare/visit_mut_span_panic 2351154 ns/iter (± 8963) 2351514 ns/iter (± 6802) 1.00
es/visitor/compare/fold_span 3417580 ns/iter (± 12274) 3386672 ns/iter (± 9327) 1.01
es/visitor/compare/fold_span_panic 3522186 ns/iter (± 12874) 3483162 ns/iter (± 11942) 1.01
es/lexer/colors 13316 ns/iter (± 64) 13056 ns/iter (± 18) 1.02
es/lexer/angular 6148946 ns/iter (± 17131) 6041072 ns/iter (± 4358) 1.02
es/lexer/backbone 800959 ns/iter (± 1527) 782821 ns/iter (± 469) 1.02
es/lexer/jquery 4599417 ns/iter (± 14947) 4469864 ns/iter (± 7727) 1.03
es/lexer/jquery mobile 6959104 ns/iter (± 13280) 6815354 ns/iter (± 5512) 1.02
es/lexer/mootools 3581803 ns/iter (± 4431) 3534402 ns/iter (± 2472) 1.01
es/lexer/underscore 660978 ns/iter (± 1169) 658210 ns/iter (± 759) 1.00
es/lexer/three 21957882 ns/iter (± 210785) 21312625 ns/iter (± 22326) 1.03
es/lexer/yui 3907708 ns/iter (± 8897) 3824650 ns/iter (± 2114) 1.02
es/parser/colors 27856 ns/iter (± 93) 27670 ns/iter (± 58) 1.01
es/parser/angular 13871869 ns/iter (± 184546) 13981500 ns/iter (± 71208) 0.99
es/parser/backbone 2035523 ns/iter (± 10721) 2066198 ns/iter (± 11211) 0.99
es/parser/jquery 11125316 ns/iter (± 78810) 11269079 ns/iter (± 55270) 0.99
es/parser/jquery mobile 17422037 ns/iter (± 214062) 17256700 ns/iter (± 47016) 1.01
es/parser/mootools 8577213 ns/iter (± 30854) 8676905 ns/iter (± 11455) 0.99
es/parser/underscore 1762710 ns/iter (± 15497) 1789026 ns/iter (± 11370) 0.99
es/parser/three 50037023 ns/iter (± 541906) 48786770 ns/iter (± 238128) 1.03
es/parser/yui 8458306 ns/iter (± 23823) 8515542 ns/iter (± 31113) 0.99
es/preset-env/usage/builtin_type 135374 ns/iter (± 32082) 136429 ns/iter (± 31794) 0.99
es/preset-env/usage/property 17542 ns/iter (± 108) 16965 ns/iter (± 43) 1.03
es/resolver/typescript 91968619 ns/iter (± 1216088) 88637849 ns/iter (± 1052699) 1.04
es/fixer/typescript 67863356 ns/iter (± 865732) 64211503 ns/iter (± 775683) 1.06
es/hygiene/typescript 137184113 ns/iter (± 992377) 130744740 ns/iter (± 573341) 1.05
es/resolver_with_hygiene/typescript 248420272 ns/iter (± 2441996) 241504094 ns/iter (± 631122) 1.03
es/visitor/base-perf/module_clone 60477 ns/iter (± 498) 60902 ns/iter (± 327) 0.99
es/visitor/base-perf/fold_empty 64516 ns/iter (± 265) 64876 ns/iter (± 270) 0.99
es/visitor/base-perf/fold_noop_impl_all 65523 ns/iter (± 175) 64917 ns/iter (± 267) 1.01
es/visitor/base-perf/fold_noop_impl_vec 65771 ns/iter (± 225) 64849 ns/iter (± 357) 1.01
es/visitor/base-perf/boxing_boxed_clone 57 ns/iter (± 0) 56 ns/iter (± 0) 1.02
es/visitor/base-perf/boxing_unboxed_clone 39 ns/iter (± 0) 40 ns/iter (± 0) 0.97
es/visitor/base-perf/boxing_boxed 106 ns/iter (± 0) 108 ns/iter (± 0) 0.98
es/visitor/base-perf/boxing_unboxed 75 ns/iter (± 0) 78 ns/iter (± 0) 0.96
es/visitor/base-perf/visit_empty 0 ns/iter (± 0) 0 ns/iter (± 0) NaN
es/visitor/base-perf/visit_contains_this 2668 ns/iter (± 12) 2640 ns/iter (± 21) 1.01
es/base/parallel/resolver/typescript 4318549756 ns/iter (± 220345222) 4181871785 ns/iter (± 190995579) 1.03
es/base/parallel/hygiene/typescript 1482099031 ns/iter (± 16217872) 1428135712 ns/iter (± 21925360) 1.04
misc/visitors/time-complexity/time 5 138 ns/iter (± 3) 132 ns/iter (± 0) 1.05
misc/visitors/time-complexity/time 10 367 ns/iter (± 1) 303 ns/iter (± 22) 1.21
misc/visitors/time-complexity/time 15 671 ns/iter (± 1) 680 ns/iter (± 10) 0.99
misc/visitors/time-complexity/time 20 1163 ns/iter (± 2) 1055 ns/iter (± 3) 1.10
misc/visitors/time-complexity/time 40 3514 ns/iter (± 12) 4109 ns/iter (± 263) 0.86
misc/visitors/time-complexity/time 60 8786 ns/iter (± 9) 8636 ns/iter (± 760) 1.02
es/full-target/es2016 236324 ns/iter (± 1151) 234069 ns/iter (± 1014) 1.01
es/full-target/es2017 224396 ns/iter (± 708) 218805 ns/iter (± 1158) 1.03
es/full-target/es2018 211597 ns/iter (± 1262) 209997 ns/iter (± 1611) 1.01
es2020_nullish_coalescing 72522 ns/iter (± 302) 70907 ns/iter (± 497) 1.02
es2020_optional_chaining 82596 ns/iter (± 347) 79760 ns/iter (± 275) 1.04
es2022_class_properties 115471 ns/iter (± 430) 116701 ns/iter (± 521) 0.99
es2018_object_rest_spread 76435 ns/iter (± 315) 75446 ns/iter (± 211) 1.01
es2019_optional_catch_binding 65922 ns/iter (± 194) 64400 ns/iter (± 305) 1.02
es2017_async_to_generator 66772 ns/iter (± 400) 64903 ns/iter (± 242) 1.03
es2016_exponentiation 71387 ns/iter (± 420) 68702 ns/iter (± 134) 1.04
es2015_arrow 73194 ns/iter (± 217) 72240 ns/iter (± 154) 1.01
es2015_block_scoped_fn 70151 ns/iter (± 297) 69802 ns/iter (± 376) 1.00
es2015_block_scoping 124171 ns/iter (± 578) 124875 ns/iter (± 506) 0.99

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

Please sign in to comment.