fix(transformer/tagged-template-transform): handle \n escape sequences#15830
Conversation
How to use the Graphite Merge QueueAdd either label to this PR to merge it via the merge queue:
You must have a Graphite account in order to use the merge queue. Sign up using this link. An organization admin has enabled the Graphite Merge Queue in this repository. Please do not merge from GitHub as this will restart CI on PRs being processed by the merge queue. This stack of pull requests is managed by Graphite. Learn more about stacking. |
CodSpeed Performance ReportMerging #15830 will not alter performanceComparing Summary
Footnotes
|
\n escape sequences
603308c to
d973355
Compare
There was a problem hiding this comment.
Pull Request Overview
This PR fixes the handling of escape sequences in the tagged template transform plugin. Previously, the plugin incorrectly transformed template literals containing escape sequences (like \n, \t) or invalid escape sequences (like incomplete \u), causing either incorrect output or syntax errors.
The key changes include:
- Modified the transform to generate both "cooked" and "raw" string arrays when they differ
- Added support for invalid escape sequences using
void 0in the cooked array - Added comprehensive test coverage for both valid and invalid escape sequences
Reviewed Changes
Copilot reviewed 6 out of 6 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
crates/oxc_transformer/src/plugins/tagged_template_transform.rs |
Updated transform logic to detect when cooked differs from raw, generate both cooked and raw arrays when needed, and use void 0 for invalid escapes |
tasks/transform_conformance/tests/plugin-tagged-template-transform/test/fixtures/escape-sequence/input.js |
Added test input for valid escape sequences (\n and \t) |
tasks/transform_conformance/tests/plugin-tagged-template-transform/test/fixtures/escape-sequence/output.js |
Added expected output showing correct handling of escape sequences with dual array arguments |
tasks/transform_conformance/tests/plugin-tagged-template-transform/test/fixtures/invalid-escape/input.js |
Added test input for invalid escape sequence (\u) |
tasks/transform_conformance/tests/plugin-tagged-template-transform/test/fixtures/invalid-escape/output.js |
Added expected output showing void 0 in cooked array for invalid escape |
tasks/transform_conformance/snapshots/oxc.snap.md |
Updated test pass count from 198/329 to 200/331, reflecting the 2 new passing tests |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Merge activity
|
…ces (#15830) Fixes the issue identified in #15664 where the tagged template transform plugin incorrectly handled template literals containing escape sequences. ### Examples ```js // Input foo`</script>\n` // Before (incorrect): foo(_t || (_t = taggedTemplateLiteral(["</script>\\n"]))); // After (correct): foo(_t || (_t = taggedTemplateLiteral(["</script>\n"], ["</script>\\n"]))); // Input with invalid escape foo`</script>\u` // Before (syntax error): foo(_t || (_t = taggedTemplateLiteral(["</script>\\u"]))); // After (correct): foo(_t || (_t = taggedTemplateLiteral([void 0], ["</script>\\u"])));
d973355 to
7c46a9e
Compare
…ces (#15830) Fixes the issue identified in #15664 where the tagged template transform plugin incorrectly handled template literals containing escape sequences. ### Examples ```js // Input foo`</script>\n` // Before (incorrect): foo(_t || (_t = taggedTemplateLiteral(["</script>\\n"]))); // After (correct): foo(_t || (_t = taggedTemplateLiteral(["</script>\n"], ["</script>\\n"]))); // Input with invalid escape foo`</script>\u` // Before (syntax error): foo(_t || (_t = taggedTemplateLiteral(["</script>\\u"]))); // After (correct): foo(_t || (_t = taggedTemplateLiteral([void 0], ["</script>\\u"])));
### 💥 BREAKING CHANGES - cbb27fd ast: [**BREAKING**] Add `TSGlobalDeclaration` type (#15712) (overlookmotel) ### 🚀 Features - 0c1f82b linter/plugins: Add `tokens` property to `Program` (#16020) (overlookmotel) - 6cff132 span: Add `Span::merge_within` method (#15869) (sapphi-red) - 102365d allocator/vec: Add `Vec::into_bump_slice` method (#15770) (Dunqing) ### 🐛 Bug Fixes - e2ca770 codegen: Add support for printing type arguments in new expressions (#15963) (Ives van Hoorne) - 2bd3cb6 apps, editors, napi: Fix `oxlint-disable` comments (#16014) (overlookmotel) - 622cb5e parser: Preserve legal comments with @preserve/@license when preceded by other annotations (#15929) (copilot-swe-agent) - 7c46a9e transformer/tagged-template-transform: Handle `\n` escape sequences (#15830) (Dunqing) - f386efc minifier: Avoid generating invalid spans (#15778) (sapphi-red) - d4ff004 parser: Forbid invalid modifiers on `module` and `global` (#15723) (overlookmotel) - 2191ae9 semantic: Allow reserved keywords in typescript ambient contexts (#15495) (sapphi-red) - 7d1ebad isolated-declarations: Incorrect nested namespace output in isolated declarations (#15800) (copilot-swe-agent) ### ⚡ Performance - b4b0ed8 transformer/typescript: Reverse order of checks (#15722) (overlookmotel) ### 📚 Documentation - c81a331 data_structures: Doc comments on fields of `Stack` (#15793) (overlookmotel) - cfae31d allocator: Use `allocator` as var name in examples (#15781) (overlookmotel) Co-authored-by: Boshen <[email protected]>
…ces (oxc-project#15830) Fixes the issue identified in oxc-project#15664 where the tagged template transform plugin incorrectly handled template literals containing escape sequences. ### Examples ```js // Input foo`</script>\n` // Before (incorrect): foo(_t || (_t = taggedTemplateLiteral(["</script>\\n"]))); // After (correct): foo(_t || (_t = taggedTemplateLiteral(["</script>\n"], ["</script>\\n"]))); // Input with invalid escape foo`</script>\u` // Before (syntax error): foo(_t || (_t = taggedTemplateLiteral(["</script>\\u"]))); // After (correct): foo(_t || (_t = taggedTemplateLiteral([void 0], ["</script>\\u"])));
### 💥 BREAKING CHANGES - cbb27fd ast: [**BREAKING**] Add `TSGlobalDeclaration` type (oxc-project#15712) (overlookmotel) ### 🚀 Features - 0c1f82b linter/plugins: Add `tokens` property to `Program` (oxc-project#16020) (overlookmotel) - 6cff132 span: Add `Span::merge_within` method (oxc-project#15869) (sapphi-red) - 102365d allocator/vec: Add `Vec::into_bump_slice` method (oxc-project#15770) (Dunqing) ### 🐛 Bug Fixes - e2ca770 codegen: Add support for printing type arguments in new expressions (oxc-project#15963) (Ives van Hoorne) - 2bd3cb6 apps, editors, napi: Fix `oxlint-disable` comments (oxc-project#16014) (overlookmotel) - 622cb5e parser: Preserve legal comments with @preserve/@license when preceded by other annotations (oxc-project#15929) (copilot-swe-agent) - 7c46a9e transformer/tagged-template-transform: Handle `\n` escape sequences (oxc-project#15830) (Dunqing) - f386efc minifier: Avoid generating invalid spans (oxc-project#15778) (sapphi-red) - d4ff004 parser: Forbid invalid modifiers on `module` and `global` (oxc-project#15723) (overlookmotel) - 2191ae9 semantic: Allow reserved keywords in typescript ambient contexts (oxc-project#15495) (sapphi-red) - 7d1ebad isolated-declarations: Incorrect nested namespace output in isolated declarations (oxc-project#15800) (copilot-swe-agent) ### ⚡ Performance - b4b0ed8 transformer/typescript: Reverse order of checks (oxc-project#15722) (overlookmotel) ### 📚 Documentation - c81a331 data_structures: Doc comments on fields of `Stack` (oxc-project#15793) (overlookmotel) - cfae31d allocator: Use `allocator` as var name in examples (oxc-project#15781) (overlookmotel) Co-authored-by: Boshen <[email protected]>

Fixes the issue identified in #15664 where the tagged template transform plugin incorrectly handled template literals containing escape sequences.
Examples