diff --git a/lib/output.js b/lib/output.js index 8ba98b69..91f7c504 100644 --- a/lib/output.js +++ b/lib/output.js @@ -67,7 +67,8 @@ function OutputStream(options) { screw_ie8 : false, preamble : null, quote_style : 0, - keep_quoted_props: false + keep_quoted_props: false, + ecma : 5, }, true); var indentation = 0; @@ -80,7 +81,11 @@ function OutputStream(options) { return str.replace(/[\ud800-\udbff][\udc00-\udfff]|[\u0000-\u001f\u007f-\uffff]/g, function(ch) { var code = get_full_char_code(ch, 0).toString(16); - if ((identifier && code.length === 1) || code.length > 4) { + if ((identifier && code.length === 1 && !options.es5) || code.length > 4) { + if (options.ecma < 6) { + return "\\u" + ch.charCodeAt(0).toString(16) + "\\u" + + ch.charCodeAt(1).toString(16); + } return "\\u{" + code + "}"; } else if (code.length <= 2 && !identifier) { while (code.length < 2) code = "0" + code; diff --git a/test/compress/unicode.js b/test/compress/unicode.js index 9651c6df..f08072e0 100644 --- a/test/compress/unicode.js +++ b/test/compress/unicode.js @@ -17,6 +17,7 @@ unicode_parse_variables: { } unicode_escaped_identifier: { + beautify = {ecma: 6} input: { var \u{61} = "foo"; var \u{10000} = "bar"; @@ -25,7 +26,7 @@ unicode_escaped_identifier: { } unicode_identifier_ascii_only: { - beautify = {ascii_only: true} + beautify = {ascii_only: true, ecma: 6} input: { var \u{0061} = "hi"; var bar = "h\u{0065}llo"; @@ -35,9 +36,67 @@ unicode_identifier_ascii_only: { } unicode_string_literals: { - beautify = {ascii_only: true} + beautify = {ascii_only: true, ecma: 6} input: { var a = "6 length unicode character: \u{101111}"; } expect_exact: 'var a="6 length unicode character: \\u{101111}";' } + +unicode_output_es5_surrogates: { + beautify = {ascii_only: true, ecma: 5} + input: { + var \u{10000} = "6 length unicode character: \u{10FFFF}"; + } + expect_exact: 'var \\ud800\\udc00="6 length unicode character: \\udbff\\udfff";' +} + +check_escape_style: { + beautify = {ascii_only: true, ecma: 6} + input: { + var a = "\x01"; + var \ua0081 = "\x10"; // \u0081 only in ID_Continue + var \u0100 = "\u0100"; + var \u1000 = "\u1000"; + var \u{10000} = "\u{10000}"; + var \u{2f800} = "\u{100000}"; + } + expect_exact: 'var a="\\x01";var \\ua0081="\\x10";var \\u0100="\\u0100";var \\u1000="\\u1000";var \\u{10000}="\\u{10000}";var \\u{2f800}="\\u{100000}";' +} + +check_escape_style_es5: { + beautify = {ascii_only: true, ecma: 5} + input: { + var a = "\x01"; + var \ua0081 = "\x10"; // \u0081 only in ID_Continue + var \u0100 = "\u0100"; + var \u1000 = "\u1000"; + var \u{10000} = "\u{10000}"; + var \u{2f800} = "\u{100000}"; + } + expect_exact: 'var a="\\x01";var \\ua0081="\\x10";var \\u0100="\\u0100";var \\u1000="\\u1000";var \\ud800\\udc00="\\ud800\\udc00";var \\ud87e\\udc00="\\udbc0\\udc00";' +} + +ID_continue_with_surrogate_pair: { + beautify = {ascii_only: true, ecma: 6} + input: { + var \u{2f800}\u{2f800}\u{2f800}\u{2f800} = "\u{100000}\u{100000}\u{100000}\u{100000}\u{100000}"; + } + expect_exact: 'var \\u{2f800}\\u{2f800}\\u{2f800}\\u{2f800}="\\u{100000}\\u{100000}\\u{100000}\\u{100000}\\u{100000}";' +} + +escape_non_escaped_identifier: { + beautify = {ascii_only: true, ecma: 6} + input: { + var µþ = "µþ"; + } + expect_exact: 'var \\u00b5\\u00fe="\\xb5\\xfe";' +} + +non_escape_2_non_escape: { + beautify = {ascii_only: false, ecma: 6} + input: { + var µþ = "µþ"; + } + expect_exact: 'var µþ="µþ";' +} \ No newline at end of file diff --git a/test/mocha/unicode.js b/test/mocha/unicode.js index a7cc12dd..d23b4a46 100644 --- a/test/mocha/unicode.js +++ b/test/mocha/unicode.js @@ -126,7 +126,7 @@ describe("Unicode", function() { for (var i = 0; i < tests.length; i++) { assert.strictEqual(uglify.minify(tests[i][0], { - fromString: true, output: { ascii_only: true} + fromString: true, output: { ascii_only: true, ecma: 6} }).code, tests[i][1]); } });