From a03ac183340f122170b4a9c0148c209de89510d6 Mon Sep 17 00:00:00 2001 From: Justin Ridgewell Date: Mon, 30 Aug 2021 21:57:47 -0400 Subject: [PATCH] Mangle private properties by default when mangling --- lib/minify.js | 2 ++ lib/parse.js | 4 +-- lib/propmangle.js | 50 +++++++++++++++++++++++-------------- test/compress.js | 3 +++ test/compress/issue_1014.js | 6 ++--- 5 files changed, 41 insertions(+), 24 deletions(-) diff --git a/lib/minify.js b/lib/minify.js index b9625e532..587e54d33 100644 --- a/lib/minify.js +++ b/lib/minify.js @@ -15,6 +15,7 @@ import { base54 } from "./scope.js"; import { SourceMap } from "./sourcemap.js"; import { mangle_properties, + mangle_private_properties, reserve_quoted_keys, } from "./propmangle.js"; @@ -206,6 +207,7 @@ async function minify(files, options) { base54.reset(); toplevel.compute_char_frequency(options.mangle); toplevel.mangle_names(options.mangle); + toplevel = mangle_private_properties(toplevel); } if (timings) timings.properties = Date.now(); if (options.mangle && options.mangle.properties) { diff --git a/lib/parse.js b/lib/parse.js index e16312821..55333b54e 100644 --- a/lib/parse.js +++ b/lib/parse.js @@ -167,14 +167,14 @@ var LATEST_TEMPLATE_END = true; var KEYWORDS = "break case catch class const continue debugger default delete do else export extends finally for function if in instanceof let new return switch throw try typeof var void while with"; var KEYWORDS_ATOM = "false null true"; var RESERVED_WORDS = "enum import super this " + KEYWORDS_ATOM + " " + KEYWORDS; -var ALL_RESERVED_WORDS = "implements interface package private protected public static " + RESERVED_WORDS +var ALL_RESERVED_WORDS = "implements interface package private protected public static " + RESERVED_WORDS; var KEYWORDS_BEFORE_EXPRESSION = "return new delete throw else case yield await"; KEYWORDS = makePredicate(KEYWORDS); RESERVED_WORDS = makePredicate(RESERVED_WORDS); KEYWORDS_BEFORE_EXPRESSION = makePredicate(KEYWORDS_BEFORE_EXPRESSION); KEYWORDS_ATOM = makePredicate(KEYWORDS_ATOM); -ALL_RESERVED_WORDS = makePredicate(ALL_RESERVED_WORDS) +ALL_RESERVED_WORDS = makePredicate(ALL_RESERVED_WORDS); var OPERATOR_CHARS = makePredicate(characters("+-*&%=<>!?|~^")); diff --git a/lib/propmangle.js b/lib/propmangle.js index ff2efbbaf..4591e4182 100644 --- a/lib/propmangle.js +++ b/lib/propmangle.js @@ -140,6 +140,32 @@ function addStrings(node, add) { })); } +function mangle_private_properties(ast) { + var cprivate = -1; + var private_cache = new Map(); + + return ast.transform(new TreeTransformer(function(node) { + if ( + node instanceof AST_ClassPrivateProperty + || node instanceof AST_PrivateMethod + ) { + node.key.name = mangle_private(node.key.name); + } else if (node instanceof AST_DotHash) { + node.property = mangle_private(node.property); + } + })); + + function mangle_private(name) { + let mangled = private_cache.get(name); + if (!mangled) { + mangled = base54(++cprivate); + private_cache.set(name, mangled); + } + + return mangled; + } +} + function mangle_properties(ast, options) { options = defaults(options, { builtins: false, @@ -158,10 +184,8 @@ function mangle_properties(ast, options) { if (!options.builtins) find_builtins(reserved); var cname = -1; - var cprivate = -1; var cache; - var private_cache = new Map(); if (options.cache) { cache = options.cache.props; cache.forEach(function(mangled_name) { @@ -184,7 +208,6 @@ function mangle_properties(ast, options) { var names_to_mangle = new Set(); var unmangleable = new Set(); - var private_properties = new Set(); var keep_quoted_strict = options.keep_quoted === "strict"; @@ -193,10 +216,9 @@ function mangle_properties(ast, options) { if ( node instanceof AST_ClassPrivateProperty || node instanceof AST_PrivateMethod + || node instanceof AST_DotHash ) { - private_properties.add(node.key.name); - } else if (node instanceof AST_DotHash) { - private_properties.add(node.property); + // handled by mangle_private_properties } else if (node instanceof AST_ObjectKeyVal) { if (typeof node.key == "string" && (!keep_quoted_strict || !node.quote)) { @@ -237,10 +259,9 @@ function mangle_properties(ast, options) { if ( node instanceof AST_ClassPrivateProperty || node instanceof AST_PrivateMethod + || node instanceof AST_DotHash ) { - node.key.name = mangle_private(node.key.name); - } else if (node instanceof AST_DotHash) { - node.property = mangle_private(node.property); + // handled by mangle_private_properties } else if (node instanceof AST_ObjectKeyVal) { if (typeof node.key == "string" && (!keep_quoted_strict || !node.quote)) { @@ -321,16 +342,6 @@ function mangle_properties(ast, options) { return mangled; } - function mangle_private(name) { - let mangled = private_cache.get(name); - if (!mangled) { - mangled = base54(++cprivate); - private_cache.set(name, mangled); - } - - return mangled; - } - function mangleStrings(node) { return node.transform(new TreeTransformer(function(node) { if (node instanceof AST_Sequence) { @@ -350,4 +361,5 @@ function mangle_properties(ast, options) { export { reserve_quoted_keys, mangle_properties, + mangle_private_properties, }; diff --git a/test/compress.js b/test/compress.js index 9449c1951..bd8607b0a 100644 --- a/test/compress.js +++ b/test/compress.js @@ -14,6 +14,7 @@ import { Compressor } from "../lib/compress/index.js"; import { reserve_quoted_keys, mangle_properties, + mangle_private_properties, } from "../lib/propmangle.js"; import { base54 } from "../lib/scope.js"; import { string_template, defaults } from "../lib/utils/index.js"; @@ -228,6 +229,7 @@ async function run_compress_tests() { } })(test.mangle.cache); output.mangle_names(test.mangle); + mangle_private_properties(output); if (test.mangle.properties) { output = mangle_properties(output, test.mangle.properties); } @@ -292,6 +294,7 @@ async function run_compress_tests() { } var tests = parse_test(path.resolve(dir, file)); for (var i in tests) if (tests.hasOwnProperty(i)) { + if (process.env.GREP && !i.includes(process.env.GREP)) continue; if (!await test_case(tests[i])) { failures++; failed_files[file] = 1; diff --git a/test/compress/issue_1014.js b/test/compress/issue_1014.js index 5c0175b05..bae45e349 100644 --- a/test/compress/issue_1014.js +++ b/test/compress/issue_1014.js @@ -74,10 +74,10 @@ ternary_and_private_methods: { } expect: { class A { - #fail() { return false; } - get #pass() { return "PASS"; } + #s() { return false; } + get #i() { return "PASS"; } print() { - console.log(this.#fail() ? this.#fail() : this.#pass); + console.log(this.#s() ? this.#s() : this.#i); } } new A().print();