From b9919bdc489fc1008bdfd54bf1d5bdf4947f663b Mon Sep 17 00:00:00 2001 From: Mathias Bynens Date: Fri, 9 Sep 2016 00:04:52 +0200 Subject: [PATCH] babel-generator: Ensure ASCII-safe output for string literals (#4478) Ref. #4477. --- packages/babel-generator/package.json | 1 + .../babel-generator/src/generators/types.js | 24 ++++--------------- .../test/fixtures/minified/literals/actual.js | 1 + .../fixtures/minified/literals/expected.js | 2 +- 4 files changed, 8 insertions(+), 20 deletions(-) diff --git a/packages/babel-generator/package.json b/packages/babel-generator/package.json index 467366395d..590177530b 100644 --- a/packages/babel-generator/package.json +++ b/packages/babel-generator/package.json @@ -15,6 +15,7 @@ "babel-runtime": "^6.9.0", "babel-types": "^6.14.0", "detect-indent": "^3.0.1", + "jsesc": "^1.3.0", "lodash": "^4.2.0", "source-map": "^0.5.0" }, diff --git a/packages/babel-generator/src/generators/types.js b/packages/babel-generator/src/generators/types.js index 9d7ecde738..6ef895ab93 100644 --- a/packages/babel-generator/src/generators/types.js +++ b/packages/babel-generator/src/generators/types.js @@ -2,6 +2,7 @@ /* eslint quotes: 0 */ import * as t from "babel-types"; +import jsesc from "jsesc"; export function Identifier(node: Object) { // FIXME: We hang variance off Identifer to support Flow's def-site variance. @@ -135,26 +136,11 @@ export function StringLiteral(node: Object, parent: Object) { return; } - let val = JSON.stringify(node.value); - - // escape illegal js but valid json unicode characters - val = val.replace(/[\u000A\u000D\u2028\u2029]/g, function (c) { - return "\\u" + ("0000" + c.charCodeAt(0).toString(16)).slice(-4); + // ensure the output is ASCII-safe + let val = jsesc(node.value, { + quotes: t.isJSX(parent) ? "double" : this.format.quotes, + wrap: true }); - if (this.format.quotes === "single" && !t.isJSX(parent)) { - // remove double quotes - val = val.slice(1, -1); - - // unescape double quotes - val = val.replace(/\\"/g, '"'); - - // escape single quotes - val = val.replace(/'/g, "\\'"); - - // add single quotes - val = `'${val}'`; - } - return this.token(val); } diff --git a/packages/babel-generator/test/fixtures/minified/literals/actual.js b/packages/babel-generator/test/fixtures/minified/literals/actual.js index c5b0e0d2c0..c3cd0166ba 100644 --- a/packages/babel-generator/test/fixtures/minified/literals/actual.js +++ b/packages/babel-generator/test/fixtures/minified/literals/actual.js @@ -4,6 +4,7 @@ '\x20'; "\n\r"; "😂"; +`😂`; /foobar/g; null; true; diff --git a/packages/babel-generator/test/fixtures/minified/literals/expected.js b/packages/babel-generator/test/fixtures/minified/literals/expected.js index 4629654d20..7de3c221ce 100644 --- a/packages/babel-generator/test/fixtures/minified/literals/expected.js +++ b/packages/babel-generator/test/fixtures/minified/literals/expected.js @@ -1 +1 @@ -5;5;"foobar";" ";"\n\r";"😂";/foobar/g;null;true;false;5;2;56;31; +5;5;"foobar";" ";"\n\r";"\uD83D\uDE02";`😂`;/foobar/g;null;true;false;5;2;56;31;