From 9b6e344da499b54462b4cfb9016e22c7521e09a0 Mon Sep 17 00:00:00 2001 From: overlookmotel <557937+overlookmotel@users.noreply.github.com> Date: Sat, 29 Mar 2025 12:48:02 +0000 Subject: [PATCH] fix(codegen): do not escape `$` in strings unless using backtick as quote (#10103) When printing `"${"`, it's unnecessary to escape the `$` unless the quote character is a backtick. --- crates/oxc_codegen/src/lib.rs | 2 +- crates/oxc_codegen/tests/integration/unit.rs | 7 +++++++ tasks/minsize/minsize.snap | 4 ++-- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/crates/oxc_codegen/src/lib.rs b/crates/oxc_codegen/src/lib.rs index 9d60bfe18136c..4208ce48cd001 100644 --- a/crates/oxc_codegen/src/lib.rs +++ b/crates/oxc_codegen/src/lib.rs @@ -675,7 +675,7 @@ impl<'a> Codegen<'a> { self.print_ascii_byte(b'`'); } '$' => { - if chars.peek() == Some(&'{') { + if quote == Quote::Backtick && chars.peek() == Some(&'{') { self.print_ascii_byte(b'\\'); } self.print_ascii_byte(b'$'); diff --git a/crates/oxc_codegen/tests/integration/unit.rs b/crates/oxc_codegen/tests/integration/unit.rs index d66dfbf3bf81e..4c266a3efb8be 100644 --- a/crates/oxc_codegen/tests/integration/unit.rs +++ b/crates/oxc_codegen/tests/integration/unit.rs @@ -500,6 +500,13 @@ fn getter_setter() { #[test] fn string() { + test("let x = \"${}\";", "let x = \"${}\";\n"); + test_minify("let x = \"${}\";", "let x=\"${}\";"); + test("let x = '\"\"${}';", "let x = \"\\\"\\\"${}\";\n"); + test_minify("let x = '\"\"${}';", "let x='\"\"${}';"); + test("let x = '\"\"\\'\\'${}';", "let x = \"\\\"\\\"''${}\";\n"); + test_minify("let x = '\"\"\\'\\'${}';", "let x=`\"\"''\\${}`;"); + test_minify( r#";'eval("\'\\vstr\\ving\\v\'") === "\\vstr\\ving\\v"'"#, r#";`eval("'\\vstr\\ving\\v'") === "\\vstr\\ving\\v"`;"#, diff --git a/tasks/minsize/minsize.snap b/tasks/minsize/minsize.snap index 9ebb694109569..1b8426a857cd6 100644 --- a/tasks/minsize/minsize.snap +++ b/tasks/minsize/minsize.snap @@ -21,7 +21,7 @@ Original | minified | minified | gzip | gzip | Fixture 3.20 MB | 1.01 MB | 1.01 MB | 324.14 kB | 331.56 kB | echarts.js -6.69 MB | 2.28 MB | 2.31 MB | 466.10 kB | 488.28 kB | antd.js +6.69 MB | 2.28 MB | 2.31 MB | 466.11 kB | 488.28 kB | antd.js -10.95 MB | 3.35 MB | 3.49 MB | 860.95 kB | 915.50 kB | typescript.js +10.95 MB | 3.35 MB | 3.49 MB | 860.94 kB | 915.50 kB | typescript.js