From 06f4dcc0d11012214fccfd700183415a76ca1248 Mon Sep 17 00:00:00 2001 From: Niklas Mischkulnig <4586894+mischnic@users.noreply.github.com> Date: Wed, 13 Sep 2023 18:00:24 +0200 Subject: [PATCH 1/2] Set ascii_only for swc emit --- .../core/integration-tests/test/javascript.js | 20 +++++++++++++++++++ packages/transformers/js/core/src/lib.rs | 5 +++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/packages/core/integration-tests/test/javascript.js b/packages/core/integration-tests/test/javascript.js index 35e597a6e1b..65f185192cb 100644 --- a/packages/core/integration-tests/test/javascript.js +++ b/packages/core/integration-tests/test/javascript.js @@ -6365,6 +6365,26 @@ describe('javascript', function () { assert.deepEqual(output.default, {color: 'blue'}); }); + it('should retain unicode escape sequences', async function () { + await fsFixture(overlayFS, __dirname)` + src/index.js: + export default ['\\u0085', '\\u200b', '\\ufffe']; + `; + + let b = await bundle(path.join(__dirname, 'src/index.js'), { + inputFS: overlayFS, + }); + + let output = (await run(b)).default; + assert.deepEqual(output, ['\u0085', '\u200b', '\ufffe']); + + let contents = await outputFS.readFile(b.getBundles()[0].filePath, 'utf8'); + assert.equal(contents.match(/\\/g).length, 3); + assert(!contents.includes('\u0085')); + assert(!contents.includes('\u200b')); + assert(!contents.includes('\ufffe')); + }); + for (let shouldScopeHoist of [false, true]) { let options = { defaultTargetOptions: { diff --git a/packages/transformers/js/core/src/lib.rs b/packages/transformers/js/core/src/lib.rs index 8a7aa52777f..b2801f367a4 100644 --- a/packages/transformers/js/core/src/lib.rs +++ b/packages/transformers/js/core/src/lib.rs @@ -566,8 +566,9 @@ fn emit( None }, )); - let config = - swc_core::ecma::codegen::Config::default().with_target(swc_core::ecma::ast::EsVersion::Es5); + let config = swc_core::ecma::codegen::Config::default() + .with_target(swc_core::ecma::ast::EsVersion::Es5) + .with_ascii_only(true); let mut emitter = swc_core::ecma::codegen::Emitter { cfg: config, comments: Some(&comments), From c4f1ce1e4a0adebe65ba502f3ac5500824985c73 Mon Sep 17 00:00:00 2001 From: Niklas Mischkulnig <4586894+mischnic@users.noreply.github.com> Date: Sat, 16 Sep 2023 15:08:54 +0200 Subject: [PATCH 2/2] Add comments --- packages/core/integration-tests/test/javascript.js | 1 + packages/transformers/js/core/src/lib.rs | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/core/integration-tests/test/javascript.js b/packages/core/integration-tests/test/javascript.js index 65f185192cb..1c63553f088 100644 --- a/packages/core/integration-tests/test/javascript.js +++ b/packages/core/integration-tests/test/javascript.js @@ -6366,6 +6366,7 @@ describe('javascript', function () { }); it('should retain unicode escape sequences', async function () { + // See issue #8877 await fsFixture(overlayFS, __dirname)` src/index.js: export default ['\\u0085', '\\u200b', '\\ufffe']; diff --git a/packages/transformers/js/core/src/lib.rs b/packages/transformers/js/core/src/lib.rs index b2801f367a4..5fd47373db9 100644 --- a/packages/transformers/js/core/src/lib.rs +++ b/packages/transformers/js/core/src/lib.rs @@ -568,6 +568,7 @@ fn emit( )); let config = swc_core::ecma::codegen::Config::default() .with_target(swc_core::ecma::ast::EsVersion::Es5) + // Make sure the output works regardless of whether it's loaded with the correct (utf8) encoding .with_ascii_only(true); let mut emitter = swc_core::ecma::codegen::Emitter { cfg: config,