Merge pull request #733 from jcxplorer/add-mangle-regex-option
Add --mangle-regex option
This commit is contained in:
@@ -132,6 +132,7 @@ The available options are:
|
|||||||
--reserve-domprops Make (most?) DOM properties reserved for
|
--reserve-domprops Make (most?) DOM properties reserved for
|
||||||
--mangle-props
|
--mangle-props
|
||||||
--mangle-props Mangle property names
|
--mangle-props Mangle property names
|
||||||
|
--mangle-regex Only mangle property names matching the regex
|
||||||
--name-cache File to hold mangled names mappings
|
--name-cache File to hold mangled names mappings
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -251,6 +252,10 @@ A default exclusion file is provided in `tools/domprops.json` which should
|
|||||||
cover most standard JS and DOM properties defined in various browsers. Pass
|
cover most standard JS and DOM properties defined in various browsers. Pass
|
||||||
`--reserve-domprops` to read that in.
|
`--reserve-domprops` to read that in.
|
||||||
|
|
||||||
|
You can also use a regular expression to define which property names should be
|
||||||
|
mangled. For example, `--mangle-regex="/^_/"` will only mangle property names
|
||||||
|
that start with an underscore.
|
||||||
|
|
||||||
When you compress multiple files using this option, in order for them to
|
When you compress multiple files using this option, in order for them to
|
||||||
work together in the end we need to ensure somehow that one property gets
|
work together in the end we need to ensure somehow that one property gets
|
||||||
mangled to the same name in all of them. For this, pass `--name-cache
|
mangled to the same name in all of them. For this, pass `--name-cache
|
||||||
|
|||||||
25
bin/uglifyjs
25
bin/uglifyjs
@@ -70,6 +70,7 @@ You need to pass an argument to this option to specify the name that your module
|
|||||||
.describe("reserved-file", "File containing reserved names")
|
.describe("reserved-file", "File containing reserved names")
|
||||||
.describe("reserve-domprops", "Make (most?) DOM properties reserved for --mangle-props")
|
.describe("reserve-domprops", "Make (most?) DOM properties reserved for --mangle-props")
|
||||||
.describe("mangle-props", "Mangle property names")
|
.describe("mangle-props", "Mangle property names")
|
||||||
|
.describe("mangle-regex", "Only mangle property names matching the regex")
|
||||||
.describe("name-cache", "File to hold mangled names mappings")
|
.describe("name-cache", "File to hold mangled names mappings")
|
||||||
|
|
||||||
.alias("p", "prefix")
|
.alias("p", "prefix")
|
||||||
@@ -191,6 +192,15 @@ function writeNameCache(key, cache) {
|
|||||||
return UglifyJS.writeNameCache(ARGS.name_cache, key, cache);
|
return UglifyJS.writeNameCache(ARGS.name_cache, key, cache);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function extractRegex(str) {
|
||||||
|
if (/^\/.*\/[a-zA-Z]*$/.test(str)) {
|
||||||
|
var regex_pos = str.lastIndexOf("/");
|
||||||
|
return new RegExp(str.substr(1, regex_pos - 1), str.substr(regex_pos + 1));
|
||||||
|
} else {
|
||||||
|
throw new Error("Invalid regular expression: " + str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (ARGS.quotes === true) {
|
if (ARGS.quotes === true) {
|
||||||
ARGS.quotes = 3;
|
ARGS.quotes = 3;
|
||||||
}
|
}
|
||||||
@@ -217,9 +227,8 @@ if (BEAUTIFY)
|
|||||||
|
|
||||||
if (ARGS.comments != null) {
|
if (ARGS.comments != null) {
|
||||||
if (/^\/.*\/[a-zA-Z]*$/.test(ARGS.comments)) {
|
if (/^\/.*\/[a-zA-Z]*$/.test(ARGS.comments)) {
|
||||||
var regex_pos = ARGS.comments.lastIndexOf("/");
|
|
||||||
try {
|
try {
|
||||||
OUTPUT_OPTIONS.comments = new RegExp(ARGS.comments.substr(1, regex_pos - 1), ARGS.comments.substr(regex_pos + 1));
|
OUTPUT_OPTIONS.comments = extractRegex(ARGS.comments);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
print_error("ERROR: Invalid --comments: " + e.message);
|
print_error("ERROR: Invalid --comments: " + e.message);
|
||||||
}
|
}
|
||||||
@@ -375,10 +384,20 @@ async.eachLimit(files, 1, function (file, cb) {
|
|||||||
if (ARGS.mangle_props || ARGS.name_cache) (function(){
|
if (ARGS.mangle_props || ARGS.name_cache) (function(){
|
||||||
var reserved = RESERVED ? RESERVED.props : null;
|
var reserved = RESERVED ? RESERVED.props : null;
|
||||||
var cache = readNameCache("props");
|
var cache = readNameCache("props");
|
||||||
|
var regex;
|
||||||
|
|
||||||
|
try {
|
||||||
|
regex = ARGS.mangle_regex ? extractRegex(ARGS.mangle_regex) : null;
|
||||||
|
} catch (e) {
|
||||||
|
print_error("ERROR: Invalid --mangle-regex: " + e.message);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
TOPLEVEL = UglifyJS.mangle_properties(TOPLEVEL, {
|
TOPLEVEL = UglifyJS.mangle_properties(TOPLEVEL, {
|
||||||
reserved : reserved,
|
reserved : reserved,
|
||||||
cache : cache,
|
cache : cache,
|
||||||
only_cache : !ARGS.mangle_props
|
only_cache : !ARGS.mangle_props,
|
||||||
|
regex : regex
|
||||||
});
|
});
|
||||||
writeNameCache("props", cache);
|
writeNameCache("props", cache);
|
||||||
})();
|
})();
|
||||||
|
|||||||
@@ -64,7 +64,8 @@ function mangle_properties(ast, options) {
|
|||||||
options = defaults(options, {
|
options = defaults(options, {
|
||||||
reserved : null,
|
reserved : null,
|
||||||
cache : null,
|
cache : null,
|
||||||
only_cache : false
|
only_cache : false,
|
||||||
|
regex : null
|
||||||
});
|
});
|
||||||
|
|
||||||
var reserved = options.reserved;
|
var reserved = options.reserved;
|
||||||
@@ -79,6 +80,8 @@ function mangle_properties(ast, options) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var regex = options.regex;
|
||||||
|
|
||||||
var names_to_mangle = [];
|
var names_to_mangle = [];
|
||||||
|
|
||||||
// step 1: find candidates to mangle
|
// step 1: find candidates to mangle
|
||||||
@@ -149,6 +152,7 @@ function mangle_properties(ast, options) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function should_mangle(name) {
|
function should_mangle(name) {
|
||||||
|
if (regex && !regex.test(name)) return false;
|
||||||
if (reserved.indexOf(name) >= 0) return false;
|
if (reserved.indexOf(name) >= 0) return false;
|
||||||
return cache.props.has(name)
|
return cache.props.has(name)
|
||||||
|| names_to_mangle.indexOf(name) >= 0;
|
|| names_to_mangle.indexOf(name) >= 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user