Skip to content

Commit 05990a9

Browse files
authoredAug 17, 2023
fix(es/minifier): Preserve cooked while compressing template literals (#7773)
**Related issue:** - Closes #7770
1 parent 05200ad commit 05990a9

File tree

5 files changed

+71
-5
lines changed

5 files changed

+71
-5
lines changed
 

‎crates/swc_ecma_minifier/src/compress/pure/strings.rs

+14-5
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ impl Pure<'_> {
240240
let mut quasis = vec![];
241241
let mut exprs = vec![];
242242
let mut cur_raw = String::new();
243-
let mut cur_cooked = String::new();
243+
let mut cur_cooked = Some(String::new());
244244

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

250250
cur_raw.push_str(&q.raw);
251251
if let Some(cooked) = q.cooked {
252-
cur_cooked.push_str(&cooked);
252+
if let Some(cur_cooked) = &mut cur_cooked {
253+
cur_cooked.push_str(&cooked);
254+
}
255+
} else {
256+
// If cooked is None, it means that the template literal contains invalid escape
257+
// sequences.
258+
cur_cooked = None;
253259
}
254260
} else {
255261
let i = i / 2;
@@ -258,15 +264,18 @@ impl Pure<'_> {
258264
match *e {
259265
Expr::Lit(Lit::Str(s)) => {
260266
cur_raw.push_str(&convert_str_value_to_tpl_raw(&s.value));
261-
cur_cooked.push_str(&convert_str_value_to_tpl_cooked(&s.value));
267+
if let Some(cur_cooked) = &mut cur_cooked {
268+
cur_cooked.push_str(&convert_str_value_to_tpl_cooked(&s.value));
269+
}
262270
}
263271
_ => {
264272
quasis.push(TplElement {
265273
span: DUMMY_SP,
266274
tail: true,
267-
cooked: Some(Atom::from(&*cur_cooked)),
275+
cooked: cur_cooked.take().map(From::from),
268276
raw: take(&mut cur_raw).into(),
269277
});
278+
cur_cooked = Some(String::new());
270279

271280
exprs.push(e);
272281
}
@@ -279,7 +288,7 @@ impl Pure<'_> {
279288
quasis.push(TplElement {
280289
span: DUMMY_SP,
281290
tail: true,
282-
cooked: None,
291+
cooked: cur_cooked.map(From::from),
283292
raw: cur_raw.into(),
284293
});
285294

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
exports.MainCSS1 = foo`
2+
\x<-invalid, so no cooked
3+
${'this breaks splits the quasis'}
4+
this should have a cooked
5+
`;
6+
7+
exports.MainCSS2 = foo`
8+
\x<-invalid, so no cooked
9+
${'this breaks splits the quasis'}
10+
this should have a cooked
11+
${'this breaks splits the quasis'}
12+
this should also have a cooked
13+
`;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
exports.MainCSS1 = foo`
2+
\x<-invalid, so no cooked
3+
${'this breaks splits the quasis'}
4+
this should have a cooked
5+
`, exports.MainCSS2 = foo`
6+
\x<-invalid, so no cooked
7+
${'this breaks splits the quasis'}
8+
this should have a cooked
9+
${'this breaks splits the quasis'}
10+
this should also have a cooked
11+
`;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
const sWidth = "asdasd";
2+
function absolute() {
3+
return `
4+
`;
5+
}
6+
function flex() {
7+
return `
8+
`;
9+
}
10+
exports.MainCSS = `
11+
.ThisshouldOnlyBeonTop {
12+
${absolute()}
13+
}
14+
.abcBlablaOne .asdsad {
15+
${flex()}
16+
}
17+
.aasdasdasd .asdsada {
18+
we: ${sWidth} !important;
19+
}
20+
`;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
exports.MainCSS = `
2+
.ThisshouldOnlyBeonTop {
3+
4+
5+
}
6+
.abcBlablaOne .asdsad {
7+
8+
9+
}
10+
.aasdasdasd .asdsada {
11+
we: asdasd !important;
12+
}
13+
`;

1 commit comments

Comments
 (1)

github-actions[bot] commented on Aug 17, 2023

@github-actions[bot]

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.