point cli to built version

This commit is contained in:
Moshe Brevda 2022-12-19 11:53:38 +02:00
parent e09d92dc52
commit 84464b7750

View File

@ -8,10 +8,27 @@ require("../tools/tty");
var fs = require("fs"); var fs = require("fs");
var info = require("../package.json"); var info = require("../package.json");
var path = require("path"); var path = require("path");
var UglifyJS = require("../tools/node"); var UglifyJS = require("..");
var skip_keys = [ "cname", "fixed", "in_arg", "inlined", "length_read", "parent_scope", "redef", "scope", "unused" ]; var skip_keys = [
var truthy_keys = [ "optional", "pure", "terminal", "uses_arguments", "uses_eval", "uses_with" ]; "cname",
"fixed",
"in_arg",
"inlined",
"length_read",
"parent_scope",
"redef",
"scope",
"unused",
];
var truthy_keys = [
"optional",
"pure",
"terminal",
"uses_arguments",
"uses_eval",
"uses_with",
];
var files = {}; var files = {};
var options = {}; var options = {};
@ -41,7 +58,8 @@ while (args.length) {
break; break;
} else if (arg[1] == "-") { } else if (arg[1] == "-") {
process_option(arg.slice(2)); process_option(arg.slice(2));
} else [].forEach.call(arg.slice(1), function(letter, index, arg) { } else
[].forEach.call(arg.slice(1), function (letter, index, arg) {
if (!(letter in short_forms)) fatal("invalid option -" + letter); if (!(letter in short_forms)) fatal("invalid option -" + letter);
process_option(short_forms[letter], index + 1 < arg.length); process_option(short_forms[letter], index + 1 < arg.length);
}); });
@ -63,28 +81,39 @@ function process_option(name, no_value) {
for (var name in defaults) { for (var name in defaults) {
var option = defaults[name]; var option = defaults[name];
if (option && typeof option == "object") { if (option && typeof option == "object") {
text.push("--" + ({ text.push(
"--" +
({
output: "beautify", output: "beautify",
sourceMap: "source-map", sourceMap: "source-map",
}[name] || name) + " options:"); }[name] || name) +
" options:"
);
text.push(format_object(option)); text.push(format_object(option));
text.push(""); text.push("");
} else { } else {
if (padding.length < name.length) padding = Array(name.length + 1).join(" "); if (padding.length < name.length)
toplevels.push([ { padding = Array(name.length + 1).join(" ");
toplevels.push([
{
keep_fargs: "keep-fargs", keep_fargs: "keep-fargs",
keep_fnames: "keep-fnames", keep_fnames: "keep-fnames",
nameCache: "name-cache", nameCache: "name-cache",
}[name] || name, option ]); }[name] || name,
option,
]);
} }
} }
toplevels.forEach(function (tokens) { toplevels.forEach(function (tokens) {
text.push("--" + tokens[0] + padding.slice(tokens[0].length - 2) + tokens[1]); text.push(
"--" + tokens[0] + padding.slice(tokens[0].length - 2) + tokens[1]
);
}); });
print(text.join("\n")); print(text.join("\n"));
break; break;
default: default:
print([ print(
[
"Usage: uglifyjs [files...] [options]", "Usage: uglifyjs [files...] [options]",
"", "",
"Options:", "Options:",
@ -127,7 +156,8 @@ function process_option(name, no_value) {
"(internal debug use only)", "(internal debug use only)",
" --in-situ Warning: replaces original source files with minified output.", " --in-situ Warning: replaces original source files with minified output.",
" --reduce-test Reduce a standalone test case (assumes cloned repository).", " --reduce-test Reduce a standalone test case (assumes cloned repository).",
].join("\n")); ].join("\n")
);
} }
process.exit(); process.exit();
case "version": case "version":
@ -135,10 +165,17 @@ function process_option(name, no_value) {
process.exit(); process.exit();
case "config-file": case "config-file":
var config = JSON.parse(read_file(read_value(true))); var config = JSON.parse(read_file(read_value(true)));
if (config.mangle && config.mangle.properties && config.mangle.properties.regex) { if (
config.mangle.properties.regex = UglifyJS.parse(config.mangle.properties.regex, { config.mangle &&
config.mangle.properties &&
config.mangle.properties.regex
) {
config.mangle.properties.regex = UglifyJS.parse(
config.mangle.properties.regex,
{
expression: true, expression: true,
}).value; }
).value;
} }
for (var key in config) if (!(key in options)) options[key] = config[key]; for (var key in config) if (!(key in options)) options[key] = config[key];
break; break;
@ -195,11 +232,18 @@ function process_option(name, no_value) {
break; break;
case "define": case "define":
if (typeof options.compress != "object") options.compress = {}; if (typeof options.compress != "object") options.compress = {};
options.compress.global_defs = parse_js(read_value(true), options.compress.global_defs, "define"); options.compress.global_defs = parse_js(
read_value(true),
options.compress.global_defs,
"define"
);
break; break;
case "mangle-props": case "mangle-props":
if (typeof options.mangle != "object") options.mangle = {}; if (typeof options.mangle != "object") options.mangle = {};
options.mangle.properties = parse_js(read_value(), options.mangle.properties); options.mangle.properties = parse_js(
read_value(),
options.mangle.properties
);
break; break;
case "module": case "module":
options.module = true; options.module = true;
@ -239,8 +283,10 @@ function process_option(name, no_value) {
return args.shift(); return args.shift();
} }
} }
if (!output && options.sourceMap && options.sourceMap.url != "inline") fatal("cannot write source map to STDOUT"); if (!output && options.sourceMap && options.sourceMap.url != "inline")
if (specified["beautify"] && specified["output-opts"]) fatal("--beautify cannot be used with --output-opts"); fatal("cannot write source map to STDOUT");
if (specified["beautify"] && specified["output-opts"])
fatal("--beautify cannot be used with --output-opts");
["compress", "mangle"].forEach(function (name) { ["compress", "mangle"].forEach(function (name) {
if (!(name in options)) options[name] = false; if (!(name in options)) options[name] = false;
}); });
@ -249,8 +295,12 @@ if (/^ast|spidermonkey$/.test(output)) {
options.output.ast = true; options.output.ast = true;
options.output.code = false; options.output.code = false;
} }
if (options.parse && (options.parse.acorn || options.parse.spidermonkey) if (
&& options.sourceMap && options.sourceMap.content == "inline") { options.parse &&
(options.parse.acorn || options.parse.spidermonkey) &&
options.sourceMap &&
options.sourceMap.content == "inline"
) {
fatal("inline source map only works with built-in parser"); fatal("inline source map only works with built-in parser");
} }
if (options.warnings) { if (options.warnings) {
@ -261,23 +311,28 @@ var convert_path = function(name) {
return name; return name;
}; };
if (typeof options.sourceMap == "object" && "base" in options.sourceMap) { if (typeof options.sourceMap == "object" && "base" in options.sourceMap) {
convert_path = function() { convert_path = (function () {
var base = options.sourceMap.base; var base = options.sourceMap.base;
delete options.sourceMap.base; delete options.sourceMap.base;
return function (name) { return function (name) {
return path.relative(base, name); return path.relative(base, name);
}; };
}(); })();
} }
if (specified["self"]) { if (specified["self"]) {
if (paths.length) UglifyJS.AST_Node.warn("Ignoring input files since --self was passed"); if (paths.length)
UglifyJS.AST_Node.warn("Ignoring input files since --self was passed");
if (!options.wrap) options.wrap = "UglifyJS"; if (!options.wrap) options.wrap = "UglifyJS";
paths = UglifyJS.FILES; paths = UglifyJS.FILES;
} else if (paths.length) { } else if (paths.length) {
paths = simple_glob(paths); paths = simple_glob(paths);
} }
if (specified["in-situ"]) { if (specified["in-situ"]) {
if (output && output != "spidermonkey" || specified["reduce-test"] || specified["self"]) { if (
(output && output != "spidermonkey") ||
specified["reduce-test"] ||
specified["self"]
) {
fatal("incompatible options specified"); fatal("incompatible options specified");
} }
paths.forEach(function (name) { paths.forEach(function (name) {
@ -294,14 +349,24 @@ if (specified["in-situ"]) {
}); });
run(); run();
} else { } else {
var timerId = process.stdin.isTTY && process.argv.length < 3 && setTimeout(function() { var timerId =
print_error("Waiting for input... (use `--help` to print usage information)"); process.stdin.isTTY &&
process.argv.length < 3 &&
setTimeout(function () {
print_error(
"Waiting for input... (use `--help` to print usage information)"
);
}, 1500); }, 1500);
var chunks = []; var chunks = [];
process.stdin.setEncoding("utf8"); process.stdin.setEncoding("utf8");
process.stdin.once("data", function() { process.stdin
.once("data", function () {
clearTimeout(timerId); clearTimeout(timerId);
}).on("data", process.stdin.isTTY ? function(chunk) { })
.on(
"data",
process.stdin.isTTY
? function (chunk) {
// emulate console input termination via Ctrl+D / Ctrl+Z // emulate console input termination via Ctrl+D / Ctrl+Z
var match = /[\x04\x1a]\r?\n?$/.exec(chunk); var match = /[\x04\x1a]\r?\n?$/.exec(chunk);
if (match) { if (match) {
@ -311,9 +376,12 @@ if (specified["in-situ"]) {
} else { } else {
chunks.push(chunk); chunks.push(chunk);
} }
} : function(chunk) { }
: function (chunk) {
chunks.push(chunk); chunks.push(chunk);
}).once("end", function() { }
)
.once("end", function () {
files = { STDIN: chunks.join("") }; files = { STDIN: chunks.join("") };
run(); run();
}); });
@ -321,7 +389,9 @@ if (specified["in-situ"]) {
} }
function convert_ast(fn) { function convert_ast(fn) {
return UglifyJS.AST_Node.from_mozilla_ast(Object.keys(files).reduce(fn, null)); return UglifyJS.AST_Node.from_mozilla_ast(
Object.keys(files).reduce(fn, null)
);
} }
function run() { function run() {
@ -338,7 +408,7 @@ function run() {
var annotations = Object.create(null); var annotations = Object.create(null);
files = convert_ast(function (toplevel, name) { files = convert_ast(function (toplevel, name) {
var content = files[name]; var content = files[name];
var list = annotations[name] = []; var list = (annotations[name] = []);
var prev = -1; var prev = -1;
return require("acorn").parse(content, { return require("acorn").parse(content, {
allowHashBang: true, allowHashBang: true,
@ -360,18 +430,21 @@ function run() {
sourceType: "module", sourceType: "module",
}); });
}); });
files.walk(new UglifyJS.TreeWalker(function(node) { files.walk(
new UglifyJS.TreeWalker(function (node) {
if (!(node instanceof UglifyJS.AST_Call)) return; if (!(node instanceof UglifyJS.AST_Call)) return;
var list = annotations[node.start.file]; var list = annotations[node.start.file];
var pure = list[node.start.pos]; var pure = list[node.start.pos];
if (!pure) { if (!pure) {
var tokens = node.start.parens; var tokens = node.start.parens;
if (tokens) for (var i = 0; !pure && i < tokens.length; i++) { if (tokens)
for (var i = 0; !pure && i < tokens.length; i++) {
pure = list[tokens[i].pos]; pure = list[tokens[i].pos];
} }
} }
if (pure) node.pure = pure; if (pure) node.pure = pure;
})); })
);
} else if (options.parse.spidermonkey) { } else if (options.parse.spidermonkey) {
files = convert_ast(function (toplevel, name) { files = convert_ast(function (toplevel, name) {
var obj = JSON.parse(files[name]); var obj = JSON.parse(files[name]);
@ -399,7 +472,9 @@ function run() {
if (result.error) { if (result.error) {
var ex = result.error; var ex = result.error;
if (ex.name == "SyntaxError") { if (ex.name == "SyntaxError") {
print_error("Parse error at " + ex.filename + ":" + ex.line + "," + ex.col); print_error(
"Parse error at " + ex.filename + ":" + ex.line + "," + ex.col
);
var file = files[ex.filename]; var file = files[ex.filename];
if (file) { if (file) {
var col = ex.col; var col = ex.col;
@ -428,7 +503,8 @@ function run() {
if (!options.compress && !options.mangle) { if (!options.compress && !options.mangle) {
var toplevel = result.ast; var toplevel = result.ast;
if (!(toplevel instanceof UglifyJS.AST_Toplevel)) { if (!(toplevel instanceof UglifyJS.AST_Toplevel)) {
if (!(toplevel instanceof UglifyJS.AST_Statement)) toplevel = new UglifyJS.AST_SimpleStatement({ if (!(toplevel instanceof UglifyJS.AST_Statement))
toplevel = new UglifyJS.AST_SimpleStatement({
body: toplevel, body: toplevel,
}); });
toplevel = new UglifyJS.AST_Toplevel({ toplevel = new UglifyJS.AST_Toplevel({
@ -437,8 +513,12 @@ function run() {
} }
toplevel.figure_out_scope({}); toplevel.figure_out_scope({});
} }
print(JSON.stringify(result.ast, function(key, value) { print(
if (value) switch (key) { JSON.stringify(
result.ast,
function (key, value) {
if (value)
switch (key) {
case "enclosed": case "enclosed":
return value.length ? value.map(symdef) : undefined; return value.length ? value.map(symdef) : undefined;
case "functions": case "functions":
@ -453,7 +533,7 @@ function run() {
if (value instanceof UglifyJS.Dictionary) return; if (value instanceof UglifyJS.Dictionary) return;
if (value instanceof UglifyJS.AST_Node) { if (value instanceof UglifyJS.AST_Node) {
var result = { var result = {
_class: "AST_" + value.TYPE _class: "AST_" + value.TYPE,
}; };
value.CTOR.PROPS.forEach(function (prop) { value.CTOR.PROPS.forEach(function (prop) {
result[prop] = value[prop]; result[prop] = value[prop];
@ -461,7 +541,10 @@ function run() {
return result; return result;
} }
return value; return value;
}, 2)); },
2
)
);
} else if (output == "spidermonkey") { } else if (output == "spidermonkey") {
print(JSON.stringify(result.ast.to_mozilla_ast(), null, 2)); print(JSON.stringify(result.ast.to_mozilla_ast(), null, 2));
} else if (output) { } else if (output) {
@ -471,7 +554,9 @@ function run() {
for (var name in options.output) { for (var name in options.output) {
if (!/^ast|code$/.test(name)) opts[name] = options.output[name]; if (!/^ast|code$/.test(name)) opts[name] = options.output[name];
} }
code = UglifyJS.AST_Node.from_mozilla_ast(result.ast.to_mozilla_ast()).print_to_string(opts); code = UglifyJS.AST_Node.from_mozilla_ast(
result.ast.to_mozilla_ast()
).print_to_string(opts);
} else { } else {
code = result.code; code = result.code;
} }
@ -481,14 +566,15 @@ function run() {
print(result.code); print(result.code);
} }
if (nameCache) fs.writeFileSync(nameCache, JSON.stringify(options.nameCache)); if (nameCache) fs.writeFileSync(nameCache, JSON.stringify(options.nameCache));
if (result.timings) for (var phase in result.timings) { if (result.timings)
for (var phase in result.timings) {
print_error("- " + phase + ": " + result.timings[phase].toFixed(3) + "s"); print_error("- " + phase + ": " + result.timings[phase].toFixed(3) + "s");
} }
} }
function fatal(message) { function fatal(message) {
if (message instanceof Error) { if (message instanceof Error) {
message = message.stack.replace(/^\S*?Error:/, "ERROR:") message = message.stack.replace(/^\S*?Error:/, "ERROR:");
} else { } else {
message = "ERROR: " + message; message = "ERROR: " + message;
} }
@ -514,15 +600,22 @@ function simple_glob(paths) {
}); });
} catch (ex) {} } catch (ex) {}
if (entries) { if (entries) {
var pattern = "^" + path.basename(glob) var pattern =
"^" +
path
.basename(glob)
.replace(/[.+^$[\]\\(){}]/g, "\\$&") .replace(/[.+^$[\]\\(){}]/g, "\\$&")
.replace(/\*/g, "[^/\\\\]*") .replace(/\*/g, "[^/\\\\]*")
.replace(/\?/g, "[^/\\\\]") + "$"; .replace(/\?/g, "[^/\\\\]") +
"$";
var mod = process.platform === "win32" ? "i" : ""; var mod = process.platform === "win32" ? "i" : "";
var rx = new RegExp(pattern, mod); var rx = new RegExp(pattern, mod);
var results = entries.filter(function(name) { var results = entries
.filter(function (name) {
return rx.test(name); return rx.test(name);
}).sort().map(function(name) { })
.sort()
.map(function (name) {
return path.join(dir, name); return path.join(dir, name);
}); });
if (results.length) { if (results.length) {
@ -547,10 +640,12 @@ function read_file(path, default_value) {
function parse_js(value, options, flag) { function parse_js(value, options, flag) {
if (!options || typeof options != "object") options = Object.create(null); if (!options || typeof options != "object") options = Object.create(null);
if (typeof value == "string") try { if (typeof value == "string")
try {
UglifyJS.parse(value, { UglifyJS.parse(value, {
expression: true expression: true,
}).walk(new UglifyJS.TreeWalker(function(node) { }).walk(
new UglifyJS.TreeWalker(function (node) {
if (node instanceof UglifyJS.AST_Assign) { if (node instanceof UglifyJS.AST_Assign) {
var name = node.left.print_to_string(); var name = node.left.print_to_string();
var value = node.right; var value = node.right;
@ -563,7 +658,10 @@ function parse_js(value, options, flag) {
} }
return true; return true;
} }
if (node instanceof UglifyJS.AST_Symbol || node instanceof UglifyJS.AST_PropAccess) { if (
node instanceof UglifyJS.AST_Symbol ||
node instanceof UglifyJS.AST_PropAccess
) {
var name = node.print_to_string(); var name = node.print_to_string();
options[name] = true; options[name] = true;
return true; return true;
@ -571,11 +669,14 @@ function parse_js(value, options, flag) {
if (!(node instanceof UglifyJS.AST_Sequence)) throw node; if (!(node instanceof UglifyJS.AST_Sequence)) throw node;
function to_string(value) { function to_string(value) {
return value instanceof UglifyJS.AST_Constant ? value.value : value.print_to_string({ return value instanceof UglifyJS.AST_Constant
quote_keys: true ? value.value
: value.print_to_string({
quote_keys: true,
}); });
} }
})); })
);
} catch (ex) { } catch (ex) {
if (flag) { if (flag) {
fatal("cannot parse arguments for '" + flag + "': " + value); fatal("cannot parse arguments for '" + flag + "': " + value);
@ -587,13 +688,15 @@ function parse_js(value, options, flag) {
} }
function skip_property(key, value) { function skip_property(key, value) {
return skip_keys.indexOf(key) >= 0 return (
skip_keys.indexOf(key) >= 0 ||
// only skip truthy_keys if their value is falsy // only skip truthy_keys if their value is falsy
|| truthy_keys.indexOf(key) >= 0 && !value; (truthy_keys.indexOf(key) >= 0 && !value)
);
} }
function symdef(def) { function symdef(def) {
var ret = (1e6 + def.id) + " " + def.name; var ret = 1e6 + def.id + " " + def.name;
if (def.mangled_name) ret += " " + def.mangled_name; if (def.mangled_name) ret += " " + def.mangled_name;
return ret; return ret;
} }
@ -601,11 +704,16 @@ function symdef(def) {
function format_object(obj) { function format_object(obj) {
var lines = []; var lines = [];
var padding = ""; var padding = "";
Object.keys(obj).map(function(name) { Object.keys(obj)
if (padding.length < name.length) padding = Array(name.length + 1).join(" "); .map(function (name) {
if (padding.length < name.length)
padding = Array(name.length + 1).join(" ");
return [name, JSON.stringify(obj[name])]; return [name, JSON.stringify(obj[name])];
}).forEach(function(tokens) { })
lines.push(" " + tokens[0] + padding.slice(tokens[0].length - 2) + tokens[1]); .forEach(function (tokens) {
lines.push(
" " + tokens[0] + padding.slice(tokens[0].length - 2) + tokens[1]
);
}); });
return lines.join("\n"); return lines.join("\n");
} }