Compare commits
126 Commits
harmony-v3
...
harmony-v3
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f8ff349ba7 | ||
|
|
f2b179ae94 | ||
|
|
c7e8fc4830 | ||
|
|
f778a0aa01 | ||
|
|
7fd4b66eaa | ||
|
|
21c986ff5b | ||
|
|
2441827408 | ||
|
|
0aff037a35 | ||
|
|
74a2f53683 | ||
|
|
e20935c3f2 | ||
|
|
3e34f62a1c | ||
|
|
d21cb84696 | ||
|
|
3dd495ecdd | ||
|
|
87bae623e9 | ||
|
|
606f7a5b37 | ||
|
|
b91a2e018a | ||
|
|
c9dbe9deb1 | ||
|
|
b9f3ddfb30 | ||
|
|
77332a0315 | ||
|
|
85c56adbd1 | ||
|
|
8da3754e51 | ||
|
|
9a6b11f8e6 | ||
|
|
7ac6fdcc99 | ||
|
|
f6610baaa8 | ||
|
|
09b320e8a5 | ||
|
|
5a1e99d713 | ||
|
|
b762f2d6f4 | ||
|
|
172079a47f | ||
|
|
c58d3936a3 | ||
|
|
18302bf8e9 | ||
|
|
bc5047c1e7 | ||
|
|
1885f91f13 | ||
|
|
736c366d93 | ||
|
|
1646c5844f | ||
|
|
aacf760fb4 | ||
|
|
755e2a62c6 | ||
|
|
62d2817d6c | ||
|
|
37cbd7080c | ||
|
|
206a54a746 | ||
|
|
32def5ebf5 | ||
|
|
ecc9f6b770 | ||
|
|
b84c99ef5c | ||
|
|
4f08c2f504 | ||
|
|
b37a68c84f | ||
|
|
c141ae6f8d | ||
|
|
97c464dbf5 | ||
|
|
ba4894af18 | ||
|
|
f1e3ef5262 | ||
|
|
3b28b915eb | ||
|
|
eb001dc1d9 | ||
|
|
aa9bdf416e | ||
|
|
bbf38dc9c0 | ||
|
|
8987780db6 | ||
|
|
30cfea2e7a | ||
|
|
3d8341a7ab | ||
|
|
f4e2fb9864 | ||
|
|
567cb0e4e3 | ||
|
|
b80062c490 | ||
|
|
227b58812d | ||
|
|
f25bd13be6 | ||
|
|
667fc4d08b | ||
|
|
6142117cdd | ||
|
|
e826973b76 | ||
|
|
ae28a24c7f | ||
|
|
ebe761cad0 | ||
|
|
fa7a7c5c5a | ||
|
|
557636f3b7 | ||
|
|
49fbe9c5ac | ||
|
|
2ac5086831 | ||
|
|
c6cfa04d10 | ||
|
|
9632f79e46 | ||
|
|
a3fbb27194 | ||
|
|
11c0b1e1f9 | ||
|
|
346fa12e0e | ||
|
|
cda27b0970 | ||
|
|
3c74047368 | ||
|
|
650d5d5c9b | ||
|
|
94525d859f | ||
|
|
1127a2caf3 | ||
|
|
246d9d4e83 | ||
|
|
4c0b0177b6 | ||
|
|
dd0a36119b | ||
|
|
94b19a9c46 | ||
|
|
bcf95ac02c | ||
|
|
e11cec1ab8 | ||
|
|
38bfb73f06 | ||
|
|
bbedbf4ea0 | ||
|
|
2cfb5aa7da | ||
|
|
6c45101870 | ||
|
|
2c2fd89e34 | ||
|
|
0c43519097 | ||
|
|
352a7de204 | ||
|
|
df9c8dfd72 | ||
|
|
f46281e2b7 | ||
|
|
25a18883f5 | ||
|
|
5b4b07e9a7 | ||
|
|
a8aa28a7a6 | ||
|
|
fe5a68f9d5 | ||
|
|
71e61153b1 | ||
|
|
c8b6f4733d | ||
|
|
29bbc41dfe | ||
|
|
a48f87abf2 | ||
|
|
d535daa2c7 | ||
|
|
0a9cdb6c73 | ||
|
|
3ae34177a6 | ||
|
|
086cb33163 | ||
|
|
2fd927a7cc | ||
|
|
8428326ea1 | ||
|
|
6371e2ee63 | ||
|
|
6ab73c7bd5 | ||
|
|
31f8209193 | ||
|
|
9b0f86f5a1 | ||
|
|
ee082ace1b | ||
|
|
ae67a49850 | ||
|
|
4178289c38 | ||
|
|
74ae16f9f8 | ||
|
|
1968203d83 | ||
|
|
2848596280 | ||
|
|
86ea38a259 | ||
|
|
8a713e449f | ||
|
|
7d9a8596a9 | ||
|
|
24aa07855b | ||
|
|
5fd723f143 | ||
|
|
516eaef50c | ||
|
|
4ae1fb3ed8 | ||
|
|
011123223b |
2
.github/ISSUE_TEMPLATE.md
vendored
2
.github/ISSUE_TEMPLATE.md
vendored
@@ -15,6 +15,8 @@
|
|||||||
UglifyJS alone - without third party tools or libraries.
|
UglifyJS alone - without third party tools or libraries.
|
||||||
Ideally the input should be as small as possible.
|
Ideally the input should be as small as possible.
|
||||||
Post a link to a gist if necessary.
|
Post a link to a gist if necessary.
|
||||||
|
|
||||||
|
Issues without a reproducible test case will be closed.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
**The `uglifyjs` CLI command executed or `minify()` options used.**
|
**The `uglifyjs` CLI command executed or `minify()` options used.**
|
||||||
|
|||||||
123
README.md
123
README.md
@@ -102,14 +102,20 @@ 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.
|
||||||
--ecma <version> Specifiy ECMAScript release: 5, 6, 7 or 8.
|
--ecma <version> Specify ECMAScript release: 5, 6, 7 or 8.
|
||||||
--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.
|
||||||
By default UglifyJS will not try to be IE-proof.
|
By default UglifyJS will not try to be IE-proof.
|
||||||
|
--keep-classnames Do not mangle/drop class names.
|
||||||
--keep-fnames Do not mangle/drop function names. Useful for
|
--keep-fnames Do not mangle/drop function names. Useful for
|
||||||
code relying on Function.prototype.name.
|
code relying on Function.prototype.name.
|
||||||
--name-cache <file> File to hold mangled name mappings.
|
--name-cache <file> File to hold mangled name mappings.
|
||||||
|
--safari10 Support non-standard Safari 10/11.
|
||||||
|
Equivalent to setting `safari10: true` in `minify()`
|
||||||
|
for `mangle` and `output` options.
|
||||||
|
By default `uglify-es` will not work around
|
||||||
|
Safari 10/11 bugs.
|
||||||
--self Build UglifyJS as a library (implies --wrap UglifyJS)
|
--self Build UglifyJS as a library (implies --wrap UglifyJS)
|
||||||
--source-map [options] Enable source map/specify source map options:
|
--source-map [options] Enable source map/specify source map options:
|
||||||
`base` Path to compute relative paths from input files.
|
`base` Path to compute relative paths from input files.
|
||||||
@@ -219,7 +225,7 @@ to prevent the `require`, `exports` and `$` names from being changed.
|
|||||||
is a separate step, different from variable name mangling. Pass
|
is a separate step, different from variable name mangling. Pass
|
||||||
`--mangle-props` to enable it. It will mangle all properties in the
|
`--mangle-props` to enable it. It will mangle all properties in the
|
||||||
input code with the exception of built in DOM properties and properties
|
input code with the exception of built in DOM properties and properties
|
||||||
in core javascript classes. For example:
|
in core JavaScript classes. For example:
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
// example.js
|
// example.js
|
||||||
@@ -234,7 +240,7 @@ x.bar_ = 2;
|
|||||||
x["baz_"] = 3;
|
x["baz_"] = 3;
|
||||||
console.log(x.calc());
|
console.log(x.calc());
|
||||||
```
|
```
|
||||||
Mangle all properties (except for javascript `builtins`):
|
Mangle all properties (except for JavaScript `builtins`):
|
||||||
```bash
|
```bash
|
||||||
$ uglifyjs example.js -c -m --mangle-props
|
$ uglifyjs example.js -c -m --mangle-props
|
||||||
```
|
```
|
||||||
@@ -509,8 +515,17 @@ if (result.error) throw result.error;
|
|||||||
|
|
||||||
- `ie8` (default `false`) - set to `true` to support IE8.
|
- `ie8` (default `false`) - set to `true` to support IE8.
|
||||||
|
|
||||||
|
- `keep_classnames` (default: `undefined`) - pass `true` to prevent discarding or mangling
|
||||||
|
of class names.
|
||||||
|
|
||||||
- `keep_fnames` (default: `false`) - pass `true` to prevent discarding or mangling
|
- `keep_fnames` (default: `false`) - pass `true` to prevent discarding or mangling
|
||||||
of function names. Useful for code relying on `Function.prototype.name`.
|
of function names. Useful for code relying on `Function.prototype.name`. If the
|
||||||
|
top level minify option `keep_classnames` is `undefined` it will be overriden with
|
||||||
|
the value of the top level minify option `keep_fnames`.
|
||||||
|
|
||||||
|
- `safari10` (default: `false`) - pass `true` to work around Safari 10/11 bugs in
|
||||||
|
loop scoping and `await`. See `safari10` options in [`mangle`](#mangle-options)
|
||||||
|
and [`output`](#output-options) for details.
|
||||||
|
|
||||||
## Minify options structure
|
## Minify options structure
|
||||||
|
|
||||||
@@ -536,9 +551,12 @@ if (result.error) throw result.error;
|
|||||||
// source map options
|
// source map options
|
||||||
},
|
},
|
||||||
ecma: 5, // specify one of: 5, 6, 7 or 8
|
ecma: 5, // specify one of: 5, 6, 7 or 8
|
||||||
nameCache: null, // or specify a name cache object
|
keep_classnames: false,
|
||||||
toplevel: false,
|
keep_fnames: false,
|
||||||
ie8: false,
|
ie8: false,
|
||||||
|
nameCache: null, // or specify a name cache object
|
||||||
|
safari10: false,
|
||||||
|
toplevel: false,
|
||||||
warnings: false,
|
warnings: false,
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -609,17 +627,17 @@ If you're using the `X-SourceMap` header instead, you can just omit `sourceMap.u
|
|||||||
the resultant code is shorter: `m(){return x}` becomes `m:()=>x`.
|
the resultant code is shorter: `m(){return x}` becomes `m:()=>x`.
|
||||||
This transform requires that the `ecma` compress option is set to `6` or greater.
|
This transform requires that the `ecma` compress option is set to `6` or greater.
|
||||||
|
|
||||||
- `booleans` (default: `true`) -- various optimizations for boolean context, for example `!!a
|
- `booleans` (default: `true`) -- various optimizations for boolean context,
|
||||||
? b : c → a ? b : c`
|
for example `!!a ? b : c → a ? b : c`
|
||||||
|
|
||||||
- `cascade` (default: `true`) -- small optimization for sequences, transform `x, x` into `x`
|
- `cascade` (default: `true`) -- small optimization for sequences, transform
|
||||||
and `x = something(), x` into `x = something()`
|
`x, x` into `x` and `x = something(), x` into `x = something()`
|
||||||
|
|
||||||
- `collapse_vars` (default: `true`) -- Collapse single-use non-constant variables - side
|
- `collapse_vars` (default: `true`) -- Collapse single-use non-constant variables,
|
||||||
effects permitting.
|
side effects permitting.
|
||||||
|
|
||||||
- `comparisons` (default: `true`) -- apply certain optimizations to binary nodes, for example:
|
- `comparisons` (default: `true`) -- apply certain optimizations to binary nodes,
|
||||||
`!(a <= b) → a > b` (only when `unsafe_comps`), attempts to negate binary
|
e.g. `!(a <= b) → a > b` (only when `unsafe_comps`), attempts to negate binary
|
||||||
nodes, e.g. `a = !b && !c && !d && !e → a=!(b||c||d||e)` etc.
|
nodes, e.g. `a = !b && !c && !d && !e → a=!(b||c||d||e)` etc.
|
||||||
|
|
||||||
- `computed_props` (default: `true`) -- Transforms constant computed properties
|
- `computed_props` (default: `true`) -- Transforms constant computed properties
|
||||||
@@ -630,7 +648,7 @@ 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
|
||||||
|
|
||||||
- `drop_console` (default: `false`) -- 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
|
||||||
after dropping the function call then use `pure_funcs` instead.
|
after dropping the function call then use `pure_funcs` instead.
|
||||||
@@ -642,13 +660,19 @@ If you're using the `X-SourceMap` header instead, you can just omit `sourceMap.u
|
|||||||
|
|
||||||
- `evaluate` (default: `true`) -- attempt to evaluate constant expressions
|
- `evaluate` (default: `true`) -- attempt to evaluate constant expressions
|
||||||
|
|
||||||
- `expression` (default: `false`) -- default `false`. Pass `true` to preserve completion values
|
- `expression` (default: `false`) -- Pass `true` to preserve completion values
|
||||||
from terminal statements without `return`, e.g. in bookmarklets.
|
from terminal statements without `return`, e.g. in bookmarklets.
|
||||||
|
|
||||||
- `global_defs` (default: `{}`) -- see [conditional compilation](#conditional-compilation)
|
- `global_defs` (default: `{}`) -- see [conditional compilation](#conditional-compilation)
|
||||||
|
|
||||||
- `hoist_funs` (default: `true`) -- hoist function declarations
|
- `hoist_funs` (default: `true`) -- hoist function declarations
|
||||||
|
|
||||||
|
- `hoist_props` (default: `true`) -- hoist properties from constant object and
|
||||||
|
array literals into regular variables subject to a set of constraints. For example:
|
||||||
|
`var o={p:1, q:2}; f(o.p, o.q);` is converted to `f(1, 2);`. Note: `hoist_props`
|
||||||
|
works best with `mangle` enabled, the `compress` option `passes` set to `2` or higher,
|
||||||
|
and the `compress` option `toplevel` enabled.
|
||||||
|
|
||||||
- `hoist_vars` (default: `false`) -- hoist `var` declarations (this is `false`
|
- `hoist_vars` (default: `false`) -- hoist `var` declarations (this is `false`
|
||||||
by default because it seems to increase the size of the output in general)
|
by default because it seems to increase the size of the output in general)
|
||||||
|
|
||||||
@@ -658,19 +682,22 @@ If you're using the `X-SourceMap` header instead, you can just omit `sourceMap.u
|
|||||||
|
|
||||||
- `join_vars` (default: `true`) -- join consecutive `var` statements
|
- `join_vars` (default: `true`) -- join consecutive `var` statements
|
||||||
|
|
||||||
- `keep_fargs` (default: `true`) -- default `true`. Prevents the
|
- `keep_classnames` (default: `false`) -- Pass `true` to prevent the
|
||||||
compressor from discarding unused function arguments. You need this
|
compressor from discarding class names. See also: the `keep_classnames`
|
||||||
for code which relies on `Function.length`.
|
[mangle option](#mangle).
|
||||||
|
|
||||||
|
- `keep_fargs` (default: `true`) -- Prevents the compressor from discarding unused
|
||||||
|
function arguments. You need this for code which relies on `Function.length`.
|
||||||
|
|
||||||
- `keep_fnames` (default: `false`) -- Pass `true` to prevent the
|
- `keep_fnames` (default: `false`) -- Pass `true` to prevent the
|
||||||
compressor from discarding function names. Useful for code relying on
|
compressor from discarding function names. Useful for code relying on
|
||||||
`Function.prototype.name`. See also: the `keep_fnames` [mangle option](#mangle).
|
`Function.prototype.name`. See also: the `keep_fnames` [mangle option](#mangle).
|
||||||
|
|
||||||
- `keep_infinity` (default: `false`) -- default `false`. Pass `true` to prevent `Infinity` from
|
- `keep_infinity` (default: `false`) -- Pass `true` to prevent `Infinity` from
|
||||||
being compressed into `1/0`, which may cause performance issues on Chrome.
|
being compressed into `1/0`, which may cause performance issues on Chrome.
|
||||||
|
|
||||||
- `loops` (default: `true`) -- optimizations for `do`, `while` and `for` loops when we can
|
- `loops` (default: `true`) -- optimizations for `do`, `while` and `for` loops
|
||||||
statically determine the condition
|
when we can statically determine the condition.
|
||||||
|
|
||||||
- `negate_iife` (default: `true`) -- negate "Immediately-Called Function Expressions"
|
- `negate_iife` (default: `true`) -- negate "Immediately-Called Function Expressions"
|
||||||
where the return value is discarded, to avoid the parens that the
|
where the return value is discarded, to avoid the parens that the
|
||||||
@@ -700,6 +727,12 @@ If you're using the `X-SourceMap` header instead, you can just omit `sourceMap.u
|
|||||||
Specify `"strict"` to treat `foo.bar` as side-effect-free only when
|
Specify `"strict"` to treat `foo.bar` as side-effect-free only when
|
||||||
`foo` is certain to not throw, i.e. not `null` or `undefined`.
|
`foo` is certain to not throw, i.e. not `null` or `undefined`.
|
||||||
|
|
||||||
|
- `reduce_funcs` (default: `true`) -- Allows single-use functions to be
|
||||||
|
inlined as function expressions when permissible allowing further
|
||||||
|
optimization. Enabled by default. Option depends on `reduce_vars`
|
||||||
|
being enabled. Some code runs faster in the Chrome V8 engine if this
|
||||||
|
option is disabled. Does not negatively impact other major browsers.
|
||||||
|
|
||||||
- `reduce_vars` (default: `true`) -- Improve optimization on variables assigned with and
|
- `reduce_vars` (default: `true`) -- Improve optimization on variables assigned with and
|
||||||
used as constant values.
|
used as constant values.
|
||||||
|
|
||||||
@@ -712,21 +745,22 @@ If you're using the `X-SourceMap` header instead, you can just omit `sourceMap.u
|
|||||||
occasions the default sequences limit leads to very slow compress times in which
|
occasions the default sequences limit leads to very slow compress times in which
|
||||||
case a value of `20` or less is recommended.
|
case a value of `20` or less is recommended.
|
||||||
|
|
||||||
- `side_effects` (default: `true`) -- default `true`. Pass `false` to disable potentially dropping
|
- `side_effects` (default: `true`) -- Pass `false` to disable potentially dropping
|
||||||
functions marked as "pure". A function call is marked as "pure" if a comment
|
functions marked as "pure". A function call is marked as "pure" if a comment
|
||||||
annotation `/*@__PURE__*/` or `/*#__PURE__*/` immediately precedes the call. For
|
annotation `/*@__PURE__*/` or `/*#__PURE__*/` immediately precedes the call. For
|
||||||
example: `/*@__PURE__*/foo();`
|
example: `/*@__PURE__*/foo();`
|
||||||
|
|
||||||
- `switches` (default: `true`) -- de-duplicate and remove unreachable `switch` branches
|
- `switches` (default: `true`) -- de-duplicate and remove unreachable `switch` branches
|
||||||
|
|
||||||
- `toplevel` (default: `false`) -- drop unreferenced functions (`"funcs"`) and/or variables (`"vars"`)
|
- `toplevel` (default: `false`) -- drop unreferenced functions (`"funcs"`) and/or
|
||||||
in the top level scope (`false` by default, `true` to drop both unreferenced
|
variables (`"vars"`) in the top level scope (`false` by default, `true` to drop
|
||||||
functions and variables)
|
both unreferenced functions and variables)
|
||||||
|
|
||||||
- `top_retain` (default: `null`) -- prevent specific toplevel functions and variables from `unused`
|
- `top_retain` (default: `null`) -- prevent specific toplevel functions and
|
||||||
removal (can be array, comma-separated, RegExp or function. Implies `toplevel`)
|
variables from `unused` removal (can be array, comma-separated, RegExp or
|
||||||
|
function. Implies `toplevel`)
|
||||||
|
|
||||||
- `typeofs` (default: `true`) -- default `true`. Transforms `typeof foo == "undefined"` into
|
- `typeofs` (default: `true`) -- Transforms `typeof foo == "undefined"` into
|
||||||
`foo === void 0`. Note: recommend to set this value to `false` for IE10 and
|
`foo === void 0`. Note: recommend to set this value to `false` for IE10 and
|
||||||
earlier versions due to known issues.
|
earlier versions due to known issues.
|
||||||
|
|
||||||
@@ -764,32 +798,34 @@ If you're using the `X-SourceMap` header instead, you can just omit `sourceMap.u
|
|||||||
- `unsafe_regexp` (default: `false`) -- enable substitutions of variables with
|
- `unsafe_regexp` (default: `false`) -- enable substitutions of variables with
|
||||||
`RegExp` values the same way as if they are constants.
|
`RegExp` values the same way as if they are constants.
|
||||||
|
|
||||||
- `unused` (default: `true`) -- drop unreferenced functions and variables (simple direct variable
|
- `unused` (default: `true`) -- drop unreferenced functions and variables (simple
|
||||||
assignments do not count as references unless set to `"keep_assign"`)
|
direct variable assignments do not count as references unless set to `"keep_assign"`)
|
||||||
|
|
||||||
- `warnings` (default: `false`) -- display warnings when dropping unreachable code or unused
|
- `warnings` (default: `false`) -- display warnings when dropping unreachable
|
||||||
declarations etc.
|
code or unused declarations etc.
|
||||||
|
|
||||||
## Mangle options
|
## Mangle options
|
||||||
|
|
||||||
- `eval` (default `false`). Pass `true` to mangle names visible in scopes
|
- `eval` (default `false`) -- Pass `true` to mangle names visible in scopes
|
||||||
where `eval` or `with` are used.
|
where `eval` or `with` are used.
|
||||||
|
|
||||||
- `keep_classnames` (default `false`). Pass `true` to not mangle class names.
|
- `keep_classnames` (default `false`) -- Pass `true` to not mangle class names.
|
||||||
|
See also: the `keep_classnames` [compress option](#compress-options).
|
||||||
|
|
||||||
- `keep_fnames` (default `false`). Pass `true` to not mangle function names.
|
- `keep_fnames` (default `false`) -- Pass `true` to not mangle function names.
|
||||||
Useful for code relying on `Function.prototype.name`. See also: the `keep_fnames`
|
Useful for code relying on `Function.prototype.name`. See also: the `keep_fnames`
|
||||||
[compress option](#compress-options).
|
[compress option](#compress-options).
|
||||||
|
|
||||||
- `reserved` (default `[]`). Pass an array of identifiers that should be
|
- `reserved` (default `[]`) -- Pass an array of identifiers that should be
|
||||||
excluded from mangling. Example: `["foo", "bar"]`.
|
excluded from mangling. Example: `["foo", "bar"]`.
|
||||||
|
|
||||||
- `toplevel` (default `false`). Pass `true` to mangle names declared in the
|
- `toplevel` (default `false`) -- Pass `true` to mangle names declared in the
|
||||||
top level scope.
|
top level scope.
|
||||||
|
|
||||||
- `safari10` (default `false`). Pass `true` to work around the Safari 10 loop
|
- `safari10` (default `false`) -- Pass `true` to work around the Safari 10 loop
|
||||||
iterator [bug](https://bugs.webkit.org/show_bug.cgi?id=171041)
|
iterator [bug](https://bugs.webkit.org/show_bug.cgi?id=171041)
|
||||||
"Cannot declare a let variable twice".
|
"Cannot declare a let variable twice".
|
||||||
|
See also: the `safari10` [output option](#output-options).
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
|
|
||||||
@@ -889,6 +925,10 @@ can pass additional arguments that control the code output:
|
|||||||
- `2` -- always use double quotes
|
- `2` -- always use double quotes
|
||||||
- `3` -- always use the original quotes
|
- `3` -- always use the original quotes
|
||||||
|
|
||||||
|
- `safari10` (default `false`) -- set this option to `true` to work around
|
||||||
|
the [Safari 10/11 await bug](https://bugs.webkit.org/show_bug.cgi?id=176685).
|
||||||
|
See also: the `safari10` [mangle option](#mangle-options).
|
||||||
|
|
||||||
- `semicolons` (default `true`) -- separate statements with semicolons. If
|
- `semicolons` (default `true`) -- separate statements with semicolons. If
|
||||||
you pass `false` then whenever possible we will use a newline instead of a
|
you pass `false` then whenever possible we will use a newline instead of a
|
||||||
semicolon, leading to more readable output of uglified code (size before
|
semicolon, leading to more readable output of uglified code (size before
|
||||||
@@ -896,6 +936,9 @@ can pass additional arguments that control the code output:
|
|||||||
|
|
||||||
- `shebang` (default `true`) -- preserve shebang `#!` in preamble (bash scripts)
|
- `shebang` (default `true`) -- preserve shebang `#!` in preamble (bash scripts)
|
||||||
|
|
||||||
|
- `webkit` (default `false`) -- enable workarounds for WebKit bugs.
|
||||||
|
PhantomJS users should set this option to `true`.
|
||||||
|
|
||||||
- `width` (default `80`) -- only takes effect when beautification is on, this
|
- `width` (default `80`) -- only takes effect when beautification is on, this
|
||||||
specifies an (orientative) line width that the beautifier will try to
|
specifies an (orientative) line width that the beautifier will try to
|
||||||
obey. It refers to the width of the line text (excluding indentation).
|
obey. It refers to the width of the line text (excluding indentation).
|
||||||
@@ -1103,7 +1146,7 @@ in total it's a bit more than just using UglifyJS's own parser.
|
|||||||
### Uglify Fast Minify Mode
|
### Uglify Fast Minify Mode
|
||||||
|
|
||||||
It's not well known, but whitespace removal and symbol mangling accounts
|
It's not well known, but whitespace removal and symbol mangling accounts
|
||||||
for 95% of the size reduction in minified code for most javascript - not
|
for 95% of the size reduction in minified code for most JavaScript - not
|
||||||
elaborate code transforms. One can simply disable `compress` to speed up
|
elaborate code transforms. One can simply disable `compress` to speed up
|
||||||
Uglify builds by 3 to 4 times. In this fast `mangle`-only mode Uglify has
|
Uglify builds by 3 to 4 times. In this fast `mangle`-only mode Uglify has
|
||||||
comparable minify speeds and gzip sizes to
|
comparable minify speeds and gzip sizes to
|
||||||
|
|||||||
13
bin/uglifyjs
13
bin/uglifyjs
@@ -15,7 +15,7 @@ var path = require("path");
|
|||||||
var program = require("commander");
|
var program = require("commander");
|
||||||
var UglifyJS = require("../tools/node");
|
var UglifyJS = require("../tools/node");
|
||||||
|
|
||||||
var skip_keys = [ "cname", "enclosed", "parent_scope", "scope", "thedef", "uses_eval", "uses_with" ];
|
var skip_keys = [ "cname", "enclosed", "inlined", "parent_scope", "scope", "thedef", "uses_eval", "uses_with" ];
|
||||||
var files = {};
|
var files = {};
|
||||||
var options = {
|
var options = {
|
||||||
compress: false,
|
compress: false,
|
||||||
@@ -44,10 +44,13 @@ 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("--ecma <version>", "Specifiy ECMAScript release: 5, 6, 7 or 8.");
|
program.option("--ecma <version>", "Specify ECMAScript release: 5, 6, 7 or 8.");
|
||||||
program.option("--ie8", "Support non-standard Internet Explorer 8.");
|
program.option("--ie8", "Support non-standard Internet Explorer 8.");
|
||||||
|
program.option("--keep-classnames", "Do not mangle/drop class names.");
|
||||||
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.");
|
||||||
|
program.option("--no-rename", "Disable symbol expansion.");
|
||||||
|
program.option("--safari10", "Support non-standard Safari 10.");
|
||||||
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_source_map());
|
program.option("--source-map [options]", "Enable source map/specify source map options.", parse_source_map());
|
||||||
program.option("--timings", "Display operations run time on STDERR.")
|
program.option("--timings", "Display operations run time on STDERR.")
|
||||||
@@ -66,11 +69,14 @@ if (!program.output && program.sourceMap && program.sourceMap.url != "inline") {
|
|||||||
"compress",
|
"compress",
|
||||||
"ie8",
|
"ie8",
|
||||||
"mangle",
|
"mangle",
|
||||||
|
"rename",
|
||||||
|
"safari10",
|
||||||
"sourceMap",
|
"sourceMap",
|
||||||
"toplevel",
|
"toplevel",
|
||||||
"wrap"
|
"wrap"
|
||||||
].forEach(function(name) {
|
].forEach(function(name) {
|
||||||
if (name in program) {
|
if (name in program) {
|
||||||
|
if (name == "rename" && program[name]) return;
|
||||||
options[name] = program[name];
|
options[name] = program[name];
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -95,6 +101,9 @@ if (program.define) {
|
|||||||
options.compress.global_defs[expr] = program.define[expr];
|
options.compress.global_defs[expr] = program.define[expr];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (program.keepClassnames) {
|
||||||
|
options.keep_classnames = true;
|
||||||
|
}
|
||||||
if (program.keepFnames) {
|
if (program.keepFnames) {
|
||||||
options.keep_fnames = true;
|
options.keep_fnames = true;
|
||||||
}
|
}
|
||||||
|
|||||||
36
lib/ast.js
36
lib/ast.js
@@ -313,9 +313,9 @@ var AST_Scope = DEFNODE("Scope", "variables functions uses_with uses_eval parent
|
|||||||
enclosed: "[SymbolDef*/S] a list of all symbol definitions that are accessed from this scope or any subscopes",
|
enclosed: "[SymbolDef*/S] a list of all symbol definitions that are accessed from this scope or any subscopes",
|
||||||
cname: "[integer/S] current index for mangling variables (used internally by the mangler)",
|
cname: "[integer/S] current index for mangling variables (used internally by the mangler)",
|
||||||
},
|
},
|
||||||
get_defun_scope: function () {
|
get_defun_scope: function() {
|
||||||
var self = this;
|
var self = this;
|
||||||
while (self.is_block_scope() && self.parent_scope) {
|
while (self.is_block_scope()) {
|
||||||
self = self.parent_scope;
|
self = self.parent_scope;
|
||||||
}
|
}
|
||||||
return self;
|
return self;
|
||||||
@@ -389,15 +389,15 @@ var AST_Accessor = DEFNODE("Accessor", null, {
|
|||||||
$documentation: "A setter/getter function. The `name` property is always null."
|
$documentation: "A setter/getter function. The `name` property is always null."
|
||||||
}, AST_Lambda);
|
}, AST_Lambda);
|
||||||
|
|
||||||
var AST_Function = DEFNODE("Function", null, {
|
var AST_Function = DEFNODE("Function", "inlined", {
|
||||||
$documentation: "A function expression"
|
$documentation: "A function expression"
|
||||||
}, AST_Lambda);
|
}, AST_Lambda);
|
||||||
|
|
||||||
var AST_Arrow = DEFNODE("Arrow", null, {
|
var AST_Arrow = DEFNODE("Arrow", "inlined", {
|
||||||
$documentation: "An ES6 Arrow function ((a) => b)"
|
$documentation: "An ES6 Arrow function ((a) => b)"
|
||||||
}, AST_Lambda);
|
}, AST_Lambda);
|
||||||
|
|
||||||
var AST_Defun = DEFNODE("Defun", null, {
|
var AST_Defun = DEFNODE("Defun", "inlined", {
|
||||||
$documentation: "A function definition"
|
$documentation: "A function definition"
|
||||||
}, AST_Lambda);
|
}, AST_Lambda);
|
||||||
|
|
||||||
@@ -448,10 +448,8 @@ var AST_TemplateString = DEFNODE("TemplateString", "segments", {
|
|||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function(){
|
||||||
this.segments.forEach(function(seg, i){
|
this.segments.forEach(function(seg){
|
||||||
if (i % 2 !== 0) {
|
seg._walk(visitor);
|
||||||
seg._walk(visitor);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -910,7 +908,7 @@ var AST_ConciseMethod = DEFNODE("ConciseMethod", "quote static is_generator asyn
|
|||||||
$documentation: "An ES6 concise method inside an object or class"
|
$documentation: "An ES6 concise method inside an object or class"
|
||||||
}, AST_ObjectProperty);
|
}, AST_ObjectProperty);
|
||||||
|
|
||||||
var AST_Class = DEFNODE("Class", "name extends properties", {
|
var AST_Class = DEFNODE("Class", "name extends properties inlined", {
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
name: "[AST_SymbolClass|AST_SymbolDefClass?] optional class name.",
|
name: "[AST_SymbolClass|AST_SymbolDefClass?] optional class name.",
|
||||||
extends: "[AST_Node]? optional parent class",
|
extends: "[AST_Node]? optional parent class",
|
||||||
@@ -1205,24 +1203,6 @@ TreeWalker.prototype = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
in_boolean_context: function() {
|
|
||||||
var stack = this.stack;
|
|
||||||
var i = stack.length, self = stack[--i];
|
|
||||||
while (i > 0) {
|
|
||||||
var p = stack[--i];
|
|
||||||
if ((p instanceof AST_If && p.condition === self) ||
|
|
||||||
(p instanceof AST_Conditional && p.condition === self) ||
|
|
||||||
(p instanceof AST_DWLoop && p.condition === self) ||
|
|
||||||
(p instanceof AST_For && p.condition === self) ||
|
|
||||||
(p instanceof AST_UnaryPrefix && p.operator == "!" && p.expression === self))
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (!(p instanceof AST_Binary && (p.operator == "&&" || p.operator == "||")))
|
|
||||||
return false;
|
|
||||||
self = p;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
loopcontrol_target: function(node) {
|
loopcontrol_target: function(node) {
|
||||||
var stack = this.stack;
|
var stack = this.stack;
|
||||||
if (node.label) for (var i = stack.length; --i >= 0;) {
|
if (node.label) for (var i = stack.length; --i >= 0;) {
|
||||||
|
|||||||
1803
lib/compress.js
1803
lib/compress.js
File diff suppressed because it is too large
Load Diff
@@ -51,11 +51,14 @@ function minify(files, options) {
|
|||||||
compress: {},
|
compress: {},
|
||||||
ecma: undefined,
|
ecma: undefined,
|
||||||
ie8: false,
|
ie8: false,
|
||||||
|
keep_classnames: undefined,
|
||||||
keep_fnames: false,
|
keep_fnames: false,
|
||||||
mangle: {},
|
mangle: {},
|
||||||
nameCache: null,
|
nameCache: null,
|
||||||
output: {},
|
output: {},
|
||||||
parse: {},
|
parse: {},
|
||||||
|
rename: undefined,
|
||||||
|
safari10: false,
|
||||||
sourceMap: false,
|
sourceMap: false,
|
||||||
timings: false,
|
timings: false,
|
||||||
toplevel: false,
|
toplevel: false,
|
||||||
@@ -65,9 +68,17 @@ function minify(files, options) {
|
|||||||
var timings = options.timings && {
|
var timings = options.timings && {
|
||||||
start: Date.now()
|
start: Date.now()
|
||||||
};
|
};
|
||||||
|
if (options.keep_classnames === undefined) {
|
||||||
|
options.keep_classnames = options.keep_fnames;
|
||||||
|
}
|
||||||
|
if (options.rename === undefined) {
|
||||||
|
options.rename = options.compress && options.mangle;
|
||||||
|
}
|
||||||
set_shorthand("ecma", options, [ "parse", "compress", "output" ]);
|
set_shorthand("ecma", options, [ "parse", "compress", "output" ]);
|
||||||
set_shorthand("ie8", options, [ "compress", "mangle", "output" ]);
|
set_shorthand("ie8", options, [ "compress", "mangle", "output" ]);
|
||||||
|
set_shorthand("keep_classnames", options, [ "compress", "mangle" ]);
|
||||||
set_shorthand("keep_fnames", options, [ "compress", "mangle" ]);
|
set_shorthand("keep_fnames", options, [ "compress", "mangle" ]);
|
||||||
|
set_shorthand("safari10", options, [ "mangle", "output" ]);
|
||||||
set_shorthand("toplevel", options, [ "compress", "mangle" ]);
|
set_shorthand("toplevel", options, [ "compress", "mangle" ]);
|
||||||
set_shorthand("warnings", options, [ "compress" ]);
|
set_shorthand("warnings", options, [ "compress" ]);
|
||||||
var quoted_props;
|
var quoted_props;
|
||||||
@@ -141,11 +152,14 @@ function minify(files, options) {
|
|||||||
if (options.wrap) {
|
if (options.wrap) {
|
||||||
toplevel = toplevel.wrap_commonjs(options.wrap);
|
toplevel = toplevel.wrap_commonjs(options.wrap);
|
||||||
}
|
}
|
||||||
if (timings) timings.scope1 = Date.now();
|
if (timings) timings.rename = Date.now();
|
||||||
if (options.compress) toplevel.figure_out_scope(options.mangle);
|
if (options.rename) {
|
||||||
|
toplevel.figure_out_scope(options.mangle);
|
||||||
|
toplevel.expand_names(options.mangle);
|
||||||
|
}
|
||||||
if (timings) timings.compress = Date.now();
|
if (timings) timings.compress = Date.now();
|
||||||
if (options.compress) toplevel = new Compressor(options.compress).compress(toplevel);
|
if (options.compress) toplevel = new Compressor(options.compress).compress(toplevel);
|
||||||
if (timings) timings.scope2 = Date.now();
|
if (timings) timings.scope = Date.now();
|
||||||
if (options.mangle) toplevel.figure_out_scope(options.mangle);
|
if (options.mangle) toplevel.figure_out_scope(options.mangle);
|
||||||
if (timings) timings.mangle = Date.now();
|
if (timings) timings.mangle = Date.now();
|
||||||
if (options.mangle) {
|
if (options.mangle) {
|
||||||
@@ -203,9 +217,10 @@ function minify(files, options) {
|
|||||||
if (timings) {
|
if (timings) {
|
||||||
timings.end = Date.now();
|
timings.end = Date.now();
|
||||||
result.timings = {
|
result.timings = {
|
||||||
parse: 1e-3 * (timings.scope1 - timings.parse),
|
parse: 1e-3 * (timings.rename - timings.parse),
|
||||||
scope: 1e-3 * (timings.compress - timings.scope1 + timings.mangle - timings.scope2),
|
rename: 1e-3 * (timings.compress - timings.rename),
|
||||||
compress: 1e-3 * (timings.scope2 - timings.compress),
|
compress: 1e-3 * (timings.scope - timings.compress),
|
||||||
|
scope: 1e-3 * (timings.mangle - timings.scope),
|
||||||
mangle: 1e-3 * (timings.properties - timings.mangle),
|
mangle: 1e-3 * (timings.properties - timings.mangle),
|
||||||
properties: 1e-3 * (timings.output - timings.properties),
|
properties: 1e-3 * (timings.output - timings.properties),
|
||||||
output: 1e-3 * (timings.end - timings.output),
|
output: 1e-3 * (timings.end - timings.output),
|
||||||
|
|||||||
@@ -68,6 +68,7 @@ function OutputStream(options) {
|
|||||||
preserve_line : false,
|
preserve_line : false,
|
||||||
quote_keys : false,
|
quote_keys : false,
|
||||||
quote_style : 0,
|
quote_style : 0,
|
||||||
|
safari10 : false,
|
||||||
semicolons : true,
|
semicolons : true,
|
||||||
shebang : true,
|
shebang : true,
|
||||||
shorthand : undefined,
|
shorthand : undefined,
|
||||||
@@ -262,7 +263,7 @@ function OutputStream(options) {
|
|||||||
}
|
}
|
||||||
} : noop;
|
} : noop;
|
||||||
|
|
||||||
var requireSemicolonChars = makePredicate("( [ + * / - , .");
|
var requireSemicolonChars = makePredicate("( [ + * / - , . `");
|
||||||
|
|
||||||
function print(str) {
|
function print(str) {
|
||||||
str = String(str);
|
str = String(str);
|
||||||
@@ -677,7 +678,8 @@ function OutputStream(options) {
|
|||||||
PARENS(AST_Await, function(output){
|
PARENS(AST_Await, 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
|
||||||
|
|| output.option("safari10") && p instanceof AST_UnaryPrefix;
|
||||||
});
|
});
|
||||||
|
|
||||||
PARENS(AST_Sequence, function(output){
|
PARENS(AST_Sequence, function(output){
|
||||||
@@ -1361,6 +1363,7 @@ function OutputStream(options) {
|
|||||||
self.exported_value.print(output);
|
self.exported_value.print(output);
|
||||||
} else if (self.exported_definition) {
|
} else if (self.exported_definition) {
|
||||||
self.exported_definition.print(output);
|
self.exported_definition.print(output);
|
||||||
|
if (self.exported_definition instanceof AST_Definitions) return;
|
||||||
}
|
}
|
||||||
if (self.module_name) {
|
if (self.module_name) {
|
||||||
output.space();
|
output.space();
|
||||||
@@ -1623,7 +1626,8 @@ function OutputStream(options) {
|
|||||||
if (allowShortHand &&
|
if (allowShortHand &&
|
||||||
self.value instanceof AST_Symbol &&
|
self.value instanceof AST_Symbol &&
|
||||||
is_identifier_string(self.key) &&
|
is_identifier_string(self.key) &&
|
||||||
get_name(self.value) === self.key
|
get_name(self.value) === self.key &&
|
||||||
|
is_identifier(self.key)
|
||||||
) {
|
) {
|
||||||
print_property_name(self.key, self.quote, output);
|
print_property_name(self.key, self.quote, output);
|
||||||
|
|
||||||
|
|||||||
@@ -2107,7 +2107,8 @@ function parse($TEXT, options) {
|
|||||||
}));
|
}));
|
||||||
while (S.token.end === false) {
|
while (S.token.end === false) {
|
||||||
next();
|
next();
|
||||||
segments.push(expression());
|
handle_regexp();
|
||||||
|
segments.push(expression(true));
|
||||||
|
|
||||||
if (!is_token("template_substitution")) {
|
if (!is_token("template_substitution")) {
|
||||||
unexpected();
|
unexpected();
|
||||||
|
|||||||
@@ -104,7 +104,7 @@ function reserve_quoted_keys(ast, reserved) {
|
|||||||
function addStrings(node, add) {
|
function addStrings(node, add) {
|
||||||
node.walk(new TreeWalker(function(node) {
|
node.walk(new TreeWalker(function(node) {
|
||||||
if (node instanceof AST_Sequence) {
|
if (node instanceof AST_Sequence) {
|
||||||
addStrings(node.expressions[node.expressions.length - 1], add);
|
addStrings(node.tail_node(), add);
|
||||||
} else if (node instanceof AST_String) {
|
} else if (node instanceof AST_String) {
|
||||||
add(node.value);
|
add(node.value);
|
||||||
} else if (node instanceof AST_Conditional) {
|
} else if (node instanceof AST_Conditional) {
|
||||||
|
|||||||
113
lib/scope.js
113
lib/scope.js
@@ -43,16 +43,17 @@
|
|||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
function SymbolDef(scope, index, orig) {
|
function SymbolDef(scope, orig) {
|
||||||
this.name = orig.name;
|
this.name = orig.name;
|
||||||
this.orig = [ orig ];
|
this.orig = [ orig ];
|
||||||
|
this.eliminated = 0;
|
||||||
this.scope = scope;
|
this.scope = scope;
|
||||||
this.references = [];
|
this.references = [];
|
||||||
|
this.replaced = 0;
|
||||||
this.global = false;
|
this.global = false;
|
||||||
this.export = false;
|
this.export = false;
|
||||||
this.mangled_name = null;
|
this.mangled_name = null;
|
||||||
this.undeclared = false;
|
this.undeclared = false;
|
||||||
this.index = index;
|
|
||||||
this.id = SymbolDef.next_id++;
|
this.id = SymbolDef.next_id++;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -182,11 +183,7 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
|
|||||||
// scope when we encounter the AST_Defun node (which is
|
// scope when we encounter the AST_Defun node (which is
|
||||||
// instanceof AST_Scope) but we get to the symbol a bit
|
// instanceof AST_Scope) but we get to the symbol a bit
|
||||||
// later.
|
// later.
|
||||||
var parent_lambda = defun.parent_scope;
|
mark_export((node.scope = defun.parent_scope.get_defun_scope()).def_function(node), 1);
|
||||||
while (parent_lambda.is_block_scope()) {
|
|
||||||
parent_lambda = parent_lambda.parent_scope;
|
|
||||||
}
|
|
||||||
mark_export((node.scope = parent_lambda).def_function(node), 1);
|
|
||||||
}
|
}
|
||||||
else if (node instanceof AST_SymbolClass) {
|
else if (node instanceof AST_SymbolClass) {
|
||||||
mark_export(defun.def_variable(node), 1);
|
mark_export(defun.def_variable(node), 1);
|
||||||
@@ -344,7 +341,7 @@ AST_Toplevel.DEFMETHOD("def_global", function(node){
|
|||||||
if (globals.has(name)) {
|
if (globals.has(name)) {
|
||||||
return globals.get(name);
|
return globals.get(name);
|
||||||
} else {
|
} else {
|
||||||
var g = new SymbolDef(this, globals.size(), node);
|
var g = new SymbolDef(this, node);
|
||||||
g.undeclared = true;
|
g.undeclared = true;
|
||||||
g.global = true;
|
g.global = true;
|
||||||
globals.set(name, g);
|
globals.set(name, g);
|
||||||
@@ -415,7 +412,7 @@ AST_Scope.DEFMETHOD("def_function", function(symbol){
|
|||||||
AST_Scope.DEFMETHOD("def_variable", function(symbol){
|
AST_Scope.DEFMETHOD("def_variable", function(symbol){
|
||||||
var def;
|
var def;
|
||||||
if (!this.variables.has(symbol.name)) {
|
if (!this.variables.has(symbol.name)) {
|
||||||
def = new SymbolDef(this, this.variables.size(), symbol);
|
def = new SymbolDef(this, symbol);
|
||||||
this.variables.set(symbol.name, def);
|
this.variables.set(symbol.name, def);
|
||||||
def.global = !this.parent_scope;
|
def.global = !this.parent_scope;
|
||||||
} else {
|
} else {
|
||||||
@@ -433,7 +430,7 @@ AST_Scope.DEFMETHOD("next_mangled", function(options){
|
|||||||
|
|
||||||
// https://github.com/mishoo/UglifyJS2/issues/242 -- do not
|
// https://github.com/mishoo/UglifyJS2/issues/242 -- do not
|
||||||
// shadow a name reserved from mangling.
|
// shadow a name reserved from mangling.
|
||||||
if (options.reserved.indexOf(m) >= 0) continue;
|
if (member(m, options.reserved)) continue;
|
||||||
|
|
||||||
// we must ensure that the mangled name does not shadow a name
|
// we must ensure that the mangled name does not shadow a name
|
||||||
// from some parent scope that is referenced in this or in
|
// from some parent scope that is referenced in this or in
|
||||||
@@ -485,7 +482,7 @@ AST_Symbol.DEFMETHOD("global", function(){
|
|||||||
return this.definition().global;
|
return this.definition().global;
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Toplevel.DEFMETHOD("_default_mangler_options", function(options){
|
AST_Toplevel.DEFMETHOD("_default_mangler_options", function(options) {
|
||||||
options = defaults(options, {
|
options = defaults(options, {
|
||||||
eval : false,
|
eval : false,
|
||||||
ie8 : false,
|
ie8 : false,
|
||||||
@@ -495,15 +492,14 @@ AST_Toplevel.DEFMETHOD("_default_mangler_options", function(options){
|
|||||||
toplevel : false,
|
toplevel : false,
|
||||||
});
|
});
|
||||||
if (!Array.isArray(options.reserved)) options.reserved = [];
|
if (!Array.isArray(options.reserved)) options.reserved = [];
|
||||||
|
// Never mangle arguments
|
||||||
|
push_uniq(options.reserved, "arguments");
|
||||||
return options;
|
return options;
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Toplevel.DEFMETHOD("mangle_names", function(options){
|
AST_Toplevel.DEFMETHOD("mangle_names", function(options){
|
||||||
options = this._default_mangler_options(options);
|
options = this._default_mangler_options(options);
|
||||||
|
|
||||||
// Never mangle arguments
|
|
||||||
options.reserved.push('arguments');
|
|
||||||
|
|
||||||
// We only need to mangle declaration nodes. Special logic wired
|
// We only need to mangle declaration nodes. Special logic wired
|
||||||
// into the code generator will display the mangled name if it's
|
// into the code generator will display the mangled name if it's
|
||||||
// present (and for AST_SymbolRef-s it'll use the mangled name of
|
// present (and for AST_SymbolRef-s it'll use the mangled name of
|
||||||
@@ -512,11 +508,7 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options){
|
|||||||
var to_mangle = [];
|
var to_mangle = [];
|
||||||
|
|
||||||
if (options.cache) {
|
if (options.cache) {
|
||||||
this.globals.each(function(symbol){
|
this.globals.each(collect);
|
||||||
if (options.reserved.indexOf(symbol.name) < 0) {
|
|
||||||
to_mangle.push(symbol);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var tw = new TreeWalker(function(node, descend){
|
var tw = new TreeWalker(function(node, descend){
|
||||||
@@ -528,13 +520,7 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options){
|
|||||||
return true; // don't descend again in TreeWalker
|
return true; // don't descend again in TreeWalker
|
||||||
}
|
}
|
||||||
if (node instanceof AST_Scope) {
|
if (node instanceof AST_Scope) {
|
||||||
var p = tw.parent(), a = [];
|
node.variables.each(collect);
|
||||||
node.variables.each(function(symbol){
|
|
||||||
if (options.reserved.indexOf(symbol.name) < 0) {
|
|
||||||
a.push(symbol);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
to_mangle.push.apply(to_mangle, a);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (node instanceof AST_Label) {
|
if (node instanceof AST_Label) {
|
||||||
@@ -559,6 +545,79 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options){
|
|||||||
if (options.cache) {
|
if (options.cache) {
|
||||||
options.cache.cname = this.cname;
|
options.cache.cname = this.cname;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function collect(symbol) {
|
||||||
|
if (!member(symbol.name, options.reserved)) {
|
||||||
|
to_mangle.push(symbol);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
AST_Toplevel.DEFMETHOD("find_unique_prefix", function(options) {
|
||||||
|
var letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_";
|
||||||
|
var cache = options.cache && options.cache.props;
|
||||||
|
var prefixes = Object.create(null);
|
||||||
|
options.reserved.forEach(add_prefix);
|
||||||
|
this.globals.each(add_def);
|
||||||
|
this.walk(new TreeWalker(function(node) {
|
||||||
|
if (node instanceof AST_Scope) node.variables.each(add_def);
|
||||||
|
if (node instanceof AST_SymbolCatch) add_def(node.definition());
|
||||||
|
}));
|
||||||
|
var prefix, i = 0;
|
||||||
|
do {
|
||||||
|
prefix = create_name(i++);
|
||||||
|
} while (prefixes[prefix]);
|
||||||
|
return prefix;
|
||||||
|
|
||||||
|
function add_prefix(name) {
|
||||||
|
if (/[0-9]$/.test(name)) {
|
||||||
|
prefixes[name.replace(/[0-9]+$/, "")] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function add_def(def) {
|
||||||
|
var name = def.name;
|
||||||
|
if (def.global && cache && cache.has(name)) name = cache.get(name);
|
||||||
|
else if (!def.unmangleable(options)) return;
|
||||||
|
add_prefix(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
function create_name(num) {
|
||||||
|
var name = "";
|
||||||
|
do {
|
||||||
|
name += letters[num % letters.length];
|
||||||
|
num = Math.floor(num / letters.length);
|
||||||
|
} while (num);
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
AST_Toplevel.DEFMETHOD("expand_names", function(options) {
|
||||||
|
options = this._default_mangler_options(options);
|
||||||
|
var prefix = this.find_unique_prefix(options);
|
||||||
|
this.globals.each(rename);
|
||||||
|
this.walk(new TreeWalker(function(node) {
|
||||||
|
if (node instanceof AST_Scope) node.variables.each(rename);
|
||||||
|
if (node instanceof AST_SymbolCatch) rename(node.definition());
|
||||||
|
}));
|
||||||
|
|
||||||
|
function rename(def) {
|
||||||
|
if (def.global || def.unmangleable(options)) return;
|
||||||
|
if (member(def.name, options.reserved)) return;
|
||||||
|
var d = def.redefined();
|
||||||
|
def.name = d ? d.name : prefix + def.id;
|
||||||
|
def.orig.forEach(function(sym) {
|
||||||
|
sym.name = def.name;
|
||||||
|
});
|
||||||
|
def.references.forEach(function(sym) {
|
||||||
|
sym.name = def.name;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
AST_Node.DEFMETHOD("tail_node", return_this);
|
||||||
|
AST_Sequence.DEFMETHOD("tail_node", function() {
|
||||||
|
return this.expressions[this.expressions.length - 1];
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Toplevel.DEFMETHOD("compute_char_frequency", function(options){
|
AST_Toplevel.DEFMETHOD("compute_char_frequency", function(options){
|
||||||
@@ -589,7 +648,7 @@ AST_Toplevel.DEFMETHOD("compute_char_frequency", function(options){
|
|||||||
skip_string(node.consequent);
|
skip_string(node.consequent);
|
||||||
skip_string(node.alternative);
|
skip_string(node.alternative);
|
||||||
} else if (node instanceof AST_Sequence) {
|
} else if (node instanceof AST_Sequence) {
|
||||||
skip_string(node.expressions[node.expressions.length - 1]);
|
skip_string(node.tail_node());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -262,11 +262,7 @@ TreeTransformer.prototype = new TreeWalker;
|
|||||||
});
|
});
|
||||||
|
|
||||||
_(AST_TemplateString, function(self, tw) {
|
_(AST_TemplateString, function(self, tw) {
|
||||||
for (var i = 0; i < self.segments.length; i++) {
|
self.segments = do_list(self.segments, tw);
|
||||||
if (!(self.segments[i] instanceof AST_TemplateSegment)) {
|
|
||||||
self.segments[i] = self.segments[i].transform(tw);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
_(AST_PrefixedTemplateString, function(self, tw) {
|
_(AST_PrefixedTemplateString, function(self, tw) {
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
"homepage": "https://github.com/mishoo/UglifyJS2/tree/harmony",
|
"homepage": "https://github.com/mishoo/UglifyJS2/tree/harmony",
|
||||||
"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.1.5",
|
"version": "3.2.2",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.8.0"
|
"node": ">=0.8.0"
|
||||||
},
|
},
|
||||||
@@ -26,11 +26,11 @@
|
|||||||
"LICENSE"
|
"LICENSE"
|
||||||
],
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"commander": "~2.11.0",
|
"commander": "~2.12.1",
|
||||||
"source-map": "~0.6.1"
|
"source-map": "~0.6.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"acorn": "~5.1.1",
|
"acorn": "~5.2.1",
|
||||||
"mocha": "~3.5.1",
|
"mocha": "~3.5.1",
|
||||||
"semver": "~5.4.1"
|
"semver": "~5.4.1"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -203,50 +203,114 @@ constant_join_3: {
|
|||||||
|
|
||||||
for_loop: {
|
for_loop: {
|
||||||
options = {
|
options = {
|
||||||
unsafe : true,
|
evaluate: true,
|
||||||
unused : true,
|
reduce_funcs: true,
|
||||||
evaluate : true,
|
reduce_vars: true,
|
||||||
reduce_vars : true
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
function f0() {
|
function f0() {
|
||||||
var a = [1, 2, 3];
|
var a = [1, 2, 3];
|
||||||
for (var i = 0; i < a.length; i++) {
|
var b = 0;
|
||||||
console.log(a[i]);
|
for (var i = 0; i < a.length; i++)
|
||||||
}
|
b += a[i];
|
||||||
|
return b;
|
||||||
}
|
}
|
||||||
|
|
||||||
function f1() {
|
function f1() {
|
||||||
var a = [1, 2, 3];
|
var a = [1, 2, 3];
|
||||||
for (var i = 0, len = a.length; i < len; i++) {
|
var b = 0;
|
||||||
console.log(a[i]);
|
for (var i = 0, len = a.length; i < len; i++)
|
||||||
}
|
b += a[i];
|
||||||
|
return b;
|
||||||
}
|
}
|
||||||
|
|
||||||
function f2() {
|
|
||||||
var a = [1, 2, 3];
|
|
||||||
for (var i = 0; i < a.length; i++) {
|
|
||||||
a[i]++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect: {
|
|
||||||
function f0() {
|
|
||||||
var a = [1, 2, 3];
|
|
||||||
for (var i = 0; i < 3; i++)
|
|
||||||
console.log(a[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
function f1() {
|
|
||||||
var a = [1, 2, 3];
|
|
||||||
for (var i = 0; i < 3; i++)
|
|
||||||
console.log(a[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
function f2() {
|
function f2() {
|
||||||
var a = [1, 2, 3];
|
var a = [1, 2, 3];
|
||||||
for (var i = 0; i < a.length; i++)
|
for (var i = 0; i < a.length; i++)
|
||||||
a[i]++;
|
a[i]++;
|
||||||
|
return a[2];
|
||||||
}
|
}
|
||||||
|
console.log(f0(), f1(), f2());
|
||||||
}
|
}
|
||||||
|
expect: {
|
||||||
|
function f0() {
|
||||||
|
var a = [1, 2, 3];
|
||||||
|
var b = 0;
|
||||||
|
for (var i = 0; i < 3; i++)
|
||||||
|
b += a[i];
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
function f1() {
|
||||||
|
var a = [1, 2, 3];
|
||||||
|
var b = 0;
|
||||||
|
for (var i = 0; i < 3; i++)
|
||||||
|
b += a[i];
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
function f2() {
|
||||||
|
var a = [1, 2, 3];
|
||||||
|
for (var i = 0; i < a.length; i++)
|
||||||
|
a[i]++;
|
||||||
|
return a[2];
|
||||||
|
}
|
||||||
|
console.log(f0(), f1(), f2());
|
||||||
|
}
|
||||||
|
expect_stdout: "6 6 4"
|
||||||
|
}
|
||||||
|
|
||||||
|
index: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = [ 1, 2 ];
|
||||||
|
console.log(a[0], a[1]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(1, 2);
|
||||||
|
}
|
||||||
|
expect_stdout: "1 2"
|
||||||
|
}
|
||||||
|
|
||||||
|
length: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = [ 1, 2 ];
|
||||||
|
console.log(a.length);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(2);
|
||||||
|
}
|
||||||
|
expect_stdout: "2"
|
||||||
|
}
|
||||||
|
|
||||||
|
index_length: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = [ 1, 2 ];
|
||||||
|
console.log(a[0], a.length);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(1, 2);
|
||||||
|
}
|
||||||
|
expect_stdout: "1 2"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -288,6 +288,7 @@ issue_2105_1: {
|
|||||||
ecma: 6,
|
ecma: 6,
|
||||||
inline: true,
|
inline: true,
|
||||||
passes: 3,
|
passes: 3,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
unsafe_methods: true,
|
unsafe_methods: true,
|
||||||
@@ -314,17 +315,12 @@ issue_2105_1: {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
(() => {
|
({
|
||||||
var quux = () => {
|
prop() {
|
||||||
|
console.log;
|
||||||
console.log("PASS");
|
console.log("PASS");
|
||||||
};
|
}
|
||||||
return {
|
}).prop();
|
||||||
prop() {
|
|
||||||
console.log;
|
|
||||||
quux();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
})().prop();
|
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
@@ -335,6 +331,7 @@ issue_2105_2: {
|
|||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
passes: 2,
|
passes: 2,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -360,17 +357,12 @@ issue_2105_2: {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
(() => {
|
({
|
||||||
var quux = () => {
|
prop: () => {
|
||||||
|
console.log;
|
||||||
console.log("PASS");
|
console.log("PASS");
|
||||||
};
|
}
|
||||||
return {
|
}).prop();
|
||||||
prop: () => {
|
|
||||||
console.log;
|
|
||||||
quux();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
})().prop();
|
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
@@ -411,6 +403,7 @@ issue_2136_3: {
|
|||||||
evaluate: true,
|
evaluate: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
passes: 3,
|
passes: 3,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
@@ -438,6 +431,7 @@ call_args: {
|
|||||||
ecma: 6,
|
ecma: 6,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -462,6 +456,7 @@ call_args_drop_param: {
|
|||||||
evaluate: true,
|
evaluate: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
keep_fargs: false,
|
keep_fargs: false,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -488,6 +483,7 @@ issue_485_crashing_1530: {
|
|||||||
ecma: 6,
|
ecma: 6,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
(function(a) {
|
(function(a) {
|
||||||
@@ -495,9 +491,7 @@ issue_485_crashing_1530: {
|
|||||||
var b = 42;
|
var b = 42;
|
||||||
})(this);
|
})(this);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {}
|
||||||
this, void 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_2084: {
|
issue_2084: {
|
||||||
@@ -509,6 +503,7 @@ issue_2084: {
|
|||||||
evaluate: true,
|
evaluate: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
passes: 2,
|
passes: 2,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
|
|||||||
@@ -141,6 +141,7 @@ async_inline: {
|
|||||||
evaluate: true,
|
evaluate: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
@@ -292,3 +293,31 @@ async_arrow_iife_negate_iife: {
|
|||||||
}
|
}
|
||||||
expect_exact: "(async()=>{await fetch()})();(()=>{plain()})();"
|
expect_exact: "(async()=>{await fetch()})();(()=>{plain()})();"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_2344_1: {
|
||||||
|
beautify = {
|
||||||
|
safari10: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
async () => {
|
||||||
|
+await x;
|
||||||
|
await y;
|
||||||
|
return await z;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
expect_exact: "async()=>{+await x;await y;return await z};"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2344_2: {
|
||||||
|
beautify = {
|
||||||
|
safari10: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
async () => {
|
||||||
|
+await x;
|
||||||
|
await y;
|
||||||
|
return await z;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
expect_exact: "async()=>{+(await x);await y;return await z};"
|
||||||
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -74,3 +74,41 @@ dont_change_in_or_instanceof_expressions: {
|
|||||||
null instanceof null;
|
null instanceof null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self_comparison_1: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
a === a;
|
||||||
|
a !== b;
|
||||||
|
b.c === a.c;
|
||||||
|
b.c !== b.c;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
a == a;
|
||||||
|
a !== b;
|
||||||
|
b.c === a.c;
|
||||||
|
b.c != b.c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
self_comparison_2: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {}
|
||||||
|
var o = {};
|
||||||
|
console.log(f != f, o === o);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {}
|
||||||
|
var o = {};
|
||||||
|
console.log(false, true);
|
||||||
|
}
|
||||||
|
expect_stdout: "false true"
|
||||||
|
}
|
||||||
|
|||||||
@@ -166,22 +166,24 @@ cond_1: {
|
|||||||
conditionals: true
|
conditionals: true
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
var do_something; // if undeclared it's assumed to have side-effects
|
function foo(do_something, some_condition) {
|
||||||
if (some_condition()) {
|
if (some_condition) {
|
||||||
do_something(x);
|
do_something(x);
|
||||||
} else {
|
} else {
|
||||||
do_something(y);
|
do_something(y);
|
||||||
}
|
}
|
||||||
if (some_condition()) {
|
if (some_condition) {
|
||||||
side_effects(x);
|
side_effects(x);
|
||||||
} else {
|
} else {
|
||||||
side_effects(y);
|
side_effects(y);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var do_something;
|
function foo(do_something, some_condition) {
|
||||||
do_something(some_condition() ? x : y);
|
do_something(some_condition ? x : y);
|
||||||
some_condition() ? side_effects(x) : side_effects(y);
|
some_condition ? side_effects(x) : side_effects(y);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -190,16 +192,18 @@ cond_2: {
|
|||||||
conditionals: true
|
conditionals: true
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
var x, FooBar;
|
function foo(x, FooBar, some_condition) {
|
||||||
if (some_condition()) {
|
if (some_condition) {
|
||||||
x = new FooBar(1);
|
x = new FooBar(1);
|
||||||
} else {
|
} else {
|
||||||
x = new FooBar(2);
|
x = new FooBar(2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var x, FooBar;
|
function foo(x, FooBar, some_condition) {
|
||||||
x = new FooBar(some_condition() ? 1 : 2);
|
x = new FooBar(some_condition ? 1 : 2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -605,6 +609,42 @@ cond_8c: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cond_9: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(x, y) {
|
||||||
|
g() ? x(1) : x(2);
|
||||||
|
x ? (y || x)() : (y || x)();
|
||||||
|
x ? y(a, b) : y(d, b, c);
|
||||||
|
x ? y(a, b, c) : y(a, b, c);
|
||||||
|
x ? y(a, b, c) : y(a, b, f);
|
||||||
|
x ? y(a, b, c) : y(a, e, c);
|
||||||
|
x ? y(a, b, c) : y(a, e, f);
|
||||||
|
x ? y(a, b, c) : y(d, b, c);
|
||||||
|
x ? y(a, b, c) : y(d, b, f);
|
||||||
|
x ? y(a, b, c) : y(d, e, c);
|
||||||
|
x ? y(a, b, c) : y(d, e, f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(x, y) {
|
||||||
|
g() ? x(1) : x(2);
|
||||||
|
x, (y || x)();
|
||||||
|
x ? y(a, b) : y(d, b, c);
|
||||||
|
x, y(a, b, c);
|
||||||
|
y(a, b, x ? c : f);
|
||||||
|
y(a, x ? b : e, c);
|
||||||
|
x ? y(a, b, c) : y(a, e, f);
|
||||||
|
y(x ? a : d, b, c);
|
||||||
|
x ? y(a, b, c) : y(d, b, f);
|
||||||
|
x ? y(a, b, c) : y(d, e, c);
|
||||||
|
x ? y(a, b, c) : y(d, e, f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ternary_boolean_consequent: {
|
ternary_boolean_consequent: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
|
||||||
@@ -1015,3 +1055,151 @@ delete_conditional_2: {
|
|||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_2535_1: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
evaluate: true,
|
||||||
|
passes: 2,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
if (true || x()) y();
|
||||||
|
if (true && x()) y();
|
||||||
|
if (x() || true) y();
|
||||||
|
if (x() && true) y();
|
||||||
|
if (false || x()) y();
|
||||||
|
if (false && x()) y();
|
||||||
|
if (x() || false) y();
|
||||||
|
if (x() && false) y();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
y();
|
||||||
|
x() && y();
|
||||||
|
(x(), 1) && y();
|
||||||
|
x() && y();
|
||||||
|
x() && y();
|
||||||
|
x() && y();
|
||||||
|
(x(), 0) && y();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2535_2: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function x() {}
|
||||||
|
function y() {
|
||||||
|
return "foo";
|
||||||
|
}
|
||||||
|
console.log((x() || true) || y());
|
||||||
|
console.log((y() || true) || x());
|
||||||
|
console.log((x() || true) && y());
|
||||||
|
console.log((y() || true) && x());
|
||||||
|
console.log((x() && true) || y());
|
||||||
|
console.log((y() && true) || x());
|
||||||
|
console.log((x() && true) && y());
|
||||||
|
console.log((y() && true) && x());
|
||||||
|
console.log((x() || false) || y());
|
||||||
|
console.log((y() || false) || x());
|
||||||
|
console.log((x() || false) && y());
|
||||||
|
console.log((y() || false) && x());
|
||||||
|
console.log((x() && false) || y());
|
||||||
|
console.log((y() && false) || x());
|
||||||
|
console.log((x() && false) && y());
|
||||||
|
console.log((y() && false) && x());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function x() {}
|
||||||
|
function y() {
|
||||||
|
return "foo";
|
||||||
|
}
|
||||||
|
console.log(x() || !0);
|
||||||
|
console.log(y() || !0);
|
||||||
|
console.log((x(), y()));
|
||||||
|
console.log((y(), x()));
|
||||||
|
console.log(!!x() || y());
|
||||||
|
console.log(!!y() || x());
|
||||||
|
console.log(x() && y());
|
||||||
|
console.log(y() && x());
|
||||||
|
console.log(x() || y());
|
||||||
|
console.log(y() || x());
|
||||||
|
console.log(!!x() && y());
|
||||||
|
console.log(!!y() && x());
|
||||||
|
console.log((x(), y()));
|
||||||
|
console.log((y(), x()));
|
||||||
|
console.log(x() && !1);
|
||||||
|
console.log(y() && !1);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"true",
|
||||||
|
"foo",
|
||||||
|
"foo",
|
||||||
|
"undefined",
|
||||||
|
"foo",
|
||||||
|
"true",
|
||||||
|
"undefined",
|
||||||
|
"undefined",
|
||||||
|
"foo",
|
||||||
|
"foo",
|
||||||
|
"false",
|
||||||
|
"undefined",
|
||||||
|
"foo",
|
||||||
|
"undefined",
|
||||||
|
"undefined",
|
||||||
|
"false",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2560: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
inline: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function log(x) {
|
||||||
|
console.log(x);
|
||||||
|
}
|
||||||
|
function foo() {
|
||||||
|
return log;
|
||||||
|
}
|
||||||
|
function bar() {
|
||||||
|
if (x !== (x = foo())) {
|
||||||
|
x(1);
|
||||||
|
} else {
|
||||||
|
x(2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var x = function() {
|
||||||
|
console.log("init");
|
||||||
|
};
|
||||||
|
bar();
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function log(x) {
|
||||||
|
console.log(x);
|
||||||
|
}
|
||||||
|
function bar() {
|
||||||
|
x !== (x = log) ? x(1) : x(2);
|
||||||
|
}
|
||||||
|
var x = function() {
|
||||||
|
console.log("init");
|
||||||
|
};
|
||||||
|
bar();
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"1",
|
||||||
|
"2",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ issue_1191: {
|
|||||||
join_vars : true,
|
join_vars : true,
|
||||||
sequences : false,
|
sequences : false,
|
||||||
collapse_vars : false,
|
collapse_vars : false,
|
||||||
|
reduce_funcs : true,
|
||||||
reduce_vars : true,
|
reduce_vars : true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -44,6 +45,7 @@ issue_1194: {
|
|||||||
join_vars : true,
|
join_vars : true,
|
||||||
sequences : false,
|
sequences : false,
|
||||||
collapse_vars : false,
|
collapse_vars : false,
|
||||||
|
reduce_funcs : true,
|
||||||
reduce_vars : true,
|
reduce_vars : true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -72,6 +74,7 @@ issue_1396: {
|
|||||||
join_vars : true,
|
join_vars : true,
|
||||||
sequences : false,
|
sequences : false,
|
||||||
collapse_vars : false,
|
collapse_vars : false,
|
||||||
|
reduce_funcs : true,
|
||||||
reduce_vars : true,
|
reduce_vars : true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -143,6 +146,7 @@ regexp_literal_not_const: {
|
|||||||
join_vars : true,
|
join_vars : true,
|
||||||
sequences : false,
|
sequences : false,
|
||||||
collapse_vars : false,
|
collapse_vars : false,
|
||||||
|
reduce_funcs : true,
|
||||||
reduce_vars : true,
|
reduce_vars : true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
|
|||||||
@@ -129,8 +129,8 @@ dead_code_constant_boolean_should_warn_more: {
|
|||||||
var bar;
|
var bar;
|
||||||
// nothing for the while
|
// nothing for the while
|
||||||
// as for the for, it should keep:
|
// as for the for, it should keep:
|
||||||
var x = 10, y;
|
|
||||||
var moo;
|
var moo;
|
||||||
|
var x = 10, y;
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
@@ -165,8 +165,8 @@ dead_code_constant_boolean_should_warn_more_strict: {
|
|||||||
var foo;
|
var foo;
|
||||||
// nothing for the while
|
// nothing for the while
|
||||||
// as for the for, it should keep:
|
// as for the for, it should keep:
|
||||||
var x = 10, y;
|
|
||||||
var moo;
|
var moo;
|
||||||
|
var x = 10, y;
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
@@ -175,10 +175,11 @@ dead_code_constant_boolean_should_warn_more_strict: {
|
|||||||
|
|
||||||
dead_code_block_decls_die: {
|
dead_code_block_decls_die: {
|
||||||
options = {
|
options = {
|
||||||
dead_code : true,
|
booleans: true,
|
||||||
conditionals : true,
|
conditionals: true,
|
||||||
booleans : true,
|
dead_code: true,
|
||||||
evaluate : true
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
if (0) {
|
if (0) {
|
||||||
@@ -197,12 +198,14 @@ dead_code_block_decls_die: {
|
|||||||
|
|
||||||
dead_code_const_declaration: {
|
dead_code_const_declaration: {
|
||||||
options = {
|
options = {
|
||||||
dead_code : true,
|
booleans: true,
|
||||||
loops : true,
|
conditionals: true,
|
||||||
booleans : true,
|
dead_code: true,
|
||||||
conditionals : true,
|
evaluate: true,
|
||||||
evaluate : true,
|
loops: true,
|
||||||
reduce_vars : true,
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
var unused;
|
var unused;
|
||||||
@@ -224,13 +227,15 @@ dead_code_const_declaration: {
|
|||||||
|
|
||||||
dead_code_const_annotation: {
|
dead_code_const_annotation: {
|
||||||
options = {
|
options = {
|
||||||
dead_code : true,
|
booleans: true,
|
||||||
loops : true,
|
conditionals: true,
|
||||||
booleans : true,
|
dead_code: true,
|
||||||
conditionals : true,
|
evaluate: true,
|
||||||
evaluate : true,
|
loops: true,
|
||||||
reduce_vars : true,
|
reduce_funcs: true,
|
||||||
toplevel : true,
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
var unused;
|
var unused;
|
||||||
@@ -276,13 +281,16 @@ dead_code_const_annotation_regex: {
|
|||||||
|
|
||||||
dead_code_const_annotation_complex_scope: {
|
dead_code_const_annotation_complex_scope: {
|
||||||
options = {
|
options = {
|
||||||
dead_code : true,
|
booleans: true,
|
||||||
loops : true,
|
conditionals: true,
|
||||||
booleans : true,
|
dead_code: true,
|
||||||
conditionals : true,
|
evaluate: true,
|
||||||
evaluate : true,
|
loops: true,
|
||||||
reduce_vars : true,
|
reduce_funcs: true,
|
||||||
toplevel : true,
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
var unused_var;
|
var unused_var;
|
||||||
@@ -325,6 +333,8 @@ try_catch_finally: {
|
|||||||
conditionals: true,
|
conditionals: true,
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
passes: 2,
|
||||||
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var a = 1;
|
var a = 1;
|
||||||
@@ -439,6 +449,7 @@ global_timeout_and_interval_symbols: {
|
|||||||
issue_2233_2: {
|
issue_2233_2: {
|
||||||
options = {
|
options = {
|
||||||
pure_getters: "strict",
|
pure_getters: "strict",
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
unsafe: true,
|
unsafe: true,
|
||||||
@@ -470,6 +481,7 @@ issue_2233_2: {
|
|||||||
issue_2233_3: {
|
issue_2233_3: {
|
||||||
options = {
|
options = {
|
||||||
pure_getters: "strict",
|
pure_getters: "strict",
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
@@ -560,3 +572,67 @@ global_fns: {
|
|||||||
"RangeError",
|
"RangeError",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_2383_1: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
if (0) {
|
||||||
|
var {x, y} = foo();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var x, y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2383_2: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
if (0) {
|
||||||
|
var {
|
||||||
|
x = 0,
|
||||||
|
y: [ w, , { z, p: q = 7 } ] = [ 1, 2, { z: 3 } ]
|
||||||
|
} = {};
|
||||||
|
}
|
||||||
|
console.log(x, q, w, z);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var x, w, z, q;
|
||||||
|
console.log(x, q, w, z);
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined undefined undefined undefined"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2383_3: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var b = 7, y = 8;
|
||||||
|
if (0) {
|
||||||
|
var a = 1, [ x, y, z ] = [ 2, 3, 4 ], b = 5;
|
||||||
|
}
|
||||||
|
console.log(a, x, y, z, b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var b = 7, y = 8;
|
||||||
|
var a, x, y, z, b;
|
||||||
|
console.log(a, x, y, z, b);
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined undefined 8 undefined 7"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|||||||
@@ -262,6 +262,7 @@ destructuring_dont_evaluate_with_undefined_as_default_assignment: {
|
|||||||
|
|
||||||
reduce_vars: {
|
reduce_vars: {
|
||||||
options = {
|
options = {
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
|
|||||||
@@ -260,7 +260,9 @@ keep_fnames: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
drop_assign: {
|
drop_assign: {
|
||||||
options = { unused: true };
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
function f1() {
|
function f1() {
|
||||||
var a;
|
var a;
|
||||||
@@ -281,7 +283,7 @@ drop_assign: {
|
|||||||
var a;
|
var a;
|
||||||
return function() {
|
return function() {
|
||||||
a = 1;
|
a = 1;
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
@@ -298,16 +300,17 @@ drop_assign: {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
function f5() {
|
function f5() {
|
||||||
var a;
|
|
||||||
return function() {
|
return function() {
|
||||||
a = 1;
|
1;
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
keep_assign: {
|
keep_assign: {
|
||||||
options = { unused: "keep_assign" };
|
options = {
|
||||||
|
unused: "keep_assign",
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
function f1() {
|
function f1() {
|
||||||
var a;
|
var a;
|
||||||
@@ -328,7 +331,7 @@ keep_assign: {
|
|||||||
var a;
|
var a;
|
||||||
return function() {
|
return function() {
|
||||||
a = 1;
|
a = 1;
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
@@ -351,19 +354,22 @@ keep_assign: {
|
|||||||
var a;
|
var a;
|
||||||
return function() {
|
return function() {
|
||||||
a = 1;
|
a = 1;
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
drop_toplevel_funcs: {
|
drop_toplevel_funcs: {
|
||||||
options = { toplevel: "funcs", unused: true };
|
options = {
|
||||||
|
toplevel: "funcs",
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
var a, b = 1, c = g;
|
var a, b = 1, c = g;
|
||||||
function f(d) {
|
function f(d) {
|
||||||
return function() {
|
return function() {
|
||||||
c = 2;
|
c = 2;
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
a = 2;
|
a = 2;
|
||||||
function g() {}
|
function g() {}
|
||||||
@@ -379,13 +385,16 @@ drop_toplevel_funcs: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
drop_toplevel_vars: {
|
drop_toplevel_vars: {
|
||||||
options = { toplevel: "vars", unused: true };
|
options = {
|
||||||
|
toplevel: "vars",
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
var a, b = 1, c = g;
|
var a, b = 1, c = g;
|
||||||
function f(d) {
|
function f(d) {
|
||||||
return function() {
|
return function() {
|
||||||
c = 2;
|
c = 2;
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
a = 2;
|
a = 2;
|
||||||
function g() {}
|
function g() {}
|
||||||
@@ -393,11 +402,10 @@ drop_toplevel_vars: {
|
|||||||
console.log(b = 3);
|
console.log(b = 3);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var c = g;
|
|
||||||
function f(d) {
|
function f(d) {
|
||||||
return function() {
|
return function() {
|
||||||
c = 2;
|
2;
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
2;
|
2;
|
||||||
function g() {}
|
function g() {}
|
||||||
@@ -407,13 +415,17 @@ drop_toplevel_vars: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
drop_toplevel_vars_fargs: {
|
drop_toplevel_vars_fargs: {
|
||||||
options = { keep_fargs: false, toplevel: "vars", unused: true };
|
options = {
|
||||||
|
keep_fargs: false,
|
||||||
|
toplevel: "vars",
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
var a, b = 1, c = g;
|
var a, b = 1, c = g;
|
||||||
function f(d) {
|
function f(d) {
|
||||||
return function() {
|
return function() {
|
||||||
c = 2;
|
c = 2;
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
a = 2;
|
a = 2;
|
||||||
function g() {}
|
function g() {}
|
||||||
@@ -421,11 +433,10 @@ drop_toplevel_vars_fargs: {
|
|||||||
console.log(b = 3);
|
console.log(b = 3);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var c = g;
|
|
||||||
function f() {
|
function f() {
|
||||||
return function() {
|
return function() {
|
||||||
c = 2;
|
2;
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
2;
|
2;
|
||||||
function g() {}
|
function g() {}
|
||||||
@@ -435,13 +446,16 @@ drop_toplevel_vars_fargs: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
drop_toplevel_all: {
|
drop_toplevel_all: {
|
||||||
options = { toplevel: true, unused: true };
|
options = {
|
||||||
|
toplevel: true,
|
||||||
|
unused: true
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
var a, b = 1, c = g;
|
var a, b = 1, c = g;
|
||||||
function f(d) {
|
function f(d) {
|
||||||
return function() {
|
return function() {
|
||||||
c = 2;
|
c = 2;
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
a = 2;
|
a = 2;
|
||||||
function g() {}
|
function g() {}
|
||||||
@@ -455,13 +469,16 @@ drop_toplevel_all: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
drop_toplevel_retain: {
|
drop_toplevel_retain: {
|
||||||
options = { top_retain: "f,a,o", unused: true };
|
options = {
|
||||||
|
top_retain: "f,a,o",
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
var a, b = 1, c = g;
|
var a, b = 1, c = g;
|
||||||
function f(d) {
|
function f(d) {
|
||||||
return function() {
|
return function() {
|
||||||
c = 2;
|
c = 2;
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
a = 2;
|
a = 2;
|
||||||
function g() {}
|
function g() {}
|
||||||
@@ -469,26 +486,28 @@ drop_toplevel_retain: {
|
|||||||
console.log(b = 3);
|
console.log(b = 3);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var a, c = g;
|
var a;
|
||||||
function f(d) {
|
function f(d) {
|
||||||
return function() {
|
return function() {
|
||||||
c = 2;
|
2;
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
a = 2;
|
a = 2;
|
||||||
function g() {}
|
|
||||||
console.log(3);
|
console.log(3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
drop_toplevel_retain_array: {
|
drop_toplevel_retain_array: {
|
||||||
options = { top_retain: [ "f", "a", "o" ], unused: true };
|
options = {
|
||||||
|
top_retain: [ "f", "a", "o" ],
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
var a, b = 1, c = g;
|
var a, b = 1, c = g;
|
||||||
function f(d) {
|
function f(d) {
|
||||||
return function() {
|
return function() {
|
||||||
c = 2;
|
c = 2;
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
a = 2;
|
a = 2;
|
||||||
function g() {}
|
function g() {}
|
||||||
@@ -496,26 +515,28 @@ drop_toplevel_retain_array: {
|
|||||||
console.log(b = 3);
|
console.log(b = 3);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var a, c = g;
|
var a;
|
||||||
function f(d) {
|
function f(d) {
|
||||||
return function() {
|
return function() {
|
||||||
c = 2;
|
2;
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
a = 2;
|
a = 2;
|
||||||
function g() {}
|
|
||||||
console.log(3);
|
console.log(3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
drop_toplevel_retain_regex: {
|
drop_toplevel_retain_regex: {
|
||||||
options = { top_retain: /^[fao]$/, unused: true };
|
options = {
|
||||||
|
top_retain: /^[fao]$/,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
var a, b = 1, c = g;
|
var a, b = 1, c = g;
|
||||||
function f(d) {
|
function f(d) {
|
||||||
return function() {
|
return function() {
|
||||||
c = 2;
|
c = 2;
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
a = 2;
|
a = 2;
|
||||||
function g() {}
|
function g() {}
|
||||||
@@ -523,26 +544,29 @@ drop_toplevel_retain_regex: {
|
|||||||
console.log(b = 3);
|
console.log(b = 3);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var a, c = g;
|
var a;
|
||||||
function f(d) {
|
function f(d) {
|
||||||
return function() {
|
return function() {
|
||||||
c = 2;
|
2;
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
a = 2;
|
a = 2;
|
||||||
function g() {}
|
|
||||||
console.log(3);
|
console.log(3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
drop_toplevel_all_retain: {
|
drop_toplevel_all_retain: {
|
||||||
options = { toplevel: true, top_retain: "f,a,o", unused: true };
|
options = {
|
||||||
|
toplevel: true,
|
||||||
|
top_retain: "f,a,o",
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
var a, b = 1, c = g;
|
var a, b = 1, c = g;
|
||||||
function f(d) {
|
function f(d) {
|
||||||
return function() {
|
return function() {
|
||||||
c = 2;
|
c = 2;
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
a = 2;
|
a = 2;
|
||||||
function g() {}
|
function g() {}
|
||||||
@@ -550,26 +574,29 @@ drop_toplevel_all_retain: {
|
|||||||
console.log(b = 3);
|
console.log(b = 3);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var a, c = g;
|
var a;
|
||||||
function f(d) {
|
function f(d) {
|
||||||
return function() {
|
return function() {
|
||||||
c = 2;
|
2;
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
a = 2;
|
a = 2;
|
||||||
function g() {}
|
|
||||||
console.log(3);
|
console.log(3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
drop_toplevel_funcs_retain: {
|
drop_toplevel_funcs_retain: {
|
||||||
options = { toplevel: "funcs", top_retain: "f,a,o", unused: true };
|
options = {
|
||||||
|
toplevel: "funcs",
|
||||||
|
top_retain: "f,a,o",
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
var a, b = 1, c = g;
|
var a, b = 1, c = g;
|
||||||
function f(d) {
|
function f(d) {
|
||||||
return function() {
|
return function() {
|
||||||
c = 2;
|
c = 2;
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
a = 2;
|
a = 2;
|
||||||
function g() {}
|
function g() {}
|
||||||
@@ -581,7 +608,7 @@ drop_toplevel_funcs_retain: {
|
|||||||
function f(d) {
|
function f(d) {
|
||||||
return function() {
|
return function() {
|
||||||
c = 2;
|
c = 2;
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
a = 2;
|
a = 2;
|
||||||
function g() {}
|
function g() {}
|
||||||
@@ -590,13 +617,17 @@ drop_toplevel_funcs_retain: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
drop_toplevel_vars_retain: {
|
drop_toplevel_vars_retain: {
|
||||||
options = { toplevel: "vars", top_retain: "f,a,o", unused: true };
|
options = {
|
||||||
|
toplevel: "vars",
|
||||||
|
top_retain: "f,a,o",
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
var a, b = 1, c = g;
|
var a, b = 1, c = g;
|
||||||
function f(d) {
|
function f(d) {
|
||||||
return function() {
|
return function() {
|
||||||
c = 2;
|
c = 2;
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
a = 2;
|
a = 2;
|
||||||
function g() {}
|
function g() {}
|
||||||
@@ -604,11 +635,11 @@ drop_toplevel_vars_retain: {
|
|||||||
console.log(b = 3);
|
console.log(b = 3);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var a, c = g;
|
var a;
|
||||||
function f(d) {
|
function f(d) {
|
||||||
return function() {
|
return function() {
|
||||||
c = 2;
|
2;
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
a = 2;
|
a = 2;
|
||||||
function g() {}
|
function g() {}
|
||||||
@@ -618,13 +649,16 @@ drop_toplevel_vars_retain: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
drop_toplevel_keep_assign: {
|
drop_toplevel_keep_assign: {
|
||||||
options = { toplevel: true, unused: "keep_assign" };
|
options = {
|
||||||
|
toplevel: true,
|
||||||
|
unused: "keep_assign",
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
var a, b = 1, c = g;
|
var a, b = 1, c = g;
|
||||||
function f(d) {
|
function f(d) {
|
||||||
return function() {
|
return function() {
|
||||||
c = 2;
|
c = 2;
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
a = 2;
|
a = 2;
|
||||||
function g() {}
|
function g() {}
|
||||||
@@ -733,6 +767,7 @@ drop_value: {
|
|||||||
const_assign: {
|
const_assign: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -785,6 +820,7 @@ issue_1539: {
|
|||||||
vardef_value: {
|
vardef_value: {
|
||||||
options = {
|
options = {
|
||||||
keep_fnames: false,
|
keep_fnames: false,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -846,6 +882,7 @@ assign_chain: {
|
|||||||
issue_1583: {
|
issue_1583: {
|
||||||
options = {
|
options = {
|
||||||
keep_fargs: true,
|
keep_fargs: true,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -863,11 +900,11 @@ issue_1583: {
|
|||||||
expect: {
|
expect: {
|
||||||
function m(t) {
|
function m(t) {
|
||||||
(function(e) {
|
(function(e) {
|
||||||
t = function() {
|
(function() {
|
||||||
return (function(a) {
|
return (function(a) {
|
||||||
return function(a) {};
|
return function(a) {};
|
||||||
})();
|
})();
|
||||||
}();
|
})();
|
||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1200,6 +1237,7 @@ var_catch_toplevel: {
|
|||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
@@ -1291,15 +1329,15 @@ issue_2063: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var a;
|
var a;
|
||||||
var a;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_2105: {
|
issue_2105_1: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
passes: 3,
|
passes: 3,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -1325,17 +1363,51 @@ issue_2105: {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
(function() {
|
({
|
||||||
var quux = function() {
|
prop: function() {
|
||||||
|
console.log;
|
||||||
console.log("PASS");
|
console.log("PASS");
|
||||||
};
|
}
|
||||||
return {
|
}).prop();
|
||||||
prop: function() {
|
}
|
||||||
console.log;
|
expect_stdout: "PASS"
|
||||||
quux();
|
}
|
||||||
|
|
||||||
|
issue_2105_2: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 3,
|
||||||
|
properties: true,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
!function(factory) {
|
||||||
|
factory();
|
||||||
|
}( function() {
|
||||||
|
return function(fn) {
|
||||||
|
fn()().prop();
|
||||||
|
}( function() {
|
||||||
|
function bar() {
|
||||||
|
var quux = function() {
|
||||||
|
console.log("PASS");
|
||||||
|
}, foo = function() {
|
||||||
|
console.log;
|
||||||
|
quux();
|
||||||
|
};
|
||||||
|
return { prop: foo };
|
||||||
}
|
}
|
||||||
};
|
return bar;
|
||||||
})().prop();
|
} );
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("PASS");
|
||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
@@ -1390,6 +1462,7 @@ issue_2136_3: {
|
|||||||
evaluate: true,
|
evaluate: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
passes: 3,
|
passes: 3,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
@@ -1530,8 +1603,186 @@ issue_2288: {
|
|||||||
expect: {
|
expect: {
|
||||||
function foo(o) {
|
function foo(o) {
|
||||||
o.a;
|
o.a;
|
||||||
for (i = 0; i < 0; i++);
|
|
||||||
for (var i = 0; i < 0; i++);
|
for (var i = 0; i < 0; i++);
|
||||||
|
for (i = 0; i < 0; i++);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_2516_1: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function foo() {
|
||||||
|
function qux(x) {
|
||||||
|
bar.call(null, x);
|
||||||
|
}
|
||||||
|
function bar(x) {
|
||||||
|
var FOUR = 4;
|
||||||
|
var trouble = x || never_called();
|
||||||
|
var value = (FOUR - 1) * trouble;
|
||||||
|
console.log(value == 6 ? "PASS" : value);
|
||||||
|
}
|
||||||
|
Baz = qux;
|
||||||
|
}
|
||||||
|
var Baz;
|
||||||
|
foo();
|
||||||
|
Baz(2);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function foo() {
|
||||||
|
Baz = function(x) {
|
||||||
|
(function(x) {
|
||||||
|
var trouble = x || never_called();
|
||||||
|
var value = (4 - 1) * trouble;
|
||||||
|
console.log(6 == value ? "PASS" : value);
|
||||||
|
}).call(null, x);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
var Baz;
|
||||||
|
foo();
|
||||||
|
Baz(2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2516_2: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
passes: 2,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function foo() {
|
||||||
|
function qux(x) {
|
||||||
|
bar.call(null, x);
|
||||||
|
}
|
||||||
|
function bar(x) {
|
||||||
|
var FOUR = 4;
|
||||||
|
var trouble = x || never_called();
|
||||||
|
var value = (FOUR - 1) * trouble;
|
||||||
|
console.log(value == 6 ? "PASS" : value);
|
||||||
|
}
|
||||||
|
Baz = qux;
|
||||||
|
}
|
||||||
|
var Baz;
|
||||||
|
foo();
|
||||||
|
Baz(2);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function foo() {
|
||||||
|
Baz = function(x) {
|
||||||
|
(function(x) {
|
||||||
|
var value = (4 - 1) * (x || never_called());
|
||||||
|
console.log(6 == value ? "PASS" : value);
|
||||||
|
}).call(null, x);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
var Baz;
|
||||||
|
foo();
|
||||||
|
Baz(2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2418_1: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
class C {}
|
||||||
|
function F() {}
|
||||||
|
(class c {});
|
||||||
|
(function f() {});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
class C {}
|
||||||
|
function F() {}
|
||||||
|
(class {});
|
||||||
|
(function() {});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2418_2: {
|
||||||
|
options = {
|
||||||
|
keep_classnames: false,
|
||||||
|
keep_fnames: false,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
class C {}
|
||||||
|
function F() {}
|
||||||
|
(class c {});
|
||||||
|
(function f() {});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
class C {}
|
||||||
|
function F() {}
|
||||||
|
(class {});
|
||||||
|
(function() {});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2418_3: {
|
||||||
|
options = {
|
||||||
|
keep_classnames: false,
|
||||||
|
keep_fnames: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
class C {}
|
||||||
|
function F() {}
|
||||||
|
(class c {});
|
||||||
|
(function f() {});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
class C {}
|
||||||
|
function F() {}
|
||||||
|
(class {});
|
||||||
|
(function f() {});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2418_4: {
|
||||||
|
options = {
|
||||||
|
keep_classnames: true,
|
||||||
|
keep_fnames: false,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
class C {}
|
||||||
|
function F() {}
|
||||||
|
(class c {});
|
||||||
|
(function f() {});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
class C {}
|
||||||
|
function F() {}
|
||||||
|
(class c {});
|
||||||
|
(function() {});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2418_5: {
|
||||||
|
options = {
|
||||||
|
keep_classnames: true,
|
||||||
|
keep_fnames: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
class C {}
|
||||||
|
function F() {}
|
||||||
|
(class c {});
|
||||||
|
(function f() {});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
class C {}
|
||||||
|
function F() {}
|
||||||
|
(class c {});
|
||||||
|
(function f() {});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
and: {
|
and: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var a;
|
var a;
|
||||||
@@ -76,7 +77,8 @@ and: {
|
|||||||
|
|
||||||
or: {
|
or: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var a;
|
var a;
|
||||||
@@ -158,7 +160,8 @@ or: {
|
|||||||
|
|
||||||
unary_prefix: {
|
unary_prefix: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
a = !0 && b;
|
a = !0 && b;
|
||||||
@@ -345,6 +348,7 @@ unsafe_constant: {
|
|||||||
unsafe_object: {
|
unsafe_object: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
unsafe: true,
|
unsafe: true,
|
||||||
@@ -373,6 +377,7 @@ unsafe_object: {
|
|||||||
unsafe_object_nested: {
|
unsafe_object_nested: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
unsafe: true,
|
unsafe: true,
|
||||||
@@ -401,6 +406,7 @@ unsafe_object_nested: {
|
|||||||
unsafe_object_complex: {
|
unsafe_object_complex: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
unsafe: true,
|
unsafe: true,
|
||||||
@@ -429,6 +435,7 @@ unsafe_object_complex: {
|
|||||||
unsafe_object_repeated: {
|
unsafe_object_repeated: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
unsafe: true,
|
unsafe: true,
|
||||||
@@ -457,6 +464,7 @@ unsafe_object_repeated: {
|
|||||||
unsafe_object_accessor: {
|
unsafe_object_accessor: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unsafe: true,
|
unsafe: true,
|
||||||
}
|
}
|
||||||
@@ -480,10 +488,11 @@ unsafe_object_accessor: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe_function: {
|
prop_function: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
unsafe : true
|
properties: true,
|
||||||
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
console.log(
|
||||||
@@ -496,9 +505,9 @@ unsafe_function: {
|
|||||||
expect: {
|
expect: {
|
||||||
console.log(
|
console.log(
|
||||||
({a:{b:1},b:function(){}}) + 1,
|
({a:{b:1},b:function(){}}) + 1,
|
||||||
({b:function(){}}, {b:1}) + 1,
|
({b:1}) + 1,
|
||||||
({a:{b:1}}, function(){}) + 1,
|
function(){} + 1,
|
||||||
({b:function(){}}, {b:1}).b + 1
|
2
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
@@ -724,10 +733,11 @@ unsafe_string_bad_index: {
|
|||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe_prototype_function: {
|
prototype_function: {
|
||||||
options = {
|
options = {
|
||||||
evaluate : true,
|
evaluate: true,
|
||||||
unsafe : true
|
properties: true,
|
||||||
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var a = ({valueOf: 0}) < 1;
|
var a = ({valueOf: 0}) < 1;
|
||||||
@@ -746,8 +756,8 @@ unsafe_prototype_function: {
|
|||||||
var d = ({toString: 0}) + "";
|
var d = ({toString: 0}) + "";
|
||||||
var e = (({valueOf: 0}) + "")[2];
|
var e = (({valueOf: 0}) + "")[2];
|
||||||
var f = (({toString: 0}) + "")[2];
|
var f = (({toString: 0}) + "")[2];
|
||||||
var g = ({}, 0)();
|
var g = 0();
|
||||||
var h = ({}, 0)();
|
var h = 0();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -755,6 +765,7 @@ call_args: {
|
|||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -777,6 +788,7 @@ call_args_drop_param: {
|
|||||||
evaluate: true,
|
evaluate: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
keep_fargs: false,
|
keep_fargs: false,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -1107,6 +1119,7 @@ Infinity_NaN_undefined_LHS: {
|
|||||||
issue_1964_1: {
|
issue_1964_1: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unsafe_regexp: false,
|
unsafe_regexp: false,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -1136,6 +1149,7 @@ issue_1964_1: {
|
|||||||
issue_1964_2: {
|
issue_1964_2: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unsafe_regexp: true,
|
unsafe_regexp: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -1288,3 +1302,134 @@ issue_2231_2: {
|
|||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self_comparison_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = { n: NaN };
|
||||||
|
console.log(o.n == o.n, o.n === o.n, o.n != o.n, o.n !== o.n, typeof o.n);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(false, false, true, true, "number");
|
||||||
|
}
|
||||||
|
expect_stdout: "false false true true 'number'"
|
||||||
|
}
|
||||||
|
|
||||||
|
self_comparison_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
hoist_props: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = { n: NaN };
|
||||||
|
console.log(o.n == o.n, o.n === o.n, o.n != o.n, o.n !== o.n, typeof o.n);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(false, false, true, true, "number");
|
||||||
|
}
|
||||||
|
expect_stdout: "false false true true 'number'"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2535_1: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
if ((x() || true) || y()) z();
|
||||||
|
if ((x() || true) && y()) z();
|
||||||
|
if ((x() && true) || y()) z();
|
||||||
|
if ((x() && true) && y()) z();
|
||||||
|
if ((x() || false) || y()) z();
|
||||||
|
if ((x() || false) && y()) z();
|
||||||
|
if ((x() && false) || y()) z();
|
||||||
|
if ((x() && false) && y()) z();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
if (x(), 1) z();
|
||||||
|
if (x(), y()) z();
|
||||||
|
if (x() || y()) z();
|
||||||
|
if (x() && y()) z();
|
||||||
|
if (x() || y()) z();
|
||||||
|
if (x() && y()) z();
|
||||||
|
if (x(), y()) z();
|
||||||
|
if (x(), 0) z();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2535_2: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(x() || true) || y();
|
||||||
|
(x() || true) && y();
|
||||||
|
(x() && true) || y();
|
||||||
|
(x() && true) && y();
|
||||||
|
(x() || false) || y();
|
||||||
|
(x() || false) && y();
|
||||||
|
(x() && false) || y();
|
||||||
|
(x() && false) && y();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
x(),
|
||||||
|
x(), y(),
|
||||||
|
x() || y(),
|
||||||
|
x() && y(),
|
||||||
|
x() || y(),
|
||||||
|
x() && y(),
|
||||||
|
x(), y(),
|
||||||
|
x();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2535_3: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(Object(1) && 1 && 2);
|
||||||
|
console.log(Object(1) && true && 1 && 2 && Object(2));
|
||||||
|
console.log(Object(1) && true && 1 && null && 2 && Object(2));
|
||||||
|
console.log(2 == Object(1) || 0 || void 0 || null);
|
||||||
|
console.log(2 == Object(1) || 0 || void 0 || null || Object(2));
|
||||||
|
console.log(2 == Object(1) || 0 || void 0 || "ok" || null || Object(2));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(Object(1) && 2);
|
||||||
|
console.log(Object(1) && Object(2));
|
||||||
|
console.log(Object(1) && null);
|
||||||
|
console.log(2 == Object(1) || null);
|
||||||
|
console.log(2 == Object(1) || Object(2));
|
||||||
|
console.log(2 == Object(1) || "ok");
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
expect_warnings: [
|
||||||
|
"WARN: Dropping side-effect-free && [test/compress/evaluate.js:1409,20]",
|
||||||
|
"WARN: Dropping side-effect-free && [test/compress/evaluate.js:1410,20]",
|
||||||
|
"WARN: Dropping side-effect-free && [test/compress/evaluate.js:1411,20]",
|
||||||
|
"WARN: Condition left of && always false [test/compress/evaluate.js:1411,20]",
|
||||||
|
"WARN: Dropping side-effect-free || [test/compress/evaluate.js:1412,20]",
|
||||||
|
"WARN: Dropping side-effect-free || [test/compress/evaluate.js:1413,20]",
|
||||||
|
"WARN: Dropping side-effect-free || [test/compress/evaluate.js:1414,20]",
|
||||||
|
"WARN: Condition left of || always true [test/compress/evaluate.js:1414,20]",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|||||||
@@ -36,19 +36,19 @@ avoid_spread_in_ternary: {
|
|||||||
function print(...x) {
|
function print(...x) {
|
||||||
console.log(...x);
|
console.log(...x);
|
||||||
}
|
}
|
||||||
var a = [1, 2], b = [3, 4];
|
var a = [1, 2], b = [3, 4], m = Math;
|
||||||
|
|
||||||
if (Math)
|
if (m)
|
||||||
print(a);
|
print(a);
|
||||||
else
|
else
|
||||||
print(b);
|
print(b);
|
||||||
|
|
||||||
if (Math)
|
if (m)
|
||||||
print(...a);
|
print(...a);
|
||||||
else
|
else
|
||||||
print(b);
|
print(b);
|
||||||
|
|
||||||
if (Math.no_such_property)
|
if (m.no_such_property)
|
||||||
print(a);
|
print(a);
|
||||||
else
|
else
|
||||||
print(...b);
|
print(...b);
|
||||||
@@ -57,10 +57,10 @@ avoid_spread_in_ternary: {
|
|||||||
function print(...x) {
|
function print(...x) {
|
||||||
console.log(...x);
|
console.log(...x);
|
||||||
}
|
}
|
||||||
var a = [ 1, 2 ], b = [ 3, 4 ];
|
var a = [ 1, 2 ], b = [ 3, 4 ], m = Math;
|
||||||
print(Math ? a : b);
|
print(m ? a : b);
|
||||||
Math ? print(...a) : print(b);
|
m ? print(...a) : print(b);
|
||||||
Math.no_such_property ? print(a) : print(...b);
|
m.no_such_property ? print(a) : print(...b);
|
||||||
}
|
}
|
||||||
expect_stdout: [
|
expect_stdout: [
|
||||||
"[ 1, 2 ]",
|
"[ 1, 2 ]",
|
||||||
|
|||||||
@@ -124,6 +124,7 @@ async_func: {
|
|||||||
issue_2134_1: {
|
issue_2134_1: {
|
||||||
options = {
|
options = {
|
||||||
keep_fargs: false,
|
keep_fargs: false,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -141,6 +142,7 @@ issue_2134_1: {
|
|||||||
issue_2134_2: {
|
issue_2134_2: {
|
||||||
options = {
|
options = {
|
||||||
keep_fargs: false,
|
keep_fargs: false,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -250,3 +252,13 @@ dynamic_import: {
|
|||||||
r.foo();
|
r.foo();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
trailing_comma: {
|
||||||
|
beautify = {
|
||||||
|
beautify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export const a = 1;
|
||||||
|
}
|
||||||
|
expect_exact: "export const a = 1;"
|
||||||
|
}
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ iifes_returning_constants_keep_fargs_true: {
|
|||||||
booleans : true,
|
booleans : true,
|
||||||
if_return : true,
|
if_return : true,
|
||||||
join_vars : true,
|
join_vars : true,
|
||||||
|
reduce_funcs : true,
|
||||||
reduce_vars : true,
|
reduce_vars : true,
|
||||||
cascade : true,
|
cascade : true,
|
||||||
inline : true,
|
inline : true,
|
||||||
@@ -55,6 +56,7 @@ iifes_returning_constants_keep_fargs_false: {
|
|||||||
booleans : true,
|
booleans : true,
|
||||||
if_return : true,
|
if_return : true,
|
||||||
join_vars : true,
|
join_vars : true,
|
||||||
|
reduce_funcs : true,
|
||||||
reduce_vars : true,
|
reduce_vars : true,
|
||||||
cascade : true,
|
cascade : true,
|
||||||
inline : true,
|
inline : true,
|
||||||
@@ -85,6 +87,7 @@ issue_485_crashing_1530: {
|
|||||||
dead_code: true,
|
dead_code: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
(function(a) {
|
(function(a) {
|
||||||
@@ -92,15 +95,14 @@ issue_485_crashing_1530: {
|
|||||||
var b = 42;
|
var b = 42;
|
||||||
})(this);
|
})(this);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {}
|
||||||
this, void 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_1841_1: {
|
issue_1841_1: {
|
||||||
options = {
|
options = {
|
||||||
keep_fargs: false,
|
keep_fargs: false,
|
||||||
pure_getters: "strict",
|
pure_getters: "strict",
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -127,6 +129,7 @@ issue_1841_2: {
|
|||||||
options = {
|
options = {
|
||||||
keep_fargs: false,
|
keep_fargs: false,
|
||||||
pure_getters: false,
|
pure_getters: false,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -151,13 +154,14 @@ issue_1841_2: {
|
|||||||
|
|
||||||
function_returning_constant_literal: {
|
function_returning_constant_literal: {
|
||||||
options = {
|
options = {
|
||||||
reduce_vars: true,
|
|
||||||
unsafe: true,
|
|
||||||
toplevel: true,
|
|
||||||
evaluate: true,
|
|
||||||
cascade: true,
|
|
||||||
unused: true,
|
|
||||||
inline: true,
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
properties: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function greeter() {
|
function greeter() {
|
||||||
@@ -305,6 +309,7 @@ issue_2084: {
|
|||||||
evaluate: true,
|
evaluate: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
passes: 2,
|
passes: 2,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
@@ -340,6 +345,7 @@ issue_2084: {
|
|||||||
issue_2097: {
|
issue_2097: {
|
||||||
options = {
|
options = {
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -508,3 +514,161 @@ issue_2114_2: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "2"
|
expect_stdout: "2"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_2428: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 3,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function bar(k) {
|
||||||
|
console.log(k);
|
||||||
|
}
|
||||||
|
function foo(x) {
|
||||||
|
return bar(x);
|
||||||
|
}
|
||||||
|
function baz(a) {
|
||||||
|
foo(a);
|
||||||
|
}
|
||||||
|
baz(42);
|
||||||
|
baz("PASS");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function baz(a) {
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
baz(42);
|
||||||
|
baz("PASS");
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"42",
|
||||||
|
"PASS",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2531_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function outer() {
|
||||||
|
function inner(value) {
|
||||||
|
function closure() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
return function() {
|
||||||
|
return closure();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return inner("Hello");
|
||||||
|
}
|
||||||
|
console.log("Greeting:", outer()());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function outer() {
|
||||||
|
return function(value) {
|
||||||
|
return function() {
|
||||||
|
return value;
|
||||||
|
};
|
||||||
|
}("Hello");
|
||||||
|
}
|
||||||
|
console.log("Greeting:", outer()());
|
||||||
|
}
|
||||||
|
expect_stdout: "Greeting: Hello"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2531_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function outer() {
|
||||||
|
function inner(value) {
|
||||||
|
function closure() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
return function() {
|
||||||
|
return closure();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return inner("Hello");
|
||||||
|
}
|
||||||
|
console.log("Greeting:", outer()());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function outer() {
|
||||||
|
return function() {
|
||||||
|
return "Hello";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
console.log("Greeting:", outer()());
|
||||||
|
}
|
||||||
|
expect_stdout: "Greeting: Hello"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2531_3: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function outer() {
|
||||||
|
function inner(value) {
|
||||||
|
function closure() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
return function() {
|
||||||
|
return closure();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return inner("Hello");
|
||||||
|
}
|
||||||
|
console.log("Greeting:", outer()());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("Greeting:", "Hello");
|
||||||
|
}
|
||||||
|
expect_stdout: "Greeting: Hello"
|
||||||
|
}
|
||||||
|
|
||||||
|
empty_body: {
|
||||||
|
options = {
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
function noop() {}
|
||||||
|
noop();
|
||||||
|
return noop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
function noop() {}
|
||||||
|
return noop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -184,6 +184,7 @@ issue_2167: {
|
|||||||
global_defs: {
|
global_defs: {
|
||||||
"@isDevMode": "function(){}",
|
"@isDevMode": "function(){}",
|
||||||
},
|
},
|
||||||
|
passes: 2,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
|
|||||||
@@ -13,7 +13,8 @@ arrow_function_parens_2: {
|
|||||||
|
|
||||||
typeof_arrow_functions: {
|
typeof_arrow_functions: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true
|
evaluate: true,
|
||||||
|
typeofs: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
var foo = typeof (x => null);
|
var foo = typeof (x => null);
|
||||||
@@ -736,6 +737,7 @@ object_spread_unsafe: {
|
|||||||
evaluate: true,
|
evaluate: true,
|
||||||
join_vars: true,
|
join_vars: true,
|
||||||
passes: 3,
|
passes: 3,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
@@ -902,10 +904,11 @@ issue_2349b: {
|
|||||||
evaluate: true,
|
evaluate: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
passes: 3,
|
passes: 3,
|
||||||
|
properties: true,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
unsafe: true,
|
|
||||||
unsafe_arrows: true,
|
unsafe_arrows: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -935,3 +938,218 @@ issue_2349b: {
|
|||||||
]
|
]
|
||||||
node_version: ">=7"
|
node_version: ">=7"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
shorthand_keywords: {
|
||||||
|
beautify = {
|
||||||
|
ecma: 6,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var foo = 0,
|
||||||
|
async = 1,
|
||||||
|
await = 2,
|
||||||
|
implements = 3,
|
||||||
|
package = 4,
|
||||||
|
private = 5,
|
||||||
|
protected = 6,
|
||||||
|
static = 7,
|
||||||
|
yield = 8;
|
||||||
|
console.log({
|
||||||
|
foo: foo,
|
||||||
|
0: 0,
|
||||||
|
NaN: NaN,
|
||||||
|
async: async,
|
||||||
|
await: await,
|
||||||
|
false: false,
|
||||||
|
implements: implements,
|
||||||
|
null: null,
|
||||||
|
package: package,
|
||||||
|
private: private,
|
||||||
|
protected: protected,
|
||||||
|
static: static,
|
||||||
|
this: this,
|
||||||
|
true: true,
|
||||||
|
undefined: undefined,
|
||||||
|
yield: yield,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect_exact: "var foo=0,async=1,await=2,implements=3,package=4,private=5,protected=6,static=7,yield=8;console.log({foo,0:0,NaN:NaN,async,await,false:false,implements:implements,null:null,package:package,private:private,protected:protected,static:static,this:this,true:true,undefined:void 0,yield});"
|
||||||
|
expect_stdout: true
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
array_literal_with_spread_1: {
|
||||||
|
options = {
|
||||||
|
properties: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var f = (x) => [...x][0];
|
||||||
|
console.log(f(["PASS"]));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var f = x => [ ...x ][0];
|
||||||
|
console.log(f([ "PASS" ]));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
array_literal_with_spread_2: {
|
||||||
|
options = {
|
||||||
|
properties: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log([10, ...[], 20, ...[30, 40], 50]["length"]);
|
||||||
|
console.log([10, ...[], 20, ...[30, 40], 50][0]);
|
||||||
|
console.log([10, ...[], 20, ...[30, 40], 50][1]);
|
||||||
|
console.log([10, ...[], 20, ...[30, 40], 50][2]);
|
||||||
|
console.log([10, ...[], 20, ...[30, 40], 50][3]);
|
||||||
|
console.log([10, ...[], 20, ...[30, 40], 50][4]);
|
||||||
|
console.log([10, ...[], 20, ...[30, 40], 50][5]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log([ 10, ...[], 20, ...[ 30, 40 ], 50 ]["length"]);
|
||||||
|
console.log(10);
|
||||||
|
console.log([ 10, ...[], 20, ...[ 30, 40 ], 50 ][1]);
|
||||||
|
console.log([ 10, ...[], 20, ...[ 30, 40 ], 50 ][2]);
|
||||||
|
console.log([ 10, ...[], 20, ...[ 30, 40 ], 50 ][3]);
|
||||||
|
console.log([ 10, ...[], 20, ...[ 30, 40 ], 50 ][4]);
|
||||||
|
console.log([ 10, ...[], 20, ...[ 30, 40 ], 50 ][5]);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"5",
|
||||||
|
"10",
|
||||||
|
"20",
|
||||||
|
"30",
|
||||||
|
"40",
|
||||||
|
"50",
|
||||||
|
"undefined",
|
||||||
|
]
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
array_literal_with_spread_3: {
|
||||||
|
options = {
|
||||||
|
properties: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log([10, 20][0]);
|
||||||
|
console.log([10, 20][1]);
|
||||||
|
console.log([10, 20][2]);
|
||||||
|
|
||||||
|
console.log([...[], 10, 20][0]);
|
||||||
|
console.log([...[], 10, 20][1]);
|
||||||
|
console.log([...[], 10, 20][2]);
|
||||||
|
|
||||||
|
console.log([10, ...[], 20][0]);
|
||||||
|
console.log([10, ...[], 20][1]);
|
||||||
|
console.log([10, ...[], 20][2]);
|
||||||
|
|
||||||
|
console.log([10, 20, ...[]][0]);
|
||||||
|
console.log([10, 20, ...[]][1]);
|
||||||
|
console.log([10, 20, ...[]][2]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(10);
|
||||||
|
console.log(20);
|
||||||
|
console.log([ 10, 20 ][2]);
|
||||||
|
|
||||||
|
console.log([...[], 10, 20][0]);
|
||||||
|
console.log([...[], 10, 20][1]);
|
||||||
|
console.log([...[], 10, 20][2]);
|
||||||
|
|
||||||
|
console.log(10);
|
||||||
|
console.log([10, ...[], 20][1]);
|
||||||
|
console.log([10, ...[], 20][2]);
|
||||||
|
|
||||||
|
console.log(10);
|
||||||
|
console.log(20);
|
||||||
|
console.log([10, 20, ...[]][2]);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"10",
|
||||||
|
"20",
|
||||||
|
"undefined",
|
||||||
|
"10",
|
||||||
|
"20",
|
||||||
|
"undefined",
|
||||||
|
"10",
|
||||||
|
"20",
|
||||||
|
"undefined",
|
||||||
|
"10",
|
||||||
|
"20",
|
||||||
|
"undefined",
|
||||||
|
]
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
array_literal_with_spread_4: {
|
||||||
|
options = {
|
||||||
|
properties: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function t(x) {
|
||||||
|
console.log("(" + x + ")");
|
||||||
|
return 10 * x;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log([t(1), t(2)][0]);
|
||||||
|
console.log([t(1), t(2)][1]);
|
||||||
|
console.log([t(1), t(2)][2]);
|
||||||
|
|
||||||
|
console.log([...[], t(1), t(2)][0]);
|
||||||
|
console.log([...[], t(1), t(2)][1]);
|
||||||
|
console.log([...[], t(1), t(2)][2]);
|
||||||
|
|
||||||
|
console.log([t(1), ...[], t(2)][0]);
|
||||||
|
console.log([t(1), ...[], t(2)][1]);
|
||||||
|
console.log([t(1), ...[], t(2)][2]);
|
||||||
|
|
||||||
|
console.log([t(1), t(2), ...[]][0]);
|
||||||
|
console.log([t(1), t(2), ...[]][1]);
|
||||||
|
console.log([t(1), t(2), ...[]][2]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function t(x) {
|
||||||
|
console.log("(" + x + ")");
|
||||||
|
return 10 * x;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log([ t(1), t(2) ][0]);
|
||||||
|
console.log((t(1), t(2)));
|
||||||
|
console.log([ t(1), t(2) ][2]);
|
||||||
|
|
||||||
|
console.log([ ...[], t(1), t(2) ][0]);
|
||||||
|
console.log([ ...[], t(1), t(2) ][1]);
|
||||||
|
console.log([ ...[], t(1), t(2) ][2]);
|
||||||
|
|
||||||
|
console.log([ t(1), t(2) ][0]);
|
||||||
|
console.log([ t(1), ...[], t(2) ][1]);
|
||||||
|
console.log([ t(1), ...[], t(2) ][2]);
|
||||||
|
|
||||||
|
console.log([ t(1), t(2) ][0]);
|
||||||
|
console.log((t(1), t(2)));
|
||||||
|
console.log([ t(1), t(2), ...[] ][2]);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"(1)", "(2)", "10",
|
||||||
|
"(1)", "(2)", "20",
|
||||||
|
"(1)", "(2)", "undefined",
|
||||||
|
|
||||||
|
"(1)", "(2)", "10",
|
||||||
|
"(1)", "(2)", "20",
|
||||||
|
"(1)", "(2)", "undefined",
|
||||||
|
|
||||||
|
"(1)", "(2)", "10",
|
||||||
|
"(1)", "(2)", "20",
|
||||||
|
"(1)", "(2)", "undefined",
|
||||||
|
|
||||||
|
"(1)", "(2)", "10",
|
||||||
|
"(1)", "(2)", "20",
|
||||||
|
"(1)", "(2)", "undefined",
|
||||||
|
]
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|||||||
825
test/compress/hoist_props.js
Normal file
825
test/compress/hoist_props.js
Normal file
@@ -0,0 +1,825 @@
|
|||||||
|
issue_2377_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var obj = {
|
||||||
|
foo: 1,
|
||||||
|
bar: 2,
|
||||||
|
square: function(x) {
|
||||||
|
return x * x;
|
||||||
|
},
|
||||||
|
cube: function(x) {
|
||||||
|
return x * x * x;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
console.log(obj.foo, obj.cube(3));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var obj_foo = 1, obj_cube = function(x) {
|
||||||
|
return x * x * x;
|
||||||
|
};
|
||||||
|
console.log(obj_foo, obj_cube(3));
|
||||||
|
}
|
||||||
|
expect_stdout: "1 27"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2377_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
hoist_props: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var obj = {
|
||||||
|
foo: 1,
|
||||||
|
bar: 2,
|
||||||
|
square: function(x) {
|
||||||
|
return x * x;
|
||||||
|
},
|
||||||
|
cube: function(x) {
|
||||||
|
return x * x * x;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
console.log(obj.foo, obj.cube(3));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(1, function(x) {
|
||||||
|
return x * x * x;
|
||||||
|
}(3));
|
||||||
|
}
|
||||||
|
expect_stdout: "1 27"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2377_3: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
hoist_props: true,
|
||||||
|
passes: 3,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var obj = {
|
||||||
|
foo: 1,
|
||||||
|
bar: 2,
|
||||||
|
square: function(x) {
|
||||||
|
return x * x;
|
||||||
|
},
|
||||||
|
cube: function(x) {
|
||||||
|
return x * x * x;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
console.log(obj.foo, obj.cube(3));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(1, 27);
|
||||||
|
}
|
||||||
|
expect_stdout: "1 27"
|
||||||
|
}
|
||||||
|
|
||||||
|
direct_access_1: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 0;
|
||||||
|
var obj = {
|
||||||
|
a: 1,
|
||||||
|
b: 2,
|
||||||
|
};
|
||||||
|
for (var k in obj) a++;
|
||||||
|
console.log(a, obj.a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 0;
|
||||||
|
var obj = {
|
||||||
|
a: 1,
|
||||||
|
b: 2,
|
||||||
|
};
|
||||||
|
for (var k in obj) a++;
|
||||||
|
console.log(a, obj.a);
|
||||||
|
}
|
||||||
|
expect_stdout: "2 1"
|
||||||
|
}
|
||||||
|
|
||||||
|
direct_access_2: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = { a: 1 };
|
||||||
|
var f = function(k) {
|
||||||
|
if (o[k]) return "PASS";
|
||||||
|
};
|
||||||
|
console.log(f("a"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = { a: 1 };
|
||||||
|
console.log(function(k) {
|
||||||
|
if (o[k]) return "PASS";
|
||||||
|
}("a"));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
direct_access_3: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = { a: 1 };
|
||||||
|
o.b;
|
||||||
|
console.log(o.a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = { a: 1 };
|
||||||
|
o.b;
|
||||||
|
console.log(o.a);
|
||||||
|
}
|
||||||
|
expect_stdout: "1"
|
||||||
|
}
|
||||||
|
|
||||||
|
single_use: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var obj = {
|
||||||
|
bar: function() {
|
||||||
|
return 42;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
console.log(obj.bar());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log({
|
||||||
|
bar: function() {
|
||||||
|
return 42;
|
||||||
|
},
|
||||||
|
}.bar());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
name_collision_1: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var obj_foo = 1;
|
||||||
|
var obj_bar = 2;
|
||||||
|
function f() {
|
||||||
|
var obj = {
|
||||||
|
foo: 3,
|
||||||
|
bar: 4,
|
||||||
|
"b-r": 5,
|
||||||
|
"b+r": 6,
|
||||||
|
"b!r": 7,
|
||||||
|
};
|
||||||
|
console.log(obj_foo, obj.foo, obj.bar, obj["b-r"], obj["b+r"], obj["b!r"]);
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var obj_foo = 1;
|
||||||
|
var obj_bar = 2;
|
||||||
|
function f() {
|
||||||
|
var obj_foo$0 = 3,
|
||||||
|
obj_bar = 4,
|
||||||
|
obj_b_r = 5,
|
||||||
|
obj_b_r$0 = 6,
|
||||||
|
obj_b_r$1 = 7;
|
||||||
|
console.log(obj_foo, obj_foo$0, obj_bar, obj_b_r, obj_b_r$0, obj_b_r$1);
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect_stdout: "1 3 4 5 6 7"
|
||||||
|
}
|
||||||
|
|
||||||
|
name_collision_2: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
p: 1,
|
||||||
|
0: function(x) {
|
||||||
|
return x;
|
||||||
|
},
|
||||||
|
1: function(x) {
|
||||||
|
return x + 1;
|
||||||
|
}
|
||||||
|
}, o__$0 = 2, o__$1 = 3;
|
||||||
|
console.log(o.p === o.p, o[0](4), o[1](5), o__$0, o__$1);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o_p = 1,
|
||||||
|
o__ = function(x) {
|
||||||
|
return x;
|
||||||
|
},
|
||||||
|
o__$2 = function(x) {
|
||||||
|
return x + 1;
|
||||||
|
},
|
||||||
|
o__$0 = 2,
|
||||||
|
o__$1 = 3;
|
||||||
|
console.log(o_p === o_p, o__(4), o__$2(5), o__$0, o__$1);
|
||||||
|
}
|
||||||
|
expect_stdout: "true 4 6 2 3"
|
||||||
|
}
|
||||||
|
|
||||||
|
name_collision_3: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
p: 1,
|
||||||
|
0: function(x) {
|
||||||
|
return x;
|
||||||
|
},
|
||||||
|
1: function(x) {
|
||||||
|
return x + 1;
|
||||||
|
}
|
||||||
|
}, o__$0 = 2, o__$1 = 3;
|
||||||
|
console.log(o.p === o.p, o[0](4), o[1](5));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o_p = 1,
|
||||||
|
o__ = function(x) {
|
||||||
|
return x;
|
||||||
|
},
|
||||||
|
o__$2 = function(x) {
|
||||||
|
return x + 1;
|
||||||
|
},
|
||||||
|
o__$0 = 2,
|
||||||
|
o__$1 = 3;
|
||||||
|
console.log(o_p === o_p, o__(4), o__$2(5));
|
||||||
|
}
|
||||||
|
expect_stdout: "true 4 6"
|
||||||
|
}
|
||||||
|
|
||||||
|
contains_this_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
hoist_props: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
u: function() {
|
||||||
|
return this === this;
|
||||||
|
},
|
||||||
|
p: 1
|
||||||
|
};
|
||||||
|
console.log(o.p, o.p);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(1, 1);
|
||||||
|
}
|
||||||
|
expect_stdout: "1 1"
|
||||||
|
}
|
||||||
|
|
||||||
|
contains_this_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
hoist_props: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
u: function() {
|
||||||
|
return this === this;
|
||||||
|
},
|
||||||
|
p: 1
|
||||||
|
};
|
||||||
|
console.log(o.p, o.p, o.u);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(1, 1, function() {
|
||||||
|
return this === this;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
contains_this_3: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
hoist_props: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
u: function() {
|
||||||
|
return this === this;
|
||||||
|
},
|
||||||
|
p: 1
|
||||||
|
};
|
||||||
|
console.log(o.p, o.p, o.u());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {
|
||||||
|
u: function() {
|
||||||
|
return this === this;
|
||||||
|
},
|
||||||
|
p: 1
|
||||||
|
};
|
||||||
|
console.log(o.p, o.p, o.u());
|
||||||
|
}
|
||||||
|
expect_stdout: "1 1 true"
|
||||||
|
}
|
||||||
|
|
||||||
|
hoist_class: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_props: true,
|
||||||
|
inline: true,
|
||||||
|
keep_classnames: true,
|
||||||
|
keep_fnames: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function run(c, v) {
|
||||||
|
return new c(v).value;
|
||||||
|
}
|
||||||
|
var o = {
|
||||||
|
p: class Foo {
|
||||||
|
constructor(value) {
|
||||||
|
this.value = value * 10;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
x: 1,
|
||||||
|
y: 2,
|
||||||
|
};
|
||||||
|
console.log(o.p.name, o.p === o.p, run(o.p, o.x), run(o.p, o.y));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function run(c, v) {
|
||||||
|
return new c(v).value;
|
||||||
|
}
|
||||||
|
var o_p = class Foo {
|
||||||
|
constructor(value) {
|
||||||
|
this.value = 10 * value;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
console.log(o_p.name, true, run(o_p, 1), run(o_p, 2));
|
||||||
|
}
|
||||||
|
node_version: ">=6"
|
||||||
|
expect_stdout: "Foo true 10 20"
|
||||||
|
}
|
||||||
|
|
||||||
|
hoist_class_with_new: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_props: true,
|
||||||
|
inline: true,
|
||||||
|
keep_classnames: true,
|
||||||
|
keep_fnames: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
p: class Foo {
|
||||||
|
constructor(value) {
|
||||||
|
this.value = value * 10;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
x: 1,
|
||||||
|
y: 2,
|
||||||
|
};
|
||||||
|
console.log(o.p.name, o.p === o.p, new o.p(o.x).value, new o.p(o.y).value);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o_p = class Foo {
|
||||||
|
constructor(value) {
|
||||||
|
this.value = 10 * value;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
console.log(o_p.name, true, new o_p(1).value, new o_p(2).value);
|
||||||
|
}
|
||||||
|
node_version: ">=6"
|
||||||
|
expect_stdout: "Foo true 10 20"
|
||||||
|
}
|
||||||
|
|
||||||
|
hoist_function_with_call: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_props: true,
|
||||||
|
inline: true,
|
||||||
|
keep_fnames: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
p: function Foo(value) {
|
||||||
|
return 10 * value;
|
||||||
|
},
|
||||||
|
x: 1,
|
||||||
|
y: 2
|
||||||
|
};
|
||||||
|
console.log(o.p.name, o.p === o.p, o.p(o.x), o.p(o.y));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o_p = function Foo(value){
|
||||||
|
return 10 * value
|
||||||
|
};
|
||||||
|
console.log(o_p.name, true, o_p(1), o_p(2));
|
||||||
|
}
|
||||||
|
expect_stdout: "Foo true 10 20"
|
||||||
|
}
|
||||||
|
|
||||||
|
new_this: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
hoist_props: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
a: 1,
|
||||||
|
b: 2,
|
||||||
|
f: function(a) {
|
||||||
|
this.b = a;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
console.log(new o.f(o.a).b, o.b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(new function(a) {
|
||||||
|
this.b = a;
|
||||||
|
}(1).b, 2);
|
||||||
|
}
|
||||||
|
expect_stdout: "1 2"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2462: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
export const Foo = {
|
||||||
|
a: 1,
|
||||||
|
b: () => 2
|
||||||
|
};
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
export const Foo = {
|
||||||
|
a: 1,
|
||||||
|
b: () => 2
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2473_1: {
|
||||||
|
options = {
|
||||||
|
hoist_props: false,
|
||||||
|
reduce_vars: true,
|
||||||
|
top_retain: [ "x", "y" ],
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var x = {};
|
||||||
|
var y = [];
|
||||||
|
var z = {};
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var x = {};
|
||||||
|
var y = [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2473_2: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
top_retain: [ "x", "y" ],
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var x = {};
|
||||||
|
var y = [];
|
||||||
|
var z = {};
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var x = {};
|
||||||
|
var y = [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2473_3: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
top_retain: "o",
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
a: 1,
|
||||||
|
b: 2,
|
||||||
|
};
|
||||||
|
console.log(o.a, o.b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {
|
||||||
|
a: 1,
|
||||||
|
b: 2,
|
||||||
|
};
|
||||||
|
console.log(o.a, o.b);
|
||||||
|
}
|
||||||
|
expect_stdout: "1 2"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2473_4: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
top_retain: "o",
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
var o = {
|
||||||
|
a: 1,
|
||||||
|
b: 2,
|
||||||
|
};
|
||||||
|
console.log(o.a, o.b);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function() {
|
||||||
|
var o_a = 1, o_b = 2;
|
||||||
|
console.log(o_a, o_b);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "1 2"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2508_1: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
a: [ 1 ],
|
||||||
|
f: function(x) {
|
||||||
|
console.log(x);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
o.f(o.a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(x) {
|
||||||
|
console.log(x);
|
||||||
|
})([ 1 ]);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2508_2: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
a: { b: 2 },
|
||||||
|
f: function(x) {
|
||||||
|
console.log(x);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
o.f(o.a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(x) {
|
||||||
|
console.log(x);
|
||||||
|
})({ b: 2 });
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2508_3: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
a: [ o ],
|
||||||
|
f: function(x) {
|
||||||
|
console.log(x);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
o.f(o.a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {
|
||||||
|
a: [ o ],
|
||||||
|
f: function(x) {
|
||||||
|
console.log(x);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
o.f(o.a);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2508_4: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
a: { b: o },
|
||||||
|
f: function(x) {
|
||||||
|
console.log(x);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
o.f(o.a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {
|
||||||
|
a: { b: o },
|
||||||
|
f: function(x) {
|
||||||
|
console.log(x);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
o.f(o.a);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2508_5: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
f: function(x) {
|
||||||
|
console.log(x);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
o.f(o.f);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o_f = function(x) {
|
||||||
|
console.log(x);
|
||||||
|
};
|
||||||
|
o_f(o_f);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2508_6: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
f: x => {
|
||||||
|
console.log(x);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
o.f(o.f);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o_f = x => {
|
||||||
|
console.log(x);
|
||||||
|
};
|
||||||
|
o_f(o_f);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2519: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function testFunc() {
|
||||||
|
var dimensions = {
|
||||||
|
minX: 5,
|
||||||
|
maxX: 6,
|
||||||
|
};
|
||||||
|
var scale = 1;
|
||||||
|
var d = {
|
||||||
|
x: (dimensions.maxX + dimensions.minX) / 2,
|
||||||
|
};
|
||||||
|
return d.x * scale;
|
||||||
|
}
|
||||||
|
console.log(testFunc());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function testFunc() {
|
||||||
|
return 1 * ((6 + 5) / 2);
|
||||||
|
}
|
||||||
|
console.log(testFunc());
|
||||||
|
}
|
||||||
|
expect_stdout: "5.5"
|
||||||
|
}
|
||||||
@@ -14,6 +14,7 @@ const_declaration: {
|
|||||||
const_pragma: {
|
const_pragma: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -29,6 +30,7 @@ const_pragma: {
|
|||||||
not_const: {
|
not_const: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ chained_evaluation_1: {
|
|||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -28,6 +29,7 @@ chained_evaluation_2: {
|
|||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ issue_1639_1: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
for (var a = 100, b = 10, L1 = 5; --L1 > 0;)
|
for (var a = 100, b = 10, L1 = 5; --L1 > 0;)
|
||||||
if (--b, !1) var ignore = 0;
|
if (--b, 0) var ignore = 0;
|
||||||
console.log(a, b);
|
console.log(a, b);
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
@@ -57,7 +57,7 @@ issue_1639_2: {
|
|||||||
expect: {
|
expect: {
|
||||||
var a = 100, b = 10;
|
var a = 100, b = 10;
|
||||||
function f19() {
|
function f19() {
|
||||||
++a, 1;
|
++a, 0;
|
||||||
}
|
}
|
||||||
f19(),
|
f19(),
|
||||||
console.log(a, b);
|
console.log(a, b);
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ f7: {
|
|||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
passes: 3,
|
passes: 3,
|
||||||
properties: true,
|
properties: true,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
@@ -38,7 +39,7 @@ f7: {
|
|||||||
"var b = 10;",
|
"var b = 10;",
|
||||||
"",
|
"",
|
||||||
"!function() {",
|
"!function() {",
|
||||||
" for (;b = 100, !1; ) ;",
|
" b = 100;",
|
||||||
"}(), console.log(100, b);",
|
"}(), console.log(100, b);",
|
||||||
]
|
]
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
side_effects_catch: {
|
side_effects_catch: {
|
||||||
options = {
|
options = {
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -34,6 +35,7 @@ side_effects_catch: {
|
|||||||
|
|
||||||
side_effects_else: {
|
side_effects_else: {
|
||||||
options = {
|
options = {
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -62,6 +64,7 @@ side_effects_else: {
|
|||||||
|
|
||||||
side_effects_finally: {
|
side_effects_finally: {
|
||||||
options = {
|
options = {
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -98,6 +101,7 @@ side_effects_finally: {
|
|||||||
|
|
||||||
side_effects_label: {
|
side_effects_label: {
|
||||||
options = {
|
options = {
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -130,6 +134,7 @@ side_effects_label: {
|
|||||||
|
|
||||||
side_effects_switch: {
|
side_effects_switch: {
|
||||||
options = {
|
options = {
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ case_1: {
|
|||||||
input: {
|
input: {
|
||||||
var a = 0, b = 1;
|
var a = 0, b = 1;
|
||||||
switch (true) {
|
switch (true) {
|
||||||
case a, true:
|
case a || true:
|
||||||
default:
|
default:
|
||||||
b = 2;
|
b = 2;
|
||||||
case true:
|
case true:
|
||||||
@@ -17,7 +17,7 @@ case_1: {
|
|||||||
expect: {
|
expect: {
|
||||||
var a = 0, b = 1;
|
var a = 0, b = 1;
|
||||||
switch (true) {
|
switch (true) {
|
||||||
case a, true:
|
case a || true:
|
||||||
b = 2;
|
b = 2;
|
||||||
}
|
}
|
||||||
console.log(a, b);
|
console.log(a, b);
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ unary_prefix: {
|
|||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
iife_for: {
|
iife_for: {
|
||||||
options = {
|
options = {
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -26,6 +27,7 @@ iife_for: {
|
|||||||
iife_for_in: {
|
iife_for_in: {
|
||||||
options = {
|
options = {
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -51,6 +53,7 @@ iife_for_in: {
|
|||||||
iife_do: {
|
iife_do: {
|
||||||
options = {
|
options = {
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -80,6 +83,7 @@ iife_do: {
|
|||||||
iife_while: {
|
iife_while: {
|
||||||
options = {
|
options = {
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -130,5 +134,5 @@ label_while: {
|
|||||||
L: while (0) continue L;
|
L: while (0) continue L;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect_exact: "function f(){L:;}"
|
expect_exact: "function f(){L:0}"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -177,6 +177,7 @@ export_mangle_2: {
|
|||||||
export_mangle_3: {
|
export_mangle_3: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
@@ -195,6 +196,7 @@ export_mangle_3: {
|
|||||||
export_mangle_4: {
|
export_mangle_4: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
|
unused: true,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ collapse_vars_constants: {
|
|||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -240,6 +241,7 @@ negate_iife_issue_1073: {
|
|||||||
evaluate: true,
|
evaluate: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -267,6 +269,7 @@ issue_1288_side_effects: {
|
|||||||
evaluate: true,
|
evaluate: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -299,6 +302,7 @@ inner_var_for_in_1: {
|
|||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
@@ -330,6 +334,7 @@ issue_1595_3: {
|
|||||||
evaluate: true,
|
evaluate: true,
|
||||||
inline: true,
|
inline: true,
|
||||||
passes: 2,
|
passes: 2,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,6 +17,6 @@ wrongly_optimized: {
|
|||||||
foo();
|
foo();
|
||||||
}
|
}
|
||||||
// TODO: optimize to `func(), bar()`
|
// TODO: optimize to `func(), bar()`
|
||||||
(func(), 0) || bar();
|
(func(), 1) && bar();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ wrongly_optimized: {
|
|||||||
foo();
|
foo();
|
||||||
}
|
}
|
||||||
// TODO: optimize to `func(), bar()`
|
// TODO: optimize to `func(), bar()`
|
||||||
if (func(), !0) bar();
|
if (func(), 1) bar();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
this_binding_conditionals: {
|
this_binding_conditionals: {
|
||||||
options = {
|
options = {
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
evaluate : true
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
(1 && a)();
|
(1 && a)();
|
||||||
@@ -51,6 +52,7 @@ this_binding_collapse_vars: {
|
|||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
var c = a; c();
|
var c = a; c();
|
||||||
|
|||||||
@@ -192,9 +192,11 @@ keep_collapse_const_in_own_block_scope_2: {
|
|||||||
|
|
||||||
evaluate: {
|
evaluate: {
|
||||||
options = {
|
options = {
|
||||||
loops: true,
|
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
loops: true,
|
||||||
|
passes: 2,
|
||||||
|
side_effects: true,
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
while (true) {
|
while (true) {
|
||||||
@@ -494,3 +496,43 @@ in_parenthesis_2: {
|
|||||||
}
|
}
|
||||||
expect_exact: 'for(function(){"foo"in{}};0;);'
|
expect_exact: 'for(function(){"foo"in{}};0;);'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
init_side_effects: {
|
||||||
|
options = {
|
||||||
|
loops: true,
|
||||||
|
side_effects: true,
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
for (function() {}(), i = 0; i < 5; i++) console.log(i);
|
||||||
|
for (function() {}(); i < 10; i++) console.log(i);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
for (i = 0; i < 5; i++) console.log(i);
|
||||||
|
for (; i < 10; i++) console.log(i);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
dead_code_condition: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
loops: true,
|
||||||
|
sequences: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
for (var a = 0, b = 5; (a += 1, 3) - 3 && b > 0; b--) {
|
||||||
|
var c = function() {
|
||||||
|
b--;
|
||||||
|
}(a++);
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var c;
|
||||||
|
var a = 0, b = 5;
|
||||||
|
a += 1, 0,
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "1"
|
||||||
|
}
|
||||||
|
|||||||
@@ -812,3 +812,204 @@ prop_arrow_with_nested_this: {
|
|||||||
]
|
]
|
||||||
node_version: ">=4"
|
node_version: ">=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_2554_1: {
|
||||||
|
options = {
|
||||||
|
computed_props: true,
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var obj = {
|
||||||
|
["x" + ""]: 1,
|
||||||
|
["method" + ""]() {
|
||||||
|
this.s = "PASS";
|
||||||
|
},
|
||||||
|
get ["g" + ""]() {
|
||||||
|
return this.x;
|
||||||
|
},
|
||||||
|
set ["s" + ""](value) {
|
||||||
|
this.x = value;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
obj.method();
|
||||||
|
console.log(obj.g);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var obj = {
|
||||||
|
x: 1,
|
||||||
|
method() {
|
||||||
|
this.s = "PASS";
|
||||||
|
},
|
||||||
|
get g() {
|
||||||
|
return this.x;
|
||||||
|
},
|
||||||
|
set s(value) {
|
||||||
|
this.x = value;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
obj.method();
|
||||||
|
console.log(obj.g);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2554_2: {
|
||||||
|
options = {
|
||||||
|
computed_props: true,
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var instance = new class {
|
||||||
|
constructor() {
|
||||||
|
this.x = 2;
|
||||||
|
}
|
||||||
|
["method" + ""]() {
|
||||||
|
this.s = "PASS";
|
||||||
|
}
|
||||||
|
get ["g" + ""]() {
|
||||||
|
return this.x;
|
||||||
|
}
|
||||||
|
set ["s" + ""](value) {
|
||||||
|
this.x = value;
|
||||||
|
}
|
||||||
|
}();
|
||||||
|
instance.method();
|
||||||
|
console.log(instance.g);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var instance = new class {
|
||||||
|
constructor() {
|
||||||
|
this.x = 2;
|
||||||
|
}
|
||||||
|
method() {
|
||||||
|
this.s = "PASS";
|
||||||
|
}
|
||||||
|
get g() {
|
||||||
|
return this.x;
|
||||||
|
}
|
||||||
|
set s(value) {
|
||||||
|
this.x = value;
|
||||||
|
}
|
||||||
|
}();
|
||||||
|
instance.method();
|
||||||
|
console.log(instance.g);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2554_3: {
|
||||||
|
options = {
|
||||||
|
computed_props: true,
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var foo = {
|
||||||
|
[1 + 0]: 1,
|
||||||
|
[2 + 0]() {
|
||||||
|
this[4] = "PASS";
|
||||||
|
},
|
||||||
|
get [3 + 0]() {
|
||||||
|
return this[1];
|
||||||
|
},
|
||||||
|
set [4 + 0](value) {
|
||||||
|
this[1] = value;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
foo[2]();
|
||||||
|
console.log(foo[3]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var foo = {
|
||||||
|
1: 1,
|
||||||
|
2() {
|
||||||
|
this[4] = "PASS";
|
||||||
|
},
|
||||||
|
get 3() {
|
||||||
|
return this[1];
|
||||||
|
},
|
||||||
|
set 4(value) {
|
||||||
|
this[1] = value;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
foo[2]();
|
||||||
|
console.log(foo[3]);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2554_4: {
|
||||||
|
options = {
|
||||||
|
computed_props: true,
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var bar = new class {
|
||||||
|
constructor() {
|
||||||
|
this[1] = 2;
|
||||||
|
}
|
||||||
|
[2 + 0]() {
|
||||||
|
this[4] = "PASS";
|
||||||
|
}
|
||||||
|
get [3 + 0]() {
|
||||||
|
return this[1];
|
||||||
|
}
|
||||||
|
set [4 + 0](value) {
|
||||||
|
this[1] = value;
|
||||||
|
}
|
||||||
|
}();
|
||||||
|
bar[2]();
|
||||||
|
console.log(bar[3]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var bar = new class {
|
||||||
|
constructor() {
|
||||||
|
this[1] = 2;
|
||||||
|
}
|
||||||
|
2() {
|
||||||
|
this[4] = "PASS";
|
||||||
|
}
|
||||||
|
get 3() {
|
||||||
|
return this[1];
|
||||||
|
}
|
||||||
|
set 4(value) {
|
||||||
|
this[1] = value;
|
||||||
|
}
|
||||||
|
}();
|
||||||
|
bar[2]();
|
||||||
|
console.log(bar[3]);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2554_5: {
|
||||||
|
options = {
|
||||||
|
computed_props: true,
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
new class {
|
||||||
|
["constructor"]() {
|
||||||
|
console.log("FAIL");
|
||||||
|
}
|
||||||
|
"constructor"() {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
new class {
|
||||||
|
["constructor"]() {
|
||||||
|
console.log("FAIL");
|
||||||
|
}
|
||||||
|
constructor() {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
keep_properties: {
|
keep_properties: {
|
||||||
options = {
|
options = {
|
||||||
properties: false
|
evaluate: true,
|
||||||
};
|
properties: false,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
a["foo"] = "bar";
|
a["foo"] = "bar";
|
||||||
}
|
}
|
||||||
@@ -12,6 +13,7 @@ keep_properties: {
|
|||||||
|
|
||||||
dot_properties: {
|
dot_properties: {
|
||||||
options = {
|
options = {
|
||||||
|
evaluate: true,
|
||||||
properties: true,
|
properties: true,
|
||||||
}
|
}
|
||||||
beautify = {
|
beautify = {
|
||||||
@@ -37,6 +39,7 @@ dot_properties: {
|
|||||||
|
|
||||||
dot_properties_es5: {
|
dot_properties_es5: {
|
||||||
options = {
|
options = {
|
||||||
|
evaluate: true,
|
||||||
properties: true,
|
properties: true,
|
||||||
}
|
}
|
||||||
beautify = {
|
beautify = {
|
||||||
@@ -61,8 +64,8 @@ dot_properties_es5: {
|
|||||||
sub_properties: {
|
sub_properties: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
properties: true
|
properties: true,
|
||||||
};
|
}
|
||||||
input: {
|
input: {
|
||||||
a[0] = 0;
|
a[0] = 0;
|
||||||
a["0"] = 1;
|
a["0"] = 1;
|
||||||
@@ -81,18 +84,18 @@ sub_properties: {
|
|||||||
a[3.14] = 3;
|
a[3.14] = 3;
|
||||||
a.if = 4;
|
a.if = 4;
|
||||||
a["foo bar"] = 5;
|
a["foo bar"] = 5;
|
||||||
a[NaN] = 6;
|
a.NaN = 6;
|
||||||
a[null] = 7;
|
a.null = 7;
|
||||||
a[void 0] = 8;
|
a[void 0] = 8;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
evaluate_array_length: {
|
evaluate_array_length: {
|
||||||
options = {
|
options = {
|
||||||
|
evaluate: true,
|
||||||
properties: true,
|
properties: true,
|
||||||
unsafe: true,
|
unsafe: true,
|
||||||
evaluate: true
|
}
|
||||||
};
|
|
||||||
input: {
|
input: {
|
||||||
a = [1, 2, 3].length;
|
a = [1, 2, 3].length;
|
||||||
a = [1, 2, 3].join()["len" + "gth"];
|
a = [1, 2, 3].join()["len" + "gth"];
|
||||||
@@ -109,10 +112,10 @@ evaluate_array_length: {
|
|||||||
|
|
||||||
evaluate_string_length: {
|
evaluate_string_length: {
|
||||||
options = {
|
options = {
|
||||||
|
evaluate: true,
|
||||||
properties: true,
|
properties: true,
|
||||||
unsafe: true,
|
unsafe: true,
|
||||||
evaluate: true
|
}
|
||||||
};
|
|
||||||
input: {
|
input: {
|
||||||
a = "foo".length;
|
a = "foo".length;
|
||||||
a = ("foo" + "bar")["len" + "gth"];
|
a = ("foo" + "bar")["len" + "gth"];
|
||||||
@@ -151,7 +154,8 @@ mangle_properties: {
|
|||||||
|
|
||||||
mangle_unquoted_properties: {
|
mangle_unquoted_properties: {
|
||||||
options = {
|
options = {
|
||||||
properties: false
|
evaluate: true,
|
||||||
|
properties: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
properties: {
|
properties: {
|
||||||
@@ -250,7 +254,8 @@ mangle_debug_suffix: {
|
|||||||
|
|
||||||
mangle_debug_suffix_keep_quoted: {
|
mangle_debug_suffix_keep_quoted: {
|
||||||
options = {
|
options = {
|
||||||
properties: false
|
evaluate: true,
|
||||||
|
properties: false,
|
||||||
}
|
}
|
||||||
mangle = {
|
mangle = {
|
||||||
properties: {
|
properties: {
|
||||||
@@ -679,8 +684,8 @@ accessor_this: {
|
|||||||
issue_2208_1: {
|
issue_2208_1: {
|
||||||
options = {
|
options = {
|
||||||
inline: true,
|
inline: true,
|
||||||
|
properties: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
unsafe: true,
|
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log({
|
console.log({
|
||||||
@@ -698,8 +703,8 @@ issue_2208_1: {
|
|||||||
issue_2208_2: {
|
issue_2208_2: {
|
||||||
options = {
|
options = {
|
||||||
inline: true,
|
inline: true,
|
||||||
|
properties: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
unsafe: true,
|
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log({
|
console.log({
|
||||||
@@ -723,8 +728,8 @@ issue_2208_2: {
|
|||||||
issue_2208_3: {
|
issue_2208_3: {
|
||||||
options = {
|
options = {
|
||||||
inline: true,
|
inline: true,
|
||||||
|
properties: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
unsafe: true,
|
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
a = 42;
|
a = 42;
|
||||||
@@ -748,8 +753,8 @@ issue_2208_3: {
|
|||||||
issue_2208_4: {
|
issue_2208_4: {
|
||||||
options = {
|
options = {
|
||||||
inline: true,
|
inline: true,
|
||||||
|
properties: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
unsafe: true,
|
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
function foo() {}
|
function foo() {}
|
||||||
@@ -772,8 +777,8 @@ issue_2208_4: {
|
|||||||
issue_2208_5: {
|
issue_2208_5: {
|
||||||
options = {
|
options = {
|
||||||
inline: true,
|
inline: true,
|
||||||
|
properties: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
unsafe: true,
|
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log({
|
console.log({
|
||||||
@@ -792,8 +797,8 @@ issue_2208_5: {
|
|||||||
issue_2208_6: {
|
issue_2208_6: {
|
||||||
options = {
|
options = {
|
||||||
inline: true,
|
inline: true,
|
||||||
|
properties: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
unsafe: true,
|
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log({
|
console.log({
|
||||||
@@ -809,9 +814,11 @@ issue_2208_6: {
|
|||||||
|
|
||||||
issue_2208_7: {
|
issue_2208_7: {
|
||||||
options = {
|
options = {
|
||||||
|
ecma: 6,
|
||||||
inline: true,
|
inline: true,
|
||||||
|
properties: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
unsafe: true,
|
unsafe_arrows: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log({
|
console.log({
|
||||||
@@ -829,9 +836,11 @@ issue_2208_7: {
|
|||||||
|
|
||||||
issue_2208_8: {
|
issue_2208_8: {
|
||||||
options = {
|
options = {
|
||||||
|
ecma: 6,
|
||||||
inline: true,
|
inline: true,
|
||||||
|
properties: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
unsafe: true,
|
unsafe_arrows: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log({
|
console.log({
|
||||||
@@ -851,17 +860,17 @@ issue_2208_8: {
|
|||||||
return x();
|
return x();
|
||||||
}
|
}
|
||||||
}.p());
|
}.p());
|
||||||
console.log(async function() {
|
console.log((async () => {
|
||||||
return await x();
|
return await x();
|
||||||
}());
|
})());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
issue_2208_9: {
|
issue_2208_9: {
|
||||||
options = {
|
options = {
|
||||||
inline: true,
|
inline: true,
|
||||||
|
properties: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
unsafe: true,
|
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
a = 42;
|
a = 42;
|
||||||
@@ -931,6 +940,7 @@ methods_keep_quoted_from_dead_code: {
|
|||||||
dead_code: true,
|
dead_code: true,
|
||||||
ecma: 6,
|
ecma: 6,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
unsafe_methods: true,
|
unsafe_methods: true,
|
||||||
@@ -1052,3 +1062,272 @@ unsafe_methods_regex: {
|
|||||||
]
|
]
|
||||||
node_version: ">=6"
|
node_version: ">=6"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lhs_prop_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
properties: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(++{
|
||||||
|
a: 1
|
||||||
|
}.a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(++{
|
||||||
|
a: 1
|
||||||
|
}.a);
|
||||||
|
}
|
||||||
|
expect_stdout: "2"
|
||||||
|
}
|
||||||
|
|
||||||
|
lhs_prop_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
properties: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
[1][0] = 42;
|
||||||
|
(function(a) {
|
||||||
|
a.b = "g";
|
||||||
|
})("abc");
|
||||||
|
(function(a) {
|
||||||
|
a[2] = "g";
|
||||||
|
})("def");
|
||||||
|
(function(a) {
|
||||||
|
a[""] = "g";
|
||||||
|
})("ghi");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
[1][0] = 42;
|
||||||
|
"abc".b = "g";
|
||||||
|
"def"[2] = "g";
|
||||||
|
"ghi"[""] = "g";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
literal_duplicate_key_side_effects: {
|
||||||
|
options = {
|
||||||
|
properties: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log({
|
||||||
|
a: "FAIL",
|
||||||
|
a: console.log ? "PASS" : "FAIL"
|
||||||
|
}.a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(console.log ? "PASS" : "FAIL");
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
prop_side_effects_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
properties: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var C = 1;
|
||||||
|
console.log(C);
|
||||||
|
var obj = {
|
||||||
|
bar: function() {
|
||||||
|
return C + C;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
console.log(obj.bar());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(1);
|
||||||
|
var obj = {
|
||||||
|
bar: function() {
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
console.log(obj.bar());
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"1",
|
||||||
|
"2",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
prop_side_effects_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
properties: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var C = 1;
|
||||||
|
console.log(C);
|
||||||
|
var obj = {
|
||||||
|
"": function() {
|
||||||
|
return C + C;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
console.log(obj[""]());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(1);
|
||||||
|
console.log(2);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"1",
|
||||||
|
"2",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
accessor_1: {
|
||||||
|
options = {
|
||||||
|
properties: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log({
|
||||||
|
a: "FAIL",
|
||||||
|
get a() {
|
||||||
|
return "PASS";
|
||||||
|
}
|
||||||
|
}.a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log({
|
||||||
|
a: "FAIL",
|
||||||
|
get a() {
|
||||||
|
return "PASS";
|
||||||
|
}
|
||||||
|
}.a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
accessor_2: {
|
||||||
|
options = {
|
||||||
|
properties: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log({
|
||||||
|
get a() {
|
||||||
|
return "PASS";
|
||||||
|
},
|
||||||
|
set a(v) {},
|
||||||
|
a: "FAIL"
|
||||||
|
}.a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log({
|
||||||
|
get a() {
|
||||||
|
return "PASS";
|
||||||
|
},
|
||||||
|
set a(v) {},
|
||||||
|
a: "FAIL"
|
||||||
|
}.a);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
array_hole: {
|
||||||
|
options = {
|
||||||
|
properties: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(
|
||||||
|
[ 1, 2, , 3][1],
|
||||||
|
[ 1, 2, , 3][2],
|
||||||
|
[ 1, 2, , 3][3]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(2, void 0, 3);
|
||||||
|
}
|
||||||
|
expect_stdout: "2 undefined 3"
|
||||||
|
}
|
||||||
|
|
||||||
|
computed_property: {
|
||||||
|
options = {
|
||||||
|
properties: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log({
|
||||||
|
a: "bar",
|
||||||
|
[console.log("foo")]: 42,
|
||||||
|
}.a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log([
|
||||||
|
"bar",
|
||||||
|
console.log("foo")
|
||||||
|
][0]);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"foo",
|
||||||
|
"bar"
|
||||||
|
]
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
new_this: {
|
||||||
|
options = {
|
||||||
|
properties: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
new {
|
||||||
|
f: function(a) {
|
||||||
|
this.a = a;
|
||||||
|
}
|
||||||
|
}.f(42);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
new function(a) {
|
||||||
|
this.a = a;
|
||||||
|
}(42);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2513: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
properties: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
!function(Infinity, NaN, undefined) {
|
||||||
|
console.log("a"[1/0], "b"["Infinity"]);
|
||||||
|
console.log("c"[0/0], "d"["NaN"]);
|
||||||
|
console.log("e"[void 0], "f"["undefined"]);
|
||||||
|
}(0, 0, 0);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
!function(Infinity, NaN, undefined) {
|
||||||
|
console.log("a"[1/0], "b"[1/0]);
|
||||||
|
console.log("c".NaN, "d".NaN);
|
||||||
|
console.log("e"[void 0], "f"[void 0]);
|
||||||
|
}(0, 0, 0);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"undefined undefined",
|
||||||
|
"undefined undefined",
|
||||||
|
"undefined undefined",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
strict: {
|
strict: {
|
||||||
options = {
|
options = {
|
||||||
pure_getters: "strict",
|
pure_getters: "strict",
|
||||||
|
reduce_funcs: false,
|
||||||
reduce_vars: false,
|
reduce_vars: false,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
@@ -30,6 +31,7 @@ strict: {
|
|||||||
strict_reduce_vars: {
|
strict_reduce_vars: {
|
||||||
options = {
|
options = {
|
||||||
pure_getters: "strict",
|
pure_getters: "strict",
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
@@ -58,6 +60,7 @@ strict_reduce_vars: {
|
|||||||
unsafe: {
|
unsafe: {
|
||||||
options = {
|
options = {
|
||||||
pure_getters: true,
|
pure_getters: true,
|
||||||
|
reduce_funcs: false,
|
||||||
reduce_vars: false,
|
reduce_vars: false,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
@@ -84,6 +87,7 @@ unsafe: {
|
|||||||
unsafe_reduce_vars: {
|
unsafe_reduce_vars: {
|
||||||
options = {
|
options = {
|
||||||
pure_getters: true,
|
pure_getters: true,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
@@ -185,6 +189,7 @@ issue_2110_1: {
|
|||||||
pure_getters: "strict",
|
pure_getters: "strict",
|
||||||
sequences: true,
|
sequences: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -215,6 +220,7 @@ issue_2110_2: {
|
|||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
pure_getters: "strict",
|
pure_getters: "strict",
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -247,6 +253,7 @@ set_immutable_1: {
|
|||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
pure_getters: "strict",
|
pure_getters: "strict",
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -270,6 +277,7 @@ set_immutable_2: {
|
|||||||
cascade: true,
|
cascade: true,
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
pure_getters: "strict",
|
pure_getters: "strict",
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
@@ -293,6 +301,7 @@ set_immutable_3: {
|
|||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
pure_getters: "strict",
|
pure_getters: "strict",
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -318,6 +327,7 @@ set_immutable_4: {
|
|||||||
cascade: true,
|
cascade: true,
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
pure_getters: "strict",
|
pure_getters: "strict",
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
@@ -343,6 +353,7 @@ set_mutable_1: {
|
|||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
pure_getters: "strict",
|
pure_getters: "strict",
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
}
|
}
|
||||||
@@ -367,6 +378,7 @@ set_mutable_2: {
|
|||||||
cascade: true,
|
cascade: true,
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
pure_getters: "strict",
|
pure_getters: "strict",
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
@@ -403,6 +415,7 @@ issue_2265_1: {
|
|||||||
issue_2265_2: {
|
issue_2265_2: {
|
||||||
options = {
|
options = {
|
||||||
pure_getters: "strict",
|
pure_getters: "strict",
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
@@ -428,6 +441,7 @@ issue_2265_2: {
|
|||||||
issue_2265_3: {
|
issue_2265_3: {
|
||||||
options = {
|
options = {
|
||||||
pure_getters: "strict",
|
pure_getters: "strict",
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
@@ -447,6 +461,7 @@ issue_2265_3: {
|
|||||||
issue_2265_4: {
|
issue_2265_4: {
|
||||||
options = {
|
options = {
|
||||||
pure_getters: "strict",
|
pure_getters: "strict",
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
toplevel: true,
|
toplevel: true,
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
536
test/compress/rename.js
Normal file
536
test/compress/rename.js
Normal file
@@ -0,0 +1,536 @@
|
|||||||
|
mangle_catch: {
|
||||||
|
rename = true
|
||||||
|
options = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "FAIL";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (args) {
|
||||||
|
a = "PASS";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'var a="FAIL";try{throw 1}catch(o){a="PASS"}console.log(a);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_ie8: {
|
||||||
|
rename = true
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "FAIL";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (args) {
|
||||||
|
a = "PASS";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'var a="FAIL";try{throw 1}catch(args){a="PASS"}console.log(a);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_var: {
|
||||||
|
rename = true
|
||||||
|
options = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "FAIL";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (args) {
|
||||||
|
var a = "PASS";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'var a="FAIL";try{throw 1}catch(o){var a="PASS"}console.log(a);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_var_ie8: {
|
||||||
|
rename = true
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "FAIL";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (args) {
|
||||||
|
var a = "PASS";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'var a="FAIL";try{throw 1}catch(args){var a="PASS"}console.log(a);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_toplevel: {
|
||||||
|
rename = true
|
||||||
|
options = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "FAIL";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (args) {
|
||||||
|
a = "PASS";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'var o="FAIL";try{throw 1}catch(c){o="PASS"}console.log(o);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_ie8_toplevel: {
|
||||||
|
rename = true
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "FAIL";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (args) {
|
||||||
|
a = "PASS";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'var o="FAIL";try{throw 1}catch(c){o="PASS"}console.log(o);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_var_toplevel: {
|
||||||
|
rename = true
|
||||||
|
options = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "FAIL";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (args) {
|
||||||
|
var a = "PASS";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'var o="FAIL";try{throw 1}catch(r){var o="PASS"}console.log(o);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_var_ie8_toplevel: {
|
||||||
|
rename = true
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "FAIL";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (args) {
|
||||||
|
var a = "PASS";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'var o="FAIL";try{throw 1}catch(r){var o="PASS"}console.log(o);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_redef_1: {
|
||||||
|
rename = true
|
||||||
|
options = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS";
|
||||||
|
try {
|
||||||
|
throw "FAIL1";
|
||||||
|
} catch (a) {
|
||||||
|
var a = "FAIL2";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'var a="PASS";try{throw"FAIL1"}catch(a){var a="FAIL2"}console.log(a);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_redef_1_ie8: {
|
||||||
|
rename = true
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS";
|
||||||
|
try {
|
||||||
|
throw "FAIL1";
|
||||||
|
} catch (a) {
|
||||||
|
var a = "FAIL2";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'var a="PASS";try{throw"FAIL1"}catch(a){var a="FAIL2"}console.log(a);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_redef_1_toplevel: {
|
||||||
|
rename = true
|
||||||
|
options = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS";
|
||||||
|
try {
|
||||||
|
throw "FAIL1";
|
||||||
|
} catch (a) {
|
||||||
|
var a = "FAIL2";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'var o="PASS";try{throw"FAIL1"}catch(o){var o="FAIL2"}console.log(o);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_redef_1_ie8_toplevel: {
|
||||||
|
rename = true
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS";
|
||||||
|
try {
|
||||||
|
throw "FAIL1";
|
||||||
|
} catch (a) {
|
||||||
|
var a = "FAIL2";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'var o="PASS";try{throw"FAIL1"}catch(o){var o="FAIL2"}console.log(o);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_redef_2: {
|
||||||
|
rename = true
|
||||||
|
options = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try {
|
||||||
|
throw "FAIL1";
|
||||||
|
} catch (a) {
|
||||||
|
var a = "FAIL2";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'try{throw"FAIL1"}catch(a){var a="FAIL2"}console.log(a);'
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_redef_2_ie8: {
|
||||||
|
rename = true
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try {
|
||||||
|
throw "FAIL1";
|
||||||
|
} catch (a) {
|
||||||
|
var a = "FAIL2";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'try{throw"FAIL1"}catch(a){var a="FAIL2"}console.log(a);'
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_redef_2_toplevel: {
|
||||||
|
rename = true
|
||||||
|
options = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try {
|
||||||
|
throw "FAIL1";
|
||||||
|
} catch (a) {
|
||||||
|
var a = "FAIL2";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'try{throw"FAIL1"}catch(o){var o="FAIL2"}console.log(o);'
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_redef_2_ie8_toplevel: {
|
||||||
|
rename = true
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try {
|
||||||
|
throw "FAIL1";
|
||||||
|
} catch (a) {
|
||||||
|
var a = "FAIL2";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'try{throw"FAIL1"}catch(o){var o="FAIL2"}console.log(o);'
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2120_1: {
|
||||||
|
rename = true
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"aaaaaaaa";
|
||||||
|
var a = 1, b = "FAIL";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (c) {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (a) {
|
||||||
|
if (c) b = "PASS";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"aaaaaaaa";
|
||||||
|
var a = 1, b = "FAIL";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (t) {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (a) {
|
||||||
|
if (t) b = "PASS";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2120_2: {
|
||||||
|
rename = true
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"aaaaaaaa";
|
||||||
|
var a = 1, b = "FAIL";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (c) {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (a) {
|
||||||
|
if (c) b = "PASS";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"aaaaaaaa";
|
||||||
|
var a = 1, b = "FAIL";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (c) {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (a) {
|
||||||
|
if (c) b = "PASS";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
function_iife_catch: {
|
||||||
|
rename = true
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(n) {
|
||||||
|
!function() {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (n) {
|
||||||
|
var a = 1;
|
||||||
|
console.log(n, a);
|
||||||
|
}
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect_exact: "function f(o){!function(){try{throw 0}catch(c){var o=1;console.log(c,o)}}()}f();"
|
||||||
|
expect_stdout: "0 1"
|
||||||
|
}
|
||||||
|
|
||||||
|
function_iife_catch_ie8: {
|
||||||
|
rename = true
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(n) {
|
||||||
|
!function() {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (n) {
|
||||||
|
var a = 1;
|
||||||
|
console.log(n, a);
|
||||||
|
}
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect_exact: "function f(o){!function(){try{throw 0}catch(o){var c=1;console.log(o,c)}}()}f();"
|
||||||
|
expect_stdout: "0 1"
|
||||||
|
}
|
||||||
|
|
||||||
|
function_catch_catch: {
|
||||||
|
rename = true
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = 0;
|
||||||
|
function f() {
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (c) {
|
||||||
|
try {
|
||||||
|
throw 2;
|
||||||
|
} catch (o) {
|
||||||
|
var o = 3;
|
||||||
|
console.log(o);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(o);
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect_exact: "var o=0;function f(){try{throw 1}catch(c){try{throw 2}catch(o){var o=3;console.log(o)}}console.log(o)}f();"
|
||||||
|
expect_stdout: [
|
||||||
|
"3",
|
||||||
|
"undefined",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
function_catch_catch_ie8: {
|
||||||
|
rename = true
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = 0;
|
||||||
|
function f() {
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (c) {
|
||||||
|
try {
|
||||||
|
throw 2;
|
||||||
|
} catch (o) {
|
||||||
|
var o = 3;
|
||||||
|
console.log(o);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(o);
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect_exact: "var o=0;function f(){try{throw 1}catch(c){try{throw 2}catch(o){var o=3;console.log(o)}}console.log(o)}f();"
|
||||||
|
expect_stdout: [
|
||||||
|
"3",
|
||||||
|
"undefined",
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -122,3 +122,25 @@ return_undefined: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return_void: {
|
||||||
|
options = {
|
||||||
|
if_return: true,
|
||||||
|
inline: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
function g() {
|
||||||
|
h();
|
||||||
|
}
|
||||||
|
return g();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
h();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -187,6 +187,7 @@ dont_screw_try_catch_undefined: {
|
|||||||
reduce_vars: {
|
reduce_vars: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
ie8: true,
|
ie8: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
|
|||||||
@@ -252,13 +252,12 @@ negate_iife_for: {
|
|||||||
input: {
|
input: {
|
||||||
(function() {})();
|
(function() {})();
|
||||||
for (i = 0; i < 5; i++) console.log(i);
|
for (i = 0; i < 5; i++) console.log(i);
|
||||||
|
|
||||||
(function() {})();
|
(function() {})();
|
||||||
for (; i < 5; i++) console.log(i);
|
for (; i < 10; i++) console.log(i);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
for (!function() {}(), i = 0; i < 5; i++) console.log(i);
|
for (!function() {}(), i = 0; i < 5; i++) console.log(i);
|
||||||
for (function() {}(); i < 5; i++) console.log(i);
|
for (!function() {}(); i < 10; i++) console.log(i);
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -714,6 +714,7 @@ issue_1705_2: {
|
|||||||
options = {
|
options = {
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
reduce_funcs: true,
|
||||||
reduce_vars: true,
|
reduce_vars: true,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
side_effects: true,
|
side_effects: true,
|
||||||
@@ -816,3 +817,50 @@ issue_1758: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "0 3"
|
expect_stdout: "0 3"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_2535: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
dead_code: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
switch(w(), 42) {
|
||||||
|
case 13: x();
|
||||||
|
case 42: y();
|
||||||
|
default: z();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
w(), 42;
|
||||||
|
42;
|
||||||
|
y();
|
||||||
|
z();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1750: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 0, b = 1;
|
||||||
|
switch (true) {
|
||||||
|
case a, true:
|
||||||
|
default:
|
||||||
|
b = 2;
|
||||||
|
case true:
|
||||||
|
}
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 0, b = 1;
|
||||||
|
true;
|
||||||
|
a, true;
|
||||||
|
b = 2;
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect_stdout: "0 2"
|
||||||
|
}
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ template_string_with_constant_expression: {
|
|||||||
var foo = `${4 + 4} equals 4 + 4`;
|
var foo = `${4 + 4} equals 4 + 4`;
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var foo = `8 equals 4 + 4`;
|
var foo = "8 equals 4 + 4";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -89,21 +89,21 @@ template_string_with_predefined_constants: {
|
|||||||
var c = `${4**14}`; // 8 in template vs 9 chars - 268435456
|
var c = `${4**14}`; // 8 in template vs 9 chars - 268435456
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var foo = `This is undefined`;
|
var foo = "This is undefined";
|
||||||
var bar = `This is NaN`;
|
var bar = "This is NaN";
|
||||||
var baz = `This is null`;
|
var baz = "This is null";
|
||||||
var foofoo = `This is ${1/0}`;
|
var foofoo = `This is ${1/0}`;
|
||||||
var foobar = "This is ${1/0}";
|
var foobar = "This is ${1/0}";
|
||||||
var foobaz = 'This is ${1/0}';
|
var foobaz = 'This is ${1/0}';
|
||||||
var barfoo = "This is ${NaN}";
|
var barfoo = "This is ${NaN}";
|
||||||
var bazfoo = "This is ${null}";
|
var bazfoo = "This is ${null}";
|
||||||
var bazbaz = `This is ${1/0}`;
|
var bazbaz = `This is ${1/0}`;
|
||||||
var barbar = `This is NaN`;
|
var barbar = "This is NaN";
|
||||||
var barbar = "This is ${0/0}";
|
var barbar = "This is ${0/0}";
|
||||||
var barber = 'This is ${0/0}';
|
var barber = 'This is ${0/0}';
|
||||||
|
|
||||||
var a = `4194304`;
|
var a = "4194304";
|
||||||
var b = `16777216`; // Potential for further concatentation
|
var b = "16777216"; // Potential for further concatentation
|
||||||
var c = `${4**14}`; // Not worth converting
|
var c = `${4**14}`; // Not worth converting
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -123,7 +123,7 @@ template_string_evaluate_with_many_segments: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var foo = `Hello ${guest()}, welcome to ${location()}.`;
|
var foo = `Hello ${guest()}, welcome to ${location()}.`;
|
||||||
var bar = `1234567890`;
|
var bar = "1234567890";
|
||||||
var baz = `${foobar()}${foobar()}${foobar()}${foobar()}`;
|
var baz = `${foobar()}${foobar()}${foobar()}${foobar()}`;
|
||||||
var buzz = `1${foobar()}2${foobar()}3${foobar()}`;
|
var buzz = `1${foobar()}2${foobar()}3${foobar()}`;
|
||||||
}
|
}
|
||||||
@@ -159,7 +159,7 @@ template_string_to_normal_string: {
|
|||||||
var bar = "Decimals " + `${1}${2}${3}${4}${5}${6}${7}${8}${9}${0}`;
|
var bar = "Decimals " + `${1}${2}${3}${4}${5}${6}${7}${8}${9}${0}`;
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var foo = `This is undefined`;
|
var foo = "This is undefined";
|
||||||
var bar = "Decimals 1234567890";
|
var bar = "Decimals 1234567890";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -192,7 +192,7 @@ evaluate_nested_templates: {
|
|||||||
var baz = `${`${`${`foo`}`}`}`;
|
var baz = `${`${`${`foo`}`}`}`;
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var baz = `foo`;
|
var baz = "foo";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -241,8 +241,8 @@ enforce_double_quotes_and_evaluate: {
|
|||||||
var baz = `Hello ${world()}`;
|
var baz = `Hello ${world()}`;
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var foo = `Hello world`;
|
var foo = "Hello world";
|
||||||
var bar = `Hello world`;
|
var bar = "Hello world";
|
||||||
var baz = `Hello ${world()}`;
|
var baz = `Hello ${world()}`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -260,8 +260,8 @@ enforce_single_quotes_and_evaluate: {
|
|||||||
var baz = `Hello ${world()}`;
|
var baz = `Hello ${world()}`;
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var foo = `Hello world`;
|
var foo = "Hello world";
|
||||||
var bar = `Hello world`;
|
var bar = "Hello world";
|
||||||
var baz = `Hello ${world()}`;
|
var baz = `Hello ${world()}`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -339,7 +339,7 @@ escape_dollar_curly: {
|
|||||||
console.log(`${1-0}\${2-0}$\{3-0}${4-0}`)
|
console.log(`${1-0}\${2-0}$\{3-0}${4-0}`)
|
||||||
console.log(`$${""}{not an expression}`)
|
console.log(`$${""}{not an expression}`)
|
||||||
}
|
}
|
||||||
expect_exact: "console.log(`\\${ beep }`);console.log(`1\\${2-0}\\${3-0}4`);console.log(`\\${not an expression}`);"
|
expect_exact: 'console.log("${ beep }");console.log("1${2-0}${3-0}4");console.log("${not an expression}");'
|
||||||
}
|
}
|
||||||
|
|
||||||
template_starting_with_newline: {
|
template_starting_with_newline: {
|
||||||
@@ -400,3 +400,109 @@ issue_1856_ascii_only: {
|
|||||||
}
|
}
|
||||||
expect_exact: "console.log(`\\\\n\\\\r\\\\u2028\\\\u2029\\n\\r\\u2028\\u2029`);"
|
expect_exact: "console.log(`\\\\n\\\\r\\\\u2028\\\\u2029\\n\\r\\u2028\\u2029`);"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
side_effects: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
`t1`;
|
||||||
|
tag`t2`;
|
||||||
|
`t${3}`;
|
||||||
|
tag`t${4}`;
|
||||||
|
console.log(`
|
||||||
|
t${5}`);
|
||||||
|
function f(a) {
|
||||||
|
`t6${a}`;
|
||||||
|
a = `t7${a}` & a;
|
||||||
|
a = `t8${b}` | a;
|
||||||
|
a = f`t9${a}` ^ a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
tag`t2`;
|
||||||
|
tag`t${4}`;
|
||||||
|
console.log("\nt5");
|
||||||
|
function f(a) {
|
||||||
|
a &= `t7${a}`;
|
||||||
|
a = `t8${b}` | a;
|
||||||
|
a = f`t9${a}` ^ a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
simple_string: {
|
||||||
|
options = {
|
||||||
|
computed_props: true,
|
||||||
|
evaluate: true,
|
||||||
|
properties: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log({[`foo`]: 1}[`foo`], `hi` == "hi", `world`);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log([ 1 ][0], true, "world");
|
||||||
|
}
|
||||||
|
expect_stdout: "1 true 'world'"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
semicolons: {
|
||||||
|
beautify = {
|
||||||
|
semicolons: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
foo;
|
||||||
|
`bar`;
|
||||||
|
}
|
||||||
|
expect_exact: "foo;`bar`\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
regex_1: {
|
||||||
|
input: {
|
||||||
|
console.log(`${/a/} ${6/2} ${/b/.test("b")} ${1?/c/:/d/}`);
|
||||||
|
}
|
||||||
|
expect_exact: 'console.log(`${/a/} ${6/2} ${/b/.test("b")} ${1?/c/:/d/}`);'
|
||||||
|
expect_stdout: "/a/ 3 true /c/"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
regex_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(`${/a/} ${6/2} ${/b/.test("b")} ${1?/c/:/d/}`);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("/a/ 3 true /c/");
|
||||||
|
}
|
||||||
|
expect_stdout: "/a/ 3 true /c/"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
sequence_1: {
|
||||||
|
input: {
|
||||||
|
console.log(`${1,2} ${/a/,/b/}`);
|
||||||
|
}
|
||||||
|
expect_exact: 'console.log(`${1,2} ${/a/,/b/}`);'
|
||||||
|
expect_stdout: "2 /b/"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
sequence_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(`${1,2} ${/a/,/b/}`);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("2 /b/");
|
||||||
|
}
|
||||||
|
expect_stdout: "2 /b/"
|
||||||
|
node_version: ">=4"
|
||||||
|
}
|
||||||
|
|||||||
@@ -45,9 +45,9 @@ condition_evaluate: {
|
|||||||
if (void 0 == null);
|
if (void 0 == null);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
while (!1);
|
while (0);
|
||||||
for (; !0;);
|
for (; 1;);
|
||||||
if (!0);
|
if (1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -68,6 +68,7 @@ label_if_break: {
|
|||||||
conditionals: true,
|
conditionals: true,
|
||||||
dead_code: true,
|
dead_code: true,
|
||||||
evaluate: true,
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
L: if (true) {
|
L: if (true) {
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
typeof_evaluation: {
|
typeof_evaluation: {
|
||||||
options = {
|
options = {
|
||||||
evaluate: true
|
evaluate: true,
|
||||||
|
typeofs: true,
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
a = typeof 1;
|
a = typeof 1;
|
||||||
@@ -44,7 +45,7 @@ typeof_in_boolean_context: {
|
|||||||
function f2() { return g(), "Yes"; }
|
function f2() { return g(), "Yes"; }
|
||||||
foo();
|
foo();
|
||||||
console.log(1);
|
console.log(1);
|
||||||
var a = !(console.log(2), !0);
|
var a = !(console.log(2), 1);
|
||||||
foo();
|
foo();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -57,6 +58,83 @@ issue_1668: {
|
|||||||
if (typeof bar);
|
if (typeof bar);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
if (!0);
|
if (1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typeof_defun_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
typeofs: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
console.log("YES");
|
||||||
|
}
|
||||||
|
function g() {
|
||||||
|
h = 42;
|
||||||
|
console.log("NOPE");
|
||||||
|
}
|
||||||
|
function h() {
|
||||||
|
console.log("YUP");
|
||||||
|
}
|
||||||
|
g = 42;
|
||||||
|
"function" == typeof f && f();
|
||||||
|
"function" == typeof g && g();
|
||||||
|
"function" == typeof h && h();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function g() {
|
||||||
|
h = 42;
|
||||||
|
console.log("NOPE");
|
||||||
|
}
|
||||||
|
function h() {
|
||||||
|
console.log("YUP");
|
||||||
|
}
|
||||||
|
g = 42;
|
||||||
|
console.log("YES");
|
||||||
|
"function" == typeof g && g();
|
||||||
|
h();
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"YES",
|
||||||
|
"YUP",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
typeof_defun_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
typeofs: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var f = function() {
|
||||||
|
console.log(x);
|
||||||
|
};
|
||||||
|
var x = 0;
|
||||||
|
x++ < 2 && typeof f == "function" && f();
|
||||||
|
x++ < 2 && typeof f == "function" && f();
|
||||||
|
x++ < 2 && typeof f == "function" && f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var f = function() {
|
||||||
|
console.log(x);
|
||||||
|
};
|
||||||
|
var x = 0;
|
||||||
|
x++ < 2 && f();
|
||||||
|
x++ < 2 && f();
|
||||||
|
x++ < 2 && f();
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"1",
|
||||||
|
"2",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|||||||
@@ -10,13 +10,13 @@ function read(path) {
|
|||||||
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(60000);
|
this.timeout(120000);
|
||||||
|
|
||||||
var command = uglifyjscmd + ' --self -mc ecma=';
|
var command = uglifyjscmd + ' --self -mc ecma=';
|
||||||
command += semver.satisfies(process.version, ">=4") ? "6" : "5";
|
command += semver.satisfies(process.version, ">=4") ? "6" : "5";
|
||||||
command += ',passes=3,keep_fargs=false,unsafe --wrap WrappedUglifyJS';
|
command += ',passes=3,keep_fargs=false,unsafe --wrap WrappedUglifyJS';
|
||||||
|
|
||||||
exec(command, function (err, stdout) {
|
exec(command, { maxBuffer: 1048576 }, function (err, stdout) {
|
||||||
if (err) throw err;
|
if (err) throw err;
|
||||||
|
|
||||||
eval(stdout);
|
eval(stdout);
|
||||||
|
|||||||
@@ -328,4 +328,37 @@ describe("minify", function() {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe("collapse_vars", function() {
|
||||||
|
it("Should not produce invalid AST", function() {
|
||||||
|
var code = [
|
||||||
|
"function f(a) {",
|
||||||
|
" a = x();",
|
||||||
|
" return a;",
|
||||||
|
"}",
|
||||||
|
"f();",
|
||||||
|
].join("\n");
|
||||||
|
var ast = Uglify.minify(code, {
|
||||||
|
compress: false,
|
||||||
|
mangle: false,
|
||||||
|
output: {
|
||||||
|
ast: true
|
||||||
|
},
|
||||||
|
}).ast;
|
||||||
|
assert.strictEqual(ast.TYPE, "Toplevel");
|
||||||
|
assert.strictEqual(ast.body.length, 2);
|
||||||
|
assert.strictEqual(ast.body[0].TYPE, "Defun");
|
||||||
|
assert.strictEqual(ast.body[0].body.length, 2);
|
||||||
|
assert.strictEqual(ast.body[0].body[0].TYPE, "SimpleStatement");
|
||||||
|
var stat = ast.body[0].body[0];
|
||||||
|
Uglify.minify(ast, {
|
||||||
|
compress: {
|
||||||
|
sequences: false
|
||||||
|
},
|
||||||
|
mangle: false
|
||||||
|
});
|
||||||
|
assert.ok(stat.body);
|
||||||
|
assert.strictEqual(stat.print_to_string(), "a=x()");
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ describe("spidermonkey export/import sanity test", function() {
|
|||||||
var command = uglifyjs + " --self -cm --wrap SpiderUglify -o spidermonkey | " +
|
var command = uglifyjs + " --self -cm --wrap SpiderUglify -o spidermonkey | " +
|
||||||
uglifyjs + " -p spidermonkey -cm";
|
uglifyjs + " -p spidermonkey -cm";
|
||||||
|
|
||||||
exec(command, function(err, stdout) {
|
exec(command, { maxBuffer: 1048576 }, function(err, stdout) {
|
||||||
if (err) throw err;
|
if (err) throw err;
|
||||||
|
|
||||||
eval(stdout);
|
eval(stdout);
|
||||||
|
|||||||
@@ -117,6 +117,10 @@ function run_compress_tests() {
|
|||||||
test.mangle.properties.reserved = quoted_props;
|
test.mangle.properties.reserved = quoted_props;
|
||||||
U.reserve_quoted_keys(input, quoted_props);
|
U.reserve_quoted_keys(input, quoted_props);
|
||||||
}
|
}
|
||||||
|
if (test.rename) {
|
||||||
|
input.figure_out_scope(test.mangle);
|
||||||
|
input.expand_names(test.mangle);
|
||||||
|
}
|
||||||
var cmp = new U.Compressor(options, true);
|
var cmp = new U.Compressor(options, true);
|
||||||
var output = cmp.compress(input);
|
var output = cmp.compress(input);
|
||||||
output.figure_out_scope(test.mangle);
|
output.figure_out_scope(test.mangle);
|
||||||
|
|||||||
@@ -162,6 +162,7 @@ var VALUES = [
|
|||||||
'"object"',
|
'"object"',
|
||||||
'"number"',
|
'"number"',
|
||||||
'"function"',
|
'"function"',
|
||||||
|
'this',
|
||||||
];
|
];
|
||||||
|
|
||||||
var BINARY_OPS_NO_COMMA = [
|
var BINARY_OPS_NO_COMMA = [
|
||||||
@@ -349,10 +350,10 @@ function createParams() {
|
|||||||
return params.join(', ');
|
return params.join(', ');
|
||||||
}
|
}
|
||||||
|
|
||||||
function createArgs() {
|
function createArgs(recurmax, stmtDepth, canThrow) {
|
||||||
var args = [];
|
var args = [];
|
||||||
for (var n = rng(4); --n >= 0;) {
|
for (var n = rng(4); --n >= 0;) {
|
||||||
args.push(createValue());
|
args.push(rng(2) ? createValue() : createExpression(recurmax - 1, COMMA_OK, stmtDepth, canThrow));
|
||||||
}
|
}
|
||||||
return args.join(', ');
|
return args.join(', ');
|
||||||
}
|
}
|
||||||
@@ -390,9 +391,10 @@ function createFunction(recurmax, inGlobal, noDecl, canThrow, stmtDepth) {
|
|||||||
|
|
||||||
VAR_NAMES.length = namesLenBefore;
|
VAR_NAMES.length = namesLenBefore;
|
||||||
|
|
||||||
if (noDecl) s = 'var ' + createVarName(MANDATORY) + ' = ' + s + '(' + createExpression(recurmax, COMMA_OK, stmtDepth, canThrow) + ');';
|
if (noDecl) s = 'var ' + createVarName(MANDATORY) + ' = ' + s;
|
||||||
// avoid "function statements" (decl inside statements)
|
// avoid "function statements" (decl inside statements)
|
||||||
else if (inGlobal || rng(10) > 0) s += 'var ' + createVarName(MANDATORY) + ' = ' + name + '(' + createArgs() + ');';
|
else if (inGlobal || rng(10) > 0) s += 'var ' + createVarName(MANDATORY) + ' = ' + name;
|
||||||
|
s += '(' + createArgs(recurmax, stmtDepth, canThrow) + ');';
|
||||||
|
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
@@ -626,6 +628,9 @@ function _createExpression(recurmax, noComma, stmtDepth, canThrow) {
|
|||||||
case p++:
|
case p++:
|
||||||
case p++:
|
case p++:
|
||||||
return createValue();
|
return createValue();
|
||||||
|
case p++:
|
||||||
|
case p++:
|
||||||
|
return getVarName();
|
||||||
case p++:
|
case p++:
|
||||||
return createExpression(recurmax, COMMA_OK, stmtDepth, canThrow);
|
return createExpression(recurmax, COMMA_OK, stmtDepth, canThrow);
|
||||||
case p++:
|
case p++:
|
||||||
|
|||||||
@@ -16,11 +16,9 @@
|
|||||||
{},
|
{},
|
||||||
{
|
{
|
||||||
"compress": {
|
"compress": {
|
||||||
"toplevel": true
|
"hoist_props": true
|
||||||
},
|
},
|
||||||
"mangle": {
|
"toplevel": true
|
||||||
"toplevel": true
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"compress": {
|
"compress": {
|
||||||
|
|||||||
Reference in New Issue
Block a user