Compare commits
34 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2a5277b391 | ||
|
|
d47547dc71 | ||
|
|
304db15a20 | ||
|
|
7cf72b8d66 | ||
|
|
cea685f8d9 | ||
|
|
8d4b5344f4 | ||
|
|
34a0ab6f2c | ||
|
|
bcebacbb9e | ||
|
|
018a5a750a | ||
|
|
b468103f26 | ||
|
|
66c126ffde | ||
|
|
fdee083465 | ||
|
|
5ffc17d4aa | ||
|
|
6aa750010f | ||
|
|
76df77c08c | ||
|
|
957d5537a8 | ||
|
|
88c8f4e363 | ||
|
|
ab36b9b10a | ||
|
|
28330913d8 | ||
|
|
766a4147d4 | ||
|
|
915c7e234d | ||
|
|
e54ddcbb8a | ||
|
|
9e19e63551 | ||
|
|
bce7ee5f6a | ||
|
|
b39043f3ab | ||
|
|
caf96acb08 | ||
|
|
c76749084b | ||
|
|
5843494ee2 | ||
|
|
efa21ae3e6 | ||
|
|
24d9633a35 | ||
|
|
7963b96681 | ||
|
|
8c62d854ce | ||
|
|
69931574e1 | ||
|
|
b5af8a1914 |
42
.travis.yml
42
.travis.yml
@@ -1,14 +1,34 @@
|
|||||||
language: node_js
|
addons:
|
||||||
node_js:
|
apt:
|
||||||
- "0.10"
|
sources:
|
||||||
- "0.12"
|
- ubuntu-toolchain-r-test
|
||||||
- "4"
|
packages:
|
||||||
- "6"
|
- libstdc++-4.9-dev
|
||||||
- "8"
|
cache:
|
||||||
env:
|
directories: tmp
|
||||||
- UGLIFYJS_TEST_ALL=1
|
language: generic
|
||||||
matrix:
|
matrix:
|
||||||
fast_finish: true
|
fast_finish: true
|
||||||
sudo: false
|
sudo: false
|
||||||
cache:
|
env:
|
||||||
directories: tmp
|
global:
|
||||||
|
- UGLIFYJS_TEST_ALL=1
|
||||||
|
matrix:
|
||||||
|
- NODEJS_VER=node/0.10
|
||||||
|
- NODEJS_VER=node/0.12
|
||||||
|
- NODEJS_VER=node/4
|
||||||
|
- NODEJS_VER=node/6
|
||||||
|
- NODEJS_VER=node/8
|
||||||
|
- NODEJS_VER=node/latest
|
||||||
|
before_install:
|
||||||
|
- git clone --branch v1.4.2 --depth 1 https://github.com/jasongin/nvs.git ~/.nvs
|
||||||
|
- . ~/.nvs/nvs.sh
|
||||||
|
- nvs --version
|
||||||
|
install:
|
||||||
|
- nvs add $NODEJS_VER
|
||||||
|
- nvs use $NODEJS_VER
|
||||||
|
- node --version
|
||||||
|
- npm --version --no-update-notifier
|
||||||
|
- npm install --no-optional --no-save --no-update-notifier
|
||||||
|
script:
|
||||||
|
- npm test --no-update-notifier
|
||||||
|
|||||||
@@ -104,6 +104,8 @@ a double dash to prevent input files being used as option arguments:
|
|||||||
sequences.
|
sequences.
|
||||||
--config-file <file> Read `minify()` options from JSON file.
|
--config-file <file> Read `minify()` options from JSON file.
|
||||||
-d, --define <expr>[=value] Global definitions.
|
-d, --define <expr>[=value] Global definitions.
|
||||||
|
-e, --enclose [arg[:value]] Embed everything in a big function, with configurable
|
||||||
|
argument(s) & value(s).
|
||||||
--ie8 Support non-standard Internet Explorer 8.
|
--ie8 Support non-standard Internet Explorer 8.
|
||||||
Equivalent to setting `ie8: true` in `minify()`
|
Equivalent to setting `ie8: true` in `minify()`
|
||||||
for `compress`, `mangle` and `output` options.
|
for `compress`, `mangle` and `output` options.
|
||||||
@@ -618,6 +620,8 @@ If you're using the `X-SourceMap` header instead, you can just omit `sourceMap.u
|
|||||||
|
|
||||||
- `dead_code` (default: `true`) -- remove unreachable code
|
- `dead_code` (default: `true`) -- remove unreachable code
|
||||||
|
|
||||||
|
- `directives` (default: `true`) -- remove redundant or non-standard directives
|
||||||
|
|
||||||
- `drop_console` (default: `false`) -- Pass `true` to discard calls to
|
- `drop_console` (default: `false`) -- Pass `true` to discard calls to
|
||||||
`console.*` functions. If you wish to drop a specific function call
|
`console.*` functions. If you wish to drop a specific function call
|
||||||
such as `console.info` and/or retain side effects from function arguments
|
such as `console.info` and/or retain side effects from function arguments
|
||||||
@@ -853,8 +857,8 @@ can pass additional arguments that control the code output:
|
|||||||
adjust for this text. Can be used to insert a comment containing
|
adjust for this text. Can be used to insert a comment containing
|
||||||
licensing information, for example.
|
licensing information, for example.
|
||||||
|
|
||||||
- `preserve_line` (default `false`) -- pass `true` to preserve lines, but it
|
- `preserve_line` (default `false`) -- pass `true` to retain line numbering on
|
||||||
only works if `beautify` is set to `false`.
|
a best effort basis.
|
||||||
|
|
||||||
- `quote_keys` (default `false`) -- pass `true` to quote all keys in literal
|
- `quote_keys` (default `false`) -- pass `true` to quote all keys in literal
|
||||||
objects
|
objects
|
||||||
|
|||||||
27
appveyor.yml
27
appveyor.yml
@@ -1,20 +1,25 @@
|
|||||||
environment:
|
environment:
|
||||||
|
UGLIFYJS_TEST_ALL: 1
|
||||||
matrix:
|
matrix:
|
||||||
- nodejs_version: "0.10"
|
- NODEJS_VER: node/0.10
|
||||||
- nodejs_version: "0.12"
|
- NODEJS_VER: node/0.12
|
||||||
- nodejs_version: "4"
|
- NODEJS_VER: node/4
|
||||||
- nodejs_version: "6"
|
- NODEJS_VER: node/6
|
||||||
- nodejs_version: "8"
|
- NODEJS_VER: node/8
|
||||||
|
- NODEJS_VER: node/latest
|
||||||
install:
|
install:
|
||||||
- ps: Install-Product node $env:nodejs_version
|
- git clone --branch v1.4.2 --depth 1 https://github.com/jasongin/nvs.git %LOCALAPPDATA%\nvs
|
||||||
- set UGLIFYJS_TEST_ALL=1
|
- set PATH=%LOCALAPPDATA%\nvs;%PATH%
|
||||||
- npm install
|
- nvs --version
|
||||||
|
- nvs add %NODEJS_VER%
|
||||||
|
- nvs use %NODEJS_VER%
|
||||||
|
- node --version
|
||||||
|
- npm --version --no-update-notifier
|
||||||
|
- npm install --no-optional --no-save --no-update-notifier
|
||||||
build: off
|
build: off
|
||||||
cache:
|
cache:
|
||||||
- tmp
|
- tmp
|
||||||
matrix:
|
matrix:
|
||||||
fast_finish: true
|
fast_finish: true
|
||||||
test_script:
|
test_script:
|
||||||
- node --version
|
- npm test --no-update-notifier
|
||||||
- npm --version
|
|
||||||
- npm test
|
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ program.option("-o, --output <file>", "Output file (default STDOUT).");
|
|||||||
program.option("--comments [filter]", "Preserve copyright comments in the output.");
|
program.option("--comments [filter]", "Preserve copyright comments in the output.");
|
||||||
program.option("--config-file <file>", "Read minify() options from JSON file.");
|
program.option("--config-file <file>", "Read minify() options from JSON file.");
|
||||||
program.option("-d, --define <expr>[=value]", "Global definitions.", parse_js("define"));
|
program.option("-d, --define <expr>[=value]", "Global definitions.", parse_js("define"));
|
||||||
|
program.option("-e, --enclose [arg[,...][:value[,...]]]", "Embed everything in a big function, with configurable argument(s) & value(s).");
|
||||||
program.option("--ie8", "Support non-standard Internet Explorer 8.");
|
program.option("--ie8", "Support non-standard Internet Explorer 8.");
|
||||||
program.option("--keep-fnames", "Do not mangle/drop function names. Useful for code relying on Function.prototype.name.");
|
program.option("--keep-fnames", "Do not mangle/drop function names. Useful for code relying on Function.prototype.name.");
|
||||||
program.option("--name-cache <file>", "File to hold mangled name mappings.");
|
program.option("--name-cache <file>", "File to hold mangled name mappings.");
|
||||||
@@ -47,7 +48,7 @@ program.option("--rename", "Force symbol expansion.");
|
|||||||
program.option("--no-rename", "Disable symbol expansion.");
|
program.option("--no-rename", "Disable symbol expansion.");
|
||||||
program.option("--self", "Build UglifyJS as a library (implies --wrap UglifyJS)");
|
program.option("--self", "Build UglifyJS as a library (implies --wrap UglifyJS)");
|
||||||
program.option("--source-map [options]", "Enable source map/specify source map options.", parse_js());
|
program.option("--source-map [options]", "Enable source map/specify source map options.", parse_js());
|
||||||
program.option("--timings", "Display operations run time on STDERR.")
|
program.option("--timings", "Display operations run time on STDERR.");
|
||||||
program.option("--toplevel", "Compress and/or mangle variables in toplevel scope.");
|
program.option("--toplevel", "Compress and/or mangle variables in toplevel scope.");
|
||||||
program.option("--verbose", "Print diagnostic messages.");
|
program.option("--verbose", "Print diagnostic messages.");
|
||||||
program.option("--warn", "Print warning messages.");
|
program.option("--warn", "Print warning messages.");
|
||||||
@@ -61,6 +62,7 @@ if (!program.output && program.sourceMap && program.sourceMap.url != "inline") {
|
|||||||
}
|
}
|
||||||
[
|
[
|
||||||
"compress",
|
"compress",
|
||||||
|
"enclose",
|
||||||
"ie8",
|
"ie8",
|
||||||
"mangle",
|
"mangle",
|
||||||
"sourceMap",
|
"sourceMap",
|
||||||
@@ -98,7 +100,7 @@ if (program.mangleProps) {
|
|||||||
if (typeof program.mangleProps != "object") program.mangleProps = {};
|
if (typeof program.mangleProps != "object") program.mangleProps = {};
|
||||||
if (!Array.isArray(program.mangleProps.reserved)) program.mangleProps.reserved = [];
|
if (!Array.isArray(program.mangleProps.reserved)) program.mangleProps.reserved = [];
|
||||||
require("../tools/domprops").forEach(function(name) {
|
require("../tools/domprops").forEach(function(name) {
|
||||||
UglifyJS._push_uniq(program.mangleProps.reserved, name);
|
UglifyJS.push_uniq(program.mangleProps.reserved, name);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (typeof options.mangle != "object") options.mangle = {};
|
if (typeof options.mangle != "object") options.mangle = {};
|
||||||
|
|||||||
164
lib/ast.js
164
lib/ast.js
@@ -44,21 +44,21 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
function DEFNODE(type, props, methods, base) {
|
function DEFNODE(type, props, methods, base) {
|
||||||
if (arguments.length < 4) base = AST_Node;
|
if (typeof base === "undefined") base = AST_Node;
|
||||||
if (!props) props = [];
|
props = props ? props.split(/\s+/) : [];
|
||||||
else props = props.split(/\s+/);
|
|
||||||
var self_props = props;
|
var self_props = props;
|
||||||
if (base && base.PROPS)
|
if (base && base.PROPS) props = props.concat(base.PROPS);
|
||||||
props = props.concat(base.PROPS);
|
var code = [
|
||||||
var code = "return function AST_" + type + "(props){ if (props) { ";
|
"return function AST_", type, "(props){",
|
||||||
for (var i = props.length; --i >= 0;) {
|
"if(props){",
|
||||||
code += "this." + props[i] + " = props." + props[i] + ";";
|
];
|
||||||
}
|
props.forEach(function(prop) {
|
||||||
|
code.push("this.", prop, "=props.", prop, ";");
|
||||||
|
});
|
||||||
var proto = base && new base;
|
var proto = base && new base;
|
||||||
if (proto && proto.initialize || (methods && methods.initialize))
|
if (proto && proto.initialize || methods && methods.initialize) code.push("this.initialize();");
|
||||||
code += "this.initialize();";
|
code.push("}}");
|
||||||
code += "}}";
|
var ctor = new Function(code.join(""))();
|
||||||
var ctor = new Function(code)();
|
|
||||||
if (proto) {
|
if (proto) {
|
||||||
ctor.prototype = proto;
|
ctor.prototype = proto;
|
||||||
ctor.BASE = base;
|
ctor.BASE = base;
|
||||||
@@ -71,11 +71,11 @@ function DEFNODE(type, props, methods, base) {
|
|||||||
if (type) {
|
if (type) {
|
||||||
ctor.prototype.TYPE = ctor.TYPE = type;
|
ctor.prototype.TYPE = ctor.TYPE = type;
|
||||||
}
|
}
|
||||||
if (methods) for (i in methods) if (HOP(methods, i)) {
|
if (methods) for (var name in methods) if (HOP(methods, name)) {
|
||||||
if (/^\$/.test(i)) {
|
if (/^\$/.test(name)) {
|
||||||
ctor[i.substr(1)] = methods[i];
|
ctor[name.substr(1)] = methods[name];
|
||||||
} else {
|
} else {
|
||||||
ctor.prototype[i] = methods[i];
|
ctor.prototype[name] = methods[name];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ctor.DEFMETHOD = function(name, method) {
|
ctor.DEFMETHOD = function(name, method) {
|
||||||
@@ -85,7 +85,7 @@ function DEFNODE(type, props, methods, base) {
|
|||||||
exports["AST_" + type] = ctor;
|
exports["AST_" + type] = ctor;
|
||||||
}
|
}
|
||||||
return ctor;
|
return ctor;
|
||||||
};
|
}
|
||||||
|
|
||||||
var AST_Token = DEFNODE("Token", "type value line col pos endline endcol endpos nlb comments_before comments_after file raw", {
|
var AST_Token = DEFNODE("Token", "type value line col pos endline endcol endpos nlb comments_before comments_after file raw", {
|
||||||
}, null);
|
}, null);
|
||||||
@@ -118,10 +118,8 @@ var AST_Node = DEFNODE("Node", "start end", {
|
|||||||
}
|
}
|
||||||
}, null);
|
}, null);
|
||||||
|
|
||||||
AST_Node.warn_function = null;
|
|
||||||
AST_Node.warn = function(txt, props) {
|
AST_Node.warn = function(txt, props) {
|
||||||
if (AST_Node.warn_function)
|
if (AST_Node.warn_function) AST_Node.warn_function(string_template(txt, props));
|
||||||
AST_Node.warn_function(string_template(txt, props));
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* -----[ statements ]----- */
|
/* -----[ statements ]----- */
|
||||||
@@ -148,7 +146,7 @@ var AST_SimpleStatement = DEFNODE("SimpleStatement", "body", {
|
|||||||
body: "[AST_Node] an expression node (should not be instanceof AST_Statement)"
|
body: "[AST_Node] an expression node (should not be instanceof AST_Statement)"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
this.body._walk(visitor);
|
this.body._walk(visitor);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -158,11 +156,10 @@ function walk_body(node, visitor) {
|
|||||||
var body = node.body;
|
var body = node.body;
|
||||||
if (body instanceof AST_Statement) {
|
if (body instanceof AST_Statement) {
|
||||||
body._walk(visitor);
|
body._walk(visitor);
|
||||||
}
|
} else body.forEach(function(node) {
|
||||||
else for (var i = 0, len = body.length; i < len; i++) {
|
node._walk(visitor);
|
||||||
body[i]._walk(visitor);
|
});
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
var AST_Block = DEFNODE("Block", "body", {
|
var AST_Block = DEFNODE("Block", "body", {
|
||||||
$documentation: "A body of statements (usually braced)",
|
$documentation: "A body of statements (usually braced)",
|
||||||
@@ -170,7 +167,7 @@ var AST_Block = DEFNODE("Block", "body", {
|
|||||||
body: "[AST_Statement*] an array of statements"
|
body: "[AST_Statement*] an array of statements"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
walk_body(this, visitor);
|
walk_body(this, visitor);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -197,7 +194,7 @@ var AST_LabeledStatement = DEFNODE("LabeledStatement", "label", {
|
|||||||
label: "[AST_Label] a label definition"
|
label: "[AST_Label] a label definition"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
this.label._walk(visitor);
|
this.label._walk(visitor);
|
||||||
this.body._walk(visitor);
|
this.body._walk(visitor);
|
||||||
});
|
});
|
||||||
@@ -208,8 +205,7 @@ var AST_LabeledStatement = DEFNODE("LabeledStatement", "label", {
|
|||||||
var label = node.label;
|
var label = node.label;
|
||||||
var def = this.label;
|
var def = this.label;
|
||||||
node.walk(new TreeWalker(function(node) {
|
node.walk(new TreeWalker(function(node) {
|
||||||
if (node instanceof AST_LoopControl
|
if (node instanceof AST_LoopControl && node.label && node.label.thedef === def) {
|
||||||
&& node.label && node.label.thedef === def) {
|
|
||||||
node.label.thedef = label;
|
node.label.thedef = label;
|
||||||
label.references.push(node);
|
label.references.push(node);
|
||||||
}
|
}
|
||||||
@@ -233,7 +229,7 @@ var AST_DWLoop = DEFNODE("DWLoop", "condition", {
|
|||||||
var AST_Do = DEFNODE("Do", null, {
|
var AST_Do = DEFNODE("Do", null, {
|
||||||
$documentation: "A `do` statement",
|
$documentation: "A `do` statement",
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
this.body._walk(visitor);
|
this.body._walk(visitor);
|
||||||
this.condition._walk(visitor);
|
this.condition._walk(visitor);
|
||||||
});
|
});
|
||||||
@@ -243,7 +239,7 @@ var AST_Do = DEFNODE("Do", null, {
|
|||||||
var AST_While = DEFNODE("While", null, {
|
var AST_While = DEFNODE("While", null, {
|
||||||
$documentation: "A `while` statement",
|
$documentation: "A `while` statement",
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
this.condition._walk(visitor);
|
this.condition._walk(visitor);
|
||||||
this.body._walk(visitor);
|
this.body._walk(visitor);
|
||||||
});
|
});
|
||||||
@@ -258,7 +254,7 @@ var AST_For = DEFNODE("For", "init condition step", {
|
|||||||
step: "[AST_Node?] the `for` update clause, or null if empty"
|
step: "[AST_Node?] the `for` update clause, or null if empty"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
if (this.init) this.init._walk(visitor);
|
if (this.init) this.init._walk(visitor);
|
||||||
if (this.condition) this.condition._walk(visitor);
|
if (this.condition) this.condition._walk(visitor);
|
||||||
if (this.step) this.step._walk(visitor);
|
if (this.step) this.step._walk(visitor);
|
||||||
@@ -274,7 +270,7 @@ var AST_ForIn = DEFNODE("ForIn", "init object", {
|
|||||||
object: "[AST_Node] the object that we're looping through"
|
object: "[AST_Node] the object that we're looping through"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
this.init._walk(visitor);
|
this.init._walk(visitor);
|
||||||
this.object._walk(visitor);
|
this.object._walk(visitor);
|
||||||
this.body._walk(visitor);
|
this.body._walk(visitor);
|
||||||
@@ -288,7 +284,7 @@ var AST_With = DEFNODE("With", "expression", {
|
|||||||
expression: "[AST_Node] the `with` expression"
|
expression: "[AST_Node] the `with` expression"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
this.expression._walk(visitor);
|
this.expression._walk(visitor);
|
||||||
this.body._walk(visitor);
|
this.body._walk(visitor);
|
||||||
});
|
});
|
||||||
@@ -314,6 +310,9 @@ var AST_Scope = DEFNODE("Scope", "variables functions uses_with uses_eval parent
|
|||||||
if (this.functions) node.functions = this.functions.clone();
|
if (this.functions) node.functions = this.functions.clone();
|
||||||
if (this.enclosed) node.enclosed = this.enclosed.slice();
|
if (this.enclosed) node.enclosed = this.enclosed.slice();
|
||||||
return node;
|
return node;
|
||||||
|
},
|
||||||
|
pinned: function() {
|
||||||
|
return this.uses_eval || this.uses_with;
|
||||||
}
|
}
|
||||||
}, AST_Block);
|
}, AST_Block);
|
||||||
|
|
||||||
@@ -326,12 +325,29 @@ var AST_Toplevel = DEFNODE("Toplevel", "globals", {
|
|||||||
var body = this.body;
|
var body = this.body;
|
||||||
var wrapped_tl = "(function(exports){'$ORIG';})(typeof " + name + "=='undefined'?(" + name + "={}):" + name + ");";
|
var wrapped_tl = "(function(exports){'$ORIG';})(typeof " + name + "=='undefined'?(" + name + "={}):" + name + ");";
|
||||||
wrapped_tl = parse(wrapped_tl);
|
wrapped_tl = parse(wrapped_tl);
|
||||||
wrapped_tl = wrapped_tl.transform(new TreeTransformer(function before(node){
|
wrapped_tl = wrapped_tl.transform(new TreeTransformer(function(node) {
|
||||||
if (node instanceof AST_Directive && node.value == "$ORIG") {
|
if (node instanceof AST_Directive && node.value == "$ORIG") {
|
||||||
return MAP.splice(body);
|
return MAP.splice(body);
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
return wrapped_tl;
|
return wrapped_tl;
|
||||||
|
},
|
||||||
|
wrap_enclose: function(args_values) {
|
||||||
|
if (typeof args_values != "string") args_values = "";
|
||||||
|
var index = args_values.indexOf(":");
|
||||||
|
if (index < 0) index = args_values.length;
|
||||||
|
var body = this.body;
|
||||||
|
return parse([
|
||||||
|
"(function(",
|
||||||
|
args_values.slice(0, index),
|
||||||
|
'){"$ORIG"})(',
|
||||||
|
args_values.slice(index + 1),
|
||||||
|
")"
|
||||||
|
].join("")).transform(new TreeTransformer(function(node) {
|
||||||
|
if (node instanceof AST_Directive && node.value == "$ORIG") {
|
||||||
|
return MAP.splice(body);
|
||||||
|
}
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
}, AST_Scope);
|
}, AST_Scope);
|
||||||
|
|
||||||
@@ -343,12 +359,11 @@ var AST_Lambda = DEFNODE("Lambda", "name argnames uses_arguments", {
|
|||||||
uses_arguments: "[boolean/S] tells whether this function accesses the arguments array"
|
uses_arguments: "[boolean/S] tells whether this function accesses the arguments array"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
if (this.name) this.name._walk(visitor);
|
if (this.name) this.name._walk(visitor);
|
||||||
var argnames = this.argnames;
|
this.argnames.forEach(function(argname) {
|
||||||
for (var i = 0, len = argnames.length; i < len; i++) {
|
argname._walk(visitor);
|
||||||
argnames[i]._walk(visitor);
|
});
|
||||||
}
|
|
||||||
walk_body(this, visitor);
|
walk_body(this, visitor);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -378,7 +393,7 @@ var AST_Exit = DEFNODE("Exit", "value", {
|
|||||||
value: "[AST_Node?] the value returned or thrown by this statement; could be null for AST_Return"
|
value: "[AST_Node?] the value returned or thrown by this statement; could be null for AST_Return"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, this.value && function(){
|
return visitor._visit(this, this.value && function() {
|
||||||
this.value._walk(visitor);
|
this.value._walk(visitor);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -398,7 +413,7 @@ var AST_LoopControl = DEFNODE("LoopControl", "label", {
|
|||||||
label: "[AST_LabelRef?] the label, or null if none",
|
label: "[AST_LabelRef?] the label, or null if none",
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, this.label && function(){
|
return visitor._visit(this, this.label && function() {
|
||||||
this.label._walk(visitor);
|
this.label._walk(visitor);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -421,7 +436,7 @@ var AST_If = DEFNODE("If", "condition alternative", {
|
|||||||
alternative: "[AST_Statement?] the `else` part, or null if not present"
|
alternative: "[AST_Statement?] the `else` part, or null if not present"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
this.condition._walk(visitor);
|
this.condition._walk(visitor);
|
||||||
this.body._walk(visitor);
|
this.body._walk(visitor);
|
||||||
if (this.alternative) this.alternative._walk(visitor);
|
if (this.alternative) this.alternative._walk(visitor);
|
||||||
@@ -437,7 +452,7 @@ var AST_Switch = DEFNODE("Switch", "expression", {
|
|||||||
expression: "[AST_Node] the `switch` “discriminant”"
|
expression: "[AST_Node] the `switch` “discriminant”"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
this.expression._walk(visitor);
|
this.expression._walk(visitor);
|
||||||
walk_body(this, visitor);
|
walk_body(this, visitor);
|
||||||
});
|
});
|
||||||
@@ -458,7 +473,7 @@ var AST_Case = DEFNODE("Case", "expression", {
|
|||||||
expression: "[AST_Node] the `case` expression"
|
expression: "[AST_Node] the `case` expression"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
this.expression._walk(visitor);
|
this.expression._walk(visitor);
|
||||||
walk_body(this, visitor);
|
walk_body(this, visitor);
|
||||||
});
|
});
|
||||||
@@ -474,7 +489,7 @@ var AST_Try = DEFNODE("Try", "bcatch bfinally", {
|
|||||||
bfinally: "[AST_Finally?] the finally block, or null if not present"
|
bfinally: "[AST_Finally?] the finally block, or null if not present"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
walk_body(this, visitor);
|
walk_body(this, visitor);
|
||||||
if (this.bcatch) this.bcatch._walk(visitor);
|
if (this.bcatch) this.bcatch._walk(visitor);
|
||||||
if (this.bfinally) this.bfinally._walk(visitor);
|
if (this.bfinally) this.bfinally._walk(visitor);
|
||||||
@@ -488,7 +503,7 @@ var AST_Catch = DEFNODE("Catch", "argname", {
|
|||||||
argname: "[AST_SymbolCatch] symbol for the exception"
|
argname: "[AST_SymbolCatch] symbol for the exception"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
this.argname._walk(visitor);
|
this.argname._walk(visitor);
|
||||||
walk_body(this, visitor);
|
walk_body(this, visitor);
|
||||||
});
|
});
|
||||||
@@ -507,11 +522,10 @@ var AST_Definitions = DEFNODE("Definitions", "definitions", {
|
|||||||
definitions: "[AST_VarDef*] array of variable definitions"
|
definitions: "[AST_VarDef*] array of variable definitions"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
var definitions = this.definitions;
|
this.definitions.forEach(function(defn) {
|
||||||
for (var i = 0, len = definitions.length; i < len; i++) {
|
defn._walk(visitor);
|
||||||
definitions[i]._walk(visitor);
|
});
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}, AST_Statement);
|
}, AST_Statement);
|
||||||
@@ -527,7 +541,7 @@ var AST_VarDef = DEFNODE("VarDef", "name value", {
|
|||||||
value: "[AST_Node?] initializer, or null of there's no initializer"
|
value: "[AST_Node?] initializer, or null of there's no initializer"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
this.name._walk(visitor);
|
this.name._walk(visitor);
|
||||||
if (this.value) this.value._walk(visitor);
|
if (this.value) this.value._walk(visitor);
|
||||||
});
|
});
|
||||||
@@ -562,7 +576,7 @@ var AST_Sequence = DEFNODE("Sequence", "expressions", {
|
|||||||
expressions: "[AST_Node*] array of expressions (at least two)"
|
expressions: "[AST_Node*] array of expressions (at least two)"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
this.expressions.forEach(function(node) {
|
this.expressions.forEach(function(node) {
|
||||||
node._walk(visitor);
|
node._walk(visitor);
|
||||||
});
|
});
|
||||||
@@ -581,7 +595,7 @@ var AST_PropAccess = DEFNODE("PropAccess", "expression property", {
|
|||||||
var AST_Dot = DEFNODE("Dot", null, {
|
var AST_Dot = DEFNODE("Dot", null, {
|
||||||
$documentation: "A dotted property access expression",
|
$documentation: "A dotted property access expression",
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
this.expression._walk(visitor);
|
this.expression._walk(visitor);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -590,7 +604,7 @@ var AST_Dot = DEFNODE("Dot", null, {
|
|||||||
var AST_Sub = DEFNODE("Sub", null, {
|
var AST_Sub = DEFNODE("Sub", null, {
|
||||||
$documentation: "Index-style property access, i.e. `a[\"foo\"]`",
|
$documentation: "Index-style property access, i.e. `a[\"foo\"]`",
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
this.expression._walk(visitor);
|
this.expression._walk(visitor);
|
||||||
this.property._walk(visitor);
|
this.property._walk(visitor);
|
||||||
});
|
});
|
||||||
@@ -604,7 +618,7 @@ var AST_Unary = DEFNODE("Unary", "operator expression", {
|
|||||||
expression: "[AST_Node] expression that this unary operator applies to"
|
expression: "[AST_Node] expression that this unary operator applies to"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
this.expression._walk(visitor);
|
this.expression._walk(visitor);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -626,7 +640,7 @@ var AST_Binary = DEFNODE("Binary", "operator left right", {
|
|||||||
right: "[AST_Node] right-hand side expression"
|
right: "[AST_Node] right-hand side expression"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
this.left._walk(visitor);
|
this.left._walk(visitor);
|
||||||
this.right._walk(visitor);
|
this.right._walk(visitor);
|
||||||
});
|
});
|
||||||
@@ -641,7 +655,7 @@ var AST_Conditional = DEFNODE("Conditional", "condition consequent alternative",
|
|||||||
alternative: "[AST_Node]"
|
alternative: "[AST_Node]"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
this.condition._walk(visitor);
|
this.condition._walk(visitor);
|
||||||
this.consequent._walk(visitor);
|
this.consequent._walk(visitor);
|
||||||
this.alternative._walk(visitor);
|
this.alternative._walk(visitor);
|
||||||
@@ -661,11 +675,10 @@ var AST_Array = DEFNODE("Array", "elements", {
|
|||||||
elements: "[AST_Node*] array of elements"
|
elements: "[AST_Node*] array of elements"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
var elements = this.elements;
|
this.elements.forEach(function(element) {
|
||||||
for (var i = 0, len = elements.length; i < len; i++) {
|
element._walk(visitor);
|
||||||
elements[i]._walk(visitor);
|
});
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -676,11 +689,10 @@ var AST_Object = DEFNODE("Object", "properties", {
|
|||||||
properties: "[AST_ObjectProperty*] array of properties"
|
properties: "[AST_ObjectProperty*] array of properties"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
var properties = this.properties;
|
this.properties.forEach(function(prop) {
|
||||||
for (var i = 0, len = properties.length; i < len; i++) {
|
prop._walk(visitor);
|
||||||
properties[i]._walk(visitor);
|
});
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -692,7 +704,7 @@ var AST_ObjectProperty = DEFNODE("ObjectProperty", "key value", {
|
|||||||
value: "[AST_Node] property value. For getters and setters this is an AST_Accessor."
|
value: "[AST_Node] property value. For getters and setters this is an AST_Accessor."
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function() {
|
||||||
this.value._walk(visitor);
|
this.value._walk(visitor);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -819,12 +831,12 @@ var AST_NaN = DEFNODE("NaN", null, {
|
|||||||
|
|
||||||
var AST_Undefined = DEFNODE("Undefined", null, {
|
var AST_Undefined = DEFNODE("Undefined", null, {
|
||||||
$documentation: "The `undefined` value",
|
$documentation: "The `undefined` value",
|
||||||
value: (function(){}())
|
value: function(){}()
|
||||||
}, AST_Atom);
|
}, AST_Atom);
|
||||||
|
|
||||||
var AST_Hole = DEFNODE("Hole", null, {
|
var AST_Hole = DEFNODE("Hole", null, {
|
||||||
$documentation: "A hole in an array",
|
$documentation: "A hole in an array",
|
||||||
value: (function(){}())
|
value: function(){}()
|
||||||
}, AST_Atom);
|
}, AST_Atom);
|
||||||
|
|
||||||
var AST_Infinity = DEFNODE("Infinity", null, {
|
var AST_Infinity = DEFNODE("Infinity", null, {
|
||||||
@@ -852,11 +864,11 @@ function TreeWalker(callback) {
|
|||||||
this.visit = callback;
|
this.visit = callback;
|
||||||
this.stack = [];
|
this.stack = [];
|
||||||
this.directives = Object.create(null);
|
this.directives = Object.create(null);
|
||||||
};
|
}
|
||||||
TreeWalker.prototype = {
|
TreeWalker.prototype = {
|
||||||
_visit: function(node, descend) {
|
_visit: function(node, descend) {
|
||||||
this.push(node);
|
this.push(node);
|
||||||
var ret = this.visit(node, descend ? function(){
|
var ret = this.visit(node, descend ? function() {
|
||||||
descend.call(node);
|
descend.call(node);
|
||||||
} : noop);
|
} : noop);
|
||||||
if (!ret && descend) {
|
if (!ret && descend) {
|
||||||
|
|||||||
1520
lib/compress.js
1520
lib/compress.js
File diff suppressed because it is too large
Load Diff
@@ -55,6 +55,7 @@ function minify(files, options) {
|
|||||||
try {
|
try {
|
||||||
options = defaults(options, {
|
options = defaults(options, {
|
||||||
compress: {},
|
compress: {},
|
||||||
|
enclose: false,
|
||||||
ie8: false,
|
ie8: false,
|
||||||
keep_fnames: false,
|
keep_fnames: false,
|
||||||
mangle: {},
|
mangle: {},
|
||||||
@@ -157,6 +158,9 @@ function minify(files, options) {
|
|||||||
if (options.wrap) {
|
if (options.wrap) {
|
||||||
toplevel = toplevel.wrap_commonjs(options.wrap);
|
toplevel = toplevel.wrap_commonjs(options.wrap);
|
||||||
}
|
}
|
||||||
|
if (options.enclose) {
|
||||||
|
toplevel = toplevel.wrap_enclose(options.enclose);
|
||||||
|
}
|
||||||
if (timings) timings.rename = Date.now();
|
if (timings) timings.rename = Date.now();
|
||||||
if (options.rename) {
|
if (options.rename) {
|
||||||
toplevel.figure_out_scope(options.mangle);
|
toplevel.figure_out_scope(options.mangle);
|
||||||
|
|||||||
@@ -43,11 +43,9 @@
|
|||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
(function(){
|
(function() {
|
||||||
|
function normalize_directives(body) {
|
||||||
var normalize_directives = function(body) {
|
|
||||||
var in_directive = true;
|
var in_directive = true;
|
||||||
|
|
||||||
for (var i = 0; i < body.length; i++) {
|
for (var i = 0; i < body.length; i++) {
|
||||||
if (in_directive && body[i] instanceof AST_Statement && body[i].body instanceof AST_String) {
|
if (in_directive && body[i] instanceof AST_Statement && body[i].body instanceof AST_String) {
|
||||||
body[i] = new AST_Directive({
|
body[i] = new AST_Directive({
|
||||||
@@ -59,9 +57,8 @@
|
|||||||
in_directive = false;
|
in_directive = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return body;
|
return body;
|
||||||
};
|
}
|
||||||
|
|
||||||
var MOZ_TO_ME = {
|
var MOZ_TO_ME = {
|
||||||
Program: function(M) {
|
Program: function(M) {
|
||||||
@@ -129,7 +126,7 @@
|
|||||||
return new AST_Array({
|
return new AST_Array({
|
||||||
start : my_start_token(M),
|
start : my_start_token(M),
|
||||||
end : my_end_token(M),
|
end : my_end_token(M),
|
||||||
elements : M.elements.map(function(elem){
|
elements : M.elements.map(function(elem) {
|
||||||
return elem === null ? new AST_Hole() : from_moz(elem);
|
return elem === null ? new AST_Hole() : from_moz(elem);
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
@@ -138,7 +135,7 @@
|
|||||||
return new AST_Object({
|
return new AST_Object({
|
||||||
start : my_start_token(M),
|
start : my_start_token(M),
|
||||||
end : my_end_token(M),
|
end : my_end_token(M),
|
||||||
properties : M.properties.map(function(prop){
|
properties : M.properties.map(function(prop) {
|
||||||
prop.type = "Property";
|
prop.type = "Property";
|
||||||
return from_moz(prop)
|
return from_moz(prop)
|
||||||
})
|
})
|
||||||
@@ -480,7 +477,7 @@
|
|||||||
endpos : range ? range[0] : moznode.start,
|
endpos : range ? range[0] : moznode.start,
|
||||||
raw : raw_token(moznode),
|
raw : raw_token(moznode),
|
||||||
});
|
});
|
||||||
};
|
}
|
||||||
|
|
||||||
function my_end_token(moznode) {
|
function my_end_token(moznode) {
|
||||||
var loc = moznode.loc, end = loc && loc.end;
|
var loc = moznode.loc, end = loc && loc.end;
|
||||||
@@ -495,7 +492,7 @@
|
|||||||
endpos : range ? range[1] : moznode.end,
|
endpos : range ? range[1] : moznode.end,
|
||||||
raw : raw_token(moznode),
|
raw : raw_token(moznode),
|
||||||
});
|
});
|
||||||
};
|
}
|
||||||
|
|
||||||
function map(moztype, mytype, propmap) {
|
function map(moztype, mytype, propmap) {
|
||||||
var moz_to_me = "function From_Moz_" + moztype + "(M){\n";
|
var moz_to_me = "function From_Moz_" + moztype + "(M){\n";
|
||||||
@@ -507,7 +504,7 @@
|
|||||||
me_to_moz += "return {\n" +
|
me_to_moz += "return {\n" +
|
||||||
"type: " + JSON.stringify(moztype);
|
"type: " + JSON.stringify(moztype);
|
||||||
|
|
||||||
if (propmap) propmap.split(/\s*,\s*/).forEach(function(prop){
|
if (propmap) propmap.split(/\s*,\s*/).forEach(function(prop) {
|
||||||
var m = /([a-z0-9$_]+)(=|@|>|%)([a-z0-9$_]+)/i.exec(prop);
|
var m = /([a-z0-9$_]+)(=|@|>|%)([a-z0-9$_]+)/i.exec(prop);
|
||||||
if (!m) throw new Error("Can't understand property map: " + prop);
|
if (!m) throw new Error("Can't understand property map: " + prop);
|
||||||
var moz = m[1], how = m[2], my = m[3];
|
var moz = m[1], how = m[2], my = m[3];
|
||||||
@@ -550,7 +547,7 @@
|
|||||||
);
|
);
|
||||||
MOZ_TO_ME[moztype] = moz_to_me;
|
MOZ_TO_ME[moztype] = moz_to_me;
|
||||||
def_to_moz(mytype, me_to_moz);
|
def_to_moz(mytype, me_to_moz);
|
||||||
};
|
}
|
||||||
|
|
||||||
var FROM_MOZ_STACK = null;
|
var FROM_MOZ_STACK = null;
|
||||||
|
|
||||||
@@ -559,9 +556,9 @@
|
|||||||
var ret = node != null ? MOZ_TO_ME[node.type](node) : null;
|
var ret = node != null ? MOZ_TO_ME[node.type](node) : null;
|
||||||
FROM_MOZ_STACK.pop();
|
FROM_MOZ_STACK.pop();
|
||||||
return ret;
|
return ret;
|
||||||
};
|
}
|
||||||
|
|
||||||
AST_Node.from_mozilla_ast = function(node){
|
AST_Node.from_mozilla_ast = function(node) {
|
||||||
var save_stack = FROM_MOZ_STACK;
|
var save_stack = FROM_MOZ_STACK;
|
||||||
FROM_MOZ_STACK = [];
|
FROM_MOZ_STACK = [];
|
||||||
var ast = from_moz(node);
|
var ast = from_moz(node);
|
||||||
@@ -600,24 +597,24 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return moznode;
|
return moznode;
|
||||||
};
|
}
|
||||||
|
|
||||||
function def_to_moz(mytype, handler) {
|
function def_to_moz(mytype, handler) {
|
||||||
mytype.DEFMETHOD("to_mozilla_ast", function() {
|
mytype.DEFMETHOD("to_mozilla_ast", function() {
|
||||||
return set_moz_loc(this, handler(this));
|
return set_moz_loc(this, handler(this));
|
||||||
});
|
});
|
||||||
};
|
}
|
||||||
|
|
||||||
function to_moz(node) {
|
function to_moz(node) {
|
||||||
return node != null ? node.to_mozilla_ast() : null;
|
return node != null ? node.to_mozilla_ast() : null;
|
||||||
};
|
}
|
||||||
|
|
||||||
function to_moz_block(node) {
|
function to_moz_block(node) {
|
||||||
return {
|
return {
|
||||||
type: "BlockStatement",
|
type: "BlockStatement",
|
||||||
body: node.body.map(to_moz)
|
body: node.body.map(to_moz)
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
function to_moz_scope(type, node) {
|
function to_moz_scope(type, node) {
|
||||||
var body = node.body.map(to_moz);
|
var body = node.body.map(to_moz);
|
||||||
@@ -628,5 +625,5 @@
|
|||||||
type: type,
|
type: type,
|
||||||
body: body
|
body: body
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
})();
|
})();
|
||||||
|
|||||||
321
lib/output.js
321
lib/output.js
@@ -137,7 +137,7 @@ function OutputStream(options) {
|
|||||||
function make_string(str, quote) {
|
function make_string(str, quote) {
|
||||||
var dq = 0, sq = 0;
|
var dq = 0, sq = 0;
|
||||||
str = str.replace(/[\\\b\f\n\r\v\t\x22\x27\u2028\u2029\0\ufeff]/g,
|
str = str.replace(/[\\\b\f\n\r\v\t\x22\x27\u2028\u2029\0\ufeff]/g,
|
||||||
function(s, i){
|
function(s, i) {
|
||||||
switch (s) {
|
switch (s) {
|
||||||
case '"': ++dq; return '"';
|
case '"': ++dq; return '"';
|
||||||
case "'": ++sq; return "'";
|
case "'": ++sq; return "'";
|
||||||
@@ -198,16 +198,24 @@ function OutputStream(options) {
|
|||||||
/* -----[ beautification/minification ]----- */
|
/* -----[ beautification/minification ]----- */
|
||||||
|
|
||||||
var has_parens = false;
|
var has_parens = false;
|
||||||
|
var line_end = 0;
|
||||||
|
var line_fixed = true;
|
||||||
var might_need_space = false;
|
var might_need_space = false;
|
||||||
var might_need_semicolon = false;
|
var might_need_semicolon = false;
|
||||||
var might_add_newline = 0;
|
|
||||||
var need_newline_indented = false;
|
var need_newline_indented = false;
|
||||||
var need_space = false;
|
var need_space = false;
|
||||||
var newline_insert = -1;
|
var newline_insert = -1;
|
||||||
var last = "";
|
var last = "";
|
||||||
var mapping_token, mapping_name, mappings = options.source_map && [];
|
var mapping_token, mapping_name, mappings = options.source_map && [];
|
||||||
|
|
||||||
var do_add_mapping = mappings ? function() {
|
var adjust_mappings = mappings ? function(line, col) {
|
||||||
|
mappings.forEach(function(mapping) {
|
||||||
|
mapping.line += line;
|
||||||
|
mapping.col += col;
|
||||||
|
});
|
||||||
|
} : noop;
|
||||||
|
|
||||||
|
var flush_mappings = mappings ? function() {
|
||||||
mappings.forEach(function(mapping) {
|
mappings.forEach(function(mapping) {
|
||||||
try {
|
try {
|
||||||
options.source_map.add(
|
options.source_map.add(
|
||||||
@@ -230,31 +238,30 @@ function OutputStream(options) {
|
|||||||
mappings = [];
|
mappings = [];
|
||||||
} : noop;
|
} : noop;
|
||||||
|
|
||||||
var ensure_line_len = options.max_line_len ? function() {
|
function insert_newlines(count) {
|
||||||
if (current_col > options.max_line_len) {
|
var index = OUTPUT.lastIndexOf("\n");
|
||||||
if (might_add_newline) {
|
if (line_end < index) line_end = index;
|
||||||
var left = OUTPUT.slice(0, might_add_newline);
|
var left = OUTPUT.slice(0, line_end);
|
||||||
var right = OUTPUT.slice(might_add_newline);
|
var right = OUTPUT.slice(line_end);
|
||||||
if (mappings) {
|
adjust_mappings(count, right.length - current_col);
|
||||||
var delta = right.length - current_col;
|
current_line += count;
|
||||||
mappings.forEach(function(mapping) {
|
current_pos += count;
|
||||||
mapping.line++;
|
current_col = right.length;
|
||||||
mapping.col += delta;
|
OUTPUT = left;
|
||||||
});
|
while (count--) OUTPUT += "\n";
|
||||||
}
|
OUTPUT += right;
|
||||||
OUTPUT = left + "\n" + right;
|
}
|
||||||
current_line++;
|
|
||||||
current_pos++;
|
var fix_line = options.max_line_len ? function() {
|
||||||
current_col = right.length;
|
if (line_fixed) {
|
||||||
}
|
|
||||||
if (current_col > options.max_line_len) {
|
if (current_col > options.max_line_len) {
|
||||||
AST_Node.warn("Output exceeds {max_line_len} characters", options);
|
AST_Node.warn("Output exceeds {max_line_len} characters", options);
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
if (might_add_newline) {
|
if (current_col > options.max_line_len) insert_newlines(1);
|
||||||
might_add_newline = 0;
|
line_fixed = true;
|
||||||
do_add_mapping();
|
flush_mappings();
|
||||||
}
|
|
||||||
} : noop;
|
} : noop;
|
||||||
|
|
||||||
var requireSemicolonChars = makePredicate("( [ + * / - , .");
|
var requireSemicolonChars = makePredicate("( [ + * / - , .");
|
||||||
@@ -286,7 +293,7 @@ function OutputStream(options) {
|
|||||||
current_col++;
|
current_col++;
|
||||||
current_pos++;
|
current_pos++;
|
||||||
} else {
|
} else {
|
||||||
ensure_line_len();
|
fix_line();
|
||||||
OUTPUT += "\n";
|
OUTPUT += "\n";
|
||||||
current_pos++;
|
current_pos++;
|
||||||
current_line++;
|
current_line++;
|
||||||
@@ -304,18 +311,6 @@ function OutputStream(options) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!options.beautify && options.preserve_line && stack[stack.length - 1]) {
|
|
||||||
var target_line = stack[stack.length - 1].start.line;
|
|
||||||
while (current_line < target_line) {
|
|
||||||
ensure_line_len();
|
|
||||||
OUTPUT += "\n";
|
|
||||||
current_pos++;
|
|
||||||
current_line++;
|
|
||||||
current_col = 0;
|
|
||||||
might_need_space = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (might_need_space) {
|
if (might_need_space) {
|
||||||
if ((is_identifier_char(prev)
|
if ((is_identifier_char(prev)
|
||||||
&& (is_identifier_char(ch) || ch == "\\"))
|
&& (is_identifier_char(ch) || ch == "\\"))
|
||||||
@@ -337,7 +332,7 @@ function OutputStream(options) {
|
|||||||
col: current_col
|
col: current_col
|
||||||
});
|
});
|
||||||
mapping_token = false;
|
mapping_token = false;
|
||||||
if (!might_add_newline) do_add_mapping();
|
if (line_fixed) flush_mappings();
|
||||||
}
|
}
|
||||||
|
|
||||||
OUTPUT += str;
|
OUTPUT += str;
|
||||||
@@ -347,7 +342,7 @@ function OutputStream(options) {
|
|||||||
current_line += n;
|
current_line += n;
|
||||||
current_col += a[0].length;
|
current_col += a[0].length;
|
||||||
if (n > 0) {
|
if (n > 0) {
|
||||||
ensure_line_len();
|
fix_line();
|
||||||
current_col = a[n].length;
|
current_col = a[n].length;
|
||||||
}
|
}
|
||||||
last = str;
|
last = str;
|
||||||
@@ -374,9 +369,10 @@ function OutputStream(options) {
|
|||||||
return ret;
|
return ret;
|
||||||
} : function(col, cont) { return cont() };
|
} : function(col, cont) { return cont() };
|
||||||
|
|
||||||
var may_add_newline = options.max_line_len ? function() {
|
var may_add_newline = options.max_line_len || options.preserve_line ? function() {
|
||||||
ensure_line_len();
|
fix_line();
|
||||||
might_add_newline = OUTPUT.length;
|
line_end = OUTPUT.length;
|
||||||
|
line_fixed = false;
|
||||||
} : noop;
|
} : noop;
|
||||||
|
|
||||||
var newline = options.beautify ? function() {
|
var newline = options.beautify ? function() {
|
||||||
@@ -408,7 +404,7 @@ function OutputStream(options) {
|
|||||||
var ret;
|
var ret;
|
||||||
print("{");
|
print("{");
|
||||||
newline();
|
newline();
|
||||||
with_indent(next_indent(), function(){
|
with_indent(next_indent(), function() {
|
||||||
ret = cont();
|
ret = cont();
|
||||||
});
|
});
|
||||||
indent();
|
indent();
|
||||||
@@ -455,9 +451,7 @@ function OutputStream(options) {
|
|||||||
} : noop;
|
} : noop;
|
||||||
|
|
||||||
function get() {
|
function get() {
|
||||||
if (might_add_newline) {
|
if (!line_fixed) fix_line();
|
||||||
ensure_line_len();
|
|
||||||
}
|
|
||||||
return OUTPUT;
|
return OUTPUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -622,7 +616,14 @@ function OutputStream(options) {
|
|||||||
col : function() { return current_col },
|
col : function() { return current_col },
|
||||||
pos : function() { return current_pos },
|
pos : function() { return current_pos },
|
||||||
push_node : function(node) { stack.push(node) },
|
push_node : function(node) { stack.push(node) },
|
||||||
pop_node : function() { return stack.pop() },
|
pop_node : options.preserve_line ? function() {
|
||||||
|
var node = stack.pop();
|
||||||
|
if (node.start && node.start.line > current_line) {
|
||||||
|
insert_newlines(node.start.line - current_line);
|
||||||
|
}
|
||||||
|
} : function() {
|
||||||
|
stack.pop();
|
||||||
|
},
|
||||||
parent : function(n) {
|
parent : function(n) {
|
||||||
return stack[stack.length - 2 - (n || 0)];
|
return stack[stack.length - 2 - (n || 0)];
|
||||||
}
|
}
|
||||||
@@ -631,7 +632,7 @@ function OutputStream(options) {
|
|||||||
|
|
||||||
/* -----[ code generators ]----- */
|
/* -----[ code generators ]----- */
|
||||||
|
|
||||||
(function(){
|
(function() {
|
||||||
|
|
||||||
/* -----[ utils ]----- */
|
/* -----[ utils ]----- */
|
||||||
|
|
||||||
@@ -643,7 +644,7 @@ function OutputStream(options) {
|
|||||||
var active_scope = null;
|
var active_scope = null;
|
||||||
var use_asm = null;
|
var use_asm = null;
|
||||||
|
|
||||||
AST_Node.DEFMETHOD("print", function(stream, force_parens){
|
AST_Node.DEFMETHOD("print", function(stream, force_parens) {
|
||||||
var self = this, generator = self._codegen;
|
var self = this, generator = self._codegen;
|
||||||
if (self instanceof AST_Scope) {
|
if (self instanceof AST_Scope) {
|
||||||
active_scope = self;
|
active_scope = self;
|
||||||
@@ -670,7 +671,7 @@ function OutputStream(options) {
|
|||||||
});
|
});
|
||||||
AST_Node.DEFMETHOD("_print", AST_Node.prototype.print);
|
AST_Node.DEFMETHOD("_print", AST_Node.prototype.print);
|
||||||
|
|
||||||
AST_Node.DEFMETHOD("print_to_string", function(options){
|
AST_Node.DEFMETHOD("print_to_string", function(options) {
|
||||||
var s = OutputStream(options);
|
var s = OutputStream(options);
|
||||||
this.print(s);
|
this.print(s);
|
||||||
return s.get();
|
return s.get();
|
||||||
@@ -680,7 +681,7 @@ function OutputStream(options) {
|
|||||||
|
|
||||||
function PARENS(nodetype, func) {
|
function PARENS(nodetype, func) {
|
||||||
if (Array.isArray(nodetype)) {
|
if (Array.isArray(nodetype)) {
|
||||||
nodetype.forEach(function(nodetype){
|
nodetype.forEach(function(nodetype) {
|
||||||
PARENS(nodetype, func);
|
PARENS(nodetype, func);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
@@ -692,7 +693,7 @@ function OutputStream(options) {
|
|||||||
|
|
||||||
// a function expression needs parens around it when it's provably
|
// a function expression needs parens around it when it's provably
|
||||||
// the first token to appear in a statement.
|
// the first token to appear in a statement.
|
||||||
PARENS(AST_Function, function(output){
|
PARENS(AST_Function, function(output) {
|
||||||
if (!output.has_parens() && first_in_statement(output)) {
|
if (!output.has_parens() && first_in_statement(output)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -714,17 +715,17 @@ function OutputStream(options) {
|
|||||||
|
|
||||||
// same goes for an object literal, because otherwise it would be
|
// same goes for an object literal, because otherwise it would be
|
||||||
// interpreted as a block of code.
|
// interpreted as a block of code.
|
||||||
PARENS(AST_Object, function(output){
|
PARENS(AST_Object, function(output) {
|
||||||
return !output.has_parens() && first_in_statement(output);
|
return !output.has_parens() && first_in_statement(output);
|
||||||
});
|
});
|
||||||
|
|
||||||
PARENS(AST_Unary, function(output){
|
PARENS(AST_Unary, function(output) {
|
||||||
var p = output.parent();
|
var p = output.parent();
|
||||||
return p instanceof AST_PropAccess && p.expression === this
|
return p instanceof AST_PropAccess && p.expression === this
|
||||||
|| p instanceof AST_Call && p.expression === this;
|
|| p instanceof AST_Call && p.expression === this;
|
||||||
});
|
});
|
||||||
|
|
||||||
PARENS(AST_Sequence, function(output){
|
PARENS(AST_Sequence, function(output) {
|
||||||
var p = output.parent();
|
var p = output.parent();
|
||||||
return p instanceof AST_Call // (foo, bar)() or foo(1, (2, 3), 4)
|
return p instanceof AST_Call // (foo, bar)() or foo(1, (2, 3), 4)
|
||||||
|| p instanceof AST_Unary // !(foo, bar, baz)
|
|| p instanceof AST_Unary // !(foo, bar, baz)
|
||||||
@@ -738,7 +739,7 @@ function OutputStream(options) {
|
|||||||
;
|
;
|
||||||
});
|
});
|
||||||
|
|
||||||
PARENS(AST_Binary, function(output){
|
PARENS(AST_Binary, function(output) {
|
||||||
var p = output.parent();
|
var p = output.parent();
|
||||||
// (foo && bar)()
|
// (foo && bar)()
|
||||||
if (p instanceof AST_Call && p.expression === this)
|
if (p instanceof AST_Call && p.expression === this)
|
||||||
@@ -761,7 +762,7 @@ function OutputStream(options) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
PARENS(AST_PropAccess, function(output){
|
PARENS(AST_PropAccess, function(output) {
|
||||||
var p = output.parent();
|
var p = output.parent();
|
||||||
if (p instanceof AST_New && p.expression === this) {
|
if (p instanceof AST_New && p.expression === this) {
|
||||||
// i.e. new (foo.bar().baz)
|
// i.e. new (foo.bar().baz)
|
||||||
@@ -782,7 +783,7 @@ function OutputStream(options) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
PARENS(AST_Call, function(output){
|
PARENS(AST_Call, function(output) {
|
||||||
var p = output.parent(), p1;
|
var p = output.parent(), p1;
|
||||||
if (p instanceof AST_New && p.expression === this)
|
if (p instanceof AST_New && p.expression === this)
|
||||||
return true;
|
return true;
|
||||||
@@ -796,7 +797,7 @@ function OutputStream(options) {
|
|||||||
&& p1.left === p;
|
&& p1.left === p;
|
||||||
});
|
});
|
||||||
|
|
||||||
PARENS(AST_New, function(output){
|
PARENS(AST_New, function(output) {
|
||||||
var p = output.parent();
|
var p = output.parent();
|
||||||
if (!need_constructor_parens(this, output)
|
if (!need_constructor_parens(this, output)
|
||||||
&& (p instanceof AST_PropAccess // (new Date).getTime(), (new Date)["getTime"]()
|
&& (p instanceof AST_PropAccess // (new Date).getTime(), (new Date)["getTime"]()
|
||||||
@@ -804,7 +805,7 @@ function OutputStream(options) {
|
|||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
PARENS(AST_Number, function(output){
|
PARENS(AST_Number, function(output) {
|
||||||
var p = output.parent();
|
var p = output.parent();
|
||||||
if (p instanceof AST_PropAccess && p.expression === this) {
|
if (p instanceof AST_PropAccess && p.expression === this) {
|
||||||
var value = this.getValue();
|
var value = this.getValue();
|
||||||
@@ -814,7 +815,7 @@ function OutputStream(options) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
PARENS([ AST_Assign, AST_Conditional ], function(output){
|
PARENS([ AST_Assign, AST_Conditional ], function(output) {
|
||||||
var p = output.parent();
|
var p = output.parent();
|
||||||
// !(a = false) → true
|
// !(a = false) → true
|
||||||
if (p instanceof AST_Unary)
|
if (p instanceof AST_Unary)
|
||||||
@@ -835,11 +836,11 @@ function OutputStream(options) {
|
|||||||
|
|
||||||
/* -----[ PRINTERS ]----- */
|
/* -----[ PRINTERS ]----- */
|
||||||
|
|
||||||
DEFPRINT(AST_Directive, function(self, output){
|
DEFPRINT(AST_Directive, function(self, output) {
|
||||||
output.print_string(self.value, self.quote);
|
output.print_string(self.value, self.quote);
|
||||||
output.semicolon();
|
output.semicolon();
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_Debugger, function(self, output){
|
DEFPRINT(AST_Debugger, function(self, output) {
|
||||||
output.print("debugger");
|
output.print("debugger");
|
||||||
output.semicolon();
|
output.semicolon();
|
||||||
});
|
});
|
||||||
@@ -849,7 +850,7 @@ function OutputStream(options) {
|
|||||||
function display_body(body, is_toplevel, output, allow_directives) {
|
function display_body(body, is_toplevel, output, allow_directives) {
|
||||||
var last = body.length - 1;
|
var last = body.length - 1;
|
||||||
in_directive = allow_directives;
|
in_directive = allow_directives;
|
||||||
body.forEach(function(stmt, i){
|
body.forEach(function(stmt, i) {
|
||||||
if (in_directive === true && !(stmt instanceof AST_Directive ||
|
if (in_directive === true && !(stmt instanceof AST_Directive ||
|
||||||
stmt instanceof AST_EmptyStatement ||
|
stmt instanceof AST_EmptyStatement ||
|
||||||
(stmt instanceof AST_SimpleStatement && stmt.body instanceof AST_String)
|
(stmt instanceof AST_SimpleStatement && stmt.body instanceof AST_String)
|
||||||
@@ -874,24 +875,24 @@ function OutputStream(options) {
|
|||||||
in_directive = false;
|
in_directive = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
AST_StatementWithBody.DEFMETHOD("_do_print_body", function(output){
|
AST_StatementWithBody.DEFMETHOD("_do_print_body", function(output) {
|
||||||
force_statement(this.body, output);
|
force_statement(this.body, output);
|
||||||
});
|
});
|
||||||
|
|
||||||
DEFPRINT(AST_Statement, function(self, output){
|
DEFPRINT(AST_Statement, function(self, output) {
|
||||||
self.body.print(output);
|
self.body.print(output);
|
||||||
output.semicolon();
|
output.semicolon();
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_Toplevel, function(self, output){
|
DEFPRINT(AST_Toplevel, function(self, output) {
|
||||||
display_body(self.body, true, output, true);
|
display_body(self.body, true, output, true);
|
||||||
output.print("");
|
output.print("");
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_LabeledStatement, function(self, output){
|
DEFPRINT(AST_LabeledStatement, function(self, output) {
|
||||||
self.label.print(output);
|
self.label.print(output);
|
||||||
output.colon();
|
output.colon();
|
||||||
self.body.print(output);
|
self.body.print(output);
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_SimpleStatement, function(self, output){
|
DEFPRINT(AST_SimpleStatement, function(self, output) {
|
||||||
self.body.print(output);
|
self.body.print(output);
|
||||||
output.semicolon();
|
output.semicolon();
|
||||||
});
|
});
|
||||||
@@ -909,37 +910,37 @@ function OutputStream(options) {
|
|||||||
});
|
});
|
||||||
} else print_braced_empty(self, output);
|
} else print_braced_empty(self, output);
|
||||||
}
|
}
|
||||||
DEFPRINT(AST_BlockStatement, function(self, output){
|
DEFPRINT(AST_BlockStatement, function(self, output) {
|
||||||
print_braced(self, output);
|
print_braced(self, output);
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_EmptyStatement, function(self, output){
|
DEFPRINT(AST_EmptyStatement, function(self, output) {
|
||||||
output.semicolon();
|
output.semicolon();
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_Do, function(self, output){
|
DEFPRINT(AST_Do, function(self, output) {
|
||||||
output.print("do");
|
output.print("do");
|
||||||
output.space();
|
output.space();
|
||||||
make_block(self.body, output);
|
make_block(self.body, output);
|
||||||
output.space();
|
output.space();
|
||||||
output.print("while");
|
output.print("while");
|
||||||
output.space();
|
output.space();
|
||||||
output.with_parens(function(){
|
output.with_parens(function() {
|
||||||
self.condition.print(output);
|
self.condition.print(output);
|
||||||
});
|
});
|
||||||
output.semicolon();
|
output.semicolon();
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_While, function(self, output){
|
DEFPRINT(AST_While, function(self, output) {
|
||||||
output.print("while");
|
output.print("while");
|
||||||
output.space();
|
output.space();
|
||||||
output.with_parens(function(){
|
output.with_parens(function() {
|
||||||
self.condition.print(output);
|
self.condition.print(output);
|
||||||
});
|
});
|
||||||
output.space();
|
output.space();
|
||||||
self._do_print_body(output);
|
self._do_print_body(output);
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_For, function(self, output){
|
DEFPRINT(AST_For, function(self, output) {
|
||||||
output.print("for");
|
output.print("for");
|
||||||
output.space();
|
output.space();
|
||||||
output.with_parens(function(){
|
output.with_parens(function() {
|
||||||
if (self.init) {
|
if (self.init) {
|
||||||
if (self.init instanceof AST_Definitions) {
|
if (self.init instanceof AST_Definitions) {
|
||||||
self.init.print(output);
|
self.init.print(output);
|
||||||
@@ -965,10 +966,10 @@ function OutputStream(options) {
|
|||||||
output.space();
|
output.space();
|
||||||
self._do_print_body(output);
|
self._do_print_body(output);
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_ForIn, function(self, output){
|
DEFPRINT(AST_ForIn, function(self, output) {
|
||||||
output.print("for");
|
output.print("for");
|
||||||
output.space();
|
output.space();
|
||||||
output.with_parens(function(){
|
output.with_parens(function() {
|
||||||
self.init.print(output);
|
self.init.print(output);
|
||||||
output.space();
|
output.space();
|
||||||
output.print("in");
|
output.print("in");
|
||||||
@@ -978,10 +979,10 @@ function OutputStream(options) {
|
|||||||
output.space();
|
output.space();
|
||||||
self._do_print_body(output);
|
self._do_print_body(output);
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_With, function(self, output){
|
DEFPRINT(AST_With, function(self, output) {
|
||||||
output.print("with");
|
output.print("with");
|
||||||
output.space();
|
output.space();
|
||||||
output.with_parens(function(){
|
output.with_parens(function() {
|
||||||
self.expression.print(output);
|
self.expression.print(output);
|
||||||
});
|
});
|
||||||
output.space();
|
output.space();
|
||||||
@@ -989,7 +990,7 @@ function OutputStream(options) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
/* -----[ functions ]----- */
|
/* -----[ functions ]----- */
|
||||||
AST_Lambda.DEFMETHOD("_do_print", function(output, nokeyword){
|
AST_Lambda.DEFMETHOD("_do_print", function(output, nokeyword) {
|
||||||
var self = this;
|
var self = this;
|
||||||
if (!nokeyword) {
|
if (!nokeyword) {
|
||||||
output.print("function");
|
output.print("function");
|
||||||
@@ -998,8 +999,8 @@ function OutputStream(options) {
|
|||||||
output.space();
|
output.space();
|
||||||
self.name.print(output);
|
self.name.print(output);
|
||||||
}
|
}
|
||||||
output.with_parens(function(){
|
output.with_parens(function() {
|
||||||
self.argnames.forEach(function(arg, i){
|
self.argnames.forEach(function(arg, i) {
|
||||||
if (i) output.comma();
|
if (i) output.comma();
|
||||||
arg.print(output);
|
arg.print(output);
|
||||||
});
|
});
|
||||||
@@ -1007,40 +1008,31 @@ function OutputStream(options) {
|
|||||||
output.space();
|
output.space();
|
||||||
print_braced(self, output, true);
|
print_braced(self, output, true);
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_Lambda, function(self, output){
|
DEFPRINT(AST_Lambda, function(self, output) {
|
||||||
self._do_print(output);
|
self._do_print(output);
|
||||||
});
|
});
|
||||||
|
|
||||||
/* -----[ exits ]----- */
|
/* -----[ jumps ]----- */
|
||||||
AST_Exit.DEFMETHOD("_do_print", function(output, kind){
|
function print_jump(output, kind, target) {
|
||||||
output.print(kind);
|
output.print(kind);
|
||||||
if (this.value) {
|
if (target) {
|
||||||
output.space();
|
output.space();
|
||||||
this.value.print(output);
|
target.print(output);
|
||||||
}
|
}
|
||||||
output.semicolon();
|
output.semicolon();
|
||||||
});
|
}
|
||||||
DEFPRINT(AST_Return, function(self, output){
|
|
||||||
self._do_print(output, "return");
|
|
||||||
});
|
|
||||||
DEFPRINT(AST_Throw, function(self, output){
|
|
||||||
self._do_print(output, "throw");
|
|
||||||
});
|
|
||||||
|
|
||||||
/* -----[ loop control ]----- */
|
DEFPRINT(AST_Return, function(self, output) {
|
||||||
AST_LoopControl.DEFMETHOD("_do_print", function(output, kind){
|
print_jump(output, "return", self.value);
|
||||||
output.print(kind);
|
|
||||||
if (this.label) {
|
|
||||||
output.space();
|
|
||||||
this.label.print(output);
|
|
||||||
}
|
|
||||||
output.semicolon();
|
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_Break, function(self, output){
|
DEFPRINT(AST_Throw, function(self, output) {
|
||||||
self._do_print(output, "break");
|
print_jump(output, "throw", self.value);
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_Continue, function(self, output){
|
DEFPRINT(AST_Break, function(self, output) {
|
||||||
self._do_print(output, "continue");
|
print_jump(output, "break", self.label);
|
||||||
|
});
|
||||||
|
DEFPRINT(AST_Continue, function(self, output) {
|
||||||
|
print_jump(output, "continue", self.label);
|
||||||
});
|
});
|
||||||
|
|
||||||
/* -----[ if ]----- */
|
/* -----[ if ]----- */
|
||||||
@@ -1072,10 +1064,10 @@ function OutputStream(options) {
|
|||||||
}
|
}
|
||||||
force_statement(self.body, output);
|
force_statement(self.body, output);
|
||||||
}
|
}
|
||||||
DEFPRINT(AST_If, function(self, output){
|
DEFPRINT(AST_If, function(self, output) {
|
||||||
output.print("if");
|
output.print("if");
|
||||||
output.space();
|
output.space();
|
||||||
output.with_parens(function(){
|
output.with_parens(function() {
|
||||||
self.condition.print(output);
|
self.condition.print(output);
|
||||||
});
|
});
|
||||||
output.space();
|
output.space();
|
||||||
@@ -1094,17 +1086,17 @@ function OutputStream(options) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
/* -----[ switch ]----- */
|
/* -----[ switch ]----- */
|
||||||
DEFPRINT(AST_Switch, function(self, output){
|
DEFPRINT(AST_Switch, function(self, output) {
|
||||||
output.print("switch");
|
output.print("switch");
|
||||||
output.space();
|
output.space();
|
||||||
output.with_parens(function(){
|
output.with_parens(function() {
|
||||||
self.expression.print(output);
|
self.expression.print(output);
|
||||||
});
|
});
|
||||||
output.space();
|
output.space();
|
||||||
var last = self.body.length - 1;
|
var last = self.body.length - 1;
|
||||||
if (last < 0) print_braced_empty(self, output);
|
if (last < 0) print_braced_empty(self, output);
|
||||||
else output.with_block(function(){
|
else output.with_block(function() {
|
||||||
self.body.forEach(function(branch, i){
|
self.body.forEach(function(branch, i) {
|
||||||
output.indent(true);
|
output.indent(true);
|
||||||
branch.print(output);
|
branch.print(output);
|
||||||
if (i < last && branch.body.length > 0)
|
if (i < last && branch.body.length > 0)
|
||||||
@@ -1112,19 +1104,19 @@ function OutputStream(options) {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
AST_SwitchBranch.DEFMETHOD("_do_print_body", function(output){
|
AST_SwitchBranch.DEFMETHOD("_do_print_body", function(output) {
|
||||||
output.newline();
|
output.newline();
|
||||||
this.body.forEach(function(stmt){
|
this.body.forEach(function(stmt) {
|
||||||
output.indent();
|
output.indent();
|
||||||
stmt.print(output);
|
stmt.print(output);
|
||||||
output.newline();
|
output.newline();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_Default, function(self, output){
|
DEFPRINT(AST_Default, function(self, output) {
|
||||||
output.print("default:");
|
output.print("default:");
|
||||||
self._do_print_body(output);
|
self._do_print_body(output);
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_Case, function(self, output){
|
DEFPRINT(AST_Case, function(self, output) {
|
||||||
output.print("case");
|
output.print("case");
|
||||||
output.space();
|
output.space();
|
||||||
self.expression.print(output);
|
self.expression.print(output);
|
||||||
@@ -1133,7 +1125,7 @@ function OutputStream(options) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
/* -----[ exceptions ]----- */
|
/* -----[ exceptions ]----- */
|
||||||
DEFPRINT(AST_Try, function(self, output){
|
DEFPRINT(AST_Try, function(self, output) {
|
||||||
output.print("try");
|
output.print("try");
|
||||||
output.space();
|
output.space();
|
||||||
print_braced(self, output);
|
print_braced(self, output);
|
||||||
@@ -1146,37 +1138,30 @@ function OutputStream(options) {
|
|||||||
self.bfinally.print(output);
|
self.bfinally.print(output);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_Catch, function(self, output){
|
DEFPRINT(AST_Catch, function(self, output) {
|
||||||
output.print("catch");
|
output.print("catch");
|
||||||
output.space();
|
output.space();
|
||||||
output.with_parens(function(){
|
output.with_parens(function() {
|
||||||
self.argname.print(output);
|
self.argname.print(output);
|
||||||
});
|
});
|
||||||
output.space();
|
output.space();
|
||||||
print_braced(self, output);
|
print_braced(self, output);
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_Finally, function(self, output){
|
DEFPRINT(AST_Finally, function(self, output) {
|
||||||
output.print("finally");
|
output.print("finally");
|
||||||
output.space();
|
output.space();
|
||||||
print_braced(self, output);
|
print_braced(self, output);
|
||||||
});
|
});
|
||||||
|
|
||||||
/* -----[ var/const ]----- */
|
DEFPRINT(AST_Var, function(self, output) {
|
||||||
AST_Definitions.DEFMETHOD("_do_print", function(output, kind){
|
output.print("var");
|
||||||
output.print(kind);
|
|
||||||
output.space();
|
output.space();
|
||||||
this.definitions.forEach(function(def, i){
|
self.definitions.forEach(function(def, i) {
|
||||||
if (i) output.comma();
|
if (i) output.comma();
|
||||||
def.print(output);
|
def.print(output);
|
||||||
});
|
});
|
||||||
var p = output.parent();
|
var p = output.parent();
|
||||||
var in_for = p instanceof AST_For || p instanceof AST_ForIn;
|
if (p && p.init !== self || !(p instanceof AST_For || p instanceof AST_ForIn)) output.semicolon();
|
||||||
var avoid_semicolon = in_for && p.init === this;
|
|
||||||
if (!avoid_semicolon)
|
|
||||||
output.semicolon();
|
|
||||||
});
|
|
||||||
DEFPRINT(AST_Var, function(self, output){
|
|
||||||
self._do_print(output, "var");
|
|
||||||
});
|
});
|
||||||
|
|
||||||
function parenthesize_for_noin(node, output, noin) {
|
function parenthesize_for_noin(node, output, noin) {
|
||||||
@@ -1193,7 +1178,7 @@ function OutputStream(options) {
|
|||||||
node.print(output, parens);
|
node.print(output, parens);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFPRINT(AST_VarDef, function(self, output){
|
DEFPRINT(AST_VarDef, function(self, output) {
|
||||||
self.name.print(output);
|
self.name.print(output);
|
||||||
if (self.value) {
|
if (self.value) {
|
||||||
output.space();
|
output.space();
|
||||||
@@ -1206,28 +1191,27 @@ function OutputStream(options) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
/* -----[ other expressions ]----- */
|
/* -----[ other expressions ]----- */
|
||||||
DEFPRINT(AST_Call, function(self, output){
|
DEFPRINT(AST_Call, function(self, output) {
|
||||||
self.expression.print(output);
|
self.expression.print(output);
|
||||||
if (self instanceof AST_New && !need_constructor_parens(self, output))
|
if (self instanceof AST_New && !need_constructor_parens(self, output))
|
||||||
return;
|
return;
|
||||||
if (self.expression instanceof AST_Call || self.expression instanceof AST_Lambda) {
|
if (self.expression instanceof AST_Call || self.expression instanceof AST_Lambda) {
|
||||||
output.add_mapping(self.start);
|
output.add_mapping(self.start);
|
||||||
}
|
}
|
||||||
output.with_parens(function(){
|
output.with_parens(function() {
|
||||||
self.args.forEach(function(expr, i){
|
self.args.forEach(function(expr, i) {
|
||||||
if (i) output.comma();
|
if (i) output.comma();
|
||||||
expr.print(output);
|
expr.print(output);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_New, function(self, output){
|
DEFPRINT(AST_New, function(self, output) {
|
||||||
output.print("new");
|
output.print("new");
|
||||||
output.space();
|
output.space();
|
||||||
AST_Call.prototype._codegen(self, output);
|
AST_Call.prototype._codegen(self, output);
|
||||||
});
|
});
|
||||||
|
DEFPRINT(AST_Sequence, function(self, output) {
|
||||||
AST_Sequence.DEFMETHOD("_do_print", function(output){
|
self.expressions.forEach(function(node, index) {
|
||||||
this.expressions.forEach(function(node, index) {
|
|
||||||
if (index > 0) {
|
if (index > 0) {
|
||||||
output.comma();
|
output.comma();
|
||||||
if (output.should_break()) {
|
if (output.should_break()) {
|
||||||
@@ -1238,18 +1222,7 @@ function OutputStream(options) {
|
|||||||
node.print(output);
|
node.print(output);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_Sequence, function(self, output){
|
DEFPRINT(AST_Dot, function(self, output) {
|
||||||
self._do_print(output);
|
|
||||||
// var p = output.parent();
|
|
||||||
// if (p instanceof AST_Statement) {
|
|
||||||
// output.with_indent(output.next_indent(), function(){
|
|
||||||
// self._do_print(output);
|
|
||||||
// });
|
|
||||||
// } else {
|
|
||||||
// self._do_print(output);
|
|
||||||
// }
|
|
||||||
});
|
|
||||||
DEFPRINT(AST_Dot, function(self, output){
|
|
||||||
var expr = self.expression;
|
var expr = self.expression;
|
||||||
expr.print(output);
|
expr.print(output);
|
||||||
var prop = self.property;
|
var prop = self.property;
|
||||||
@@ -1270,13 +1243,13 @@ function OutputStream(options) {
|
|||||||
output.print_name(prop);
|
output.print_name(prop);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_Sub, function(self, output){
|
DEFPRINT(AST_Sub, function(self, output) {
|
||||||
self.expression.print(output);
|
self.expression.print(output);
|
||||||
output.print("[");
|
output.print("[");
|
||||||
self.property.print(output);
|
self.property.print(output);
|
||||||
output.print("]");
|
output.print("]");
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_UnaryPrefix, function(self, output){
|
DEFPRINT(AST_UnaryPrefix, function(self, output) {
|
||||||
var op = self.operator;
|
var op = self.operator;
|
||||||
output.print(op);
|
output.print(op);
|
||||||
if (/^[a-z]/i.test(op)
|
if (/^[a-z]/i.test(op)
|
||||||
@@ -1287,11 +1260,11 @@ function OutputStream(options) {
|
|||||||
}
|
}
|
||||||
self.expression.print(output);
|
self.expression.print(output);
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_UnaryPostfix, function(self, output){
|
DEFPRINT(AST_UnaryPostfix, function(self, output) {
|
||||||
self.expression.print(output);
|
self.expression.print(output);
|
||||||
output.print(self.operator);
|
output.print(self.operator);
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_Binary, function(self, output){
|
DEFPRINT(AST_Binary, function(self, output) {
|
||||||
var op = self.operator;
|
var op = self.operator;
|
||||||
self.left.print(output);
|
self.left.print(output);
|
||||||
if (op[0] == ">" /* ">>" ">>>" ">" ">=" */
|
if (op[0] == ">" /* ">>" ">>>" ">" ">=" */
|
||||||
@@ -1317,7 +1290,7 @@ function OutputStream(options) {
|
|||||||
}
|
}
|
||||||
self.right.print(output);
|
self.right.print(output);
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_Conditional, function(self, output){
|
DEFPRINT(AST_Conditional, function(self, output) {
|
||||||
self.condition.print(output);
|
self.condition.print(output);
|
||||||
output.space();
|
output.space();
|
||||||
output.print("?");
|
output.print("?");
|
||||||
@@ -1329,11 +1302,11 @@ function OutputStream(options) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
/* -----[ literals ]----- */
|
/* -----[ literals ]----- */
|
||||||
DEFPRINT(AST_Array, function(self, output){
|
DEFPRINT(AST_Array, function(self, output) {
|
||||||
output.with_square(function(){
|
output.with_square(function() {
|
||||||
var a = self.elements, len = a.length;
|
var a = self.elements, len = a.length;
|
||||||
if (len > 0) output.space();
|
if (len > 0) output.space();
|
||||||
a.forEach(function(exp, i){
|
a.forEach(function(exp, i) {
|
||||||
if (i) output.comma();
|
if (i) output.comma();
|
||||||
exp.print(output);
|
exp.print(output);
|
||||||
// If the final element is a hole, we need to make sure it
|
// If the final element is a hole, we need to make sure it
|
||||||
@@ -1345,9 +1318,9 @@ function OutputStream(options) {
|
|||||||
if (len > 0) output.space();
|
if (len > 0) output.space();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_Object, function(self, output){
|
DEFPRINT(AST_Object, function(self, output) {
|
||||||
if (self.properties.length > 0) output.with_block(function(){
|
if (self.properties.length > 0) output.with_block(function() {
|
||||||
self.properties.forEach(function(prop, i){
|
self.properties.forEach(function(prop, i) {
|
||||||
if (i) {
|
if (i) {
|
||||||
output.print(",");
|
output.print(",");
|
||||||
output.newline();
|
output.newline();
|
||||||
@@ -1376,7 +1349,7 @@ function OutputStream(options) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFPRINT(AST_ObjectKeyVal, function(self, output){
|
DEFPRINT(AST_ObjectKeyVal, function(self, output) {
|
||||||
print_property_name(self.key, self.quote, output);
|
print_property_name(self.key, self.quote, output);
|
||||||
output.colon();
|
output.colon();
|
||||||
self.value.print(output);
|
self.value.print(output);
|
||||||
@@ -1387,27 +1360,27 @@ function OutputStream(options) {
|
|||||||
print_property_name(this.key.name, this.quote, output);
|
print_property_name(this.key.name, this.quote, output);
|
||||||
this.value._do_print(output, true);
|
this.value._do_print(output, true);
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_ObjectSetter, function(self, output){
|
DEFPRINT(AST_ObjectSetter, function(self, output) {
|
||||||
self._print_getter_setter("set", output);
|
self._print_getter_setter("set", output);
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_ObjectGetter, function(self, output){
|
DEFPRINT(AST_ObjectGetter, function(self, output) {
|
||||||
self._print_getter_setter("get", output);
|
self._print_getter_setter("get", output);
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_Symbol, function(self, output){
|
DEFPRINT(AST_Symbol, function(self, output) {
|
||||||
var def = self.definition();
|
var def = self.definition();
|
||||||
output.print_name(def ? def.mangled_name || def.name : self.name);
|
output.print_name(def ? def.mangled_name || def.name : self.name);
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_Hole, noop);
|
DEFPRINT(AST_Hole, noop);
|
||||||
DEFPRINT(AST_This, function(self, output){
|
DEFPRINT(AST_This, function(self, output) {
|
||||||
output.print("this");
|
output.print("this");
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_Constant, function(self, output){
|
DEFPRINT(AST_Constant, function(self, output) {
|
||||||
output.print(self.getValue());
|
output.print(self.getValue());
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_String, function(self, output){
|
DEFPRINT(AST_String, function(self, output) {
|
||||||
output.print_string(self.getValue(), self.quote, in_directive);
|
output.print_string(self.getValue(), self.quote, in_directive);
|
||||||
});
|
});
|
||||||
DEFPRINT(AST_Number, function(self, output){
|
DEFPRINT(AST_Number, function(self, output) {
|
||||||
if (use_asm && self.start && self.start.raw != null) {
|
if (use_asm && self.start && self.start.raw != null) {
|
||||||
output.print(self.start.raw);
|
output.print(self.start.raw);
|
||||||
} else {
|
} else {
|
||||||
@@ -1415,7 +1388,7 @@ function OutputStream(options) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
DEFPRINT(AST_RegExp, function(self, output){
|
DEFPRINT(AST_RegExp, function(self, output) {
|
||||||
var regexp = self.getValue();
|
var regexp = self.getValue();
|
||||||
var str = regexp.toString();
|
var str = regexp.toString();
|
||||||
if (regexp.raw_source) {
|
if (regexp.raw_source) {
|
||||||
@@ -1487,7 +1460,7 @@ function OutputStream(options) {
|
|||||||
output.print("{}");
|
output.print("{}");
|
||||||
else if (stmt instanceof AST_BlockStatement)
|
else if (stmt instanceof AST_BlockStatement)
|
||||||
stmt.print(output);
|
stmt.print(output);
|
||||||
else output.with_block(function(){
|
else output.with_block(function() {
|
||||||
output.indent();
|
output.indent();
|
||||||
stmt.print(output);
|
stmt.print(output);
|
||||||
output.newline();
|
output.newline();
|
||||||
|
|||||||
209
lib/parse.js
209
lib/parse.js
@@ -130,7 +130,7 @@ function is_letter(code) {
|
|||||||
return (code >= 97 && code <= 122)
|
return (code >= 97 && code <= 122)
|
||||||
|| (code >= 65 && code <= 90)
|
|| (code >= 65 && code <= 90)
|
||||||
|| (code >= 0xaa && UNICODE.letter.test(String.fromCharCode(code)));
|
|| (code >= 0xaa && UNICODE.letter.test(String.fromCharCode(code)));
|
||||||
};
|
}
|
||||||
|
|
||||||
function is_surrogate_pair_head(code) {
|
function is_surrogate_pair_head(code) {
|
||||||
if (typeof code == "string")
|
if (typeof code == "string")
|
||||||
@@ -146,11 +146,11 @@ function is_surrogate_pair_tail(code) {
|
|||||||
|
|
||||||
function is_digit(code) {
|
function is_digit(code) {
|
||||||
return code >= 48 && code <= 57;
|
return code >= 48 && code <= 57;
|
||||||
};
|
}
|
||||||
|
|
||||||
function is_alphanumeric_char(code) {
|
function is_alphanumeric_char(code) {
|
||||||
return is_digit(code) || is_letter(code);
|
return is_digit(code) || is_letter(code);
|
||||||
};
|
}
|
||||||
|
|
||||||
function is_unicode_digit(code) {
|
function is_unicode_digit(code) {
|
||||||
return UNICODE.digit.test(String.fromCharCode(code));
|
return UNICODE.digit.test(String.fromCharCode(code));
|
||||||
@@ -158,19 +158,19 @@ function is_unicode_digit(code) {
|
|||||||
|
|
||||||
function is_unicode_combining_mark(ch) {
|
function is_unicode_combining_mark(ch) {
|
||||||
return UNICODE.non_spacing_mark.test(ch) || UNICODE.space_combining_mark.test(ch);
|
return UNICODE.non_spacing_mark.test(ch) || UNICODE.space_combining_mark.test(ch);
|
||||||
};
|
}
|
||||||
|
|
||||||
function is_unicode_connector_punctuation(ch) {
|
function is_unicode_connector_punctuation(ch) {
|
||||||
return UNICODE.connector_punctuation.test(ch);
|
return UNICODE.connector_punctuation.test(ch);
|
||||||
};
|
}
|
||||||
|
|
||||||
function is_identifier(name) {
|
function is_identifier(name) {
|
||||||
return !RESERVED_WORDS[name] && /^[a-z_$][a-z0-9_$]*$/i.test(name);
|
return !RESERVED_WORDS[name] && /^[a-z_$][a-z0-9_$]*$/i.test(name);
|
||||||
};
|
}
|
||||||
|
|
||||||
function is_identifier_start(code) {
|
function is_identifier_start(code) {
|
||||||
return code == 36 || code == 95 || is_letter(code);
|
return code == 36 || code == 95 || is_letter(code);
|
||||||
};
|
}
|
||||||
|
|
||||||
function is_identifier_char(ch) {
|
function is_identifier_char(ch) {
|
||||||
var code = ch.charCodeAt(0);
|
var code = ch.charCodeAt(0);
|
||||||
@@ -182,11 +182,11 @@ function is_identifier_char(ch) {
|
|||||||
|| is_unicode_connector_punctuation(ch)
|
|| is_unicode_connector_punctuation(ch)
|
||||||
|| is_unicode_digit(code)
|
|| is_unicode_digit(code)
|
||||||
;
|
;
|
||||||
};
|
}
|
||||||
|
|
||||||
function is_identifier_string(str){
|
function is_identifier_string(str) {
|
||||||
return /^[a-z_$][a-z0-9_$]*$/i.test(str);
|
return /^[a-z_$][a-z0-9_$]*$/i.test(str);
|
||||||
};
|
}
|
||||||
|
|
||||||
function parse_js_number(num) {
|
function parse_js_number(num) {
|
||||||
if (RE_HEX_NUMBER.test(num)) {
|
if (RE_HEX_NUMBER.test(num)) {
|
||||||
@@ -197,7 +197,7 @@ function parse_js_number(num) {
|
|||||||
var val = parseFloat(num);
|
var val = parseFloat(num);
|
||||||
if (val == num) return val;
|
if (val == num) return val;
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
function JS_Parse_Error(message, filename, line, col, pos) {
|
function JS_Parse_Error(message, filename, line, col, pos) {
|
||||||
this.message = message;
|
this.message = message;
|
||||||
@@ -205,7 +205,7 @@ function JS_Parse_Error(message, filename, line, col, pos) {
|
|||||||
this.line = line;
|
this.line = line;
|
||||||
this.col = col;
|
this.col = col;
|
||||||
this.pos = pos;
|
this.pos = pos;
|
||||||
};
|
}
|
||||||
JS_Parse_Error.prototype = Object.create(Error.prototype);
|
JS_Parse_Error.prototype = Object.create(Error.prototype);
|
||||||
JS_Parse_Error.prototype.constructor = JS_Parse_Error;
|
JS_Parse_Error.prototype.constructor = JS_Parse_Error;
|
||||||
JS_Parse_Error.prototype.name = "SyntaxError";
|
JS_Parse_Error.prototype.name = "SyntaxError";
|
||||||
@@ -213,11 +213,11 @@ configure_error_stack(JS_Parse_Error);
|
|||||||
|
|
||||||
function js_error(message, filename, line, col, pos) {
|
function js_error(message, filename, line, col, pos) {
|
||||||
throw new JS_Parse_Error(message, filename, line, col, pos);
|
throw new JS_Parse_Error(message, filename, line, col, pos);
|
||||||
};
|
}
|
||||||
|
|
||||||
function is_token(token, type, val) {
|
function is_token(token, type, val) {
|
||||||
return token.type == type && (val == null || token.value == val);
|
return token.type == type && (val == null || token.value == val);
|
||||||
};
|
}
|
||||||
|
|
||||||
var EX_EOF = {};
|
var EX_EOF = {};
|
||||||
|
|
||||||
@@ -239,7 +239,9 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {
|
|||||||
directive_stack : []
|
directive_stack : []
|
||||||
};
|
};
|
||||||
|
|
||||||
function peek() { return S.text.charAt(S.pos); };
|
function peek() {
|
||||||
|
return S.text.charAt(S.pos);
|
||||||
|
}
|
||||||
|
|
||||||
function next(signal_eof, in_string) {
|
function next(signal_eof, in_string) {
|
||||||
var ch = S.text.charAt(S.pos++);
|
var ch = S.text.charAt(S.pos++);
|
||||||
@@ -258,15 +260,15 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {
|
|||||||
++S.col;
|
++S.col;
|
||||||
}
|
}
|
||||||
return ch;
|
return ch;
|
||||||
};
|
}
|
||||||
|
|
||||||
function forward(i) {
|
function forward(i) {
|
||||||
while (i-- > 0) next();
|
while (i-- > 0) next();
|
||||||
};
|
}
|
||||||
|
|
||||||
function looking_at(str) {
|
function looking_at(str) {
|
||||||
return S.text.substr(S.pos, str.length) == str;
|
return S.text.substr(S.pos, str.length) == str;
|
||||||
};
|
}
|
||||||
|
|
||||||
function find_eol() {
|
function find_eol() {
|
||||||
var text = S.text;
|
var text = S.text;
|
||||||
@@ -276,19 +278,19 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {
|
|||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
};
|
}
|
||||||
|
|
||||||
function find(what, signal_eof) {
|
function find(what, signal_eof) {
|
||||||
var pos = S.text.indexOf(what, S.pos);
|
var pos = S.text.indexOf(what, S.pos);
|
||||||
if (signal_eof && pos == -1) throw EX_EOF;
|
if (signal_eof && pos == -1) throw EX_EOF;
|
||||||
return pos;
|
return pos;
|
||||||
};
|
}
|
||||||
|
|
||||||
function start_token() {
|
function start_token() {
|
||||||
S.tokline = S.line;
|
S.tokline = S.line;
|
||||||
S.tokcol = S.col;
|
S.tokcol = S.col;
|
||||||
S.tokpos = S.pos;
|
S.tokpos = S.pos;
|
||||||
};
|
}
|
||||||
|
|
||||||
var prev_was_dot = false;
|
var prev_was_dot = false;
|
||||||
function token(type, value, is_comment) {
|
function token(type, value, is_comment) {
|
||||||
@@ -321,27 +323,27 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {
|
|||||||
}
|
}
|
||||||
S.newline_before = false;
|
S.newline_before = false;
|
||||||
return new AST_Token(ret);
|
return new AST_Token(ret);
|
||||||
};
|
}
|
||||||
|
|
||||||
function skip_whitespace() {
|
function skip_whitespace() {
|
||||||
while (WHITESPACE_CHARS[peek()])
|
while (WHITESPACE_CHARS[peek()])
|
||||||
next();
|
next();
|
||||||
};
|
}
|
||||||
|
|
||||||
function read_while(pred) {
|
function read_while(pred) {
|
||||||
var ret = "", ch, i = 0;
|
var ret = "", ch, i = 0;
|
||||||
while ((ch = peek()) && pred(ch, i++))
|
while ((ch = peek()) && pred(ch, i++))
|
||||||
ret += next();
|
ret += next();
|
||||||
return ret;
|
return ret;
|
||||||
};
|
}
|
||||||
|
|
||||||
function parse_error(err) {
|
function parse_error(err) {
|
||||||
js_error(err, filename, S.tokline, S.tokcol, S.tokpos);
|
js_error(err, filename, S.tokline, S.tokcol, S.tokpos);
|
||||||
};
|
}
|
||||||
|
|
||||||
function read_num(prefix) {
|
function read_num(prefix) {
|
||||||
var has_e = false, after_e = false, has_x = false, has_dot = prefix == ".";
|
var has_e = false, after_e = false, has_x = false, has_dot = prefix == ".";
|
||||||
var num = read_while(function(ch, i){
|
var num = read_while(function(ch, i) {
|
||||||
var code = ch.charCodeAt(0);
|
var code = ch.charCodeAt(0);
|
||||||
switch (code) {
|
switch (code) {
|
||||||
case 120: case 88: // xX
|
case 120: case 88: // xX
|
||||||
@@ -367,7 +369,7 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {
|
|||||||
} else {
|
} else {
|
||||||
parse_error("Invalid syntax: " + num);
|
parse_error("Invalid syntax: " + num);
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
function read_escaped_char(in_string) {
|
function read_escaped_char(in_string) {
|
||||||
var ch = next(true, in_string);
|
var ch = next(true, in_string);
|
||||||
@@ -390,7 +392,7 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {
|
|||||||
if (ch >= "0" && ch <= "7")
|
if (ch >= "0" && ch <= "7")
|
||||||
return read_octal_escape_sequence(ch);
|
return read_octal_escape_sequence(ch);
|
||||||
return ch;
|
return ch;
|
||||||
};
|
}
|
||||||
|
|
||||||
function read_octal_escape_sequence(ch) {
|
function read_octal_escape_sequence(ch) {
|
||||||
// Read
|
// Read
|
||||||
@@ -417,9 +419,9 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {
|
|||||||
num = (num << 4) | digit;
|
num = (num << 4) | digit;
|
||||||
}
|
}
|
||||||
return num;
|
return num;
|
||||||
};
|
}
|
||||||
|
|
||||||
var read_string = with_eof_error("Unterminated string constant", function(quote_char){
|
var read_string = with_eof_error("Unterminated string constant", function(quote_char) {
|
||||||
var quote = next(), ret = "";
|
var quote = next(), ret = "";
|
||||||
for (;;) {
|
for (;;) {
|
||||||
var ch = next(true, true);
|
var ch = next(true, true);
|
||||||
@@ -447,9 +449,9 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {
|
|||||||
S.comments_before.push(token(type, ret, true));
|
S.comments_before.push(token(type, ret, true));
|
||||||
S.regex_allowed = regex_allowed;
|
S.regex_allowed = regex_allowed;
|
||||||
return next_token;
|
return next_token;
|
||||||
};
|
}
|
||||||
|
|
||||||
var skip_multiline_comment = with_eof_error("Unterminated multiline comment", function(){
|
var skip_multiline_comment = with_eof_error("Unterminated multiline comment", function() {
|
||||||
var regex_allowed = S.regex_allowed;
|
var regex_allowed = S.regex_allowed;
|
||||||
var i = find("*/", true);
|
var i = find("*/", true);
|
||||||
var text = S.text.substring(S.pos, i).replace(/\r\n|\r|\u2028|\u2029/g, '\n');
|
var text = S.text.substring(S.pos, i).replace(/\r\n|\r|\u2028|\u2029/g, '\n');
|
||||||
@@ -481,7 +483,7 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {
|
|||||||
name = "\\u" + "0000".substr(hex.length) + hex + name.slice(1);
|
name = "\\u" + "0000".substr(hex.length) + hex + name.slice(1);
|
||||||
}
|
}
|
||||||
return name;
|
return name;
|
||||||
};
|
}
|
||||||
|
|
||||||
var read_regexp = with_eof_error("Unterminated regular expression", function(source) {
|
var read_regexp = with_eof_error("Unterminated regular expression", function(source) {
|
||||||
var prev_backslash = false, ch, in_class = false;
|
var prev_backslash = false, ch, in_class = false;
|
||||||
@@ -523,9 +525,9 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {
|
|||||||
} else {
|
} else {
|
||||||
return op;
|
return op;
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
return token("operator", grow(prefix || next()));
|
return token("operator", grow(prefix || next()));
|
||||||
};
|
}
|
||||||
|
|
||||||
function handle_slash() {
|
function handle_slash() {
|
||||||
next();
|
next();
|
||||||
@@ -538,14 +540,14 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {
|
|||||||
return skip_multiline_comment();
|
return skip_multiline_comment();
|
||||||
}
|
}
|
||||||
return S.regex_allowed ? read_regexp("") : read_operator("/");
|
return S.regex_allowed ? read_regexp("") : read_operator("/");
|
||||||
};
|
}
|
||||||
|
|
||||||
function handle_dot() {
|
function handle_dot() {
|
||||||
next();
|
next();
|
||||||
return is_digit(peek().charCodeAt(0))
|
return is_digit(peek().charCodeAt(0))
|
||||||
? read_num(".")
|
? read_num(".")
|
||||||
: token("punc", ".");
|
: token("punc", ".");
|
||||||
};
|
}
|
||||||
|
|
||||||
function read_word() {
|
function read_word() {
|
||||||
var word = read_name();
|
var word = read_name();
|
||||||
@@ -554,7 +556,7 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {
|
|||||||
: !KEYWORDS[word] ? token("name", word)
|
: !KEYWORDS[word] ? token("name", word)
|
||||||
: OPERATORS[word] ? token("operator", word)
|
: OPERATORS[word] ? token("operator", word)
|
||||||
: token("keyword", word);
|
: token("keyword", word);
|
||||||
};
|
}
|
||||||
|
|
||||||
function with_eof_error(eof_error, cont) {
|
function with_eof_error(eof_error, cont) {
|
||||||
return function(x) {
|
return function(x) {
|
||||||
@@ -565,7 +567,7 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {
|
|||||||
else throw ex;
|
else throw ex;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
function next_token(force_regexp) {
|
function next_token(force_regexp) {
|
||||||
if (force_regexp != null)
|
if (force_regexp != null)
|
||||||
@@ -609,7 +611,7 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
parse_error("Unexpected character '" + ch + "'");
|
parse_error("Unexpected character '" + ch + "'");
|
||||||
};
|
}
|
||||||
|
|
||||||
next_token.context = function(nc) {
|
next_token.context = function(nc) {
|
||||||
if (nc) S = nc;
|
if (nc) S = nc;
|
||||||
@@ -645,8 +647,7 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return next_token;
|
return next_token;
|
||||||
|
}
|
||||||
};
|
|
||||||
|
|
||||||
/* -----[ Parser (constants) ]----- */
|
/* -----[ Parser (constants) ]----- */
|
||||||
|
|
||||||
@@ -666,7 +667,7 @@ var UNARY_POSTFIX = makePredicate([ "--", "++" ]);
|
|||||||
|
|
||||||
var ASSIGNMENT = makePredicate([ "=", "+=", "-=", "/=", "*=", "%=", ">>=", "<<=", ">>>=", "|=", "^=", "&=" ]);
|
var ASSIGNMENT = makePredicate([ "=", "+=", "-=", "/=", "*=", "%=", ">>=", "<<=", ">>>=", "|=", "^=", "&=" ]);
|
||||||
|
|
||||||
var PRECEDENCE = (function(a, ret){
|
var PRECEDENCE = function(a, ret) {
|
||||||
for (var i = 0; i < a.length; ++i) {
|
for (var i = 0; i < a.length; ++i) {
|
||||||
var b = a[i];
|
var b = a[i];
|
||||||
for (var j = 0; j < b.length; ++j) {
|
for (var j = 0; j < b.length; ++j) {
|
||||||
@@ -674,28 +675,24 @@ var PRECEDENCE = (function(a, ret){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
})(
|
}([
|
||||||
[
|
["||"],
|
||||||
["||"],
|
["&&"],
|
||||||
["&&"],
|
["|"],
|
||||||
["|"],
|
["^"],
|
||||||
["^"],
|
["&"],
|
||||||
["&"],
|
["==", "===", "!=", "!=="],
|
||||||
["==", "===", "!=", "!=="],
|
["<", ">", "<=", ">=", "in", "instanceof"],
|
||||||
["<", ">", "<=", ">=", "in", "instanceof"],
|
[">>", "<<", ">>>"],
|
||||||
[">>", "<<", ">>>"],
|
["+", "-"],
|
||||||
["+", "-"],
|
["*", "/", "%"]
|
||||||
["*", "/", "%"]
|
], {});
|
||||||
],
|
|
||||||
{}
|
|
||||||
);
|
|
||||||
|
|
||||||
var ATOMIC_START_TOKEN = makePredicate([ "atom", "num", "string", "regexp", "name" ]);
|
var ATOMIC_START_TOKEN = makePredicate([ "atom", "num", "string", "regexp", "name" ]);
|
||||||
|
|
||||||
/* -----[ Parser ]----- */
|
/* -----[ Parser ]----- */
|
||||||
|
|
||||||
function parse($TEXT, options) {
|
function parse($TEXT, options) {
|
||||||
|
|
||||||
options = defaults(options, {
|
options = defaults(options, {
|
||||||
bare_returns : false,
|
bare_returns : false,
|
||||||
expression : false,
|
expression : false,
|
||||||
@@ -724,9 +721,11 @@ function parse($TEXT, options) {
|
|||||||
|
|
||||||
function is(type, value) {
|
function is(type, value) {
|
||||||
return is_token(S.token, type, value);
|
return is_token(S.token, type, value);
|
||||||
};
|
}
|
||||||
|
|
||||||
function peek() { return S.peeked || (S.peeked = S.input()); };
|
function peek() {
|
||||||
|
return S.peeked || (S.peeked = S.input());
|
||||||
|
}
|
||||||
|
|
||||||
function next() {
|
function next() {
|
||||||
S.prev = S.token;
|
S.prev = S.token;
|
||||||
@@ -740,11 +739,11 @@ function parse($TEXT, options) {
|
|||||||
S.token.type == "string" || is("punc", ";")
|
S.token.type == "string" || is("punc", ";")
|
||||||
);
|
);
|
||||||
return S.token;
|
return S.token;
|
||||||
};
|
}
|
||||||
|
|
||||||
function prev() {
|
function prev() {
|
||||||
return S.prev;
|
return S.prev;
|
||||||
};
|
}
|
||||||
|
|
||||||
function croak(msg, line, col, pos) {
|
function croak(msg, line, col, pos) {
|
||||||
var ctx = S.input.context();
|
var ctx = S.input.context();
|
||||||
@@ -753,26 +752,28 @@ function parse($TEXT, options) {
|
|||||||
line != null ? line : ctx.tokline,
|
line != null ? line : ctx.tokline,
|
||||||
col != null ? col : ctx.tokcol,
|
col != null ? col : ctx.tokcol,
|
||||||
pos != null ? pos : ctx.tokpos);
|
pos != null ? pos : ctx.tokpos);
|
||||||
};
|
}
|
||||||
|
|
||||||
function token_error(token, msg) {
|
function token_error(token, msg) {
|
||||||
croak(msg, token.line, token.col);
|
croak(msg, token.line, token.col);
|
||||||
};
|
}
|
||||||
|
|
||||||
function unexpected(token) {
|
function unexpected(token) {
|
||||||
if (token == null)
|
if (token == null)
|
||||||
token = S.token;
|
token = S.token;
|
||||||
token_error(token, "Unexpected token: " + token.type + " (" + token.value + ")");
|
token_error(token, "Unexpected token: " + token.type + " (" + token.value + ")");
|
||||||
};
|
}
|
||||||
|
|
||||||
function expect_token(type, val) {
|
function expect_token(type, val) {
|
||||||
if (is(type, val)) {
|
if (is(type, val)) {
|
||||||
return next();
|
return next();
|
||||||
}
|
}
|
||||||
token_error(S.token, "Unexpected token " + S.token.type + " «" + S.token.value + "»" + ", expected " + type + " «" + val + "»");
|
token_error(S.token, "Unexpected token " + S.token.type + " «" + S.token.value + "»" + ", expected " + type + " «" + val + "»");
|
||||||
};
|
}
|
||||||
|
|
||||||
function expect(punc) { return expect_token("punc", punc); };
|
function expect(punc) {
|
||||||
|
return expect_token("punc", punc);
|
||||||
|
}
|
||||||
|
|
||||||
function has_newline_before(token) {
|
function has_newline_before(token) {
|
||||||
return token.nlb || !all(token.comments_before, function(comment) {
|
return token.nlb || !all(token.comments_before, function(comment) {
|
||||||
@@ -783,19 +784,19 @@ function parse($TEXT, options) {
|
|||||||
function can_insert_semicolon() {
|
function can_insert_semicolon() {
|
||||||
return !options.strict
|
return !options.strict
|
||||||
&& (is("eof") || is("punc", "}") || has_newline_before(S.token));
|
&& (is("eof") || is("punc", "}") || has_newline_before(S.token));
|
||||||
};
|
}
|
||||||
|
|
||||||
function semicolon(optional) {
|
function semicolon(optional) {
|
||||||
if (is("punc", ";")) next();
|
if (is("punc", ";")) next();
|
||||||
else if (!optional && !can_insert_semicolon()) unexpected();
|
else if (!optional && !can_insert_semicolon()) unexpected();
|
||||||
};
|
}
|
||||||
|
|
||||||
function parenthesised() {
|
function parenthesised() {
|
||||||
expect("(");
|
expect("(");
|
||||||
var exp = expression(true);
|
var exp = expression(true);
|
||||||
expect(")");
|
expect(")");
|
||||||
return exp;
|
return exp;
|
||||||
};
|
}
|
||||||
|
|
||||||
function embed_tokens(parser) {
|
function embed_tokens(parser) {
|
||||||
return function() {
|
return function() {
|
||||||
@@ -806,14 +807,14 @@ function parse($TEXT, options) {
|
|||||||
expr.end = end;
|
expr.end = end;
|
||||||
return expr;
|
return expr;
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
function handle_regexp() {
|
function handle_regexp() {
|
||||||
if (is("operator", "/") || is("operator", "/=")) {
|
if (is("operator", "/") || is("operator", "/=")) {
|
||||||
S.peeked = null;
|
S.peeked = null;
|
||||||
S.token = S.input(S.token.value.substr(1)); // force regexp
|
S.token = S.input(S.token.value.substr(1)); // force regexp
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
var statement = embed_tokens(function(strict_defun) {
|
var statement = embed_tokens(function(strict_defun) {
|
||||||
handle_regexp();
|
handle_regexp();
|
||||||
@@ -986,7 +987,7 @@ function parse($TEXT, options) {
|
|||||||
// check for `continue` that refers to this label.
|
// check for `continue` that refers to this label.
|
||||||
// those should be reported as syntax errors.
|
// those should be reported as syntax errors.
|
||||||
// https://github.com/mishoo/UglifyJS2/issues/287
|
// https://github.com/mishoo/UglifyJS2/issues/287
|
||||||
label.references.forEach(function(ref){
|
label.references.forEach(function(ref) {
|
||||||
if (ref instanceof AST_Continue) {
|
if (ref instanceof AST_Continue) {
|
||||||
ref = ref.label.start;
|
ref = ref.label.start;
|
||||||
croak("Continue label `" + label.name + "` refers to non-IterationStatement.",
|
croak("Continue label `" + label.name + "` refers to non-IterationStatement.",
|
||||||
@@ -995,11 +996,11 @@ function parse($TEXT, options) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
return new AST_LabeledStatement({ body: stat, label: label });
|
return new AST_LabeledStatement({ body: stat, label: label });
|
||||||
};
|
}
|
||||||
|
|
||||||
function simple_statement(tmp) {
|
function simple_statement(tmp) {
|
||||||
return new AST_SimpleStatement({ body: (tmp = expression(true), semicolon(), tmp) });
|
return new AST_SimpleStatement({ body: (tmp = expression(true), semicolon(), tmp) });
|
||||||
};
|
}
|
||||||
|
|
||||||
function break_cont(type) {
|
function break_cont(type) {
|
||||||
var label = null, ldef;
|
var label = null, ldef;
|
||||||
@@ -1007,18 +1008,17 @@ function parse($TEXT, options) {
|
|||||||
label = as_symbol(AST_LabelRef, true);
|
label = as_symbol(AST_LabelRef, true);
|
||||||
}
|
}
|
||||||
if (label != null) {
|
if (label != null) {
|
||||||
ldef = find_if(function(l){ return l.name == label.name }, S.labels);
|
ldef = find_if(function(l) {
|
||||||
if (!ldef)
|
return l.name == label.name;
|
||||||
croak("Undefined label " + label.name);
|
}, S.labels);
|
||||||
|
if (!ldef) croak("Undefined label " + label.name);
|
||||||
label.thedef = ldef;
|
label.thedef = ldef;
|
||||||
}
|
} else if (S.in_loop == 0) croak(type.TYPE + " not inside a loop or switch");
|
||||||
else if (S.in_loop == 0)
|
|
||||||
croak(type.TYPE + " not inside a loop or switch");
|
|
||||||
semicolon();
|
semicolon();
|
||||||
var stat = new type({ label: label });
|
var stat = new type({ label: label });
|
||||||
if (ldef) ldef.references.push(stat);
|
if (ldef) ldef.references.push(stat);
|
||||||
return stat;
|
return stat;
|
||||||
};
|
}
|
||||||
|
|
||||||
function for_() {
|
function for_() {
|
||||||
expect("(");
|
expect("(");
|
||||||
@@ -1039,7 +1039,7 @@ function parse($TEXT, options) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return regular_for(init);
|
return regular_for(init);
|
||||||
};
|
}
|
||||||
|
|
||||||
function regular_for(init) {
|
function regular_for(init) {
|
||||||
expect(";");
|
expect(";");
|
||||||
@@ -1053,7 +1053,7 @@ function parse($TEXT, options) {
|
|||||||
step : step,
|
step : step,
|
||||||
body : in_loop(statement)
|
body : in_loop(statement)
|
||||||
});
|
});
|
||||||
};
|
}
|
||||||
|
|
||||||
function for_in(init) {
|
function for_in(init) {
|
||||||
var obj = expression(true);
|
var obj = expression(true);
|
||||||
@@ -1063,7 +1063,7 @@ function parse($TEXT, options) {
|
|||||||
object : obj,
|
object : obj,
|
||||||
body : in_loop(statement)
|
body : in_loop(statement)
|
||||||
});
|
});
|
||||||
};
|
}
|
||||||
|
|
||||||
var function_ = function(ctor) {
|
var function_ = function(ctor) {
|
||||||
var in_statement = ctor === AST_Defun;
|
var in_statement = ctor === AST_Defun;
|
||||||
@@ -1113,7 +1113,7 @@ function parse($TEXT, options) {
|
|||||||
body : body,
|
body : body,
|
||||||
alternative : belse
|
alternative : belse
|
||||||
});
|
});
|
||||||
};
|
}
|
||||||
|
|
||||||
function block_(strict_defun) {
|
function block_(strict_defun) {
|
||||||
expect("{");
|
expect("{");
|
||||||
@@ -1124,7 +1124,7 @@ function parse($TEXT, options) {
|
|||||||
}
|
}
|
||||||
next();
|
next();
|
||||||
return a;
|
return a;
|
||||||
};
|
}
|
||||||
|
|
||||||
function switch_body_() {
|
function switch_body_() {
|
||||||
expect("{");
|
expect("{");
|
||||||
@@ -1159,7 +1159,7 @@ function parse($TEXT, options) {
|
|||||||
if (branch) branch.end = prev();
|
if (branch) branch.end = prev();
|
||||||
next();
|
next();
|
||||||
return a;
|
return a;
|
||||||
};
|
}
|
||||||
|
|
||||||
function try_() {
|
function try_() {
|
||||||
var body = block_(), bcatch = null, bfinally = null;
|
var body = block_(), bcatch = null, bfinally = null;
|
||||||
@@ -1192,7 +1192,7 @@ function parse($TEXT, options) {
|
|||||||
bcatch : bcatch,
|
bcatch : bcatch,
|
||||||
bfinally : bfinally
|
bfinally : bfinally
|
||||||
});
|
});
|
||||||
};
|
}
|
||||||
|
|
||||||
function vardefs(no_in) {
|
function vardefs(no_in) {
|
||||||
var a = [];
|
var a = [];
|
||||||
@@ -1208,7 +1208,7 @@ function parse($TEXT, options) {
|
|||||||
next();
|
next();
|
||||||
}
|
}
|
||||||
return a;
|
return a;
|
||||||
};
|
}
|
||||||
|
|
||||||
var var_ = function(no_in) {
|
var var_ = function(no_in) {
|
||||||
return new AST_Var({
|
return new AST_Var({
|
||||||
@@ -1274,7 +1274,7 @@ function parse($TEXT, options) {
|
|||||||
}
|
}
|
||||||
next();
|
next();
|
||||||
return ret;
|
return ret;
|
||||||
};
|
}
|
||||||
|
|
||||||
var expr_atom = function(allow_calls) {
|
var expr_atom = function(allow_calls) {
|
||||||
if (is("operator", "new")) {
|
if (is("operator", "new")) {
|
||||||
@@ -1340,7 +1340,7 @@ function parse($TEXT, options) {
|
|||||||
}
|
}
|
||||||
next();
|
next();
|
||||||
return a;
|
return a;
|
||||||
};
|
}
|
||||||
|
|
||||||
var array_ = embed_tokens(function() {
|
var array_ = embed_tokens(function() {
|
||||||
expect("[");
|
expect("[");
|
||||||
@@ -1417,14 +1417,14 @@ function parse($TEXT, options) {
|
|||||||
default:
|
default:
|
||||||
unexpected();
|
unexpected();
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
function as_name() {
|
function as_name() {
|
||||||
var tmp = S.token;
|
var tmp = S.token;
|
||||||
if (tmp.type != "name") unexpected();
|
if (tmp.type != "name") unexpected();
|
||||||
next();
|
next();
|
||||||
return tmp.value;
|
return tmp.value;
|
||||||
};
|
}
|
||||||
|
|
||||||
function _make_symbol(type) {
|
function _make_symbol(type) {
|
||||||
var name = S.token.value;
|
var name = S.token.value;
|
||||||
@@ -1433,7 +1433,7 @@ function parse($TEXT, options) {
|
|||||||
start : S.token,
|
start : S.token,
|
||||||
end : S.token
|
end : S.token
|
||||||
});
|
});
|
||||||
};
|
}
|
||||||
|
|
||||||
function strict_verify_symbol(sym) {
|
function strict_verify_symbol(sym) {
|
||||||
if (sym.name == "arguments" || sym.name == "eval")
|
if (sym.name == "arguments" || sym.name == "eval")
|
||||||
@@ -1451,7 +1451,7 @@ function parse($TEXT, options) {
|
|||||||
}
|
}
|
||||||
next();
|
next();
|
||||||
return sym;
|
return sym;
|
||||||
};
|
}
|
||||||
|
|
||||||
function mark_pure(call) {
|
function mark_pure(call) {
|
||||||
var start = call.start;
|
var start = call.start;
|
||||||
@@ -1536,7 +1536,7 @@ function parse($TEXT, options) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return new ctor({ operator: op, expression: expr });
|
return new ctor({ operator: op, expression: expr });
|
||||||
};
|
}
|
||||||
|
|
||||||
var expr_op = function(left, min_prec, no_in) {
|
var expr_op = function(left, min_prec, no_in) {
|
||||||
var op = is("operator") ? S.token.value : null;
|
var op = is("operator") ? S.token.value : null;
|
||||||
@@ -1558,7 +1558,7 @@ function parse($TEXT, options) {
|
|||||||
|
|
||||||
function expr_ops(no_in) {
|
function expr_ops(no_in) {
|
||||||
return expr_op(maybe_unary(true), 0, no_in);
|
return expr_op(maybe_unary(true), 0, no_in);
|
||||||
};
|
}
|
||||||
|
|
||||||
var maybe_conditional = function(no_in) {
|
var maybe_conditional = function(no_in) {
|
||||||
var start = S.token;
|
var start = S.token;
|
||||||
@@ -1580,7 +1580,7 @@ function parse($TEXT, options) {
|
|||||||
|
|
||||||
function is_assignable(expr) {
|
function is_assignable(expr) {
|
||||||
return expr instanceof AST_PropAccess || expr instanceof AST_SymbolRef;
|
return expr instanceof AST_PropAccess || expr instanceof AST_SymbolRef;
|
||||||
};
|
}
|
||||||
|
|
||||||
var maybe_assign = function(no_in) {
|
var maybe_assign = function(no_in) {
|
||||||
var start = S.token;
|
var start = S.token;
|
||||||
@@ -1622,13 +1622,13 @@ function parse($TEXT, options) {
|
|||||||
var ret = cont();
|
var ret = cont();
|
||||||
--S.in_loop;
|
--S.in_loop;
|
||||||
return ret;
|
return ret;
|
||||||
};
|
}
|
||||||
|
|
||||||
if (options.expression) {
|
if (options.expression) {
|
||||||
return expression(true);
|
return expression(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (function(){
|
return function() {
|
||||||
var start = S.token;
|
var start = S.token;
|
||||||
var body = [];
|
var body = [];
|
||||||
S.input.push_directives_stack();
|
S.input.push_directives_stack();
|
||||||
@@ -1644,6 +1644,5 @@ function parse($TEXT, options) {
|
|||||||
toplevel = new AST_Toplevel({ start: start, body: body, end: end });
|
toplevel = new AST_Toplevel({ start: start, body: body, end: end });
|
||||||
}
|
}
|
||||||
return toplevel;
|
return toplevel;
|
||||||
})();
|
}();
|
||||||
|
}
|
||||||
};
|
|
||||||
|
|||||||
@@ -53,25 +53,30 @@ function find_builtins(reserved) {
|
|||||||
"-Infinity",
|
"-Infinity",
|
||||||
"undefined",
|
"undefined",
|
||||||
].forEach(add);
|
].forEach(add);
|
||||||
[ Object, Array, Function, Number,
|
[
|
||||||
String, Boolean, Error, Math,
|
Array,
|
||||||
Date, RegExp
|
Boolean,
|
||||||
].forEach(function(ctor){
|
Date,
|
||||||
|
Error,
|
||||||
|
Function,
|
||||||
|
Math,
|
||||||
|
Number,
|
||||||
|
Object,
|
||||||
|
RegExp,
|
||||||
|
String,
|
||||||
|
].forEach(function(ctor) {
|
||||||
Object.getOwnPropertyNames(ctor).map(add);
|
Object.getOwnPropertyNames(ctor).map(add);
|
||||||
if (ctor.prototype) {
|
if (ctor.prototype) {
|
||||||
Object.getOwnPropertyNames(ctor.prototype).map(add);
|
Object.getOwnPropertyNames(ctor.prototype).map(add);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
function add(name) {
|
function add(name) {
|
||||||
push_uniq(reserved, name);
|
push_uniq(reserved, name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function reserve_quoted_keys(ast, reserved) {
|
function reserve_quoted_keys(ast, reserved) {
|
||||||
function add(name) {
|
|
||||||
push_uniq(reserved, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
ast.walk(new TreeWalker(function(node) {
|
ast.walk(new TreeWalker(function(node) {
|
||||||
if (node instanceof AST_ObjectKeyVal && node.quote) {
|
if (node instanceof AST_ObjectKeyVal && node.quote) {
|
||||||
add(node.key);
|
add(node.key);
|
||||||
@@ -79,6 +84,10 @@ function reserve_quoted_keys(ast, reserved) {
|
|||||||
addStrings(node.property, add);
|
addStrings(node.property, add);
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
function add(name) {
|
||||||
|
push_uniq(reserved, name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function addStrings(node, add) {
|
function addStrings(node, add) {
|
||||||
@@ -127,51 +136,41 @@ function mangle_properties(ast, options) {
|
|||||||
// note debug may be enabled as an empty string, which is falsey. Also treat passing 'true'
|
// note debug may be enabled as an empty string, which is falsey. Also treat passing 'true'
|
||||||
// the same as passing an empty string.
|
// the same as passing an empty string.
|
||||||
var debug = options.debug !== false;
|
var debug = options.debug !== false;
|
||||||
var debug_name_suffix;
|
var debug_suffix;
|
||||||
if (debug) {
|
if (debug) debug_suffix = options.debug === true ? "" : options.debug;
|
||||||
debug_name_suffix = (options.debug === true ? "" : options.debug);
|
|
||||||
}
|
|
||||||
|
|
||||||
var names_to_mangle = [];
|
var names_to_mangle = [];
|
||||||
var unmangleable = [];
|
var unmangleable = [];
|
||||||
|
|
||||||
// step 1: find candidates to mangle
|
// step 1: find candidates to mangle
|
||||||
ast.walk(new TreeWalker(function(node){
|
ast.walk(new TreeWalker(function(node) {
|
||||||
if (node instanceof AST_ObjectKeyVal) {
|
if (node instanceof AST_ObjectKeyVal) {
|
||||||
add(node.key);
|
add(node.key);
|
||||||
}
|
} else if (node instanceof AST_ObjectProperty) {
|
||||||
else if (node instanceof AST_ObjectProperty) {
|
|
||||||
// setter or getter, since KeyVal is handled above
|
// setter or getter, since KeyVal is handled above
|
||||||
add(node.key.name);
|
add(node.key.name);
|
||||||
}
|
} else if (node instanceof AST_Dot) {
|
||||||
else if (node instanceof AST_Dot) {
|
|
||||||
add(node.property);
|
add(node.property);
|
||||||
}
|
} else if (node instanceof AST_Sub) {
|
||||||
else if (node instanceof AST_Sub) {
|
|
||||||
addStrings(node.property, add);
|
addStrings(node.property, add);
|
||||||
}
|
} else if (node instanceof AST_Call
|
||||||
else if (node instanceof AST_Call
|
|
||||||
&& node.expression.print_to_string() == "Object.defineProperty") {
|
&& node.expression.print_to_string() == "Object.defineProperty") {
|
||||||
addStrings(node.args[1], add);
|
addStrings(node.args[1], add);
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
|
||||||
// step 2: transform the tree, renaming properties
|
// step 2: transform the tree, renaming properties
|
||||||
return ast.transform(new TreeTransformer(function(node){
|
return ast.transform(new TreeTransformer(function(node) {
|
||||||
if (node instanceof AST_ObjectKeyVal) {
|
if (node instanceof AST_ObjectKeyVal) {
|
||||||
node.key = mangle(node.key);
|
node.key = mangle(node.key);
|
||||||
}
|
} else if (node instanceof AST_ObjectProperty) {
|
||||||
else if (node instanceof AST_ObjectProperty) {
|
|
||||||
// setter or getter
|
// setter or getter
|
||||||
node.key.name = mangle(node.key.name);
|
node.key.name = mangle(node.key.name);
|
||||||
}
|
} else if (node instanceof AST_Dot) {
|
||||||
else if (node instanceof AST_Dot) {
|
|
||||||
node.property = mangle(node.property);
|
node.property = mangle(node.property);
|
||||||
}
|
} else if (!options.keep_quoted && node instanceof AST_Sub) {
|
||||||
else if (!options.keep_quoted && node instanceof AST_Sub) {
|
|
||||||
node.property = mangleStrings(node.property);
|
node.property = mangleStrings(node.property);
|
||||||
}
|
} else if (node instanceof AST_Call
|
||||||
else if (node instanceof AST_Call
|
|
||||||
&& node.expression.print_to_string() == "Object.defineProperty") {
|
&& node.expression.print_to_string() == "Object.defineProperty") {
|
||||||
node.args[1] = mangleStrings(node.args[1]);
|
node.args[1] = mangleStrings(node.args[1]);
|
||||||
}
|
}
|
||||||
@@ -182,9 +181,7 @@ function mangle_properties(ast, options) {
|
|||||||
function can_mangle(name) {
|
function can_mangle(name) {
|
||||||
if (unmangleable.indexOf(name) >= 0) return false;
|
if (unmangleable.indexOf(name) >= 0) return false;
|
||||||
if (reserved.indexOf(name) >= 0) return false;
|
if (reserved.indexOf(name) >= 0) return false;
|
||||||
if (options.only_cache) {
|
if (options.only_cache) return cache.has(name);
|
||||||
return cache.has(name);
|
|
||||||
}
|
|
||||||
if (/^-?[0-9]+(\.[0-9]+)?(e[+-][0-9]+)?$/.test(name)) return false;
|
if (/^-?[0-9]+(\.[0-9]+)?(e[+-][0-9]+)?$/.test(name)) return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -192,57 +189,42 @@ function mangle_properties(ast, options) {
|
|||||||
function should_mangle(name) {
|
function should_mangle(name) {
|
||||||
if (regex && !regex.test(name)) return false;
|
if (regex && !regex.test(name)) return false;
|
||||||
if (reserved.indexOf(name) >= 0) return false;
|
if (reserved.indexOf(name) >= 0) return false;
|
||||||
return cache.has(name)
|
return cache.has(name) || names_to_mangle.indexOf(name) >= 0;
|
||||||
|| names_to_mangle.indexOf(name) >= 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function add(name) {
|
function add(name) {
|
||||||
if (can_mangle(name))
|
if (can_mangle(name)) push_uniq(names_to_mangle, name);
|
||||||
push_uniq(names_to_mangle, name);
|
if (!should_mangle(name)) push_uniq(unmangleable, name);
|
||||||
|
|
||||||
if (!should_mangle(name)) {
|
|
||||||
push_uniq(unmangleable, name);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function mangle(name) {
|
function mangle(name) {
|
||||||
if (!should_mangle(name)) {
|
if (!should_mangle(name)) {
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
var mangled = cache.get(name);
|
var mangled = cache.get(name);
|
||||||
if (!mangled) {
|
if (!mangled) {
|
||||||
if (debug) {
|
if (debug) {
|
||||||
// debug mode: use a prefix and suffix to preserve readability, e.g. o.foo -> o._$foo$NNN_.
|
// debug mode: use a prefix and suffix to preserve readability, e.g. o.foo -> o._$foo$NNN_.
|
||||||
var debug_mangled = "_$" + name + "$" + debug_name_suffix + "_";
|
var debug_mangled = "_$" + name + "$" + debug_suffix + "_";
|
||||||
|
if (can_mangle(debug_mangled)) mangled = debug_mangled;
|
||||||
if (can_mangle(debug_mangled)) {
|
|
||||||
mangled = debug_mangled;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// either debug mode is off, or it is on and we could not use the mangled name
|
// either debug mode is off, or it is on and we could not use the mangled name
|
||||||
if (!mangled) {
|
if (!mangled) do {
|
||||||
do {
|
mangled = base54(++cname);
|
||||||
mangled = base54(++cname);
|
} while (!can_mangle(mangled));
|
||||||
} while (!can_mangle(mangled));
|
|
||||||
}
|
|
||||||
|
|
||||||
cache.set(name, mangled);
|
cache.set(name, mangled);
|
||||||
}
|
}
|
||||||
return mangled;
|
return mangled;
|
||||||
}
|
}
|
||||||
|
|
||||||
function mangleStrings(node) {
|
function mangleStrings(node) {
|
||||||
return node.transform(new TreeTransformer(function(node){
|
return node.transform(new TreeTransformer(function(node) {
|
||||||
if (node instanceof AST_Sequence) {
|
if (node instanceof AST_Sequence) {
|
||||||
var last = node.expressions.length - 1;
|
var last = node.expressions.length - 1;
|
||||||
node.expressions[last] = mangleStrings(node.expressions[last]);
|
node.expressions[last] = mangleStrings(node.expressions[last]);
|
||||||
}
|
} else if (node instanceof AST_String) {
|
||||||
else if (node instanceof AST_String) {
|
|
||||||
node.value = mangle(node.value);
|
node.value = mangle(node.value);
|
||||||
}
|
} else if (node instanceof AST_Conditional) {
|
||||||
else if (node instanceof AST_Conditional) {
|
|
||||||
node.consequent = mangleStrings(node.consequent);
|
node.consequent = mangleStrings(node.consequent);
|
||||||
node.alternative = mangleStrings(node.alternative);
|
node.alternative = mangleStrings(node.alternative);
|
||||||
}
|
}
|
||||||
|
|||||||
142
lib/scope.js
142
lib/scope.js
@@ -63,12 +63,12 @@ SymbolDef.prototype = {
|
|||||||
unmangleable: function(options) {
|
unmangleable: function(options) {
|
||||||
if (!options) options = {};
|
if (!options) options = {};
|
||||||
|
|
||||||
return (this.global && !options.toplevel)
|
return this.global && !options.toplevel
|
||||||
|| this.undeclared
|
|| this.undeclared
|
||||||
|| (!options.eval && (this.scope.uses_eval || this.scope.uses_with))
|
|| !options.eval && this.scope.pinned()
|
||||||
|| (options.keep_fnames
|
|| options.keep_fnames
|
||||||
&& (this.orig[0] instanceof AST_SymbolLambda
|
&& (this.orig[0] instanceof AST_SymbolLambda
|
||||||
|| this.orig[0] instanceof AST_SymbolDefun));
|
|| this.orig[0] instanceof AST_SymbolDefun);
|
||||||
},
|
},
|
||||||
mangle: function(options) {
|
mangle: function(options) {
|
||||||
var cache = options.cache && options.cache.props;
|
var cache = options.cache && options.cache.props;
|
||||||
@@ -91,7 +91,7 @@ SymbolDef.prototype = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
|
AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
|
||||||
options = defaults(options, {
|
options = defaults(options, {
|
||||||
cache: null,
|
cache: null,
|
||||||
ie8: false,
|
ie8: false,
|
||||||
@@ -101,7 +101,7 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
|
|||||||
var self = this;
|
var self = this;
|
||||||
var scope = self.parent_scope = null;
|
var scope = self.parent_scope = null;
|
||||||
var defun = null;
|
var defun = null;
|
||||||
var tw = new TreeWalker(function(node, descend){
|
var tw = new TreeWalker(function(node, descend) {
|
||||||
if (node instanceof AST_Catch) {
|
if (node instanceof AST_Catch) {
|
||||||
var save_scope = scope;
|
var save_scope = scope;
|
||||||
scope = new AST_Scope(node);
|
scope = new AST_Scope(node);
|
||||||
@@ -118,11 +118,10 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
|
|||||||
descend();
|
descend();
|
||||||
scope = save_scope;
|
scope = save_scope;
|
||||||
defun = save_defun;
|
defun = save_defun;
|
||||||
return true; // don't descend again in TreeWalker
|
return true;
|
||||||
}
|
}
|
||||||
if (node instanceof AST_With) {
|
if (node instanceof AST_With) {
|
||||||
for (var s = scope; s; s = s.parent_scope)
|
for (var s = scope; s; s = s.parent_scope) s.uses_with = true;
|
||||||
s.uses_with = true;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (node instanceof AST_Symbol) {
|
if (node instanceof AST_Symbol) {
|
||||||
@@ -132,18 +131,14 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
|
|||||||
node.thedef = node;
|
node.thedef = node;
|
||||||
node.references = [];
|
node.references = [];
|
||||||
}
|
}
|
||||||
if (node instanceof AST_SymbolLambda) {
|
if (node instanceof AST_SymbolDefun) {
|
||||||
defun.def_function(node, node.name == "arguments" ? undefined : defun);
|
// This should be defined in the parent scope, as we encounter the
|
||||||
}
|
// AST_Defun node before getting to its AST_Symbol.
|
||||||
else if (node instanceof AST_SymbolDefun) {
|
(node.scope = defun.parent_scope.resolve()).def_function(node, defun);
|
||||||
// Careful here, the scope where this should be defined is
|
} else if (node instanceof AST_SymbolLambda) {
|
||||||
// the parent scope. The reason is that we enter a new
|
var def = defun.def_function(node, node.name == "arguments" ? undefined : defun);
|
||||||
// scope when we encounter the AST_Defun node (which is
|
if (options.ie8) def.defun = defun.parent_scope.resolve();
|
||||||
// instanceof AST_Scope) but we get to the symbol a bit
|
} else if (node instanceof AST_SymbolVar) {
|
||||||
// later.
|
|
||||||
(node.scope = defun.parent_scope).def_function(node, defun);
|
|
||||||
}
|
|
||||||
else if (node instanceof AST_SymbolVar) {
|
|
||||||
defun.def_variable(node, node.TYPE == "SymbolVar" ? null : undefined);
|
defun.def_variable(node, node.TYPE == "SymbolVar" ? null : undefined);
|
||||||
if (defun !== scope) {
|
if (defun !== scope) {
|
||||||
node.mark_enclosed(options);
|
node.mark_enclosed(options);
|
||||||
@@ -153,8 +148,7 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
|
|||||||
}
|
}
|
||||||
node.reference(options);
|
node.reference(options);
|
||||||
}
|
}
|
||||||
}
|
} else if (node instanceof AST_SymbolCatch) {
|
||||||
else if (node instanceof AST_SymbolCatch) {
|
|
||||||
scope.def_variable(node).defun = defun;
|
scope.def_variable(node).defun = defun;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -162,9 +156,9 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
|
|||||||
|
|
||||||
// pass 2: find back references and eval
|
// pass 2: find back references and eval
|
||||||
self.globals = new Dictionary();
|
self.globals = new Dictionary();
|
||||||
var tw = new TreeWalker(function(node, descend){
|
var tw = new TreeWalker(function(node) {
|
||||||
if (node instanceof AST_LoopControl && node.label) {
|
if (node instanceof AST_LoopControl) {
|
||||||
node.label.thedef.references.push(node);
|
if (node.label) node.label.thedef.references.push(node);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (node instanceof AST_SymbolRef) {
|
if (node instanceof AST_SymbolRef) {
|
||||||
@@ -185,39 +179,47 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
// ensure mangling works if catch reuses a scope variable
|
// ensure mangling works if catch reuses a scope variable
|
||||||
var def;
|
if (node instanceof AST_SymbolCatch) {
|
||||||
if (node instanceof AST_SymbolCatch && (def = node.definition().redefined())) {
|
var def = node.definition().redefined();
|
||||||
var s = node.scope;
|
if (def) for (var s = node.scope; s; s = s.parent_scope) {
|
||||||
while (s) {
|
|
||||||
push_uniq(s.enclosed, def);
|
push_uniq(s.enclosed, def);
|
||||||
if (s === def.scope) break;
|
if (s === def.scope) break;
|
||||||
s = s.parent_scope;
|
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
self.walk(tw);
|
self.walk(tw);
|
||||||
|
|
||||||
// pass 3: fix up any scoping issue with IE8
|
// pass 3: fix up any scoping issue with IE8
|
||||||
if (options.ie8) {
|
if (options.ie8) self.walk(new TreeWalker(function(node) {
|
||||||
self.walk(new TreeWalker(function(node, descend) {
|
if (node instanceof AST_SymbolCatch) {
|
||||||
if (node instanceof AST_SymbolCatch) {
|
redefine(node, node.thedef.defun);
|
||||||
var name = node.name;
|
return true;
|
||||||
var refs = node.thedef.references;
|
}
|
||||||
var scope = node.thedef.defun;
|
if (node instanceof AST_SymbolLambda) {
|
||||||
var def = scope.find_variable(name) || self.globals.get(name) || scope.def_variable(node);
|
var def = node.thedef;
|
||||||
refs.forEach(function(ref) {
|
if (def.orig.length == 1) {
|
||||||
ref.thedef = def;
|
redefine(node, node.scope.parent_scope);
|
||||||
ref.reference(options);
|
node.thedef.init = def.init;
|
||||||
});
|
|
||||||
node.thedef = def;
|
|
||||||
node.reference(options);
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
}));
|
return true;
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
function redefine(node, scope) {
|
||||||
|
var name = node.name;
|
||||||
|
var refs = node.thedef.references;
|
||||||
|
var def = scope.find_variable(name) || self.globals.get(name) || scope.def_variable(node);
|
||||||
|
refs.forEach(function(ref) {
|
||||||
|
ref.thedef = def;
|
||||||
|
ref.reference(options);
|
||||||
|
});
|
||||||
|
node.thedef = def;
|
||||||
|
node.reference(options);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Toplevel.DEFMETHOD("def_global", function(node){
|
AST_Toplevel.DEFMETHOD("def_global", function(node) {
|
||||||
var globals = this.globals, name = node.name;
|
var globals = this.globals, name = node.name;
|
||||||
if (globals.has(name)) {
|
if (globals.has(name)) {
|
||||||
return globals.get(name);
|
return globals.get(name);
|
||||||
@@ -230,7 +232,7 @@ AST_Toplevel.DEFMETHOD("def_global", function(node){
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Scope.DEFMETHOD("init_scope_vars", function(parent_scope){
|
AST_Scope.DEFMETHOD("init_scope_vars", function(parent_scope) {
|
||||||
this.variables = new Dictionary(); // map name to AST_SymbolVar (variables defined in this scope; includes functions)
|
this.variables = new Dictionary(); // map name to AST_SymbolVar (variables defined in this scope; includes functions)
|
||||||
this.functions = new Dictionary(); // map name to AST_SymbolDefun (functions defined in this scope)
|
this.functions = new Dictionary(); // map name to AST_SymbolDefun (functions defined in this scope)
|
||||||
this.uses_with = false; // will be set to true if this or some nested scope uses the `with` statement
|
this.uses_with = false; // will be set to true if this or some nested scope uses the `with` statement
|
||||||
@@ -240,7 +242,7 @@ AST_Scope.DEFMETHOD("init_scope_vars", function(parent_scope){
|
|||||||
this.cname = -1; // the current index for mangling functions/variables
|
this.cname = -1; // the current index for mangling functions/variables
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Lambda.DEFMETHOD("init_scope_vars", function(){
|
AST_Lambda.DEFMETHOD("init_scope_vars", function() {
|
||||||
AST_Scope.prototype.init_scope_vars.apply(this, arguments);
|
AST_Scope.prototype.init_scope_vars.apply(this, arguments);
|
||||||
this.uses_arguments = false;
|
this.uses_arguments = false;
|
||||||
this.def_variable(new AST_SymbolFunarg({
|
this.def_variable(new AST_SymbolFunarg({
|
||||||
@@ -252,8 +254,7 @@ AST_Lambda.DEFMETHOD("init_scope_vars", function(){
|
|||||||
|
|
||||||
AST_Symbol.DEFMETHOD("mark_enclosed", function(options) {
|
AST_Symbol.DEFMETHOD("mark_enclosed", function(options) {
|
||||||
var def = this.definition();
|
var def = this.definition();
|
||||||
var s = this.scope;
|
for (var s = this.scope; s; s = s.parent_scope) {
|
||||||
while (s) {
|
|
||||||
push_uniq(s.enclosed, def);
|
push_uniq(s.enclosed, def);
|
||||||
if (options.keep_fnames) {
|
if (options.keep_fnames) {
|
||||||
s.functions.each(function(d) {
|
s.functions.each(function(d) {
|
||||||
@@ -261,7 +262,6 @@ AST_Symbol.DEFMETHOD("mark_enclosed", function(options) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (s === def.scope) break;
|
if (s === def.scope) break;
|
||||||
s = s.parent_scope;
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -270,20 +270,20 @@ AST_Symbol.DEFMETHOD("reference", function(options) {
|
|||||||
this.mark_enclosed(options);
|
this.mark_enclosed(options);
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Scope.DEFMETHOD("find_variable", function(name){
|
AST_Scope.DEFMETHOD("find_variable", function(name) {
|
||||||
if (name instanceof AST_Symbol) name = name.name;
|
if (name instanceof AST_Symbol) name = name.name;
|
||||||
return this.variables.get(name)
|
return this.variables.get(name)
|
||||||
|| (this.parent_scope && this.parent_scope.find_variable(name));
|
|| (this.parent_scope && this.parent_scope.find_variable(name));
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Scope.DEFMETHOD("def_function", function(symbol, init){
|
AST_Scope.DEFMETHOD("def_function", function(symbol, init) {
|
||||||
var def = this.def_variable(symbol, init);
|
var def = this.def_variable(symbol, init);
|
||||||
if (!def.init || def.init instanceof AST_Defun) def.init = init;
|
if (!def.init || def.init instanceof AST_Defun) def.init = init;
|
||||||
this.functions.set(symbol.name, def);
|
this.functions.set(symbol.name, def);
|
||||||
return def;
|
return def;
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Scope.DEFMETHOD("def_variable", function(symbol, init){
|
AST_Scope.DEFMETHOD("def_variable", function(symbol, init) {
|
||||||
var def = this.variables.get(symbol.name);
|
var def = this.variables.get(symbol.name);
|
||||||
if (def) {
|
if (def) {
|
||||||
def.orig.push(symbol);
|
def.orig.push(symbol);
|
||||||
@@ -298,6 +298,12 @@ AST_Scope.DEFMETHOD("def_variable", function(symbol, init){
|
|||||||
return symbol.thedef = def;
|
return symbol.thedef = def;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
AST_Lambda.DEFMETHOD("resolve", return_this);
|
||||||
|
AST_Scope.DEFMETHOD("resolve", function() {
|
||||||
|
return this.parent_scope;
|
||||||
|
});
|
||||||
|
AST_Toplevel.DEFMETHOD("resolve", return_this);
|
||||||
|
|
||||||
function names_in_use(scope, options) {
|
function names_in_use(scope, options) {
|
||||||
var names = scope.names_in_use;
|
var names = scope.names_in_use;
|
||||||
if (!names) {
|
if (!names) {
|
||||||
@@ -349,13 +355,10 @@ function next_mangled_name(scope, options, def) {
|
|||||||
holes.push(scope.cname);
|
holes.push(scope.cname);
|
||||||
}
|
}
|
||||||
scope.names_in_use[name] = true;
|
scope.names_in_use[name] = true;
|
||||||
if (options.ie8 && def.orig[0] instanceof AST_SymbolLambda) {
|
|
||||||
names_in_use(scope.parent_scope, options)[name] = true;
|
|
||||||
}
|
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
AST_Symbol.DEFMETHOD("unmangleable", function(options){
|
AST_Symbol.DEFMETHOD("unmangleable", function(options) {
|
||||||
var def = this.definition();
|
var def = this.definition();
|
||||||
return !def || def.unmangleable(options);
|
return !def || def.unmangleable(options);
|
||||||
});
|
});
|
||||||
@@ -363,16 +366,15 @@ AST_Symbol.DEFMETHOD("unmangleable", function(options){
|
|||||||
// labels are always mangleable
|
// labels are always mangleable
|
||||||
AST_Label.DEFMETHOD("unmangleable", return_false);
|
AST_Label.DEFMETHOD("unmangleable", return_false);
|
||||||
|
|
||||||
AST_Symbol.DEFMETHOD("unreferenced", function(){
|
AST_Symbol.DEFMETHOD("unreferenced", function() {
|
||||||
return this.definition().references.length == 0
|
return !this.definition().references.length && !this.scope.pinned();
|
||||||
&& !(this.scope.uses_eval || this.scope.uses_with);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Symbol.DEFMETHOD("definition", function(){
|
AST_Symbol.DEFMETHOD("definition", function() {
|
||||||
return this.thedef;
|
return this.thedef;
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Symbol.DEFMETHOD("global", function(){
|
AST_Symbol.DEFMETHOD("global", function() {
|
||||||
return this.definition().global;
|
return this.definition().global;
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -391,7 +393,7 @@ function _default_mangler_options(options) {
|
|||||||
return options;
|
return options;
|
||||||
}
|
}
|
||||||
|
|
||||||
AST_Toplevel.DEFMETHOD("mangle_names", function(options){
|
AST_Toplevel.DEFMETHOD("mangle_names", function(options) {
|
||||||
options = _default_mangler_options(options);
|
options = _default_mangler_options(options);
|
||||||
|
|
||||||
// We only need to mangle declaration nodes. Special logic wired
|
// We only need to mangle declaration nodes. Special logic wired
|
||||||
@@ -408,13 +410,13 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options){
|
|||||||
}
|
}
|
||||||
|
|
||||||
var redefined = [];
|
var redefined = [];
|
||||||
var tw = new TreeWalker(function(node, descend){
|
var tw = new TreeWalker(function(node, descend) {
|
||||||
if (node instanceof AST_LabeledStatement) {
|
if (node instanceof AST_LabeledStatement) {
|
||||||
// lname is incremented when we get to the AST_Label
|
// lname is incremented when we get to the AST_Label
|
||||||
var save_nesting = lname;
|
var save_nesting = lname;
|
||||||
descend();
|
descend();
|
||||||
lname = save_nesting;
|
lname = save_nesting;
|
||||||
return true; // don't descend again in TreeWalker
|
return true;
|
||||||
}
|
}
|
||||||
if (node instanceof AST_Scope) {
|
if (node instanceof AST_Scope) {
|
||||||
descend();
|
descend();
|
||||||
@@ -426,7 +428,9 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options){
|
|||||||
}
|
}
|
||||||
if (node instanceof AST_Label) {
|
if (node instanceof AST_Label) {
|
||||||
var name;
|
var name;
|
||||||
do name = base54(++lname); while (!is_identifier(name));
|
do {
|
||||||
|
name = base54(++lname);
|
||||||
|
} while (!is_identifier(name));
|
||||||
node.mangled_name = name;
|
node.mangled_name = name;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -521,7 +525,7 @@ AST_Sequence.DEFMETHOD("tail_node", function() {
|
|||||||
return this.expressions[this.expressions.length - 1];
|
return this.expressions[this.expressions.length - 1];
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Toplevel.DEFMETHOD("compute_char_frequency", function(options){
|
AST_Toplevel.DEFMETHOD("compute_char_frequency", function(options) {
|
||||||
options = _default_mangler_options(options);
|
options = _default_mangler_options(options);
|
||||||
base54.reset();
|
base54.reset();
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -46,16 +46,15 @@
|
|||||||
// a small wrapper around fitzgen's source-map library
|
// a small wrapper around fitzgen's source-map library
|
||||||
function SourceMap(options) {
|
function SourceMap(options) {
|
||||||
options = defaults(options, {
|
options = defaults(options, {
|
||||||
file : null,
|
file: null,
|
||||||
root : null,
|
root: null,
|
||||||
orig : null,
|
orig: null,
|
||||||
|
orig_line_diff: 0,
|
||||||
orig_line_diff : 0,
|
dest_line_diff: 0,
|
||||||
dest_line_diff : 0,
|
}, true);
|
||||||
});
|
|
||||||
var generator = new MOZ_SourceMap.SourceMapGenerator({
|
var generator = new MOZ_SourceMap.SourceMapGenerator({
|
||||||
file : options.file,
|
file: options.file,
|
||||||
sourceRoot : options.root
|
sourceRoot: options.root
|
||||||
});
|
});
|
||||||
var maps = options.orig && Object.create(null);
|
var maps = options.orig && Object.create(null);
|
||||||
if (maps) for (var source in options.orig) {
|
if (maps) for (var source in options.orig) {
|
||||||
@@ -68,30 +67,38 @@ function SourceMap(options) {
|
|||||||
}
|
}
|
||||||
maps[source] = map;
|
maps[source] = map;
|
||||||
}
|
}
|
||||||
|
|
||||||
function add(source, gen_line, gen_col, orig_line, orig_col, name) {
|
|
||||||
var map = maps && maps[source];
|
|
||||||
if (map) {
|
|
||||||
var info = map.originalPositionFor({
|
|
||||||
line: orig_line,
|
|
||||||
column: orig_col
|
|
||||||
});
|
|
||||||
if (info.source === null) return;
|
|
||||||
source = info.source;
|
|
||||||
orig_line = info.line;
|
|
||||||
orig_col = info.column;
|
|
||||||
name = info.name || name;
|
|
||||||
}
|
|
||||||
generator.addMapping({
|
|
||||||
generated : { line: gen_line + options.dest_line_diff, column: gen_col },
|
|
||||||
original : { line: orig_line + options.orig_line_diff, column: orig_col },
|
|
||||||
source : source,
|
|
||||||
name : name
|
|
||||||
});
|
|
||||||
};
|
|
||||||
return {
|
return {
|
||||||
add : add,
|
add: function(source, gen_line, gen_col, orig_line, orig_col, name) {
|
||||||
get : function() { return generator },
|
var map = maps && maps[source];
|
||||||
toString : function() { return JSON.stringify(generator.toJSON()); }
|
if (map) {
|
||||||
|
var info = map.originalPositionFor({
|
||||||
|
line: orig_line,
|
||||||
|
column: orig_col
|
||||||
|
});
|
||||||
|
if (info.source === null) return;
|
||||||
|
source = info.source;
|
||||||
|
orig_line = info.line;
|
||||||
|
orig_col = info.column;
|
||||||
|
name = info.name || name;
|
||||||
|
}
|
||||||
|
generator.addMapping({
|
||||||
|
name: name,
|
||||||
|
source: source,
|
||||||
|
generated: {
|
||||||
|
line: gen_line + options.dest_line_diff,
|
||||||
|
column: gen_col
|
||||||
|
},
|
||||||
|
original: {
|
||||||
|
line: orig_line + options.orig_line_diff,
|
||||||
|
column: orig_col
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
get: function() {
|
||||||
|
return generator;
|
||||||
|
},
|
||||||
|
toString: function() {
|
||||||
|
return JSON.stringify(generator.toJSON());
|
||||||
|
}
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|||||||
132
lib/transform.js
132
lib/transform.js
@@ -43,8 +43,6 @@
|
|||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
// Tree transformer helpers.
|
|
||||||
|
|
||||||
function TreeTransformer(before, after) {
|
function TreeTransformer(before, after) {
|
||||||
TreeWalker.call(this);
|
TreeWalker.call(this);
|
||||||
this.before = before;
|
this.before = before;
|
||||||
@@ -52,168 +50,136 @@ function TreeTransformer(before, after) {
|
|||||||
}
|
}
|
||||||
TreeTransformer.prototype = new TreeWalker;
|
TreeTransformer.prototype = new TreeWalker;
|
||||||
|
|
||||||
(function(undefined){
|
(function(DEF) {
|
||||||
|
|
||||||
function _(node, descend) {
|
|
||||||
node.DEFMETHOD("transform", function(tw, in_list){
|
|
||||||
var x, y;
|
|
||||||
tw.push(this);
|
|
||||||
if (tw.before) x = tw.before(this, descend, in_list);
|
|
||||||
if (x === undefined) {
|
|
||||||
x = this;
|
|
||||||
descend(x, tw);
|
|
||||||
if (tw.after) {
|
|
||||||
y = tw.after(x, in_list);
|
|
||||||
if (y !== undefined) x = y;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
tw.pop();
|
|
||||||
return x;
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
function do_list(list, tw) {
|
function do_list(list, tw) {
|
||||||
return MAP(list, function(node){
|
return MAP(list, function(node) {
|
||||||
return node.transform(tw, true);
|
return node.transform(tw, true);
|
||||||
});
|
});
|
||||||
};
|
}
|
||||||
|
|
||||||
_(AST_Node, noop);
|
DEF(AST_Node, noop);
|
||||||
|
DEF(AST_LabeledStatement, function(self, tw) {
|
||||||
_(AST_LabeledStatement, function(self, tw){
|
|
||||||
self.label = self.label.transform(tw);
|
self.label = self.label.transform(tw);
|
||||||
self.body = self.body.transform(tw);
|
self.body = self.body.transform(tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_SimpleStatement, function(self, tw) {
|
||||||
_(AST_SimpleStatement, function(self, tw){
|
|
||||||
self.body = self.body.transform(tw);
|
self.body = self.body.transform(tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_Block, function(self, tw) {
|
||||||
_(AST_Block, function(self, tw){
|
|
||||||
self.body = do_list(self.body, tw);
|
self.body = do_list(self.body, tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_Do, function(self, tw) {
|
||||||
_(AST_Do, function(self, tw){
|
|
||||||
self.body = self.body.transform(tw);
|
self.body = self.body.transform(tw);
|
||||||
self.condition = self.condition.transform(tw);
|
self.condition = self.condition.transform(tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_While, function(self, tw) {
|
||||||
_(AST_While, function(self, tw){
|
|
||||||
self.condition = self.condition.transform(tw);
|
self.condition = self.condition.transform(tw);
|
||||||
self.body = self.body.transform(tw);
|
self.body = self.body.transform(tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_For, function(self, tw) {
|
||||||
_(AST_For, function(self, tw){
|
|
||||||
if (self.init) self.init = self.init.transform(tw);
|
if (self.init) self.init = self.init.transform(tw);
|
||||||
if (self.condition) self.condition = self.condition.transform(tw);
|
if (self.condition) self.condition = self.condition.transform(tw);
|
||||||
if (self.step) self.step = self.step.transform(tw);
|
if (self.step) self.step = self.step.transform(tw);
|
||||||
self.body = self.body.transform(tw);
|
self.body = self.body.transform(tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_ForIn, function(self, tw) {
|
||||||
_(AST_ForIn, function(self, tw){
|
|
||||||
self.init = self.init.transform(tw);
|
self.init = self.init.transform(tw);
|
||||||
self.object = self.object.transform(tw);
|
self.object = self.object.transform(tw);
|
||||||
self.body = self.body.transform(tw);
|
self.body = self.body.transform(tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_With, function(self, tw) {
|
||||||
_(AST_With, function(self, tw){
|
|
||||||
self.expression = self.expression.transform(tw);
|
self.expression = self.expression.transform(tw);
|
||||||
self.body = self.body.transform(tw);
|
self.body = self.body.transform(tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_Exit, function(self, tw) {
|
||||||
_(AST_Exit, function(self, tw){
|
|
||||||
if (self.value) self.value = self.value.transform(tw);
|
if (self.value) self.value = self.value.transform(tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_LoopControl, function(self, tw) {
|
||||||
_(AST_LoopControl, function(self, tw){
|
|
||||||
if (self.label) self.label = self.label.transform(tw);
|
if (self.label) self.label = self.label.transform(tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_If, function(self, tw) {
|
||||||
_(AST_If, function(self, tw){
|
|
||||||
self.condition = self.condition.transform(tw);
|
self.condition = self.condition.transform(tw);
|
||||||
self.body = self.body.transform(tw);
|
self.body = self.body.transform(tw);
|
||||||
if (self.alternative) self.alternative = self.alternative.transform(tw);
|
if (self.alternative) self.alternative = self.alternative.transform(tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_Switch, function(self, tw) {
|
||||||
_(AST_Switch, function(self, tw){
|
|
||||||
self.expression = self.expression.transform(tw);
|
self.expression = self.expression.transform(tw);
|
||||||
self.body = do_list(self.body, tw);
|
self.body = do_list(self.body, tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_Case, function(self, tw) {
|
||||||
_(AST_Case, function(self, tw){
|
|
||||||
self.expression = self.expression.transform(tw);
|
self.expression = self.expression.transform(tw);
|
||||||
self.body = do_list(self.body, tw);
|
self.body = do_list(self.body, tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_Try, function(self, tw) {
|
||||||
_(AST_Try, function(self, tw){
|
|
||||||
self.body = do_list(self.body, tw);
|
self.body = do_list(self.body, tw);
|
||||||
if (self.bcatch) self.bcatch = self.bcatch.transform(tw);
|
if (self.bcatch) self.bcatch = self.bcatch.transform(tw);
|
||||||
if (self.bfinally) self.bfinally = self.bfinally.transform(tw);
|
if (self.bfinally) self.bfinally = self.bfinally.transform(tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_Catch, function(self, tw) {
|
||||||
_(AST_Catch, function(self, tw){
|
|
||||||
self.argname = self.argname.transform(tw);
|
self.argname = self.argname.transform(tw);
|
||||||
self.body = do_list(self.body, tw);
|
self.body = do_list(self.body, tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_Definitions, function(self, tw) {
|
||||||
_(AST_Definitions, function(self, tw){
|
|
||||||
self.definitions = do_list(self.definitions, tw);
|
self.definitions = do_list(self.definitions, tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_VarDef, function(self, tw) {
|
||||||
_(AST_VarDef, function(self, tw){
|
|
||||||
self.name = self.name.transform(tw);
|
self.name = self.name.transform(tw);
|
||||||
if (self.value) self.value = self.value.transform(tw);
|
if (self.value) self.value = self.value.transform(tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_Lambda, function(self, tw) {
|
||||||
_(AST_Lambda, function(self, tw){
|
|
||||||
if (self.name) self.name = self.name.transform(tw);
|
if (self.name) self.name = self.name.transform(tw);
|
||||||
self.argnames = do_list(self.argnames, tw);
|
self.argnames = do_list(self.argnames, tw);
|
||||||
self.body = do_list(self.body, tw);
|
self.body = do_list(self.body, tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_Call, function(self, tw) {
|
||||||
_(AST_Call, function(self, tw){
|
|
||||||
self.expression = self.expression.transform(tw);
|
self.expression = self.expression.transform(tw);
|
||||||
self.args = do_list(self.args, tw);
|
self.args = do_list(self.args, tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_Sequence, function(self, tw) {
|
||||||
_(AST_Sequence, function(self, tw){
|
|
||||||
self.expressions = do_list(self.expressions, tw);
|
self.expressions = do_list(self.expressions, tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_Dot, function(self, tw) {
|
||||||
_(AST_Dot, function(self, tw){
|
|
||||||
self.expression = self.expression.transform(tw);
|
self.expression = self.expression.transform(tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_Sub, function(self, tw) {
|
||||||
_(AST_Sub, function(self, tw){
|
|
||||||
self.expression = self.expression.transform(tw);
|
self.expression = self.expression.transform(tw);
|
||||||
self.property = self.property.transform(tw);
|
self.property = self.property.transform(tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_Unary, function(self, tw) {
|
||||||
_(AST_Unary, function(self, tw){
|
|
||||||
self.expression = self.expression.transform(tw);
|
self.expression = self.expression.transform(tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_Binary, function(self, tw) {
|
||||||
_(AST_Binary, function(self, tw){
|
|
||||||
self.left = self.left.transform(tw);
|
self.left = self.left.transform(tw);
|
||||||
self.right = self.right.transform(tw);
|
self.right = self.right.transform(tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_Conditional, function(self, tw) {
|
||||||
_(AST_Conditional, function(self, tw){
|
|
||||||
self.condition = self.condition.transform(tw);
|
self.condition = self.condition.transform(tw);
|
||||||
self.consequent = self.consequent.transform(tw);
|
self.consequent = self.consequent.transform(tw);
|
||||||
self.alternative = self.alternative.transform(tw);
|
self.alternative = self.alternative.transform(tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_Array, function(self, tw) {
|
||||||
_(AST_Array, function(self, tw){
|
|
||||||
self.elements = do_list(self.elements, tw);
|
self.elements = do_list(self.elements, tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_Object, function(self, tw) {
|
||||||
_(AST_Object, function(self, tw){
|
|
||||||
self.properties = do_list(self.properties, tw);
|
self.properties = do_list(self.properties, tw);
|
||||||
});
|
});
|
||||||
|
DEF(AST_ObjectProperty, function(self, tw) {
|
||||||
_(AST_ObjectProperty, function(self, tw){
|
|
||||||
self.value = self.value.transform(tw);
|
self.value = self.value.transform(tw);
|
||||||
});
|
});
|
||||||
|
})(function(node, descend) {
|
||||||
})();
|
node.DEFMETHOD("transform", function(tw, in_list) {
|
||||||
|
var x, y;
|
||||||
|
tw.push(this);
|
||||||
|
if (tw.before) x = tw.before(this, descend, in_list);
|
||||||
|
if (typeof x === "undefined") {
|
||||||
|
x = this;
|
||||||
|
descend(x, tw);
|
||||||
|
if (tw.after) {
|
||||||
|
y = tw.after(x, in_list);
|
||||||
|
if (typeof y !== "undefined") x = y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tw.pop();
|
||||||
|
return x;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|||||||
26
lib/utils.js
26
lib/utils.js
@@ -52,9 +52,7 @@ function member(name, array) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function find_if(func, array) {
|
function find_if(func, array) {
|
||||||
for (var i = 0, n = array.length; i < n; ++i) {
|
for (var i = array.length; --i >= 0;) if (func(array[i])) return array[i];
|
||||||
if (func(array[i])) return array[i];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function repeat_string(str, i) {
|
function repeat_string(str, i) {
|
||||||
@@ -115,7 +113,7 @@ function return_true() { return true; }
|
|||||||
function return_this() { return this; }
|
function return_this() { return this; }
|
||||||
function return_null() { return null; }
|
function return_null() { return null; }
|
||||||
|
|
||||||
var MAP = (function(){
|
var MAP = (function() {
|
||||||
function MAP(a, f, backwards) {
|
function MAP(a, f, backwards) {
|
||||||
var ret = [], top = [], i;
|
var ret = [], top = [], i;
|
||||||
function doit() {
|
function doit() {
|
||||||
@@ -138,7 +136,7 @@ var MAP = (function(){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return is_last;
|
return is_last;
|
||||||
};
|
}
|
||||||
if (Array.isArray(a)) {
|
if (Array.isArray(a)) {
|
||||||
if (backwards) {
|
if (backwards) {
|
||||||
for (i = a.length; --i >= 0;) if (doit()) break;
|
for (i = a.length; --i >= 0;) if (doit()) break;
|
||||||
@@ -152,32 +150,30 @@ var MAP = (function(){
|
|||||||
for (i in a) if (HOP(a, i)) if (doit()) break;
|
for (i in a) if (HOP(a, i)) if (doit()) break;
|
||||||
}
|
}
|
||||||
return top.concat(ret);
|
return top.concat(ret);
|
||||||
};
|
}
|
||||||
MAP.at_top = function(val) { return new AtTop(val) };
|
MAP.at_top = function(val) { return new AtTop(val) };
|
||||||
MAP.splice = function(val) { return new Splice(val) };
|
MAP.splice = function(val) { return new Splice(val) };
|
||||||
MAP.last = function(val) { return new Last(val) };
|
MAP.last = function(val) { return new Last(val) };
|
||||||
var skip = MAP.skip = {};
|
var skip = MAP.skip = {};
|
||||||
function AtTop(val) { this.v = val };
|
function AtTop(val) { this.v = val }
|
||||||
function Splice(val) { this.v = val };
|
function Splice(val) { this.v = val }
|
||||||
function Last(val) { this.v = val };
|
function Last(val) { this.v = val }
|
||||||
return MAP;
|
return MAP;
|
||||||
})();
|
})();
|
||||||
|
|
||||||
function push_uniq(array, el) {
|
function push_uniq(array, el) {
|
||||||
if (array.indexOf(el) < 0)
|
if (array.indexOf(el) < 0) return array.push(el);
|
||||||
array.push(el);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function string_template(text, props) {
|
function string_template(text, props) {
|
||||||
return text.replace(/\{(.+?)\}/g, function(str, p){
|
return text.replace(/\{(.+?)\}/g, function(str, p) {
|
||||||
return props && props[p];
|
return props && props[p];
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function remove(array, el) {
|
function remove(array, el) {
|
||||||
for (var i = array.length; --i >= 0;) {
|
var index = array.indexOf(el);
|
||||||
if (array[i] === el) array.splice(i, 1);
|
if (index >= 0) array.splice(index, 1);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function makePredicate(words) {
|
function makePredicate(words) {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"description": "JavaScript parser, mangler/compressor and beautifier toolkit",
|
"description": "JavaScript parser, mangler/compressor and beautifier toolkit",
|
||||||
"author": "Mihai Bazon <mihai.bazon@gmail.com> (http://lisperator.net/)",
|
"author": "Mihai Bazon <mihai.bazon@gmail.com> (http://lisperator.net/)",
|
||||||
"license": "BSD-2-Clause",
|
"license": "BSD-2-Clause",
|
||||||
"version": "3.3.26",
|
"version": "3.4.6",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.8.0"
|
"node": ">=0.8.0"
|
||||||
},
|
},
|
||||||
@@ -23,11 +23,11 @@
|
|||||||
"LICENSE"
|
"LICENSE"
|
||||||
],
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"commander": "~2.15.0",
|
"commander": "~2.16.0",
|
||||||
"source-map": "~0.6.1"
|
"source-map": "~0.6.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"acorn": "~5.5.3",
|
"acorn": "~5.7.1",
|
||||||
"semver": "~5.5.0"
|
"semver": "~5.5.0"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -5,7 +5,8 @@ replace_index: {
|
|||||||
properties: true,
|
properties: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(arguments && arguments[0]);
|
var arguments = [];
|
||||||
|
console.log(arguments[0]);
|
||||||
(function() {
|
(function() {
|
||||||
console.log(arguments[1], arguments["1"], arguments["foo"]);
|
console.log(arguments[1], arguments["1"], arguments["foo"]);
|
||||||
})("bar", 42);
|
})("bar", 42);
|
||||||
@@ -21,7 +22,8 @@ replace_index: {
|
|||||||
})("bar", 42);
|
})("bar", 42);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
console.log(arguments && arguments[0]);
|
var arguments = [];
|
||||||
|
console.log(arguments[0]);
|
||||||
(function() {
|
(function() {
|
||||||
console.log(arguments[1], arguments[1], arguments.foo);
|
console.log(arguments[1], arguments[1], arguments.foo);
|
||||||
})("bar", 42);
|
})("bar", 42);
|
||||||
@@ -45,6 +47,37 @@ replace_index: {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
replace_index_strict: {
|
||||||
|
options = {
|
||||||
|
arguments: true,
|
||||||
|
evaluate: true,
|
||||||
|
properties: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
(function() {
|
||||||
|
console.log(arguments[1], arguments["1"], arguments["foo"]);
|
||||||
|
})("bar", 42);
|
||||||
|
(function(a, b) {
|
||||||
|
console.log(arguments[1], arguments["1"], arguments["foo"]);
|
||||||
|
})("bar", 42);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
(function() {
|
||||||
|
console.log(arguments[1], arguments[1], arguments.foo);
|
||||||
|
})("bar", 42);
|
||||||
|
(function(a, b) {
|
||||||
|
console.log(b, b, arguments.foo);
|
||||||
|
})("bar", 42);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"42 42 undefined",
|
||||||
|
"42 42 undefined",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
replace_index_keep_fargs: {
|
replace_index_keep_fargs: {
|
||||||
options = {
|
options = {
|
||||||
arguments: true,
|
arguments: true,
|
||||||
@@ -53,7 +86,8 @@ replace_index_keep_fargs: {
|
|||||||
properties: true,
|
properties: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(arguments && arguments[0]);
|
var arguments = [];
|
||||||
|
console.log(arguments[0]);
|
||||||
(function() {
|
(function() {
|
||||||
console.log(arguments[1], arguments["1"], arguments["foo"]);
|
console.log(arguments[1], arguments["1"], arguments["foo"]);
|
||||||
})("bar", 42);
|
})("bar", 42);
|
||||||
@@ -69,7 +103,8 @@ replace_index_keep_fargs: {
|
|||||||
})("bar", 42);
|
})("bar", 42);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
console.log(arguments && arguments[0]);
|
var arguments = [];
|
||||||
|
console.log(arguments[0]);
|
||||||
(function(argument_0, argument_1) {
|
(function(argument_0, argument_1) {
|
||||||
console.log(argument_1, argument_1, arguments.foo);
|
console.log(argument_1, argument_1, arguments.foo);
|
||||||
})("bar", 42);
|
})("bar", 42);
|
||||||
@@ -93,6 +128,38 @@ replace_index_keep_fargs: {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
replace_index_keep_fargs_strict: {
|
||||||
|
options = {
|
||||||
|
arguments: true,
|
||||||
|
evaluate: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
properties: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
(function() {
|
||||||
|
console.log(arguments[1], arguments["1"], arguments["foo"]);
|
||||||
|
})("bar", 42);
|
||||||
|
(function(a, b) {
|
||||||
|
console.log(arguments[1], arguments["1"], arguments["foo"]);
|
||||||
|
})("bar", 42);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
(function(argument_0, argument_1) {
|
||||||
|
console.log(argument_1, argument_1, arguments.foo);
|
||||||
|
})("bar", 42);
|
||||||
|
(function(a, b) {
|
||||||
|
console.log(b, b, arguments.foo);
|
||||||
|
})("bar", 42);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"42 42 undefined",
|
||||||
|
"42 42 undefined",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
modified: {
|
modified: {
|
||||||
options = {
|
options = {
|
||||||
arguments: true,
|
arguments: true,
|
||||||
@@ -101,8 +168,10 @@ modified: {
|
|||||||
(function(a, b) {
|
(function(a, b) {
|
||||||
var c = arguments[0];
|
var c = arguments[0];
|
||||||
var d = arguments[1];
|
var d = arguments[1];
|
||||||
a = "foo";
|
var a = "foo";
|
||||||
b++;
|
b++;
|
||||||
|
arguments[0] = "moo";
|
||||||
|
arguments[1] *= 2;
|
||||||
console.log(a, b, c, d, arguments[0], arguments[1]);
|
console.log(a, b, c, d, arguments[0], arguments[1]);
|
||||||
})("bar", 42);
|
})("bar", 42);
|
||||||
}
|
}
|
||||||
@@ -110,10 +179,61 @@ modified: {
|
|||||||
(function(a, b) {
|
(function(a, b) {
|
||||||
var c = a;
|
var c = a;
|
||||||
var d = b;
|
var d = b;
|
||||||
a = "foo";
|
var a = "foo";
|
||||||
b++;
|
b++;
|
||||||
|
a = "moo";
|
||||||
|
b *= 2;
|
||||||
console.log(a, b, c, d, a, b);
|
console.log(a, b, c, d, a, b);
|
||||||
})("bar", 42);
|
})("bar", 42);
|
||||||
}
|
}
|
||||||
expect_stdout: "foo 43 bar 42 foo 43"
|
expect_stdout: "moo 86 bar 42 moo 86"
|
||||||
|
}
|
||||||
|
|
||||||
|
modified_strict: {
|
||||||
|
options = {
|
||||||
|
arguments: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
(function(a, b) {
|
||||||
|
var c = arguments[0];
|
||||||
|
var d = arguments[1];
|
||||||
|
var a = "foo";
|
||||||
|
b++;
|
||||||
|
arguments[0] = "moo";
|
||||||
|
arguments[1] *= 2;
|
||||||
|
console.log(a, b, c, d, arguments[0], arguments[1]);
|
||||||
|
})("bar", 42);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
(function(a, b) {
|
||||||
|
var c = arguments[0];
|
||||||
|
var d = arguments[1];
|
||||||
|
var a = "foo";
|
||||||
|
b++;
|
||||||
|
arguments[0] = "moo";
|
||||||
|
arguments[1] *= 2;
|
||||||
|
console.log(a, b, c, d, arguments[0], arguments[1]);
|
||||||
|
})("bar", 42);
|
||||||
|
}
|
||||||
|
expect_stdout: "foo 43 bar 42 moo 84"
|
||||||
|
}
|
||||||
|
|
||||||
|
duplicate_argname: {
|
||||||
|
options = {
|
||||||
|
arguments: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a, b, a) {
|
||||||
|
console.log(a, b, arguments[0], arguments[1], arguments[2]);
|
||||||
|
})("foo", 42, "bar");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(a, b, a) {
|
||||||
|
console.log(a, b, arguments[0], b, a);
|
||||||
|
})("foo", 42, "bar");
|
||||||
|
}
|
||||||
|
expect_stdout: "bar 42 foo 42 bar"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,9 +15,9 @@ holes_and_undefined: {
|
|||||||
|
|
||||||
constant_join: {
|
constant_join: {
|
||||||
options = {
|
options = {
|
||||||
unsafe : true,
|
evaluate: true,
|
||||||
evaluate : true
|
unsafe: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
var a = [ "foo", "bar", "baz" ].join("");
|
var a = [ "foo", "bar", "baz" ].join("");
|
||||||
var a1 = [ "foo", "bar", "baz" ].join();
|
var a1 = [ "foo", "bar", "baz" ].join();
|
||||||
@@ -64,9 +64,9 @@ constant_join: {
|
|||||||
|
|
||||||
constant_join_2: {
|
constant_join_2: {
|
||||||
options = {
|
options = {
|
||||||
unsafe : true,
|
evaluate: true,
|
||||||
evaluate : true
|
unsafe: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
var a = [ "foo", "bar", boo(), "baz", "x", "y" ].join("");
|
var a = [ "foo", "bar", boo(), "baz", "x", "y" ].join("");
|
||||||
var b = [ "foo", "bar", boo(), "baz", "x", "y" ].join("-");
|
var b = [ "foo", "bar", boo(), "baz", "x", "y" ].join("-");
|
||||||
@@ -93,9 +93,9 @@ constant_join_2: {
|
|||||||
|
|
||||||
constant_join_3: {
|
constant_join_3: {
|
||||||
options = {
|
options = {
|
||||||
unsafe: true,
|
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
};
|
unsafe: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
var a = [ null ].join();
|
var a = [ null ].join();
|
||||||
var b = [ , ].join();
|
var b = [ , ].join();
|
||||||
@@ -133,7 +133,7 @@ for_loop: {
|
|||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unsafe: true,
|
unsafe: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
function f0() {
|
function f0() {
|
||||||
var a = [1, 2, 3];
|
var a = [1, 2, 3];
|
||||||
|
|||||||
@@ -1,24 +1,24 @@
|
|||||||
asm_mixed: {
|
asm_mixed: {
|
||||||
options = {
|
options = {
|
||||||
sequences : true,
|
booleans: true,
|
||||||
properties : true,
|
comparisons: true,
|
||||||
dead_code : true,
|
conditionals: true,
|
||||||
drop_debugger : true,
|
dead_code: true,
|
||||||
conditionals : true,
|
drop_debugger: true,
|
||||||
comparisons : true,
|
evaluate: true,
|
||||||
evaluate : true,
|
hoist_funs: true,
|
||||||
booleans : true,
|
hoist_vars: true,
|
||||||
loops : true,
|
if_return: true,
|
||||||
unused : true,
|
join_vars: true,
|
||||||
hoist_funs : true,
|
keep_fargs: true,
|
||||||
keep_fargs : true,
|
keep_fnames: false,
|
||||||
keep_fnames : false,
|
loops: true,
|
||||||
hoist_vars : true,
|
negate_iife: true,
|
||||||
if_return : true,
|
properties: true,
|
||||||
join_vars : true,
|
sequences: true,
|
||||||
side_effects : true,
|
side_effects: true,
|
||||||
negate_iife : true
|
unused: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
// adapted from http://asmjs.org/spec/latest/
|
// adapted from http://asmjs.org/spec/latest/
|
||||||
function asm_GeometricMean(stdlib, foreign, buffer) {
|
function asm_GeometricMean(stdlib, foreign, buffer) {
|
||||||
|
|||||||
@@ -1,9 +1,22 @@
|
|||||||
collapse_vars_side_effects_1: {
|
collapse_vars_side_effects_1: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
booleans: true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
collapse_vars: true,
|
||||||
keep_fargs:true, if_return:true, join_vars:true, side_effects:true,
|
comparisons: true,
|
||||||
reduce_funcs: true, reduce_vars:true
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
properties: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f1() {
|
function f1() {
|
||||||
@@ -76,9 +89,21 @@ collapse_vars_side_effects_1: {
|
|||||||
|
|
||||||
collapse_vars_side_effects_2: {
|
collapse_vars_side_effects_2: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
booleans: true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
collapse_vars: true,
|
||||||
keep_fargs:true, if_return:true, join_vars:true, side_effects:true
|
comparisons: true,
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
properties: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function fn(x) { return console.log(x), x; }
|
function fn(x) { return console.log(x), x; }
|
||||||
@@ -144,42 +169,56 @@ collapse_vars_side_effects_2: {
|
|||||||
|
|
||||||
collapse_vars_issue_721: {
|
collapse_vars_issue_721: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
booleans: true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
collapse_vars: true,
|
||||||
keep_fargs:true, if_return:true, join_vars:true, side_effects:true,
|
comparisons: true,
|
||||||
reduce_funcs: true, reduce_vars:true, passes:2
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
passes: 2,
|
||||||
|
properties: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
define(["require", "exports", 'handlebars'], function (require, exports, hb) {
|
define(["require", "exports", 'handlebars'], function(require, exports, hb) {
|
||||||
var win = window;
|
var win = window;
|
||||||
var _hb = win.Handlebars = hb;
|
var _hb = win.Handlebars = hb;
|
||||||
return _hb;
|
return _hb;
|
||||||
});
|
});
|
||||||
def(function (hb) {
|
def(function(hb) {
|
||||||
var win = window;
|
var win = window;
|
||||||
var prop = 'Handlebars';
|
var prop = 'Handlebars';
|
||||||
var _hb = win[prop] = hb;
|
var _hb = win[prop] = hb;
|
||||||
return _hb;
|
return _hb;
|
||||||
});
|
});
|
||||||
def(function (hb) {
|
def(function(hb) {
|
||||||
var prop = 'Handlebars';
|
var prop = 'Handlebars';
|
||||||
var win = window;
|
var win = window;
|
||||||
var _hb = win[prop] = hb;
|
var _hb = win[prop] = hb;
|
||||||
return _hb;
|
return _hb;
|
||||||
});
|
});
|
||||||
def(function (hb) {
|
def(function(hb) {
|
||||||
var prop = 'Handlebars';
|
var prop = 'Handlebars';
|
||||||
var win = g();
|
var win = g();
|
||||||
var _hb = win[prop] = hb;
|
var _hb = win[prop] = hb;
|
||||||
return _hb;
|
return _hb;
|
||||||
});
|
});
|
||||||
def(function (hb) {
|
def(function(hb) {
|
||||||
var prop = g1();
|
var prop = g1();
|
||||||
var win = g2();
|
var win = g2();
|
||||||
var _hb = win[prop] = hb;
|
var _hb = win[prop] = hb;
|
||||||
return _hb;
|
return _hb;
|
||||||
});
|
});
|
||||||
def(function (hb) {
|
def(function(hb) {
|
||||||
var win = g2();
|
var win = g2();
|
||||||
var prop = g1();
|
var prop = g1();
|
||||||
var _hb = win[prop] = hb;
|
var _hb = win[prop] = hb;
|
||||||
@@ -196,14 +235,14 @@ collapse_vars_issue_721: {
|
|||||||
def(function(hb) {
|
def(function(hb) {
|
||||||
return window.Handlebars = hb;
|
return window.Handlebars = hb;
|
||||||
}),
|
}),
|
||||||
def(function (hb) {
|
def(function(hb) {
|
||||||
return g().Handlebars = hb;
|
return g().Handlebars = hb;
|
||||||
}),
|
}),
|
||||||
def(function (hb) {
|
def(function(hb) {
|
||||||
var prop = g1();
|
var prop = g1();
|
||||||
return g2()[prop] = hb;
|
return g2()[prop] = hb;
|
||||||
}),
|
}),
|
||||||
def(function (hb) {
|
def(function(hb) {
|
||||||
return g2()[g1()] = hb;
|
return g2()[g1()] = hb;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -211,10 +250,23 @@ collapse_vars_issue_721: {
|
|||||||
|
|
||||||
collapse_vars_properties: {
|
collapse_vars_properties: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
booleans: true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
collapse_vars: true,
|
||||||
keep_fargs:true, if_return:true, join_vars:true, side_effects:true,
|
comparisons: true,
|
||||||
reduce_funcs: true, reduce_vars:true
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
properties: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f1(obj) {
|
function f1(obj) {
|
||||||
@@ -239,10 +291,23 @@ collapse_vars_properties: {
|
|||||||
|
|
||||||
collapse_vars_if: {
|
collapse_vars_if: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
booleans: true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
collapse_vars: true,
|
||||||
keep_fargs:true, if_return:true, join_vars:true, side_effects:true,
|
comparisons: true,
|
||||||
reduce_funcs: true, reduce_vars:true
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
properties: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f1() {
|
function f1() {
|
||||||
@@ -290,10 +355,23 @@ collapse_vars_if: {
|
|||||||
|
|
||||||
collapse_vars_while: {
|
collapse_vars_while: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
booleans: true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:false, unused:true, hoist_funs:true,
|
collapse_vars: true,
|
||||||
keep_fargs:true, if_return:true, join_vars:true, side_effects:true,
|
comparisons: true,
|
||||||
reduce_funcs: true, reduce_vars:true
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: false,
|
||||||
|
properties: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f1(y) {
|
function f1(y) {
|
||||||
@@ -339,10 +417,21 @@ collapse_vars_while: {
|
|||||||
|
|
||||||
collapse_vars_do_while: {
|
collapse_vars_do_while: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
booleans: false,
|
||||||
comparisons:true, evaluate:true, booleans:false, loops:false, unused:"keep_assign",
|
collapse_vars: true,
|
||||||
hoist_funs:true, keep_fargs:true, if_return:true, join_vars:true,
|
comparisons: true,
|
||||||
side_effects:true
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: false,
|
||||||
|
properties: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: "keep_assign",
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f1(y) {
|
function f1(y) {
|
||||||
@@ -415,9 +504,21 @@ collapse_vars_do_while: {
|
|||||||
|
|
||||||
collapse_vars_do_while_drop_assign: {
|
collapse_vars_do_while_drop_assign: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
booleans: false,
|
||||||
comparisons:true, evaluate:true, booleans:false, loops:false, unused:true, hoist_funs:true,
|
collapse_vars: true,
|
||||||
keep_fargs:true, if_return:true, join_vars:true, side_effects:true
|
comparisons: true,
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: false,
|
||||||
|
properties: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f1(y) {
|
function f1(y) {
|
||||||
@@ -490,9 +591,21 @@ collapse_vars_do_while_drop_assign: {
|
|||||||
|
|
||||||
collapse_vars_seq: {
|
collapse_vars_seq: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
booleans: true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
collapse_vars: true,
|
||||||
keep_fargs:true, if_return:true, join_vars:true, side_effects:true
|
comparisons: true,
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
properties: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var f1 = function(x, y) {
|
var f1 = function(x, y) {
|
||||||
@@ -514,9 +627,21 @@ collapse_vars_seq: {
|
|||||||
|
|
||||||
collapse_vars_throw: {
|
collapse_vars_throw: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
booleans: true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
collapse_vars: true,
|
||||||
keep_fargs:true, if_return:true, join_vars:true, side_effects:true
|
comparisons: true,
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
properties: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var f1 = function(x, y) {
|
var f1 = function(x, y) {
|
||||||
@@ -546,9 +671,21 @@ collapse_vars_throw: {
|
|||||||
|
|
||||||
collapse_vars_switch: {
|
collapse_vars_switch: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
booleans: true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
collapse_vars: true,
|
||||||
keep_fargs:true, if_return:true, join_vars:true, side_effects:true
|
comparisons: true,
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
properties: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f1() {
|
function f1() {
|
||||||
@@ -586,9 +723,20 @@ collapse_vars_switch: {
|
|||||||
|
|
||||||
collapse_vars_assignment: {
|
collapse_vars_assignment: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars:true, sequences:true, properties:true, conditionals:true,
|
booleans: true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
collapse_vars: true,
|
||||||
keep_fargs:true, if_return:true, join_vars:true, side_effects:true
|
comparisons: true,
|
||||||
|
conditionals: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
properties: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function log(x) { return console.log(x), x; }
|
function log(x) { return console.log(x), x; }
|
||||||
@@ -659,10 +807,20 @@ collapse_vars_assignment: {
|
|||||||
|
|
||||||
collapse_vars_lvalues: {
|
collapse_vars_lvalues: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars:true, sequences:true, properties:true, conditionals:true,
|
booleans: true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:"keep_assign",
|
collapse_vars: true,
|
||||||
hoist_funs:true, keep_fargs:true, if_return:true, join_vars:true,
|
comparisons: true,
|
||||||
side_effects:true
|
conditionals: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
properties: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: "keep_assign",
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f0(x) { var i = ++x; return x += i; }
|
function f0(x) { var i = ++x; return x += i; }
|
||||||
@@ -692,9 +850,21 @@ collapse_vars_lvalues: {
|
|||||||
|
|
||||||
collapse_vars_lvalues_drop_assign: {
|
collapse_vars_lvalues_drop_assign: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars:true, sequences:true, properties:true, conditionals:true,
|
booleans: true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
collapse_vars: true,
|
||||||
keep_fargs:true, if_return:true, join_vars:true, side_effects:true, passes:3
|
comparisons: true,
|
||||||
|
conditionals: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
passes: 3,
|
||||||
|
properties: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f0(x) { var i = ++x; return x += i; }
|
function f0(x) { var i = ++x; return x += i; }
|
||||||
@@ -724,10 +894,22 @@ collapse_vars_lvalues_drop_assign: {
|
|||||||
|
|
||||||
collapse_vars_misc1: {
|
collapse_vars_misc1: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars:true, sequences:true, properties:true, conditionals:true,
|
booleans: true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
collapse_vars: true,
|
||||||
keep_fargs:true, if_return:true, join_vars:true, side_effects:true,
|
comparisons: true,
|
||||||
reduce_funcs: true, reduce_vars:true
|
conditionals: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
properties: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f0(o, a, h) {
|
function f0(o, a, h) {
|
||||||
@@ -771,10 +953,21 @@ collapse_vars_misc1: {
|
|||||||
|
|
||||||
collapse_vars_self_reference: {
|
collapse_vars_self_reference: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars:true, unused:false,
|
booleans: true,
|
||||||
sequences:true, properties:true, dead_code:true, conditionals:true,
|
collapse_vars: true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, hoist_funs:true,
|
comparisons: true,
|
||||||
keep_fargs:true, if_return:true, join_vars:true, side_effects:true
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
properties: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: false,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
// avoid bug in self-referential declaration.
|
// avoid bug in self-referential declaration.
|
||||||
@@ -802,10 +995,23 @@ collapse_vars_self_reference: {
|
|||||||
|
|
||||||
collapse_vars_repeated: {
|
collapse_vars_repeated: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
booleans: true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
collapse_vars: true,
|
||||||
keep_fargs:true, if_return:true, join_vars:true, side_effects:true,
|
comparisons: true,
|
||||||
reduce_funcs: true, reduce_vars:true
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
properties: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f1() {
|
function f1() {
|
||||||
@@ -845,10 +1051,23 @@ collapse_vars_repeated: {
|
|||||||
|
|
||||||
collapse_vars_closures: {
|
collapse_vars_closures: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
booleans: true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
collapse_vars: true,
|
||||||
keep_fargs:true, if_return:true, join_vars:true, side_effects:true,
|
comparisons: true,
|
||||||
reduce_funcs: true, reduce_vars:true
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
properties: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function constant_vars_can_be_replaced_in_any_scope() {
|
function constant_vars_can_be_replaced_in_any_scope() {
|
||||||
@@ -873,9 +1092,21 @@ collapse_vars_closures: {
|
|||||||
|
|
||||||
collapse_vars_unary: {
|
collapse_vars_unary: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
booleans: true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
collapse_vars: true,
|
||||||
keep_fargs:true, if_return:true, join_vars:true, side_effects:true
|
comparisons: true,
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
properties: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f0(o, p) {
|
function f0(o, p) {
|
||||||
@@ -936,10 +1167,23 @@ collapse_vars_unary: {
|
|||||||
|
|
||||||
collapse_vars_try: {
|
collapse_vars_try: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
booleans: true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
collapse_vars: true,
|
||||||
keep_fargs:true, if_return:true, join_vars:true, side_effects:true,
|
comparisons: true,
|
||||||
reduce_funcs: true, reduce_vars:true
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
properties: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f1() {
|
function f1() {
|
||||||
@@ -992,9 +1236,21 @@ collapse_vars_try: {
|
|||||||
|
|
||||||
collapse_vars_array: {
|
collapse_vars_array: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
booleans: true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
collapse_vars: true,
|
||||||
keep_fargs:true, if_return:true, join_vars:true, side_effects:true
|
comparisons: true,
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
properties: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f1(x, y) {
|
function f1(x, y) {
|
||||||
@@ -1026,9 +1282,21 @@ collapse_vars_array: {
|
|||||||
|
|
||||||
collapse_vars_object: {
|
collapse_vars_object: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
booleans: true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
collapse_vars: true,
|
||||||
keep_fargs:true, if_return:true, join_vars:true, side_effects:true
|
comparisons: true,
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
properties: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f0(x, y) {
|
function f0(x, y) {
|
||||||
@@ -1094,9 +1362,21 @@ collapse_vars_object: {
|
|||||||
|
|
||||||
collapse_vars_eval_and_with: {
|
collapse_vars_eval_and_with: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars:true, sequences:false, properties:true, dead_code:true, conditionals:true,
|
booleans: true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
collapse_vars: true,
|
||||||
keep_fargs:true, if_return:true, join_vars:true, side_effects:true
|
comparisons: true,
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
properties: true,
|
||||||
|
sequences: false,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
// Don't attempt to collapse vars in presence of eval() or with statement.
|
// Don't attempt to collapse vars in presence of eval() or with statement.
|
||||||
@@ -1134,10 +1414,23 @@ collapse_vars_eval_and_with: {
|
|||||||
|
|
||||||
collapse_vars_constants: {
|
collapse_vars_constants: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
booleans: true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
collapse_vars: true,
|
||||||
keep_fargs:true, if_return:true, join_vars:true, side_effects:true,
|
comparisons: true,
|
||||||
reduce_funcs: true, reduce_vars:true
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
properties: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f1(x) {
|
function f1(x) {
|
||||||
@@ -1172,10 +1465,24 @@ collapse_vars_constants: {
|
|||||||
|
|
||||||
collapse_vars_arguments: {
|
collapse_vars_arguments: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
booleans: true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
collapse_vars: true,
|
||||||
keep_fargs:true, if_return:true, join_vars:true, side_effects:true,
|
comparisons: true,
|
||||||
toplevel:true, reduce_funcs: true, reduce_vars:true
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
properties: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var outer = function() {
|
var outer = function() {
|
||||||
@@ -1195,9 +1502,21 @@ collapse_vars_arguments: {
|
|||||||
|
|
||||||
collapse_vars_short_circuit: {
|
collapse_vars_short_circuit: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
booleans: true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
collapse_vars: true,
|
||||||
keep_fargs:true, if_return:true, join_vars:true, side_effects:true
|
comparisons: true,
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
properties: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f0(x) { var a = foo(), b = bar(); return b || x; }
|
function f0(x) { var a = foo(), b = bar(); return b || x; }
|
||||||
@@ -1237,20 +1556,20 @@ collapse_vars_short_circuit: {
|
|||||||
|
|
||||||
collapse_vars_short_circuited_conditions: {
|
collapse_vars_short_circuited_conditions: {
|
||||||
options = {
|
options = {
|
||||||
|
booleans: true,
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
sequences: false,
|
comparisons: false,
|
||||||
dead_code: true,
|
conditionals: false,
|
||||||
conditionals: false,
|
dead_code: true,
|
||||||
comparisons: false,
|
evaluate: true,
|
||||||
evaluate: true,
|
hoist_funs: true,
|
||||||
booleans: true,
|
if_return: false,
|
||||||
loops: true,
|
join_vars: true,
|
||||||
unused: true,
|
keep_fargs: true,
|
||||||
hoist_funs: true,
|
loops: true,
|
||||||
keep_fargs: true,
|
sequences: false,
|
||||||
if_return: false,
|
side_effects: true,
|
||||||
join_vars: true,
|
unused: true,
|
||||||
side_effects: true,
|
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function c1(x) { var a = foo(), b = bar(), c = baz(); return a ? b : c; }
|
function c1(x) { var a = foo(), b = bar(), c = baz(); return a ? b : c; }
|
||||||
@@ -1286,21 +1605,21 @@ collapse_vars_short_circuited_conditions: {
|
|||||||
|
|
||||||
collapse_vars_regexp: {
|
collapse_vars_regexp: {
|
||||||
options = {
|
options = {
|
||||||
booleans: true,
|
booleans: true,
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
if_return: true,
|
hoist_funs: true,
|
||||||
join_vars: true,
|
if_return: true,
|
||||||
hoist_funs: true,
|
join_vars: true,
|
||||||
keep_fargs: true,
|
keep_fargs: true,
|
||||||
loops: false,
|
loops: false,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f1() {
|
function f1() {
|
||||||
@@ -1692,9 +2011,21 @@ iife_2: {
|
|||||||
|
|
||||||
var_defs: {
|
var_defs: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
booleans: true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
collapse_vars: true,
|
||||||
keep_fargs:true, if_return:true, join_vars:true, side_effects:true
|
comparisons: true,
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
properties: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var f1 = function(x, y) {
|
var f1 = function(x, y) {
|
||||||
@@ -2825,8 +3156,8 @@ issue_2364_5: {
|
|||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
pure_getters: true,
|
|
||||||
properties: true,
|
properties: true,
|
||||||
|
pure_getters: true,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -3133,8 +3464,8 @@ issue_2437_1: {
|
|||||||
passes: 2,
|
passes: 2,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
side_effects: true,
|
|
||||||
sequences: true,
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -3150,7 +3481,7 @@ issue_2437_1: {
|
|||||||
return result;
|
return result;
|
||||||
} else {
|
} else {
|
||||||
var req = new XMLHttpRequest();
|
var req = new XMLHttpRequest();
|
||||||
var detectFunc = function () {};
|
var detectFunc = function(){};
|
||||||
req.onreadystatechange = detectFunc;
|
req.onreadystatechange = detectFunc;
|
||||||
var result = req[SYMBOL_FAKE_ONREADYSTATECHANGE_1] === detectFunc;
|
var result = req[SYMBOL_FAKE_ONREADYSTATECHANGE_1] === detectFunc;
|
||||||
req.onreadystatechange = null;
|
req.onreadystatechange = null;
|
||||||
@@ -3166,7 +3497,7 @@ issue_2437_1: {
|
|||||||
return Object.defineProperty(XMLHttpRequest.prototype, "onreadystatechange", xhrDesc || {}),
|
return Object.defineProperty(XMLHttpRequest.prototype, "onreadystatechange", xhrDesc || {}),
|
||||||
result;
|
result;
|
||||||
}
|
}
|
||||||
var req, detectFunc = function() {};
|
var req, detectFunc = function(){};
|
||||||
(req = new XMLHttpRequest()).onreadystatechange = detectFunc;
|
(req = new XMLHttpRequest()).onreadystatechange = detectFunc;
|
||||||
result = req[SYMBOL_FAKE_ONREADYSTATECHANGE_1] === detectFunc;
|
result = req[SYMBOL_FAKE_ONREADYSTATECHANGE_1] === detectFunc;
|
||||||
return req.onreadystatechange = null, result;
|
return req.onreadystatechange = null, result;
|
||||||
@@ -3183,8 +3514,8 @@ issue_2437_2: {
|
|||||||
passes: 2,
|
passes: 2,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
side_effects: true,
|
|
||||||
sequences: true,
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -3200,7 +3531,7 @@ issue_2437_2: {
|
|||||||
return result;
|
return result;
|
||||||
} else {
|
} else {
|
||||||
var req = new XMLHttpRequest();
|
var req = new XMLHttpRequest();
|
||||||
var detectFunc = function () {};
|
var detectFunc = function(){};
|
||||||
req.onreadystatechange = detectFunc;
|
req.onreadystatechange = detectFunc;
|
||||||
var result = req[SYMBOL_FAKE_ONREADYSTATECHANGE_1] === detectFunc;
|
var result = req[SYMBOL_FAKE_ONREADYSTATECHANGE_1] === detectFunc;
|
||||||
req.onreadystatechange = null;
|
req.onreadystatechange = null;
|
||||||
@@ -3417,8 +3748,8 @@ issue_2436_6: {
|
|||||||
pure_getters: "strict",
|
pure_getters: "strict",
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
unused: true,
|
|
||||||
unsafe: true,
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var o = {
|
var o = {
|
||||||
@@ -4513,7 +4844,7 @@ issue_2878: {
|
|||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var c = 0;
|
var c = 0;
|
||||||
(function (a, b) {
|
(function(a, b) {
|
||||||
function f2() {
|
function f2() {
|
||||||
if (a) c++;
|
if (a) c++;
|
||||||
}
|
}
|
||||||
@@ -4526,7 +4857,7 @@ issue_2878: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var c = 0;
|
var c = 0;
|
||||||
(function (a, b) {
|
(function(a, b) {
|
||||||
function f2() {
|
function f2() {
|
||||||
if (a) c++;
|
if (a) c++;
|
||||||
}
|
}
|
||||||
@@ -5399,3 +5730,100 @@ issue_3096: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "ab"
|
expect_stdout: "ab"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_3215_1: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
|
ie8: false,
|
||||||
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function a() {
|
||||||
|
var a = 42;
|
||||||
|
return typeof a;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("number");
|
||||||
|
}
|
||||||
|
expect_stdout: "number"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3215_2: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
|
ie8: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function a() {
|
||||||
|
var a = 42;
|
||||||
|
return typeof a;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function a() {
|
||||||
|
var a = 42;
|
||||||
|
return typeof a;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "number"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3215_3: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
|
ie8: false,
|
||||||
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
var a = 42;
|
||||||
|
(function a() {});
|
||||||
|
return typeof a;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("number");
|
||||||
|
}
|
||||||
|
expect_stdout: "number"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3215_4: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
|
ie8: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
var a = 42;
|
||||||
|
(function a() {});
|
||||||
|
return typeof a;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function() {
|
||||||
|
var a = 42;
|
||||||
|
(function a() {});
|
||||||
|
return typeof a;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "number"
|
||||||
|
}
|
||||||
|
|||||||
@@ -295,3 +295,31 @@ issue_2857_6: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "true"
|
expect_stdout: "true"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
is_boolean_unsafe: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(/foo/.test("bar") === [].isPrototypeOf({}));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(/foo/.test("bar") == [].isPrototypeOf({}));
|
||||||
|
}
|
||||||
|
expect_stdout: "true"
|
||||||
|
}
|
||||||
|
|
||||||
|
is_number_unsafe: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(Math.acos(42) !== "foo".charCodeAt(4));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(Math.acos(42) != "foo".charCodeAt(4));
|
||||||
|
}
|
||||||
|
expect_stdout: "true"
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
concat_1: {
|
concat_1: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true
|
evaluate: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
var a = "foo" + "bar" + x() + "moo" + "foo" + y() + "x" + "y" + "z" + q();
|
var a = "foo" + "bar" + x() + "moo" + "foo" + y() + "x" + "y" + "z" + q();
|
||||||
var b = "foo" + 1 + x() + 2 + "boo";
|
var b = "foo" + 1 + x() + 2 + "boo";
|
||||||
@@ -26,7 +26,7 @@ concat_1: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
concat_2: {
|
concat_2: {
|
||||||
options = {};
|
options = {}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
1 + (2 + 3),
|
1 + (2 + 3),
|
||||||
@@ -55,7 +55,7 @@ concat_2: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
concat_3: {
|
concat_3: {
|
||||||
options = {};
|
options = {}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
1 + 2 + (3 + 4 + 5),
|
1 + 2 + (3 + 4 + 5),
|
||||||
@@ -84,7 +84,7 @@ concat_3: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
concat_4: {
|
concat_4: {
|
||||||
options = {};
|
options = {}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
1 + "2" + (3 + 4 + 5),
|
1 + "2" + (3 + 4 + 5),
|
||||||
@@ -113,7 +113,7 @@ concat_4: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
concat_5: {
|
concat_5: {
|
||||||
options = {};
|
options = {}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
"1" + 2 + (3 + 4 + 5),
|
"1" + 2 + (3 + 4 + 5),
|
||||||
@@ -142,7 +142,7 @@ concat_5: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
concat_6: {
|
concat_6: {
|
||||||
options = {};
|
options = {}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
"1" + "2" + (3 + 4 + 5),
|
"1" + "2" + (3 + 4 + 5),
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
ifs_1: {
|
ifs_1: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true
|
conditionals: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
if (foo) bar();
|
if (foo) bar();
|
||||||
if (!foo); else bar();
|
if (!foo); else bar();
|
||||||
@@ -18,8 +18,8 @@ ifs_1: {
|
|||||||
|
|
||||||
ifs_2: {
|
ifs_2: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true
|
conditionals: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
if (foo) {
|
if (foo) {
|
||||||
x();
|
x();
|
||||||
@@ -47,12 +47,12 @@ ifs_2: {
|
|||||||
|
|
||||||
ifs_3_should_warn: {
|
ifs_3_should_warn: {
|
||||||
options = {
|
options = {
|
||||||
conditionals : true,
|
booleans: true,
|
||||||
dead_code : true,
|
conditionals: true,
|
||||||
evaluate : true,
|
dead_code: true,
|
||||||
booleans : true,
|
evaluate: true,
|
||||||
side_effects : true,
|
side_effects: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
var x, y;
|
var x, y;
|
||||||
if (x && !(x + "1") && y) { // 1
|
if (x && !(x + "1") && y) { // 1
|
||||||
@@ -78,8 +78,8 @@ ifs_3_should_warn: {
|
|||||||
|
|
||||||
ifs_4: {
|
ifs_4: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true
|
conditionals: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
if (foo && bar) {
|
if (foo && bar) {
|
||||||
x(foo)[10].bar.baz = something();
|
x(foo)[10].bar.baz = something();
|
||||||
@@ -95,10 +95,10 @@ ifs_4: {
|
|||||||
|
|
||||||
ifs_5: {
|
ifs_5: {
|
||||||
options = {
|
options = {
|
||||||
if_return: true,
|
|
||||||
conditionals: true,
|
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
};
|
conditionals: true,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
function f() {
|
function f() {
|
||||||
if (foo) return;
|
if (foo) return;
|
||||||
@@ -132,9 +132,9 @@ ifs_5: {
|
|||||||
|
|
||||||
ifs_6: {
|
ifs_6: {
|
||||||
options = {
|
options = {
|
||||||
|
comparisons: true,
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
comparisons: true
|
}
|
||||||
};
|
|
||||||
input: {
|
input: {
|
||||||
var x, y;
|
var x, y;
|
||||||
if (!foo && !bar && !baz && !boo) {
|
if (!foo && !bar && !baz && !boo) {
|
||||||
@@ -163,8 +163,8 @@ ifs_6: {
|
|||||||
|
|
||||||
cond_1: {
|
cond_1: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true
|
conditionals: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
function foo(do_something, some_condition) {
|
function foo(do_something, some_condition) {
|
||||||
if (some_condition) {
|
if (some_condition) {
|
||||||
@@ -189,8 +189,8 @@ cond_1: {
|
|||||||
|
|
||||||
cond_2: {
|
cond_2: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true
|
conditionals: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
function foo(x, FooBar, some_condition) {
|
function foo(x, FooBar, some_condition) {
|
||||||
if (some_condition) {
|
if (some_condition) {
|
||||||
@@ -209,8 +209,8 @@ cond_2: {
|
|||||||
|
|
||||||
cond_3: {
|
cond_3: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true
|
conditionals: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
var FooBar;
|
var FooBar;
|
||||||
if (some_condition()) {
|
if (some_condition()) {
|
||||||
@@ -227,8 +227,8 @@ cond_3: {
|
|||||||
|
|
||||||
cond_4: {
|
cond_4: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true
|
conditionals: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
var do_something;
|
var do_something;
|
||||||
if (some_condition()) {
|
if (some_condition()) {
|
||||||
@@ -251,8 +251,8 @@ cond_4: {
|
|||||||
|
|
||||||
cond_5: {
|
cond_5: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true
|
conditionals: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
if (some_condition()) {
|
if (some_condition()) {
|
||||||
if (some_other_condition()) {
|
if (some_other_condition()) {
|
||||||
@@ -279,9 +279,9 @@ cond_5: {
|
|||||||
cond_7: {
|
cond_7: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
var x, y, z, a, b;
|
var x, y, z, a, b;
|
||||||
// compress these
|
// compress these
|
||||||
@@ -342,8 +342,8 @@ cond_7: {
|
|||||||
cond_7_1: {
|
cond_7_1: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
evaluate : true
|
evaluate: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
var x;
|
var x;
|
||||||
// access to global should be assumed to have side effects
|
// access to global should be assumed to have side effects
|
||||||
@@ -361,10 +361,10 @@ cond_7_1: {
|
|||||||
|
|
||||||
cond_8: {
|
cond_8: {
|
||||||
options = {
|
options = {
|
||||||
|
booleans: false,
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
booleans : false
|
}
|
||||||
};
|
|
||||||
input: {
|
input: {
|
||||||
var a;
|
var a;
|
||||||
// compress these
|
// compress these
|
||||||
@@ -445,10 +445,10 @@ cond_8: {
|
|||||||
|
|
||||||
cond_8b: {
|
cond_8b: {
|
||||||
options = {
|
options = {
|
||||||
|
booleans: true,
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
booleans : true
|
}
|
||||||
};
|
|
||||||
input: {
|
input: {
|
||||||
var a;
|
var a;
|
||||||
// compress these
|
// compress these
|
||||||
@@ -528,10 +528,10 @@ cond_8b: {
|
|||||||
|
|
||||||
cond_8c: {
|
cond_8c: {
|
||||||
options = {
|
options = {
|
||||||
|
booleans: false,
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
evaluate : false,
|
evaluate: false,
|
||||||
booleans : false
|
}
|
||||||
};
|
|
||||||
input: {
|
input: {
|
||||||
var a;
|
var a;
|
||||||
// compress these
|
// compress these
|
||||||
@@ -647,9 +647,21 @@ cond_9: {
|
|||||||
|
|
||||||
ternary_boolean_consequent: {
|
ternary_boolean_consequent: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
booleans: true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
collapse_vars: true,
|
||||||
keep_fargs:true, if_return:true, join_vars:true, side_effects:true
|
comparisons: true,
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
properties: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f1() { return a == b ? true : x; }
|
function f1() { return a == b ? true : x; }
|
||||||
@@ -675,9 +687,21 @@ ternary_boolean_consequent: {
|
|||||||
|
|
||||||
ternary_boolean_alternative: {
|
ternary_boolean_alternative: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
booleans: true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
collapse_vars: true,
|
||||||
keep_fargs:true, if_return:true, join_vars:true, side_effects:true
|
comparisons: true,
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
properties: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f1() { return a == b ? x : true; }
|
function f1() { return a == b ? x : true; }
|
||||||
@@ -778,11 +802,11 @@ trivial_boolean_ternary_expressions : {
|
|||||||
|
|
||||||
issue_1154: {
|
issue_1154: {
|
||||||
options = {
|
options = {
|
||||||
|
booleans: true,
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
booleans : true,
|
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
function f1(x) { return x ? -1 : -1; }
|
function f1(x) { return x ? -1 : -1; }
|
||||||
function f2(x) { return x ? +2 : +2; }
|
function f2(x) { return x ? +2 : +2; }
|
||||||
@@ -818,7 +842,7 @@ issue_1154: {
|
|||||||
no_evaluate: {
|
no_evaluate: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
evaluate : false,
|
evaluate: false,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
dead_code_1: {
|
dead_code_1: {
|
||||||
options = {
|
options = {
|
||||||
dead_code: true
|
dead_code: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
function f() {
|
function f() {
|
||||||
a();
|
a();
|
||||||
@@ -25,8 +25,8 @@ dead_code_1: {
|
|||||||
|
|
||||||
dead_code_2_should_warn: {
|
dead_code_2_should_warn: {
|
||||||
options = {
|
options = {
|
||||||
dead_code: true
|
dead_code: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
function f() {
|
function f() {
|
||||||
g();
|
g();
|
||||||
@@ -64,13 +64,13 @@ dead_code_2_should_warn: {
|
|||||||
|
|
||||||
dead_code_constant_boolean_should_warn_more: {
|
dead_code_constant_boolean_should_warn_more: {
|
||||||
options = {
|
options = {
|
||||||
dead_code : true,
|
booleans: true,
|
||||||
loops : true,
|
conditionals: true,
|
||||||
booleans : true,
|
dead_code: true,
|
||||||
conditionals : true,
|
evaluate: true,
|
||||||
evaluate : true,
|
loops: true,
|
||||||
side_effects : true,
|
side_effects: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
while (!((foo && bar) || (x + "0"))) {
|
while (!((foo && bar) || (x + "0"))) {
|
||||||
console.log("unreachable");
|
console.log("unreachable");
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
keep_debugger: {
|
keep_debugger: {
|
||||||
options = {
|
options = {
|
||||||
drop_debugger: false
|
drop_debugger: false,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
debugger;
|
debugger;
|
||||||
}
|
}
|
||||||
@@ -12,8 +12,8 @@ keep_debugger: {
|
|||||||
|
|
||||||
drop_debugger: {
|
drop_debugger: {
|
||||||
options = {
|
options = {
|
||||||
drop_debugger: true
|
drop_debugger: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
debugger;
|
debugger;
|
||||||
if (foo) debugger;
|
if (foo) debugger;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
drop_console_1: {
|
drop_console_1: {
|
||||||
options = {};
|
options = {}
|
||||||
input: {
|
input: {
|
||||||
console.log('foo');
|
console.log('foo');
|
||||||
console.log.apply(console, arguments);
|
console.log.apply(console, arguments);
|
||||||
@@ -11,7 +11,9 @@ drop_console_1: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
drop_console_2: {
|
drop_console_2: {
|
||||||
options = { drop_console: true };
|
options = {
|
||||||
|
drop_console: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log('foo');
|
console.log('foo');
|
||||||
console.log.apply(console, arguments);
|
console.log.apply(console, arguments);
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
unused_funarg_1: {
|
unused_funarg_1: {
|
||||||
options = { unused: true, keep_fargs: false };
|
options = {
|
||||||
|
keep_fargs: false,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(a, b, c, d, e) {
|
function f(a, b, c, d, e) {
|
||||||
return a + b;
|
return a + b;
|
||||||
@@ -13,7 +16,10 @@ unused_funarg_1: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
unused_funarg_2: {
|
unused_funarg_2: {
|
||||||
options = { unused: true, keep_fargs: false };
|
options = {
|
||||||
|
keep_fargs: false,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(a, b, c, d, e) {
|
function f(a, b, c, d, e) {
|
||||||
return a + c;
|
return a + c;
|
||||||
@@ -27,7 +33,9 @@ unused_funarg_2: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
unused_nested_function: {
|
unused_nested_function: {
|
||||||
options = { unused: true };
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(x, y) {
|
function f(x, y) {
|
||||||
function g() {
|
function g() {
|
||||||
@@ -44,7 +52,9 @@ unused_nested_function: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
unused_circular_references_1: {
|
unused_circular_references_1: {
|
||||||
options = { unused: true };
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(x, y) {
|
function f(x, y) {
|
||||||
// circular reference
|
// circular reference
|
||||||
@@ -65,7 +75,9 @@ unused_circular_references_1: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
unused_circular_references_2: {
|
unused_circular_references_2: {
|
||||||
options = { unused: true };
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(x, y) {
|
function f(x, y) {
|
||||||
var foo = 1, bar = baz, baz = foo + bar, qwe = moo();
|
var foo = 1, bar = baz, baz = foo + bar, qwe = moo();
|
||||||
@@ -81,7 +93,9 @@ unused_circular_references_2: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
unused_circular_references_3: {
|
unused_circular_references_3: {
|
||||||
options = { unused: true };
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(x, y) {
|
function f(x, y) {
|
||||||
var g = function() { return h() };
|
var g = function() { return h() };
|
||||||
@@ -97,7 +111,9 @@ unused_circular_references_3: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
unused_keep_setter_arg: {
|
unused_keep_setter_arg: {
|
||||||
options = { unused: true };
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
var x = {
|
var x = {
|
||||||
_foo: null,
|
_foo: null,
|
||||||
@@ -121,7 +137,9 @@ unused_keep_setter_arg: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
unused_var_in_catch: {
|
unused_var_in_catch: {
|
||||||
options = { unused: true };
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
function foo() {
|
function foo() {
|
||||||
try {
|
try {
|
||||||
@@ -141,7 +159,9 @@ unused_var_in_catch: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
used_var_in_catch: {
|
used_var_in_catch: {
|
||||||
options = { unused: true };
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
function foo() {
|
function foo() {
|
||||||
try {
|
try {
|
||||||
@@ -165,7 +185,11 @@ used_var_in_catch: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
keep_fnames: {
|
keep_fnames: {
|
||||||
options = { unused: true, keep_fnames: true, unsafe: true };
|
options = {
|
||||||
|
keep_fnames: true,
|
||||||
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
function foo() {
|
function foo() {
|
||||||
return function bar(baz) {};
|
return function bar(baz) {};
|
||||||
@@ -367,7 +391,7 @@ drop_toplevel_vars_fargs: {
|
|||||||
drop_toplevel_all: {
|
drop_toplevel_all: {
|
||||||
options = {
|
options = {
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
unused: true
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var a, b = 1, c = g;
|
var a, b = 1, c = g;
|
||||||
@@ -418,7 +442,11 @@ drop_toplevel_retain: {
|
|||||||
|
|
||||||
drop_toplevel_retain_array: {
|
drop_toplevel_retain_array: {
|
||||||
options = {
|
options = {
|
||||||
top_retain: [ "f", "a", "o" ],
|
top_retain: [
|
||||||
|
"f",
|
||||||
|
"a",
|
||||||
|
"o"
|
||||||
|
],
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -476,8 +504,8 @@ drop_toplevel_retain_regex: {
|
|||||||
|
|
||||||
drop_toplevel_all_retain: {
|
drop_toplevel_all_retain: {
|
||||||
options = {
|
options = {
|
||||||
toplevel: true,
|
|
||||||
top_retain: "f,a,o",
|
top_retain: "f,a,o",
|
||||||
|
toplevel: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -506,8 +534,8 @@ drop_toplevel_all_retain: {
|
|||||||
|
|
||||||
drop_toplevel_funcs_retain: {
|
drop_toplevel_funcs_retain: {
|
||||||
options = {
|
options = {
|
||||||
toplevel: "funcs",
|
|
||||||
top_retain: "f,a,o",
|
top_retain: "f,a,o",
|
||||||
|
toplevel: "funcs",
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -537,8 +565,8 @@ drop_toplevel_funcs_retain: {
|
|||||||
|
|
||||||
drop_toplevel_vars_retain: {
|
drop_toplevel_vars_retain: {
|
||||||
options = {
|
options = {
|
||||||
toplevel: "vars",
|
|
||||||
top_retain: "f,a,o",
|
top_retain: "f,a,o",
|
||||||
|
toplevel: "vars",
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -1377,9 +1405,9 @@ issue_2516_1: {
|
|||||||
issue_2516_2: {
|
issue_2516_2: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
|
passes: 2,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
passes: 2,
|
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -1814,3 +1842,143 @@ issue_2995: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_3146_1: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(f) {
|
||||||
|
f("g()");
|
||||||
|
})(function(a) {
|
||||||
|
eval(a);
|
||||||
|
function g(b) {
|
||||||
|
if (!b) b = "PASS";
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(f) {
|
||||||
|
f("g()");
|
||||||
|
})(function(a) {
|
||||||
|
eval(a);
|
||||||
|
function g(b) {
|
||||||
|
if (!b) b = "PASS";
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3146_2: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(f) {
|
||||||
|
f("g()");
|
||||||
|
})(function(a) {
|
||||||
|
eval(a);
|
||||||
|
function g(b) {
|
||||||
|
if (!b) b = "PASS";
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(f) {
|
||||||
|
f("g()");
|
||||||
|
})(function(a) {
|
||||||
|
eval(a);
|
||||||
|
function g(b) {
|
||||||
|
if (!b) b = "PASS";
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3146_3: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var g = "PASS";
|
||||||
|
(function(f) {
|
||||||
|
var g = "FAIL";
|
||||||
|
f("console.log(g)", g[g]);
|
||||||
|
})(function(a) {
|
||||||
|
eval(a);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var g = "PASS";
|
||||||
|
(function(f) {
|
||||||
|
var g = "FAIL";
|
||||||
|
f("console.log(g)", g[g]);
|
||||||
|
})(function(a) {
|
||||||
|
eval(a);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3146_4: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var g = "PASS";
|
||||||
|
(function(f) {
|
||||||
|
var g = "FAIL";
|
||||||
|
f("console.log(g)", g[g]);
|
||||||
|
})(function(a) {
|
||||||
|
eval(a);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var g = "PASS";
|
||||||
|
(function(f) {
|
||||||
|
var g = "FAIL";
|
||||||
|
f("console.log(g)", g[g]);
|
||||||
|
})(function(a) {
|
||||||
|
eval(a);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3192: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a) {
|
||||||
|
console.log(a = "foo", arguments[0]);
|
||||||
|
})("bar");
|
||||||
|
(function(a) {
|
||||||
|
"use strict";
|
||||||
|
console.log(a = "foo", arguments[0]);
|
||||||
|
})("bar");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(a) {
|
||||||
|
console.log(a = "foo", arguments[0]);
|
||||||
|
})("bar");
|
||||||
|
(function(a) {
|
||||||
|
"use strict";
|
||||||
|
console.log("foo", arguments[0]);
|
||||||
|
})("bar");
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo foo",
|
||||||
|
"foo bar",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|||||||
@@ -186,7 +186,9 @@ unary_prefix: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
negative_zero: {
|
negative_zero: {
|
||||||
options = { evaluate: true }
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
-"",
|
-"",
|
||||||
@@ -207,7 +209,9 @@ negative_zero: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
positive_zero: {
|
positive_zero: {
|
||||||
options = { evaluate: true }
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
+"",
|
+"",
|
||||||
@@ -229,8 +233,8 @@ positive_zero: {
|
|||||||
|
|
||||||
unsafe_constant: {
|
unsafe_constant: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
unsafe : true
|
unsafe: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
@@ -421,8 +425,8 @@ prop_function: {
|
|||||||
|
|
||||||
unsafe_integer_key: {
|
unsafe_integer_key: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
unsafe : true
|
unsafe: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
@@ -449,8 +453,8 @@ unsafe_integer_key: {
|
|||||||
|
|
||||||
unsafe_integer_key_complex: {
|
unsafe_integer_key_complex: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
unsafe : true
|
unsafe: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
@@ -477,8 +481,8 @@ unsafe_integer_key_complex: {
|
|||||||
|
|
||||||
unsafe_float_key: {
|
unsafe_float_key: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
unsafe : true
|
unsafe: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
@@ -505,8 +509,8 @@ unsafe_float_key: {
|
|||||||
|
|
||||||
unsafe_float_key_complex: {
|
unsafe_float_key_complex: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
unsafe : true
|
unsafe: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
@@ -533,8 +537,8 @@ unsafe_float_key_complex: {
|
|||||||
|
|
||||||
unsafe_array: {
|
unsafe_array: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
unsafe : true
|
unsafe: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
@@ -569,8 +573,8 @@ unsafe_array: {
|
|||||||
|
|
||||||
unsafe_string: {
|
unsafe_string: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
unsafe : true
|
unsafe: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
@@ -597,8 +601,8 @@ unsafe_string: {
|
|||||||
|
|
||||||
unsafe_array_bad_index: {
|
unsafe_array_bad_index: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
unsafe : true
|
unsafe: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
@@ -619,8 +623,8 @@ unsafe_array_bad_index: {
|
|||||||
|
|
||||||
unsafe_string_bad_index: {
|
unsafe_string_bad_index: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
unsafe : true
|
unsafe: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
@@ -754,8 +758,8 @@ in_boolean_context: {
|
|||||||
|
|
||||||
unsafe_charAt: {
|
unsafe_charAt: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
unsafe : true
|
unsafe: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
@@ -782,8 +786,8 @@ unsafe_charAt: {
|
|||||||
|
|
||||||
unsafe_charAt_bad_index: {
|
unsafe_charAt_bad_index: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
unsafe : true
|
unsafe: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
@@ -804,8 +808,8 @@ unsafe_charAt_bad_index: {
|
|||||||
|
|
||||||
unsafe_charAt_noop: {
|
unsafe_charAt_noop: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
unsafe : true
|
unsafe: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
@@ -1195,7 +1199,7 @@ issue_2231_1: {
|
|||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
"WARN: Error evaluating Object.keys(void 0) [test/compress/evaluate.js:1191,20]",
|
"WARN: Error evaluating Object.keys(void 0) [test/compress/evaluate.js:1,20]",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1212,7 +1216,7 @@ issue_2231_2: {
|
|||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
"WARN: Error evaluating Object.getOwnPropertyNames(null) [test/compress/evaluate.js:1208,20]",
|
"WARN: Error evaluating Object.getOwnPropertyNames(null) [test/compress/evaluate.js:1,20]",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1350,14 +1354,14 @@ issue_2535_3: {
|
|||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
"WARN: Dropping side-effect-free && [test/compress/evaluate.js:1336,20]",
|
"WARN: Dropping side-effect-free && [test/compress/evaluate.js:1,20]",
|
||||||
"WARN: Dropping side-effect-free && [test/compress/evaluate.js:1337,20]",
|
"WARN: Dropping side-effect-free && [test/compress/evaluate.js:2,20]",
|
||||||
"WARN: Dropping side-effect-free && [test/compress/evaluate.js:1338,20]",
|
"WARN: Dropping side-effect-free && [test/compress/evaluate.js:3,20]",
|
||||||
"WARN: Condition left of && always false [test/compress/evaluate.js:1338,20]",
|
"WARN: Condition left of && always false [test/compress/evaluate.js:3,20]",
|
||||||
"WARN: Dropping side-effect-free || [test/compress/evaluate.js:1339,20]",
|
"WARN: Dropping side-effect-free || [test/compress/evaluate.js:4,20]",
|
||||||
"WARN: Dropping side-effect-free || [test/compress/evaluate.js:1340,20]",
|
"WARN: Dropping side-effect-free || [test/compress/evaluate.js:5,20]",
|
||||||
"WARN: Dropping side-effect-free || [test/compress/evaluate.js:1341,20]",
|
"WARN: Dropping side-effect-free || [test/compress/evaluate.js:6,20]",
|
||||||
"WARN: Condition left of || always true [test/compress/evaluate.js:1341,20]",
|
"WARN: Condition left of || always true [test/compress/evaluate.js:6,20]",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,20 +9,20 @@ non_ascii_function_identifier_name: {
|
|||||||
|
|
||||||
iifes_returning_constants_keep_fargs_true: {
|
iifes_returning_constants_keep_fargs_true: {
|
||||||
options = {
|
options = {
|
||||||
keep_fargs : true,
|
booleans: true,
|
||||||
side_effects : true,
|
collapse_vars: true,
|
||||||
evaluate : true,
|
comparisons: true,
|
||||||
unused : true,
|
conditionals: true,
|
||||||
dead_code : true,
|
dead_code: true,
|
||||||
conditionals : true,
|
evaluate: true,
|
||||||
comparisons : true,
|
if_return: true,
|
||||||
booleans : true,
|
inline: true,
|
||||||
if_return : true,
|
join_vars: true,
|
||||||
join_vars : true,
|
keep_fargs: true,
|
||||||
reduce_funcs : true,
|
reduce_funcs: true,
|
||||||
reduce_vars : true,
|
reduce_vars: true,
|
||||||
collapse_vars : true,
|
side_effects: true,
|
||||||
inline : true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
(function(){ return -1.23; }());
|
(function(){ return -1.23; }());
|
||||||
@@ -46,20 +46,20 @@ iifes_returning_constants_keep_fargs_true: {
|
|||||||
|
|
||||||
iifes_returning_constants_keep_fargs_false: {
|
iifes_returning_constants_keep_fargs_false: {
|
||||||
options = {
|
options = {
|
||||||
keep_fargs : false,
|
booleans: true,
|
||||||
side_effects : true,
|
collapse_vars: true,
|
||||||
evaluate : true,
|
comparisons: true,
|
||||||
unused : true,
|
conditionals: true,
|
||||||
dead_code : true,
|
dead_code: true,
|
||||||
conditionals : true,
|
evaluate: true,
|
||||||
comparisons : true,
|
if_return: true,
|
||||||
booleans : true,
|
inline: true,
|
||||||
if_return : true,
|
join_vars: true,
|
||||||
join_vars : true,
|
keep_fargs: false,
|
||||||
reduce_funcs : true,
|
reduce_funcs: true,
|
||||||
reduce_vars : true,
|
reduce_vars: true,
|
||||||
collapse_vars : true,
|
side_effects: true,
|
||||||
inline : true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
(function(){ return -1.23; }());
|
(function(){ return -1.23; }());
|
||||||
@@ -1175,8 +1175,8 @@ issue_2620_3: {
|
|||||||
issue_2620_4: {
|
issue_2620_4: {
|
||||||
rename = true,
|
rename = true,
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
passes: 2,
|
passes: 2,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
@@ -1533,7 +1533,7 @@ issue_2663_3: {
|
|||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
(function () {
|
(function() {
|
||||||
var outputs = [
|
var outputs = [
|
||||||
{ type: 0, target: null, eventName: "ngSubmit", propName: null },
|
{ type: 0, target: null, eventName: "ngSubmit", propName: null },
|
||||||
{ type: 0, target: null, eventName: "submit", propName: null },
|
{ type: 0, target: null, eventName: "submit", propName: null },
|
||||||
@@ -1550,11 +1550,11 @@ issue_2663_3: {
|
|||||||
return handlers;
|
return handlers;
|
||||||
}
|
}
|
||||||
function renderEventHandlerClosure(eventName) {
|
function renderEventHandlerClosure(eventName) {
|
||||||
return function () {
|
return function() {
|
||||||
return console.log(eventName);
|
return console.log(eventName);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
listenToElementOutputs(outputs).forEach(function (handler) {
|
listenToElementOutputs(outputs).forEach(function(handler) {
|
||||||
return handler()
|
return handler()
|
||||||
});
|
});
|
||||||
})();
|
})();
|
||||||
@@ -1634,7 +1634,7 @@ loop_init_arg: {
|
|||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var a = "PASS";
|
var a = "PASS";
|
||||||
for (var k in "12") (function (b) {
|
for (var k in "12") (function(b) {
|
||||||
(b >>= 1) && (a = "FAIL"), b = 2;
|
(b >>= 1) && (a = "FAIL"), b = 2;
|
||||||
})();
|
})();
|
||||||
console.log(a);
|
console.log(a);
|
||||||
@@ -2025,6 +2025,7 @@ deduplicate_parenthesis: {
|
|||||||
|
|
||||||
drop_lone_use_strict: {
|
drop_lone_use_strict: {
|
||||||
options = {
|
options = {
|
||||||
|
directives: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -2052,6 +2053,27 @@ drop_lone_use_strict: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_3166: {
|
||||||
|
options = {
|
||||||
|
directives: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"foo";
|
||||||
|
"use strict";
|
||||||
|
function f() {
|
||||||
|
"use strict";
|
||||||
|
"bar";
|
||||||
|
"use asm";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
function f() {
|
||||||
|
"use asm";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
issue_3016_1: {
|
issue_3016_1: {
|
||||||
options = {
|
options = {
|
||||||
inline: true,
|
inline: true,
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ must_replace: {
|
|||||||
options = {
|
options = {
|
||||||
global_defs: {
|
global_defs: {
|
||||||
D: "foo bar",
|
D: "foo bar",
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(D);
|
console.log(D);
|
||||||
@@ -141,9 +141,8 @@ mixed: {
|
|||||||
console.log(CONFIG);
|
console.log(CONFIG);
|
||||||
}
|
}
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
'WARN: global_defs CONFIG.VALUE redefined [test/compress/global_defs.js:127,22]',
|
"WARN: global_defs CONFIG.VALUE redefined [test/compress/global_defs.js:4,22]",
|
||||||
'WARN: global_defs CONFIG.VALUE redefined [test/compress/global_defs.js:128,22]',
|
"WARN: global_defs CONFIG.VALUE redefined [test/compress/global_defs.js:7,8]",
|
||||||
'WARN: global_defs CONFIG.VALUE redefined [test/compress/global_defs.js:130,8]',
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -197,3 +196,23 @@ issue_2167: {
|
|||||||
doWork();
|
doWork();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_3217: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
global_defs: {
|
||||||
|
"@o": "{fn:function(){var a=42;console.log(a)}}",
|
||||||
|
},
|
||||||
|
inline: true,
|
||||||
|
properties: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
o.fn();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(42);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
issue_2377_1: {
|
issue_2377_1: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
inline: true,
|
|
||||||
hoist_props: true,
|
hoist_props: true,
|
||||||
|
inline: true,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
@@ -33,8 +33,8 @@ issue_2377_1: {
|
|||||||
issue_2377_2: {
|
issue_2377_2: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
inline: true,
|
|
||||||
hoist_props: true,
|
hoist_props: true,
|
||||||
|
inline: true,
|
||||||
passes: 2,
|
passes: 2,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
@@ -64,8 +64,8 @@ issue_2377_2: {
|
|||||||
issue_2377_3: {
|
issue_2377_3: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
inline: true,
|
|
||||||
hoist_props: true,
|
hoist_props: true,
|
||||||
|
inline: true,
|
||||||
passes: 4,
|
passes: 4,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
@@ -416,7 +416,10 @@ issue_2473_1: {
|
|||||||
options = {
|
options = {
|
||||||
hoist_props: false,
|
hoist_props: false,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
top_retain: [ "x", "y" ],
|
top_retain: [
|
||||||
|
"x",
|
||||||
|
"y"
|
||||||
|
],
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -435,7 +438,10 @@ issue_2473_2: {
|
|||||||
options = {
|
options = {
|
||||||
hoist_props: true,
|
hoist_props: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
top_retain: [ "x", "y" ],
|
top_retain: [
|
||||||
|
"x",
|
||||||
|
"y"
|
||||||
|
],
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -746,9 +752,9 @@ issue_3046: {
|
|||||||
issue_3071_1: {
|
issue_3071_1: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
hoist_props: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
join_vars: true,
|
join_vars: true,
|
||||||
hoist_props: true,
|
|
||||||
passes: 3,
|
passes: 3,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
@@ -773,9 +779,9 @@ issue_3071_1: {
|
|||||||
issue_3071_2: {
|
issue_3071_2: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
hoist_props: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
join_vars: true,
|
join_vars: true,
|
||||||
hoist_props: true,
|
|
||||||
passes: 3,
|
passes: 3,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
@@ -800,9 +806,9 @@ issue_3071_2: {
|
|||||||
issue_3071_2_toplevel: {
|
issue_3071_2_toplevel: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
hoist_props: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
join_vars: true,
|
join_vars: true,
|
||||||
hoist_props: true,
|
|
||||||
passes: 3,
|
passes: 3,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
|
|||||||
@@ -187,9 +187,9 @@ dont_screw_try_catch_undefined: {
|
|||||||
reduce_vars: {
|
reduce_vars: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
ie8: true,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
ie8: true,
|
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
@@ -420,8 +420,8 @@ issue_24_2: {
|
|||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
(function(n) {
|
(function(o) {
|
||||||
console.log(typeof function o(){} === typeof n ? "FAIL" : "PASS");
|
console.log(typeof function n(){} === typeof o ? "FAIL" : "PASS");
|
||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
@@ -457,9 +457,29 @@ issue_2976_2: {
|
|||||||
}());
|
}());
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
console.log(function n() {
|
console.log(function f() {
|
||||||
var o;
|
var n;
|
||||||
return o === n ? "FAIL" : "PASS";
|
return n === f ? "FAIL" : "PASS";
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2976_3: {
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function f() {
|
||||||
|
var a;
|
||||||
|
return a === f ? "FAIL" : "PASS";
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function o() {
|
||||||
|
var n;
|
||||||
|
return n === o ? "FAIL" : "PASS";
|
||||||
}());
|
}());
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
@@ -538,3 +558,306 @@ issue_3035_ie8: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_3197_1: {
|
||||||
|
options = {
|
||||||
|
ie8: false,
|
||||||
|
inline: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var window = {};
|
||||||
|
!function() {
|
||||||
|
function Foo() {
|
||||||
|
console.log(this instanceof Foo);
|
||||||
|
}
|
||||||
|
window.Foo = Foo;
|
||||||
|
}();
|
||||||
|
new window.Foo();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var window = {};
|
||||||
|
window.Foo = function o() {
|
||||||
|
console.log(this instanceof o);
|
||||||
|
};
|
||||||
|
new window.Foo();
|
||||||
|
}
|
||||||
|
expect_stdout: "true"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3197_1_ie8: {
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
inline: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var window = {};
|
||||||
|
!function() {
|
||||||
|
function Foo() {
|
||||||
|
console.log(this instanceof Foo);
|
||||||
|
}
|
||||||
|
window.Foo = Foo;
|
||||||
|
}();
|
||||||
|
new window.Foo();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var window = {};
|
||||||
|
window.Foo = function Foo() {
|
||||||
|
console.log(this instanceof Foo);
|
||||||
|
};
|
||||||
|
new window.Foo();
|
||||||
|
}
|
||||||
|
expect_stdout: "true"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3197_2: {
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a) {
|
||||||
|
var f = function f() {
|
||||||
|
console.log(this instanceof f);
|
||||||
|
};
|
||||||
|
new f(a);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(n) {
|
||||||
|
var o = function n() {
|
||||||
|
console.log(this instanceof n);
|
||||||
|
};
|
||||||
|
new o(n);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "true"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3197_2_ie8: {
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a) {
|
||||||
|
var f = function f() {
|
||||||
|
console.log(this instanceof f);
|
||||||
|
};
|
||||||
|
new f(a);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(n) {
|
||||||
|
var o = function o() {
|
||||||
|
console.log(this instanceof o);
|
||||||
|
};
|
||||||
|
new o(n);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "true"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3206_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
ie8: false,
|
||||||
|
reduce_vars: true,
|
||||||
|
typeofs: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
var foo = function bar() {};
|
||||||
|
var baz = function moo() {};
|
||||||
|
return "function" == typeof bar;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function() {
|
||||||
|
return "function" == typeof bar;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "false"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3206_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
ie8: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
typeofs: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
var foo = function bar() {};
|
||||||
|
var baz = function moo() {};
|
||||||
|
return "function" == typeof bar;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function() {
|
||||||
|
(function bar() {});
|
||||||
|
return "function" == typeof bar;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "false"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3215_1: {
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function foo() {
|
||||||
|
var bar = function bar(name) {
|
||||||
|
return "PASS";
|
||||||
|
};
|
||||||
|
try {
|
||||||
|
"moo";
|
||||||
|
} catch (e) {
|
||||||
|
bar = function bar(name) {
|
||||||
|
return "FAIL";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return bar;
|
||||||
|
}()());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function n() {
|
||||||
|
var o = function n(o) {
|
||||||
|
return "PASS";
|
||||||
|
};
|
||||||
|
try {
|
||||||
|
"moo";
|
||||||
|
} catch (n) {
|
||||||
|
o = function n(o) {
|
||||||
|
return "FAIL";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return o;
|
||||||
|
}()());
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3215_2: {
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function foo() {
|
||||||
|
var bar = function bar(name) {
|
||||||
|
return "PASS";
|
||||||
|
};
|
||||||
|
try {
|
||||||
|
"moo";
|
||||||
|
} catch (e) {
|
||||||
|
bar = function bar(name) {
|
||||||
|
return "FAIL";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return bar;
|
||||||
|
}()());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function foo() {
|
||||||
|
var o = function o(n) {
|
||||||
|
return "PASS";
|
||||||
|
};
|
||||||
|
try {
|
||||||
|
"moo";
|
||||||
|
} catch (n) {
|
||||||
|
o = function o(n) {
|
||||||
|
return "FAIL";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return o;
|
||||||
|
}()());
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3215_3: {
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function foo() {
|
||||||
|
var bar = function bar(name) {
|
||||||
|
return "FAIL";
|
||||||
|
};
|
||||||
|
try {
|
||||||
|
moo;
|
||||||
|
} catch (e) {
|
||||||
|
bar = function bar(name) {
|
||||||
|
return "PASS";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return bar;
|
||||||
|
}()());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function n() {
|
||||||
|
var o = function n(o) {
|
||||||
|
return "FAIL";
|
||||||
|
};
|
||||||
|
try {
|
||||||
|
moo;
|
||||||
|
} catch (n) {
|
||||||
|
o = function n(o) {
|
||||||
|
return "PASS";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return o;
|
||||||
|
}()());
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3215_4: {
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function foo() {
|
||||||
|
var bar = function bar(name) {
|
||||||
|
return "FAIL";
|
||||||
|
};
|
||||||
|
try {
|
||||||
|
moo;
|
||||||
|
} catch (e) {
|
||||||
|
bar = function bar(name) {
|
||||||
|
return "PASS";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return bar;
|
||||||
|
}()());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function foo() {
|
||||||
|
var o = function o(n) {
|
||||||
|
return "FAIL";
|
||||||
|
};
|
||||||
|
try {
|
||||||
|
moo;
|
||||||
|
} catch (n) {
|
||||||
|
o = function o(n) {
|
||||||
|
return "PASS";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return o;
|
||||||
|
}()());
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
if_return_1: {
|
if_return_1: {
|
||||||
options = {
|
options = {
|
||||||
if_return : true,
|
booleans: true,
|
||||||
sequences : true,
|
comparisons: true,
|
||||||
conditionals : true,
|
conditionals: true,
|
||||||
comparisons : true,
|
dead_code: true,
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
booleans : true,
|
if_return: true,
|
||||||
unused : true,
|
sequences: true,
|
||||||
side_effects : true,
|
side_effects: true,
|
||||||
dead_code : true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(x) {
|
function f(x) {
|
||||||
@@ -24,15 +24,15 @@ if_return_1: {
|
|||||||
|
|
||||||
if_return_2: {
|
if_return_2: {
|
||||||
options = {
|
options = {
|
||||||
if_return : true,
|
booleans: true,
|
||||||
sequences : true,
|
comparisons: true,
|
||||||
conditionals : true,
|
conditionals: true,
|
||||||
comparisons : true,
|
dead_code: true,
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
booleans : true,
|
if_return: true,
|
||||||
unused : true,
|
sequences: true,
|
||||||
side_effects : true,
|
side_effects: true,
|
||||||
dead_code : true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(x, y) {
|
function f(x, y) {
|
||||||
@@ -49,15 +49,15 @@ if_return_2: {
|
|||||||
|
|
||||||
if_return_3: {
|
if_return_3: {
|
||||||
options = {
|
options = {
|
||||||
if_return : true,
|
booleans: true,
|
||||||
sequences : true,
|
comparisons: true,
|
||||||
conditionals : true,
|
conditionals: true,
|
||||||
comparisons : true,
|
dead_code: true,
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
booleans : true,
|
if_return: true,
|
||||||
unused : true,
|
sequences: true,
|
||||||
side_effects : true,
|
side_effects: true,
|
||||||
dead_code : true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(x) {
|
function f(x) {
|
||||||
@@ -75,15 +75,15 @@ if_return_3: {
|
|||||||
|
|
||||||
if_return_4: {
|
if_return_4: {
|
||||||
options = {
|
options = {
|
||||||
if_return : true,
|
booleans: true,
|
||||||
sequences : true,
|
comparisons: true,
|
||||||
conditionals : true,
|
conditionals: true,
|
||||||
comparisons : true,
|
dead_code: true,
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
booleans : true,
|
if_return: true,
|
||||||
unused : true,
|
sequences: true,
|
||||||
side_effects : true,
|
side_effects: true,
|
||||||
dead_code : true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(x, y) {
|
function f(x, y) {
|
||||||
@@ -100,15 +100,15 @@ if_return_4: {
|
|||||||
|
|
||||||
if_return_5: {
|
if_return_5: {
|
||||||
options = {
|
options = {
|
||||||
if_return : true,
|
booleans: true,
|
||||||
sequences : true,
|
comparisons: true,
|
||||||
conditionals : true,
|
conditionals: true,
|
||||||
comparisons : true,
|
dead_code: true,
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
booleans : true,
|
if_return: true,
|
||||||
unused : true,
|
sequences: true,
|
||||||
side_effects : true,
|
side_effects: true,
|
||||||
dead_code : true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f() {
|
function f() {
|
||||||
@@ -126,15 +126,15 @@ if_return_5: {
|
|||||||
|
|
||||||
if_return_6: {
|
if_return_6: {
|
||||||
options = {
|
options = {
|
||||||
if_return : true,
|
booleans: true,
|
||||||
sequences : true,
|
comparisons: true,
|
||||||
conditionals : true,
|
conditionals: true,
|
||||||
comparisons : true,
|
dead_code: true,
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
booleans : true,
|
if_return: true,
|
||||||
unused : true,
|
sequences: true,
|
||||||
side_effects : true,
|
side_effects: true,
|
||||||
dead_code : true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(x) {
|
function f(x) {
|
||||||
@@ -150,15 +150,15 @@ if_return_6: {
|
|||||||
|
|
||||||
if_return_7: {
|
if_return_7: {
|
||||||
options = {
|
options = {
|
||||||
if_return : true,
|
booleans: true,
|
||||||
sequences : true,
|
comparisons: true,
|
||||||
conditionals : true,
|
conditionals: true,
|
||||||
comparisons : true,
|
dead_code: true,
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
booleans : true,
|
if_return: true,
|
||||||
unused : true,
|
sequences: true,
|
||||||
side_effects : true,
|
side_effects: true,
|
||||||
dead_code : true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(x) {
|
function f(x) {
|
||||||
@@ -176,10 +176,10 @@ if_return_7: {
|
|||||||
|
|
||||||
if_return_8: {
|
if_return_8: {
|
||||||
options = {
|
options = {
|
||||||
if_return: true,
|
conditionals: true,
|
||||||
sequences: true,
|
if_return: true,
|
||||||
conditionals: true,
|
sequences: true,
|
||||||
side_effects : true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f(e) {
|
function f(e) {
|
||||||
@@ -220,15 +220,15 @@ if_return_8: {
|
|||||||
|
|
||||||
issue_1089: {
|
issue_1089: {
|
||||||
options = {
|
options = {
|
||||||
if_return : true,
|
booleans: true,
|
||||||
sequences : true,
|
comparisons: true,
|
||||||
conditionals : true,
|
conditionals: true,
|
||||||
comparisons : true,
|
dead_code: true,
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
booleans : true,
|
if_return: true,
|
||||||
unused : true,
|
sequences: true,
|
||||||
side_effects : true,
|
side_effects: true,
|
||||||
dead_code : true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function x() {
|
function x() {
|
||||||
@@ -251,9 +251,9 @@ issue_1089: {
|
|||||||
|
|
||||||
issue_1437: {
|
issue_1437: {
|
||||||
options = {
|
options = {
|
||||||
if_return : true,
|
conditionals: false,
|
||||||
sequences : true,
|
if_return: true,
|
||||||
conditionals : false
|
sequences: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function x() {
|
function x() {
|
||||||
@@ -281,9 +281,9 @@ issue_1437: {
|
|||||||
|
|
||||||
issue_1437_conditionals: {
|
issue_1437_conditionals: {
|
||||||
options = {
|
options = {
|
||||||
conditionals : true,
|
conditionals: true,
|
||||||
if_return : true,
|
if_return: true,
|
||||||
sequences : true
|
sequences: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function x() {
|
function x() {
|
||||||
|
|||||||
@@ -1,8 +1,17 @@
|
|||||||
non_hoisted_function_after_return: {
|
non_hoisted_function_after_return: {
|
||||||
options = {
|
options = {
|
||||||
hoist_funs: false, dead_code: true, conditionals: true, comparisons: true,
|
booleans: true,
|
||||||
evaluate: true, booleans: true, loops: true, unused: true, keep_fargs: true,
|
comparisons: true,
|
||||||
if_return: true, join_vars: true, side_effects: true
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: false,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function foo(x) {
|
function foo(x) {
|
||||||
@@ -27,19 +36,30 @@ non_hoisted_function_after_return: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
'WARN: Dropping unreachable code [test/compress/issue-1034.js:11,16]',
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:4,16]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:14,16]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:7,16]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:17,12]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:10,12]",
|
||||||
"WARN: Dropping unused function UnusedFunction [test/compress/issue-1034.js:18,21]"
|
"WARN: Dropping unused function UnusedFunction [test/compress/issue-1034.js:11,21]"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
non_hoisted_function_after_return_2a: {
|
non_hoisted_function_after_return_2a: {
|
||||||
options = {
|
options = {
|
||||||
hoist_funs: false, dead_code: true, conditionals: true, comparisons: true,
|
booleans: true,
|
||||||
evaluate: true, booleans: true, loops: true, unused: true, keep_fargs: true,
|
collapse_vars: false,
|
||||||
if_return: true, join_vars: true, side_effects: true,
|
comparisons: true,
|
||||||
collapse_vars: false, passes: 2, warnings: "verbose"
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: false,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
passes: 2,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
warnings: "verbose",
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function foo(x) {
|
function foo(x) {
|
||||||
@@ -65,28 +85,37 @@ non_hoisted_function_after_return_2a: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:48,16]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:4,16]",
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:48,16]",
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:4,16]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:51,16]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:7,16]",
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:51,16]",
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:7,16]",
|
||||||
"WARN: Dropping unused variable a [test/compress/issue-1034.js:48,20]",
|
"WARN: Dropping unused variable a [test/compress/issue-1034.js:4,20]",
|
||||||
"WARN: Dropping unused function nope [test/compress/issue-1034.js:55,21]",
|
"WARN: Dropping unused function nope [test/compress/issue-1034.js:11,21]",
|
||||||
"WARN: pass 0: last_count: Infinity, count: 37",
|
"WARN: pass 0: last_count: Infinity, count: 37",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:53,12]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:9,12]",
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:53,12]",
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:9,12]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:56,12]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:12,12]",
|
||||||
"WARN: Dropping unused variable b [test/compress/issue-1034.js:51,20]",
|
"WARN: Dropping unused variable b [test/compress/issue-1034.js:7,20]",
|
||||||
"WARN: Dropping unused variable c [test/compress/issue-1034.js:53,16]",
|
"WARN: Dropping unused variable c [test/compress/issue-1034.js:9,16]",
|
||||||
"WARN: pass 1: last_count: 37, count: 18",
|
"WARN: pass 1: last_count: 37, count: 18",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
non_hoisted_function_after_return_2b: {
|
non_hoisted_function_after_return_2b: {
|
||||||
options = {
|
options = {
|
||||||
hoist_funs: false, dead_code: true, conditionals: true, comparisons: true,
|
booleans: true,
|
||||||
evaluate: true, booleans: true, loops: true, unused: true, keep_fargs: true,
|
collapse_vars: false,
|
||||||
if_return: true, join_vars: true, side_effects: true,
|
comparisons: true,
|
||||||
collapse_vars: false
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: false,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function foo(x) {
|
function foo(x) {
|
||||||
@@ -110,20 +139,28 @@ non_hoisted_function_after_return_2b: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
// duplicate warnings no longer emitted
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:6,16]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:97,16]",
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:6,16]",
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:97,16]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:8,12]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:99,12]",
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:8,12]",
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:99,12]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:12,12]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:103,12]",
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
non_hoisted_function_after_return_strict: {
|
non_hoisted_function_after_return_strict: {
|
||||||
options = {
|
options = {
|
||||||
hoist_funs: false, dead_code: true, conditionals: true, comparisons: true,
|
booleans: true,
|
||||||
evaluate: true, booleans: true, loops: true, unused: true, keep_fargs: true,
|
comparisons: true,
|
||||||
if_return: true, join_vars: true, side_effects: true
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: false,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
"use strict";
|
"use strict";
|
||||||
@@ -153,19 +190,30 @@ non_hoisted_function_after_return_strict: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "8 7"
|
expect_stdout: "8 7"
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:133,16]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:5,16]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:136,16]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:8,16]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:139,12]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:11,12]",
|
||||||
"WARN: Dropping unused function UnusedFunction [test/compress/issue-1034.js:140,21]",
|
"WARN: Dropping unused function UnusedFunction [test/compress/issue-1034.js:12,21]",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
non_hoisted_function_after_return_2a_strict: {
|
non_hoisted_function_after_return_2a_strict: {
|
||||||
options = {
|
options = {
|
||||||
hoist_funs: false, dead_code: true, conditionals: true, comparisons: true,
|
booleans: true,
|
||||||
evaluate: true, booleans: true, loops: true, unused: true, keep_fargs: true,
|
collapse_vars: false,
|
||||||
if_return: true, join_vars: true, side_effects: true,
|
comparisons: true,
|
||||||
collapse_vars: false, passes: 2, warnings: "verbose"
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: false,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
passes: 2,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
warnings: "verbose",
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
"use strict";
|
"use strict";
|
||||||
@@ -196,28 +244,37 @@ non_hoisted_function_after_return_2a_strict: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "5 6"
|
expect_stdout: "5 6"
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:175,16]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:5,16]",
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:175,16]",
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:5,16]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:178,16]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:8,16]",
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:178,16]",
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:8,16]",
|
||||||
"WARN: Dropping unused variable a [test/compress/issue-1034.js:175,20]",
|
"WARN: Dropping unused variable a [test/compress/issue-1034.js:5,20]",
|
||||||
"WARN: Dropping unused function nope [test/compress/issue-1034.js:182,21]",
|
"WARN: Dropping unused function nope [test/compress/issue-1034.js:12,21]",
|
||||||
"WARN: pass 0: last_count: Infinity, count: 48",
|
"WARN: pass 0: last_count: Infinity, count: 48",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:180,12]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:10,12]",
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:180,12]",
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:10,12]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:183,12]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:13,12]",
|
||||||
"WARN: Dropping unused variable b [test/compress/issue-1034.js:178,20]",
|
"WARN: Dropping unused variable b [test/compress/issue-1034.js:8,20]",
|
||||||
"WARN: Dropping unused variable c [test/compress/issue-1034.js:180,16]",
|
"WARN: Dropping unused variable c [test/compress/issue-1034.js:10,16]",
|
||||||
"WARN: pass 1: last_count: 48, count: 29",
|
"WARN: pass 1: last_count: 48, count: 29",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
non_hoisted_function_after_return_2b_strict: {
|
non_hoisted_function_after_return_2b_strict: {
|
||||||
options = {
|
options = {
|
||||||
hoist_funs: false, dead_code: true, conditionals: true, comparisons: true,
|
booleans: true,
|
||||||
evaluate: true, booleans: true, loops: true, unused: true, keep_fargs: true,
|
collapse_vars: false,
|
||||||
if_return: true, join_vars: true, side_effects: true,
|
comparisons: true,
|
||||||
collapse_vars: false
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: false,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
"use strict";
|
"use strict";
|
||||||
@@ -246,11 +303,10 @@ non_hoisted_function_after_return_2b_strict: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "5 6"
|
expect_stdout: "5 6"
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
// duplicate warnings no longer emitted
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:7,16]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:229,16]",
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:7,16]",
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:229,16]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:9,12]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:231,12]",
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:9,12]",
|
||||||
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:231,12]",
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:13,12]",
|
||||||
"WARN: Dropping unreachable code [test/compress/issue-1034.js:235,12]",
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ const_pragma: {
|
|||||||
evaluate: true,
|
evaluate: true,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
};
|
}
|
||||||
|
|
||||||
input: {
|
input: {
|
||||||
/** @const */ var goog = goog || {};
|
/** @const */ var goog = goog || {};
|
||||||
@@ -19,7 +19,7 @@ not_const: {
|
|||||||
evaluate: true,
|
evaluate: true,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
};
|
}
|
||||||
|
|
||||||
input: {
|
input: {
|
||||||
var goog = goog || {};
|
var goog = goog || {};
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
with_in_global_scope: {
|
with_in_global_scope: {
|
||||||
options = {
|
options = {
|
||||||
unused: true
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var o = 42;
|
var o = 42;
|
||||||
@@ -18,7 +18,7 @@ with_in_global_scope: {
|
|||||||
}
|
}
|
||||||
with_in_function_scope: {
|
with_in_function_scope: {
|
||||||
options = {
|
options = {
|
||||||
unused: true
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function foo() {
|
function foo() {
|
||||||
@@ -40,7 +40,7 @@ with_in_function_scope: {
|
|||||||
}
|
}
|
||||||
compress_with_with_in_other_scope: {
|
compress_with_with_in_other_scope: {
|
||||||
options = {
|
options = {
|
||||||
unused: true
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function foo() {
|
function foo() {
|
||||||
@@ -69,7 +69,7 @@ compress_with_with_in_other_scope: {
|
|||||||
}
|
}
|
||||||
with_using_existing_variable_outside_scope: {
|
with_using_existing_variable_outside_scope: {
|
||||||
options = {
|
options = {
|
||||||
unused: true
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f() {
|
function f() {
|
||||||
@@ -99,7 +99,7 @@ with_using_existing_variable_outside_scope: {
|
|||||||
}
|
}
|
||||||
check_drop_unused_in_peer_function: {
|
check_drop_unused_in_peer_function: {
|
||||||
options = {
|
options = {
|
||||||
unused: true
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function outer() {
|
function outer() {
|
||||||
@@ -148,7 +148,7 @@ check_drop_unused_in_peer_function: {
|
|||||||
|
|
||||||
Infinity_not_in_with_scope: {
|
Infinity_not_in_with_scope: {
|
||||||
options = {
|
options = {
|
||||||
unused: true
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var o = { Infinity: 'oInfinity' };
|
var o = { Infinity: 'oInfinity' };
|
||||||
@@ -164,7 +164,7 @@ Infinity_not_in_with_scope: {
|
|||||||
|
|
||||||
Infinity_in_with_scope: {
|
Infinity_in_with_scope: {
|
||||||
options = {
|
options = {
|
||||||
unused: true
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var o = { Infinity: 'oInfinity' };
|
var o = { Infinity: 'oInfinity' };
|
||||||
@@ -180,19 +180,19 @@ Infinity_in_with_scope: {
|
|||||||
|
|
||||||
assorted_Infinity_NaN_undefined_in_with_scope: {
|
assorted_Infinity_NaN_undefined_in_with_scope: {
|
||||||
options = {
|
options = {
|
||||||
unused: true,
|
booleans: true,
|
||||||
evaluate: true,
|
comparisons: true,
|
||||||
dead_code: true,
|
conditionals: true,
|
||||||
conditionals: true,
|
dead_code: true,
|
||||||
comparisons: true,
|
evaluate: true,
|
||||||
booleans: true,
|
hoist_funs: true,
|
||||||
hoist_funs: true,
|
if_return: true,
|
||||||
keep_fargs: true,
|
join_vars: true,
|
||||||
if_return: true,
|
keep_fargs: true,
|
||||||
join_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
sequences: false,
|
|
||||||
keep_infinity: false,
|
keep_infinity: false,
|
||||||
|
sequences: false,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var f = console.log;
|
var f = console.log;
|
||||||
@@ -242,19 +242,19 @@ assorted_Infinity_NaN_undefined_in_with_scope: {
|
|||||||
|
|
||||||
assorted_Infinity_NaN_undefined_in_with_scope_keep_infinity: {
|
assorted_Infinity_NaN_undefined_in_with_scope_keep_infinity: {
|
||||||
options = {
|
options = {
|
||||||
unused: true,
|
booleans: true,
|
||||||
evaluate: true,
|
comparisons: true,
|
||||||
dead_code: true,
|
conditionals: true,
|
||||||
conditionals: true,
|
dead_code: true,
|
||||||
comparisons: true,
|
evaluate: true,
|
||||||
booleans: true,
|
hoist_funs: true,
|
||||||
hoist_funs: true,
|
if_return: true,
|
||||||
keep_fargs: true,
|
join_vars: true,
|
||||||
if_return: true,
|
keep_fargs: true,
|
||||||
join_vars: true,
|
|
||||||
side_effects: true,
|
|
||||||
sequences: false,
|
|
||||||
keep_infinity: true,
|
keep_infinity: true,
|
||||||
|
sequences: false,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var f = console.log;
|
var f = console.log;
|
||||||
|
|||||||
@@ -1,11 +1,15 @@
|
|||||||
keep_name_of_getter: {
|
keep_name_of_getter: {
|
||||||
options = { unused: true };
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: { a = { get foo () {} } }
|
input: { a = { get foo () {} } }
|
||||||
expect: { a = { get foo () {} } }
|
expect: { a = { get foo () {} } }
|
||||||
}
|
}
|
||||||
|
|
||||||
keep_name_of_setter: {
|
keep_name_of_setter: {
|
||||||
options = { unused: true };
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: { a = { set foo () {} } }
|
input: { a = { set foo () {} } }
|
||||||
expect: { a = { set foo () {} } }
|
expect: { a = { set foo () {} } }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
mangle_keep_fnames_false: {
|
mangle_keep_fnames_false: {
|
||||||
options = {
|
options = {
|
||||||
keep_fnames : true,
|
keep_fargs: true,
|
||||||
keep_fargs : true,
|
keep_fnames: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
keep_fnames : false,
|
keep_fnames : false,
|
||||||
@@ -26,8 +26,8 @@ mangle_keep_fnames_false: {
|
|||||||
|
|
||||||
mangle_keep_fnames_true: {
|
mangle_keep_fnames_true: {
|
||||||
options = {
|
options = {
|
||||||
keep_fnames : true,
|
keep_fargs: true,
|
||||||
keep_fargs : true,
|
keep_fnames: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
keep_fnames : true,
|
keep_fnames : true,
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
pure_function_calls: {
|
pure_function_calls: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
booleans: true,
|
||||||
conditionals : true,
|
comparisons: true,
|
||||||
comparisons : true,
|
conditionals: true,
|
||||||
side_effects : true,
|
evaluate: true,
|
||||||
booleans : true,
|
if_return: true,
|
||||||
unused : true,
|
join_vars: true,
|
||||||
if_return : true,
|
negate_iife: true,
|
||||||
join_vars : true,
|
side_effects: true,
|
||||||
negate_iife : true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
// pure top-level IIFE will be dropped
|
// pure top-level IIFE will be dropped
|
||||||
@@ -48,28 +48,28 @@ pure_function_calls: {
|
|||||||
a.b(), f.g();
|
a.b(), f.g();
|
||||||
}
|
}
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:16,8]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:3,8]",
|
||||||
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:16,8]",
|
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:3,8]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:29,37]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:16,37]",
|
||||||
"WARN: Dropping unused variable iife2 [test/compress/issue-1261.js:29,16]",
|
"WARN: Dropping unused variable iife2 [test/compress/issue-1261.js:16,16]",
|
||||||
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:27,8]",
|
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:14,8]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:37,8]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:24,8]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:38,31]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:25,31]",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
pure_function_calls_toplevel: {
|
pure_function_calls_toplevel: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
booleans: true,
|
||||||
conditionals : true,
|
comparisons: true,
|
||||||
comparisons : true,
|
conditionals: true,
|
||||||
side_effects : true,
|
evaluate: true,
|
||||||
booleans : true,
|
if_return: true,
|
||||||
unused : true,
|
join_vars: true,
|
||||||
if_return : true,
|
negate_iife: true,
|
||||||
join_vars : true,
|
side_effects: true,
|
||||||
negate_iife : true,
|
toplevel: true,
|
||||||
toplevel : true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
// pure top-level IIFE will be dropped
|
// pure top-level IIFE will be dropped
|
||||||
@@ -110,17 +110,17 @@ pure_function_calls_toplevel: {
|
|||||||
a.b(), f.g();
|
a.b(), f.g();
|
||||||
}
|
}
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:77,8]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:3,8]",
|
||||||
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:77,8]",
|
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:3,8]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:90,37]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:16,37]",
|
||||||
"WARN: Dropping unused variable iife2 [test/compress/issue-1261.js:90,16]",
|
"WARN: Dropping unused variable iife2 [test/compress/issue-1261.js:16,16]",
|
||||||
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:88,8]",
|
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:14,8]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:105,8]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:31,8]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:106,31]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:32,31]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:82,33]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:8,33]",
|
||||||
"WARN: Dropping unused variable iife1 [test/compress/issue-1261.js:82,12]",
|
"WARN: Dropping unused variable iife1 [test/compress/issue-1261.js:8,12]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:98,45]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:24,45]",
|
||||||
"WARN: Dropping unused variable MyClass [test/compress/issue-1261.js:98,12]",
|
"WARN: Dropping unused variable MyClass [test/compress/issue-1261.js:24,12]",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -155,29 +155,29 @@ should_warn: {
|
|||||||
baz();
|
baz();
|
||||||
}
|
}
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:135,61]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:1,61]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:135,23]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:1,23]",
|
||||||
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:135,23]",
|
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:1,23]",
|
||||||
"WARN: Boolean || always true [test/compress/issue-1261.js:136,23]",
|
"WARN: Boolean || always true [test/compress/issue-1261.js:2,23]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:136,23]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:2,23]",
|
||||||
"WARN: Condition always true [test/compress/issue-1261.js:136,23]",
|
"WARN: Condition always true [test/compress/issue-1261.js:2,23]",
|
||||||
"WARN: Condition left of || always true [test/compress/issue-1261.js:137,8]",
|
"WARN: Condition left of || always true [test/compress/issue-1261.js:3,8]",
|
||||||
"WARN: Condition always true [test/compress/issue-1261.js:137,8]",
|
"WARN: Condition always true [test/compress/issue-1261.js:3,8]",
|
||||||
"WARN: Boolean && always false [test/compress/issue-1261.js:138,23]",
|
"WARN: Boolean && always false [test/compress/issue-1261.js:4,23]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:138,23]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:4,23]",
|
||||||
"WARN: Condition always false [test/compress/issue-1261.js:138,23]",
|
"WARN: Condition always false [test/compress/issue-1261.js:4,23]",
|
||||||
"WARN: Condition left of && always false [test/compress/issue-1261.js:139,8]",
|
"WARN: Condition left of && always false [test/compress/issue-1261.js:5,8]",
|
||||||
"WARN: Condition always false [test/compress/issue-1261.js:139,8]",
|
"WARN: Condition always false [test/compress/issue-1261.js:5,8]",
|
||||||
"WARN: + in boolean context always true [test/compress/issue-1261.js:140,23]",
|
"WARN: + in boolean context always true [test/compress/issue-1261.js:6,23]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:140,23]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:6,23]",
|
||||||
"WARN: Condition always true [test/compress/issue-1261.js:140,23]",
|
"WARN: Condition always true [test/compress/issue-1261.js:6,23]",
|
||||||
"WARN: + in boolean context always true [test/compress/issue-1261.js:141,8]",
|
"WARN: + in boolean context always true [test/compress/issue-1261.js:7,8]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:141,31]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:7,31]",
|
||||||
"WARN: Condition always true [test/compress/issue-1261.js:141,8]",
|
"WARN: Condition always true [test/compress/issue-1261.js:7,8]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:142,23]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:8,23]",
|
||||||
"WARN: Condition always true [test/compress/issue-1261.js:143,8]",
|
"WARN: Condition always true [test/compress/issue-1261.js:9,8]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:143,24]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:9,24]",
|
||||||
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:144,31]",
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:10,31]",
|
||||||
"WARN: Condition always false [test/compress/issue-1261.js:144,8]",
|
"WARN: Condition always false [test/compress/issue-1261.js:10,8]",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,16 +1,16 @@
|
|||||||
string_plus_optimization: {
|
string_plus_optimization: {
|
||||||
options = {
|
options = {
|
||||||
side_effects : true,
|
booleans: true,
|
||||||
evaluate : true,
|
comparisons: true,
|
||||||
conditionals : true,
|
conditionals: true,
|
||||||
comparisons : true,
|
dead_code: true,
|
||||||
dead_code : true,
|
evaluate: true,
|
||||||
booleans : true,
|
hoist_funs: true,
|
||||||
unused : true,
|
if_return: true,
|
||||||
if_return : true,
|
join_vars: true,
|
||||||
join_vars : true,
|
side_effects: true,
|
||||||
hoist_funs : true,
|
unused: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
function foo(anything) {
|
function foo(anything) {
|
||||||
function throwing_function() {
|
function throwing_function() {
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
tranformation_sort_order_equal: {
|
tranformation_sort_order_equal: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
};
|
}
|
||||||
|
|
||||||
input: { (a = parseInt('100')) == a }
|
input: { (a = parseInt('100')) == a }
|
||||||
expect: { (a = parseInt('100')) == a }
|
expect: { (a = parseInt('100')) == a }
|
||||||
@@ -24,7 +24,7 @@ tranformation_sort_order_equal: {
|
|||||||
tranformation_sort_order_unequal: {
|
tranformation_sort_order_unequal: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
};
|
}
|
||||||
|
|
||||||
input: { (a = parseInt('100')) != a }
|
input: { (a = parseInt('100')) != a }
|
||||||
expect: { (a = parseInt('100')) != a }
|
expect: { (a = parseInt('100')) != a }
|
||||||
@@ -33,7 +33,7 @@ tranformation_sort_order_unequal: {
|
|||||||
tranformation_sort_order_lesser_or_equal: {
|
tranformation_sort_order_lesser_or_equal: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
};
|
}
|
||||||
|
|
||||||
input: { (a = parseInt('100')) <= a }
|
input: { (a = parseInt('100')) <= a }
|
||||||
expect: { (a = parseInt('100')) <= a }
|
expect: { (a = parseInt('100')) <= a }
|
||||||
@@ -41,7 +41,7 @@ tranformation_sort_order_lesser_or_equal: {
|
|||||||
tranformation_sort_order_greater_or_equal: {
|
tranformation_sort_order_greater_or_equal: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
};
|
}
|
||||||
|
|
||||||
input: { (a = parseInt('100')) >= a }
|
input: { (a = parseInt('100')) >= a }
|
||||||
expect: { (a = parseInt('100')) >= a }
|
expect: { (a = parseInt('100')) >= a }
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
level_zero: {
|
level_zero: {
|
||||||
options = {
|
options = {
|
||||||
keep_fnames: true
|
keep_fnames: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
keep_fnames: true
|
keep_fnames: true
|
||||||
@@ -29,7 +29,7 @@ level_zero: {
|
|||||||
|
|
||||||
level_one: {
|
level_one: {
|
||||||
options = {
|
options = {
|
||||||
keep_fnames: true
|
keep_fnames: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
keep_fnames: true
|
keep_fnames: true
|
||||||
@@ -58,7 +58,7 @@ level_one: {
|
|||||||
|
|
||||||
level_two: {
|
level_two: {
|
||||||
options = {
|
options = {
|
||||||
keep_fnames: true
|
keep_fnames: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
keep_fnames: true
|
keep_fnames: true
|
||||||
@@ -97,7 +97,7 @@ level_two: {
|
|||||||
|
|
||||||
level_three: {
|
level_three: {
|
||||||
options = {
|
options = {
|
||||||
keep_fnames: true
|
keep_fnames: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
keep_fnames: true
|
keep_fnames: true
|
||||||
|
|||||||
@@ -22,17 +22,17 @@ else_with_empty_statement: {
|
|||||||
|
|
||||||
conditional_false_stray_else_in_loop: {
|
conditional_false_stray_else_in_loop: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
booleans: true,
|
||||||
comparisons : true,
|
comparisons: true,
|
||||||
booleans : true,
|
conditionals: false,
|
||||||
unused : true,
|
dead_code: true,
|
||||||
loops : true,
|
evaluate: true,
|
||||||
side_effects : true,
|
hoist_vars: true,
|
||||||
dead_code : true,
|
if_return: true,
|
||||||
hoist_vars : true,
|
join_vars: true,
|
||||||
join_vars : true,
|
loops: true,
|
||||||
if_return : true,
|
side_effects: true,
|
||||||
conditionals : false,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
for (var i = 1; i <= 4; ++i) {
|
for (var i = 1; i <= 4; ++i) {
|
||||||
|
|||||||
@@ -125,8 +125,8 @@ label_do: {
|
|||||||
|
|
||||||
label_while: {
|
label_while: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
loops: true,
|
loops: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
do_not_update_lhs: {
|
do_not_update_lhs: {
|
||||||
options = {
|
options = {
|
||||||
global_defs: { DEBUG: 0 }
|
global_defs: {
|
||||||
|
DEBUG: 0,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
DEBUG++;
|
DEBUG++;
|
||||||
@@ -16,7 +18,9 @@ do_not_update_lhs: {
|
|||||||
|
|
||||||
do_update_rhs: {
|
do_update_rhs: {
|
||||||
options = {
|
options = {
|
||||||
global_defs: { DEBUG: 0 }
|
global_defs: {
|
||||||
|
DEBUG: 0,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
MY_DEBUG = DEBUG;
|
MY_DEBUG = DEBUG;
|
||||||
@@ -35,7 +39,7 @@ mixed: {
|
|||||||
DEBUG: 0,
|
DEBUG: 0,
|
||||||
ENV: 1,
|
ENV: 1,
|
||||||
FOO: 2,
|
FOO: 2,
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var ENV = 3;
|
var ENV = 3;
|
||||||
@@ -60,11 +64,11 @@ mixed: {
|
|||||||
x = 0;
|
x = 0;
|
||||||
}
|
}
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
'WARN: global_defs ENV redefined [test/compress/issue-208.js:41,12]',
|
"WARN: global_defs ENV redefined [test/compress/issue-208.js:1,12]",
|
||||||
'WARN: global_defs FOO redefined [test/compress/issue-208.js:42,12]',
|
"WARN: global_defs FOO redefined [test/compress/issue-208.js:2,12]",
|
||||||
'WARN: global_defs FOO redefined [test/compress/issue-208.js:44,10]',
|
"WARN: global_defs FOO redefined [test/compress/issue-208.js:4,10]",
|
||||||
'WARN: global_defs DEBUG redefined [test/compress/issue-208.js:45,8]',
|
"WARN: global_defs DEBUG redefined [test/compress/issue-208.js:5,8]",
|
||||||
'WARN: global_defs DEBUG redefined [test/compress/issue-208.js:46,8]',
|
"WARN: global_defs DEBUG redefined [test/compress/issue-208.js:6,8]",
|
||||||
'WARN: global_defs DEBUG redefined [test/compress/issue-208.js:47,8]',
|
"WARN: global_defs DEBUG redefined [test/compress/issue-208.js:7,8]",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
return_with_no_value_in_if_body: {
|
return_with_no_value_in_if_body: {
|
||||||
options = { conditionals: true };
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
function foo(bar) {
|
function foo(bar) {
|
||||||
if (bar) {
|
if (bar) {
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
issue_267: {
|
issue_267: {
|
||||||
options = { comparisons: true };
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
x = a % b / b * c * 2;
|
x = a % b / b * c * 2;
|
||||||
x = a % b * 2
|
x = a % b * 2
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
issue_269_1: {
|
issue_269_1: {
|
||||||
options = {unsafe: true};
|
options = {
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
f(
|
f(
|
||||||
String(x),
|
String(x),
|
||||||
@@ -20,7 +22,9 @@ issue_269_1: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
issue_269_dangers: {
|
issue_269_dangers: {
|
||||||
options = {unsafe: true};
|
options = {
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
f(
|
f(
|
||||||
String(x, x),
|
String(x, x),
|
||||||
@@ -34,7 +38,9 @@ issue_269_dangers: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
issue_269_in_scope: {
|
issue_269_in_scope: {
|
||||||
options = {unsafe: true};
|
options = {
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
var String, Number, Boolean;
|
var String, Number, Boolean;
|
||||||
f(
|
f(
|
||||||
@@ -50,7 +56,9 @@ issue_269_in_scope: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
strings_concat: {
|
strings_concat: {
|
||||||
options = {unsafe: true};
|
options = {
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
f(
|
f(
|
||||||
String(x + 'str'),
|
String(x + 'str'),
|
||||||
@@ -67,9 +75,9 @@ strings_concat: {
|
|||||||
|
|
||||||
regexp: {
|
regexp: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
unsafe: true,
|
unsafe: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
RegExp("foo");
|
RegExp("foo");
|
||||||
RegExp("bar", "ig");
|
RegExp("bar", "ig");
|
||||||
@@ -85,6 +93,6 @@ regexp: {
|
|||||||
RegExp("should", "fail");
|
RegExp("should", "fail");
|
||||||
}
|
}
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
'WARN: Error converting RegExp("should","fail") [test/compress/issue-269.js:78,2]',
|
'WARN: Error converting RegExp("should","fail") [test/compress/issue-269.js:5,2]',
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ warn: {
|
|||||||
}().length);
|
}().length);
|
||||||
}
|
}
|
||||||
expect_warnings: [
|
expect_warnings: [
|
||||||
"WARN: Function.protoype.caller not supported [test/compress/issue-2719.js:17,19]",
|
"WARN: Function.protoype.caller not supported [test/compress/issue-2719.js:5,19]",
|
||||||
"WARN: Function.protoype.arguments not supported [test/compress/issue-2719.js:17,19]",
|
"WARN: Function.protoype.arguments not supported [test/compress/issue-2719.js:5,19]",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -186,7 +186,7 @@ negate_iife_5_off: {
|
|||||||
inline: true,
|
inline: true,
|
||||||
negate_iife: false,
|
negate_iife: false,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
if ((function(){ return t })()) {
|
if ((function(){ return t })()) {
|
||||||
foo(true);
|
foo(true);
|
||||||
@@ -245,7 +245,7 @@ negate_iife_issue_1073: {
|
|||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
new (function(a) {
|
new (function(a) {
|
||||||
return function Foo() {
|
return function Foo() {
|
||||||
@@ -273,7 +273,7 @@ issue_1288_side_effects: {
|
|||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
if (w) ;
|
if (w) ;
|
||||||
else {
|
else {
|
||||||
@@ -399,7 +399,7 @@ wrap_iife_in_expression: {
|
|||||||
wrap_iife: true,
|
wrap_iife: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
foo = (function () {
|
foo = (function() {
|
||||||
return bar();
|
return bar();
|
||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
issue_44_valid_ast_1: {
|
issue_44_valid_ast_1: {
|
||||||
options = { unused: true };
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
function a(b) {
|
function a(b) {
|
||||||
for (var i = 0, e = b.qoo(); ; i++) {}
|
for (var i = 0, e = b.qoo(); ; i++) {}
|
||||||
@@ -14,7 +16,9 @@ issue_44_valid_ast_1: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
issue_44_valid_ast_2: {
|
issue_44_valid_ast_2: {
|
||||||
options = { unused: true };
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
function a(b) {
|
function a(b) {
|
||||||
if (foo) for (var i = 0, e = b.qoo(); ; i++) {}
|
if (foo) for (var i = 0, e = b.qoo(); ; i++) {}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
keep_continue: {
|
keep_continue: {
|
||||||
options = {
|
options = {
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
evaluate: true
|
evaluate: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
while (a) {
|
while (a) {
|
||||||
if (b) {
|
if (b) {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
NaN_and_Infinity_must_have_parens: {
|
NaN_and_Infinity_must_have_parens: {
|
||||||
options = {};
|
options = {}
|
||||||
input: {
|
input: {
|
||||||
Infinity.toString();
|
Infinity.toString();
|
||||||
NaN.toString();
|
NaN.toString();
|
||||||
@@ -11,7 +11,7 @@ NaN_and_Infinity_must_have_parens: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
NaN_and_Infinity_should_not_be_replaced_when_they_are_redefined: {
|
NaN_and_Infinity_should_not_be_replaced_when_they_are_redefined: {
|
||||||
options = {};
|
options = {}
|
||||||
input: {
|
input: {
|
||||||
var Infinity, NaN;
|
var Infinity, NaN;
|
||||||
Infinity.toString();
|
Infinity.toString();
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
issue_611: {
|
issue_611: {
|
||||||
options = {
|
options = {
|
||||||
sequences: true,
|
sequences: true,
|
||||||
side_effects: true
|
side_effects: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
define(function() {
|
define(function() {
|
||||||
function fn() {}
|
function fn() {}
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
wrongly_optimized: {
|
wrongly_optimized: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
|
||||||
booleans: true,
|
booleans: true,
|
||||||
evaluate: true
|
conditionals: true,
|
||||||
};
|
evaluate: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
function func() {
|
function func() {
|
||||||
foo();
|
foo();
|
||||||
|
|||||||
@@ -28,12 +28,12 @@ cond_5: {
|
|||||||
|
|
||||||
dead_code_const_annotation_regex: {
|
dead_code_const_annotation_regex: {
|
||||||
options = {
|
options = {
|
||||||
booleans : true,
|
booleans: true,
|
||||||
conditionals : true,
|
conditionals: true,
|
||||||
dead_code : true,
|
dead_code: true,
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
expression : true,
|
expression: true,
|
||||||
loops : true,
|
loops: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var unused;
|
var unused;
|
||||||
@@ -82,8 +82,8 @@ drop_value: {
|
|||||||
|
|
||||||
wrongly_optimized: {
|
wrongly_optimized: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
|
||||||
booleans: true,
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
expression: true,
|
expression: true,
|
||||||
}
|
}
|
||||||
@@ -195,7 +195,7 @@ negate_iife_5_off: {
|
|||||||
expression: true,
|
expression: true,
|
||||||
negate_iife: false,
|
negate_iife: false,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
if ((function(){ return t })()) {
|
if ((function(){ return t })()) {
|
||||||
foo(true);
|
foo(true);
|
||||||
@@ -248,7 +248,9 @@ issue_1254_negate_iife_nested: {
|
|||||||
conditional: {
|
conditional: {
|
||||||
options = {
|
options = {
|
||||||
expression: true,
|
expression: true,
|
||||||
pure_funcs: [ "pure" ],
|
pure_funcs: [
|
||||||
|
"pure"
|
||||||
|
],
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
negate_booleans_1: {
|
negate_booleans_1: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true
|
comparisons: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
var a = !a || !b || !c || !d || !e || !f;
|
var a = !a || !b || !c || !d || !e || !f;
|
||||||
}
|
}
|
||||||
@@ -12,8 +12,8 @@ negate_booleans_1: {
|
|||||||
|
|
||||||
negate_booleans_2: {
|
negate_booleans_2: {
|
||||||
options = {
|
options = {
|
||||||
comparisons: true
|
comparisons: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
var match = !x && // should not touch this one
|
var match = !x && // should not touch this one
|
||||||
(!z || c) &&
|
(!z || c) &&
|
||||||
|
|||||||
@@ -2,25 +2,25 @@ dont_mangle_arguments: {
|
|||||||
mangle = {
|
mangle = {
|
||||||
};
|
};
|
||||||
options = {
|
options = {
|
||||||
sequences : true,
|
booleans: true,
|
||||||
properties : true,
|
comparisons: true,
|
||||||
dead_code : true,
|
conditionals: true,
|
||||||
drop_debugger : true,
|
dead_code: true,
|
||||||
conditionals : true,
|
drop_debugger: true,
|
||||||
comparisons : true,
|
evaluate: true,
|
||||||
evaluate : true,
|
hoist_funs: true,
|
||||||
booleans : true,
|
hoist_vars: true,
|
||||||
loops : true,
|
if_return: true,
|
||||||
unused : true,
|
join_vars: true,
|
||||||
hoist_funs : true,
|
keep_fargs: true,
|
||||||
keep_fargs : true,
|
keep_fnames: false,
|
||||||
keep_fnames : false,
|
loops: true,
|
||||||
hoist_vars : true,
|
negate_iife: false,
|
||||||
if_return : true,
|
properties: true,
|
||||||
join_vars : true,
|
sequences: true,
|
||||||
side_effects : true,
|
side_effects: true,
|
||||||
negate_iife : false
|
unused: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
(function(){
|
(function(){
|
||||||
var arguments = arguments, not_arguments = 9;
|
var arguments = arguments, not_arguments = 9;
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
keep_var_for_in: {
|
keep_var_for_in: {
|
||||||
options = {
|
options = {
|
||||||
hoist_vars: true,
|
hoist_vars: true,
|
||||||
unused: true
|
unused: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
(function(obj){
|
(function(obj){
|
||||||
var foo = 5;
|
var foo = 5;
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ this_binding_collapse_vars: {
|
|||||||
|
|
||||||
this_binding_side_effects: {
|
this_binding_side_effects: {
|
||||||
options = {
|
options = {
|
||||||
side_effects : true
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
(function(foo) {
|
(function(foo) {
|
||||||
|
|||||||
@@ -1,9 +1,21 @@
|
|||||||
eval_collapse_vars: {
|
eval_collapse_vars: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars:true, sequences:false, properties:true, dead_code:true, conditionals:true,
|
booleans: true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
collapse_vars: true,
|
||||||
keep_fargs:true, if_return:true, join_vars:true, side_effects:true
|
comparisons: true,
|
||||||
};
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
properties: true,
|
||||||
|
sequences: false,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
function f1() {
|
function f1() {
|
||||||
var e = 7;
|
var e = 7;
|
||||||
@@ -46,7 +58,10 @@ eval_collapse_vars: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
eval_unused: {
|
eval_unused: {
|
||||||
options = { unused: true, keep_fargs: false };
|
options = {
|
||||||
|
keep_fargs: false,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
function f1(a, eval, c, d, e) {
|
function f1(a, eval, c, d, e) {
|
||||||
return a('c') + eval;
|
return a('c') + eval;
|
||||||
|
|||||||
@@ -1,8 +1,19 @@
|
|||||||
issue979_reported: {
|
issue979_reported: {
|
||||||
options = {
|
options = {
|
||||||
sequences:true, properties:true, dead_code:true, conditionals:true,
|
booleans: true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
comparisons: true,
|
||||||
keep_fargs:true, if_return:true, join_vars:true, side_effects:true
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
properties: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f1() {
|
function f1() {
|
||||||
@@ -30,9 +41,20 @@ issue979_reported: {
|
|||||||
|
|
||||||
issue979_test_negated_is_best: {
|
issue979_test_negated_is_best: {
|
||||||
options = {
|
options = {
|
||||||
sequences:true, properties:true, dead_code:true, conditionals:true,
|
booleans: true,
|
||||||
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
comparisons: true,
|
||||||
keep_fargs:true, if_return:true, join_vars:true, side_effects:true
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
loops: true,
|
||||||
|
properties: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f3() {
|
function f3() {
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
labels_1: {
|
labels_1: {
|
||||||
options = { if_return: true, conditionals: true, dead_code: true };
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
out: {
|
out: {
|
||||||
if (foo) break out;
|
if (foo) break out;
|
||||||
@@ -13,7 +17,11 @@ labels_1: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
labels_2: {
|
labels_2: {
|
||||||
options = { if_return: true, conditionals: true, dead_code: true };
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
out: {
|
out: {
|
||||||
if (foo) print("stuff");
|
if (foo) print("stuff");
|
||||||
@@ -30,7 +38,11 @@ labels_2: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
labels_3: {
|
labels_3: {
|
||||||
options = { if_return: true, conditionals: true, dead_code: true };
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
for (var i = 0; i < 5; ++i) {
|
for (var i = 0; i < 5; ++i) {
|
||||||
if (i < 3) continue;
|
if (i < 3) continue;
|
||||||
@@ -45,7 +57,11 @@ labels_3: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
labels_4: {
|
labels_4: {
|
||||||
options = { if_return: true, conditionals: true, dead_code: true };
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
out: for (var i = 0; i < 5; ++i) {
|
out: for (var i = 0; i < 5; ++i) {
|
||||||
if (i < 3) continue out;
|
if (i < 3) continue out;
|
||||||
@@ -60,7 +76,11 @@ labels_4: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
labels_5: {
|
labels_5: {
|
||||||
options = { if_return: true, conditionals: true, dead_code: true };
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
// should keep the break-s in the following
|
// should keep the break-s in the following
|
||||||
input: {
|
input: {
|
||||||
while (foo) {
|
while (foo) {
|
||||||
@@ -92,7 +112,11 @@ labels_6: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
labels_7: {
|
labels_7: {
|
||||||
options = { if_return: true, conditionals: true, dead_code: true };
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
while (foo) {
|
while (foo) {
|
||||||
x();
|
x();
|
||||||
@@ -109,7 +133,11 @@ labels_7: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
labels_8: {
|
labels_8: {
|
||||||
options = { if_return: true, conditionals: true, dead_code: true };
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
while (foo) {
|
while (foo) {
|
||||||
x();
|
x();
|
||||||
@@ -127,7 +155,11 @@ labels_8: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
labels_9: {
|
labels_9: {
|
||||||
options = { if_return: true, conditionals: true, dead_code: true };
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
out: while (foo) {
|
out: while (foo) {
|
||||||
x();
|
x();
|
||||||
@@ -146,7 +178,11 @@ labels_9: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
labels_10: {
|
labels_10: {
|
||||||
options = { if_return: true, conditionals: true, dead_code: true };
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
out: while (foo) {
|
out: while (foo) {
|
||||||
x();
|
x();
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
while_becomes_for: {
|
while_becomes_for: {
|
||||||
options = { loops: true };
|
options = {
|
||||||
|
loops: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
while (foo()) bar();
|
while (foo()) bar();
|
||||||
}
|
}
|
||||||
@@ -9,7 +11,9 @@ while_becomes_for: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
drop_if_break_1: {
|
drop_if_break_1: {
|
||||||
options = { loops: true };
|
options = {
|
||||||
|
loops: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
for (;;)
|
for (;;)
|
||||||
if (foo()) break;
|
if (foo()) break;
|
||||||
@@ -20,7 +24,9 @@ drop_if_break_1: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
drop_if_break_2: {
|
drop_if_break_2: {
|
||||||
options = { loops: true };
|
options = {
|
||||||
|
loops: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
for (;bar();)
|
for (;bar();)
|
||||||
if (foo()) break;
|
if (foo()) break;
|
||||||
@@ -31,7 +37,9 @@ drop_if_break_2: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
drop_if_break_3: {
|
drop_if_break_3: {
|
||||||
options = { loops: true };
|
options = {
|
||||||
|
loops: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
for (;bar();) {
|
for (;bar();) {
|
||||||
if (foo()) break;
|
if (foo()) break;
|
||||||
@@ -48,7 +56,10 @@ drop_if_break_3: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
drop_if_break_4: {
|
drop_if_break_4: {
|
||||||
options = { loops: true, sequences: true };
|
options = {
|
||||||
|
loops: true,
|
||||||
|
sequences: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
for (;bar();) {
|
for (;bar();) {
|
||||||
x();
|
x();
|
||||||
@@ -64,7 +75,9 @@ drop_if_break_4: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
drop_if_else_break_1: {
|
drop_if_else_break_1: {
|
||||||
options = { loops: true };
|
options = {
|
||||||
|
loops: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
for (;;) if (foo()) bar(); else break;
|
for (;;) if (foo()) bar(); else break;
|
||||||
}
|
}
|
||||||
@@ -74,7 +87,9 @@ drop_if_else_break_1: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
drop_if_else_break_2: {
|
drop_if_else_break_2: {
|
||||||
options = { loops: true };
|
options = {
|
||||||
|
loops: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
for (;bar();) {
|
for (;bar();) {
|
||||||
if (foo()) baz();
|
if (foo()) baz();
|
||||||
@@ -87,7 +102,9 @@ drop_if_else_break_2: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
drop_if_else_break_3: {
|
drop_if_else_break_3: {
|
||||||
options = { loops: true };
|
options = {
|
||||||
|
loops: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
for (;bar();) {
|
for (;bar();) {
|
||||||
if (foo()) baz();
|
if (foo()) baz();
|
||||||
@@ -106,7 +123,10 @@ drop_if_else_break_3: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
drop_if_else_break_4: {
|
drop_if_else_break_4: {
|
||||||
options = { loops: true, sequences: true };
|
options = {
|
||||||
|
loops: true,
|
||||||
|
sequences: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
for (;bar();) {
|
for (;bar();) {
|
||||||
x();
|
x();
|
||||||
@@ -123,7 +143,9 @@ drop_if_else_break_4: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
parse_do_while_with_semicolon: {
|
parse_do_while_with_semicolon: {
|
||||||
options = { loops: false };
|
options = {
|
||||||
|
loops: false,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
do {
|
do {
|
||||||
x();
|
x();
|
||||||
@@ -135,7 +157,9 @@ parse_do_while_with_semicolon: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
parse_do_while_without_semicolon: {
|
parse_do_while_without_semicolon: {
|
||||||
options = { loops: false };
|
options = {
|
||||||
|
loops: false,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
do {
|
do {
|
||||||
x();
|
x();
|
||||||
@@ -153,7 +177,7 @@ evaluate: {
|
|||||||
loops: true,
|
loops: true,
|
||||||
passes: 2,
|
passes: 2,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
while (true) {
|
while (true) {
|
||||||
a();
|
a();
|
||||||
@@ -457,7 +481,7 @@ init_side_effects: {
|
|||||||
options = {
|
options = {
|
||||||
loops: true,
|
loops: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
for (function() {}(), i = 0; i < 5; i++) console.log(i);
|
for (function() {}(), i = 0; i < 5; i++) console.log(i);
|
||||||
for (function() {}(); i < 10; i++) console.log(i);
|
for (function() {}(); i < 10; i++) console.log(i);
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
negate_iife_1: {
|
negate_iife_1: {
|
||||||
options = {
|
options = {
|
||||||
negate_iife: true
|
negate_iife: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
(function(){ stuff() })();
|
(function(){ stuff() })();
|
||||||
}
|
}
|
||||||
@@ -13,7 +13,7 @@ negate_iife_1: {
|
|||||||
negate_iife_1_off: {
|
negate_iife_1_off: {
|
||||||
options = {
|
options = {
|
||||||
negate_iife: false,
|
negate_iife: false,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
(function(){ stuff() })();
|
(function(){ stuff() })();
|
||||||
}
|
}
|
||||||
@@ -24,7 +24,7 @@ negate_iife_2: {
|
|||||||
options = {
|
options = {
|
||||||
inline: true,
|
inline: true,
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
(function(){ return {} })().x = 10;
|
(function(){ return {} })().x = 10;
|
||||||
}
|
}
|
||||||
@@ -45,9 +45,9 @@ negate_iife_2_side_effects: {
|
|||||||
|
|
||||||
negate_iife_3: {
|
negate_iife_3: {
|
||||||
options = {
|
options = {
|
||||||
|
conditionals: true,
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
conditionals: true
|
}
|
||||||
};
|
|
||||||
input: {
|
input: {
|
||||||
(function(){ return t })() ? console.log(true) : console.log(false);
|
(function(){ return t })() ? console.log(true) : console.log(false);
|
||||||
}
|
}
|
||||||
@@ -88,9 +88,9 @@ negate_iife_3_side_effects: {
|
|||||||
|
|
||||||
negate_iife_3_off: {
|
negate_iife_3_off: {
|
||||||
options = {
|
options = {
|
||||||
negate_iife: false,
|
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
};
|
negate_iife: false,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
(function(){ return t })() ? console.log(true) : console.log(false);
|
(function(){ return t })() ? console.log(true) : console.log(false);
|
||||||
}
|
}
|
||||||
@@ -117,10 +117,10 @@ negate_iife_3_off_evaluate: {
|
|||||||
|
|
||||||
negate_iife_4: {
|
negate_iife_4: {
|
||||||
options = {
|
options = {
|
||||||
negate_iife: true,
|
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
sequences: true
|
negate_iife: true,
|
||||||
};
|
sequences: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
(function(){ return t })() ? console.log(true) : console.log(false);
|
(function(){ return t })() ? console.log(true) : console.log(false);
|
||||||
(function(){
|
(function(){
|
||||||
@@ -136,11 +136,11 @@ negate_iife_4: {
|
|||||||
|
|
||||||
sequence_off: {
|
sequence_off: {
|
||||||
options = {
|
options = {
|
||||||
negate_iife: false,
|
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
sequences: true,
|
negate_iife: false,
|
||||||
passes: 2,
|
passes: 2,
|
||||||
};
|
sequences: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
function f() {
|
function f() {
|
||||||
(function(){ return t })() ? console.log(true) : console.log(false);
|
(function(){ return t })() ? console.log(true) : console.log(false);
|
||||||
@@ -171,10 +171,10 @@ sequence_off: {
|
|||||||
|
|
||||||
negate_iife_5: {
|
negate_iife_5: {
|
||||||
options = {
|
options = {
|
||||||
|
conditionals: true,
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
conditionals: true,
|
}
|
||||||
};
|
|
||||||
input: {
|
input: {
|
||||||
if ((function(){ return t })()) {
|
if ((function(){ return t })()) {
|
||||||
foo(true);
|
foo(true);
|
||||||
@@ -194,10 +194,10 @@ negate_iife_5: {
|
|||||||
|
|
||||||
negate_iife_5_off: {
|
negate_iife_5_off: {
|
||||||
options = {
|
options = {
|
||||||
|
conditionals: true,
|
||||||
negate_iife: false,
|
negate_iife: false,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
conditionals: true,
|
}
|
||||||
};
|
|
||||||
input: {
|
input: {
|
||||||
if ((function(){ return t })()) {
|
if ((function(){ return t })()) {
|
||||||
foo(true);
|
foo(true);
|
||||||
@@ -217,10 +217,10 @@ negate_iife_5_off: {
|
|||||||
|
|
||||||
negate_iife_nested: {
|
negate_iife_nested: {
|
||||||
options = {
|
options = {
|
||||||
|
conditionals: true,
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
conditionals: true,
|
}
|
||||||
};
|
|
||||||
input: {
|
input: {
|
||||||
function Foo(f) {
|
function Foo(f) {
|
||||||
this.f = f;
|
this.f = f;
|
||||||
@@ -250,10 +250,10 @@ negate_iife_nested: {
|
|||||||
|
|
||||||
negate_iife_nested_off: {
|
negate_iife_nested_off: {
|
||||||
options = {
|
options = {
|
||||||
|
conditionals: true,
|
||||||
negate_iife: false,
|
negate_iife: false,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
conditionals: true,
|
}
|
||||||
};
|
|
||||||
input: {
|
input: {
|
||||||
function Foo(f) {
|
function Foo(f) {
|
||||||
this.f = f;
|
this.f = f;
|
||||||
@@ -283,10 +283,10 @@ negate_iife_nested_off: {
|
|||||||
|
|
||||||
negate_iife_issue_1073: {
|
negate_iife_issue_1073: {
|
||||||
options = {
|
options = {
|
||||||
|
conditionals: true,
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
conditionals: true,
|
}
|
||||||
};
|
|
||||||
input: {
|
input: {
|
||||||
new (function(a) {
|
new (function(a) {
|
||||||
return function Foo() {
|
return function Foo() {
|
||||||
@@ -356,7 +356,7 @@ issue_1288: {
|
|||||||
conditionals: true,
|
conditionals: true,
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
side_effects: false,
|
side_effects: false,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
if (w) ;
|
if (w) ;
|
||||||
else {
|
else {
|
||||||
|
|||||||
@@ -36,7 +36,9 @@ new_statements_3: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
new_with_rewritten_true_value: {
|
new_with_rewritten_true_value: {
|
||||||
options = { booleans: true }
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
new true;
|
new true;
|
||||||
}
|
}
|
||||||
|
|||||||
181
test/compress/preserve_line.js
Normal file
181
test/compress/preserve_line.js
Normal file
@@ -0,0 +1,181 @@
|
|||||||
|
return_1: {
|
||||||
|
beautify = {
|
||||||
|
beautify: false,
|
||||||
|
preserve_line: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function f() {
|
||||||
|
return (
|
||||||
|
f.toString() != 42
|
||||||
|
);
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"console.log(function f(){",
|
||||||
|
"",
|
||||||
|
"return 42!=f.toString()}());",
|
||||||
|
]
|
||||||
|
expect_stdout: "true"
|
||||||
|
}
|
||||||
|
|
||||||
|
return_2: {
|
||||||
|
beautify = {
|
||||||
|
beautify: true,
|
||||||
|
preserve_line: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function f() {
|
||||||
|
return (
|
||||||
|
f.toString() != 42
|
||||||
|
);
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"console.log(function f() {",
|
||||||
|
"",
|
||||||
|
" return 42 != f.toString();",
|
||||||
|
"}());",
|
||||||
|
]
|
||||||
|
expect_stdout: "true"
|
||||||
|
}
|
||||||
|
|
||||||
|
return_3: {
|
||||||
|
options = {}
|
||||||
|
beautify = {
|
||||||
|
beautify: false,
|
||||||
|
preserve_line: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function f() {
|
||||||
|
return (
|
||||||
|
f.toString() != 42
|
||||||
|
);
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"console.log(function f(){",
|
||||||
|
"",
|
||||||
|
"return 42!=f.toString()}());",
|
||||||
|
]
|
||||||
|
expect_stdout: "true"
|
||||||
|
}
|
||||||
|
|
||||||
|
return_4: {
|
||||||
|
options = {}
|
||||||
|
beautify = {
|
||||||
|
beautify: true,
|
||||||
|
preserve_line: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function f() {
|
||||||
|
return (
|
||||||
|
f.toString() != 42
|
||||||
|
);
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"console.log(function f() {",
|
||||||
|
"",
|
||||||
|
" return 42 != f.toString();",
|
||||||
|
"}());",
|
||||||
|
]
|
||||||
|
expect_stdout: "true"
|
||||||
|
}
|
||||||
|
|
||||||
|
return_5: {
|
||||||
|
beautify = {
|
||||||
|
beautify: false,
|
||||||
|
preserve_line: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
_is_selected = function(tags, slug) {
|
||||||
|
var ref;
|
||||||
|
return (ref = _.find(tags, {
|
||||||
|
slug: slug
|
||||||
|
})) != null ? ref.selected : void 0;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"_is_selected=function(tags,slug){",
|
||||||
|
"var ref",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
";return null!=(ref=_.find(tags,{slug:slug}))?ref.selected:void 0};",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
return_6: {
|
||||||
|
beautify = {
|
||||||
|
beautify: true,
|
||||||
|
preserve_line: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
_is_selected = function(tags, slug) {
|
||||||
|
var ref;
|
||||||
|
return (ref = _.find(tags, {
|
||||||
|
slug: slug
|
||||||
|
})) != null ? ref.selected : void 0;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"_is_selected = function(tags, slug) {",
|
||||||
|
" var ref;",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
" return null != (ref = _.find(tags, {",
|
||||||
|
" slug: slug",
|
||||||
|
" })) ? ref.selected : void 0;",
|
||||||
|
"};",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
return_7: {
|
||||||
|
options = {}
|
||||||
|
mangle = {}
|
||||||
|
beautify = {
|
||||||
|
beautify: false,
|
||||||
|
preserve_line: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
_is_selected = function(tags, slug) {
|
||||||
|
var ref;
|
||||||
|
return (ref = _.find(tags, {
|
||||||
|
slug: slug
|
||||||
|
})) != null ? ref.selected : void 0;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"_is_selected=function(e,l){",
|
||||||
|
"var n",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
";return null!=(n=_.find(e,{slug:l}))?n.selected:void 0};",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
return_8: {
|
||||||
|
options = {}
|
||||||
|
mangle = {}
|
||||||
|
beautify = {
|
||||||
|
beautify: true,
|
||||||
|
preserve_line: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
_is_selected = function(tags, slug) {
|
||||||
|
var ref;
|
||||||
|
return (ref = _.find(tags, {
|
||||||
|
slug: slug
|
||||||
|
})) != null ? ref.selected : void 0;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"_is_selected = function(e, l) {",
|
||||||
|
" var n;",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
" return null != (n = _.find(e, {",
|
||||||
|
" slug: l",
|
||||||
|
" })) ? n.selected : void 0;",
|
||||||
|
"};",
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -1729,3 +1729,136 @@ issue_869_2: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_3188_1: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
inline: true,
|
||||||
|
properties: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
function f() {
|
||||||
|
console.log(this.p);
|
||||||
|
}
|
||||||
|
(function() {
|
||||||
|
var o = {
|
||||||
|
p: "PASS",
|
||||||
|
f: f
|
||||||
|
};
|
||||||
|
o.f();
|
||||||
|
})();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function() {
|
||||||
|
function f() {
|
||||||
|
console.log(this.p);
|
||||||
|
}
|
||||||
|
({
|
||||||
|
p: "PASS",
|
||||||
|
f: f
|
||||||
|
}).f();
|
||||||
|
var o;
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3188_2: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
inline: true,
|
||||||
|
properties: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
var f = function() {
|
||||||
|
console.log(this.p);
|
||||||
|
};
|
||||||
|
function g() {
|
||||||
|
var o = {
|
||||||
|
p: "PASS",
|
||||||
|
f: f
|
||||||
|
};
|
||||||
|
o.f();
|
||||||
|
}
|
||||||
|
g();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
({
|
||||||
|
p: "PASS",
|
||||||
|
f: function() {
|
||||||
|
console.log(this.p);
|
||||||
|
}
|
||||||
|
}).f();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3188_3: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
inline: true,
|
||||||
|
properties: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
function f() {
|
||||||
|
console.log(this[0]);
|
||||||
|
}
|
||||||
|
(function() {
|
||||||
|
var o = ["PASS", f];
|
||||||
|
o[1]();
|
||||||
|
})();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function() {
|
||||||
|
function f() {
|
||||||
|
console.log(this[0]);
|
||||||
|
}
|
||||||
|
["PASS", f][1]();
|
||||||
|
var o;
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
join_expr: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
join_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var c = "FAIL";
|
||||||
|
(function() {
|
||||||
|
var a = 0;
|
||||||
|
switch ((a = {}) && (a.b = 0)) {
|
||||||
|
case 0:
|
||||||
|
c = "PASS";
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var c = "FAIL";
|
||||||
|
(function() {
|
||||||
|
var a = 0;
|
||||||
|
switch (a = { b: 0 }, a.b) {
|
||||||
|
case 0:
|
||||||
|
c = "PASS";
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|||||||
@@ -187,10 +187,10 @@ issue_2110_1: {
|
|||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
pure_getters: "strict",
|
pure_getters: "strict",
|
||||||
sequences: true,
|
|
||||||
side_effects: true,
|
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
reduce_vars: {
|
reduce_vars: {
|
||||||
options = {
|
options = {
|
||||||
conditionals : true,
|
conditionals: true,
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
inline : true,
|
global_defs: {
|
||||||
global_defs : {
|
C: 0,
|
||||||
C : 0
|
|
||||||
},
|
},
|
||||||
reduce_funcs : true,
|
inline: true,
|
||||||
reduce_vars : true,
|
reduce_funcs: true,
|
||||||
toplevel : true,
|
reduce_vars: true,
|
||||||
unused : true
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var A = 1;
|
var A = 1;
|
||||||
@@ -63,11 +63,11 @@ reduce_vars: {
|
|||||||
|
|
||||||
modified: {
|
modified: {
|
||||||
options = {
|
options = {
|
||||||
conditionals : true,
|
conditionals: true,
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
reduce_funcs : true,
|
reduce_funcs: true,
|
||||||
reduce_vars : true,
|
reduce_vars: true,
|
||||||
unused : true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f0() {
|
function f0() {
|
||||||
@@ -184,12 +184,12 @@ modified: {
|
|||||||
|
|
||||||
unsafe_evaluate: {
|
unsafe_evaluate: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
reduce_funcs : true,
|
reduce_funcs: true,
|
||||||
reduce_vars : true,
|
reduce_vars: true,
|
||||||
side_effects : true,
|
side_effects: true,
|
||||||
unsafe : true,
|
unsafe: true,
|
||||||
unused : true
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f0(){
|
function f0(){
|
||||||
@@ -344,10 +344,10 @@ unsafe_evaluate_unknown: {
|
|||||||
|
|
||||||
unsafe_evaluate_object_1: {
|
unsafe_evaluate_object_1: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
reduce_funcs : true,
|
reduce_funcs: true,
|
||||||
reduce_vars : true,
|
reduce_vars: true,
|
||||||
unsafe : true
|
unsafe: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f0(){
|
function f0(){
|
||||||
@@ -463,10 +463,10 @@ unsafe_evaluate_object_3: {
|
|||||||
|
|
||||||
unsafe_evaluate_array_1: {
|
unsafe_evaluate_array_1: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
reduce_funcs : true,
|
reduce_funcs: true,
|
||||||
reduce_vars : true,
|
reduce_vars: true,
|
||||||
unsafe : true
|
unsafe: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f0(){
|
function f0(){
|
||||||
@@ -642,11 +642,11 @@ unsafe_evaluate_array_5: {
|
|||||||
|
|
||||||
unsafe_evaluate_equality_1: {
|
unsafe_evaluate_equality_1: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
reduce_funcs : true,
|
reduce_funcs: true,
|
||||||
reduce_vars : true,
|
reduce_vars: true,
|
||||||
unsafe : true,
|
unsafe: true,
|
||||||
unused : true
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f0() {
|
function f0() {
|
||||||
@@ -674,12 +674,12 @@ unsafe_evaluate_equality_1: {
|
|||||||
unsafe_evaluate_equality_2: {
|
unsafe_evaluate_equality_2: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
passes : 2,
|
passes: 2,
|
||||||
reduce_funcs : true,
|
reduce_funcs: true,
|
||||||
reduce_vars : true,
|
reduce_vars: true,
|
||||||
unsafe : true,
|
unsafe: true,
|
||||||
unused : true
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function f2() {
|
function f2() {
|
||||||
@@ -1130,7 +1130,7 @@ toplevel_on: {
|
|||||||
evaluate: true,
|
evaluate: true,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
toplevel:true,
|
toplevel: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -1148,7 +1148,7 @@ toplevel_off: {
|
|||||||
evaluate: true,
|
evaluate: true,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
toplevel:false,
|
toplevel: false,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -1168,7 +1168,7 @@ toplevel_on_loops_1: {
|
|||||||
loops: true,
|
loops: true,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
toplevel:true,
|
toplevel: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -1196,7 +1196,7 @@ toplevel_off_loops_1: {
|
|||||||
loops: true,
|
loops: true,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
toplevel:false,
|
toplevel: false,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -1225,7 +1225,7 @@ toplevel_on_loops_2: {
|
|||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
toplevel:true,
|
toplevel: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -1251,7 +1251,7 @@ toplevel_off_loops_2: {
|
|||||||
loops: true,
|
loops: true,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
toplevel:false,
|
toplevel: false,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -1278,7 +1278,7 @@ toplevel_on_loops_3: {
|
|||||||
loops: true,
|
loops: true,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
toplevel:true,
|
toplevel: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -1296,7 +1296,7 @@ toplevel_off_loops_3: {
|
|||||||
loops: true,
|
loops: true,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
toplevel:false,
|
toplevel: false,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -1560,6 +1560,32 @@ func_modified: {
|
|||||||
expect_stdout: "7"
|
expect_stdout: "7"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unused_modified: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
var b = 1, c = "FAIL";
|
||||||
|
if (0 || b--)
|
||||||
|
c = "PASS";
|
||||||
|
b = 1;
|
||||||
|
return c;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function() {
|
||||||
|
var b = 1, c = "FAIL";
|
||||||
|
if (0 || b--)
|
||||||
|
c = "PASS";
|
||||||
|
b = 1;
|
||||||
|
return c;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
defun_label: {
|
defun_label: {
|
||||||
options = {
|
options = {
|
||||||
passes: 2,
|
passes: 2,
|
||||||
@@ -1868,8 +1894,8 @@ issue_1670_1: {
|
|||||||
options = {
|
options = {
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
evaluate: true,
|
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
@@ -1901,8 +1927,8 @@ issue_1670_1: {
|
|||||||
issue_1670_2: {
|
issue_1670_2: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
evaluate: true,
|
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
passes: 2,
|
passes: 2,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
@@ -1934,8 +1960,8 @@ issue_1670_3: {
|
|||||||
options = {
|
options = {
|
||||||
comparisons: true,
|
comparisons: true,
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
evaluate: true,
|
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
@@ -1967,8 +1993,8 @@ issue_1670_3: {
|
|||||||
issue_1670_4: {
|
issue_1670_4: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
evaluate: true,
|
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
passes: 2,
|
passes: 2,
|
||||||
reduce_funcs: true,
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
@@ -4887,7 +4913,7 @@ inverted_var: {
|
|||||||
}(), function(c) {
|
}(), function(c) {
|
||||||
c = 4;
|
c = 4;
|
||||||
return c;
|
return c;
|
||||||
}(), function (c) {
|
}(), function(c) {
|
||||||
c = 5;
|
c = 5;
|
||||||
return c;
|
return c;
|
||||||
var c;
|
var c;
|
||||||
@@ -5205,11 +5231,11 @@ defun_catch_4: {
|
|||||||
try {
|
try {
|
||||||
throw 42;
|
throw 42;
|
||||||
} catch (a) {
|
} catch (a) {
|
||||||
function a() {}
|
|
||||||
console.log(a);
|
console.log(a);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: "42"
|
||||||
|
node_version: "<=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
defun_catch_5: {
|
defun_catch_5: {
|
||||||
@@ -5231,10 +5257,10 @@ defun_catch_5: {
|
|||||||
throw 42;
|
throw 42;
|
||||||
} catch (a) {
|
} catch (a) {
|
||||||
console.log(a);
|
console.log(a);
|
||||||
function a() {}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: "42"
|
||||||
|
node_version: "<=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
defun_catch_6: {
|
defun_catch_6: {
|
||||||
@@ -6178,3 +6204,228 @@ issue_3125: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "7"
|
expect_stdout: "7"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_3140_1: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
var a;
|
||||||
|
function f() {
|
||||||
|
}
|
||||||
|
f.g = function g() {
|
||||||
|
function h() {
|
||||||
|
console.log(a ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
a = true;
|
||||||
|
this();
|
||||||
|
a = false;
|
||||||
|
h.g = g;
|
||||||
|
return h;
|
||||||
|
};
|
||||||
|
return f;
|
||||||
|
})().g().g();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function() {
|
||||||
|
var a;
|
||||||
|
function f() {
|
||||||
|
}
|
||||||
|
f.g = function g() {
|
||||||
|
function h() {
|
||||||
|
console.log(a ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
a = true;
|
||||||
|
this();
|
||||||
|
a = false;
|
||||||
|
h.g = g;
|
||||||
|
return h;
|
||||||
|
};
|
||||||
|
return f;
|
||||||
|
})().g().g();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3140_2: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
var a;
|
||||||
|
function f() {
|
||||||
|
}
|
||||||
|
f.g = function g() {
|
||||||
|
var self = this;
|
||||||
|
function h() {
|
||||||
|
console.log(a ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
a = true;
|
||||||
|
self();
|
||||||
|
a = false;
|
||||||
|
h.g = g;
|
||||||
|
return h;
|
||||||
|
};
|
||||||
|
return f;
|
||||||
|
})().g().g();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function() {
|
||||||
|
var a;
|
||||||
|
function f() {
|
||||||
|
}
|
||||||
|
f.g = function g() {
|
||||||
|
function h() {
|
||||||
|
console.log(a ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
a = true;
|
||||||
|
this();
|
||||||
|
a = false;
|
||||||
|
h.g = g;
|
||||||
|
return h;
|
||||||
|
};
|
||||||
|
return f;
|
||||||
|
})().g().g();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3140_3: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
var a;
|
||||||
|
function f() {
|
||||||
|
}
|
||||||
|
f.g = function g() {
|
||||||
|
var self = this;
|
||||||
|
function h() {
|
||||||
|
console.log(a ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
a = true;
|
||||||
|
(function() {
|
||||||
|
return self;
|
||||||
|
})()();
|
||||||
|
a = false;
|
||||||
|
h.g = g;
|
||||||
|
return h;
|
||||||
|
};
|
||||||
|
return f;
|
||||||
|
})().g().g();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function() {
|
||||||
|
var a;
|
||||||
|
function f() {
|
||||||
|
}
|
||||||
|
f.g = function g() {
|
||||||
|
var self = this;
|
||||||
|
function h() {
|
||||||
|
console.log(a ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
a = true;
|
||||||
|
(function() {
|
||||||
|
return self;
|
||||||
|
})()();
|
||||||
|
a = false;
|
||||||
|
h.g = g;
|
||||||
|
return h;
|
||||||
|
};
|
||||||
|
return f;
|
||||||
|
})().g().g();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3140_4: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
var a;
|
||||||
|
function f() {
|
||||||
|
}
|
||||||
|
f.g = function g() {
|
||||||
|
var o = {
|
||||||
|
p: this
|
||||||
|
};
|
||||||
|
function h() {
|
||||||
|
console.log(a ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
a = true;
|
||||||
|
o.p();
|
||||||
|
a = false;
|
||||||
|
h.g = g;
|
||||||
|
return h;
|
||||||
|
};
|
||||||
|
return f;
|
||||||
|
})().g().g();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function() {
|
||||||
|
var a;
|
||||||
|
function f() {
|
||||||
|
}
|
||||||
|
f.g = function g() {
|
||||||
|
var o = {
|
||||||
|
p: this
|
||||||
|
};
|
||||||
|
function h() {
|
||||||
|
console.log(a ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
a = true;
|
||||||
|
o.p();
|
||||||
|
a = false;
|
||||||
|
h.g = g;
|
||||||
|
return h;
|
||||||
|
};
|
||||||
|
return f;
|
||||||
|
})().g().g();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3140_5: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var n = 1, c = 0;
|
||||||
|
(function(a) {
|
||||||
|
var b = function() {
|
||||||
|
this;
|
||||||
|
n-- && h();
|
||||||
|
}();
|
||||||
|
function h() {
|
||||||
|
b && c++;
|
||||||
|
}
|
||||||
|
h(b = 1);
|
||||||
|
})();
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var n = 1, c = 0;
|
||||||
|
(function(a) {
|
||||||
|
var b = function() {
|
||||||
|
this;
|
||||||
|
n-- && h();
|
||||||
|
}();
|
||||||
|
function h() {
|
||||||
|
b && c++;
|
||||||
|
}
|
||||||
|
h(b = 1);
|
||||||
|
})();
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect_stdout: "1"
|
||||||
|
}
|
||||||
|
|||||||
37
test/compress/regexp.js
Normal file
37
test/compress/regexp.js
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
regexp_simple: {
|
||||||
|
input: {
|
||||||
|
/rx/ig
|
||||||
|
}
|
||||||
|
expect_exact: "/rx/gi;"
|
||||||
|
}
|
||||||
|
|
||||||
|
regexp_slashes: {
|
||||||
|
input: {
|
||||||
|
/\\\/rx\/\\/ig
|
||||||
|
}
|
||||||
|
expect_exact: "/\\\\\\/rx\\/\\\\/gi;"
|
||||||
|
}
|
||||||
|
|
||||||
|
regexp_1: {
|
||||||
|
input: {
|
||||||
|
console.log(JSON.stringify("COMPASS? Overpass.".match(/([Sap]+)/ig)));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(JSON.stringify("COMPASS? Overpass.".match(/([Sap]+)/gi)));
|
||||||
|
}
|
||||||
|
expect_stdout: '["PASS","pass"]'
|
||||||
|
}
|
||||||
|
|
||||||
|
regexp_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(JSON.stringify("COMPASS? Overpass.".match(new RegExp("([Sap]+)", "ig"))));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(JSON.stringify("COMPASS? Overpass.".match(/([Sap]+)/gi)));
|
||||||
|
}
|
||||||
|
expect_stdout: '["PASS","pass"]'
|
||||||
|
}
|
||||||
@@ -534,3 +534,80 @@ function_catch_catch_ie8: {
|
|||||||
"undefined",
|
"undefined",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function_do_catch_ie8: {
|
||||||
|
rename = true
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 1, b = 1, c = 0;
|
||||||
|
function d(e) {
|
||||||
|
var f, g, h, i;
|
||||||
|
do {
|
||||||
|
try {
|
||||||
|
try {
|
||||||
|
var j = function q(){}();
|
||||||
|
} catch (r) {
|
||||||
|
--a && w("ddddddddeeeeeeegggggggggiiiiilllllllnnnnntuuuuuuuuyyyyyyy");
|
||||||
|
var k, l, m, n, o;
|
||||||
|
--m;
|
||||||
|
--n;
|
||||||
|
--o;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
i[1];
|
||||||
|
} catch (s) {
|
||||||
|
var p;
|
||||||
|
switch (function t() {
|
||||||
|
c++;
|
||||||
|
}()) {
|
||||||
|
case j + --p:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (u) {}
|
||||||
|
} while (--i);
|
||||||
|
b--;
|
||||||
|
}
|
||||||
|
d();
|
||||||
|
console.log(b, c);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var t = 1, u = 1, y = 0;
|
||||||
|
function c(c) {
|
||||||
|
var d;
|
||||||
|
do {
|
||||||
|
try {
|
||||||
|
try {
|
||||||
|
var e = void 0;
|
||||||
|
} catch (i) {
|
||||||
|
--t && w("ddddddddeeeeeeegggggggggiiiiilllllllnnnnntuuuuuuuuyyyyyyy");
|
||||||
|
0;
|
||||||
|
0;
|
||||||
|
0;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
d[1];
|
||||||
|
} catch (l) {
|
||||||
|
var g;
|
||||||
|
switch(function x() {
|
||||||
|
y++;
|
||||||
|
}()) {
|
||||||
|
case e + --g:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (n) {}
|
||||||
|
} while (--d);
|
||||||
|
u--;
|
||||||
|
}
|
||||||
|
c();
|
||||||
|
console.log(u, y);
|
||||||
|
}
|
||||||
|
expect_stdout: "0 1"
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,24 +1,24 @@
|
|||||||
return_undefined: {
|
return_undefined: {
|
||||||
options = {
|
options = {
|
||||||
sequences : false,
|
booleans: true,
|
||||||
if_return : true,
|
comparisons: true,
|
||||||
evaluate : true,
|
conditionals: true,
|
||||||
dead_code : true,
|
dead_code: true,
|
||||||
conditionals : true,
|
drop_debugger: true,
|
||||||
comparisons : true,
|
evaluate: true,
|
||||||
booleans : true,
|
hoist_funs: true,
|
||||||
unused : true,
|
hoist_vars: true,
|
||||||
side_effects : true,
|
if_return: true,
|
||||||
properties : true,
|
join_vars: true,
|
||||||
drop_debugger : true,
|
keep_fargs: true,
|
||||||
loops : true,
|
keep_fnames: false,
|
||||||
hoist_funs : true,
|
loops: true,
|
||||||
keep_fargs : true,
|
negate_iife: true,
|
||||||
keep_fnames : false,
|
properties: true,
|
||||||
hoist_vars : true,
|
sequences: false,
|
||||||
join_vars : true,
|
side_effects: true,
|
||||||
negate_iife : true
|
unused: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
function f0() {
|
function f0() {
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
make_sequences_1: {
|
make_sequences_1: {
|
||||||
options = {
|
options = {
|
||||||
sequences: true
|
sequences: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
foo();
|
foo();
|
||||||
bar();
|
bar();
|
||||||
@@ -14,8 +14,8 @@ make_sequences_1: {
|
|||||||
|
|
||||||
make_sequences_2: {
|
make_sequences_2: {
|
||||||
options = {
|
options = {
|
||||||
sequences: true
|
sequences: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
if (boo) {
|
if (boo) {
|
||||||
foo();
|
foo();
|
||||||
@@ -35,8 +35,8 @@ make_sequences_2: {
|
|||||||
|
|
||||||
make_sequences_3: {
|
make_sequences_3: {
|
||||||
options = {
|
options = {
|
||||||
sequences: true
|
sequences: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
function f() {
|
function f() {
|
||||||
foo();
|
foo();
|
||||||
@@ -61,8 +61,8 @@ make_sequences_3: {
|
|||||||
|
|
||||||
make_sequences_4: {
|
make_sequences_4: {
|
||||||
options = {
|
options = {
|
||||||
sequences: true
|
sequences: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
x = 5;
|
x = 5;
|
||||||
if (y) z();
|
if (y) z();
|
||||||
@@ -90,7 +90,9 @@ make_sequences_4: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
lift_sequences_1: {
|
lift_sequences_1: {
|
||||||
options = { sequences: true };
|
options = {
|
||||||
|
sequences: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
var foo, x, y, bar;
|
var foo, x, y, bar;
|
||||||
foo = !(x(), y(), bar());
|
foo = !(x(), y(), bar());
|
||||||
@@ -102,7 +104,10 @@ lift_sequences_1: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
lift_sequences_2: {
|
lift_sequences_2: {
|
||||||
options = { sequences: true, evaluate: true };
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
sequences: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
var foo = 1, bar;
|
var foo = 1, bar;
|
||||||
foo.x = (foo = {}, 10);
|
foo.x = (foo = {}, 10);
|
||||||
@@ -119,7 +124,10 @@ lift_sequences_2: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
lift_sequences_3: {
|
lift_sequences_3: {
|
||||||
options = { sequences: true, conditionals: true };
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
sequences: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
var x, foo, bar, baz;
|
var x, foo, bar, baz;
|
||||||
x = (foo(), bar(), baz()) ? 10 : 20;
|
x = (foo(), bar(), baz()) ? 10 : 20;
|
||||||
@@ -131,7 +139,9 @@ lift_sequences_3: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
lift_sequences_4: {
|
lift_sequences_4: {
|
||||||
options = { side_effects: true };
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
var x, foo, bar, baz;
|
var x, foo, bar, baz;
|
||||||
x = (foo, bar, baz);
|
x = (foo, bar, baz);
|
||||||
@@ -160,7 +170,9 @@ lift_sequences_5: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for_sequences: {
|
for_sequences: {
|
||||||
options = { sequences: true };
|
options = {
|
||||||
|
sequences: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
// 1
|
// 1
|
||||||
foo();
|
foo();
|
||||||
@@ -203,7 +215,7 @@ for_sequences: {
|
|||||||
limit_1: {
|
limit_1: {
|
||||||
options = {
|
options = {
|
||||||
sequences: 3,
|
sequences: 3,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
a;
|
a;
|
||||||
b;
|
b;
|
||||||
@@ -228,7 +240,7 @@ limit_1: {
|
|||||||
limit_2: {
|
limit_2: {
|
||||||
options = {
|
options = {
|
||||||
sequences: 3,
|
sequences: 3,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
a, b;
|
a, b;
|
||||||
c, d;
|
c, d;
|
||||||
@@ -246,9 +258,9 @@ limit_2: {
|
|||||||
|
|
||||||
negate_iife_for: {
|
negate_iife_for: {
|
||||||
options = {
|
options = {
|
||||||
sequences: true,
|
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
};
|
sequences: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
(function() {})();
|
(function() {})();
|
||||||
for (i = 0; i < 5; i++) console.log(i);
|
for (i = 0; i < 5; i++) console.log(i);
|
||||||
@@ -265,7 +277,7 @@ negate_iife_for: {
|
|||||||
iife: {
|
iife: {
|
||||||
options = {
|
options = {
|
||||||
sequences: true,
|
sequences: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
x = 42;
|
x = 42;
|
||||||
(function a() {})();
|
(function a() {})();
|
||||||
|
|||||||
@@ -14,6 +14,13 @@ issue_1929: {
|
|||||||
function f(s) {
|
function f(s) {
|
||||||
return s.split(/[\\/]/);
|
return s.split(/[\\/]/);
|
||||||
}
|
}
|
||||||
|
console.log(JSON.stringify(f("A/B\\C\\D/E\\F")));
|
||||||
}
|
}
|
||||||
expect_exact: "function f(s){return s.split(/[\\\\/]/)}"
|
expect: {
|
||||||
|
function f(s) {
|
||||||
|
return s.split(/[\\/]/);
|
||||||
|
}
|
||||||
|
console.log(JSON.stringify(f("A/B\\C\\D/E\\F")));
|
||||||
|
}
|
||||||
|
expect_stdout: '["A","B","C","D","E","F"]'
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -820,8 +820,8 @@ issue_1758: {
|
|||||||
|
|
||||||
issue_2535: {
|
issue_2535: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
switches: true,
|
switches: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ typeof_evaluation: {
|
|||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
typeofs: true,
|
typeofs: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
a = typeof 1;
|
a = typeof 1;
|
||||||
b = typeof 'test';
|
b = typeof 'test';
|
||||||
@@ -27,11 +27,11 @@ typeof_evaluation: {
|
|||||||
|
|
||||||
typeof_in_boolean_context: {
|
typeof_in_boolean_context: {
|
||||||
options = {
|
options = {
|
||||||
booleans : true,
|
booleans: true,
|
||||||
evaluate : true,
|
conditionals: true,
|
||||||
conditionals : true,
|
evaluate: true,
|
||||||
side_effects : true,
|
side_effects: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
function f1(x) { return typeof x ? "yes" : "no"; }
|
function f1(x) { return typeof x ? "yes" : "no"; }
|
||||||
function f2() { return typeof g()? "Yes" : "No"; }
|
function f2() { return typeof g()? "Yes" : "No"; }
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
unicode_parse_variables: {
|
unicode_parse_variables: {
|
||||||
options = {};
|
options = {}
|
||||||
input: {
|
input: {
|
||||||
var a = {};
|
var a = {};
|
||||||
a.你好 = 456;
|
a.你好 = 456;
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ wrap_iife_in_expression: {
|
|||||||
wrap_iife: true,
|
wrap_iife: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
foo = (function () {
|
foo = (function() {
|
||||||
return bar();
|
return bar();
|
||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,14 +1,16 @@
|
|||||||
exports["Compressor"] = Compressor;
|
|
||||||
exports["JS_Parse_Error"] = JS_Parse_Error;
|
|
||||||
exports["OutputStream"] = OutputStream;
|
|
||||||
exports["SourceMap"] = SourceMap;
|
|
||||||
exports["TreeWalker"] = TreeWalker;
|
|
||||||
exports["base54"] = base54;
|
exports["base54"] = base54;
|
||||||
|
exports["Compressor"] = Compressor;
|
||||||
exports["defaults"] = defaults;
|
exports["defaults"] = defaults;
|
||||||
|
exports["is_identifier"] = is_identifier;
|
||||||
|
exports["JS_Parse_Error"] = JS_Parse_Error;
|
||||||
exports["mangle_properties"] = mangle_properties;
|
exports["mangle_properties"] = mangle_properties;
|
||||||
exports["minify"] = minify;
|
exports["minify"] = minify;
|
||||||
|
exports["OutputStream"] = OutputStream;
|
||||||
exports["parse"] = parse;
|
exports["parse"] = parse;
|
||||||
|
exports["push_uniq"] = push_uniq;
|
||||||
exports["reserve_quoted_keys"] = reserve_quoted_keys;
|
exports["reserve_quoted_keys"] = reserve_quoted_keys;
|
||||||
|
exports["SourceMap"] = SourceMap;
|
||||||
exports["string_template"] = string_template;
|
exports["string_template"] = string_template;
|
||||||
exports["tokenizer"] = tokenizer;
|
exports["tokenizer"] = tokenizer;
|
||||||
exports["is_identifier"] = is_identifier;
|
exports["TreeTransformer"] = TreeTransformer;
|
||||||
|
exports["TreeWalker"] = TreeWalker;
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
var fs = require("fs");
|
var fs = require("fs");
|
||||||
|
var parse = require("url").parse;
|
||||||
var path = require("path");
|
var path = require("path");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -19,7 +20,9 @@ module.exports = function(url, callback) {
|
|||||||
var result = read(url);
|
var result = read(url);
|
||||||
result.on("error", function(e) {
|
result.on("error", function(e) {
|
||||||
if (e.code != "ENOENT") return callback(e);
|
if (e.code != "ENOENT") return callback(e);
|
||||||
require(url.slice(0, url.indexOf(":"))).get(url, function(res) {
|
var options = parse(url);
|
||||||
|
options.rejectUnauthorized = false;
|
||||||
|
require(options.protocol.slice(0, -1)).get(options, function(res) {
|
||||||
if (res.statusCode !== 200) return callback(res);
|
if (res.statusCode !== 200) return callback(res);
|
||||||
res.pipe(fs.createWriteStream(local(url)).on("close", function() {
|
res.pipe(fs.createWriteStream(local(url)).on("close", function() {
|
||||||
callback(null, read(url));
|
callback(null, read(url));
|
||||||
|
|||||||
4
test/input/enclose/input.js
Normal file
4
test/input/enclose/input.js
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
function enclose() {
|
||||||
|
console.log("test enclose");
|
||||||
|
}
|
||||||
|
enclose();
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
var bar = (function () {
|
var bar = (function() {
|
||||||
function foo (bar) {
|
function foo (bar) {
|
||||||
return bar;
|
return bar;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
var site = "http://browserbench.org/JetStream";
|
var site = "https://browserbench.org/JetStream";
|
||||||
if (typeof phantom == "undefined") {
|
if (typeof phantom == "undefined") {
|
||||||
require("../tools/exit");
|
require("../tools/exit");
|
||||||
var args = process.argv.slice(2);
|
var args = process.argv.slice(2);
|
||||||
|
|||||||
@@ -55,8 +55,7 @@ process.nextTick(function run() {
|
|||||||
var elapsed = Date.now();
|
var elapsed = Date.now();
|
||||||
var timer;
|
var timer;
|
||||||
var done = function() {
|
var done = function() {
|
||||||
clearTimeout(timer);
|
reset();
|
||||||
done = function() {};
|
|
||||||
elapsed = Date.now() - elapsed;
|
elapsed = Date.now() - elapsed;
|
||||||
if (elapsed > task.limit) {
|
if (elapsed > task.limit) {
|
||||||
throw new Error("Timed out: " + elapsed + "ms > " + task.limit + "ms");
|
throw new Error("Timed out: " + elapsed + "ms > " + task.limit + "ms");
|
||||||
@@ -73,6 +72,7 @@ process.nextTick(function run() {
|
|||||||
}, limit);
|
}, limit);
|
||||||
};
|
};
|
||||||
task.timeout(task.limit);
|
task.timeout(task.limit);
|
||||||
|
process.on("uncaughtException", raise);
|
||||||
task.call(task, done);
|
task.call(task, done);
|
||||||
} else {
|
} else {
|
||||||
task.timeout = config.timeout;
|
task.timeout = config.timeout;
|
||||||
@@ -99,11 +99,16 @@ process.nextTick(function run() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function raise(err) {
|
function raise(err) {
|
||||||
clearTimeout(timer);
|
reset();
|
||||||
done = function() {};
|
|
||||||
task.titles.error = err;
|
task.titles.error = err;
|
||||||
errors.push(task.titles);
|
errors.push(task.titles);
|
||||||
log_titles(console.log, task.titles, red('\u00D7 '));
|
log_titles(console.log, task.titles, red('\u00D7 '));
|
||||||
process.nextTick(run);
|
process.nextTick(run);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function reset() {
|
||||||
|
clearTimeout(timer);
|
||||||
|
done = function() {};
|
||||||
|
process.removeListener("uncaughtException", raise);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,17 +1,14 @@
|
|||||||
var UglifyJS = require("../node");
|
|
||||||
var assert = require("assert");
|
var assert = require("assert");
|
||||||
|
var UglifyJS = require("../..");
|
||||||
|
|
||||||
describe("arguments", function() {
|
describe("arguments", function() {
|
||||||
it("Should known that arguments in functions are local scoped", function() {
|
it("Should known that arguments in functions are local scoped", function() {
|
||||||
var ast = UglifyJS.parse("var arguments; var f = function() {arguments.length}");
|
var ast = UglifyJS.parse("var arguments; var f = function() {arguments.length}");
|
||||||
ast.figure_out_scope();
|
ast.figure_out_scope();
|
||||||
|
|
||||||
// Test scope of `var arguments`
|
// Test scope of `var arguments`
|
||||||
assert.strictEqual(ast.find_variable("arguments").global, true);
|
assert.strictEqual(ast.find_variable("arguments").global, true);
|
||||||
|
|
||||||
// Select arguments symbol in function
|
// Select arguments symbol in function
|
||||||
var symbol = ast.body[1].definitions[0].value.find_variable("arguments");
|
var symbol = ast.body[1].definitions[0].value.find_variable("arguments");
|
||||||
|
|
||||||
assert.strictEqual(symbol.global, false);
|
assert.strictEqual(symbol.global, false);
|
||||||
assert.strictEqual(symbol.scope, ast. // From ast
|
assert.strictEqual(symbol.scope, ast. // From ast
|
||||||
body[1]. // Select 2nd statement (equals to `var f ...`)
|
body[1]. // Select 2nd statement (equals to `var f ...`)
|
||||||
@@ -27,4 +24,4 @@ describe("arguments", function() {
|
|||||||
assert.strictEqual(ast.body[0].body[0].uses_arguments, true);
|
assert.strictEqual(ast.body[0].body[0].uses_arguments, true);
|
||||||
assert.strictEqual(ast.body[0].body[0].body[0].uses_arguments, false);
|
assert.strictEqual(ast.body[0].body[0].body[0].uses_arguments, false);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -6,60 +6,48 @@ function read(path) {
|
|||||||
return fs.readFileSync(path, "utf8");
|
return fs.readFileSync(path, "utf8");
|
||||||
}
|
}
|
||||||
|
|
||||||
describe("bin/uglifyjs", function () {
|
describe("bin/uglifyjs", function() {
|
||||||
var uglifyjscmd = '"' + process.argv[0] + '" bin/uglifyjs';
|
var uglifyjscmd = '"' + process.argv[0] + '" bin/uglifyjs';
|
||||||
it("should produce a functional build when using --self", function (done) {
|
it("Should produce a functional build when using --self", function(done) {
|
||||||
this.timeout(30000);
|
this.timeout(30000);
|
||||||
|
|
||||||
var command = uglifyjscmd + ' --self -cm --wrap WrappedUglifyJS';
|
var command = uglifyjscmd + ' --self -cm --wrap WrappedUglifyJS';
|
||||||
|
exec(command, function(err, stdout) {
|
||||||
exec(command, function (err, stdout) {
|
|
||||||
if (err) throw err;
|
if (err) throw err;
|
||||||
|
|
||||||
eval(stdout);
|
eval(stdout);
|
||||||
|
assert.strictEqual(typeof WrappedUglifyJS, "object");
|
||||||
assert.strictEqual(typeof WrappedUglifyJS, 'object');
|
|
||||||
var result = WrappedUglifyJS.minify("foo([true,,2+3]);");
|
var result = WrappedUglifyJS.minify("foo([true,,2+3]);");
|
||||||
assert.strictEqual(result.error, undefined);
|
assert.strictEqual(result.error, undefined);
|
||||||
assert.strictEqual(result.code, "foo([!0,,5]);");
|
assert.strictEqual(result.code, "foo([!0,,5]);");
|
||||||
|
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it("Should be able to filter comments correctly with `--comments all`", function (done) {
|
it("Should be able to filter comments correctly with `--comments all`", function(done) {
|
||||||
var command = uglifyjscmd + ' test/input/comments/filter.js --comments all';
|
var command = uglifyjscmd + ' test/input/comments/filter.js --comments all';
|
||||||
|
exec(command, function(err, stdout) {
|
||||||
exec(command, function (err, stdout) {
|
|
||||||
if (err) throw err;
|
if (err) throw err;
|
||||||
|
|
||||||
assert.strictEqual(stdout, "// foo\n/*@preserve*/\n// bar\n\n");
|
assert.strictEqual(stdout, "// foo\n/*@preserve*/\n// bar\n\n");
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it("Should be able to filter comments correctly with `--comment <RegExp>`", function (done) {
|
it("Should be able to filter comments correctly with `--comment <RegExp>`", function(done) {
|
||||||
var command = uglifyjscmd + ' test/input/comments/filter.js --comments /r/';
|
var command = uglifyjscmd + ' test/input/comments/filter.js --comments /r/';
|
||||||
|
exec(command, function(err, stdout) {
|
||||||
exec(command, function (err, stdout) {
|
|
||||||
if (err) throw err;
|
if (err) throw err;
|
||||||
|
|
||||||
assert.strictEqual(stdout, "/*@preserve*/\n// bar\n\n");
|
assert.strictEqual(stdout, "/*@preserve*/\n// bar\n\n");
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it("Should be able to filter comments correctly with just `--comment`", function (done) {
|
it("Should be able to filter comments correctly with just `--comment`", function(done) {
|
||||||
var command = uglifyjscmd + ' test/input/comments/filter.js --comments';
|
var command = uglifyjscmd + ' test/input/comments/filter.js --comments';
|
||||||
|
exec(command, function(err, stdout) {
|
||||||
exec(command, function (err, stdout) {
|
|
||||||
if (err) throw err;
|
if (err) throw err;
|
||||||
|
|
||||||
assert.strictEqual(stdout, "/*@preserve*/\n\n");
|
assert.strictEqual(stdout, "/*@preserve*/\n\n");
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it("Should give sensible error against invalid input source map", function(done) {
|
it("Should give sensible error against invalid input source map", function(done) {
|
||||||
var command = uglifyjscmd + " test/mocha.js --source-map content=blah,url=inline";
|
var command = uglifyjscmd + " test/mocha.js --source-map content=blah,url=inline";
|
||||||
|
exec(command, function(err, stdout, stderr) {
|
||||||
exec(command, function (err, stdout, stderr) {
|
|
||||||
assert.ok(err);
|
assert.ok(err);
|
||||||
assert.deepEqual(stderr.split(/\n/).slice(0, 2), [
|
assert.deepEqual(stderr.split(/\n/).slice(0, 2), [
|
||||||
"INFO: Using input source map: blah",
|
"INFO: Using input source map: blah",
|
||||||
@@ -68,38 +56,35 @@ describe("bin/uglifyjs", function () {
|
|||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it("Should append source map to output when using --source-map url=inline", function (done) {
|
it("Should append source map to output when using --source-map url=inline", function(done) {
|
||||||
var command = uglifyjscmd + " test/input/issue-1323/sample.js --source-map url=inline";
|
var command = uglifyjscmd + " test/input/issue-1323/sample.js --source-map url=inline";
|
||||||
|
exec(command, function(err, stdout) {
|
||||||
exec(command, function (err, stdout) {
|
|
||||||
if (err) throw err;
|
if (err) throw err;
|
||||||
|
assert.strictEqual(stdout, [
|
||||||
assert.strictEqual(stdout, "var bar=function(){function foo(bar){return bar}return foo}();\n" +
|
"var bar=function(){function foo(bar){return bar}return foo}();",
|
||||||
"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvaW5wdXQvaXNzdWUtMTMyMy9zYW1wbGUuanMiXSwibmFtZXMiOlsiYmFyIiwiZm9vIl0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQSxJQUFNLFdBQ04sU0FBU0MsSUFBS0QsS0FDVixPQUFPQSxJQUdYLE9BQU9DLElBTEQifQ==\n");
|
"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvaW5wdXQvaXNzdWUtMTMyMy9zYW1wbGUuanMiXSwibmFtZXMiOlsiYmFyIiwiZm9vIl0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQSxJQUFNLFdBQ04sU0FBU0MsSUFBS0QsS0FDVixPQUFPQSxJQUdYLE9BQU9DLElBTEQifQ==",
|
||||||
|
"",
|
||||||
|
].join("\n"));
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it("should not append source map to output when not using --source-map url=inline", function (done) {
|
it("Should not append source map to output when not using --source-map url=inline", function(done) {
|
||||||
var command = uglifyjscmd + ' test/input/issue-1323/sample.js';
|
var command = uglifyjscmd + ' test/input/issue-1323/sample.js';
|
||||||
|
exec(command, function(err, stdout) {
|
||||||
exec(command, function (err, stdout) {
|
|
||||||
if (err) throw err;
|
if (err) throw err;
|
||||||
|
|
||||||
assert.strictEqual(stdout, "var bar=function(){function foo(bar){return bar}return foo}();\n");
|
assert.strictEqual(stdout, "var bar=function(){function foo(bar){return bar}return foo}();\n");
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it("should not consider source map file content as source map file name (issue #2082)", function (done) {
|
it("Should not consider source map file content as source map file name (issue #2082)", function(done) {
|
||||||
var command = [
|
var command = [
|
||||||
uglifyjscmd,
|
uglifyjscmd,
|
||||||
"test/input/issue-2082/sample.js",
|
"test/input/issue-2082/sample.js",
|
||||||
"--source-map", "content=test/input/issue-2082/sample.js.map",
|
"--source-map", "content=test/input/issue-2082/sample.js.map",
|
||||||
"--source-map", "url=inline",
|
"--source-map", "url=inline",
|
||||||
].join(" ");
|
].join(" ");
|
||||||
|
exec(command, function(err, stdout, stderr) {
|
||||||
exec(command, function (err, stdout, stderr) {
|
|
||||||
if (err) throw err;
|
if (err) throw err;
|
||||||
|
|
||||||
var stderrLines = stderr.split("\n");
|
var stderrLines = stderr.split("\n");
|
||||||
assert.strictEqual(stderrLines[0], "INFO: Using input source map: test/input/issue-2082/sample.js.map");
|
assert.strictEqual(stderrLines[0], "INFO: Using input source map: test/input/issue-2082/sample.js.map");
|
||||||
assert.notStrictEqual(stderrLines[1], 'INFO: Using input source map: {"version": 3,"sources": ["index.js"],"mappings": ";"}');
|
assert.notStrictEqual(stderrLines[1], 'INFO: Using input source map: {"version": 3,"sources": ["index.js"],"mappings": ";"}');
|
||||||
@@ -136,82 +121,66 @@ describe("bin/uglifyjs", function () {
|
|||||||
child.stdin.end(read("test/input/pr-3040/input.js"));
|
child.stdin.end(read("test/input/pr-3040/input.js"));
|
||||||
}, 1000);
|
}, 1000);
|
||||||
});
|
});
|
||||||
it("Should work with --keep-fnames (mangle only)", function (done) {
|
it("Should work with --keep-fnames (mangle only)", function(done) {
|
||||||
var command = uglifyjscmd + ' test/input/issue-1431/sample.js --keep-fnames -m';
|
var command = uglifyjscmd + ' test/input/issue-1431/sample.js --keep-fnames -m';
|
||||||
|
exec(command, function(err, stdout) {
|
||||||
exec(command, function (err, stdout) {
|
|
||||||
if (err) throw err;
|
if (err) throw err;
|
||||||
|
|
||||||
assert.strictEqual(stdout, "function f(r){return function(){function n(n){return n*n}return r(n)}}function g(n){return n(1)+n(2)}console.log(f(g)()==5);\n");
|
assert.strictEqual(stdout, "function f(r){return function(){function n(n){return n*n}return r(n)}}function g(n){return n(1)+n(2)}console.log(f(g)()==5);\n");
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it("Should work with --keep-fnames (mangle & compress)", function (done) {
|
it("Should work with --keep-fnames (mangle & compress)", function(done) {
|
||||||
var command = uglifyjscmd + ' test/input/issue-1431/sample.js --keep-fnames -m -c unused=false';
|
var command = uglifyjscmd + ' test/input/issue-1431/sample.js --keep-fnames -m -c unused=false';
|
||||||
|
exec(command, function(err, stdout) {
|
||||||
exec(command, function (err, stdout) {
|
|
||||||
if (err) throw err;
|
if (err) throw err;
|
||||||
|
|
||||||
assert.strictEqual(stdout, "function f(r){return function(){function n(n){return n*n}return r(n)}}function g(n){return n(1)+n(2)}console.log(5==f(g)());\n");
|
assert.strictEqual(stdout, "function f(r){return function(){function n(n){return n*n}return r(n)}}function g(n){return n(1)+n(2)}console.log(5==f(g)());\n");
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it("Should work with keep_fnames under mangler options", function (done) {
|
it("Should work with keep_fnames under mangler options", function(done) {
|
||||||
var command = uglifyjscmd + ' test/input/issue-1431/sample.js -m keep_fnames=true';
|
var command = uglifyjscmd + ' test/input/issue-1431/sample.js -m keep_fnames=true';
|
||||||
|
exec(command, function(err, stdout) {
|
||||||
exec(command, function (err, stdout) {
|
|
||||||
if (err) throw err;
|
if (err) throw err;
|
||||||
|
|
||||||
assert.strictEqual(stdout, "function f(r){return function(){function n(n){return n*n}return r(n)}}function g(n){return n(1)+n(2)}console.log(f(g)()==5);\n");
|
assert.strictEqual(stdout, "function f(r){return function(){function n(n){return n*n}return r(n)}}function g(n){return n(1)+n(2)}console.log(f(g)()==5);\n");
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it("Should work with --define (simple)", function (done) {
|
it("Should work with --define (simple)", function(done) {
|
||||||
var command = uglifyjscmd + ' test/input/global_defs/simple.js --define D=5 -c';
|
var command = uglifyjscmd + ' test/input/global_defs/simple.js --define D=5 -c';
|
||||||
|
exec(command, function(err, stdout) {
|
||||||
exec(command, function (err, stdout) {
|
|
||||||
if (err) throw err;
|
if (err) throw err;
|
||||||
|
|
||||||
assert.strictEqual(stdout, "console.log(5);\n");
|
assert.strictEqual(stdout, "console.log(5);\n");
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it("Should work with --define (nested)", function (done) {
|
it("Should work with --define (nested)", function(done) {
|
||||||
var command = uglifyjscmd + ' test/input/global_defs/nested.js --define C.D=5,C.V=3 -c';
|
var command = uglifyjscmd + ' test/input/global_defs/nested.js --define C.D=5,C.V=3 -c';
|
||||||
|
exec(command, function(err, stdout) {
|
||||||
exec(command, function (err, stdout) {
|
|
||||||
if (err) throw err;
|
if (err) throw err;
|
||||||
|
|
||||||
assert.strictEqual(stdout, "console.log(3,5);\n");
|
assert.strictEqual(stdout, "console.log(3,5);\n");
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it("Should work with --define (AST_Node)", function (done) {
|
it("Should work with --define (AST_Node)", function(done) {
|
||||||
var command = uglifyjscmd + ' test/input/global_defs/simple.js --define console.log=stdout.println -c';
|
var command = uglifyjscmd + ' test/input/global_defs/simple.js --define console.log=stdout.println -c';
|
||||||
|
exec(command, function(err, stdout) {
|
||||||
exec(command, function (err, stdout) {
|
|
||||||
if (err) throw err;
|
if (err) throw err;
|
||||||
|
|
||||||
assert.strictEqual(stdout, "stdout.println(D);\n");
|
assert.strictEqual(stdout, "stdout.println(D);\n");
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it("Should work with `--beautify`", function (done) {
|
it("Should work with `--beautify`", function(done) {
|
||||||
var command = uglifyjscmd + ' test/input/issue-1482/input.js -b';
|
var command = uglifyjscmd + ' test/input/issue-1482/input.js -b';
|
||||||
|
exec(command, function(err, stdout) {
|
||||||
exec(command, function (err, stdout) {
|
|
||||||
if (err) throw err;
|
if (err) throw err;
|
||||||
|
|
||||||
assert.strictEqual(stdout, read("test/input/issue-1482/default.js"));
|
assert.strictEqual(stdout, read("test/input/issue-1482/default.js"));
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it("Should work with `--beautify braces`", function (done) {
|
it("Should work with `--beautify braces`", function(done) {
|
||||||
var command = uglifyjscmd + ' test/input/issue-1482/input.js -b braces';
|
var command = uglifyjscmd + ' test/input/issue-1482/input.js -b braces';
|
||||||
|
exec(command, function(err, stdout) {
|
||||||
exec(command, function (err, stdout) {
|
|
||||||
if (err) throw err;
|
if (err) throw err;
|
||||||
|
|
||||||
assert.strictEqual(stdout, read("test/input/issue-1482/braces.js"));
|
assert.strictEqual(stdout, read("test/input/issue-1482/braces.js"));
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
@@ -225,20 +194,16 @@ describe("bin/uglifyjs", function () {
|
|||||||
"--source-map", "includeSources=true",
|
"--source-map", "includeSources=true",
|
||||||
"--source-map", "url=inline",
|
"--source-map", "url=inline",
|
||||||
].join(" ");
|
].join(" ");
|
||||||
|
exec(command, function(err, stdout) {
|
||||||
exec(command, function (err, stdout) {
|
|
||||||
if (err) throw err;
|
if (err) throw err;
|
||||||
|
|
||||||
assert.strictEqual(stdout, read("test/input/issue-520/output.js"));
|
assert.strictEqual(stdout, read("test/input/issue-520/output.js"));
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it("Should warn for missing inline source map", function(done) {
|
it("Should warn for missing inline source map", function(done) {
|
||||||
var command = uglifyjscmd + " test/input/issue-1323/sample.js --source-map content=inline,url=inline";
|
var command = uglifyjscmd + " test/input/issue-1323/sample.js --source-map content=inline,url=inline";
|
||||||
|
exec(command, function(err, stdout, stderr) {
|
||||||
exec(command, function (err, stdout, stderr) {
|
|
||||||
if (err) throw err;
|
if (err) throw err;
|
||||||
|
|
||||||
assert.strictEqual(stdout, [
|
assert.strictEqual(stdout, [
|
||||||
"var bar=function(){function foo(bar){return bar}return foo}();",
|
"var bar=function(){function foo(bar){return bar}return foo}();",
|
||||||
"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvaW5wdXQvaXNzdWUtMTMyMy9zYW1wbGUuanMiXSwibmFtZXMiOlsiYmFyIiwiZm9vIl0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQSxJQUFNLFdBQ04sU0FBU0MsSUFBS0QsS0FDVixPQUFPQSxJQUdYLE9BQU9DLElBTEQifQ==",
|
"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvaW5wdXQvaXNzdWUtMTMyMy9zYW1wbGUuanMiXSwibmFtZXMiOlsiYmFyIiwiZm9vIl0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQSxJQUFNLFdBQ04sU0FBU0MsSUFBS0QsS0FDVixPQUFPQSxJQUdYLE9BQU9DLElBTEQifQ==",
|
||||||
@@ -256,10 +221,8 @@ describe("bin/uglifyjs", function () {
|
|||||||
"test/input/issue-1323/sample.js",
|
"test/input/issue-1323/sample.js",
|
||||||
"--source-map", "content=inline,url=inline",
|
"--source-map", "content=inline,url=inline",
|
||||||
].join(" ");
|
].join(" ");
|
||||||
|
exec(command, function(err, stdout, stderr) {
|
||||||
exec(command, function (err, stdout, stderr) {
|
|
||||||
if (err) throw err;
|
if (err) throw err;
|
||||||
|
|
||||||
assert.strictEqual(stdout, [
|
assert.strictEqual(stdout, [
|
||||||
"var Foo=function Foo(){console.log(1+2)};new Foo;var bar=function(){function foo(bar){return bar}return foo}();",
|
"var Foo=function Foo(){console.log(1+2)};new Foo;var bar=function(){function foo(bar){return bar}return foo}();",
|
||||||
"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInN0ZGluIiwidGVzdC9pbnB1dC9pc3N1ZS0xMzIzL3NhbXBsZS5qcyJdLCJuYW1lcyI6WyJGb28iLCJjb25zb2xlIiwibG9nIiwiYmFyIiwiZm9vIl0sIm1hcHBpbmdzIjoiQUFBQSxJQUFNQSxJQUFJLFNBQUFBLE1BQWdCQyxRQUFRQyxJQUFJLEVBQUUsSUFBTyxJQUFJRixJQ0FuRCxJQUFJRyxJQUFNLFdBQ04sU0FBU0MsSUFBS0QsS0FDVixPQUFPQSxJQUdYLE9BQU9DLElBTEQifQ==",
|
"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInN0ZGluIiwidGVzdC9pbnB1dC9pc3N1ZS0xMzIzL3NhbXBsZS5qcyJdLCJuYW1lcyI6WyJGb28iLCJjb25zb2xlIiwibG9nIiwiYmFyIiwiZm9vIl0sIm1hcHBpbmdzIjoiQUFBQSxJQUFNQSxJQUFJLFNBQUFBLE1BQWdCQyxRQUFRQyxJQUFJLEVBQUUsSUFBTyxJQUFJRixJQ0FuRCxJQUFJRyxJQUFNLFdBQ04sU0FBU0MsSUFBS0QsS0FDVixPQUFPQSxJQUdYLE9BQU9DLElBTEQifQ==",
|
||||||
@@ -272,8 +235,7 @@ describe("bin/uglifyjs", function () {
|
|||||||
});
|
});
|
||||||
it("Should fail with acorn and inline source map", function(done) {
|
it("Should fail with acorn and inline source map", function(done) {
|
||||||
var command = uglifyjscmd + " test/input/issue-520/input.js --source-map content=inline,url=inline -p acorn";
|
var command = uglifyjscmd + " test/input/issue-520/input.js --source-map content=inline,url=inline -p acorn";
|
||||||
|
exec(command, function(err, stdout, stderr) {
|
||||||
exec(command, function (err, stdout, stderr) {
|
|
||||||
assert.ok(err);
|
assert.ok(err);
|
||||||
assert.strictEqual(stderr, "ERROR: inline source map only works with built-in parser\n");
|
assert.strictEqual(stderr, "ERROR: inline source map only works with built-in parser\n");
|
||||||
done();
|
done();
|
||||||
@@ -281,8 +243,7 @@ describe("bin/uglifyjs", function () {
|
|||||||
});
|
});
|
||||||
it("Should fail with SpiderMonkey and inline source map", function(done) {
|
it("Should fail with SpiderMonkey and inline source map", function(done) {
|
||||||
var command = uglifyjscmd + " test/input/issue-520/input.js --source-map content=inline,url=inline -p spidermonkey";
|
var command = uglifyjscmd + " test/input/issue-520/input.js --source-map content=inline,url=inline -p spidermonkey";
|
||||||
|
exec(command, function(err, stdout, stderr) {
|
||||||
exec(command, function (err, stdout, stderr) {
|
|
||||||
assert.ok(err);
|
assert.ok(err);
|
||||||
assert.strictEqual(stderr, "ERROR: inline source map only works with built-in parser\n");
|
assert.strictEqual(stderr, "ERROR: inline source map only works with built-in parser\n");
|
||||||
done();
|
done();
|
||||||
@@ -290,8 +251,7 @@ describe("bin/uglifyjs", function () {
|
|||||||
});
|
});
|
||||||
it("Should fail with invalid syntax", function(done) {
|
it("Should fail with invalid syntax", function(done) {
|
||||||
var command = uglifyjscmd + ' test/input/invalid/simple.js';
|
var command = uglifyjscmd + ' test/input/invalid/simple.js';
|
||||||
|
exec(command, function(err, stdout, stderr) {
|
||||||
exec(command, function (err, stdout, stderr) {
|
|
||||||
assert.ok(err);
|
assert.ok(err);
|
||||||
var lines = stderr.split(/\n/);
|
var lines = stderr.split(/\n/);
|
||||||
assert.strictEqual(lines[0], "Parse error at test/input/invalid/simple.js:1,12");
|
assert.strictEqual(lines[0], "Parse error at test/input/invalid/simple.js:1,12");
|
||||||
@@ -303,8 +263,7 @@ describe("bin/uglifyjs", function () {
|
|||||||
});
|
});
|
||||||
it("Should fail with correct marking of tabs", function(done) {
|
it("Should fail with correct marking of tabs", function(done) {
|
||||||
var command = uglifyjscmd + ' test/input/invalid/tab.js';
|
var command = uglifyjscmd + ' test/input/invalid/tab.js';
|
||||||
|
exec(command, function(err, stdout, stderr) {
|
||||||
exec(command, function (err, stdout, stderr) {
|
|
||||||
assert.ok(err);
|
assert.ok(err);
|
||||||
var lines = stderr.split(/\n/);
|
var lines = stderr.split(/\n/);
|
||||||
assert.strictEqual(lines[0], "Parse error at test/input/invalid/tab.js:1,12");
|
assert.strictEqual(lines[0], "Parse error at test/input/invalid/tab.js:1,12");
|
||||||
@@ -316,8 +275,7 @@ describe("bin/uglifyjs", function () {
|
|||||||
});
|
});
|
||||||
it("Should fail with correct marking at start of line", function(done) {
|
it("Should fail with correct marking at start of line", function(done) {
|
||||||
var command = uglifyjscmd + ' test/input/invalid/eof.js';
|
var command = uglifyjscmd + ' test/input/invalid/eof.js';
|
||||||
|
exec(command, function(err, stdout, stderr) {
|
||||||
exec(command, function (err, stdout, stderr) {
|
|
||||||
assert.ok(err);
|
assert.ok(err);
|
||||||
var lines = stderr.split(/\n/);
|
var lines = stderr.split(/\n/);
|
||||||
assert.strictEqual(lines[0], "Parse error at test/input/invalid/eof.js:2,0");
|
assert.strictEqual(lines[0], "Parse error at test/input/invalid/eof.js:2,0");
|
||||||
@@ -329,8 +287,7 @@ describe("bin/uglifyjs", function () {
|
|||||||
});
|
});
|
||||||
it("Should fail with a missing loop body", function(done) {
|
it("Should fail with a missing loop body", function(done) {
|
||||||
var command = uglifyjscmd + ' test/input/invalid/loop-no-body.js';
|
var command = uglifyjscmd + ' test/input/invalid/loop-no-body.js';
|
||||||
|
exec(command, function(err, stdout, stderr) {
|
||||||
exec(command, function (err, stdout, stderr) {
|
|
||||||
assert.ok(err);
|
assert.ok(err);
|
||||||
var lines = stderr.split(/\n/);
|
var lines = stderr.split(/\n/);
|
||||||
assert.strictEqual(lines[0], "Parse error at test/input/invalid/loop-no-body.js:2,0");
|
assert.strictEqual(lines[0], "Parse error at test/input/invalid/loop-no-body.js:2,0");
|
||||||
@@ -342,8 +299,7 @@ describe("bin/uglifyjs", function () {
|
|||||||
});
|
});
|
||||||
it("Should throw syntax error (5--)", function(done) {
|
it("Should throw syntax error (5--)", function(done) {
|
||||||
var command = uglifyjscmd + ' test/input/invalid/assign_1.js';
|
var command = uglifyjscmd + ' test/input/invalid/assign_1.js';
|
||||||
|
exec(command, function(err, stdout, stderr) {
|
||||||
exec(command, function (err, stdout, stderr) {
|
|
||||||
assert.ok(err);
|
assert.ok(err);
|
||||||
assert.strictEqual(stdout, "");
|
assert.strictEqual(stdout, "");
|
||||||
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
||||||
@@ -357,8 +313,7 @@ describe("bin/uglifyjs", function () {
|
|||||||
});
|
});
|
||||||
it("Should throw syntax error (Math.random() /= 2)", function(done) {
|
it("Should throw syntax error (Math.random() /= 2)", function(done) {
|
||||||
var command = uglifyjscmd + ' test/input/invalid/assign_2.js';
|
var command = uglifyjscmd + ' test/input/invalid/assign_2.js';
|
||||||
|
exec(command, function(err, stdout, stderr) {
|
||||||
exec(command, function (err, stdout, stderr) {
|
|
||||||
assert.ok(err);
|
assert.ok(err);
|
||||||
assert.strictEqual(stdout, "");
|
assert.strictEqual(stdout, "");
|
||||||
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
||||||
@@ -372,8 +327,7 @@ describe("bin/uglifyjs", function () {
|
|||||||
});
|
});
|
||||||
it("Should throw syntax error (++this)", function(done) {
|
it("Should throw syntax error (++this)", function(done) {
|
||||||
var command = uglifyjscmd + ' test/input/invalid/assign_3.js';
|
var command = uglifyjscmd + ' test/input/invalid/assign_3.js';
|
||||||
|
exec(command, function(err, stdout, stderr) {
|
||||||
exec(command, function (err, stdout, stderr) {
|
|
||||||
assert.ok(err);
|
assert.ok(err);
|
||||||
assert.strictEqual(stdout, "");
|
assert.strictEqual(stdout, "");
|
||||||
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
||||||
@@ -387,8 +341,7 @@ describe("bin/uglifyjs", function () {
|
|||||||
});
|
});
|
||||||
it("Should throw syntax error (++null)", function(done) {
|
it("Should throw syntax error (++null)", function(done) {
|
||||||
var command = uglifyjscmd + ' test/input/invalid/assign_4.js';
|
var command = uglifyjscmd + ' test/input/invalid/assign_4.js';
|
||||||
|
exec(command, function(err, stdout, stderr) {
|
||||||
exec(command, function (err, stdout, stderr) {
|
|
||||||
assert.ok(err);
|
assert.ok(err);
|
||||||
assert.strictEqual(stdout, "");
|
assert.strictEqual(stdout, "");
|
||||||
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
||||||
@@ -402,8 +355,7 @@ describe("bin/uglifyjs", function () {
|
|||||||
});
|
});
|
||||||
it("Should throw syntax error (a.=)", function(done) {
|
it("Should throw syntax error (a.=)", function(done) {
|
||||||
var command = uglifyjscmd + ' test/input/invalid/dot_1.js';
|
var command = uglifyjscmd + ' test/input/invalid/dot_1.js';
|
||||||
|
exec(command, function(err, stdout, stderr) {
|
||||||
exec(command, function (err, stdout, stderr) {
|
|
||||||
assert.ok(err);
|
assert.ok(err);
|
||||||
assert.strictEqual(stdout, "");
|
assert.strictEqual(stdout, "");
|
||||||
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
||||||
@@ -417,8 +369,7 @@ describe("bin/uglifyjs", function () {
|
|||||||
});
|
});
|
||||||
it("Should throw syntax error (%.a)", function(done) {
|
it("Should throw syntax error (%.a)", function(done) {
|
||||||
var command = uglifyjscmd + ' test/input/invalid/dot_2.js';
|
var command = uglifyjscmd + ' test/input/invalid/dot_2.js';
|
||||||
|
exec(command, function(err, stdout, stderr) {
|
||||||
exec(command, function (err, stdout, stderr) {
|
|
||||||
assert.ok(err);
|
assert.ok(err);
|
||||||
assert.strictEqual(stdout, "");
|
assert.strictEqual(stdout, "");
|
||||||
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
||||||
@@ -432,8 +383,7 @@ describe("bin/uglifyjs", function () {
|
|||||||
});
|
});
|
||||||
it("Should throw syntax error (a./();)", function(done) {
|
it("Should throw syntax error (a./();)", function(done) {
|
||||||
var command = uglifyjscmd + ' test/input/invalid/dot_3.js';
|
var command = uglifyjscmd + ' test/input/invalid/dot_3.js';
|
||||||
|
exec(command, function(err, stdout, stderr) {
|
||||||
exec(command, function (err, stdout, stderr) {
|
|
||||||
assert.ok(err);
|
assert.ok(err);
|
||||||
assert.strictEqual(stdout, "");
|
assert.strictEqual(stdout, "");
|
||||||
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
||||||
@@ -447,8 +397,7 @@ describe("bin/uglifyjs", function () {
|
|||||||
});
|
});
|
||||||
it("Should throw syntax error ({%: 1})", function(done) {
|
it("Should throw syntax error ({%: 1})", function(done) {
|
||||||
var command = uglifyjscmd + ' test/input/invalid/object.js';
|
var command = uglifyjscmd + ' test/input/invalid/object.js';
|
||||||
|
exec(command, function(err, stdout, stderr) {
|
||||||
exec(command, function (err, stdout, stderr) {
|
|
||||||
assert.ok(err);
|
assert.ok(err);
|
||||||
assert.strictEqual(stdout, "");
|
assert.strictEqual(stdout, "");
|
||||||
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
||||||
@@ -462,8 +411,7 @@ describe("bin/uglifyjs", function () {
|
|||||||
});
|
});
|
||||||
it("Should throw syntax error (delete x)", function(done) {
|
it("Should throw syntax error (delete x)", function(done) {
|
||||||
var command = uglifyjscmd + ' test/input/invalid/delete.js';
|
var command = uglifyjscmd + ' test/input/invalid/delete.js';
|
||||||
|
exec(command, function(err, stdout, stderr) {
|
||||||
exec(command, function (err, stdout, stderr) {
|
|
||||||
assert.ok(err);
|
assert.ok(err);
|
||||||
assert.strictEqual(stdout, "");
|
assert.strictEqual(stdout, "");
|
||||||
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
||||||
@@ -477,8 +425,7 @@ describe("bin/uglifyjs", function () {
|
|||||||
});
|
});
|
||||||
it("Should throw syntax error (function g(arguments))", function(done) {
|
it("Should throw syntax error (function g(arguments))", function(done) {
|
||||||
var command = uglifyjscmd + ' test/input/invalid/function_1.js';
|
var command = uglifyjscmd + ' test/input/invalid/function_1.js';
|
||||||
|
exec(command, function(err, stdout, stderr) {
|
||||||
exec(command, function (err, stdout, stderr) {
|
|
||||||
assert.ok(err);
|
assert.ok(err);
|
||||||
assert.strictEqual(stdout, "");
|
assert.strictEqual(stdout, "");
|
||||||
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
||||||
@@ -492,8 +439,7 @@ describe("bin/uglifyjs", function () {
|
|||||||
});
|
});
|
||||||
it("Should throw syntax error (function eval())", function(done) {
|
it("Should throw syntax error (function eval())", function(done) {
|
||||||
var command = uglifyjscmd + ' test/input/invalid/function_2.js';
|
var command = uglifyjscmd + ' test/input/invalid/function_2.js';
|
||||||
|
exec(command, function(err, stdout, stderr) {
|
||||||
exec(command, function (err, stdout, stderr) {
|
|
||||||
assert.ok(err);
|
assert.ok(err);
|
||||||
assert.strictEqual(stdout, "");
|
assert.strictEqual(stdout, "");
|
||||||
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
||||||
@@ -507,8 +453,7 @@ describe("bin/uglifyjs", function () {
|
|||||||
});
|
});
|
||||||
it("Should throw syntax error (iife arguments())", function(done) {
|
it("Should throw syntax error (iife arguments())", function(done) {
|
||||||
var command = uglifyjscmd + ' test/input/invalid/function_3.js';
|
var command = uglifyjscmd + ' test/input/invalid/function_3.js';
|
||||||
|
exec(command, function(err, stdout, stderr) {
|
||||||
exec(command, function (err, stdout, stderr) {
|
|
||||||
assert.ok(err);
|
assert.ok(err);
|
||||||
assert.strictEqual(stdout, "");
|
assert.strictEqual(stdout, "");
|
||||||
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
||||||
@@ -522,8 +467,7 @@ describe("bin/uglifyjs", function () {
|
|||||||
});
|
});
|
||||||
it("Should throw syntax error (catch(eval))", function(done) {
|
it("Should throw syntax error (catch(eval))", function(done) {
|
||||||
var command = uglifyjscmd + ' test/input/invalid/try.js';
|
var command = uglifyjscmd + ' test/input/invalid/try.js';
|
||||||
|
exec(command, function(err, stdout, stderr) {
|
||||||
exec(command, function (err, stdout, stderr) {
|
|
||||||
assert.ok(err);
|
assert.ok(err);
|
||||||
assert.strictEqual(stdout, "");
|
assert.strictEqual(stdout, "");
|
||||||
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
||||||
@@ -537,8 +481,7 @@ describe("bin/uglifyjs", function () {
|
|||||||
});
|
});
|
||||||
it("Should throw syntax error (var eval)", function(done) {
|
it("Should throw syntax error (var eval)", function(done) {
|
||||||
var command = uglifyjscmd + ' test/input/invalid/var.js';
|
var command = uglifyjscmd + ' test/input/invalid/var.js';
|
||||||
|
exec(command, function(err, stdout, stderr) {
|
||||||
exec(command, function (err, stdout, stderr) {
|
|
||||||
assert.ok(err);
|
assert.ok(err);
|
||||||
assert.strictEqual(stdout, "");
|
assert.strictEqual(stdout, "");
|
||||||
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
||||||
@@ -552,8 +495,7 @@ describe("bin/uglifyjs", function () {
|
|||||||
});
|
});
|
||||||
it("Should throw syntax error (else)", function(done) {
|
it("Should throw syntax error (else)", function(done) {
|
||||||
var command = uglifyjscmd + ' test/input/invalid/else.js';
|
var command = uglifyjscmd + ' test/input/invalid/else.js';
|
||||||
|
exec(command, function(err, stdout, stderr) {
|
||||||
exec(command, function (err, stdout, stderr) {
|
|
||||||
assert.ok(err);
|
assert.ok(err);
|
||||||
assert.strictEqual(stdout, "");
|
assert.strictEqual(stdout, "");
|
||||||
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
||||||
@@ -567,8 +509,7 @@ describe("bin/uglifyjs", function () {
|
|||||||
});
|
});
|
||||||
it("Should throw syntax error (return)", function(done) {
|
it("Should throw syntax error (return)", function(done) {
|
||||||
var command = uglifyjscmd + ' test/input/invalid/return.js';
|
var command = uglifyjscmd + ' test/input/invalid/return.js';
|
||||||
|
exec(command, function(err, stdout, stderr) {
|
||||||
exec(command, function (err, stdout, stderr) {
|
|
||||||
assert.ok(err);
|
assert.ok(err);
|
||||||
assert.strictEqual(stdout, "");
|
assert.strictEqual(stdout, "");
|
||||||
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
||||||
@@ -582,8 +523,7 @@ describe("bin/uglifyjs", function () {
|
|||||||
});
|
});
|
||||||
it("Should throw syntax error (for-in init)", function(done) {
|
it("Should throw syntax error (for-in init)", function(done) {
|
||||||
var command = uglifyjscmd + ' test/input/invalid/for-in_1.js';
|
var command = uglifyjscmd + ' test/input/invalid/for-in_1.js';
|
||||||
|
exec(command, function(err, stdout, stderr) {
|
||||||
exec(command, function (err, stdout, stderr) {
|
|
||||||
assert.ok(err);
|
assert.ok(err);
|
||||||
assert.strictEqual(stdout, "");
|
assert.strictEqual(stdout, "");
|
||||||
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
||||||
@@ -597,8 +537,7 @@ describe("bin/uglifyjs", function () {
|
|||||||
});
|
});
|
||||||
it("Should throw syntax error (for-in var)", function(done) {
|
it("Should throw syntax error (for-in var)", function(done) {
|
||||||
var command = uglifyjscmd + ' test/input/invalid/for-in_2.js';
|
var command = uglifyjscmd + ' test/input/invalid/for-in_2.js';
|
||||||
|
exec(command, function(err, stdout, stderr) {
|
||||||
exec(command, function (err, stdout, stderr) {
|
|
||||||
assert.ok(err);
|
assert.ok(err);
|
||||||
assert.strictEqual(stdout, "");
|
assert.strictEqual(stdout, "");
|
||||||
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
|
||||||
@@ -617,10 +556,8 @@ describe("bin/uglifyjs", function () {
|
|||||||
"--source-map",
|
"--source-map",
|
||||||
'content="' + read_map() + '",url=inline'
|
'content="' + read_map() + '",url=inline'
|
||||||
].join(" ");
|
].join(" ");
|
||||||
|
exec(command, function(err, stdout) {
|
||||||
exec(command, function (err, stdout) {
|
|
||||||
if (err) throw err;
|
if (err) throw err;
|
||||||
|
|
||||||
assert.strictEqual(stdout, [
|
assert.strictEqual(stdout, [
|
||||||
'"use strict";var foo=function foo(x){return"foo "+x};console.log(foo("bar"));',
|
'"use strict";var foo=function foo(x){return"foo "+x};console.log(foo("bar"));',
|
||||||
"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbImZvbyIsIngiLCJjb25zb2xlIiwibG9nIl0sIm1hcHBpbmdzIjoiYUFBQSxJQUFJQSxJQUFNLFNBQU5BLElBQU1DLEdBQUEsTUFBSyxPQUFTQSxHQUN4QkMsUUFBUUMsSUFBSUgsSUFBSSJ9",
|
"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbImZvbyIsIngiLCJjb25zb2xlIiwibG9nIl0sIm1hcHBpbmdzIjoiYUFBQSxJQUFJQSxJQUFNLFNBQU5BLElBQU1DLEdBQUEsTUFBSyxPQUFTQSxHQUN4QkMsUUFBUUMsSUFBSUgsSUFBSSJ9",
|
||||||
@@ -642,10 +579,8 @@ describe("bin/uglifyjs", function () {
|
|||||||
"-c",
|
"-c",
|
||||||
"--source-map", "url=inline",
|
"--source-map", "url=inline",
|
||||||
].join(" ");
|
].join(" ");
|
||||||
|
|
||||||
exec(command, function(err, stdout, stderr) {
|
exec(command, function(err, stdout, stderr) {
|
||||||
if (err) throw err;
|
if (err) throw err;
|
||||||
|
|
||||||
assert.strictEqual(stdout, [
|
assert.strictEqual(stdout, [
|
||||||
'function foo(){return function(){console.log("PASS")}}foo()();',
|
'function foo(){return function(){console.log("PASS")}}foo()();',
|
||||||
"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvaW5wdXQvaXNzdWUtMjMxMC9pbnB1dC5qcyJdLCJuYW1lcyI6WyJmb28iLCJjb25zb2xlIiwibG9nIiwiZiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsTUFDTCxPQUFPLFdBQ0hDLFFBQVFDLElBQUksU0FLUkYsS0FDUkcifQ==",
|
"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvaW5wdXQvaXNzdWUtMjMxMC9pbnB1dC5qcyJdLCJuYW1lcyI6WyJmb28iLCJjb25zb2xlIiwibG9nIiwiZiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsTUFDTCxPQUFPLFdBQ0hDLFFBQVFDLElBQUksU0FLUkYsS0FDUkcifQ==",
|
||||||
@@ -656,9 +591,8 @@ describe("bin/uglifyjs", function () {
|
|||||||
});
|
});
|
||||||
it("Should dump AST as JSON", function(done) {
|
it("Should dump AST as JSON", function(done) {
|
||||||
var command = uglifyjscmd + " test/input/global_defs/simple.js -mco ast";
|
var command = uglifyjscmd + " test/input/global_defs/simple.js -mco ast";
|
||||||
exec(command, function (err, stdout) {
|
exec(command, function(err, stdout) {
|
||||||
if (err) throw err;
|
if (err) throw err;
|
||||||
|
|
||||||
var ast = JSON.parse(stdout);
|
var ast = JSON.parse(stdout);
|
||||||
assert.strictEqual(ast._class, "AST_Toplevel");
|
assert.strictEqual(ast._class, "AST_Toplevel");
|
||||||
assert.ok(Array.isArray(ast.body));
|
assert.ok(Array.isArray(ast.body));
|
||||||
@@ -667,7 +601,7 @@ describe("bin/uglifyjs", function () {
|
|||||||
});
|
});
|
||||||
it("Should print supported options on invalid option syntax", function(done) {
|
it("Should print supported options on invalid option syntax", function(done) {
|
||||||
var command = uglifyjscmd + " test/input/comments/filter.js -b ascii-only";
|
var command = uglifyjscmd + " test/input/comments/filter.js -b ascii-only";
|
||||||
exec(command, function (err, stdout, stderr) {
|
exec(command, function(err, stdout, stderr) {
|
||||||
assert.ok(err);
|
assert.ok(err);
|
||||||
assert.strictEqual(stdout, "");
|
assert.strictEqual(stdout, "");
|
||||||
assert.ok(/^Supported options:\n[\s\S]*?\nERROR: `ascii-only` is not a supported option/.test(stderr), stderr);
|
assert.ok(/^Supported options:\n[\s\S]*?\nERROR: `ascii-only` is not a supported option/.test(stderr), stderr);
|
||||||
@@ -676,27 +610,23 @@ describe("bin/uglifyjs", function () {
|
|||||||
});
|
});
|
||||||
it("Should work with --mangle reserved=[]", function(done) {
|
it("Should work with --mangle reserved=[]", function(done) {
|
||||||
var command = uglifyjscmd + " test/input/issue-505/input.js -m reserved=[callback]";
|
var command = uglifyjscmd + " test/input/issue-505/input.js -m reserved=[callback]";
|
||||||
|
exec(command, function(err, stdout) {
|
||||||
exec(command, function (err, stdout) {
|
|
||||||
if (err) throw err;
|
if (err) throw err;
|
||||||
|
|
||||||
assert.strictEqual(stdout, 'function test(callback){"aaaaaaaaaaaaaaaa";callback(err,data);callback(err,data)}\n');
|
assert.strictEqual(stdout, 'function test(callback){"aaaaaaaaaaaaaaaa";callback(err,data);callback(err,data)}\n');
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it("Should work with --mangle reserved=false", function(done) {
|
it("Should work with --mangle reserved=false", function(done) {
|
||||||
var command = uglifyjscmd + " test/input/issue-505/input.js -m reserved=false";
|
var command = uglifyjscmd + " test/input/issue-505/input.js -m reserved=false";
|
||||||
|
exec(command, function(err, stdout) {
|
||||||
exec(command, function (err, stdout) {
|
|
||||||
if (err) throw err;
|
if (err) throw err;
|
||||||
|
|
||||||
assert.strictEqual(stdout, 'function test(a){"aaaaaaaaaaaaaaaa";a(err,data);a(err,data)}\n');
|
assert.strictEqual(stdout, 'function test(a){"aaaaaaaaaaaaaaaa";a(err,data);a(err,data)}\n');
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it("Should fail with --mangle-props reserved=[in]", function(done) {
|
it("Should fail with --mangle-props reserved=[in]", function(done) {
|
||||||
var command = uglifyjscmd + " test/input/issue-505/input.js --mangle-props reserved=[in]";
|
var command = uglifyjscmd + " test/input/issue-505/input.js --mangle-props reserved=[in]";
|
||||||
exec(command, function (err, stdout, stderr) {
|
exec(command, function(err, stdout, stderr) {
|
||||||
assert.ok(err);
|
assert.ok(err);
|
||||||
assert.strictEqual(stdout, "");
|
assert.strictEqual(stdout, "");
|
||||||
assert.ok(/^Supported options:\n[\s\S]*?\nERROR: `reserved=\[in]` is not a supported option/.test(stderr), stderr);
|
assert.ok(/^Supported options:\n[\s\S]*?\nERROR: `reserved=\[in]` is not a supported option/.test(stderr), stderr);
|
||||||
@@ -705,7 +635,7 @@ describe("bin/uglifyjs", function () {
|
|||||||
});
|
});
|
||||||
it("Should fail with --define a-b", function(done) {
|
it("Should fail with --define a-b", function(done) {
|
||||||
var command = uglifyjscmd + " test/input/issue-505/input.js --define a-b";
|
var command = uglifyjscmd + " test/input/issue-505/input.js --define a-b";
|
||||||
exec(command, function (err, stdout, stderr) {
|
exec(command, function(err, stdout, stderr) {
|
||||||
assert.ok(err);
|
assert.ok(err);
|
||||||
assert.strictEqual(stdout, "");
|
assert.strictEqual(stdout, "");
|
||||||
assert.strictEqual(stderr, "Error parsing arguments for 'define': a-b\n");
|
assert.strictEqual(stderr, "Error parsing arguments for 'define': a-b\n");
|
||||||
@@ -744,4 +674,36 @@ describe("bin/uglifyjs", function () {
|
|||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
it("Should work with --enclose", function(done) {
|
||||||
|
var command = uglifyjscmd + " test/input/enclose/input.js --enclose";
|
||||||
|
exec(command, function(err, stdout, stderr) {
|
||||||
|
if (err) throw err;
|
||||||
|
assert.strictEqual(stdout, '(function(){function enclose(){console.log("test enclose")}enclose()})();\n');
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it("Should work with --enclose arg", function(done) {
|
||||||
|
var command = uglifyjscmd + " test/input/enclose/input.js --enclose undefined";
|
||||||
|
exec(command, function(err, stdout, stderr) {
|
||||||
|
if (err) throw err;
|
||||||
|
assert.strictEqual(stdout, '(function(undefined){function enclose(){console.log("test enclose")}enclose()})();\n');
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it("Should work with --enclose arg:value", function(done) {
|
||||||
|
var command = uglifyjscmd + " test/input/enclose/input.js --enclose window,undefined:window";
|
||||||
|
exec(command, function(err, stdout, stderr) {
|
||||||
|
if (err) throw err;
|
||||||
|
assert.strictEqual(stdout, '(function(window,undefined){function enclose(){console.log("test enclose")}enclose()})(window);\n');
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it("Should work with --enclose & --wrap", function(done) {
|
||||||
|
var command = uglifyjscmd + " test/input/enclose/input.js --enclose window,undefined:window --wrap exports";
|
||||||
|
exec(command, function(err, stdout, stderr) {
|
||||||
|
if (err) throw err;
|
||||||
|
assert.strictEqual(stdout, '(function(window,undefined){(function(exports){function enclose(){console.log("test enclose")}enclose()})(typeof exports=="undefined"?exports={}:exports)})(window);\n');
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,89 +0,0 @@
|
|||||||
var UglifyJS = require("../node");
|
|
||||||
var assert = require("assert");
|
|
||||||
|
|
||||||
describe("comment filters", function() {
|
|
||||||
it("Should be able to filter comments by passing regexp", function() {
|
|
||||||
var ast = UglifyJS.parse("/*!test1*/\n/*test2*/\n//!test3\n//test4\n<!--test5\n<!--!test6\n-->test7\n-->!test8");
|
|
||||||
assert.strictEqual(ast.print_to_string({comments: /^!/}), "/*!test1*/\n//!test3\n//!test6\n//!test8\n");
|
|
||||||
});
|
|
||||||
|
|
||||||
it("Should be able to filter comments with the 'all' option", function() {
|
|
||||||
var ast = UglifyJS.parse("/*!test1*/\n/*test2*/\n//!test3\n//test4\n<!--test5\n<!--!test6\n-->test7\n-->!test8");
|
|
||||||
assert.strictEqual(ast.print_to_string({comments: "all"}), "/*!test1*/\n/*test2*/\n//!test3\n//test4\n//test5\n//!test6\n//test7\n//!test8\n");
|
|
||||||
});
|
|
||||||
|
|
||||||
it("Should be able to filter commments with the 'some' option", function() {
|
|
||||||
var ast = UglifyJS.parse("// foo\n/*@preserve*/\n// bar\n/*@license*/\n//@license with the wrong comment type\n/*@cc_on something*/");
|
|
||||||
assert.strictEqual(ast.print_to_string({comments: "some"}), "/*@preserve*/\n/*@license*/\n/*@cc_on something*/");
|
|
||||||
});
|
|
||||||
|
|
||||||
it("Should be able to filter comments by passing a function", function() {
|
|
||||||
var ast = UglifyJS.parse("/*TEST 123*/\n//An other comment\n//8 chars.");
|
|
||||||
var f = function(node, comment) {
|
|
||||||
return comment.value.length === 8;
|
|
||||||
};
|
|
||||||
|
|
||||||
assert.strictEqual(ast.print_to_string({comments: f}), "/*TEST 123*/\n//8 chars.\n");
|
|
||||||
});
|
|
||||||
|
|
||||||
it("Should be able to filter comments by passing regex in string format", function() {
|
|
||||||
var ast = UglifyJS.parse("/*!test1*/\n/*test2*/\n//!test3\n//test4\n<!--test5\n<!--!test6\n-->test7\n-->!test8");
|
|
||||||
assert.strictEqual(ast.print_to_string({comments: "/^!/"}), "/*!test1*/\n//!test3\n//!test6\n//!test8\n");
|
|
||||||
});
|
|
||||||
|
|
||||||
it("Should be able to get the comment and comment type when using a function", function() {
|
|
||||||
var ast = UglifyJS.parse("/*!test1*/\n/*test2*/\n//!test3\n//test4\n<!--test5\n<!--!test6\n-->test7\n-->!test8");
|
|
||||||
var f = function(node, comment) {
|
|
||||||
return comment.type == "comment1" || comment.type == "comment3";
|
|
||||||
};
|
|
||||||
|
|
||||||
assert.strictEqual(ast.print_to_string({comments: f}), "//!test3\n//test4\n//test5\n//!test6\n");
|
|
||||||
});
|
|
||||||
|
|
||||||
it("Should be able to filter comments by passing a boolean", function() {
|
|
||||||
var ast = UglifyJS.parse("/*!test1*/\n/*test2*/\n//!test3\n//test4\n<!--test5\n<!--!test6\n-->test7\n-->!test8");
|
|
||||||
|
|
||||||
assert.strictEqual(ast.print_to_string({comments: true}), "/*!test1*/\n/*test2*/\n//!test3\n//test4\n//test5\n//!test6\n//test7\n//!test8\n");
|
|
||||||
assert.strictEqual(ast.print_to_string({comments: false}), "");
|
|
||||||
});
|
|
||||||
|
|
||||||
it("Should never be able to filter comment5 (shebangs)", function() {
|
|
||||||
var ast = UglifyJS.parse("#!Random comment\n//test1\n/*test2*/");
|
|
||||||
var f = function(node, comment) {
|
|
||||||
assert.strictEqual(comment.type === "comment5", false);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
|
|
||||||
assert.strictEqual(ast.print_to_string({comments: f}), "#!Random comment\n//test1\n/*test2*/");
|
|
||||||
});
|
|
||||||
|
|
||||||
it("Should never be able to filter comment5 when using 'some' as filter", function() {
|
|
||||||
var ast = UglifyJS.parse("#!foo\n//foo\n/*@preserve*/\n/* please hide me */");
|
|
||||||
assert.strictEqual(ast.print_to_string({comments: "some"}), "#!foo\n/*@preserve*/");
|
|
||||||
});
|
|
||||||
|
|
||||||
it("Should have no problem on multiple calls", function() {
|
|
||||||
const options = {
|
|
||||||
comments: /ok/
|
|
||||||
};
|
|
||||||
|
|
||||||
assert.strictEqual(UglifyJS.parse("/* ok */ function a(){}").print_to_string(options), "/* ok */function a(){}");
|
|
||||||
assert.strictEqual(UglifyJS.parse("/* ok */ function a(){}").print_to_string(options), "/* ok */function a(){}");
|
|
||||||
assert.strictEqual(UglifyJS.parse("/* ok */ function a(){}").print_to_string(options), "/* ok */function a(){}");
|
|
||||||
});
|
|
||||||
|
|
||||||
it("Should handle shebang and preamble correctly", function() {
|
|
||||||
var code = UglifyJS.minify("#!/usr/bin/node\nvar x = 10;", {
|
|
||||||
output: { preamble: "/* Build */" }
|
|
||||||
}).code;
|
|
||||||
assert.strictEqual(code, "#!/usr/bin/node\n/* Build */\nvar x=10;");
|
|
||||||
});
|
|
||||||
|
|
||||||
it("Should handle preamble without shebang correctly", function() {
|
|
||||||
var code = UglifyJS.minify("var x = 10;", {
|
|
||||||
output: { preamble: "/* Build */" }
|
|
||||||
}).code;
|
|
||||||
assert.strictEqual(code, "/* Build */\nvar x=10;");
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@@ -1,262 +0,0 @@
|
|||||||
var assert = require("assert");
|
|
||||||
var uglify = require("../node");
|
|
||||||
|
|
||||||
describe("Comment", function() {
|
|
||||||
it("Should recognize eol of single line comments", function() {
|
|
||||||
var tests = [
|
|
||||||
"//Some comment 1\n>",
|
|
||||||
"//Some comment 2\r>",
|
|
||||||
"//Some comment 3\r\n>",
|
|
||||||
"//Some comment 4\u2028>",
|
|
||||||
"//Some comment 5\u2029>"
|
|
||||||
];
|
|
||||||
|
|
||||||
var fail = function(e) {
|
|
||||||
return e instanceof uglify.JS_Parse_Error &&
|
|
||||||
e.message === "Unexpected token: operator (>)" &&
|
|
||||||
e.line === 2 &&
|
|
||||||
e.col === 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var i = 0; i < tests.length; i++) {
|
|
||||||
assert.throws(function() {
|
|
||||||
uglify.parse(tests[i]);
|
|
||||||
}, fail, tests[i]);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
it("Should update the position of a multiline comment correctly", function() {
|
|
||||||
var tests = [
|
|
||||||
"/*Some comment 1\n\n\n*/\n>\n\n\n\n\n\n",
|
|
||||||
"/*Some comment 2\r\n\r\n\r\n*/\r\n>\n\n\n\n\n\n",
|
|
||||||
"/*Some comment 3\r\r\r*/\r>\n\n\n\n\n\n",
|
|
||||||
"/*Some comment 4\u2028\u2028\u2028*/\u2028>\n\n\n\n\n\n",
|
|
||||||
"/*Some comment 5\u2029\u2029\u2029*/\u2029>\n\n\n\n\n\n"
|
|
||||||
];
|
|
||||||
|
|
||||||
var fail = function(e) {
|
|
||||||
return e instanceof uglify.JS_Parse_Error &&
|
|
||||||
e.message === "Unexpected token: operator (>)" &&
|
|
||||||
e.line === 5 &&
|
|
||||||
e.col === 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var i = 0; i < tests.length; i++) {
|
|
||||||
assert.throws(function() {
|
|
||||||
uglify.parse(tests[i]);
|
|
||||||
}, fail, tests[i]);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
it("Should handle comment within return correctly", function() {
|
|
||||||
var result = uglify.minify([
|
|
||||||
"function unequal(x, y) {",
|
|
||||||
" return (",
|
|
||||||
" // Either one",
|
|
||||||
" x < y",
|
|
||||||
" ||",
|
|
||||||
" y < x",
|
|
||||||
" );",
|
|
||||||
"}",
|
|
||||||
].join("\n"), {
|
|
||||||
compress: false,
|
|
||||||
mangle: false,
|
|
||||||
output: {
|
|
||||||
beautify: true,
|
|
||||||
comments: "all",
|
|
||||||
},
|
|
||||||
});
|
|
||||||
if (result.error) throw result.error;
|
|
||||||
assert.strictEqual(result.code, [
|
|
||||||
"function unequal(x, y) {",
|
|
||||||
" // Either one",
|
|
||||||
" return x < y || y < x;",
|
|
||||||
"}",
|
|
||||||
].join("\n"));
|
|
||||||
});
|
|
||||||
|
|
||||||
it("Should handle comment folded into return correctly", function() {
|
|
||||||
var result = uglify.minify([
|
|
||||||
"function f() {",
|
|
||||||
" /* boo */ x();",
|
|
||||||
" return y();",
|
|
||||||
"}",
|
|
||||||
].join("\n"), {
|
|
||||||
mangle: false,
|
|
||||||
output: {
|
|
||||||
beautify: true,
|
|
||||||
comments: "all",
|
|
||||||
},
|
|
||||||
});
|
|
||||||
if (result.error) throw result.error;
|
|
||||||
assert.strictEqual(result.code, [
|
|
||||||
"function f() {",
|
|
||||||
" /* boo */",
|
|
||||||
" return x(), y();",
|
|
||||||
"}",
|
|
||||||
].join("\n"));
|
|
||||||
});
|
|
||||||
|
|
||||||
it("Should not drop comments after first OutputStream", function() {
|
|
||||||
var code = "/* boo */\nx();";
|
|
||||||
var ast = uglify.parse(code);
|
|
||||||
var out1 = uglify.OutputStream({
|
|
||||||
beautify: true,
|
|
||||||
comments: "all",
|
|
||||||
});
|
|
||||||
ast.print(out1);
|
|
||||||
var out2 = uglify.OutputStream({
|
|
||||||
beautify: true,
|
|
||||||
comments: "all",
|
|
||||||
});
|
|
||||||
ast.print(out2);
|
|
||||||
assert.strictEqual(out1.get(), code);
|
|
||||||
assert.strictEqual(out2.get(), out1.get());
|
|
||||||
});
|
|
||||||
|
|
||||||
it("Should retain trailing comments", function() {
|
|
||||||
var code = [
|
|
||||||
"if (foo /* lost comment */ && bar /* lost comment */) {",
|
|
||||||
" // this one is kept",
|
|
||||||
" {/* lost comment */}",
|
|
||||||
" !function() {",
|
|
||||||
" // lost comment",
|
|
||||||
" }();",
|
|
||||||
" function baz() {/* lost comment */}",
|
|
||||||
" // lost comment",
|
|
||||||
"}",
|
|
||||||
"// comments right before EOF are lost as well",
|
|
||||||
].join("\n");
|
|
||||||
var result = uglify.minify(code, {
|
|
||||||
compress: false,
|
|
||||||
mangle: false,
|
|
||||||
output: {
|
|
||||||
beautify: true,
|
|
||||||
comments: "all",
|
|
||||||
},
|
|
||||||
});
|
|
||||||
if (result.error) throw result.error;
|
|
||||||
assert.strictEqual(result.code, code);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("Should retain comments within braces", function() {
|
|
||||||
var code = [
|
|
||||||
"{/* foo */}",
|
|
||||||
"a({/* foo */});",
|
|
||||||
"while (a) {/* foo */}",
|
|
||||||
"switch (a) {/* foo */}",
|
|
||||||
"if (a) {/* foo */} else {/* bar */}",
|
|
||||||
].join("\n\n");
|
|
||||||
var result = uglify.minify(code, {
|
|
||||||
compress: false,
|
|
||||||
mangle: false,
|
|
||||||
output: {
|
|
||||||
beautify: true,
|
|
||||||
comments: "all",
|
|
||||||
},
|
|
||||||
});
|
|
||||||
if (result.error) throw result.error;
|
|
||||||
assert.strictEqual(result.code, code);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("Should correctly preserve new lines around comments", function() {
|
|
||||||
var tests = [
|
|
||||||
[
|
|
||||||
"// foo",
|
|
||||||
"// bar",
|
|
||||||
"x();",
|
|
||||||
].join("\n"),
|
|
||||||
[
|
|
||||||
"// foo",
|
|
||||||
"/* bar */",
|
|
||||||
"x();",
|
|
||||||
].join("\n"),
|
|
||||||
[
|
|
||||||
"// foo",
|
|
||||||
"/* bar */ x();",
|
|
||||||
].join("\n"),
|
|
||||||
[
|
|
||||||
"/* foo */",
|
|
||||||
"// bar",
|
|
||||||
"x();",
|
|
||||||
].join("\n"),
|
|
||||||
[
|
|
||||||
"/* foo */ // bar",
|
|
||||||
"x();",
|
|
||||||
].join("\n"),
|
|
||||||
[
|
|
||||||
"/* foo */",
|
|
||||||
"/* bar */",
|
|
||||||
"x();",
|
|
||||||
].join("\n"),
|
|
||||||
[
|
|
||||||
"/* foo */",
|
|
||||||
"/* bar */ x();",
|
|
||||||
].join("\n"),
|
|
||||||
[
|
|
||||||
"/* foo */ /* bar */",
|
|
||||||
"x();",
|
|
||||||
].join("\n"),
|
|
||||||
"/* foo */ /* bar */ x();",
|
|
||||||
].forEach(function(code) {
|
|
||||||
var result = uglify.minify(code, {
|
|
||||||
compress: false,
|
|
||||||
mangle: false,
|
|
||||||
output: {
|
|
||||||
beautify: true,
|
|
||||||
comments: "all",
|
|
||||||
},
|
|
||||||
});
|
|
||||||
if (result.error) throw result.error;
|
|
||||||
assert.strictEqual(result.code, code);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
it("Should preserve new line before comment without beautify", function() {
|
|
||||||
var code = [
|
|
||||||
"function f(){",
|
|
||||||
"/* foo */bar()}",
|
|
||||||
].join("\n");
|
|
||||||
var result = uglify.minify(code, {
|
|
||||||
compress: false,
|
|
||||||
mangle: false,
|
|
||||||
output: {
|
|
||||||
comments: "all",
|
|
||||||
},
|
|
||||||
});
|
|
||||||
if (result.error) throw result.error;
|
|
||||||
assert.strictEqual(result.code, code);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("Should preserve comments around IIFE", function() {
|
|
||||||
var result = uglify.minify("/*a*/(/*b*/function(){/*c*/}/*d*/)/*e*/();", {
|
|
||||||
compress: false,
|
|
||||||
mangle: false,
|
|
||||||
output: {
|
|
||||||
comments: "all",
|
|
||||||
},
|
|
||||||
});
|
|
||||||
if (result.error) throw result.error;
|
|
||||||
assert.strictEqual(result.code, "/*a*/ /*b*/(function(){/*c*/}/*d*/ /*e*/)();");
|
|
||||||
});
|
|
||||||
|
|
||||||
it("Should output line comments after statements", function() {
|
|
||||||
var result = uglify.minify([
|
|
||||||
"x()//foo",
|
|
||||||
"{y()//bar",
|
|
||||||
"}",
|
|
||||||
].join("\n"), {
|
|
||||||
compress: false,
|
|
||||||
mangle: false,
|
|
||||||
output: {
|
|
||||||
comments: "all",
|
|
||||||
},
|
|
||||||
});
|
|
||||||
if (result.error) throw result.error;
|
|
||||||
assert.strictEqual(result.code, [
|
|
||||||
"x();//foo",
|
|
||||||
"{y();//bar",
|
|
||||||
"}",
|
|
||||||
].join("\n"));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
var Uglify = require('../../');
|
|
||||||
var assert = require("assert");
|
|
||||||
|
|
||||||
describe("comment before constant", function() {
|
|
||||||
var js = 'function f() { /*c1*/ var /*c2*/ foo = /*c3*/ false; return foo; }';
|
|
||||||
|
|
||||||
it("Should test comment before constant is retained and output after mangle.", function() {
|
|
||||||
var result = Uglify.minify(js, {
|
|
||||||
compress: { collapse_vars: false, reduce_vars: false },
|
|
||||||
output: { comments: true },
|
|
||||||
});
|
|
||||||
assert.strictEqual(result.code, 'function f(){/*c1*/var/*c2*/n=/*c3*/!1;return n}');
|
|
||||||
});
|
|
||||||
|
|
||||||
it("Should test code works when comments disabled.", function() {
|
|
||||||
var result = Uglify.minify(js, {
|
|
||||||
compress: { collapse_vars: false, reduce_vars: false },
|
|
||||||
output: { comments: false },
|
|
||||||
});
|
|
||||||
assert.strictEqual(result.code, 'function f(){var n=!1;return n}');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
380
test/mocha/comments.js
Normal file
380
test/mocha/comments.js
Normal file
@@ -0,0 +1,380 @@
|
|||||||
|
var assert = require("assert");
|
||||||
|
var UglifyJS = require("../node");
|
||||||
|
|
||||||
|
describe("comments", function() {
|
||||||
|
it("Should recognize eol of single line comments", function() {
|
||||||
|
var tests = [
|
||||||
|
"//Some comment 1\n>",
|
||||||
|
"//Some comment 2\r>",
|
||||||
|
"//Some comment 3\r\n>",
|
||||||
|
"//Some comment 4\u2028>",
|
||||||
|
"//Some comment 5\u2029>"
|
||||||
|
];
|
||||||
|
|
||||||
|
var fail = function(e) {
|
||||||
|
return e instanceof UglifyJS.JS_Parse_Error
|
||||||
|
&& e.message === "Unexpected token: operator (>)"
|
||||||
|
&& e.line === 2
|
||||||
|
&& e.col === 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0; i < tests.length; i++) {
|
||||||
|
assert.throws(function() {
|
||||||
|
UglifyJS.parse(tests[i]);
|
||||||
|
}, fail, tests[i]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
it("Should update the position of a multiline comment correctly", function() {
|
||||||
|
var tests = [
|
||||||
|
"/*Some comment 1\n\n\n*/\n>\n\n\n\n\n\n",
|
||||||
|
"/*Some comment 2\r\n\r\n\r\n*/\r\n>\n\n\n\n\n\n",
|
||||||
|
"/*Some comment 3\r\r\r*/\r>\n\n\n\n\n\n",
|
||||||
|
"/*Some comment 4\u2028\u2028\u2028*/\u2028>\n\n\n\n\n\n",
|
||||||
|
"/*Some comment 5\u2029\u2029\u2029*/\u2029>\n\n\n\n\n\n"
|
||||||
|
];
|
||||||
|
|
||||||
|
var fail = function(e) {
|
||||||
|
return e instanceof UglifyJS.JS_Parse_Error
|
||||||
|
&& e.message === "Unexpected token: operator (>)"
|
||||||
|
&& e.line === 5
|
||||||
|
&& e.col === 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0; i < tests.length; i++) {
|
||||||
|
assert.throws(function() {
|
||||||
|
UglifyJS.parse(tests[i]);
|
||||||
|
}, fail, tests[i]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
it("Should handle comment within return correctly", function() {
|
||||||
|
var result = UglifyJS.minify([
|
||||||
|
"function unequal(x, y) {",
|
||||||
|
" return (",
|
||||||
|
" // Either one",
|
||||||
|
" x < y",
|
||||||
|
" ||",
|
||||||
|
" y < x",
|
||||||
|
" );",
|
||||||
|
"}",
|
||||||
|
].join("\n"), {
|
||||||
|
compress: false,
|
||||||
|
mangle: false,
|
||||||
|
output: {
|
||||||
|
beautify: true,
|
||||||
|
comments: "all",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
if (result.error) throw result.error;
|
||||||
|
assert.strictEqual(result.code, [
|
||||||
|
"function unequal(x, y) {",
|
||||||
|
" // Either one",
|
||||||
|
" return x < y || y < x;",
|
||||||
|
"}",
|
||||||
|
].join("\n"));
|
||||||
|
});
|
||||||
|
|
||||||
|
it("Should handle comment folded into return correctly", function() {
|
||||||
|
var result = UglifyJS.minify([
|
||||||
|
"function f() {",
|
||||||
|
" /* boo */ x();",
|
||||||
|
" return y();",
|
||||||
|
"}",
|
||||||
|
].join("\n"), {
|
||||||
|
mangle: false,
|
||||||
|
output: {
|
||||||
|
beautify: true,
|
||||||
|
comments: "all",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
if (result.error) throw result.error;
|
||||||
|
assert.strictEqual(result.code, [
|
||||||
|
"function f() {",
|
||||||
|
" /* boo */",
|
||||||
|
" return x(), y();",
|
||||||
|
"}",
|
||||||
|
].join("\n"));
|
||||||
|
});
|
||||||
|
|
||||||
|
it("Should not drop comments after first OutputStream", function() {
|
||||||
|
var code = "/* boo */\nx();";
|
||||||
|
var ast = UglifyJS.parse(code);
|
||||||
|
var out1 = UglifyJS.OutputStream({
|
||||||
|
beautify: true,
|
||||||
|
comments: "all",
|
||||||
|
});
|
||||||
|
ast.print(out1);
|
||||||
|
var out2 = UglifyJS.OutputStream({
|
||||||
|
beautify: true,
|
||||||
|
comments: "all",
|
||||||
|
});
|
||||||
|
ast.print(out2);
|
||||||
|
assert.strictEqual(out1.get(), code);
|
||||||
|
assert.strictEqual(out2.get(), out1.get());
|
||||||
|
});
|
||||||
|
|
||||||
|
it("Should retain trailing comments", function() {
|
||||||
|
var code = [
|
||||||
|
"if (foo /* lost comment */ && bar /* lost comment */) {",
|
||||||
|
" // this one is kept",
|
||||||
|
" {/* lost comment */}",
|
||||||
|
" !function() {",
|
||||||
|
" // lost comment",
|
||||||
|
" }();",
|
||||||
|
" function baz() {/* lost comment */}",
|
||||||
|
" // lost comment",
|
||||||
|
"}",
|
||||||
|
"// comments right before EOF are lost as well",
|
||||||
|
].join("\n");
|
||||||
|
var result = UglifyJS.minify(code, {
|
||||||
|
compress: false,
|
||||||
|
mangle: false,
|
||||||
|
output: {
|
||||||
|
beautify: true,
|
||||||
|
comments: "all",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
if (result.error) throw result.error;
|
||||||
|
assert.strictEqual(result.code, code);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("Should retain comments within braces", function() {
|
||||||
|
var code = [
|
||||||
|
"{/* foo */}",
|
||||||
|
"a({/* foo */});",
|
||||||
|
"while (a) {/* foo */}",
|
||||||
|
"switch (a) {/* foo */}",
|
||||||
|
"if (a) {/* foo */} else {/* bar */}",
|
||||||
|
].join("\n\n");
|
||||||
|
var result = UglifyJS.minify(code, {
|
||||||
|
compress: false,
|
||||||
|
mangle: false,
|
||||||
|
output: {
|
||||||
|
beautify: true,
|
||||||
|
comments: "all",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
if (result.error) throw result.error;
|
||||||
|
assert.strictEqual(result.code, code);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("Should correctly preserve new lines around comments", function() {
|
||||||
|
var tests = [
|
||||||
|
[
|
||||||
|
"// foo",
|
||||||
|
"// bar",
|
||||||
|
"x();",
|
||||||
|
].join("\n"),
|
||||||
|
[
|
||||||
|
"// foo",
|
||||||
|
"/* bar */",
|
||||||
|
"x();",
|
||||||
|
].join("\n"),
|
||||||
|
[
|
||||||
|
"// foo",
|
||||||
|
"/* bar */ x();",
|
||||||
|
].join("\n"),
|
||||||
|
[
|
||||||
|
"/* foo */",
|
||||||
|
"// bar",
|
||||||
|
"x();",
|
||||||
|
].join("\n"),
|
||||||
|
[
|
||||||
|
"/* foo */ // bar",
|
||||||
|
"x();",
|
||||||
|
].join("\n"),
|
||||||
|
[
|
||||||
|
"/* foo */",
|
||||||
|
"/* bar */",
|
||||||
|
"x();",
|
||||||
|
].join("\n"),
|
||||||
|
[
|
||||||
|
"/* foo */",
|
||||||
|
"/* bar */ x();",
|
||||||
|
].join("\n"),
|
||||||
|
[
|
||||||
|
"/* foo */ /* bar */",
|
||||||
|
"x();",
|
||||||
|
].join("\n"),
|
||||||
|
"/* foo */ /* bar */ x();",
|
||||||
|
].forEach(function(code) {
|
||||||
|
var result = UglifyJS.minify(code, {
|
||||||
|
compress: false,
|
||||||
|
mangle: false,
|
||||||
|
output: {
|
||||||
|
beautify: true,
|
||||||
|
comments: "all",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
if (result.error) throw result.error;
|
||||||
|
assert.strictEqual(result.code, code);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("Should preserve new line before comment without beautify", function() {
|
||||||
|
var code = [
|
||||||
|
"function f(){",
|
||||||
|
"/* foo */bar()}",
|
||||||
|
].join("\n");
|
||||||
|
var result = UglifyJS.minify(code, {
|
||||||
|
compress: false,
|
||||||
|
mangle: false,
|
||||||
|
output: {
|
||||||
|
comments: "all",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
if (result.error) throw result.error;
|
||||||
|
assert.strictEqual(result.code, code);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("Should preserve comments around IIFE", function() {
|
||||||
|
var result = UglifyJS.minify("/*a*/(/*b*/function(){/*c*/}/*d*/)/*e*/();", {
|
||||||
|
compress: false,
|
||||||
|
mangle: false,
|
||||||
|
output: {
|
||||||
|
comments: "all",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
if (result.error) throw result.error;
|
||||||
|
assert.strictEqual(result.code, "/*a*/ /*b*/(function(){/*c*/}/*d*/ /*e*/)();");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("Should output line comments after statements", function() {
|
||||||
|
var result = UglifyJS.minify([
|
||||||
|
"x()//foo",
|
||||||
|
"{y()//bar",
|
||||||
|
"}",
|
||||||
|
].join("\n"), {
|
||||||
|
compress: false,
|
||||||
|
mangle: false,
|
||||||
|
output: {
|
||||||
|
comments: "all",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
if (result.error) throw result.error;
|
||||||
|
assert.strictEqual(result.code, [
|
||||||
|
"x();//foo",
|
||||||
|
"{y();//bar",
|
||||||
|
"}",
|
||||||
|
].join("\n"));
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("comment before constant", function() {
|
||||||
|
var js = 'function f() { /*c1*/ var /*c2*/ foo = /*c3*/ false; return foo; }';
|
||||||
|
|
||||||
|
it("Should test comment before constant is retained and output after mangle.", function() {
|
||||||
|
var result = UglifyJS.minify(js, {
|
||||||
|
compress: { collapse_vars: false, reduce_vars: false },
|
||||||
|
output: { comments: true },
|
||||||
|
});
|
||||||
|
assert.strictEqual(result.code, 'function f(){/*c1*/var/*c2*/n=/*c3*/!1;return n}');
|
||||||
|
});
|
||||||
|
|
||||||
|
it("Should test code works when comments disabled.", function() {
|
||||||
|
var result = UglifyJS.minify(js, {
|
||||||
|
compress: { collapse_vars: false, reduce_vars: false },
|
||||||
|
output: { comments: false },
|
||||||
|
});
|
||||||
|
assert.strictEqual(result.code, 'function f(){var n=!1;return n}');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("comment filters", function() {
|
||||||
|
it("Should be able to filter comments by passing regexp", function() {
|
||||||
|
var ast = UglifyJS.parse("/*!test1*/\n/*test2*/\n//!test3\n//test4\n<!--test5\n<!--!test6\n-->test7\n-->!test8");
|
||||||
|
assert.strictEqual(ast.print_to_string({comments: /^!/}), "/*!test1*/\n//!test3\n//!test6\n//!test8\n");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("Should be able to filter comments with the 'all' option", function() {
|
||||||
|
var ast = UglifyJS.parse("/*!test1*/\n/*test2*/\n//!test3\n//test4\n<!--test5\n<!--!test6\n-->test7\n-->!test8");
|
||||||
|
assert.strictEqual(ast.print_to_string({comments: "all"}), "/*!test1*/\n/*test2*/\n//!test3\n//test4\n//test5\n//!test6\n//test7\n//!test8\n");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("Should be able to filter commments with the 'some' option", function() {
|
||||||
|
var ast = UglifyJS.parse("// foo\n/*@preserve*/\n// bar\n/*@license*/\n//@license with the wrong comment type\n/*@cc_on something*/");
|
||||||
|
assert.strictEqual(ast.print_to_string({comments: "some"}), "/*@preserve*/\n/*@license*/\n/*@cc_on something*/");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("Should be able to filter comments by passing a function", function() {
|
||||||
|
var ast = UglifyJS.parse("/*TEST 123*/\n//An other comment\n//8 chars.");
|
||||||
|
var f = function(node, comment) {
|
||||||
|
return comment.value.length === 8;
|
||||||
|
};
|
||||||
|
|
||||||
|
assert.strictEqual(ast.print_to_string({comments: f}), "/*TEST 123*/\n//8 chars.\n");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("Should be able to filter comments by passing regex in string format", function() {
|
||||||
|
var ast = UglifyJS.parse("/*!test1*/\n/*test2*/\n//!test3\n//test4\n<!--test5\n<!--!test6\n-->test7\n-->!test8");
|
||||||
|
assert.strictEqual(ast.print_to_string({comments: "/^!/"}), "/*!test1*/\n//!test3\n//!test6\n//!test8\n");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("Should be able to get the comment and comment type when using a function", function() {
|
||||||
|
var ast = UglifyJS.parse("/*!test1*/\n/*test2*/\n//!test3\n//test4\n<!--test5\n<!--!test6\n-->test7\n-->!test8");
|
||||||
|
var f = function(node, comment) {
|
||||||
|
return comment.type == "comment1" || comment.type == "comment3";
|
||||||
|
};
|
||||||
|
|
||||||
|
assert.strictEqual(ast.print_to_string({comments: f}), "//!test3\n//test4\n//test5\n//!test6\n");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("Should be able to filter comments by passing a boolean", function() {
|
||||||
|
var ast = UglifyJS.parse("/*!test1*/\n/*test2*/\n//!test3\n//test4\n<!--test5\n<!--!test6\n-->test7\n-->!test8");
|
||||||
|
|
||||||
|
assert.strictEqual(ast.print_to_string({comments: true}), "/*!test1*/\n/*test2*/\n//!test3\n//test4\n//test5\n//!test6\n//test7\n//!test8\n");
|
||||||
|
assert.strictEqual(ast.print_to_string({comments: false}), "");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("Should never be able to filter comment5 (shebangs)", function() {
|
||||||
|
var ast = UglifyJS.parse("#!Random comment\n//test1\n/*test2*/");
|
||||||
|
var f = function(node, comment) {
|
||||||
|
assert.strictEqual(comment.type === "comment5", false);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
assert.strictEqual(ast.print_to_string({comments: f}), "#!Random comment\n//test1\n/*test2*/");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("Should never be able to filter comment5 when using 'some' as filter", function() {
|
||||||
|
var ast = UglifyJS.parse("#!foo\n//foo\n/*@preserve*/\n/* please hide me */");
|
||||||
|
assert.strictEqual(ast.print_to_string({comments: "some"}), "#!foo\n/*@preserve*/");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("Should have no problem on multiple calls", function() {
|
||||||
|
const options = {
|
||||||
|
comments: /ok/
|
||||||
|
};
|
||||||
|
|
||||||
|
assert.strictEqual(UglifyJS.parse("/* ok */ function a(){}").print_to_string(options), "/* ok */function a(){}");
|
||||||
|
assert.strictEqual(UglifyJS.parse("/* ok */ function a(){}").print_to_string(options), "/* ok */function a(){}");
|
||||||
|
assert.strictEqual(UglifyJS.parse("/* ok */ function a(){}").print_to_string(options), "/* ok */function a(){}");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("Should handle shebang and preamble correctly", function() {
|
||||||
|
var code = UglifyJS.minify("#!/usr/bin/node\nvar x = 10;", {
|
||||||
|
output: { preamble: "/* Build */" }
|
||||||
|
}).code;
|
||||||
|
assert.strictEqual(code, "#!/usr/bin/node\n/* Build */\nvar x=10;");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("Should handle preamble without shebang correctly", function() {
|
||||||
|
var code = UglifyJS.minify("var x = 10;", {
|
||||||
|
output: { preamble: "/* Build */" }
|
||||||
|
}).code;
|
||||||
|
assert.strictEqual(code, "/* Build */\nvar x=10;");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("Huge number of comments.", function() {
|
||||||
|
it("Should parse and compress code with thousands of consecutive comments", function() {
|
||||||
|
var js = "function lots_of_comments(x) { return 7 -";
|
||||||
|
for (var i = 1; i <= 5000; ++i) js += "// " + i + "\n";
|
||||||
|
for (; i <= 10000; ++i) js += "/* " + i + " */ /**/";
|
||||||
|
js += "x; }";
|
||||||
|
var result = UglifyJS.minify(js, { mangle: false });
|
||||||
|
assert.strictEqual(result.code, "function lots_of_comments(x){return 7-x}");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -1,15 +1,13 @@
|
|||||||
var assert = require("assert");
|
var assert = require("assert");
|
||||||
var uglify = require("../node");
|
var UglifyJS = require("../node");
|
||||||
|
|
||||||
describe("Directives", function() {
|
describe("Directives", function() {
|
||||||
it ("Should allow tokenizer to store directives state", function() {
|
it("Should allow tokenizer to store directives state", function() {
|
||||||
var tokenizer = uglify.tokenizer("", "foo.js");
|
var tokenizer = UglifyJS.tokenizer("", "foo.js");
|
||||||
|
|
||||||
// Stack level 0
|
// Stack level 0
|
||||||
assert.strictEqual(tokenizer.has_directive("use strict"), false);
|
assert.strictEqual(tokenizer.has_directive("use strict"), false);
|
||||||
assert.strictEqual(tokenizer.has_directive("use asm"), false);
|
assert.strictEqual(tokenizer.has_directive("use asm"), false);
|
||||||
assert.strictEqual(tokenizer.has_directive("use thing"), false);
|
assert.strictEqual(tokenizer.has_directive("use thing"), false);
|
||||||
|
|
||||||
// Stack level 2
|
// Stack level 2
|
||||||
tokenizer.push_directives_stack();
|
tokenizer.push_directives_stack();
|
||||||
tokenizer.push_directives_stack();
|
tokenizer.push_directives_stack();
|
||||||
@@ -17,7 +15,6 @@ describe("Directives", function() {
|
|||||||
assert.strictEqual(tokenizer.has_directive("use strict"), true);
|
assert.strictEqual(tokenizer.has_directive("use strict"), true);
|
||||||
assert.strictEqual(tokenizer.has_directive("use asm"), false);
|
assert.strictEqual(tokenizer.has_directive("use asm"), false);
|
||||||
assert.strictEqual(tokenizer.has_directive("use thing"), false);
|
assert.strictEqual(tokenizer.has_directive("use thing"), false);
|
||||||
|
|
||||||
// Stack level 3
|
// Stack level 3
|
||||||
tokenizer.push_directives_stack();
|
tokenizer.push_directives_stack();
|
||||||
tokenizer.add_directive("use strict");
|
tokenizer.add_directive("use strict");
|
||||||
@@ -25,13 +22,11 @@ describe("Directives", function() {
|
|||||||
assert.strictEqual(tokenizer.has_directive("use strict"), true);
|
assert.strictEqual(tokenizer.has_directive("use strict"), true);
|
||||||
assert.strictEqual(tokenizer.has_directive("use asm"), true);
|
assert.strictEqual(tokenizer.has_directive("use asm"), true);
|
||||||
assert.strictEqual(tokenizer.has_directive("use thing"), false);
|
assert.strictEqual(tokenizer.has_directive("use thing"), false);
|
||||||
|
|
||||||
// Stack level 2
|
// Stack level 2
|
||||||
tokenizer.pop_directives_stack();
|
tokenizer.pop_directives_stack();
|
||||||
assert.strictEqual(tokenizer.has_directive("use strict"), true);
|
assert.strictEqual(tokenizer.has_directive("use strict"), true);
|
||||||
assert.strictEqual(tokenizer.has_directive("use asm"), false);
|
assert.strictEqual(tokenizer.has_directive("use asm"), false);
|
||||||
assert.strictEqual(tokenizer.has_directive("use thing"), false);
|
assert.strictEqual(tokenizer.has_directive("use thing"), false);
|
||||||
|
|
||||||
// Stack level 3
|
// Stack level 3
|
||||||
tokenizer.push_directives_stack();
|
tokenizer.push_directives_stack();
|
||||||
tokenizer.add_directive("use thing");
|
tokenizer.add_directive("use thing");
|
||||||
@@ -39,172 +34,172 @@ describe("Directives", function() {
|
|||||||
assert.strictEqual(tokenizer.has_directive("use strict"), true);
|
assert.strictEqual(tokenizer.has_directive("use strict"), true);
|
||||||
assert.strictEqual(tokenizer.has_directive("use asm"), false); // Directives are strict!
|
assert.strictEqual(tokenizer.has_directive("use asm"), false); // Directives are strict!
|
||||||
assert.strictEqual(tokenizer.has_directive("use thing"), true);
|
assert.strictEqual(tokenizer.has_directive("use thing"), true);
|
||||||
|
|
||||||
// Stack level 2
|
// Stack level 2
|
||||||
tokenizer.pop_directives_stack();
|
tokenizer.pop_directives_stack();
|
||||||
assert.strictEqual(tokenizer.has_directive("use strict"), true);
|
assert.strictEqual(tokenizer.has_directive("use strict"), true);
|
||||||
assert.strictEqual(tokenizer.has_directive("use asm"), false);
|
assert.strictEqual(tokenizer.has_directive("use asm"), false);
|
||||||
assert.strictEqual(tokenizer.has_directive("use thing"), false);
|
assert.strictEqual(tokenizer.has_directive("use thing"), false);
|
||||||
|
|
||||||
// Stack level 1
|
// Stack level 1
|
||||||
tokenizer.pop_directives_stack();
|
tokenizer.pop_directives_stack();
|
||||||
assert.strictEqual(tokenizer.has_directive("use strict"), false);
|
assert.strictEqual(tokenizer.has_directive("use strict"), false);
|
||||||
assert.strictEqual(tokenizer.has_directive("use asm"), false);
|
assert.strictEqual(tokenizer.has_directive("use asm"), false);
|
||||||
assert.strictEqual(tokenizer.has_directive("use thing"), false);
|
assert.strictEqual(tokenizer.has_directive("use thing"), false);
|
||||||
|
|
||||||
// Stack level 0
|
// Stack level 0
|
||||||
tokenizer.pop_directives_stack();
|
tokenizer.pop_directives_stack();
|
||||||
assert.strictEqual(tokenizer.has_directive("use strict"), false);
|
assert.strictEqual(tokenizer.has_directive("use strict"), false);
|
||||||
assert.strictEqual(tokenizer.has_directive("use asm"), false);
|
assert.strictEqual(tokenizer.has_directive("use asm"), false);
|
||||||
assert.strictEqual(tokenizer.has_directive("use thing"), false);
|
assert.strictEqual(tokenizer.has_directive("use thing"), false);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("Should know which strings are directive and which ones are not", function() {
|
it("Should know which strings are directive and which ones are not", function() {
|
||||||
var test_directive = function(tokenizer, test) {
|
[
|
||||||
test.directives.map(function(directive) {
|
[
|
||||||
assert.strictEqual(tokenizer.has_directive(directive), true, directive + " in " + test.input);
|
'"use strict"\n',
|
||||||
});
|
[ "use strict"],
|
||||||
test.non_directives.map(function(fake_directive) {
|
[ "use asm"]
|
||||||
assert.strictEqual(tokenizer.has_directive(fake_directive), false, fake_directive + " in " + test.input);
|
],
|
||||||
});
|
[
|
||||||
}
|
'"use\\\nstrict";',
|
||||||
|
[],
|
||||||
var tests = [
|
[ "use strict", "use\nstrict", "use \nstrict", "use asm" ]
|
||||||
{
|
],
|
||||||
input: '"use strict"\n',
|
[
|
||||||
directives: ["use strict"],
|
'"use strict"\n"use asm"\n"use bar"\n',
|
||||||
non_directives: ["use asm"]
|
[ "use strict", "use asm", "use bar" ],
|
||||||
},
|
[ "use foo", "use\\x20strict" ]
|
||||||
{
|
],
|
||||||
input: '"use\\\nstrict";',
|
[
|
||||||
directives: [],
|
'"use \\\nstrict";"use strict";',
|
||||||
non_directives: ["use strict", "use\nstrict", "use \nstrict", "use asm"]
|
[],
|
||||||
},
|
[ "use strict", "use\nstrict", "use \nstrict", "use asm" ]
|
||||||
{
|
],
|
||||||
input: '"use strict"\n"use asm"\n"use bar"\n',
|
[
|
||||||
directives: ["use strict", "use asm", "use bar"],
|
'"\\76";',
|
||||||
non_directives: ["use foo", "use\\x20strict"]
|
[],
|
||||||
},
|
[ ">", "\\76" ]
|
||||||
{
|
],
|
||||||
input: '"use \\\nstrict";"use strict";',
|
[
|
||||||
directives: [],
|
// no ; or newline
|
||||||
non_directives: ["use strict", "use\nstrict", "use \nstrict", "use asm"]
|
'"use strict"',
|
||||||
},
|
[],
|
||||||
{
|
[ "use strict", "use\nstrict", "use \nstrict", "use asm" ]
|
||||||
input: '"\\76";',
|
],
|
||||||
directives: [],
|
[
|
||||||
non_directives: [">", "\\76"]
|
';"use strict"',
|
||||||
},
|
[],
|
||||||
{
|
[ "use strict", "use\nstrict", "use \nstrict", "use asm" ]
|
||||||
input: '"use strict"', // no ; or newline
|
],
|
||||||
directives: [],
|
|
||||||
non_directives: ["use strict", "use\nstrict", "use \nstrict", "use asm"]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
input: ';"use strict"',
|
|
||||||
directives: [],
|
|
||||||
non_directives: ["use strict", "use\nstrict", "use \nstrict", "use asm"]
|
|
||||||
},
|
|
||||||
// Duplicate above code but put it in a function
|
// Duplicate above code but put it in a function
|
||||||
{
|
[
|
||||||
input: 'function foo() {"use strict"\n',
|
'function foo() {"use strict"\n',
|
||||||
directives: ["use strict"],
|
[ "use strict" ],
|
||||||
non_directives: ["use asm"]
|
[ "use asm" ]
|
||||||
},
|
],
|
||||||
{
|
[
|
||||||
input: 'function foo() {"use\\\nstrict";',
|
'function foo() {"use\\\nstrict";',
|
||||||
directives: [],
|
[],
|
||||||
non_directives: ["use strict", "use\nstrict", "use \nstrict", "use asm"]
|
[ "use strict", "use\nstrict", "use \nstrict", "use asm" ]
|
||||||
},
|
],
|
||||||
{
|
[
|
||||||
input: 'function foo() {"use strict"\n"use asm"\n"use bar"\n',
|
'function foo() {"use strict"\n"use asm"\n"use bar"\n',
|
||||||
directives: ["use strict", "use asm", "use bar"],
|
[ "use strict", "use asm", "use bar" ],
|
||||||
non_directives: ["use foo", "use\\x20strict"]
|
[ "use foo", "use\\x20strict" ]
|
||||||
},
|
],
|
||||||
{
|
[
|
||||||
input: 'function foo() {"use \\\nstrict";"use strict";',
|
'function foo() {"use \\\nstrict";"use strict";',
|
||||||
directives: [],
|
[],
|
||||||
non_directives: ["use strict", "use\nstrict", "use \nstrict", "use asm"]
|
[ "use strict", "use\nstrict", "use \nstrict", "use asm" ]
|
||||||
},
|
],
|
||||||
{
|
[
|
||||||
input: 'var foo = function() {"\\76";',
|
'var foo = function() {"\\76";',
|
||||||
directives: [],
|
[],
|
||||||
non_directives: [">", "\\76"]
|
[ ">", "\\76" ]
|
||||||
},
|
],
|
||||||
{
|
[
|
||||||
input: 'var foo = function() {"use strict"', // no ; or newline
|
'var foo = function() {"use strict"', // no ; or newline
|
||||||
directives: [],
|
[],
|
||||||
non_directives: ["use strict", "use\nstrict", "use \nstrict", "use asm"]
|
[ "use strict", "use\nstrict", "use \nstrict", "use asm" ]
|
||||||
},
|
],
|
||||||
{
|
[
|
||||||
input: 'var foo = function() {;"use strict"',
|
'var foo = function() {;"use strict"',
|
||||||
directives: [],
|
[],
|
||||||
non_directives: ["use strict", "use\nstrict", "use \nstrict", "use asm"]
|
[ "use strict", "use\nstrict", "use \nstrict", "use asm" ]
|
||||||
},
|
],
|
||||||
// Special cases
|
// Special cases
|
||||||
{
|
[
|
||||||
input: '"1";"2";"3";"4";;"5"',
|
'"1";"2";"3";"4";;"5"',
|
||||||
directives: ["1", "2", "3", "4"],
|
[ "1", "2", "3", "4" ],
|
||||||
non_directives: ["5", "6", "use strict", "use asm"]
|
[ "5", "6", "use strict", "use asm" ]
|
||||||
},
|
],
|
||||||
{
|
[
|
||||||
input: 'if(1){"use strict";',
|
'if(1){"use strict";',
|
||||||
directives: [],
|
[],
|
||||||
non_directives: ["use strict", "use\nstrict", "use \nstrict", "use asm"]
|
[ "use strict", "use\nstrict", "use \nstrict", "use asm" ]
|
||||||
},
|
],
|
||||||
{
|
[
|
||||||
input: '"use strict";try{"use asm";',
|
'"use strict";try{"use asm";',
|
||||||
directives: ["use strict"],
|
[ "use strict" ],
|
||||||
non_directives: ["use\nstrict", "use \nstrict", "use asm"]
|
[ "use\nstrict", "use \nstrict", "use asm" ]
|
||||||
}
|
],
|
||||||
];
|
].forEach(function(test) {
|
||||||
|
var tokenizer = UglifyJS.tokenizer(test[0] + "]", "foo.js");
|
||||||
for (var i = 0; i < tests.length; i++) {
|
assert.throws(function() {
|
||||||
// Fail parser deliberately to get state at failure
|
UglifyJS.parse(tokenizer);
|
||||||
var tokenizer = uglify.tokenizer(tests[i].input + "]", "foo.js");
|
}, function(e) {
|
||||||
|
return e instanceof UglifyJS.JS_Parse_Error
|
||||||
try {
|
&& e.message === "Unexpected token: punc (])"
|
||||||
var parser = uglify.parse(tokenizer);
|
}, test[0]);
|
||||||
throw new Error("Expected parser to fail");
|
test[1].forEach(function(directive) {
|
||||||
} catch (e) {
|
assert.strictEqual(tokenizer.has_directive(directive), true, directive + " in " + test[0]);
|
||||||
assert.strictEqual(e instanceof uglify.JS_Parse_Error, true);
|
});
|
||||||
assert.strictEqual(e.message, "Unexpected token: punc (])");
|
test[2].forEach(function(fake_directive) {
|
||||||
}
|
assert.strictEqual(tokenizer.has_directive(fake_directive), false, fake_directive + " in " + test[0]);
|
||||||
|
});
|
||||||
test_directive(tokenizer, tests[i]);
|
});
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it("Should test EXPECT_DIRECTIVE RegExp", function() {
|
it("Should test EXPECT_DIRECTIVE RegExp", function() {
|
||||||
[
|
[
|
||||||
["", true],
|
[ "", true ],
|
||||||
["'test';", true],
|
[ "'test';", true ],
|
||||||
["'test';;", true],
|
[ "'test';;", true ],
|
||||||
["'tests';\n", true],
|
[ "'tests';\n", true ],
|
||||||
["'tests'", false],
|
[ "'tests'", false ],
|
||||||
["'tests'; \n\t", true],
|
[ "'tests'; \n\t", true ],
|
||||||
["'tests';\n\n", true],
|
[ "'tests';\n\n", true ],
|
||||||
["\n\n\"use strict\";\n\n", true]
|
[ "\n\n\"use strict\";\n\n", true ],
|
||||||
].forEach(function(test) {
|
].forEach(function(test) {
|
||||||
var out = uglify.OutputStream();
|
var out = UglifyJS.OutputStream();
|
||||||
out.print(test[0]);
|
out.print(test[0]);
|
||||||
out.print_string("", null, true);
|
out.print_string("", null, true);
|
||||||
assert.strictEqual(out.get() === test[0] + ';""', test[1], test[0]);
|
assert.strictEqual(out.get() === test[0] + ';""', test[1], test[0]);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it("Should only print 2 semicolons spread over 2 lines in beautify mode", function() {
|
it("Should only print 2 semicolons spread over 2 lines in beautify mode", function() {
|
||||||
assert.strictEqual(
|
var result = UglifyJS.minify([
|
||||||
uglify.minify(
|
'"use strict";',
|
||||||
'"use strict";\'use strict\';"use strict";"use strict";;\'use strict\';console.log(\'use strict\');',
|
"'use strict';",
|
||||||
{output: {beautify: true, quote_style: 3}, compress: false}
|
'"use strict";',
|
||||||
).code,
|
'"use strict";;',
|
||||||
'"use strict";\n\n\'use strict\';\n\n"use strict";\n\n"use strict";\n\n;\'use strict\';\n\nconsole.log(\'use strict\');'
|
"'use strict';",
|
||||||
);
|
"console.log('use strict');"
|
||||||
|
].join(""), {
|
||||||
|
compress: false,
|
||||||
|
output: {
|
||||||
|
beautify: true,
|
||||||
|
quote_style: 3
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (result.error) throw result.error;
|
||||||
|
assert.strictEqual(result.code, [
|
||||||
|
'"use strict";',
|
||||||
|
"'use strict';",
|
||||||
|
'"use strict";',
|
||||||
|
'"use strict";',
|
||||||
|
";'use strict';",
|
||||||
|
"console.log('use strict');"
|
||||||
|
].join("\n\n"));
|
||||||
});
|
});
|
||||||
|
|
||||||
it("Should not add double semicolons in non-scoped block statements to avoid strings becoming directives", function() {
|
it("Should not add double semicolons in non-scoped block statements to avoid strings becoming directives", function() {
|
||||||
var tests = [
|
[
|
||||||
[
|
[
|
||||||
'{"use\x20strict"}',
|
'{"use\x20strict"}',
|
||||||
'{"use strict"}'
|
'{"use strict"}'
|
||||||
@@ -221,26 +216,27 @@ describe("Directives", function() {
|
|||||||
'if(1){"use\x20strict"} else {"use strict"}',
|
'if(1){"use\x20strict"} else {"use strict"}',
|
||||||
'if(1){"use strict"}else{"use strict"}'
|
'if(1){"use strict"}else{"use strict"}'
|
||||||
]
|
]
|
||||||
];
|
].forEach(function(test) {
|
||||||
|
var result = UglifyJS.minify(test[0], {
|
||||||
for (var i = 0; i < tests.length; i++) {
|
compress: false,
|
||||||
assert.strictEqual(
|
mangle: false
|
||||||
uglify.minify(tests[i][0], {compress: false, mangle: false}).code,
|
});
|
||||||
tests[i][1],
|
if (result.error) throw result.error;
|
||||||
tests[i][0]
|
assert.strictEqual(result.code, test[1], test[0]);
|
||||||
);
|
});
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it("Should add double semicolon when relying on automatic semicolon insertion", function() {
|
it("Should add double semicolon when relying on automatic semicolon insertion", function() {
|
||||||
var code = uglify.minify('"use strict";"use\\x20strict";',
|
var result = UglifyJS.minify('"use strict";"use\\x20strict";', {
|
||||||
{output: {semicolons: false}, compress: false}
|
compress: false,
|
||||||
).code;
|
output: {
|
||||||
assert.strictEqual(code, '"use strict";;"use strict"\n');
|
semicolons: false
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (result.error) throw result.error;
|
||||||
|
assert.strictEqual(result.code, '"use strict";;"use strict"\n');
|
||||||
});
|
});
|
||||||
|
|
||||||
it("Should check quote style of directives", function() {
|
it("Should check quote style of directives", function() {
|
||||||
var tests = [
|
[
|
||||||
// 0. Prefer double quotes, unless string contains more double quotes than single quotes
|
// 0. Prefer double quotes, unless string contains more double quotes than single quotes
|
||||||
[
|
[
|
||||||
'"testing something";',
|
'"testing something";',
|
||||||
@@ -337,45 +333,53 @@ describe("Directives", function() {
|
|||||||
3,
|
3,
|
||||||
"'\"use strict\"';",
|
"'\"use strict\"';",
|
||||||
],
|
],
|
||||||
];
|
].forEach(function(test) {
|
||||||
for (var i = 0; i < tests.length; i++) {
|
var result = UglifyJS.minify(test[0], {
|
||||||
assert.strictEqual(
|
compress: false,
|
||||||
uglify.minify(tests[i][0], {output:{quote_style: tests[i][1]}, compress: false}).code,
|
output: {
|
||||||
tests[i][2],
|
quote_style: test[1]
|
||||||
tests[i][0] + " using mode " + tests[i][1]
|
}
|
||||||
);
|
});
|
||||||
}
|
if (result.error) throw result.error;
|
||||||
|
assert.strictEqual(result.code, test[2], test[0] + " using mode " + test[1]);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
it("Should be able to compress without side effects", function() {
|
it("Should be able to compress without side effects", function() {
|
||||||
// NOTE: the "use asm" directive disables any optimisation after being defined
|
[
|
||||||
var tests = [
|
|
||||||
[
|
[
|
||||||
'"use strict";"use strict";"use strict";"use foo";"use strict";;"use sloppy";doSomething("foo");',
|
'"use strict";"use strict";"use strict";"use foo";"use strict";;"use sloppy";doSomething("foo");',
|
||||||
'"use strict";"use foo";doSomething("foo");',
|
'"use strict";doSomething("foo");'
|
||||||
'function f(){ "use strict" }',
|
|
||||||
'function f(){ "use asm" }',
|
|
||||||
'function f(){ "use nondirective" }',
|
|
||||||
'function f(){ ;"use strict" }',
|
|
||||||
'function f(){ "use \n"; }',
|
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
// Nothing gets optimised in the compressor because "use asm" is the first statement
|
// Nothing gets optimised in the compressor because "use asm" is the first statement
|
||||||
'"use asm";"use\\x20strict";1+1;',
|
'"use asm";"use\\x20strict";1+1;',
|
||||||
'"use asm";;"use strict";1+1;', // Yet, the parser noticed that "use strict" wasn't a directive
|
// Yet, the parser noticed that "use strict" wasn't a directive
|
||||||
'function f(){"use strict"}',
|
'"use asm";;"use strict";1+1;',
|
||||||
'function f(){"use asm"}',
|
],
|
||||||
'function f(){"use nondirective"}',
|
[
|
||||||
'function f(){}',
|
'function f(){ "use strict" }',
|
||||||
'function f(){}',
|
'function f(){}'
|
||||||
]
|
],
|
||||||
];
|
[
|
||||||
|
'function f(){ "use asm" }',
|
||||||
for (var i = 0; i < tests.length; i++) {
|
'function f(){"use asm"}'
|
||||||
assert.strictEqual(
|
],
|
||||||
uglify.minify(tests[i][0]).code,
|
[
|
||||||
tests[i][1],
|
'function f(){ "use nondirective" }',
|
||||||
tests[i][0]
|
'function f(){}'
|
||||||
);
|
],
|
||||||
}
|
[
|
||||||
|
'function f(){ ;"use strict" }',
|
||||||
|
'function f(){}'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'function f(){ "use \\n"; }',
|
||||||
|
'function f(){}'
|
||||||
|
],
|
||||||
|
].forEach(function(test) {
|
||||||
|
var result = UglifyJS.minify(test[0]);
|
||||||
|
if (result.error) throw result.error;
|
||||||
|
assert.strictEqual(result.code, test[1], test[0]);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
var UglifyJS = require("../node");
|
|
||||||
var assert = require("assert");
|
var assert = require("assert");
|
||||||
|
var UglifyJS = require("../node");
|
||||||
|
|
||||||
describe("Getters and setters", function() {
|
describe("Getters and setters", function() {
|
||||||
it("Should not accept operator symbols as getter/setter name", function() {
|
it("Should not accept operator symbols as getter/setter name", function() {
|
||||||
@@ -61,29 +61,24 @@ describe("Getters and setters", function() {
|
|||||||
|
|
||||||
return results;
|
return results;
|
||||||
};
|
};
|
||||||
|
|
||||||
var testCase = function(data) {
|
var testCase = function(data) {
|
||||||
return function() {
|
return function() {
|
||||||
UglifyJS.parse(data.code);
|
UglifyJS.parse(data.code);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
var fail = function(data) {
|
var fail = function(data) {
|
||||||
return function (e) {
|
return function(e) {
|
||||||
return e instanceof UglifyJS.JS_Parse_Error &&
|
return e instanceof UglifyJS.JS_Parse_Error
|
||||||
e.message === "Unexpected token: operator (" + data.operator + ")";
|
&& e.message === "Unexpected token: operator (" + data.operator + ")";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
var errorMessage = function(data) {
|
var errorMessage = function(data) {
|
||||||
return "Expected but didn't get a syntax error while parsing following line:\n" + data.code;
|
return "Expected but didn't get a syntax error while parsing following line:\n" + data.code;
|
||||||
};
|
};
|
||||||
|
|
||||||
var tests = generator();
|
var tests = generator();
|
||||||
for (var i = 0; i < tests.length; i++) {
|
for (var i = 0; i < tests.length; i++) {
|
||||||
var test = tests[i];
|
var test = tests[i];
|
||||||
assert.throws(testCase(test), fail(test), errorMessage(test));
|
assert.throws(testCase(test), fail(test), errorMessage(test));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ describe("bin/uglifyjs with input file globs", function() {
|
|||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it("should throw with non-matching glob string", function(done) {
|
it("Should throw with non-matching glob string", function(done) {
|
||||||
var command = uglifyjscmd + ' "test/input/issue-1242/blah.*"';
|
var command = uglifyjscmd + ' "test/input/issue-1242/blah.*"';
|
||||||
|
|
||||||
exec(command, function(err, stdout, stderr) {
|
exec(command, function(err, stdout, stderr) {
|
||||||
@@ -53,7 +53,7 @@ describe("bin/uglifyjs with input file globs", function() {
|
|||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it("should handle special characters in glob string", function(done) {
|
it("Should handle special characters in glob string", function(done) {
|
||||||
var command = uglifyjscmd + ' "test/input/issue-1632/^{*}[???](*)+$.??" -cm';
|
var command = uglifyjscmd + ' "test/input/issue-1632/^{*}[???](*)+$.??" -cm';
|
||||||
|
|
||||||
exec(command, function(err, stdout) {
|
exec(command, function(err, stdout) {
|
||||||
@@ -63,7 +63,7 @@ describe("bin/uglifyjs with input file globs", function() {
|
|||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it("should handle array of glob strings - matching and otherwise", function(done) {
|
it("Should handle array of glob strings - matching and otherwise", function(done) {
|
||||||
var dir = "test/input/issue-1242";
|
var dir = "test/input/issue-1242";
|
||||||
var command = uglifyjscmd + ' "' + [
|
var command = uglifyjscmd + ' "' + [
|
||||||
path.join(dir, "b*.es5"),
|
path.join(dir, "b*.es5"),
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
var Uglify = require('../../');
|
|
||||||
var assert = require("assert");
|
|
||||||
|
|
||||||
describe("Huge number of comments.", function() {
|
|
||||||
it("Should parse and compress code with thousands of consecutive comments", function() {
|
|
||||||
var js = 'function lots_of_comments(x) { return 7 -';
|
|
||||||
var i;
|
|
||||||
for (i = 1; i <= 5000; ++i) { js += "// " + i + "\n"; }
|
|
||||||
for (; i <= 10000; ++i) { js += "/* " + i + " */ /**/"; }
|
|
||||||
js += "x; }";
|
|
||||||
var result = Uglify.minify(js, { mangle: false });
|
|
||||||
assert.strictEqual(result.code, "function lots_of_comments(x){return 7-x}");
|
|
||||||
});
|
|
||||||
});
|
|
||||||
21
test/mocha/ie8.js
Normal file
21
test/mocha/ie8.js
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
var assert = require("assert");
|
||||||
|
var UglifyJS = require("../..");
|
||||||
|
|
||||||
|
describe("ie8", function() {
|
||||||
|
it("Should be able to minify() with undefined as catch parameter in a try...catch statement", function() {
|
||||||
|
assert.strictEqual(
|
||||||
|
UglifyJS.minify([
|
||||||
|
"function a(b){",
|
||||||
|
" try {",
|
||||||
|
" throw 'Stuff';",
|
||||||
|
" } catch (undefined) {",
|
||||||
|
" console.log('caught: ' + undefined);",
|
||||||
|
" }",
|
||||||
|
" console.log('undefined is ' + undefined);",
|
||||||
|
" return b === undefined;",
|
||||||
|
"};",
|
||||||
|
].join("\n")).code,
|
||||||
|
'function a(o){try{throw"Stuff"}catch(o){console.log("caught: "+o)}return console.log("undefined is "+void 0),void 0===o}'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
var assert = require("assert");
|
|
||||||
var Uglify = require("../../");
|
|
||||||
var SourceMapConsumer = require("source-map").SourceMapConsumer;
|
|
||||||
|
|
||||||
function getMap() {
|
|
||||||
return {
|
|
||||||
"version": 3,
|
|
||||||
"sources": ["index.js"],
|
|
||||||
"names": [],
|
|
||||||
"mappings": ";;AAAA,IAAI,MAAM,SAAN,GAAM;AAAA,SAAK,SAAS,CAAd;AAAA,CAAV;AACA,QAAQ,GAAR,CAAY,IAAI,KAAJ,CAAZ",
|
|
||||||
"file": "bundle.js",
|
|
||||||
"sourcesContent": ["let foo = x => \"foo \" + x;\nconsole.log(foo(\"bar\"));"]
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function prepareMap(sourceMap) {
|
|
||||||
var code = [
|
|
||||||
'"use strict";',
|
|
||||||
"",
|
|
||||||
"var foo = function foo(x) {",
|
|
||||||
' return "foo " + x;',
|
|
||||||
"};",
|
|
||||||
'console.log(foo("bar"));',
|
|
||||||
"",
|
|
||||||
"//# sourceMappingURL=bundle.js.map",
|
|
||||||
].join("\n");
|
|
||||||
var result = Uglify.minify(code, {
|
|
||||||
sourceMap: {
|
|
||||||
content: sourceMap,
|
|
||||||
includeSources: true,
|
|
||||||
}
|
|
||||||
});
|
|
||||||
if (result.error) throw result.error;
|
|
||||||
return new SourceMapConsumer(result.map);
|
|
||||||
}
|
|
||||||
|
|
||||||
describe("input sourcemaps", function() {
|
|
||||||
it("Should copy over original sourcesContent", function() {
|
|
||||||
var orig = getMap();
|
|
||||||
var map = prepareMap(orig);
|
|
||||||
assert.equal(map.sourceContentFor("index.js"), orig.sourcesContent[0]);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("Should copy sourcesContent if sources are relative", function() {
|
|
||||||
var relativeMap = getMap();
|
|
||||||
relativeMap.sources = ['./index.js'];
|
|
||||||
var map = prepareMap(relativeMap);
|
|
||||||
assert.notEqual(map.sourcesContent, null);
|
|
||||||
assert.equal(map.sourcesContent.length, 1);
|
|
||||||
assert.equal(map.sourceContentFor("index.js"), relativeMap.sourcesContent[0]);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("Should not have invalid mappings from inputSourceMap (issue #882)", function() {
|
|
||||||
var map = prepareMap(getMap());
|
|
||||||
// The original source has only 2 lines, check that mappings don't have more lines
|
|
||||||
var msg = "Mapping should not have higher line number than the original file had";
|
|
||||||
map.eachMapping(function(mapping) {
|
|
||||||
assert.ok(mapping.originalLine <= 2, msg);
|
|
||||||
});
|
|
||||||
map.allGeneratedPositionsFor({
|
|
||||||
source: "index.js",
|
|
||||||
line: 1,
|
|
||||||
column: 1
|
|
||||||
}).forEach(function(pos) {
|
|
||||||
assert.ok(pos.line <= 2, msg);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
var Uglify = require('../../');
|
|
||||||
var assert = require("assert");
|
var assert = require("assert");
|
||||||
|
var UglifyJS = require("../..");
|
||||||
|
|
||||||
describe("let", function() {
|
describe("let", function() {
|
||||||
this.timeout(30000);
|
this.timeout(30000);
|
||||||
@@ -10,7 +10,7 @@ describe("let", function() {
|
|||||||
s += "var v" + i + "=0;";
|
s += "var v" + i + "=0;";
|
||||||
}
|
}
|
||||||
s += '}';
|
s += '}';
|
||||||
var result = Uglify.minify(s, {
|
var result = UglifyJS.minify(s, {
|
||||||
compress: false
|
compress: false
|
||||||
}).code;
|
}).code;
|
||||||
|
|
||||||
@@ -39,7 +39,7 @@ describe("let", function() {
|
|||||||
for (var i = 0; i < 18000; i++) {
|
for (var i = 0; i < 18000; i++) {
|
||||||
s += "v.b" + i + ";";
|
s += "v.b" + i + ";";
|
||||||
}
|
}
|
||||||
var result = Uglify.minify(s, {
|
var result = UglifyJS.minify(s, {
|
||||||
compress: false,
|
compress: false,
|
||||||
ie8: true,
|
ie8: true,
|
||||||
mangle: {
|
mangle: {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
var Uglify = require("../node");
|
|
||||||
var assert = require("assert");
|
var assert = require("assert");
|
||||||
|
var UglifyJS = require("../node");
|
||||||
|
|
||||||
describe("line-endings", function() {
|
describe("line-endings", function() {
|
||||||
var options = {
|
var options = {
|
||||||
@@ -14,19 +14,19 @@ describe("line-endings", function() {
|
|||||||
|
|
||||||
it("Should parse LF line endings", function() {
|
it("Should parse LF line endings", function() {
|
||||||
var js = '/*!one\n2\n3*///comment\nfunction f(x) {\n if (x)\n//comment\n return 3;\n}\n';
|
var js = '/*!one\n2\n3*///comment\nfunction f(x) {\n if (x)\n//comment\n return 3;\n}\n';
|
||||||
var result = Uglify.minify(js, options);
|
var result = UglifyJS.minify(js, options);
|
||||||
assert.strictEqual(result.code, expected_code);
|
assert.strictEqual(result.code, expected_code);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("Should parse CR/LF line endings", function() {
|
it("Should parse CR/LF line endings", function() {
|
||||||
var js = '/*!one\r\n2\r\n3*///comment\r\nfunction f(x) {\r\n if (x)\r\n//comment\r\n return 3;\r\n}\r\n';
|
var js = '/*!one\r\n2\r\n3*///comment\r\nfunction f(x) {\r\n if (x)\r\n//comment\r\n return 3;\r\n}\r\n';
|
||||||
var result = Uglify.minify(js, options);
|
var result = UglifyJS.minify(js, options);
|
||||||
assert.strictEqual(result.code, expected_code);
|
assert.strictEqual(result.code, expected_code);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("Should parse CR line endings", function() {
|
it("Should parse CR line endings", function() {
|
||||||
var js = '/*!one\r2\r3*///comment\rfunction f(x) {\r if (x)\r//comment\r return 3;\r}\r';
|
var js = '/*!one\r2\r3*///comment\rfunction f(x) {\r if (x)\r//comment\r return 3;\r}\r';
|
||||||
var result = Uglify.minify(js, options);
|
var result = UglifyJS.minify(js, options);
|
||||||
assert.strictEqual(result.code, expected_code);
|
assert.strictEqual(result.code, expected_code);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -44,16 +44,15 @@ describe("line-endings", function() {
|
|||||||
]
|
]
|
||||||
var test = function(input) {
|
var test = function(input) {
|
||||||
return function() {
|
return function() {
|
||||||
Uglify.parse(input);
|
UglifyJS.parse(input);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var fail = function(e) {
|
var fail = function(e) {
|
||||||
return e instanceof Uglify.JS_Parse_Error &&
|
return e instanceof UglifyJS.JS_Parse_Error
|
||||||
e.message === "Unexpected line terminator";
|
&& e.message === "Unexpected line terminator";
|
||||||
}
|
}
|
||||||
for (var i = 0; i < inputs.length; i++) {
|
for (var i = 0; i < inputs.length; i++) {
|
||||||
assert.throws(test(inputs[i]), fail);
|
assert.throws(test(inputs[i]), fail);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -1,22 +1,22 @@
|
|||||||
var Uglify = require('../../');
|
|
||||||
var assert = require("assert");
|
var assert = require("assert");
|
||||||
|
var UglifyJS = require("../..");
|
||||||
|
|
||||||
describe("Input file as map", function() {
|
describe("Input file as map", function() {
|
||||||
it("Should accept object", function() {
|
it("Should accept object", function() {
|
||||||
var jsMap = {
|
var jsMap = {
|
||||||
'/scripts/foo.js': 'var foo = {"x": 1, y: 2, \'z\': 3};'
|
'/scripts/foo.js': 'var foo = {"x": 1, y: 2, \'z\': 3};'
|
||||||
};
|
};
|
||||||
var result = Uglify.minify(jsMap, {sourceMap: true});
|
var result = UglifyJS.minify(jsMap, {sourceMap: true});
|
||||||
|
|
||||||
var map = JSON.parse(result.map);
|
var map = JSON.parse(result.map);
|
||||||
assert.strictEqual(result.code, 'var foo={x:1,y:2,z:3};');
|
assert.strictEqual(result.code, 'var foo={x:1,y:2,z:3};');
|
||||||
assert.deepEqual(map.sources, ['/scripts/foo.js']);
|
assert.deepEqual(map.sources, ['/scripts/foo.js']);
|
||||||
assert.strictEqual(map.file, undefined);
|
assert.strictEqual(map.file, undefined);
|
||||||
|
|
||||||
result = Uglify.minify(jsMap);
|
result = UglifyJS.minify(jsMap);
|
||||||
assert.strictEqual(result.map, undefined);
|
assert.strictEqual(result.map, undefined);
|
||||||
|
|
||||||
result = Uglify.minify(jsMap, {sourceMap: {filename: 'out.js'}});
|
result = UglifyJS.minify(jsMap, {sourceMap: {filename: 'out.js'}});
|
||||||
map = JSON.parse(result.map);
|
map = JSON.parse(result.map);
|
||||||
assert.strictEqual(map.file, 'out.js');
|
assert.strictEqual(map.file, 'out.js');
|
||||||
});
|
});
|
||||||
@@ -26,7 +26,7 @@ describe("Input file as map", function() {
|
|||||||
'var foo = {"x": 1, y: 2, \'z\': 3};',
|
'var foo = {"x": 1, y: 2, \'z\': 3};',
|
||||||
'var bar = 15;'
|
'var bar = 15;'
|
||||||
];
|
];
|
||||||
var result = Uglify.minify(jsSeq, {sourceMap: true});
|
var result = UglifyJS.minify(jsSeq, {sourceMap: true});
|
||||||
|
|
||||||
var map = JSON.parse(result.map);
|
var map = JSON.parse(result.map);
|
||||||
assert.strictEqual(result.code, 'var foo={x:1,y:2,z:3},bar=15;');
|
assert.strictEqual(result.code, 'var foo={x:1,y:2,z:3},bar=15;');
|
||||||
@@ -37,7 +37,7 @@ describe("Input file as map", function() {
|
|||||||
var jsMap = {
|
var jsMap = {
|
||||||
'/scripts/foo.js': 'var foo = {"x": 1, y: 2, \'z\': 3};'
|
'/scripts/foo.js': 'var foo = {"x": 1, y: 2, \'z\': 3};'
|
||||||
};
|
};
|
||||||
var result = Uglify.minify(jsMap, {sourceMap: {includeSources: true}});
|
var result = UglifyJS.minify(jsMap, {sourceMap: {includeSources: true}});
|
||||||
|
|
||||||
var map = JSON.parse(result.map);
|
var map = JSON.parse(result.map);
|
||||||
assert.strictEqual(result.code, 'var foo={x:1,y:2,z:3};');
|
assert.strictEqual(result.code, 'var foo={x:1,y:2,z:3};');
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user