From 315ed269a7ed520d5a820a7068932b93a9dcb3b1 Mon Sep 17 00:00:00 2001 From: Wilson Lin Date: Sun, 8 Aug 2021 00:56:24 +1000 Subject: [PATCH] Fix style attr minification --- bench/minifiers.js | 2 +- gen/package.json | 2 +- src/minify/attr.rs | 20 ++++++++++++++++---- src/tests/mod.rs | 6 ++++-- 4 files changed, 22 insertions(+), 8 deletions(-) diff --git a/bench/minifiers.js b/bench/minifiers.js index 245f7b9..cea099a 100644 --- a/bench/minifiers.js +++ b/bench/minifiers.js @@ -66,7 +66,7 @@ const htmlMinifierCfg = { }; module.exports = { - '@minify-html/js': (_, buffer) => minifyHtml.minify(Buffer.from(buffer), minifyHtmlCfg), + '@minify-html/js': (_, buffer) => minifyHtml.minify(buffer, minifyHtmlCfg), 'html-minifier': content => htmlMinifier.minify(content, htmlMinifierCfg), 'minimize': testJsAndCssMinification ? (content) => new minimize({ diff --git a/gen/package.json b/gen/package.json index fa2bc68..1771040 100644 --- a/gen/package.json +++ b/gen/package.json @@ -5,7 +5,7 @@ }, "dependencies": { "@types/node": "^14.0.5", - "@wzlin/html-data": "^2020103004.0.1", + "@wzlin/html-data": "^2021080714.0.0", "prettier": "2.3.2", "ts-node": "^8.10.1", "typescript": "^3.7.4", diff --git a/src/minify/attr.rs b/src/minify/attr.rs index 4dc93bb..d1d5ff9 100644 --- a/src/minify/attr.rs +++ b/src/minify/attr.rs @@ -217,14 +217,26 @@ pub fn minify_attr( #[cfg(feature = "js-esbuild")] if name == b"style" && cfg.minify_css { - let mut value_raw_min = Vec::new(); + let mut value_raw_wrapped = Vec::with_capacity(value_raw.len() + 3); + // TODO This isn't safe for invalid input e.g. `a}/*`. + value_raw_wrapped.extend_from_slice(b"x{"); + value_raw_wrapped.extend_from_slice(&value_raw); + value_raw_wrapped.push(b'}'); + let mut value_raw_wrapped_min = Vec::with_capacity(value_raw_wrapped.len()); minify_using_esbuild( - &mut value_raw_min, - &value_raw, + &mut value_raw_wrapped_min, + &value_raw_wrapped, &MINIFY_CSS_TRANSFORM_OPTIONS.clone(), None, ); - value_raw = value_raw_min; + // If input was invalid, wrapper syntax may not exist anymore. + if value_raw_wrapped_min.starts_with(b"x{") { + value_raw_wrapped_min.drain(0..2); + }; + if value_raw_wrapped_min.ends_with(b"}") { + value_raw_wrapped_min.pop(); + }; + value_raw = value_raw_wrapped_min; } if (value_raw.is_empty() && redundant_if_empty) diff --git a/src/tests/mod.rs b/src/tests/mod.rs index 32107c4..530541f 100644 --- a/src/tests/mod.rs +++ b/src/tests/mod.rs @@ -603,7 +603,9 @@ fn test_css_minification() { ); // `style` attributes. eval_with_css_min( - br#"
"#, - br#"
"#, + br#"
"#, + br#"
"#, ); + // `style` attributes are removed if fully minified away. + eval_with_css_min(br#"
"#, br#"
"#); }